首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

AI智能体研发之路-模型篇(二):DeepSeek-V2-Chat 训练与推理实战

  • 25-03-03 05:09
  • 4490
  • 13379
blog.csdn.net

博客导读:

《AI—工程篇》

AI智能体研发之路-工程篇(一):Docker助力AI智能体开发提效

AI智能体研发之路-工程篇(二):Dify智能体开发平台一键部署

AI智能体研发之路-工程篇(三):大模型推理服务框架Ollama一键部署

AI智能体研发之路-工程篇(四):大模型推理服务框架Xinference一键部署

AI智能体研发之路-工程篇(五):大模型推理服务框架LocalAI一键部署

《AI—模型篇》

AI智能体研发之路-模型篇(一):大模型训练框架LLaMA-Factory在国内网络环境下的安装、部署及使用

AI智能体研发之路-模型篇(二):DeepSeek-V2-Chat 训练与推理实战

目录

一、引言

二、模型简介

2.1 DeepSeek V2模型概述

2.2 DeepSeek V2模型架构

三、训练与推理

3.1 DeepSeek V2模型训练

3.2 DeepSeek V2模型推理

四、总结


一、引言

5月6日私募基金幻方发布DeepSeek-V2,千亿级模型,每百万Tokens仅需1元-2元。5月15日,字节发布白菜价的豆包大模型,5月21日阿里、百度相机大幅下调甚至免费开放自家商用模型接口,大模型价格战正式打响。而被誉为大模型价格屠夫的“DeepSeek-V2”到底是怎么个事儿,是否可以进行训练和推理,今天我们来展开讲一讲。

二、模型简介

2.1 DeepSeek V2模型概述

DeepSeek V2(Moe)是一个基于专家网络(MoE)的大语言模型,是DeepSeek LLM(dense)的升级版本。

  • 主要特点:训练经济、推理高效。
  • 模型尺寸:236B,其中激活参数21B。
  • 上下文长度:128K
  • 相较于他的前一代DeepSeek LLM(67B),节省了42.5%的训练成本,减少了93.3%的KV缓存,最大生成吞吐量提升至5.76倍。

  • 采用8.1万亿个token的多样化高质量预料预训练,在进行全面的预训练之后,进行监督微调(SFT)以及强化学习(RL),充分发挥模型性能。 
  • 官方于5月16日发布了可消费级显卡部署的lite版模型:DeepSeek-V2-Lite,总参数16B,激活函数2.4B,上下文长度32K,降低用户私有化部署成本。

  • 中文评测集效果对比(官方发布,仅供参考):  

  •   各大厂商价格战之前的商用接口价格对比(2024.5.6)

就是因为这么一张价格对比表,开启了国产大模型价格之战,“砸我饭碗,都别吃了!” 

2.2 DeepSeek V2模型架构

DeepSeek-V2针对attention机制和MoE网络进行创新,保证经济的训练和高效的推理:

  • 对于注意力,设计了MLA(多头潜在注意力),它利用低秩键值联合压缩来消除推理时键值缓存的瓶颈,从而支持高效的推理。
  • 对于前馈网络(FFN),采用 DeepSeekMoE 架构,这是一种高性能 MoE 架构,能够以更低的成本训练更强大的模型。

