当前文档提供了一个简单示例,方便新接触MindSpeed-LLM的开发者们可以快速上手,将模型训练任务跑起来。下面以Qwen2.5-7B模型为例,指导开发者完成Qwen2.5-7B大语言模型的预训练任务,主要包含如下步骤:
开发者入门基础:
如果已经完成了环境搭建,请跳转2,进行预训练任务拉起。
请参考MindSpeed-LLM仓首页“版本配套表”,选择下载对应版本的软件依赖,如下主要提供一些图示指导说明,完成环境搭建,本章节通过配图辅助您完成环境安装。
具体配套版本关系,以版本配套表为准。
参考版本配套表,根据系统和硬件产品型号,选择对应版本的driver
和firmware
下载驱动固件,并参考完成NPU驱动固件安装,安装后重启os系统生效。
参考版本配套表,根据系统选择aarch64
或x86_64
对应版本的cann-toolkit
、cann-kernel
和cann-nnal
,下载CANN软件包,参考CANN安装教程完成cann包安装。
pytorch后端相关依赖环境与mindspore环境互相冲突,请根据需要,择一安装。
请参考MindSpeed-LLM仓首页“版本配套表”,准备torch_npu和apex,参考Ascend Extension for PyTorch或执行以下命令安装
# 安装torch和torch_npu,因为版本迭代,包名存在出入,根据实际修改
wget https://download.pytorch.org/whl/cpu/torch-2.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
pip install torch-2.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
wget https://gitee.com/ascend/pytorch/releases/download/v7.0.0-pytorch2.1.0/torch_npu-2.1.0.post12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
pip install torch_npu-2.1.0.post12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
# apex for Ascend 需要自行参考 https://gitee.com/ascend/apex 完成whl包的构建,再通过如下指令完成安装
pip install apex-*.whl
拉取代码仓并完成安装:
# 设置环境变量
source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/nnal/atb/set_env.sh
# 安装MindSpeed加速库
git clone https://gitee.com/ascend/MindSpeed.git
cd MindSpeed
git checkout master # 以install_guide.md中的版本为准,此处仅做参考
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 # 以install_guide.md中的版本为准,此处仅做参考
cp -r megatron ../MindSpeed-LLM/
cd ../MindSpeed-LLM
git checkout master # 以install_guide.md中的版本为准,此处仅做参考
pip install -r requirements.txt # 安装其余依赖库
请参考MindSpore仓“版本配套表”,安装指定版本。
参考MindSpore官方安装指导,根据系统类型、CANN版本及Python版本选择匹配的对应的安装命令进行安装,安装前请确保网络畅通。或执行以下命令安装:
pip install mindspore==2.7.0 # 以docs/mindspore/readme.md中的版本为准,此处仅做参考
# 拉取MindSpeed-Core-MS仓库
git clone https://gitee.com/ascend/MindSpeed-Core-MS.git -b r0.3.0
cd MindSpeed-Core-MS
pip install requirements.txt
source auto_convert_llm.sh
# 完成安装,返回LLM执行模型任务
cd MindSpeed-LLM
通过 wget 从HuggingFace下载模型文件。
# 创建一个目录存储huggingface文件
mkdir -p ./model_from_hf/qwen2.5-7b-hf
cd ./model_from_hf/qwen2.5-7b-hf
# wget获取权重文件
wget https://huggingface.co/Qwen/Qwen2.5-7B/tree/main/config.json
wget https://huggingface.co/Qwen/Qwen2.5-7B/tree/main/generation_config.json
wget https://huggingface.co/Qwen/Qwen2.5-7B/tree/main/merges.txt
wget https://huggingface.co/Qwen/Qwen2.5-7B/tree/main/model-00001-of-00004.safetensors
wget https://huggingface.co/Qwen/Qwen2.5-7B/tree/main/model-00002-of-00004.safetensors
wget https://huggingface.co/Qwen/Qwen2.5-7B/tree/main/model-00003-of-00004.safetensors
wget https://huggingface.co/Qwen/Qwen2.5-7B/tree/main/model-00004-of-00004.safetensors
wget https://huggingface.co/Qwen/Qwen2.5-7B/tree/main/model.safetensors.index.json
wget https://huggingface.co/Qwen/Qwen2.5-7B/tree/main/tokenizer.json
wget https://huggingface.co/Qwen/Qwen2.5-7B/tree/main/tokenizer_config.json
wget https://huggingface.co/Qwen/Qwen2.5-7B/tree/main/vocab.json
通过md5sum验证模型权重文件完整性
# 利用sha256sum计算 SHA256数值
# 打开文件明细可获取sha256值,https://huggingface.co/Qwen/Qwen2.5-7B/blob/main/model-00001-of-00004.safetensors
sha256sum model-00001-of-00004.safetensors
sha256sum model-00002-of-00004.safetensors
sha256sum model-00003-of-00004.safetensors
sha256sum model-00004-of-00004.safetensors
在这一阶段,我们将基于下载的HuggingFace(hf)原数据,完成权重转换、数据集预处理,启动模型预训练,包含步骤如下:
昇腾MindSpeed-LLM要求模型权重采用Megatron-LM格式,在这里我们将原始HuggingFace权重格式转换为Megatron-Mcore格式。 详见hf2mg权重转换
使用官方提供的转换脚本,获取对应切分的mg权重。
cd MindSpeed-LLM
# 请先根据如下指导完成脚本修改配置
bash examples/mcore/qwen25/ckpt_convert_qwen25_hf2mcore.sh
如下为调整后的hf2mcore权重转换示例脚本
source /usr/local/Ascend/ascend-toolkit/set_env.sh
python convert_ckpt.py \
--use-mcore-models \
--model-type GPT \
--load-model-type hf \
--save-model-type mg \
--target-tensor-parallel-size 1 \ # 通过这里将切分调整为tp1pp4
--target-pipeline-parallel-size 4 \ #
--add-qkv-bias \
--load-dir ./model_from_hf/qwen2.5-7b-hf/ \
--save-dir ./model_weights/qwen2.5_mcore/ \
--tokenizer-model ./model_from_hf/qwen2.5-7b-hf/tokenizer.json \
--model-type-hf llama2 \
--params-dtype bf16
参数解析
参数 | 说明 | 必填 |
---|---|---|
--model-type GPT |
指定模型类型为GPT系列 | ✅ |
--use-mcore-models |
转换为Megatron-Mcore格式 | ✅ |
--target-tensor-parallel-size 1 |
张量并行度设置(建议配置1) | ✅ |
--target-pipeline-parallel-size 4 |
流水线并行度设置(建议保持4) | ✅ |
--tokenizer-model |
指定分词器路径 | ✅ |
--load-model-type |
加载权重的类别(可以是hf、mg) | ✅ |
--save-model-type |
存储权重的类别(可以是hf、mg) | ✅ |
--load-dir |
权重文件加载路径 | ✅ |
--save-dir |
权重文件保存路径 | ✅ |
--model-type-hf |
huggingface模型类别,默认为llama2 | |
--params-dtype |
指定权重转换后的权重精度模式,默认为fp16,如果源文件格式为bf16,则需要设置为bf16 | ✅ |
通过对各种格式的数据做提前预处理,避免原始数据的反复处理加载,将所有的数据都统一存储到为.bin和.idx两个文件中,详见预训练数据处理
常用的预训练数据集包括alpaca、enwiki、c4等,链接中提供了数据集下载地址。
如下以alpaca数据集为例,进行预训练数据集示例。
# 根据链接提供地址,通过wget获取数据集元数据
mkdir dataset
cd dataset/
wget https://huggingface.co/datasets/tatsu-lab/alpaca/blob/main/data/train-00000-of-00001-a09b74b3ef9c3b56.parquet
cd ..
# 使用仓库提供的数据处理脚本,获取预训练数据集。
# 请根据如下指导完成脚本修改配置
bash examples/mcore/qwen25/data_convert_qwen25_pretrain.sh
data_convert_qwen25_pretrain.sh中的配置需做如下修改:
# 请按照您的真实环境修改 set_env.sh 路径
source /usr/local/Ascend/ascend-toolkit/set_env.sh
python ./preprocess_data.py \
--input ./dataset/train-00000-of-00001-a09b74b3ef9c3b56.parquet \
--tokenizer-name-or-path ./model_from_hf/qwen2.5-7b-hf/ \ # 注意此处路径是否一致
--output-prefix ./dataset/alpaca \ # 预训练数据集会生成alpaca_text_document.bin和.idx
--tokenizer-type PretrainedFromHF \
--workers 4 \
--log-interval 1000
参数解析
参数 | 说明 | 必填 |
---|---|---|
--input |
支持输入数据集目录或文件,目录则处理全部文件, 支持.parquet、.csv、.json、.jsonl、.txt、.arrow格式,同一目录要求数据格式保持一致 | ✅ |
--tokenizer-type |
说明使用tokenizer类别,参数值为PretrainedFromHF时,词表路径填写模型目录即可 | ✅ |
--tokenizer-name-or-path |
配合tokenizer-type,目标模型的tokenizer原数据文件夹,用于数据集的转换 | |
--tokenizer-model |
配合指定分词器模型的路径,路径具体到tokenizer.model文件 | |
--output-prefix |
转换后输出的数据集文件的文件名前缀 | ✅ |
--workers |
多进程数据集处理 | ✅ |
完成了数据集处理和权重转换之后,可以开始拉起预训练任务。
# 打开示例脚本
vi examples/mcore/qwen25/pretrain_qwen25_7b_32k_ptd.sh
# 单机配置如下
NPUS_PER_NODE=8 # 使用单节点的8卡NPU
MASTER_ADDR=locahost # 以本节点ip地址为master_ip
MASTER_PORT=6000 # 本节点端口号为6000
NNODES=1 # 单机,即一台节点,多机即多节点
NODE_RANK=0 # 单机RANK为0,多机为(0,NNODES-1),不同节点不可重复
WORLD_SIZE=$(($GPUS_PER_NODE * $NNODES))
# 根据实际情况配置权重保存、权重加载、词表、数据集路径
CKPT_LOAD_DIR="./model_weights/qwen2.5_mcore/" # 权重加载路径,填入权重转换时保存的权重路径
CKPT_SAVE_DIR="./ckpt/qwen25-7b" # 训练完成后的权重保存路径
DATA_PATH="./dataset/alpaca_text_document" # 数据集路径,填入数据预处理时保存的数据路径,注意需要添加后缀
TOKENIZER_PATH="./model_from_hf/qwen2.5-7b-hf/" # 词表路径,填入下载的开源权重词表路径
TP=1 # 权重转换设置--target-tensor-parallel-size 1,修改为1
PP=4 # 权重转换设置--target-pipeline-parallel-size 4,修改为4,与权重转换时一致
SEQ_LEN=4096 # 修改seq_length为4096
MBS=1 # 设置micro-batch-size为1
GBS=64 # 设置global-batch-size为64
# 完成如上修改后保存关闭脚本
# 初始化环境变量
source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/nnal/atb/set_env.sh
# 启动预训练脚本
bash examples/mcore/qwen25/pretrain_qwen25_7b_32k_ptd.sh
脚本中特性包含训练参数也包含优化特性,如下部分参数解释
参数名 | 说明 |
---|---|
--use-mcore-models |
使用mcore分支运行模型 |
--disable-bias-linear |
去掉linear的偏移值,与qwen原模型一致 |
--add-qkv-bias |
增加Q、K、V的偏移值,是权重的组成部分 |
--group-query-attention |
开启GQA注意力处理机制 |
--num-query-groups 4 |
配合GQA使用,设置groups为4 |
--position-embedding-type rope |
位置编码采用rope方案 |
--untie-embeddings-and-output-weights |
根据原模型要求将output层和embedding层的权重解耦 |
--bf16 |
昇腾芯片对BF16精度支持良好,可显著提升训练速度 |
如果需要启动多机预训练任务,那么在单机预训练脚本的基础上,做如下修改,
# vi examples/mcore/qwen25/pretrain_qwen25_7b_32k_ptd.sh 打开示例脚本
# 单机配置如下
NPUS_PER_NODE=8 # 同单机
MASTER_ADDR=${master_ip} # 参与多机训练的节点都配置为master_ip
MASTER_PORT=6000 # 本节点端口号为6000
NNODES=1 # 根据参与节点数量配置
NODE_RANK=0 # 多机为(0,NNODES-1),不同节点不可重复,master_node rank为0,其ip为master_ip
WORLD_SIZE=$(($GPUS_PER_NODE * $NNODES))
# 参与节点都要有如下数据
CKPT_LOAD_DIR="./model_weights/qwen2.5_mcore/"
CKPT_SAVE_DIR="./ckpt/qwen25-7b"
DATA_PATH="./dataset/alpaca_text_document"
TOKENIZER_PATH="./model_from_hf/qwen2.5-7b-hf/"
注意:
--no-shared-storage
参数,设置此参数之后将会根据布式参数判断非主节点是否需要load数据,并检查相应缓存和生成数据在这一阶段,我们将基于下载的HuggingFace(hf)原数据,完成权重转换、数据集预处理,启动模型预训练,包含步骤如下:
昇腾MindSpeed-LLM要求模型权重采用Megatron-LM格式,在这里我们将原始HuggingFace权重格式转换为Megatron-Mcore格式。 详见hf2mg权重转换
使用官方提供的转换脚本,获取对应切分的mg权重。
cd MindSpeed-LLM
# 请先根据如下指导完成脚本修改配置
bash examples/mindspore/qwen25/ckpt_convert_qwen25_hf2mcore.sh
如下为调整后的hf2mcore权重转换示例脚本
source /usr/local/Ascend/ascend-toolkit/set_env.sh
python convert_ckpt.py \
--use-mcore-models \
--model-type GPT \
--load-model-type hf \
--save-model-type mg \
--target-tensor-parallel-size 1 \ # 通过这里将切分调整为tp1pp4
--target-pipeline-parallel-size 4 \ #
--add-qkv-bias \
--load-dir ./model_from_hf/qwen2.5-7b-hf/ \
--save-dir ./model_weights/qwen2.5_mcore/ \
--tokenizer-model ./model_from_hf/qwen2.5-7b-hf/tokenizer.json \
--model-type-hf llama2 \
--params-dtype bf16
参数解析
参数 | 说明 | 必填 |
---|---|---|
--model-type GPT |
指定模型类型为GPT系列 | ✅ |
--use-mcore-models |
转换为Megatron-Mcore格式 | ✅ |
--target-tensor-parallel-size 1 |
张量并行度设置(建议配置1) | ✅ |
--target-pipeline-parallel-size 4 |
流水线并行度设置(建议保持4) | ✅ |
--tokenizer-model |
指定分词器路径 | ✅ |
--load-model-type |
加载权重的类别(可以是hf、mg) | ✅ |
--save-model-type |
存储权重的类别(可以是hf、mg) | ✅ |
--load-dir |
权重文件加载路径 | ✅ |
--save-dir |
权重文件保存路径 | ✅ |
--model-type-hf |
huggingface模型类别,默认为llama2 | |
--params-dtype |
指定权重转换后的权重精度模式,默认为fp16,如果源文件格式为bf16,则需要设置为bf16 | ✅ |
注意
convert_ckpt.py
,在包导入时加入如下代码设置CPU侧执行权重转换:import mindspore as ms
ms.set_context(device_target="CPU", pynative_synchronize=True)
import torch
torch.configs.set_pyboost(False)
通过对各种格式的数据做提前预处理,避免原始数据的反复处理加载,将所有的数据都统一存储到为.bin和.idx两个文件中,详见预训练数据处理。
常用的预训练数据集包括alpaca、enwiki、c4等,链接中提供了数据集下载地址。
如下以alpaca数据集为例,进行预训练数据集示例。
# 根据链接提供地址,通过wget获取数据集元数据
mkdir dataset
cd dataset/
wget https://huggingface.co/datasets/tatsu-lab/alpaca/blob/main/data/train-00000-of-00001-a09b74b3ef9c3b56.parquet
cd ..
# 使用仓库提供的数据处理脚本,获取预训练数据集。
# 请根据如下指导完成脚本修改配置
bash examples/mindspore/qwen25/data_convert_qwen25_pretrain.sh
data_convert_qwen25_pretrain.sh中的配置需做如下修改:
# 请按照您的真实环境修改 set_env.sh 路径
source /usr/local/Ascend/ascend-toolkit/set_env.sh
python ./preprocess_data.py \
--input ./dataset/train-00000-of-00001-a09b74b3ef9c3b56.parquet \
--tokenizer-name-or-path ./model_from_hf/qwen2.5-7b-hf/ \ # 注意此处路径是否一致
--output-prefix ./dataset/alpaca \ # 预训练数据集会生成alpaca_text_document.bin和.idx
--tokenizer-type PretrainedFromHF \
--workers 4 \
--log-interval 1000
参数解析
参数 | 说明 | 必填 |
---|---|---|
--input |
支持输入数据集目录或文件,目录则处理全部文件, 支持.parquet、.csv、.json、.jsonl、.txt、.arrow格式,同一目录要求数据格式保持一致 | ✅ |
--tokenizer-type |
说明使用tokenizer类别,参数值为PretrainedFromHF时,词表路径填写模型目录即可 | ✅ |
--tokenizer-name-or-path |
配合tokenizer-type,目标模型的tokenizer原数据文件夹,用于数据集的转换 | |
--tokenizer-model |
配合指定分词器模型的路径,路径具体到tokenizer.model文件 | |
--output-prefix |
转换后输出的数据集文件的文件名前缀 | ✅ |
--workers |
多进程数据集处理 | ✅ |
完成了数据集处理和权重转换之后,可以开始拉起预训练任务。
# 打开示例脚本
vi examples/mindspore/qwen25/pretrain_qwen25_7b_32k_ms.sh
# 单机配置如下
NPUS_PER_NODE=8 # 使用单节点的8卡NPU
MASTER_ADDR=locahost # 以本节点ip地址为master_ip
MASTER_PORT=6000 # 本节点端口号为6000
NNODES=1 # 单机,即一台节点,多机即多节点
NODE_RANK=0 # 单机RANK为0,多机为(0,NNODES-1),不同节点不可重复
WORLD_SIZE=$(($GPUS_PER_NODE * $NNODES))
# 根据实际情况配置权重保存、权重加载、词表、数据集路径
CKPT_LOAD_DIR="./model_weights/qwen2.5_mcore/" # 权重加载路径,填入权重转换时保存的权重路径
CKPT_SAVE_DIR="./ckpt/qwen25-7b" # 训练完成后的权重保存路径
DATA_PATH="./dataset/alpaca_text_document" # 数据集路径,填入数据预处理时保存的数据路径,注意需要添加后缀
TOKENIZER_PATH="./model_from_hf/qwen2.5-7b-hf/" # 词表路径,填入下载的开源权重词表路径
TP=1 # 权重转换设置--target-tensor-parallel-size 1,修改为1
PP=4 # 权重转换设置--target-pipeline-parallel-size 4,修改为4,与权重转换时一致
SEQ_LEN=4096 # 修改seq_length为4096
MBS=1 # 设置micro-batch-size为1
GBS=64 # 设置global-batch-size为64
# 完成如上修改后保存关闭脚本
# 初始化环境变量
source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/nnal/atb/set_env.sh cxx_abi=0
# 启动预训练脚本
bash examples/mindspore/qwen25/pretrain_qwen25_7b_32k_ms.sh
脚本中特性包含训练参数也包含优化特性,如下部分参数解释
参数名 | 说明 |
---|---|
--use-mcore-models |
使用mcore分支运行模型 |
--disable-bias-linear |
去掉linear的偏移值,与qwen原模型一致 |
--add-qkv-bias |
增加Q、K、V的偏移值,是权重的组成部分 |
--group-query-attention |
开启GQA注意力处理机制 |
--num-query-groups 4 |
配合GQA使用,设置groups为4 |
--position-embedding-type rope |
位置编码采用rope方案 |
--untie-embeddings-and-output-weights |
根据原模型要求将output层和embedding层的权重解耦 |
--bf16 |
昇腾芯片对BF16精度支持良好,可显著提升训练速度 |
如果需要启动多机预训练任务,那么在单机预训练脚本的基础上,做如下修改,
# vi examples/mindspore/qwen25/pretrain_qwen25_7b_32k_ms.sh 打开示例脚本
# 单机配置如下
NPUS_PER_NODE=8 # 同单机
MASTER_ADDR=${master_ip} # 参与多机训练的节点都配置为master_ip
MASTER_PORT=6000 # 本节点端口号为6000
NNODES=1 # 根据参与节点数量配置
NODE_RANK=0 # 多机为(0,NNODES-1),不同节点不可重复,master_node rank为0,其ip为master_ip
WORLD_SIZE=$(($GPUS_PER_NODE * $NNODES))
# 参与节点都要有如下数据
CKPT_LOAD_DIR="./model_weights/qwen2.5_mcore/"
CKPT_SAVE_DIR="./ckpt/qwen25-7b"
DATA_PATH="./dataset/alpaca_text_document"
TOKENIZER_PATH="./model_from_hf/qwen2.5-7b-hf/"
注意:
--no-shared-storage
参数,设置此参数之后将会根据布式参数判断非主节点是否需要load数据,并检查相应缓存和生成数据CKPT_LOAD_DIR
是否指向正确的权重转换后路径,确认文件夹内包含.ckpt
或.bin
文件。问题2:显示数据集加载out of range?
→ 微调脚本,没有读取到数据集,请检查DATA_PATH是否符合上面示例的规范。
问题3:训练脚本拉起失败?
→ 检查有无source,检查是否有进程残留,未清理干净。
问题4:没有生成运行日志文件?
→ 需要自行创建logs文件夹。
model_cfg.json
扩展自定义模型通过本教程,您已掌握昇腾生态的基础技能,能够正常使用仓库的模型预训练功能。下一步,不妨尝试更深入理解脚本特性和仓库。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。