大模型训练

MindFormers

  MindSpore Transformers套件的目标是构建一个大模型训练、微调、评估、推理、部署的全流程开发套件: 提供业内主流的Transformer类预训练模型和SOTA下游任务应用,涵盖丰富的并行特性。期望帮助用户轻松的实现大模型训练和创新研发。

  MindSpore Transformers套件基于MindSpore内置的并行技术和组件化设计,具备如下特点: 一行代码实现从单卡到大规模集群训练的无缝切换;

  • 提供灵活易用的个性化并行配置;

  • 能够自动进行拓扑感知,高效地融合数据并行和模型并行策略;

  • 一键启动任意任务的单卡/多卡训练、微调、评估、推理流程;

  • 支持用户进行组件化配置任意模块,如优化器、学习策略、网络组装等;

  • 提供Trainer、pipeline、AutoClass等高阶易用性接口;

  • 提供预置SOTA权重自动下载及加载功能;

  • 支持人工智能计算中心无缝迁移部署;

  当前支持的模型列表查询,每个模型均有单独的使用说明。

支持模型列表

1.基础准备

2.套件安装

  • 安装脚本获取

  • chmod +x mindformers.sh使脚本可执行

  • bash mindformers.sh  一键安装

3.单机多卡

3.1 数据预处理

1.1 Wikitext-103 数据预处理

执行如下命令,生成Mindrecord格式数据集

python research/qwen1_5/qwen1_5_preprocess.py \
 --dataset_type 'wiki' \
 --input_glob /{数据集路径}/wiki.train.tokens \
 --vocab_file /{权重文件路径}/Qwen1.5-7B/vocab.json \
 --merges_file /{权重文件路径}/Qwen1.5-7B/merges.txt \
 --seq_length 32768 \
 --output_file /{预处理后数据集输出路径}/wiki.mindrecord
  • dataset_type: 预处理数据类型

  • input_glob: 输入下载后wiki.train.tokens的文件路径

  • vocab_file: vocab.json文件路径(huggingface权重文件中)

  • merges_file: merges.txt文件路径(huggingface权重文件中)

  • seq_length: 输出数据的序列长度

  • output_file: 输出文件的保存路径

1.2 alpaca 数据预处理

首先执行如下命令,将原始数据集转换为指定格式

python research/qwen1_5/alpaca_converter.py \
 --data_path /{数据集路径}/alpaca_data.json \
 --output_path /{转换格式后数据集输出路径}/alpaca-data-messages.json
  • data_path:输入下载的文件路径

  • output_path:输出文件的保存路径

得到转换格式的数据集后执行如下命令,进行数据预处理和Mindrecord数据生成

python research/qwen1_5/qwen1_5_preprocess.py \
 --dataset_type 'qa' \
 --input_glob /{转换格式后数据集输出路径}/alpaca-data-messages.json \
 --vocab_file /{权重文件路径}/Qwen1.5-7B/vocab.json \
 --merges_file /{权重文件路径}/Qwen1.5-7B/merges.txt \
 --seq_length 4096 \
 --output_file /{预处理后数据集输出路径}/alpaca-messages.mindrecord

3.2 权重转换

: 请安装convert_weight.py依赖包。

pip install torch transformers>=4.37.2 transformers_stream_generator einops accelerate
3.2.1 torch权重转mindspore权重

将huggingface的权重转换为完整的ckpt权重。

python research/qwen1_5/convert_weight.py \
--torch_ckpt_dir /{权重文件路径}/Qwen1.5-7B \
--mindspore_ckpt_path /{权重转换输出路径}/qwen1.5_7b.ckpt
  • torch_ckpt_dir:预训练权重文件所在的目录, 此参数必须

  • mindspore_ckpt_path:转换后的输出文件存放路径

如遇报错:ImportError: {报错文件路径}: cannot allocate memory in static TLS block,使用LD_PRELOAD环境变量指定对报错的单个或多个库文件进行优先加载:执行Export LD_PRELOAD=$LD_PRELOAD:{报错文件路径}

报错详情参考

3.2.2 mindspore权重转torch权重

在生成mindspore权重之后如需使用torch运行,可根据如下命令转换:

