ai-ascend-models/DeepSeek-V3-Lora-tune
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

DeepSeekV3 LoRA&QLoRA Tune 【低参微调】

LoRA(Low-Rank Adaptation)是一种高效的模型微调方法,广泛应用于预训练的深度学习模型。通过在权重上添加低秩矩阵,冻结部分权重,仅更新参数量极少的旁路矩阵,LoRA 使得微调过程更为轻量,节省计算资源和存储空间。QLoRA是在LoRA的基础上对冻结部分权重进行量化,节省更多内存。

目录

  • 环境配置

    • 硬件要求
    • MindSpeed-LLM仓库部署
    • 镜像部署
  • 权重/数据准备

    • 权重预处理
    • 数据预处理
  • LoRA微调

    • 权重转换
    • 训练
    • 推理
  • QLoRA微调

    • 权重转换
    • 训练
    • 推理
  • 权重合并(可选)

环境配置

硬件要求

DeepSeekV3-671B 低参微调的参考硬件配置如下

类型硬件配置
LoRANPU64 x Ascend NPUs
QLoRANPU32 x Ascend NPUs

MindSpeed-LLM仓库部署

MindSpeed-LLM的主要依赖配套如下表,安装步骤参考安装指导。

依赖软件版本
昇腾NPU驱动在研版本
昇腾NPU固件
CANN Toolkit(开发套件)在研版本
CANN Kernel(算子包)
CANN NNAL(Ascend Transformer Boost加速库)
Python>=3.8
PyTorch2.1
torch_npu插件在研版本
apex

镜像部署(可选)

MindSpeed-LLM仓库也提供了镜像给用户进行快捷部署,在完成MindSpeed-LLM仓库部署一节中的驱动固件安装,CANN安装之后, 可部署镜像,在容器里进行训练。

  1. 镜像下载

    通过lscpu确认自身系统是x86_64 或者 arm 根据需要下载对应的镜像,如下为下载链接: https://www.hiascend.com/developer/ascendhub/detail/e26da9266559438b93354792f25b2f4a, 拉取2024.rc4分支版本

    通过docker image list 确认镜像挂载是否成功

  2. 创建容器
    参考脚本如下,将创建一个名为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
  3. 登录镜像并确认环境状态

    # 登录容器
    docker exec -it llm_test /bin/bash   
    # 确认npu是否可以正常使用,否则返回2.检查配置            
    npu-smi info
  4. 仓库代码部署

    # 安装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  # 安装其余依赖库

权重/数据准备

权重预处理

  1. 权重下载

    从 huggingface 或者Gitcode AI社区链接下载权重和配置文件

    git clone https://huggingface.co/deepseek-ai/DeepSeek-V3-Base
  2. 权重反量化

    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

LoRA微调

以A2 8机64卡为例,使用方法如下

权重转换

MindSpeed-LLM提供脚本将已经反量化为bf16数据格式的huggingface权重转换为mcore权重,用于微调、推理、评估等任务。

使用方法如下,请根据实际需要的TP/PP/EP等切分策略和权重路径修改权重转换脚本

cd MindSpeed-LLM
bash examples/mcore/deepseek3/ckpt_convert_deepseek3_hf2mcore.sh

8机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,15

训练

cd 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_PATHdeepseekv3 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_PATHdeepseekv3 tokenizer目录

QLoRA微调

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.sh

4机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-nf4

训练

cd 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_PATHdeepseekv3 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_PATHdeepseekv3 tokenizer目录

权重合并(可选)

MindSpeed-LLM提供合并LoRA权重和主干权重的功能,详见权重转换指导文档, QLoRA在微调阶段加入--qlora-save-dequantize参数,保存的权重即和LoRA微调一致,合并方法相同。