作者:昇腾实战派

介绍

本文旨在介绍如何在昇腾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

⚠️ 注意点:

  1. 权重转换的切分方式需要与训练脚本中的切分一致。
  2. --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层。两者使用需要注意区分。
  3. 权重转换中的参数配置(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  # 空层配置需要对应修改,可去除

💡另外需要设置对应的NNODESTPPP参数来适应减层后的模型规模。

四、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微调脚本

⚠️ 注意点:

  1. --save-interval 参数表示保存ckpt的步数,可以根据实际需要修改。
  2. 运行脚本的切分配置(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脚本

⚠️ 注意点:

  1. 推理运行脚本的切分策略(PP, EP, num-layer-list等)需要跟训练完后权重的切分配置一致。
  2. Lora和QLora的推理脚本需要加载微调前的权重(CHECKPOINT) 和微调后的权重(LORA_CHECKPOINT)
  3. 若对原始bf16权重进行推理时,需要去除 --prompt-type deepseek3 参数
  4. 配置 --task chat 可开启多段对话式推理,若去除 --task chat 会运行内置语句推理。

说明​:本文基于实际环境验证,所述流程与参数可根据具体硬件配置和任务需求灵活调整。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