python research/qwen1_5/convert_reversed.py \
--mindspore_ckpt_path /{mindspore权重路径}/qwen1.5_7b.ckpt \
--torch_ckpt_path /{权重转换输出路径}/your.bin
  • mindspore_ckpt_path:待转换的mindspore权重路径

  • torch_ckpt_path:转换后的输出文件存放路径

3.3 预训练

qwen1_5-7b单机8卡预训练任务为例,执行分布式启动脚本

requirements.txt以外额外需要安装的依赖库

pip install decorator attrs sympy
pip install mindspore==2.3.0

启动预训练

bash scripts/msrun_launcher.sh "run_mindformer.py \
 --config research/qwen1_5/pretrain_qwen1_5_7b.yaml \
 --load_checkpoint /{mindspore权重路径}/qwen1.5_7b.ckpt \ 
 --train_dataset_dir /{预处理后数据集输出路径}/wiki.mindrecord \
 --run_mode train" 8

3.4 全参微调

设置如下环境变量:

export MS_ASCEND_CHECK_OVERFLOW_MODE=INFNAN_MODE
# 如出现OOM需要配置:
export ENABLE_CELL_RESUSE=1          # 打开内存复用
export MS_GE_ATOMIC_CLEAN_POLICY=1   # 打开内存优化

启动微调任务

bash scripts/msrun_launcher.sh "research/qwen1_5/run_qwen1_5.py \
 --config research/qwen1_5/finetune_qwen1_5_7b.yaml \
 --load_checkpoint /{mindspore权重路径}/qwen1.5_7b.ckpt \  用的是上面torch转mindspore的权重
 --auto_trans_ckpt True \  是否开启自动在线权重切分或转换
 --train_dataset /path/alpaca.mindrecord \
 --run_mode finetune" 8

参数详细说明

多机多卡分布式训练

先把代码目录、预处理数据、ckpt权重转换文件上传到obs桶里

obs桶操作如下:

./obsutil config -i=ak -k=sk -e=endpoint使用永久AK、SK进行初始化配置

./obsutil/obsutil  cp 桶里被复制文件路径 目标文件夹路径  -r -f 复制桶里的文件到目标路径,如果是复制文件夹,后面加-r -f,此命令可以通过对调目录把在notebook里的文件夹上传到obs

modelArts上创建多机训练作业

输入图片说明输入图片说明

参数说明

config: 配置文件路径
run_mode: 运行模式, 预训练时设置为train
train_data: 训练数据集文件夹路径
merges_file: 词表文件merges.txt路径
vocab_file: 词表文件vocab.json路径

auto_trans_ckpt设成true会根据当前pp/mp/dp自动切分,生成strategy和transformed_checkpoint两个文件夹,将这两个文件夹重新保存到其他目录。

参考文档链接

MindFormers

模型权重切分与合并

Issues

MindSpeed-LLM

1.MindSpeed-LLM简介

  MindSpeed-LLM,原仓名ModelLink,作为昇腾大模型训练框架,旨在为华为 昇腾芯片 提供端到端的大语言模型训练方案, 包含分布式预训练、分布式指令微调、分布式偏好对齐以及对应的开发工具链。

注 : 原包名 modellink 更改为 mindspeed_llm

MindSpeed-LLM简介官方链接

2.镜像准备

从下面网址里获取最新镜像链接并且注册: 镜像地址

镜像注册指导:镜像注册

3.套件安装

安装mindspeedllm:

从下面网址里获取最新安装脚本: 脚本地址

进入镜像,执行安装脚本:bash modellink.sh

debug参考:

debug参考

4.准备数据集

下载数据集

数据集准备示例

转换数据集

cd /home/ma-user/work/MindSpeed-LLM
python preprocess_data.py \
	--input /home/ma-user/work/MindSpeed-LLM/dataset/Alpaca_train.json \
	--tokenizer-name-or-path /home/ma-user/work/Qwen2.5-14B/ \
	--output-prefix ./dataset/alpaca/ \
    --handler-name GeneralInstructionHandler \
	--tokenizer-type PretrainedFromHF \
	--workers 4 \
	--log-interval 1000 \

5.将权重从 huggingface 格式转化为 megatron 格式