模型结构配置(configuration_deepseek.py),这里对涉及网络结构的每个参数进行中文说明。

  1. from transformers.configuration_utils import PretrainedConfig
  2. from transformers.utils import logging
  3. logger = logging.get_logger(__name__)
  4. DEEPSEEK_PRETRAINED_CONFIG_ARCHIVE_MAP = {}
  5. class DeepseekV2Config(PretrainedConfig):
  6. model_type = "deepseek_v2"
  7. keys_to_ignore_at_inference = ["past_key_values"]
  8. def __init__(
  9. self,
  10. vocab_size=102400,#深度模型词汇量,默认102400
  11. hidden_size=4096,#隐层的维度,默认4096
  12. intermediate_size=11008,#MLP的维度,默认11008
  13. moe_intermediate_size = 1407,#MOE的维度,默认1407
  14. num_hidden_layers=30,#在transformer decoder中隐层的数量,默认30
  15. num_attention_heads=32,#在transformer decoder中每个多头注意力层的头数,默认32
  16. num_key_value_heads=32,
  17. #用于实现分组查询注意力的 key_value 头的数量
  18. #如果`num_key_value_heads=num_attention_heads`,模型将使用多头注意力(MHA),
  19. #如果`num_key_value_heads=1 时,模型将使用多查询注意 (MQA),否则将使用 GQA。
  20. #当将多头检查点转换为 GQA 检查点,应构造每个组键和值头。意思是meanpooling该组内的所有original heads
  21. #详细说明见(https://arxiv.org/pdf/2305.13245.pdf)
  22. #默认num_key_value_heads=num_attention_heads
  23. n_shared_experts = None,#moe共享专家数,为None代表dense model稠密模型
  24. n_routed_experts = None,#moe路由专家数,为None代表dense model稠密模型
  25. ep_size = 1,
  26. routed_scaling_factor = 1.0,#路由专家的缩放因子,
  27. kv_lora_rank = 512,
  28. q_lora_rank = 1536,
  29. qk_rope_head_dim = 64,
  30. v_head_dim = 128,
  31. qk_nope_head_dim = 128,
  32. topk_method = 'gready',#moe网络中路由门控的topk选择方法,默认为贪心算法
  33. n_group = None,#路由专家的组数,默认为None不分组
  34. topk_group = None,#每个token选中的组数(对于每个 token,确保选中的专家仅在 `topk_group` 组内)
  35. num_experts_per_tok = None,#选定专家的数量,无表示密集模型
  36. moe_layer_freq = 1,#MoE 层的频率:每“moe_layer_freq - 1”密集层有一个专家层
  37. first_k_dense_replace = 0,#浅层中的密集层数(embed->dense->dense->...->dense->moe->moe...->lm_head)。
  38. norm_topk_prob = False,#是否标准化已路由专家的权重。
  39. scoring_func = 'softmax',#计算专家权重的方法,默认softmax
  40. aux_loss_alpha = 0.001,#辅助损失系数。
  41. seq_aux = True,#是否计算每个单独样本的辅助损失。
  42. hidden_act="silu",#decoder中非线性激活函数,默认为silu
  43. max_position_embeddings=2048,#该模型可能用到的最大序列长度,默认为2048,这个参数直接影响模型上下文长度。如果太短,在应用中设置较长的system prompt会让对话被截断。
  44. initializer_range=0.02,#用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差
  45. rms_norm_eps=1e-6,#均方根归一化层使用的 epsilon,用于处理浮点数比较时的误差或精度问题,通常是个很小的值。
  46. use_cache=True,模型是否应该返回最后的key value注意力的值(并非所有模型都使用)。仅当 `config.is_decoder=True` 才有意义
  47. pad_token_id=None,#填充的token id
  48. bos_token_id=100000,#token流开始的id,默认为100000
  49. eos_token_id=100001,#token流结束的id,默认为100001
  50. pretraining_tp=1,#实验性功能。预训练期间使用的张量并行度等级。此值是确保预训练结果的精确再现性是必要的。
  51. tie_word_embeddings=False,#是否绑定词嵌入
  52. rope_theta=10000.0,#RoPE 嵌入的基期,默认为10000
  53. rope_scaling=None,#包含 RoPE 嵌入的缩放配置的字典。目前支持两种缩放策略:线性和动态。它们的缩放因子必须是大于 1 的浮点数。预期格式为`{"type": 策略名称,"factor": 缩放因子}`。使用此标志时,不要更新`max_position_embeddings` 达到预期的新最大值。
  54. attention_bias=False,#在自注意力期间是否在查询、键、值和输出投影层中使用偏差,默认False
  55. attention_dropout=0.0,#注意力概率的丢失率。
  56. **kwargs,
  57. ):
  58. self.vocab_size = vocab_size
  59. self.max_position_embeddings = max_position_embeddings
  60. self.hidden_size = hidden_size
  61. self.intermediate_size = intermediate_size
  62. self.moe_intermediate_size = moe_intermediate_size
  63. self.num_hidden_layers = num_hidden_layers
  64. self.num_attention_heads = num_attention_heads
  65. self.n_shared_experts = n_shared_experts
  66. self.n_routed_experts = n_routed_experts
  67. self.ep_size = ep_size
  68. self.routed_scaling_factor = routed_scaling_factor
  69. self.kv_lora_rank = kv_lora_rank
  70. self.q_lora_rank = q_lora_rank
  71. self.qk_rope_head_dim = qk_rope_head_dim
  72. self.v_head_dim = v_head_dim
  73. self.qk_nope_head_dim = qk_nope_head_dim
  74. self.topk_method = topk_method
  75. self.n_group = n_group
  76. self.topk_group = topk_group
  77. self.num_experts_per_tok = num_experts_per_tok
  78. self.moe_layer_freq = moe_layer_freq
  79. self.first_k_dense_replace = first_k_dense_replace
  80. self.norm_topk_prob = norm_topk_prob
  81. self.scoring_func = scoring_func
  82. self.aux_loss_alpha = aux_loss_alpha
  83. self.seq_aux = seq_aux
  84. # for backward compatibility
  85. if num_key_value_heads is None:
  86. num_key_value_heads = num_attention_heads
  87. self.num_key_value_heads = num_key_value_heads
  88. self.hidden_act = hidden_act
  89. self.initializer_range = initializer_range
  90. self.rms_norm_eps = rms_norm_eps
  91. self.pretraining_tp = pretraining_tp
  92. self.use_cache = use_cache
  93. self.rope_theta = rope_theta
  94. self.rope_scaling = rope_scaling
  95. self.attention_bias = attention_bias
  96. self.attention_dropout = attention_dropout
  97. super().__init__(
  98. pad_token_id=pad_token_id,
  99. bos_token_id=bos_token_id,
  100. eos_token_id=eos_token_id,
  101. tie_word_embeddings=tie_word_embeddings,
  102. **kwargs,
  103. )
  • vocab_size=102400,#词库大小,默认102400,作为参考qwen-72B为152064
  • hidden_size=4096,#隐层的维度,默认4096
  • intermediate_size=11008,#MLP的维度,默认11008
  • moe_intermediate_size = 1407,#MOE的维度,默认1407
  • num_hidden_layers=30,#在transformer decoder中隐层的数量,默认30
  • num_attention_heads=32,#在transformer decoder中每个多头注意力层的头数,默认32,作为参考,qwen-72B为80,baichuan2-13B为40
  • num_key_value_heads=32,
  • #用于实现分组查询注意力的 key_value 头的数量
  • #如果`num_key_value_heads=num_attention_heads`,模型将使用多头注意力(MHA),
  • #如果`num_key_value_heads=1 时,模型将使用多查询注意 (MQA),否则将使用 GQA。
  • #当将多头检查点转换为 GQA 检查点,应构造每个组键和值头。意思是meanpooling该组内的所有original heads
  • #详细说明见(https://arxiv.org/pdf/2305.13245.pdf)
  • #默认num_key_value_heads=num_attention_heads
  • n_shared_experts = None,#moe共享专家数,为None代表dense model稠密模型
  • n_routed_experts = None,#moe路由专家数,为None代表dense model稠密模型
  • ep_size = 1,
  • routed_scaling_factor = 1.0,#路由专家的缩放因子,
  • kv_lora_rank = 512,kv lora矩阵的秩,默认为512
  • q_lora_rank = 1536,q lora矩阵的秩,默认为1536
  • qk_rope_head_dim = 64,qk rope矩阵头维度,默认为64
  • v_head_dim = 128,v矩阵头维度,默认为128
  • qk_nope_head_dim = 128,qk nope矩阵头维度,默认为128
  • topk_method = 'gready',#moe网络中路由门控的topk选择方法,默认为贪心算法
  • n_group = None,#路由专家的组数,默认为None不分组
  • topk_group = None,#每个token选中的组数(对于每个 token,确保选中的专家仅在 `topk_group` 组内)
  • num_experts_per_tok = None,#选定专家的数量,无表示密集模型
  • moe_layer_freq = 1,#MoE 层的频率:每“moe_layer_freq - 1”密集层有一个专家层
  • first_k_dense_replace = 0,#浅层中的密集层数(embed->dense->dense->...->dense->moe->moe...->lm_head)。
  • norm_topk_prob = False,#是否标准化已路由专家的权重。
  • scoring_func = 'softmax',#计算专家权重的方法,默认softmax
  • aux_loss_alpha = 0.001,#辅助损失系数。
  • seq_aux = True,#是否计算每个单独样本的辅助损失。
  • hidden_act="silu",#decoder中非线性激活函数,默认为silu
  • max_position_embeddings=2048,#该模型可能用到的最大序列长度,默认为2048,这个参数直接影响模型上下文长度。如果太短,在应用中设置较长的system prompt会让对话被截断。
  • initializer_range=0.02,#用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差
  • rms_norm_eps=1e-6,#均方根归一化层使用的 epsilon,用于处理浮点数比较时的误差或精度问题,通常是个很小的值。
  • use_cache=True,模型是否应该返回最后的key value注意力的值(并非所有模型都使用)。仅当 `config.is_decoder=True` 才有意义
  • pad_token_id=None,#填充的token id
  • bos_token_id=100000,#token流开始的id,默认为100000
  • eos_token_id=100001,#token流结束的id,默认为100001
  • pretraining_tp=1,#实验性功能。预训练期间使用的张量并行度等级。此值是确保预训练结果的精确再现性是必要的。
  • tie_word_embeddings=False,#是否绑定词嵌入
  • rope_theta=10000.0,#ROPE旋转位置编码里theta的空间,qwen-72B为1000000。ROPE是一种位置编码算法,通过优化的矩阵乘法方式为Q/K引入位置信息,使得token能够在Attention计算中感知到相对位置信息。
  • rope_scaling=None,#包含 RoPE 嵌入的缩放配置的字典。目前支持两种缩放策略:线性和动态。它们的缩放因子必须是大于 1 的浮点数。预期格式为`{"type": 策略名称,"factor": 缩放因子}`。使用此标志时,不要更新`max_position_embeddings` 达到预期的新最大值。
  • attention_bias=False,#在自注意力期间是否在查询、键、值和输出投影层中使用偏差,默认False
  • attention_dropout=0.0,#注意力概率的丢失率。 

