DeepSeek-V3
模型描述
DeepSeek-V3 系列模型是深度求索(DeepSeek)公司推出的一款高性能开源大语言模型,具有强大的自然语言处理能力。该模型在多个领域展现出了卓越的表现,包括代码生成、数学推理、逻辑推理和自然语言理解等。模型总参数 6710 亿,激活参数 370 亿, 其中 DeepSeek-R1 模型和 DeepSeek-V3.1 模型是基于 DeepSeek-V3 Base 模型进一步优化的推理特化模型,通过多阶段强化学习训练,在复杂推理、数学和编程任务上达到国际顶尖水平,同时大幅降低幻觉率。
@misc{deepseekai2024deepseekv3technicalreport,
title={DeepSeek-V3 Technical Report},
author={DeepSeek-AI and Aixin Liu and Bei Feng and Bing Xue and Bingxuan Wang and Bochao Wu and Chengda Lu and Chenggang Zhao and Chengqi Deng and Chenyu Zhang and Chong Ruan and Damai Dai and Daya Guo and Dejian Yang and Deli Chen and Dongjie Ji and Erhang Li and Fangyun Lin and Fucong Dai and Fuli Luo and Guangbo Hao and Guanting Chen and Guowei Li and H. Zhang and Han Bao and Hanwei Xu and Haocheng Wang and Haowei Zhang and Honghui Ding and Huajian Xin and Huazuo Gao and Hui Li and Hui Qu and J. L. Cai and Jian Liang and Jianzhong Guo and Jiaqi Ni and Jiashi Li and Jiawei Wang and Jin Chen and Jingchang Chen and Jingyang Yuan and Junjie Qiu and Junlong Li and Junxiao Song and Kai Dong and Kai Hu and Kaige Gao and Kang Guan and Kexin Huang and Kuai Yu and Lean Wang and Lecong Zhang and Lei Xu and Leyi Xia and Liang Zhao and Litong Wang and Liyue Zhang and Meng Li and Miaojun Wang and Mingchuan Zhang and Minghua Zhang and Minghui Tang and Mingming Li and Ning Tian and Panpan Huang and Peiyi Wang and Peng Zhang and Qiancheng Wang and Qihao Zhu and Qinyu Chen and Qiushi Du and R. J. Chen and R. L. Jin and Ruiqi Ge and Ruisong Zhang and Ruizhe Pan and Runji Wang and Runxin Xu and Ruoyu Zhang and Ruyi Chen and S. S. Li and Shanghao Lu and Shangyan Zhou and Shanhuang Chen and Shaoqing Wu and Shengfeng Ye and Shengfeng Ye and Shirong Ma and Shiyu Wang and Shuang Zhou and Shuiping Yu and Shunfeng Zhou and Shuting Pan and T. Wang and Tao Yun and Tian Pei and Tianyu Sun and W. L. Xiao and Wangding Zeng and Wanjia Zhao and Wei An and Wen Liu and Wenfeng Liang and Wenjun Gao and Wenqin Yu and Wentao Zhang and X. Q. Li and Xiangyue Jin and Xianzu Wang and Xiao Bi and Xiaodong Liu and Xiaohan Wang and Xiaojin Shen and Xiaokang Chen and Xiaokang Zhang and Xiaosha Chen and Xiaotao Nie and Xiaowen Sun and Xiaoxiang Wang and Xin Cheng and Xin Liu and Xin Xie and Xingchao Liu and Xingkai Yu and Xinnan Song and Xinxia Shan and Xinyi Zhou and Xinyu Yang and Xinyuan Li and Xuecheng Su and Xuheng Lin and Y. K. Li and Y. Q. Wang and Y. X. Wei and Y. X. Zhu and Yang Zhang and Yanhong Xu and Yanhong Xu and Yanping Huang and Yao Li and Yao Zhao and Yaofeng Sun and Yaohui Li and Yaohui Wang and Yi Yu and Yi Zheng and Yichao Zhang and Yifan Shi and Yiliang Xiong and Ying He and Ying Tang and Yishi Piao and Yisong Wang and Yixuan Tan and Yiyang Ma and Yiyuan Liu and Yongqiang Guo and Yu Wu and Yuan Ou and Yuchen Zhu and Yuduan Wang and Yue Gong and Yuheng Zou and Yujia He and Yukun Zha and Yunfan Xiong and Yunxian Ma and Yuting Yan and Yuxiang Luo and Yuxiang You and Yuxuan Liu and Yuyang Zhou and Z. F. Wu and Z. Z. Ren and Zehui Ren and Zhangli Sha and Zhe Fu and Zhean Xu and Zhen Huang and Zhen Zhang and Zhenda Xie and Zhengyan Zhang and Zhewen Hao and Zhibin Gou and Zhicheng Ma and Zhigang Yan and Zhihong Shao and Zhipeng Xu and Zhiyu Wu and Zhongyu Zhang and Zhuoshu Li and Zihui Gu and Zijia Zhu and Zijun Liu and Zilin Li and Ziwei Xie and Ziyang Song and Ziyi Gao and Zizheng Pan},
year={2024},
eprint={2412.19437},
archivePrefix={arXiv},
primaryClass={cs.CL},
url={https://arxiv.org/abs/2412.19437},
}
支持规格
| 模型名称 | 规格 | 支持任务 | 模型架构 | 支持设备 | 模型级别 |
|---|---|---|---|---|---|
| DeepSeek-V3 | 671B | 预训练/微调/推理 | Mcore | Atlas 800T A2/Atlas 800I A2/Atlas 900 A3 SuperPoD | Preliminary |
| DeepSeek-R1 | 671B | 预训练/微调/推理 | Mcore | Atlas 800T A2/Atlas 800I A2/Atlas 900 A3 SuperPoD | Preliminary |
| DeepSeek-V3.1 | 671B | 预训练/微调/推理 | Mcore | Atlas 800T A2/Atlas 800I A2/Atlas 900 A3 SuperPoD | Preliminary |
说明:
- 模型架构:
Mcore表示新模型架构。 - 模型级别:训练和推理各分为5个级别,分别代表该模型遵循不同的标准上线。每个级别的介绍详见模型级别介绍。
版本配套
DeepSeek-V3 当前支持的版本配套如下。
| MindSpore Transformers | MindSpore | CANN | HDK | |
|---|---|---|---|---|
| 当前支持的版本 | 1.8.0 | 2.7.2 | 8.5.0 | 25.5.0 |
使用样例
MindSpore Transformers 支持使用 DeepSeek-V3 进行预训练,微调和推理,并支持在 DeepSeek-V3 的基础上使用 DeepSeek-V3.2 的DSA特性进行训练(暂不支持推理)。各任务的整体使用流程如下:
| 任务 | 前期准备 | 使用流程 |
|---|---|---|
| 预训练 | 环境安装 -> 预训练数据集下载 | 数据预处理 -> 修改任务配置 -> 启动预训练任务 |
| 微调 | 环境安装 -> 模型下载 | 修改任务配置 -> 启动微调任务 |
| 推理 | 环境安装 -> 模型下载 | 修改任务配置 -> 启动推理任务 |
| DSA | 环境安装 -> 模型下载 | 修改任务配置 -> 启动训练任务 |
前期准备
环境安装
按照上述版本配套,参考环境安装指南安装运行环境。
模型下载
用户可以从Hugging Face、ModelScope等开源社区下载所需的模型文件,包括模型权重、Tokenizer、配置等(重头预训练不需加载权重)。 链接如下:
| 模型名称 | 下载链接 | 说明 |
|---|---|---|
| deepseek-ai/DeepSeek-V3 | HuggingFace / ModelScope | |
| deepseek-ai/DeepSeek-V3-Base | HuggingFace / ModelScope | |
| deepseek-ai/DeepSeek-V3-0324 | HuggingFace / ModelScope | |
| deepseek-ai/DeepSeek-R1 | HuggingFace / ModelScope | |
| deepseek-ai/DeepSeek-R1-Zero | HuggingFace / ModelScope | |
| deepseek-ai/DeepSeek-R1-0528 | HuggingFace / ModelScope | |
| deepseek-ai/DeepSeek-V3.1 | HuggingFace / ModelScope | |
| deepseek-ai/DeepSeek-V3.1-Base | HuggingFace / ModelScope | |
| deepseek-ai/DeepSeek-V3.1-Terminus | HuggingFace / ModelScope |
数据集下载
MindSpore Transformers 以下面的数据集为例提供了 DeepSeek-V3 的预训练和微调流程的使用案例,实际训练时可参考数据集章节制作数据集。请在执行任务前提前下载所需数据集。链接如下:
| 任务 | 数据集名称 | 下载链接 | 说明 |
|---|---|---|---|
| 预训练 | WikiText-103 | Download | 用于预训练的大规模文本数据集 |
| 微调 | Alpaca | Download | 用于微调的大规模文本数据集 |
预训练样例
预训练是指在大规模无标注数据上训练模型,使其能够全面捕捉语言的广泛特性。在MindSpore官网提供了详细的指导。
1. 数据预处理
MindSpore Transformers 预训练阶段当前已支持Megatron格式的数据集。用户可以参考数据集章节,使用 MindSpore 提供的工具将原始数据集转换为 Megatron 格式。
制作Megatron格式数据集,需要经过两个步骤。首先将原始文本数据集转换为jsonl格式数据,然后使用MindSpore Transformers提供的脚本将jsonl格式数据转换为Megatron格式的.bin和.idx文件。
wiki.train.tokens转为jsonl格式数据
用户需要自行将wiki.train.tokens数据集处理成jsonl格式的文件。作为参考,文档末尾的FAQ部分提供了一个临时转换方案,用户需要根据实际需求自行开发和验证转换逻辑。
下面是jsonl格式文件的示例:
{"src": "www.nvidia.com", "text": "The quick brown fox", "type": "Eng", "id": "0", "title": "First Part"}
{"src": "The Internet", "text": "jumps over the lazy dog", "type": "Eng", "id": "42", "title": "Second Part"}
...
jsonl格式数据 转为bin格式数据
MindSpore Transformers提供了数据预处理脚本toolkit/data_preprocess/megatron/preprocess_indexed_dataset.py用于将jsonl格式的原始文本预料转换成.bin或.idx文件。
这里需要提前下载DeepSeek-V3模型的tokenizer文件。
例如:
python toolkit/data_preprocess/megatron/preprocess_indexed_dataset.py \
--input /path/to/data.jsonl \
--output-prefix /path/to/wiki103-megatron \
--tokenizer-type HuggingFaceTokenizer \
--tokenizer-dir /path/to/DeepSeek-V3 # 其他规格的模型可以调整为对应的tokenizer路径
运行完成后会生成
/path/to/wiki103-megatron_text_document.bin和/path/to/wiki103-megatron_text_document.idx文件。 填写数据集路径时需要使用/path/to/wiki103-megatron_text_document,不需要带后缀名。
2. 修改任务配置
MindSpore Transformers 提供了两份预训练任务的配置文件分别为:满配的DeepSeek-V3配置文件configs/deepseek3/pretrain_deepseek3_671b.yaml和缩层到12b的DeepSeek-V3配置文件configs/deepseek3/pretrain_deepseek3_12b_16p_pp16.yaml,这两份配置分别基于32台和2台Atlas 800T A2(64G),使用WikiText-103数据集进行预训练,用户可以根据实际情况修改配置文件。以下是一个示例配置文件片段,用户需要根据自己的数据集路径和其他参数进行相应修改,对完整模型进行预训练。
-
数据集配置
# Dataset configuration train_dataset: &train_dataset data_loader: ... sizes: - 128000 # 数据集的大小,可以根据实际数据集大小进行调整 ... config: ... data_path: # 采样比例和Megatron格式数据集路径 - '1' - "/path/to/wiki103-megatron_text_document" # 替换为实际的Megatron格式数据集路径,此处不带后缀名
数据集路径需要替换为实际的Megatron格式数据集路径。
不同规格和序列长度的并行配置可参考并行配置建议。
3. 启动预训练任务
通过指定模型路径和配置文件configs/deepseek3/pretrain_deepseek3_671b.yaml或者configs/deepseek3/pretrain_deepseek3_12b_16p_pp16.yaml以msrun的方式启动run_mindformer.py脚本,进行分布式训练。可以参考如下方式拉起32台Atlas 800T A2(64G)进行预训练。
在每台服务器上执行如下命令。设置master_ip为主节点IP地址,即Rank 0服务器的IP;node_rank为每个节点的Rank序号,从0到255;port为当前进程的端口号。
master_ip=192.168.1.1
node_rank=0
port=8118
cd $MINDFORMERS_HOME
bash scripts/msrun_launcher.sh "run_mindformer.py \
--config configs/deepseek3/pretrain_deepseek3_671b.yaml" \
256 8 $master_ip $port $node_rank output/msrun_log False 7200
此处样例代码假设主节点为
192.168.1.1、当前Rank序号为0。实际执行时请将master_ip设置为实际的主节点IP地址;将node_rank设置为当前节点的Rank序号。
上述命令执行完毕后,训练任务将在后台执行,过程日志保存在./output/msrun_log下,使用以下命令可查看训练状态(由于开启了流水并行,真实loss只显示在最后一个stage的日志中,其余卡显示loss为0)
tail -f ./output/msrun_log/worker_255.log
训练过程中的权重checkpoint将会保存在./output/checkpoint下。
如有关于DeepSeek-V3预训练的相关问题,可以在MindSpore Transformers的AtomGit仓库中提交ISSUE以获取支持。
微调样例
SFT(Supervised Fine-Tuning,监督微调)采用有监督学习思想,是指在预训练模型的基础上,通过调整部分或全部参数,使模型更适应特定任务或数据集的过程。在MindSpore官网提供了详细的指导。
MindSpore Transformers支持全参微调和LoRA高效微调两种SFT微调方式。全参微调是指在训练过程中对所有参数进行更新,适用于大规模数据精调,能获得最优的任务适应能力,但需要的计算资源较大。LoRA高效微调在训练过程中仅更新部分参数,相比全参微调显存占用更少、训练速度更快,但在某些任务中的效果不如全参微调。
1. 修改任务配置
MindSpore Transformers 提供了微调任务的配置文件,用户可以根据实际情况修改配置文件。以下是示例配置文件片段,用户需要根据自己的数据集路径和其他参数进行相应修改。代码仓中提供了满配DeepSeek-V3全参微调的配置文件configs/deepseek3/finetune_deepseek3_671b.yaml和缩层到12b的DeepSeek-V3全参微调的配置文件configs/deepseek3/finetune_deepseek3_12b_16p_pp16.yaml,如果需要修改其他模型,例如DeepSeek-V3-0324、DeepSeek-R1、DeepSeek-R1-0528、DeepSeek-V3.1等,可以参考该配置文件进行相应修改。并参考附录中的并行配置建议章节进行修改。
全参微调配置示例:
仓库中提供了两份微调配置文件,使用alpaca数据集进行全参微调。用户需要根据自己的数据集路径和其他参数进行相应修改,并参考附录中的并行配置建议章节进行修改。
-
修改数据集配置
# 数据集配置 train_dataset: &train_dataset data_loader: type: HFDataLoader path: "llm-wizard/alpaca-gpt4-data-zh" # alpaca风格数据集,确保网络环境能够访问huggingface,以实现自动下载数据集功能。 # path: "json" # 如果使用本地json文件离线加载数据集,可以取消注释下面两行,并注释掉上面一行 # data_files: '/path/to/alpaca_gpt4_data_zh.json' handler: - type: take # 调用datasets库的take方法,取前n条数据用于示例 n: 2000 # 取前2000条数据用于示例,实际使用时可以去掉这一行和上面一行
LoRA微调配置示例:
LoRA微调可以在多机多卡环境下运行,资源需求较低。用户可以参考全参微调配置示例,做出如下修改:
pretrained_model_dir: "/path/to/DeepSeek-V3"
# 数据集配置
train_dataset: &train_dataset
data_loader:
type: HFDataLoader
path: "llm-wizard/alpaca-gpt4-data-zh" # alpaca风格数据集,确保网络环境能够访问huggingface,以实现自动下载数据集功能。
# path: "json" # 如果使用本地json文件离线加载数据集,可以取消注释下面两行,并注释掉上面一行
# data_files: '/path/to/alpaca_gpt4_data_zh.json'
handler:
- type: take # 调用datasets库的take方法,取前n条数据用于示例
n: 2000 # 取前2000条数据用于示例,实际使用时可以去掉这一行和上面一行
# LoRA配置
model:
model_config:
...
pet_config:
pet_type: lora
lora_rank: 16
lora_alpha: 16
lora_dropout: 0.
lora_a_init: 'normal'
lora_b_init: 'zeros'
target_modules: '.*linear_qkv|.*linear_fc1|.*linear_fc2'
freeze_include: ['*']
freeze_exclude: ['*lora*']
pet_config关键参数说明:
| 参数 | 说明 |
|---|---|
pet_type |
参数高效微调技术类型 |
lora_rank |
LoRA的秩 |
lora_alpha |
LoRA缩放因子alpha |
lora_dropout |
LoRA中的dropout概率 |
lora_a_init |
LoRA的A矩阵初始化方式 |
lora_b_init |
LoRA的B矩阵初始化方式 |
target_modules |
应用LoRA的模块,上述配置对word_embeddings、attention和mlp的权重矩阵应用LoRA |
2. 启动微调任务
通过指定模型路径和配置文件configs/deepseek3/finetune_deepseek3_671b.yaml或者configs/deepseek3/finetune_deepseek3_12b_16p_pp16.yaml以msrun的方式启动run_mindformer.py脚本,启动多卡分布式训练。
下列脚本可以参考如下方式拉起2台Atlas 800T A2(64G)训练:
在每台服务器上执行如下命令。设置:
total_rank_num=16表示2台Atlas 800T A2(64G)共有2x8=16个NPU;local_rank_num=8表示每台Atlas 800T A2(64G)有8个NPU;master_ip为主节点IP地址;node_rank为每个节点的序号;port为当前进程的端口号(可在50000~65536中选择)。
total_rank_num=16
local_rank_num=8
master_ip=192.168.1.1
node_rank=0
port=8118
export MS_DEV_RUNTIME_CONF="multi_stream:true"
bash scripts/msrun_launcher.sh "run_mindformer.py \
--pretrained_model_dir /path/checkpoint_path \
--load_ckpt_format safetensors \
--output_dir ./output \
--auto_trans_ckpt True \
--config /path/to/finetune_deepseek3_671b.yaml \
--run_mode finetune" \
$total_rank_num $local_rank_num $master_ip $port $node_rank output/msrun_log False 7200
此处样例代码假设主节点为
192.168.1.1、当前Rank序号为0。实际执行时请将master_ip设置为实际的主节点IP地址;将node_rank设置为当前节点的Rank序号。 pretrained_model_dir修改为原始权重路径,output_dir修改为用户想要保存训练后权重的路径。 如开启自动权重切分auto_trans_ckpt,pretrained_model_dir路径与output_dir路径需要是多机共享路径。 该配置在通信并发下有带宽抢占引发的性能劣化,通过配置MS_DEV_RUNTIME_CONF="multi_stream:true"控制通信单流来规避该劣化。--pretrained_model_dir可以用于选择不同规格的DeepSeek-V3模型进行微调,例如/path/to/DeepSeek-V3-0324、/path/to/DeepSeek-R1、/path/to/DeepSeek-R1-0528、/path/to/DeepSeek-V3.1等。
上述命令执行完毕后,训练任务将在后台执行,过程日志保存在./output/msrun_log下,在node_rank最后的机器使用以下命令可查看训练状态:
tail -f ./output/msrun_log/worker_15.log
训练过程中的权重checkpoint将会保存在./output/checkpoint下。
如有关于DeepSeek-V3 全参微调的相关问题,可以在MindSpore Transformers的AtomGit仓库中提交ISSUE以获取支持。
推理样例
DeepSeek-V3模型总参数量671B,Bfloat16权重参内存占用高达1.4T,最少需要4台Atlas 800T A2。MindSpore Transformers可以通过统一脚本实现单卡多卡以及多机的推理。
1. 修改任务配置
MindSpore Transformers 提供了推理任务的配置文件predict_deepseek3_671b.yaml,用户可以根据实际情况修改此配置文件中的权重路径和其他参数。
当前推理可以直接复用Hugging Face的配置文件和tokenizer,并且在线加载Hugging Face的safetensors格式的权重,使用时配置修改如下:
pretrained_model_dir: '/path/hf_dir'
parallel_config:
data_parallel: 1
model_parallel: 32
参数说明:
- pretrained_model_dir:Hugging Face模型目录路径,放置模型配置、Tokenizer等文件。
/path/hf_dir中的内容如下:
📂DeepSeek-V3
├── 📄config.json
├── 📄generation_config.json
├── 📄merges.txt
├── 📄model-xxx.safetensors
├── 📄model-xxx.safetensors
├── 📄model.safetensors.index.json
├── 📄tokenizer.json
├── 📄tokenizer_config.json
└── 📄vocab.json
- data_parallel:数据并行,默认值为 1,执行大小EP推理时需要修改此配置。
- model_parallel:模型并行,默认值为 1。需根据实际模型规模及硬件资源情况,调整该参数为相应的device_num(即实际使用的卡数)。
- expert_parallel:专家并行,默认值为 1,当执行大小EP推理时需要修改此配置。
当执行大小EP推理的时候,data_parallel及model_parallel指定attn及ffn-dense部分的并行策略,expert_parallel指定moe部分路由专家并行策略,data_parallel * model_parallel可被expert_parallel整除。
不同规格和序列长度的并行配置可参考并行配置建议。
2. 本地纯TP推理
使用 run_mindformer 统一脚本执行推理任务。
DeepSeek-V3因为参数量只能用多卡推理,多卡推理需要借助scripts/msrun_launcher.sh来启动。
run_mindformer.py的参数说明如下:
| 参数 | 参数说明 |
|---|---|
| config | yaml配置文件的路径 |
| run_mode | 运行的模式,推理设置为predict |
| use_parallel | 是否使用多卡推理 |
| predict_data | 推理的输入数据,多batch推理时需要传入输入数据的txt文件路径,包含多行输入 |
| predict_batch_size | 多batch推理的batch_size大小 |
| pretrained_model_dir | Hugging Face模型目录路径,放置模型配置、Tokenizer等文件 |
| parallel_config.data_parallel | 数据并行,当前推理模式下设置为1 |
| parallel_config.model_parallel | 模型并行,默认值为 1。需根据实际模型规模及硬件资源情况,调整该参数为相应的device_num(即实际使用的卡数) |
| parallel_config.expert_parallel | 数据并行,当前推理模式下设置为1 |
msrun_launcher.sh包括run_mindformer.py命令和推理卡数两个参数。
多机多卡推理:
DeepSeek-V3总参数量671B,只能进行多机多卡推理,在每台服务器上执行如下命令。设置master_ip为主节点IP地址,即Rank 0服务器的IP;node_rank为每个节点的序号;port为当前进程的端口号(可在50000~65536中选择)。
master_ip=192.168.1.1
node_rank=0
port=50001
bash scripts/msrun_launcher.sh "run_mindformer.py \
--config configs/deepseek3/predict_deepseek3_671b.yaml \
--run_mode predict \
--use_parallel True \
--pretrained_model_dir '/path/hf_dir' \
--parallel_config.data_parallel 1 \
--parallel_config.model_parallel 32 \
--predict_data 请介绍一下北京" $worker_num $local_worker $master_ip $port $node_rank output/msrun_log False 300
此处样例代码假设主节点为
192.168.1.1、当前Rank序号为0。实际执行时请将master_ip设置为实际的主节点IP地址;将node_rank设置为当前节点的Rank序号;将$local_worker设置为当前节点上拉起的进程数(当前机器使用的卡数);将$worker_num设置为参与任务的进程总数(使用的总卡数);将$port设置为启动任务的端口号;$parallel_config.model_parallel需要设置成实际卡数。
推理结果会保存到当前目录下的 text_generation_result.txt 文件中,推理过程中的日志可通过如下命令查看:
tail -f ./output/msrun_log/worker_0.log
3. 本地大EP推理
大EP,指的是路由专家仅仅按EP分组,不做其他切分。DeepSeek-V3总参数量671B,非MoE参数量大致为20B,大EP浮点推理至少为64卡,即四台A3机器或者八台A2机器。相较于纯tp推理,启动命令的入参需要修改并行配置和predict_data的入参,并且增加predict_batch_size的入参为DP的倍数,具体执行命令如下:
master_ip=192.168.1.1
node_rank=0
port=50001
bash scripts/msrun_launcher.sh "run_mindformer.py \
--config configs/deepseek3/predict_deepseek3_671b.yaml \
--run_mode predict \
--use_parallel True \
--pretrained_model_dir '/path/hf_dir' \
--parallel_config.data_parallel 64 \
--parallel_config.model_parallel 1 \
--parallel_config.expert_parallel 64 \
--predict_data path/to/input_data.txt \
--predict_batch_size 64" $worker_num $local_worker $master_ip $port $node_rank output/msrun_log False 300
input_data.txt文件的内容和格式是每一行都是一个输入,问题的个数与predict_batch_size一致,可以参考以下格式:
请介绍一下北京
请介绍一下北京
请介绍一下北京
......
请介绍一下北京
推理结果和过程日志查看同本地纯TP推理。
4. 本地小EP推理
小EP推理,指的是路由专家不仅仅按EP分组,同时专家本身被TP切分,浮点推理至少为32卡,即两台A3机器或者八台A2机器。相较于纯tp推理,启动命令的入参需要修改并行配置和predict_data的入参,并且增加predict_batch_size的入参为DP的倍数,具体执行命令如下:
master_ip=192.168.1.1
node_rank=0
port=50001
bash scripts/msrun_launcher.sh "run_mindformer.py \
--config configs/deepseek3/predict_deepseek3_671b.yaml \
--run_mode predict \
--use_parallel True \
--pretrained_model_dir '/path/hf_dir' \
--parallel_config.data_parallel 4 \
--parallel_config.model_parallel 8 \
--parallel_config.expert_parallel 4 \
--predict_data path/to/input_data.txt \
--predict_batch_size 4" $worker_num $local_worker $master_ip $port $node_rank output/msrun_log False 300
input_data.txt文件的内容和格式是每一行都是一个输入,问题的个数与predict_batch_size一致,可以参考以下格式:
请介绍一下北京
请介绍一下北京
请介绍一下北京
......
请介绍一下北京
推理结果和过程日志查看同本地纯TP推理。
5. 启动服务化推理任务
服务化推理支持量化、大小ep等特性,可以查看以下文档:服务化推理
DSA样例
DeepSeek-V3.2相较于DeepSeek-V3,创新性的采用了DSA(DeepSeek Sparse Attention)机制,在长上下文场景通过新增了索引器indexer模块,关注最关键的Top-K个词元以显著降低计算复杂度,同时保持模型性能。DeepSeek-V3.2需要在已经预训练过的DeepSeek-V3权重基础上进行训练,当前暂不支持DeepSeek-V3.2的推理功能。
1. 修改任务配置
用户可以基于DeepSeek-V3的配置开启DSA特性进行长序列文本的训练任务,作为基底的配置文件请参考修改任务配置小节。 开启DSA特性时,模型训练过程会包含连续的两个阶段Dense阶段和Sparse阶段,不同阶段需要分别修改配置文件并拉起任务。
注意:DSA特性存在如下限制:
- 部分参数存在数值限制,见对应阶段yaml修改示例中的注释。
- 流水线并行暂不支持zero_bubble_v调度策略。
- 数据集生成EOD序列时,务必开启EOD压缩以使能模型内的TND排布,否则计算结果不正确。
Dense Warm-up Stage
Dense阶段为第一个阶段,通过设置dsa_indexer_use_sparse_loss=False开启。该阶段中模型需要加载已有的DeepSeek-V3权重,但这些权重将全部被冻结,仅有DSA特性新增的索引器模块的权重会进行更新。该阶段训练结束后,需要保存权重供Sparse阶段使用。
注意:Dense阶段训练时额外存在以下限制:
- 必须设置环境变量
MS_DEV_RUNTIME_CONF中包含"inline:False"(参考MindSpore环境变量),否则该阶段的训练任务可能无法拉起。- 暂不支持开启完全重计算。
使用时相应参数修改如下:
parallel:
parallel_config:
pipeline_interleave: True
pipeline_scheduler: seqpipe # 使能流水线并行时,建议使用seqpipe调度策略
recompute_config:
recompute: False # Dense阶段需要关闭完全重计算
model:
model_config:
kv_lora_rank: 512 # 开启DSA特性时,当前仅支持512
qk_rope_head_dim: 64 # 开启DSA特性时,当前仅支持64
# 以下新增参数,仅DeepSeek-V3模型时生效
experimental_attention_variant: dsa # DSA特性开关,设置为dsa时表示使用DSA特性
dsa_indexer_n_heads: 64 # DSA索引器的注意力头数,当前仅支持64
dsa_indexer_head_dim: 128 # DSA索引器的注意力头维度, 当前仅支持128
dsa_indexer_topk: 2048 # DSA索引器选取词元的Top-K个数,支持1~2048
dsa_indexer_loss_coeff: 1.0 # DSA索引器对应loss的系数
dsa_indexer_use_sparse_loss: False # DSA索引器是否使用稀疏loss,设置为False以进入Dense阶段训练
callbacks:
- type: CheckpointMonitor # 保存权重相关配置根据实际需要进行修改
save_checkpoint_steps: 10000
remove_redundancy: True
async_save: False
checkpoint_format: "safetensors"
Sparse Training Stage
Sparse阶段为第二个阶段,通过设置dsa_indexer_use_sparse_loss=True开启。该阶段中模型需要加载Dense阶段保存的权重进行后续训练,并且全部网络参数均会更新。
使用时相应参数修改如下: 相关参数修改如下:
parallel:
parallel_config:
pipeline_interleave: True
pipeline_scheduler: seqpipe # 使能流水线并行时,建议使用seqpipe调度策略
model:
model_config:
kv_lora_rank: 512 # 开启DSA特性时,当前仅支持512
qk_rope_head_dim: 64 # 开启DSA特性时,当前仅支持64
# 以下新增参数,仅DeepSeek-V3模型时生效
experimental_attention_variant: dsa # DSA特性开关,设置为dsa时表示使用DSA特性
dsa_indexer_n_heads: 64 # DSA索引器的注意力头数,当前仅支持64
dsa_indexer_head_dim: 128 # DSA索引器的注意力头维度, 当前仅支持128
dsa_indexer_topk: 2048 # DSA索引器选取词元的Top-K个数,支持1~2048
dsa_indexer_loss_coeff: 1.0 # DSA索引器对应loss的系数
dsa_indexer_use_sparse_loss: True # DSA索引器是否使用稀疏loss,设置为True以进入Sparse阶段训练
2. 启动训练任务
配置文件修改完成后,参考启动微调任务拉起训练任务即可。
附录
模型文件说明
DeepSeek-V3的模型文件包括以下内容:
📦mindformers
├── 📂mindformers
│ └── 📂models
│ └── 📂deepseek3
│ ├── 📄__init__.py # DeepSeek-V3模块初始化文件
│ ├── 📄configuration_deepseek_v3.py # DeepSeek-V3模型配置类定义
│ ├── 📄modeling_deepseek_v3.py # DeepSeek-V3模型主体实现
│ ├── 📄modeling_deepseek_v3_infer.py # DeepSeek-V3推理模型实现
│ ├── 📄modeling_deepseek_v3_train.py # DeepSeek-V3训练模型实现
│ └── 📄utils.py # DeepSeek-V3工具函数和基础类
├── 📂configs
│ └── 📂deepseek3
│ ├── 📄pretrain_deepseek3_671b.yaml # DeepSeek-V3预训练配置
│ ├── 📄finetune_deepseek3_671b.yaml # DeepSeek-V3全参微调配置
│ ├── 📄pretrain_deepseek3_12b_16p_pp16.yaml # DeepSeek-V3 12B预训练配置
│ ├── 📄finetune_deepseek3_12b_16p_pp16.yaml # DeepSeek-V3 12B全参微调配置
│ └── 📄predict_deepseek3_671b.yaml # DeepSeek-V3推理配置
└── 📄run_mindformer.py # 主要执行脚本
并行配置建议
以下配置为训练或推理场景下,不同模型规格的推荐配置。其中部分配置为经过验证的最佳配置,部分配置为可以运行的配置。用户可根据实际情况选择合适的配置。
注意:max_device_memory 在 Atlas 800T A2 和 Atlas 900 A3 SuperPoD 等机器上一般设置≤60GB,在 Atlas 800I A2 上一般设置≤30GB。
- 预训练/微调:
| 模型 | 规格 | 设备 | 卡数 | 序列长度 | 并行配置 | 重计算配置 | 内存配置 | 模型级别 |
|---|---|---|---|---|---|---|---|---|
| DeepSeek-V3 | 671B | 32 x Atlas 800T A2(64G) | 256 | 4096 |
|
|
|
Preliminary |
| DeepSeek-V3 | 12B | 2 x Atlas 800T A2(64G) | 16 | 4096 |
|
|
|
Released |
- 推理:
| 模型 | 规格 | 设备 | 卡数 | 并行配置 | 内存配置 | 模型级别 |
|---|---|---|---|---|---|---|
| DeepSeek-V3/R1 | 671B | 4 × Atlas 800T A2 (8P) | 32 |
|
|
Released |
FAQ
Q1:我有1台Atlas 800T A2(64G)服务器,配置已修改完成,如何进行DeepSeek-V3的LoRA微调?拉起任务的指令是什么?
A1:根据指导修改配置后,可以参考如下方式拉起1台Atlas 800T A2(64G)训练。
通过指定模型路径和配置文件configs/deepseek3/finetune_deepseek3_671b.yaml以msrun的方式启动run_mindformer.py脚本,启动卡分布式训练。
下列脚本可以参考如下方式拉起一台Atlas 800T A2(64G)训练。
bash scripts/msrun_launcher.sh "run_mindformer.py \
--config configs/deepseek3/lora_finetune_deepseek3_671b.yaml \
--run_mode finetune"
上述命令执行完毕后,训练任务将在后台执行,过程日志保存在./output/msrun_log下,使用以下命令可实时查看训练状态
tail -f ./output/msrun_log/worker_7.log
训练过程中的权重checkpoint将会保存在./output/checkpoint下。
如有关于DeepSeek-V3 LoRA微调的相关问题,可以在MindSpore Transformers的AtomGit仓库中提交ISSUE以获取支持。
Q2: 数据集准备部分中,应该如何将wiki.train.tokens 转为 jsonl格式数据?
A2: 社区issue中提供了一个临时转换脚本,仅作为参考使用。用户需要根据自己的数据特点和需求,自行开发和验证适合的转换逻辑。
Q3:如果修改了配置中的参数,使用run_mindformer.py拉起任务时,还需要重新传参吗?
A3:根据指导修改配置后,参数值已被修改,无需重复传参,run_mindformer.py会自动读取解析配置中的参数;如果没有修改配置中的参数,则需要在命令中添加参数。
Q4:用户使用同一个服务器拉起多个推理任务时,端口号冲突怎么办?
A4:用户使用同一个服务器拉起多个推理任务时,要注意不能使用相同的端口号,建议将端口号从50000~65536中选取,避免端口号冲突的情况发生。
Q5:我想看看我训练下来的权重效果怎么样,可以直接使用训练权重做推理吗?
A5:当然可以!你可以通过以下两种方式进行推理:
- 直接使用训练权重进行推理,可以参考《训练后模型进行评测》文档,使用去优化器合并的训练权重进行推理。
- 反转训练权重为 Hugging Face 格式,复用 Hugging Face 生态进行推理,可以参考 DeepSeek-V3 反转脚本进行权重反转后,再进行推理任务。
更多FAQ请查看官网FAQ