cd /home/ma-user/work/MindSpeed-LLM
python tools/checkpoint/convert_ckpt.py \
    --model-type GPT \
    --loader llama2_hf \
    --saver megatron \
    --target-tensor-parallel-size 2 \
    --target-pipeline-parallel-size 2 \
    --make-vocab-size-divisible-by 16 \
    --load-dir /home/ma-user/work/Qwen2.5-14B/ \
    --save-dir ./model_weights/Qwen2.5-14B-tp2-pp2/ \
    --tokenizer-model /home/ma-user/work/Qwen2.5-14B/tokenizer.json \
    --add-qkv-bias \
    --params-dtype bf16 

6.开启训练(8卡)

修改训练脚本/home/ma-user/work/MindSpeed-LLM/examples/qwen15/pretrain_qwen15_14b_ptd.sh:

export MEMORY_FRAGMENTATION=1;export MULTI_STREAM_ME=1;export PYTORCH_NPU_ALLOC_CONF="expandable_segments:False,max_split_size_mb:21"; 

CKPT_LOAD_DIR="/home/ma-user/work/MindSpeed-LLM/model_weights/Qwen2.5-14B-v0.1-tp2-pp2"
CKPT_SAVE_DIR="/home/ma-user/work/MindSpeed-LLM/model_weights/qwen_trained_ckpts"
DATA_PATH="/home/ma-user/work/MindSpeed-LLM/finetune_dataset/alpaca/"
TOKENIZER_PATH="/home/ma-user/work/Qwen2.5-14B"

GPT_ARGS="
    --tensor-model-parallel-size ${TP} \
    --pipeline-model-parallel-size ${PP} \
    --sequence-parallel \
    --ffn-hidden-size 13824 \
    --group-query-attention \
    --num-query-groups 8 \
    --rotary-base 1000000 \
    --norm-epsilon 1e-5 \
    --num-layers 48 \
    --hidden-size 5120 \
    --transformer-impl local \
    --num-attention-heads 40 \
    --load ${CKPT_LOAD_DIR} \
    --tokenizer-type PretrainedFromHF \
    --tokenizer-name-or-path ${TOKENIZER_PATH} \
    --seq-length 1024 \
    --max-position-embeddings 131072 \
    --micro-batch-size 1 \
    --global-batch-size 32 \
    --make-vocab-size-divisible-by 1 \
    --padded-vocab-size 152064 \
    --rotary-base 1000000 \
    --lr 1.25e-6 \
    --train-iters 5000 \
    --lr-decay-style cosine \
    --untie-embeddings-and-output-weights \
    --disable-bias-linear \
    --attention-dropout 0.0 \
    --init-method-std 0.01 \
    --hidden-dropout 0.0 \
    --position-embedding-type rope \
    --normalization RMSNorm \
    --swiglu \
    --use-flash-attn \
    --use-fused-rmsnorm \
    --use-fused-rotary-pos-emb \
    --use-rotary-position-embeddings \
    --use-fused-swiglu \
    --use-mc2 \
    --no-masked-softmax-fusion \
    --attention-softmax-in-fp32 \
    --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 \
    --add-qkv-bias \
    --initial-loss-scale 4096 \
    --no-gradient-accumulation-fusion \
    --no-load-optim \
    --no-load-rng \
    --seed 42 \
    --bf16 \
    --load ${CKPT_LOAD_DIR} \
    --finetune \
    --is-instruction-dataset \
    --tokenizer-not-use-fast \
    --use-distributed-optimizer 
"

参数解释

  • --load ${CKPT_LOAD_DIR}

    • 解释: 从指定的目录 (${CKPT_LOAD_DIR}) 加载预训练模型或检查点 (checkpoint)。

    • 用途: 通常用于在训练或推理过程中加载已经训练好的模型权重,以便继续训练或进行推理。

  • --finetune

    • 解释: 启用微调 (fine-tuning) 模式。

    • 用途: 在微调模式下,模型会基于预训练的权重进行进一步的训练,通常用于特定任务的适应性调整。

  • --is-instruction-dataset

    • 解释: 指示数据集是基于指令的 (instruction-based)。

    • 用途: 用于指定数据集的类型,通常在处理需要遵循特定指令的任务时使用,例如自然语言理解或生成任务。

  • --tokenizer-not-use-fast

    • 解释: 禁用快速分词器 (fast tokenizer)。

    • 用途: 默认情况下,许多模型使用快速分词器以提高效率,但在某些情况下可能需要使用原始的分词器实现。

  • --use-distributed-optimizer

    • 解释: 启用分布式优化器。

    • 用途: 在分布式训练环境中使用,优化器会在多个设备或节点之间协同工作,以提高训练效率和性能。 额外的,添加显存优化相关环境变量:

