LoRA(Low-Rank Adaptation)是一种高效的模型微调方法,广泛应用于预训练的深度学习模型。通过在权重上添加低秩矩阵,冻结部分权重,仅更新参数量极少的旁路矩阵,LoRA 使得微调过程更为轻量,节省计算资源和存储空间。QLoRA是在LoRA的基础上对冻结部分权重进行量化,节省更多内存。
DeepSeekV3-671B 低参微调的参考硬件配置如下
| 类型 | 硬件 | 配置 |
|---|---|---|
| LoRA | NPU | 64 x Ascend NPUs |
| QLoRA | NPU | 32 x Ascend NPUs |
MindSpeed-LLM的主要依赖配套如下表,安装步骤参考安装指导。
| 依赖软件 | 版本 |
|---|---|
| 昇腾NPU驱动 | 在研版本 |
| 昇腾NPU固件 | |
| CANN Toolkit(开发套件) | 在研版本 |
| CANN Kernel(算子包) | |
| CANN NNAL(Ascend Transformer Boost加速库) | |
| Python | >=3.8 |
| PyTorch | 2.1 |
| torch_npu插件 | 在研版本 |
| apex |
MindSpeed-LLM仓库也提供了镜像给用户进行快捷部署,在完成MindSpeed-LLM仓库部署一节中的驱动固件安装,CANN安装之后, 可部署镜像,在容器里进行训练。
镜像下载
通过lscpu确认自身系统是x86_64 或者 arm 根据需要下载对应的镜像,如下为下载链接: https://www.hiascend.com/developer/ascendhub/detail/e26da9266559438b93354792f25b2f4a, 拉取2024.rc4分支版本
通过docker image list 确认镜像挂载是否成功
创建容器
参考脚本如下,将创建一个名为llm_test的容器,请根据实际镜像修改tag信息,注意当前默认配置驱动和固件安装在/usr/local/Ascend,如有差异请修改指令路径。 当前容器默认初始化npu驱动和CANN环境信息,如需要安装新的,请自行替换或手动source
docker run -dit --ipc=host --network host --name 'llm_test' --privileged -v /usr/local/Ascend/driver:/usr/local/Ascend/driver -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware -v /usr/local/sbin/:/usr/local/sbin/ -v /home/:/home/ mindspeed-llm:tag登录镜像并确认环境状态
# 登录容器
docker exec -it llm_test /bin/bash
# 确认npu是否可以正常使用,否则返回2.检查配置
npu-smi info仓库代码部署
# 安装MindSpeed加速库
git clone https://gitee.com/ascend/MindSpeed.git
cd MindSpeed
git checkout 0dfa0035 # checkout commit from MindSpeed core_r0.8.0 in 2025.02.26
pip install -r requirements.txt
pip3 install -e .
cd ..
# 准备MindSpeed-LLM及Megatron-LM源码
git clone https://gitee.com/ascend/MindSpeed-LLM.git
git clone https://github.com/NVIDIA/Megatron-LM.git # megatron从github下载,请确保网络能访问
cd Megatron-LM
git checkout core_r0.8.0
cp -r megatron ../MindSpeed-LLM/
cd ../MindSpeed-LLM
pip install -r requirements.txt # 安装其余依赖库权重下载
从 huggingface 或者Gitcode AI社区链接下载权重和配置文件
git clone https://huggingface.co/deepseek-ai/DeepSeek-V3-Base权重反量化
DeepSeekV3官方提供的是FP8类型的数据,需要反量化为BF16,官方提供了反量化脚本
使用方法如下,请根据实际权重存放路径修改脚本
cd DeepSeek-V3/inference
python fp8_cast_bf16.py --input-fp8-hf-path="" --output-bf16-hf-path=""MindSpeed-LLM提供脚本 进行微调数据集处理
使用方法如下,请根据实际需要修改以下参数
cd MindSpeed-LLM
bash examples/mcore/deepseek3/data_convert_deepseek3_instruction.sh| 参数名 | 含义 |
|---|---|
| --input | 数据集路径 |
| --tokenizer-name-or-path | 模型tokenizer目录 |
| --output-prefix | 数据集处理完的输出路径及前缀名 |
微调数据集处理结果如下,微调时,数据集路径输入 ./finetune_dataset/alpaca 即可
./finetune_dataset/alpaca_packed_attention_mask_document.bin
./finetune_dataset/alpaca_packed_attention_mask_document.idx
./finetune_dataset/alpaca_packed_input_ids_document.bin
./finetune_dataset/alpaca_packed_input_ids_document.idx
./finetune_dataset/alpaca_packed_labels_document.bin
./finetune_dataset/alpaca_packed_labels_document.idx以A2 8机64卡为例,使用方法如下
MindSpeed-LLM提供脚本将已经反量化为bf16数据格式的huggingface权重转换为mcore权重,用于微调、推理、评估等任务。
使用方法如下,请根据实际需要的TP/PP/EP等切分策略和权重路径修改权重转换脚本
cd MindSpeed-LLM
bash examples/mcore/deepseek3/ckpt_convert_deepseek3_hf2mcore.sh8机64卡参考脚本配置,TP=1,PP=4,EP=16
# 修改 ascend-toolkit 路径
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 \
--load-dir ./model_from_hf/deepseek3-bf16-hf \
--save-dir ./model_weights/deepseek3-mcore \
--num-layers 61 \
--num-nextn-predict-layers 0 \
--num-layer-list 15,15,16,15cd MindSpeed-LLM
bash examples/mcore/deepseek3/tune_deepseek3_671b_4k_lora_ptd.sh用户需要根据实际情况修改脚本中以下变量
| 变量名 | 含义 |
|---|---|
| MASTER_ADDR | 多机情况下主节点IP |
| NODE_RANK | 多机下,各机对应节点序号0-7 |
| CKPT_SAVE_DIR | 训练中权重保存路径,保存了浮点LoRA权重+主干权重 |
| DATA_PATH | 数据预处理后的数据路径 |
| TOKENIZER_PATH | deepseekv3 tokenizer目录 |
| CKPT_LOAD_DIR | 权重转换保存的权重路径即主干权重,无有效路径则随机初始化 |
cd MindSpeed-LLM
bash examples/mcore/deepseek3/generate_deepseek3_671b_4k_lora_ptd.sh用户需要根据实际情况修改脚本中以下变量
| 变量名 | 含义 |
|---|---|
| MASTER_ADDR | 多机情况下主节点IP |
| NODE_RANK | 多机下,各机对应节点序号0-7 |
| CHECKPOINT | 微调使用的主干权重,即训练中加载的CKPT_LOAD_DIR,不支持随机初始化 |
| LORA_CHECKPOINT | 训练保存的LoRA权重路径,即训练中的CKPT_SAVE_DIR,不支持随机初始化 |
| TOKENIZER_PATH | deepseekv3 tokenizer目录 |
QLoRA在LoRA基础上对冻结线性层进行量化,以A2 4机32卡为例,使用方法如下
MindSpeed-LLM提供脚本将已经反量化为bf16数据格式的huggingface权重转换为mcore权重,用于微调、推理、评估等任务。
使用方法如下,请根据实际需要的TP/PP/EP等切分策略和权重路径修改权重转换脚本,在一般的脚本基础上加入了--qlora-nf4对线性层进行量化
cd MindSpeed-LLM
bash examples/mcore/deepseek3/ckpt_convert_deepseek3_hf2mcore.sh4机32卡参考脚本配置,TP=1,PP=8,EP=4
# 修改 ascend-toolkit 路径
source /usr/local/Ascend/ascend-toolkit/set_env.sh
python examples/mcore/deepseek3/convert_ckpt_deepseek3.py \
--target-pipeline-parallel-size 8 \
--target-expert-parallel-size 4 \
--load-dir ./model_from_hf/deepseek3-bf16-hf \
--save-dir ./model_weights/deepseek3-mcore \
--num-layers 61 \
--num-nextn-predict-layers 0 \
--num-layer-list 7,7,7,8,8,8,8,8 \
--qlora-nf4cd MindSpeed-LLM
bash examples/mcore/deepseek3/tune_deepseek3_671b_4k_qlora_ptd.sh用户需要根据实际情况修改脚本中以下变量
| 变量名 | 含义 |
|---|---|
| MASTER_ADDR | 多机情况下主节点IP |
| NODE_RANK | 多机下,各机对应节点序号0-3 |
| CKPT_SAVE_DIR | 训练中权重保存路径,保存了浮点LoRA权重+量化的主干权重 |
| DATA_PATH | 数据预处理后的数据路径 |
| TOKENIZER_PATH | deepseekv3 tokenizer目录 |
| CKPT_LOAD_DIR | 权重转换保存的权重路径,必须加载,不可随机初始化 |
可选参数: --qlora-save-dequantize:默认为False,可以在微调阶段保存时反量化主干权重,使得保存的权重和LoRA一致
cd MindSpeed-LLM
bash examples/mcore/deepseek3/generate_deepseek3_671b_4K_qlora_ptd.sh用户需要根据实际情况修改脚本中以下变量
| 变量名 | 含义 |
|---|---|
| MASTER_ADDR | 多机情况下主节点IP |
| NODE_RANK | 多机下,各机对应节点序号0-3 |
| CHECKPOINT | 微调使用的主干权重,即训练中加载的CKPT_LOAD_DIR,不支持随机初始化 |
| LORA_CHECKPOINT | 训练保存的LoRA权重路径,即训练中的CKPT_SAVE_DIR,不支持随机初始化 |
| TOKENIZER_PATH | deepseekv3 tokenizer目录 |
MindSpeed-LLM提供合并LoRA权重和主干权重的功能,详见权重转换指导文档, QLoRA在微调阶段加入--qlora-save-dequantize参数,保存的权重即和LoRA微调一致,合并方法相同。