本文档提供了一个简易示例,帮助初次接触MindSpeed LLM的开发者快速启动模型训练任务,并基于预训练语言模型,使用单样本格式数据完成指令单机微调任务。 以下将以Qwen3-0.6B模型为例,指导开发者完成大语言模型的预训练和微调任务,主要步骤包括:
- 环境准备:根据仓库指导文件搭建环境
- 准备开源模型权重:从HuggingFace下载Qwen3-0.6B原始模型
- 启动训练任务:在昇腾NPU上进行模型预训练和微调
开发者入门基础:
- 具备基础的MindSpore使用经验
- 具备初级的Python开发经验
- 对Megatron-LM仓库有基本的了解
基于MindSpore框架,环境搭建请参考MindSpeed LLM安装指导。
-
通过HuggingFace获取模型权重文件。
# 创建一个目录存储权重文件 mkdir -p ./model_from_hf/qwen3_hf cd ./model_from_hf/qwen3_hf # wget获取权重文件 wget https://huggingface.co/Qwen/Qwen3-0.6B/blob/main/config.json wget https://huggingface.co/Qwen/Qwen3-0.6B/blob/main/generation_config.json wget https://huggingface.co/Qwen/Qwen3-0.6B/blob/main/merges.txt wget https://huggingface.co/Qwen/Qwen3-0.6B/blob/main/model.safetensors wget https://huggingface.co/Qwen/Qwen3-0.6B/blob/main/tokenizer.json wget https://huggingface.co/Qwen/Qwen3-0.6B/blob/main/tokenizer_config.json wget https://huggingface.co/Qwen/Qwen3-0.6B/blob/main/vocab.json
-
通过sha256sum验证模型权重文件完整性。
# 利用sha256sum计算sha256数值 # 打开文件明细可获取sha256值,https://huggingface.co/Qwen/Qwen3-0.6B/blob/main/model.safetensors sha256sum model.safetensors
昇腾MindSpeed LLM要求模型权重采用Megatron-Mcore格式,在这里我们将原始HuggingFace权重格式转换为Megatron-Mcore格式,详见hf2mg权重转换。
使用官方提供的转换脚本,获取对应切分的mg权重。
-
编辑权重转换脚本。
cd MindSpeed-LLM vi examples/mindspore/qwen3/ckpt_convert_qwen3_hf2mcore.sh -
完成转换脚本的修改配置并保存。 如下为调整后的hf2mcore权重转换示例脚本。
# 请按照实际环境修改set_env.sh路径 export CUDA_DEVICE_MAX_CONNECTIONS=1 source /usr/local/Ascend/cann/set_env.sh python ./mindspeed_llm/mindspore/convert_ckpt.py \ --use-mcore-models \ --model-type GPT \ --load-model-type hf \ --save-model-type mg \ --target-tensor-parallel-size 1 \ --target-pipeline-parallel-size 1 \ --spec mindspeed_llm.tasks.models.spec.qwen3_spec layer_spec \ --load-dir ./model_from_hf/qwen3_hf/ \ --save-dir ./model_weights/qwen3_mcore/ \ --tokenizer-model ./model_from_hf/qwen3_hf/tokenizer.json \ --params-dtype bf16 \ --model-type-hf qwen3 \ --ai-framework mindspore
表 1 权重转换参数解析
参数 说明 必填 --use-mcore-models转换为Megatron-Mcore格式 ✅ --model-type GPT指定模型类型为GPT系列 ✅ --target-tensor-parallel-size张量并行度设置(建议配置1) ✅ --target-pipeline-parallel-size流水线并行度设置(建议保持1) ✅ --load-model-type加载权重的类别(可以是hf、mg) ✅ --save-model-type存储权重的类别(可以是hf、mg) ✅ --load-dir权重文件加载路径 ✅ --save-dir权重文件保存路径 ✅ --model-type-hfHuggingFace模型类别 ✅ --params-dtype指定权重转换后的权重精度模式,默认为fp16,如果源文件格式为bf16,则需要设置为bf16 ✅ --spec指定Transformer层的结构配置 ✅ --tokenizer-model指定分词器模型文件路径 ✅ --ai-framework指定使用的训练框架,支持 pytorch和mindspore,默认为pytorch,需要设置为mindspore✅ -
执行权重转换脚本。
bash examples/mindspore/qwen3/ckpt_convert_qwen3_hf2mcore.sh
运行脚本后,预期会看到类似以下的日志输出,表示权重转换成功:
successfully saved checkpoint from iteration 1 to ./model_weights/qwen3_mcore/ INFO:root:Done!
Note
-
对于Qwen3-0.6B模型,此处推荐的切分配置是tp1pp1,对应上述配置。
-
MindSpore框架默认在Device侧进行权重转换,在模型较大时存在OOM风险,因此建议用户手动修改
convert_ckpt.py,在包导入时加入如下代码设置CPU侧执行权重转换:import mindspore as ms ms.set_context(device_target="CPU", pynative_synchronize=True) import torch torch.configs.set_pyboost(False)
-
MindSpore框架转换出的模型权重无法直接用于PyTorch框架训练或推理。
在这一阶段,我们将基于下载的HuggingFace原数据,完成数据集预处理,并启动模型预训练,具体步骤如下:
- 数据预处理
- 启动预训练任务
通过对各种格式的数据做提前预处理,避免原始数据的反复处理加载,将所有的数据都统一存储到.bin和.idx两个文件中,详见预训练数据处理。
如下以Alpaca数据集为例,进行预训练数据集处理示例。
-
获取数据集元数据。
mkdir dataset cd dataset/ # HuggingFace 数据集链接(择一获取) wget https://huggingface.co/datasets/tatsu-lab/alpaca/resolve/main/data/train-00000-of-00001-a09b74b3ef9c3b56.parquet # ModelScope 数据集链接(择一获取) wget https://www.modelscope.cn/datasets/angelala00/tatsu-lab-alpaca/resolve/master/train-00000-of-00001-a09b74b3ef9c3b56.parquet cd ..
-
编辑预训练数据处理脚本。
vi examples/mindspore/qwen3/data_convert_qwen3_pretrain.sh
-
完成数据处理脚本的修改配置并保存。
如下为调整后的数据处理示例脚本。
# 请按照实际环境修改set_env.sh路径 source /usr/local/Ascend/cann/set_env.sh python ./preprocess_data.py \ --input ./dataset/train-00000-of-00001-a09b74b3ef9c3b56.parquet \ --tokenizer-name-or-path ./model_from_hf/qwen3_hf/ \ # 注意此处路径是否一致 --tokenizer-type PretrainedFromHF \ --handler-name GeneralPretrainHandler \ --output-prefix ./dataset/alpaca \ # 预训练数据集会生成alpaca_text_document.bin和.idx --json-keys text \ --workers 4 \ --log-interval 1000
表 2 数据预处理参数解析
参数 说明 必填 --input支持输入数据集目录或文件,目录则处理全部文件, 支持.parquet、.csv、.json、.jsonl、.txt、.arrow格式,同一目录要求数据格式保持一致 ✅ --tokenizer-type说明使用tokenizer类别,参数值为PretrainedFromHF时,词表路径填写模型目录即可 ✅ --tokenizer-name-or-path配合tokenizer-type,目标模型的tokenizer原数据文件夹,用于数据集的转换 ✅ --handler-name指定数据集的处理类 ✅ --output-prefix转换后输出的数据集文件的文件名前缀 ✅ --workers多进程数据集处理 ✅ --log-interval处理进度更新的间隔步数 ✅ --json-keys从文件中提取的列名列表,默认为 text,可以为text、input及title等多个输入,结合实际情况及数据集内容使用✅ -
执行预训练数据处理脚本。
bash examples/mindspore/qwen3/data_convert_qwen3_pretrain.sh
预训练数据集处理结果如下:
./dataset/alpaca_text_document.bin ./dataset/alpaca_text_document.idx
完成了数据集处理和权重转换之后,可以开始拉起预训练任务。
-
编辑示例脚本。
cd MindSpeed-LLM vi examples/mindspore/qwen3/pretrain_qwen3_0point6b_4K_ms.sh -
修改并保存预训练参数配置,配置示例如下:
NPUS_PER_NODE=8 # 使用单节点的8卡NPU MASTER_ADDR=localhost # 单机使用本节点ip,多机所有节点都配置为master_ip MASTER_PORT=6011 # 本节点端口号为6011 NNODES=1 # 根据参与节点数量配置,单机为1,多机即多节点 NODE_RANK=0 # 单机RANK为0,多机为(0,NNODES-1),不同节点不可重复,master_node rank为0,其ip为master_ip WORLD_SIZE=$(($NPUS_PER_NODE * $NNODES)) # 根据实际情况配置权重保存、权重加载、词表、数据集路径,多机中所有节点都要有如下数据 CKPT_LOAD_DIR="./model_weights/qwen3_mcore/" # 权重加载路径,填入权重转换时保存的权重路径 CKPT_SAVE_DIR="./ckpt/qwen3-0point6b" # 训练完成后的权重保存路径 DATA_PATH="./dataset/alpaca_text_document" # 数据集路径,填入数据预处理时保存的数据路径,注意需要添加后缀,如使用Alpaca数据集预处理会生成alpaca_text_document.bin和.idx,则在数据集路径后再加上alpaca_text_document TOKENIZER_PATH="./model_from_hf/qwen3_hf/" # 词表路径,填入下载的开源权重词表路径 TP=1 # 权重转换设置--target-tensor-parallel-size 1,修改为1 PP=1 # 权重转换设置--target-pipeline-parallel-size 1,修改为1,与权重转换时一致 SEQ_LEN=4096 # 设置seq_length为4096 MBS=1 # 设置micro-batch-size为1 GBS=8 # 设置global-batch-size为8 TRAIN_ITERS=2000 # 设置训练迭代步数
-
设置环境变量。
source /usr/local/Ascend/cann/set_env.sh source /usr/local/Ascend/nnal/atb/set_env.sh
以上命令以root用户安装后的默认路径为例,请用户根据set_env.sh的实际路径进行替换。
-
执行预训练脚本。
bash examples/mindspore/qwen3/pretrain_qwen3_0point6b_4K_ms.sh
脚本中特性包含训练参数或优化特性,下表为部分参数解释。
表 3 训练脚本参数说明
参数名 说明 --use-mcore-models使用Mcore分支运行模型 --disable-bias-linear去掉linear的偏移值,与Qwen原模型一致 --group-query-attention开启GQA注意力处理机制 --num-query-groups 8配合GQA使用,设置groups为8 --position-embedding-type rope位置编码采用RoPE方案 --bf16昇腾芯片对bf16精度支持良好,可显著提升训练速度 --ai-framework指定使用的训练框架
Note
- 多机训练需在多个终端同时启动预训练脚本(每个终端的预训练脚本只有NODE_RANK参数不同,其他参数均相同)。
- 如果使用多机训练,且没有设置数据共享,需要在训练启动脚本中增加
--no-shared-storage参数,设置此参数之后将会根据分布式参数判断非主节点是否需要load数据,并检查相应缓存和生成数据。 - MindSpore框架需在预训练脚本中指定
--ai-framework参数为mindspore。
在这一阶段,我们将基于下载的HuggingFace原数据,完成数据集预处理,并启动模型微调,具体步骤如下:
- 数据预处理
- 启动微调任务
通过对各种格式的数据做提前预处理,避免原始数据的反复处理加载,将所有的数据都统一存储到.bin和.idx两个文件中,详见Alpaca微调数据使用文档。
如下以Alpaca数据集为例,进行数据预处理示例。
-
获取数据集元数据。
mkdir dataset cd dataset/ # HuggingFace 数据集链接 wget https://huggingface.co/datasets/tatsu-lab/alpaca/resolve/main/data/train-00000-of-00001-a09b74b3ef9c3b56.parquet cd ..
-
编辑数据预处理脚本。
vi examples/mindspore/qwen3/data_convert_qwen3_instruction.sh
-
完成数据预处理脚本的修改配置并保存。
# 请根据实际环境修改set_env.sh路径 source /usr/local/Ascend/cann/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/qwen3_hf/ \ --output-prefix ./finetune_dataset/alpaca \ --handler-name AlpacaStyleInstructionHandler \ --tokenizer-type PretrainedFromHF \ --workers 4 \ --log-interval 1000 \ --enable-thinking true \ --prompt-type qwen3
表 4 数据预处理参数解析
参数 说明 必填 --input支持输入数据集目录或文件,目录则处理全部文件, 支持.parquet、.csv、.json、.jsonl、.txt、.arrow格式,同一目录要求数据格式保持一致 ✅ --tokenizer-type说明使用tokenizer类别,参数值为PretrainedFromHF时,词表路径填写模型目录即可 ✅ --tokenizer-name-or-path配合tokenizer-type,目标模型的tokenizer原数据文件夹,用于数据集的转换 ✅ --output-prefix转换后输出的数据集文件的文件名前缀 ✅ --workers多进程数据集处理 ✅ --handler-name指定数据集的处理类 ✅ --log-interval处理进度更新的间隔步数 ✅ --enable-thinking快慢思考模板开关 --prompt-type用于指定模型模板 ✅ -
执行数据处理脚本。
bash examples/mindspore/qwen3/data_convert_qwen3_instruction.sh
微调数据集处理结果如下:
./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
完成了数据集处理和权重转换之后,可以开始启动微调任务。
-
编辑示例脚本。
cd MindSpeed-LLM vi examples/mindspore/qwen3/tune_qwen3_0point6b_4K_full_ms.sh -
修改并保存微调参数配置,配置示例如下:
NPUS_PER_NODE=8 # 单节点的卡数 MASTER_ADDR=localhost MASTER_PORT=6015 NNODES=1 NODE_RANK=0 WORLD_SIZE=$(($NPUS_PER_NODE * $NNODES))
在脚本中修改相关路径参数和模型切分配置:
CKPT_LOAD_DIR="./model_weights/qwen3_mcore/" # 指向权重转换后保存的路径 CKPT_SAVE_DIR="./ckpt/qwen3-0point6b" # 指向用户指定的微调后权重保存路径 DATA_PATH="./finetune_dataset/alpaca" # 指定处理后的数据路径 TOKENIZER_PATH="./model_from_hf/qwen3_hf/" # 指定模型的tokenizer路径 TP=1 # 模型权重转换的tp大小,在本例中是1 PP=1 # 模型权重转换的pp大小,在本例中是1
-
设置环境变量。
source /usr/local/Ascend/cann/set_env.sh source /usr/local/Ascend/nnal/atb/set_env.sh
以上命令以root用户安装后的默认路径为例,请用户根据set_env.sh的实际路径进行替换。
-
执行微调脚本。
bash examples/mindspore/qwen3/tune_qwen3_0point6b_4K_full_ms.sh
脚本中特性包含微调参数或优化特性,下表为部分参数解释。
表 5 微调脚本参数说明
参数名 说明 --finetune启动模型的微调模式。 --stage训练方法。 --is-instruction-dataset用于指定微调过程中采用指令微调数据集,以确保模型依据特定指令数据进行微调。 --prompt-type用于指定模型模板,能够让base模型微调后能具备更好的对话能力。可在templates.json文件内查看 prompt-type的可选项。--no-pad-to-seq-lengths支持动态序列长度微调,默认按照8的倍数进行padding。 --sequence-parallel开启序列并行。 --use-flash-attn启用Flash Attention。 --bf16昇腾芯片对bf16精度支持良好,可显著提升训练速度。 --ai-framework指定使用的训练框架 [!NOTE]
MindSpore框架需在微调脚本中指定--ai-framework参数为mindspore。