环境变量和配置解释

  • export MEMORY_FRAGMENTATION=1

    • 解释: 启用内存碎片化检测或优化。

    • 用途: 该变量可能用于调试或优化内存分配,特别是在需要检测或减少内存碎片化的情况下。值为 1 表示启用相关功能。

  • export MULTI_STREAM_ME=1

    • 解释: 启用多流内存分配或管理。

    • 用途: 该变量可能用于支持多流处理或并行计算的内存管理。值为 1 表示启用多流内存分配功能。

  • export PYTORCH_NPU_ALLOC_CONF="expandable_segments:False,max_split_size_mb:21"

    • 解释: 配置 PyTorch NPU 内存分配策略。

    • 用途:

      • expandable_segments:False: 不允许内存段动态扩展。

      • max_split_size_mb:21: 设置内存分配时的最大分割大小为 21 MB,用于控制内存分配的粒度。

    • 场景: 这些配置通常用于优化 PyTorch 在 NPU(如华为 Ascend NPU)上的内存分配策略,以提高性能或避免内存不足的问题。

训练命令:

bash /home/ma-user/work/MindSpeed-LLM/examples/qwen15/train_qwen25_14b.sh

7.转回HF权重(8卡)

转回HF权重

必须输出在原HF的路径下

python tools/checkpoint/convert_ckpt.py \
    --model-type GPT \
    --loader megatron \
    --saver megatron \
    --save-model-type save_huggingface_llama \
    --load-dir /home/ma-user/work/MindSpeed-LLM/model_weights/Qwen2.5-14B-v0.1-tp2-pp2/qwen_trained_ckpts \
    --target-tensor-parallel-size 1 \
    --target-pipeline-parallel-size 1 \
    --add-qkv-bias \
    --save-dir /home/ma-user/work/Qwen2.5-14B/     ## <-- 需要填入原始HF模型路径,新权重会存于./model_from_hf/qwen15-4b-hf/mg2hg/

参考链接:

多机流程

MindSpeedLLM多机流程


1️.获取镜像

image_train_job.png

镜像地址:

swr.cn-east-292.mygaoxinai.com/qwenj/pytorch2_1-cann8_rc3-py39:base

image_train_job-2.png


2️.创建 Notebook

image_train_job-3.png


3️.数据获取

  • 单机获取文件:
    使用 Ctrl+C 复制后,粘贴到本地桌面 (Ctrl+V)。

  • Linux命令工具 Obsutil:
    Obsutil 是用于与云存储服务交互的命令行工具。 点击下面链接下载:

obsutil下载

配置登录:

./obsutil config -i=${OBSAK} -k=${OBSSK} -e=obs.cn-east-292.mygaoxinai.com

数据获取命令:

## 下载单个文件
./obsutil cp source_file target_file

## 同步文件夹
./obsutil sync source_folder target_folder

## 获取代码库
./obsutil sync obs://modellink-cloud/AscendSpeed/ ./AscendSpeed

4️.数据上传 ⬆

创建桶:

image_train_job-4.png

上传命令:

## 假设桶名为 work,代码路径为 ~/work/AscendSpeed,模型路径为 ~/work/models
./obsutil sync ~/work/AscendSpeed obs://work/AscendSpeed
./obsutil sync ~/work/models obs://work/models

5️.保存镜像

image_train_job-5.png

image_train_job-6.png


6️.创建训练作业

image_train_job-7.png

启动命令:

cd /home/ma-user/modelarts/user-job-dir/AscendSpeed
sh ./scripts/install.sh
sh ./scripts/obs_pipeline2.sh

image_train_job-8.png