Tips:

之前在做深度学习推荐系统的时候,也经常接触到attention机制和MoE专家网络这两个模型网络,采用attention机制学习item或user序列的潜在关系,采用MoE专家网络做推荐系统中多场景/多目标网络的主模型,较为知名的有MMoE网络和PLE网络,通过共享多个专家网络,提升模型的多场景/多目标的关联学习能力。

三、训练与推理

3.1 DeepSeek V2模型训练

由于机器资源限制,这里基于QLoRA指令微调(SFT)DeepSeek V2的lite版(DeepSeek-V2-Lite-Chat),使用之前文章介绍的LLaMA-Factory框架。

国内网络环境下LLaMA-Factory部署:AI智能体研发之路-模型训练篇(一):大模型训练框架LLaMA-Factory在国内网络环境下的安装、部署及使用_llama训练框架-CSDN博客

SFT训练启动代码:

  1. CUDA_VISIBLE_DEVICES=1 llamafactory-cli train \
  2. --stage sft \
  3. --do_train True \
  4. --model_name_or_path deepseek-ai/deepseek-moe-16b-chat \
  5. --finetuning_type lora \
  6. --quantization_bit 4 \
  7. --template deepseek \
  8. --flash_attn auto \
  9. --dataset_dir data \
  10. --dataset oaast_sft_zh \
  11. --cutoff_len 4096 \
  12. --learning_rate 5e-05 \
  13. --num_train_epochs 5.0 \
  14. --max_samples 100000 \
  15. --per_device_train_batch_size 2 \
  16. --gradient_accumulation_steps 8 \
  17. --lr_scheduler_type cosine \
  18. --max_grad_norm 1.0 \
  19. --logging_steps 5 \
  20. --save_steps 100 \
  21. --warmup_steps 0 \
  22. --optim adamw_torch \
  23. --packing False \
  24. --report_to none \
  25. --output_dir saves/DeepSeek-MoE-16B-Chat/lora/train_2024-05-23-deepseek-v2 \
  26. --fp16 True \
  27. --lora_rank 16 \
  28. --lora_alpha 16 \
  29. --lora_dropout 0 \
  30. --lora_target q_proj,v_proj \
  31. --plot_loss True

