MindSpeed-LLM DeepSeekV3训练微调推理操作指导
DeepseekV3训练在昇腾NPU环境部署
作者:昇腾实战派
介绍
本文旨在介绍如何在昇腾NPU环境下,使用MindSpeed-LLM框架对DeepSeek-V3大模型进行预训练、微调及推理。作为开发者,在面临大模型训练资源优化和效率提升的需求时,本文提供了从环境搭建到模型部署的完整流程,帮助解决Deepseek-V3模型训练中的常见技术挑战。
DeepSeek知识地图:https://blog.csdn.net/weixin_45216014/article/details/156450562
一、基础环境准备
1.1 软件列表
| 软件名称 | 软件说明 | 获取链接 |
|---|---|---|
| HDK | 驱动 固件 | https://www.hiascend.com/document/detail/zh/canncommercial/83RC1/softwareinst/instg/instg_0005.html?Mode=DockerIns&InstallType=local&OS=Ubuntu&Software=cannToolKit |
| CANN | tookits、kernels、nnal | https://www.hiascend.com/document/detail/zh/canncommercial/83RC1/softwareinst/instg/instg_0013.html?Mode=DockerIns&InstallType=local&OS=Ubuntu&Software=cannToolKit |
| Python | 推荐3.10版本 | https://www.python.org/downloads/release/python-31019 |
| PTA | torch 2.7.1、torch_npu、apex | https://www.hiascend.com/document/detail/zh/Pytorch/720/configandinstg/instg/insg_0001.html |
| Deepseek3权重 | 预训练权重可选 | https://huggingface.co/deepseek-ai/DeepSeek-V3/tree/main |
| 镜像下载 | 适配mindspeed-llm环境镜像 | https://www.hiascend.com/developer/ascendhub/detail/e26da9266559438b93354792f25b2f4a |
1.2 容器启动
容器启动需要挂载相关目录至容器内,可参考如下启动指令:
docker run -dit -u root --name=xxx --net=host --ipc=host --privileged \
--device=/dev/davinci0 \
--device=/dev/davinci1 \
--device=/dev/davinci2 \
--device=/dev/davinci3 \
--device=/dev/davinci4 \
--device=/dev/davinci5 \
--device=/dev/davinci6 \
--device=/dev/davinci7 \
--device=/dev/davinci_manager \
--device=/dev/devmm_svm \
--device=/dev/hisi_hdc \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
-v /usr/local/sbin/:/usr/local/sbin/ \
-v /var/log/npu/:/usr/slog \
--shm-size=100g \
image:tag \
/bin/bash
二、Mindspeed-LLM安装及权重数据集准备
2.1 Mindspeed-LLM环境安装
以MindSpeed-LLM 2.2.0版本为例:
# 安装MindSpeed加速库
git clone https://gitcode.com/ascend/MindSpeed.git
cd MindSpeed
git checkout 2.2.0_core_r0.12.1
pip3 install -r requirements.txt
pip3 install -e .
cd ..
# 准备MindSpeed-LLM及Megatron-LM源码
git clone https://gitcode.com/ascend/MindSpeed-LLM.git
git clone https://github.com/NVIDIA/Megatron-LM.git # megatron从github下载,请确保网络能访问
cd Megatron-LM
git checkout core_v0.12.1
cp -r megatron ../MindSpeed-LLM/
cd ../MindSpeed-LLM
git checkout 2.2.0
pip3 install -r requirements.txt # 安装其余依赖库
2.2 权重准备
huggingface格式权重转为megatron格式权重,权重转换前请确保使用反量化后bf16格式的deepseekv3权重(HuggingFace仓上的权重为fp8格式权重,需要通过本身提供的脚本将其转换为bf16)。
DeepSeek-V3模型目录下的ckpt_convert_deepseek3_hf2mcore.sh脚本,设置与训练脚本相同配置,再执行转换。
bash examples/mcore/deepseek3/ckpt_convert_deepseek3_hf2mcore.sh
⚠️ 注意点:
- 权重转换的切分方式需要与训练脚本中的切分一致。
--num-layer-list,--noop-layers等参数根据任务需要进行配置,num-layer-list含义是将模型总层数切分成对应的组数,如上列是将61层切分成(16,15,15,15 )这4组,组数和是61。noop-layers含义是添加空层,如--noop-layers 61,62,63,表示设置61,62,63层为空层,那么总层数num-layers为61+3=64层。两者使用需要注意区分。- 权重转换中的参数配置(PP;EP;num-layers;num-layer-list;是否开启moe-grouped-gemm;是否开启MTP)需要跟训练启动脚本中的配置对应。
2.3 数据集准备
数据集下载
预训练数据集处理方法
# 请按照您的真实环境 source set_env.sh 环境变量
source /usr/local/Ascend/ascend-toolkit/set_env.sh
mkdir ./dataset
python ./preprocess_data.py \
--input ./dataset/train-00000-of-00001-a09b74b3ef9c3b56.parquet \
--tokenizer-name-or-path ./model_from_hf/llama-2-7b-hf \
--tokenizer-type PretrainedFromHF \
--handler-name GeneralPretrainHandler \
--output-prefix ./dataset/alpaca_llama2_7b \
--json-keys text \
--workers 4 \
--log-interval 1000
微调数据集处理方法
# 请按照您的真实环境修改 set_env.sh 路径
# source /usr/local/Ascend/ascend-toolkit/set_env.sh
mkdir ./finetune_dataset
python ./preprocess_data.py \
--input ./dataset/train-00000-of-00001-a09b74b3ef9c3b56.parquet \
--tokenizer-name-or-path ./model_from_hf/deepseek3-hf \
--output-prefix ./finetune_dataset/alpaca \
--handler-name AlpacaStyleInstructionHandler \
--tokenizer-type PretrainedFromHF \
--workers 4 \
--log-interval 1000 \
--overwrite-cache \
--prompt-type deepseek3
三、Deepseekv3预训练
前置条件:
1.预训练可以不需要准备权重
2.需要准备好处理完之后的预训练数据集
3.集群环境确保正常
启动脚本:
Deepseekv3的预训练需要512卡进行完整的预训练,可参考pretrain_deepseek3_671b_4k_ptd.sh
减层指导
若需要缩小模型规模,可以通过缩减模型层数的方式进行验证,减层主要修改如下参数:
...
NUM_LAYERS=64 # 缩减总层数,
...
--first-k-dense-replace 3 # 缩减前三层dense层(可选)
...
--noop-layers 61,62,63 # 空层配置需要对应修改,可去除
💡另外需要设置对应的NNODES、TP、PP参数来适应减层后的模型规模。
四、Deepseekv3微调
4.1 SFT全参微调
前置条件:
1.准备权重,参考2.2章节
2.微调数据集准备
3.集群环境确保正常
启动脚本:
Deepseekv3的全参微调需要512卡(A2)进行完整的微调,可参考tune_deepseek3_671b_4k_full_ptd.sh。
4.2 LoRA微调
1.准备权重
当前 Lora微调脚本 中的切分策略是PP4,EP16,--num-layer-list 15,15,16,15,8机64卡(A2),权重转换中的参数配置(PP、EP、num-layers、num-layer-list、是否开启moe-grouped-gemm、是否开启MTP)需要跟Lora微调启动脚本中的配置对应。参考如下脚本:
# 请按照您的真实环境修改 set_env.sh 路径
source /usr/local/Ascend/ascend-toolkit/set_env.sh
python examples/mcore/deepseek3/convert_ckpt_deepseek3.py \
--target-pipeline-parallel-size 4 \
--target-expert-parallel-size 16 \
--num-nextn-predict-layers 0 \
--load-dir ./model_from_hf/deepseek3-bf16-hf \
--save-dir ./model_weights/deepseek3-mcore \
--num-layers 61 \
--num-layer-list 15,15,16,15
2.LoRA微调数据集处理
参考2.3章节微调数据集准备
3. LoRA微调启动脚本
参考Mindspeed-LLM仓上LoRA微调脚本
⚠️ 注意点:
--save-interval参数表示保存ckpt的步数,可以根据实际需要修改。- 运行脚本的切分配置(PP, EP等)需要跟权重的切分配置一致。
4.其他说明
1、LoRA微调可以使用随机初始化权重进行训练,若初次运行,推荐使用初始化权重进行测试。
2、LoRA微调针对不同的数据集,内存的表现会不一样,若NPU显存富余,可以相应减少recompute-num-layers层数。
3、Lora微调后的权重进行推理操作,需要加载微调前的权重(CHECKPOINT) 和微调后的权重(LORA_CHECKPOINT)。
4、在LoRA微调中加入--lora-ckpt-filter,只保存LoRA权重
五、使用Mindspeed-LLM进行推理指导
使用Mindspeed-LLM推理脚本可以快速验证训练完成之后的权重是否可以正常回答语句。
参考Mindspeed-LLM仓上推理脚本,仓库地址下generate_deepseek3_671b_xxx.sh脚本
⚠️ 注意点:
- 推理运行脚本的切分策略(PP, EP, num-layer-list等)需要跟训练完后权重的切分配置一致。
- Lora和QLora的推理脚本需要加载微调前的权重(CHECKPOINT) 和微调后的权重(LORA_CHECKPOINT)
- 若对原始bf16权重进行推理时,需要去除
--prompt-type deepseek3参数- 配置
--task chat可开启多段对话式推理,若去除--task chat会运行内置语句推理。
说明:本文基于实际环境验证,所述流程与参数可根据具体硬件配置和任务需求灵活调整。
更多推荐


所有评论(0)