输入变量名:

ORIGINAL_TRAIN_DATA_PATH=
ORIGINAL_HF_WEIGHT=

输出变量名:

OUTPUT_SAVE_DIR=
HF_SAVE_DIR=

image_train_job-9.png


模型命名规则:

  • 微调 千问14B, 则模型名为:

qwen-14b
  • 微调 千问2.5 14B, 则模型名为:

qwen2-14b

训练配置参数示例:

image_train_job-10.png

Megatron训练参数解释

以下是常用的 Megatron-LM 训练参数及其含义解析:


参数说明

参数名 含义 示例值
CP 检查点 (Checkpoint) 数: 指训练过程中保存的模型分片数量。 1
DATA_TYPE 数据处理类型: 指定输入数据的处理逻辑或预处理模块。 GeneralInstructionHandler
EPOCH 训练轮次 (Epoch): 数据集被完整遍历的次数。 1
GBS 全局批量大小 (Global Batch Size): 多机总的 batch size(所有设备上累加)。 64
LR 初始学习率 (Learning Rate): 优化器的学习率初始值。 1.25e-6
MAX_PE 最大位置编码 (Max Position Encoding): 序列的最大长度,通常等于 SEQ_LEN 4096
MBS 微批量大小 (Micro Batch Size): 每张卡上的局部 batch size,GBS = MBS × 卡数 × 梯度累积步数 1
MIN_LR 最小学习率 (Minimum Learning Rate): 学习率的下限值,用于学习率调度器。 1.25e-7
MODEL_NAME 模型名称: 训练生成的模型名称,用于保存或管理模型文件。 yi-34b
MOUNT 挂载类型 (Mount Type): 数据存储类型,通常是对象存储(如 OBS 或其他存储服务)。 OBS
TRAIN_ITERS 训练迭代次数: 总的训练步数,等于 EPOCH × 数据集大小 / GBS 1400
RUN_TYPE 运行模式: 例如 sft 表示微调,pretrain 表示预训练。 sft
SAVE_INTERVAL 保存间隔 (Save Interval): 每隔多少步保存一次模型权重。 1400
SEED 随机种子 (Seed): 用于随机数生成器的初始化,确保训练的可重复性。 1234
SEQ_LEN 序列长度 (Sequence Length): 训练数据的最大 token 长度。 4096
SN 模型隐藏层维度 (Hidden Size): 通常表示 Transformer 模型的隐层维度(如 SN=5120 表示 5120 维)。 5120
TP 张量并行度 (Tensor Parallelism): 模型张量分解的并行数,通常用于跨设备分解计算。 8
PP 流水线并行度 (Pipeline Parallelism): 模型分层的并行数量,用于流水线并行。 2

公式与关系

  1. 全局批量大小 (GBS) 公式:
    $\( \[ GBS = MBS \times \text{卡数} \times \text{梯度累积步数} \] \)$

  2. 并行设置规则:
    $\( \[ TP \times DP \times CP = \text{总卡数} \] \)$ 其中:

    • TP: 张量并行 (Tensor Parallelism)

    • DP: 数据并行 (Data Parallelism)

    • CP: 检查点并行 (Checkpoint Parallelism)

  3. 总训练步数计算: $\( \[ \text{训练迭代数 (Train Iters)} = \frac{\text{数据集大小}}{\text{GBS}} \times \text{EPOCH} \] \)$


优化器与调度器相关参数

  • LRMIN_LR 一起决定了学习率的范围。

  • 学习率通常通过预设调度器(如 cosine decay)逐步衰减到 MIN_LR


示例配置

以下为实际的训练参数示例:

CP=1
DATA_TYPE=GeneralInstructionHandler
EPOCH=1
GBS=64
LR=1.25e-6
MAX_PE=4096
MBS=1
MIN_LR=1.25e-7
MODEL_NAME=yi-34b
MOUNT=OBS
TRAIN_ITERS=1400
RUN_TYPE=sft
SAVE_INTERVAL=1400
SEED=1234
SEQ_LEN=4096
SN=5120
TP=8
PP=2

并行设置规则:

image_train_job-11.png

TP * DP * CP = 总卡数

训练日志:

image_train_job-12.png