Ascend-SACT/Qwen3-0.6B-finetune
模型介绍文件和版本Pull Requests讨论分析

运行环境

官网资料

安装指导:

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

MindSpeed

下载MindSpeed加速库

git clone https://gitcode.com/ascend/MindSpeed.git

安装

cd MindSpeed

git checkout 2.2.0_core_r0.12.1

pip install -r requirements.txt

pip3 install -e .

cd ..

无网pip install

对于不能直接访问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

MindSpeed-LLM及Megatron-LM

准备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

mkdir logs

pip install -r requirements.txt  # 安装其余依赖库

Transformers版本选择

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。

无网pip install

对于不能直接访问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:

  • model_hf_path:原始权重路径
  • model_mg_path:转换后权重路径
  • 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.sh

语料处理

下载tatsu-lab/alpaca

hf download tatsu-lab/alpaca --repo-type=dataset

修改和执行转换脚本

在MindSpeed-LLM文件夹下,运行以下命令

需要在数据集目录下创建文件夹,可以命名为"finetune_dataset_qwen3"

修改脚本中的模型路径:

  • model_hf_path:原始权重路径

可参考如下修改后的脚本:

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

LORA微调

在MindSpeed-LLM文件夹下,运行以下命令

vim ./examples/mcore/qwen3/tune_qwen3_0point6b_4K_lora_ptd.sh 

微调脚本相关参数说明

  • DATA_PATH:数据集路径。请注意实际数据预处理生成文件末尾会增加_input_ids_document等后缀,该参数填写到数据集的前缀即可。
  • CKPT_LOAD_DIR:开源权重切分后的目录
  • CKPT_SAVE_DIR:微调结束后的保存目录
  • TOKENIZER_PATH:词表文件路径
  • TP:张量并行数,与模型切分时指定参数保持一致
  • PP:流水并行数,与模型切分时指定参数保持一致

可参考如下修改后的脚本:

#!/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

微调脚本相关参数说明

  • DATA_PATH:数据集路径。请注意实际数据预处理生成文件末尾会增加_input_ids_document等后缀,该参数填写到数据集的前缀即可。
  • CKPT_LOAD_DIR:开源权重切分后的目录
  • CKPT_SAVE_DIR:微调结束后的保存目录
  • TOKENIZER_PATH:词表文件路径
  • TP:张量并行数,与模型切分时指定参数保持一致
  • PP:流水并行数,与模型切分时指定参数保持一致

可参考如下修改后的脚本:

#!/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

该脚本需要修改的参数如下:

  • CKPT_DIR:指向微调后权重的保存路径
  • TOKENIZER_PATH:词表文件路径
  • TP:张量并行数,与模型切分时指定参数保持一致
  • PP:流水并行数,与模型切分时指定参数保持一致

可参考如下修改后的脚本:

# 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配置的预处理脚本

请根据自己的使用场景,灵活选择对应类型的指令微调训练脚本和数据预处理脚本。