安装指导:
https://gitcode.com/Ascend/MindSpeed-LLM/blob/2.2.0/docs/pytorch/install_guide.md
快速入门:
https://gitcode.com/Ascend/MindSpeed-LLM/blob/2.2.0/docs/quick_start.md
git clone https://gitcode.com/ascend/MindSpeed.gitcd MindSpeed
git checkout 2.2.0_core_r0.12.1
pip install -r requirements.txt
pip3 install -e .
cd ..对于不能直接访问internet的服务器,可通过共享磁盘的方式安装。
有网环境下:pip download --no-deps -r ../git/MindSpeed/requirements.txt -d offline_packages_mindspeed
无网环境下:pip install --no-index --find-links=../../pip/offline_packages_mindspeed/ -r requirements.txt
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
mkdir logs
pip install -r requirements.txt # 安装其余依赖库1.qwen3,llama3.3系列模型依赖transformers 4.51.0, 需要在环境配置完成后手动执行pip install transformers==4.51.0; 2.glm4.5-moe系列模型依赖transformers 4.54.0, 需要在环境配置完成后手动执行pip install transformers==4.54.0。
对于不能直接访问internet的服务器,可通过共享磁盘的方式安装。
有网环境下:pip download --no-deps -r ../git/MindSpeed-LLM/requirements.txt -d offline_packages_mindspeed-llm
无网环境下:pip install --no-index --find-links=../../pip/offline_packages_mindspeed-llm/ -r requirements.txt
Qwen3 系列包含多个参数规模的模型,涵盖 Qwen3-0.6B、Qwen3-1.7B、Qwen3-4B、Qwen3-8B、Qwen3-14B 以及 Qwen3-32B,可适配从边缘设备到数据中心的多样化应用场景。
尽管各模型在参数量上存在显著差异,其微调范式整体保持一致。本文将以 Qwen3-0.6B 为示例,系统介绍基于 LoRA(Low-Rank Adaptation)的高效微调方法,以及全量参数微调(Full Fine-Tuning)的基本流程与关键技术要点。
pip install modelscope
modelscope download --model Qwen/Qwen3-0.6B --local_dir ./Qwen3-0.6B使用昇腾MindSpeed训练/微调,要求模型权重采用Megatron格式。当原始权重为HuggingFace格式时,需要转换为Megatron-Mcore格式。
在MindSpeed-LLM文件夹下,运行以下命令
vim ./examples/mcore/qwen3/ckpt_convert_qwen3_hf2mcore.sh修改脚本中的模型路径及TP、PP:
可参考如下修改后的脚本:
export CUDA_DEVICE_MAX_CONNECTIONS=1
source /usr/local/Ascend/ascend-toolkit/set_env.sh
model_root_path="xxx" # 模型根路径,需要修改
model_hf_path="${model_root_path}/Qwen3-0.6B "
model_mg_path="${model_root_path}/Qwen3-0.6B-mg"
TP=8
PP=1
python convert_ckpt.py \
--use-mcore-models \
--model-type GPT \
--load-model-type hf \
--save-model-type mg \
--target-tensor-parallel-size ${TP} \
--target-pipeline-parallel-size ${PP} \
--spec mindspeed_llm.tasks.models.spec.qwen3_spec layer_spec \
--load-dir ${model_hf_path} \
--save-dir ${model_mg_path} \
--tokenizer-model ./model_from_hf/qwen3_hf/tokenizer.json \
--params-dtype bf16 \
--model-type-hf qwen3修改好后,在MindSpeed-LLM文件夹下,运行以下命令
bash ./examples/mcore/qwen3/ckpt_convert_qwen3_hf2mcore.shhf download tatsu-lab/alpaca --repo-type=dataset在MindSpeed-LLM文件夹下,运行以下命令
需要在数据集目录下创建文件夹,可以命名为"finetune_dataset_qwen3"
修改脚本中的模型路径:
可参考如下修改后的脚本:
source /usr/local/Ascend/ascend-toolkit/set_env.sh
#mkdir ./finetune_dataset
model_root_path="xxx" # 模型根路径,需要修改
model_hf_path="${model_root_path}/Qwen3-0.6B"
python ./preprocess_data.py \
--input xxx/dataset/tatsu-lab-alpaca/train-00000-of-00001-a09b74b3ef9c3b56.parquet \ # xxx是数据集根路径,需要修改
--tokenizer-name-or-path ${model_hf_path}/ \
--output-prefix xxx/dataset/tatsu-lab-alpaca/finetune_dataset_qwen3/alpaca \ # xxx是数据集根路径,需要修改
--handler-name AlpacaStyleInstructionHandler \
--tokenizer-type PretrainedFromHF \
--workers 4 \
--log-interval 1000 \
--enable-thinking true \
--prompt-type qwen3在MindSpeed-LLM文件夹下,运行以下命令
bash ./examples/mcore/qwen3/data_convert_qwen3_instruction.sh在MindSpeed-LLM文件夹下,运行以下命令
vim ./examples/mcore/qwen3/tune_qwen3_0point6b_4K_lora_ptd.sh 微调脚本相关参数说明
_input_ids_document等后缀,该参数填写到数据集的前缀即可。可参考如下修改后的脚本:
#!/bin/bash
export CUDA_DEVICE_MAX_CONNECTIONS=1
# Change for multinode config
NPUS_PER_NODE=8
MASTER_ADDR=localhost
MASTER_PORT=6015
NNODES=1
NODE_RANK=0
WORLD_SIZE=$(($NPUS_PER_NODE*$NNODES))
dataset_root_path="xxx" # 数据集根路径,需要修改
dataset_path="${dataset_root_path}/tatsu-lab-alpaca/finetune_dataset_qwen3/alpaca"
model_root_path="xxx" # 模型根路径,需要修改
model_hf_path="${model_root_path}/Qwen3-0.6B"
model_mg_path="${model_root_path}/Qwen3-0.6B-mg"
CKPT_LOAD_DIR="${model_mg_path}/"
CKPT_SAVE_DIR="${model_mg_path}/"
DATA_PATH="${dataset_path}"
TOKENIZER_PATH="${model_hf_path}/"
TP=8
PP=1
MBS=1
GBS=8
SEQ_LENGTH=8192
TRAIN_ITERS=2000
DISTRIBUTED_ARGS="
--nproc_per_node $NPUS_PER_NODE \
--nnodes $NNODES \
--node_rank $NODE_RANK \
--master_addr $MASTER_ADDR \
--master_port $MASTER_PORT
"
GPT_ARGS="
--use-mcore-models \
--tensor-model-parallel-size ${TP} \
--pipeline-model-parallel-size ${PP} \
--sequence-parallel \
--spec mindspeed_llm.tasks.models.spec.qwen3_spec layer_spec \
--kv-channels 128 \
--qk-layernorm \
--num-layers 28 \
--hidden-size 1024 \
--use-rotary-position-embeddings \
--num-attention-heads 16 \
--ffn-hidden-size 3072 \
--max-position-embeddings 32768 \
--seq-length ${SEQ_LENGTH} \
--train-iters ${TRAIN_ITERS} \
--micro-batch-size ${MBS} \
--global-batch-size ${GBS} \
--make-vocab-size-divisible-by 1 \
--padded-vocab-size 151936 \
--rotary-base 1000000 \
--disable-bias-linear \
--swiglu \
--use-flash-attn \
--tokenizer-type PretrainedFromHF \
--tokenizer-name-or-path ${TOKENIZER_PATH} \
--normalization RMSNorm \
--position-embedding-type rope \
--norm-epsilon 1e-6 \
--hidden-dropout 0 \
--attention-dropout 0 \
--no-gradient-accumulation-fusion \
--attention-softmax-in-fp32 \
--exit-on-missing-checkpoint \
--no-masked-softmax-fusion \
--group-query-attention \
--num-query-groups 8 \
--seed 42 \
--bf16 \
--min-lr 1.25e-7 \
--weight-decay 1e-1 \
--lr-warmup-fraction 0.01 \
--clip-grad 1.0 \
--adam-beta1 0.9 \
--adam-beta2 0.95 \
--no-load-optim \
--no-load-rng \
--lr 1.25e-5 \
"如果是多机运行,则需要在单机的脚本上修改以下参数:
# 多机配置
# 根据分布式集群实际情况配置分布式参数
NPUS_PER_NODE=8 # 每个节点的卡数
MASTER_ADDR="your master node IP" # 都需要修改为主节点的IP地址(不能为localhost)
MASTER_PORT=6000
NNODES=2 # 集群里的节点数,以实际情况填写
NODE_RANK="current node id" # 当前节点的RANK,多个节点不能重复,主节点为0, 其他节点可以是1,2..
WORLD_SIZE=$(($GPUS_PER_NODE * $NNODES))在MindSpeed-LLM文件夹下,运行以下命令
bash ./examples/mcore/qwen3/tune_qwen3_0point6b_4K_lora_ptd.sh 在MindSpeed-LLM文件夹下,运行以下命令
vim ./examples/mcore/qwen3/tune_qwen3_0point6b_4K_full_ptd.sh微调脚本相关参数说明
_input_ids_document等后缀,该参数填写到数据集的前缀即可。可参考如下修改后的脚本:
#!/bin/bash
export CUDA_DEVICE_MAX_CONNECTIONS=1
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
# Change for multinode config
NPUS_PER_NODE=8
MASTER_ADDR=localhost
MASTER_PORT=6015
NNODES=1
NODE_RANK=0
WORLD_SIZE=$(($NPUS_PER_NODE*$NNODES))
# please fill these path configurations
dataset_root_path="xxx" # 数据集根路径,需要修改
dataset_path="${dataset_root_path}/tatsu-lab-alpaca/finetune_dataset_qwen3/alpaca"
model_root_path="xxx" # 模型根路径,需要修改
model_hf_path="${model_root_path}/Qwen3-0.6B"
model_mg_path="${model_root_path}/Qwen3-0.6B-mg"
CKPT_LOAD_DIR="${model_mg_path}/"
CKPT_SAVE_DIR="${model_mg_path}/"
DATA_PATH="${dataset_path}"
TOKENIZER_PATH="${model_hf_path}/"
TP=8
PP=1
MBS=1
GBS=8
SEQ_LENGTH=8192
TRAIN_ITERS=2000
DISTRIBUTED_ARGS="
--nproc_per_node $NPUS_PER_NODE \
--nnodes $NNODES \
--node_rank $NODE_RANK \
--master_addr $MASTER_ADDR \
--master_port $MASTER_PORT
"
GPT_ARGS="
--use-mcore-models \
--tensor-model-parallel-size ${TP} \
--pipeline-model-parallel-size ${PP} \
--sequence-parallel
--spec mindspeed_llm.tasks.models.spec.qwen3_spec layer_spec \
--kv-channels 128 \
--qk-layernorm \
--use-flash-attn \
--num-layers 28 \
--hidden-size 1024 \
--use-rotary-position-embeddings \
--num-attention-heads 16 \
--ffn-hidden-size 3072 \
--max-position-embeddings 32768 \
--seq-length ${SEQ_LENGTH} \
--train-iters ${TRAIN_ITERS} \
--micro-batch-size ${MBS} \
--global-batch-size ${GBS} \
--make-vocab-size-divisible-by 1 \
--padded-vocab-size 151936 \
--rotary-base 1000000 \
--disable-bias-linear \
--swiglu \
--tokenizer-type PretrainedFromHF \
--tokenizer-name-or-path ${TOKENIZER_PATH} \
--normalization RMSNorm \
--position-embedding-type rope \
--norm-epsilon 1e-6 \
--hidden-dropout 0 \
--attention-dropout 0 \
--no-gradient-accumulation-fusion \
--attention-softmax-in-fp32 \
--exit-on-missing-checkpoint \
--no-masked-softmax-fusion \
--group-query-attention \
--num-query-groups 8 \
--seed 42 \
--bf16 \
--min-lr 1.25e-7 \
--weight-decay 1e-1 \
--lr-warmup-fraction 0.01 \
--clip-grad 1.0 \
--adam-beta1 0.9 \
--adam-beta2 0.95 \
--no-load-optim \
--no-load-rng \
--lr 1.25e-6 \
"在MindSpeed-LLM文件夹下,运行以下命令
bash ./examples/mcore/qwen3/tune_qwen3_0point6b_4K_full_ptd.sh完成微调后,需要进一步验证模型是否具备了预期的输出能力。我们提供了简单的模型生成脚本,只需要加载微调后的模型权重,便可观察模型在不同生成参数配置下的回复。
在MindSpeed-LLM文件夹下,运行以下命令
vim ./examples/mcore/qwen3/generate_qwen3_0point6b_ptd.sh该脚本需要修改的参数如下:
可参考如下修改后的脚本:
# The number of parameters is not aligned
export CUDA_DEVICE_MAX_CONNECTIONS=1
model_root_path="xxx" # 模型的根路径,需要修改
model_hf_path="${model_root_path}/Qwen3-0.6B"
# please fill these path configurations
TOKENIZER_PATH="${model_hf_path}/"
CHECKPOINT="${model_hf_path}/"
# Change for multinode config
MASTER_ADDR=localhost
MASTER_PORT=6000
NNODES=1
NODE_RANK=0
NPUS_PER_NODE=8
WORLD_SIZE=$(($NPUS_PER_NODE*$NNODES))
TP=8
PP=1
EP=1
SEQ_LENGTH=4096
DISTRIBUTED_ARGS="
--nproc_per_node $NPUS_PER_NODE \
--nnodes $NNODES \
--node_rank $NODE_RANK \
--master_addr $MASTER_ADDR \
--master_port $MASTER_PORT
"
torchrun $DISTRIBUTED_ARGS inference.py \
--use-mcore-models \
--tensor-model-parallel-size ${TP} \
--pipeline-model-parallel-size ${PP} \
--expert-model-parallel-size ${EP} \在MindSpeed-LLM文件夹下,运行以下命令
序列类型的不同,其对应的微调脚本和数据预处理方式也不同,这里以Qwen3的指令微调举例:
| 序列长度 | 特点 | 训练脚本 | 数据预处理方式 |
|---|---|---|---|
| 固定长度序列 | 性能低,不推荐使用 | 训练时不使用 --variable-seq-lengths 参数 | 使用默认预处理脚本,如 data_convert_qwen3_instruction.sh |
| 动态长度序列 | sample吞吐高 | 训练脚本需要使用 --variable-seq-lengths 参数 | 使用默认预处理脚本,如 data_convert_qwen3_instruction.sh |
| 样本拼接序列 | token吞吐高,支持长序列并行 | 训练脚本需要使用 --reset-position-ids 参数,不启用 --variable-seq-lengths | 使用pack配置的预处理脚本 |
请根据自己的使用场景,灵活选择对应类型的指令微调训练脚本和数据预处理脚本。