其中:

  • quantization_bit = 4 ,int4量化,sft根据惯例fp16训练大概需要模型尺寸*2的GPU,int4需要模型尺寸*0.75的GPU,这里是16B,int4大概需要16*0.75=12G的GPU资源,如果fp16需要32G,对于V100显卡,单卡32G基本很难启动。
  • template = deepseek,template采用deepseek的,LLaMA Factory框架针对当下国内外主流模型都进行了template适配,训练和推理记得设置。
  • cutoff_len = 4096,上下文长度这里先设置4096,对于agent开发,特别是较长的system prompt,这里一定要尽量大,至少要4096。
  • per_device_train_batch_size = 2,每个设备训练的batich size,这里设置为2,不要太大
  • gradient_accumulation_steps = 8,

启动后,webui、docker logs或者save目录中的running_logs日志文件可以查看日志状态。

deepseek v2的SFT微调训练启动后要加载很久,需要确保服务器资源充足,并且要有足够的耐心。

对于以上参数,5轮迭代需要7小时12分钟,耐心等待叭。

训练完毕后,可以看到loss明显收敛,各位可以通过调整自己的数据样本集训练私有化模型。

3.2 DeepSeek V2模型推理

这里采用LLaMA Factory WebUI的chat部分进行模型推理测试,由于资源限制智能采用int4量化后进行推理测试,大概占用了12G显存。框架支持RoPE插值方法,可以配置线性插值和动态插值,以及支持flashattn2加速和unsloth加速。

从对话效果来看,int4的模型还是存在一定幻觉,比如问“你支持工具调用嘛”,模型回答“支持工具调用,但不具备调用工具的能力”。逻辑上产生错误。

但在个人实际工作中,官方完整版的deepseek-v2-chat(236B)还是非常好用的,对于agent的开发,回复效果上强于gpt3.5,回复速度上快于gpt4.0。接入dify平台上直接就可以使用,由于采用OpenAI兼容的API规范,配置和使用过程都很流畅。最重要的是,真便宜!测试用了6万token才花费了0.07元!

如何部署Dify智能体开发平台可参考之前的文章:AI智能体研发之路-工程篇(二):Dify智能体开发平台一键部署_dify 接入 天气预报-CSDN博客 

四、总结

本文首先针对deepseek-v2-chat这个大模型价格屠夫的模型特点和技术架构进行介绍,之后以LLaMA-factory为训练和推理框架,进行SFT微调训练和推理测试。

deepseek-v2-chat巧妙的将attention注意力机制和MoE网络架构与大模型相结合,通过模型算法与架构的升级,提升了推理和训练效率,最终呈现的就是成本的优化和商业市场价值的转化。是一个典型的通过技术创新直接创造商业价值的案例。respect。

如果认为文章现在或未来可以帮助到你,辛苦关注、点赞、收藏噢,您的鼓励是我持续创作的动力!

博客导读:

《AI—工程篇》

AI智能体研发之路-工程篇(一):Docker助力AI智能体开发提效

AI智能体研发之路-工程篇(二):Dify智能体开发平台一键部署

AI智能体研发之路-工程篇(三):大模型推理服务框架Ollama一键部署

AI智能体研发之路-工程篇(四):大模型推理服务框架Xinference一键部署

AI智能体研发之路-工程篇(五):大模型推理服务框架LocalAI一键部署

《AI-模型篇》

AI智能体研发之路-模型篇(一):大模型训练框架LLaMA-Factory在国内网络环境下的安装、部署及使用

AI智能体研发之路-模型篇(二):DeepSeek-V2-Chat 训练与推理实战

文章知识点与官方知识档案匹配,可进一步学习相关知识
Python入门技能树首页概览423497 人正在系统学习中
注:本文转载自blog.csdn.net的LDG_AGI的文章"https://blog.csdn.net/weixin_48007632/article/details/139131558"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top