基于百舸平台进行Qwen-2.5-VL模型训练
AIAK-Training-LLM是百度智能云基于百度百舸·AI计算平台,面向大模型训练场景提供的最佳实践解决方案配套AI加速工具,帮助模型开发者高效完成大规模深度学习分布式训练,提升训练效率,相比开源 Megatron-LLM性能明显提升。关于AIAK-Training-LLM的使用说明,详见这里
针对于Qwen2.5vl模型,百度百舸团队基于自研大模型训练加速框架 AIAK-Training-LLM,在 SFT 阶段实现了多模态数据混合训练,并结合离线 Sequence Packing 技术,显著提升训练效率与资源利用率。
这里我们以Qwen2.5-VL-7B-Instruct模型单机训练混训为示例,介绍如何使用AIAK-Training-LLM在A800上进行训练,同时包含如何进行数据集离线预处理(Packing)功能。
资源准备
算力资源
使用AIAK加速训练Qwen2.5-VL-3B/7B/32B/72B-Instruct,请使用A800*8卡的节点
存储资源
为保证训练的性能,推荐使用并行文件存储PFS,以达到分布式加速训练效果。
开发机环境准备
创建开发机用于下载模型、数据集,并进行模型权重转换、数据集预处理等工作。
开发机创建:
在百度百舸.AI计算平台控制台,点击【开发机】-【创建实例】开始创建开发机并填写开发机配置信息:
-
基本信息
- 实例名称:输入您为开发机命名的名称,例如:VL-dev-test
- 资源池类型/资源池/队列:根据您的资源池类型选择已创建的资源池和队列
- 资源规格:预处理无需GPU资源,可以选择不使用加速芯片,同时最好保证内存资源不少于16GB以保证预处理脚本正常运行,此处推荐使用128核CPU与256GB以上内存保证预处理效率
-
环境配置
- 镜像地址:基于镜像地址【TBD】创建开发机
- 云磁盘:推荐预留100GiB保证开发机正常运行
- 启动命令:用于填写开发机启动自动运行命令,此处暂时留空
- 环境变量:一般用于配合启动命令使用,此处暂时留空
- 存储挂载:用于挂载云存储资源(PFS/BOS/CFS等),此处选择存储类型为PFS的资源,默认带出存储配置区,填写源路径与挂载路径,例如:源路径:/vl,挂载路径:/mnt/pfs/(后续相关存储路径与此高度相关)
-
访问配置&高级配置
- 可以使用默认配置,此处不做修改
完成后点击确定,即可完成开发机创建。
BOS工具验证:
在开发机中,已经预置了BOS下载工具,输入以下命令以验证下载工具是否安装:
1bcecmd
产生以下输出则为可用:
1usage: bcecmd [--help] [-configure ['''] [--debug] [--conf-path CONF-PATH] [-multiupload-infos-path MULTIUPLOAD-INFOS-PATH] [-version]
反之,执行以下命令(请确保在开发机环境下运行):
1wget https://doc.bce.baidu.com/bos-optimization/linux-bcecmd-0.5.9.zip #下载
2unzip linux-bcecmd-0.5.9.zip #解压
3ln linux-bcecmd-0.5.9/bcecmd /usr/sbin/ #设置为全局使用
模型&数据集准备
模型准备:
(1) 模型下载
本次VL 共支持四个模型,均已内置于BOS 中:
| 模型名称 | BOS 位置 |
|---|---|
| Qwen2.5-VL-3B-Instruct | bos:/aihc-models-bj/Qwen/Qwen2.5-VL-3B-Instruct/ |
| Qwen2.5-VL-7B-Instruct | bos:/aihc-models-bj/Qwen/Qwen2.5-VL-7B-Instruct/ |
| Qwen2.5-VL-32B-Instruct | bos:/aihc-models-bj/Qwen/Qwen2.5-VL-32B-Instruct/ |
| Qwen2.5-VL-72B-Instruct | bos:/aihc-models-bj/Qwen/Qwen2.5-VL-72B-Instruct/ |
BOS参考下载指令(此处的第二个参数参考开发机创建-环境配置-存储挂载-挂载路径):
1bcecmd bos sync bos:/aihc-models-bj/Qwen/Qwen2.5-VL-3B-Instruct/ /mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-3B-Instruct/
模型 BOS 地址:bos:/aibox-dev/Qwen2.5-VL-7B-Instruct/
1bcecmd bos sync bos:/aihc-models-bj/Qwen/Qwen2.5-VL-7B-Instruct/ /mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct/
模型 BOS 地址:bos:/aibox-dev/Qwen2.5-VL-32B-Instruct/
1bcecmd bos sync bos:/aihc-models-bj/Qwen/Qwen2.5-VL-32B-Instruct/ /mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-32B-Instruct/
模型 BOS 地址:bos:/aibox-dev/Qwen2.5-VL-72B-Instruct/
1bcecmd bos sync bos:/aihc-models-bj/Qwen/Qwen2.5-VL-72B-Instruct/ /mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-72B-Instruct/
(2) 模型CKPT预处理
进入开发机/workspace/AIAK-Training-LLM/examples/qwen2_5_vl/目录可以找到模型权重转换脚本,调整模型权重位置与数据集输入输出位置后即可运行(这里以 7B 模型为例):
1#! /bin/bash
2
3AIAK_TRAINING_PATH=${AIAK_TRAINING_PATH:-"/workspace/AIAK-Training-LLM"}
4AIAK_MAGATRON_PATH=${AIAK_MAGATRON_PATH:-"/workspace/AIAK-Magatron"}
5CONVERT_CHECKPOINT_PATH="$AIAK_TRAINING_PATH/tools/convert_checkpoint"
6
7LOAD=/mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct
8SAVE=/mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct/qwen2_5-vl-7b-tp1-pp1
9
10SAVE_LANGUAGE_MODEL=/mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct/aiak-training-llm/tmp/language-mcore
11SAVE_VISION_MODEL=/mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct/aiak-training-llm/tmp/vision-model-mcore
12SAVE_ADAPTER=/mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct/aiak-training-llm/tmp/adapter-mcore
13SAVE_PATCH=/mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct/aiak-training-llm/tmp/patch-mcore
14
15TP=1
16PP=1
17
18# qwen2
19python $CONVERT_CHECKPOINT_PATH/model.py \
20 --load_platform=huggingface \
21 --save_platform=mcore \
22 --common_config_path=$CONVERT_CHECKPOINT_PATH/config/qwen2_5-vl-7b/qwen2_5.json \
23 --tensor_model_parallel_size=$TP \
24 --pipeline_model_parallel_size=$PP \
25 --load_ckpt_path=$LOAD \
26 --save_ckpt_path=$SAVE_LANGUAGE_MODEL \
27 --safetensors \
28 --no_save_optim \
29 --no_load_optim
30
31# vit
32python $CONVERT_CHECKPOINT_PATH/model.py \
33 --load_platform=huggingface \
34 --save_platform=mcore \
35 --common_config_path=$CONVERT_CHECKPOINT_PATH/config/qwen2_5-vl-7b/vision-model.json \
36 --tensor_model_parallel_size=$TP \
37 --load_ckpt_path=$LOAD \
38 --save_ckpt_path=$SAVE_VISION_MODEL \
39 --safetensors \
40 --no_save_optim \
41 --no_load_optim
42
43# adapter
44python $CONVERT_CHECKPOINT_PATH/custom/qwen2_vl/adapter.py \
45 --load_platform=huggingface \
46 --save_platform=mcore \
47 --common_config_path=$CONVERT_CHECKPOINT_PATH/config/qwen2_5-vl-7b/adapter.json \
48 --tensor_model_parallel_size=$TP \
49 --load_ckpt_path=$LOAD \
50 --save_ckpt_path=$SAVE_ADAPTER
51
52# vision patch in vit
53python $CONVERT_CHECKPOINT_PATH/custom/qwen2_vl/vision_patch.py \
54 --load_platform=huggingface \
55 --save_platform=mcore \
56 --tensor_model_parallel_size=$TP \
57 --common_config_path=$CONVERT_CHECKPOINT_PATH/config/qwen2_5-vl-7b/vision-patch.json \
58 --load_ckpt_path=$LOAD \
59 --save_ckpt_path=$SAVE_PATCH
60
61# merge
62python $CONVERT_CHECKPOINT_PATH/custom/qwen2_vl/merge_megatron.py \
63 --megatron_path $AIAK_MAGATRON_PATH \
64 --language_model_path $SAVE_LANGUAGE_MODEL/release \
65 --vision_model_path $SAVE_VISION_MODEL/release \
66 --vision_patch $SAVE_PATCH/release \
67 --adapter_path $SAVE_ADAPTER/release \
68 --save_ckpt_path $SAVE/release \
69 --tensor_model_parallel_size $TP \
70 --pipeline_model_parallel_size $PP
71
72echo release > $SAVE/latest_checkpointed_iteration.txt
73rm -rf $SAVE_LANGUAGE_MODEL
74rm -rf $SAVE_VISION_MODEL
75rm -rf $SAVE_ADAPTER
76rm -rf $SAVE_PATCH
运行结束后显示INFO:root:Finished convert checkpoint huggingface -> mcore即为转换成功
(3) 模型CKPT结果
输出结果应在SAVE文件夹下应有一个release文件夹,一个latest_checkpointed_iteration.txt文本文档。
数据集准备:
(1) 预置数据集下载
百舸平台已经在对象存储BOS中预置相关数据集(energon加载器格式),您可以从对应地域的BOS路径中下载数据:
数据集 BOS 地址:bos:/aihc-rdw-bj/dataset/qwen2.5-vl-dataset/demo/
1bcecmd bos sync bos:/aihc-rdw-bj/dataset/qwen2.5-vl-dataset/demo/ /mnt/pfs/qwen-2-5-vl-dataset
数据集格式如下:
1pretrain-0.tar pretrain-1.tar.idx pretrain-3.tar pretrain-4.tar.idx pretrain-6.tar
2pretrain-0.tar.idx pretrain-2.tar pretrain-3.tar.idx pretrain-5.tar pretrain-6.tar.idx
3pretrain-1.tar pretrain-2.tar.idx pretrain-4.tar pretrain-5.tar.idx
(2) 数据集预处理(可选)
如果使用自己的数据集,满足格式数据集(包含问答对/图片/视频),需要先将数据集转换为energon 加载器格式:
1[
2 {
3 "messages": [
4 {
5 "content": "<image>Who are they?",
6 "role": "user"
7 },
8 {
9 "content": "They're Kane and Gretzka from Bayern Munich.",
10 "role": "assistant"
11 },
12 {
13 "content": "What are they doing?<image>",
14 "role": "user"
15 },
16 {
17 "content": "They are celebrating on the soccer field.",
18 "role": "assistant"
19 }
20 ],
21 "images": [
22 "mllm_demo_data/1.jpg",
23 "mllm_demo_data/2.jpg"
24 ]
25 },
26 ...
27 ]
使用/workspace/AIAK-Training-LLM/tools/data_preprocess/convert_to_webdataset.py进行格式转换:
1python /workspace/AIAK-Training-LLM/tools/data_preprocess/convert_to_webdataset.py \
2 --output_dir /mnt/pfs/dataset_demo/output \
3 --json_file /mnt/pfs/dataset_demo/mix.json \
4 --video_dir /mnt/pfs/dataset_demo/video \
5 --image_dir /mnt/pfs/dataset_demo/image \
6 --media mix \
7 --columns_messages messages \
8 --maxsize 10000000
--output_dir目录下的输出文件后续可直接作为训练用数据集。
(3) 数据Packing预处理(可选)
为提升混训效率,百度AIAK-Traing加速团队提供了离线数据集预处理方式,可以进一步提升后续训练效率。
1️⃣ 使用/workspace/AIAK-Training-LLM/examples/qwen2_5_vl/finetuning目录下的preprocess_data.sh脚本开始对数据集进行预处理:
1#! /bin/bash
2# The script needs to be run on at least 1 nodes.
3#export WORLD_SIZE=2
4#export RANK=0
5#export MASTER_ADDR=192.168.81.53
6#export MASTER_PORT=6000
7
8MEGATRON_PATH=${MEGATRON_PATH:-"/workspace/AIAK-Megatron"}
9AIAK_TRAINING_PATH=${AIAK_TRAINING_PATH:-"/workspace/AIAK-Training-LLM"}
10
11DATA_PATH=${DATA_PATH:-"mnt/pfs/qwen-2-5-vl-dataset/wds"}
12
13TOKENIZER_PATH=${TOKENIZER_PATH:-"/mnt/cluster/Qwen2.5-VL-7B-Instruct/"}
14
15CHECKPOINT_PATH=${CHECKPOINT_PATH:-"/mnt/cluster/aiak-training-llm/qwen2_5-vl/qwen2_5-vl-7b-tp1-pp1"}
16
17TENSORBOARD_PATH=${TENSORBOARD_PATH:-"/mnt/cluster/aiak-training-llm/tensorboard-log/qwen2_5-vl-7b"}
18
19GPUS_PER_NODE=8
20
21# Change for multinode config
22MASTER_ADDR=${MASTER_ADDR:-"localhost"}
23MASTER_PORT=${MASTER_PORT:-"6000"}
24NNODES=${WORLD_SIZE:-"1"}
25NODE_RANK=${RANK:-"0"}
26
27DISTRIBUTED_ARGS=(
28 --nproc_per_node $GPUS_PER_NODE
29 --nnodes $NNODES
30 --node_rank $NODE_RANK
31 --master_addr $MASTER_ADDR
32 --master_port $MASTER_PORT
33)
34
35# or you can setup qwen2_5-vl-7b by using the following command
36MODEL_ARGS=(
37 --model-name qwen2_5-vl-7b
38)
39
40DATA_ARGS=(
41 --tokenizer-type HFTokenizer \
42 --hf-tokenizer-path $TOKENIZER_PATH \
43 --data-path $DATA_PATH
44 --dataloader-type external
45 --split 100,0,0
46 --num-workers 8
47 --chat-template qwen2-vl
48 --packing-batch-size 10
49 --packing-sft-data
50 --packing-pretrain-data
51 --preprocess-data-on-cpu
52)
53
54TRAINING_ARGS=(
55 --training-phase sft
56 --trainable-modules language_model adapter
57 --seq-length 4096
58 --max-position-embeddings 8192
59 --micro-batch-size 1
60 --global-batch-size 32
61 --train-iters 50000
62 --initial-loss-scale 65536
63 --bf16
64 --save-interval 10000000
65 --ckpt-format torch
66)
67
68MODEL_PARALLEL_ARGS=(
69 --attention-backend flash
70 --pipeline-model-parallel-size 1
71 --tensor-model-parallel-size 1
72 --use-distributed-optimizer
73 --distributed-backend gloo
74 #--sequence-parallel
75)
76
77PYTHONPATH=$MEGATRON_PATH:$AIAK_TRAINING_PATH:$PYTHONPATH \
78 torchrun ${DISTRIBUTED_ARGS[@]} \
79 $AIAK_TRAINING_PATH/tools/data_preprocess/preprocess_megatron_energon_dataset.py \
80 ${MODEL_ARGS[@]} \
81 ${DATA_ARGS[@]} \
82 ${TRAINING_ARGS[@]} \
83 ${MODEL_PARALLEL_ARGS[@]} \
84 --output-path /mnt/pfs/qwen-2-5-vl-dataset/data
脚本中需要注意的点:
1.始能packing功能需要配置如下参数,packing-batch-size可以根据实际情况进行大小调整,48-50 行:
1 --packing-batch-size 10
2 --packing-sft-data
3 --packing-pretrain-data
2.如预处理执行在cpu环境需要加上下面参数,51 行
1--preprocess-data-on-cpu
3.预处理tp和pp统一配置成1、1,将预处理数据集的颗粒度最小化,70-71 行
1 --pipeline-model-parallel-size 1
2 --tensor-model-parallel-size 1
4.分布式后端使用gloo,73 行
1--distributed-backend gloo
5.指定预处理输出路径,84 行
1--output-path /mnt/pfs/qwen-2-5-vl-dataset/data
执行完成后可在输出路径找到对应数据集输出结果。
2️⃣ 再执行/workspace/AIAK-Training-LLM/tools/data_preprocess/preprocess_megatron_energon_dataset_stage2.py python文件,对预处理完的数据进行拼接。
注意:此处 world-size 需要能被下面 tp*pp 整除同时需保持与后续训练中配置一致,文件路径为预处理脚本中注入地址。
1python preprocess_megatron_energon_dataset_stage2.py --data-path /mnt/pfs/qwen-2-5-vl-dataset/data --world-size 8 --tp 1 --pp 1 --clean-temp
训练
数据在线Packing场景:
在百度百舸.AI计算平台控制台,点击【分布式训练】-【创建任务】开始创建训练任务并填写训练任务配置信息:
-
基本信息
- 任务名称:输入您为本次任务命名的名称,例如:vl-7b-SFT-test
- 可见范围:队列哪可见/仅创建人可见
-
创建方式:【基于开源模型训练模版创建】
- 模型:【qwen2.5】-> 【qwen2.5-vl-7b】
- 芯片类型:NVIDIA
- 训练模版:AIAK加速版
- 训练模式:选择【SFT】
- 训练方法:全量更新
-
资源配置(先配置此项)
- 资源池类型/资源池/队列:根据您的资源池类型选择A800资源所在的资源池和队列
- 优先级:默认为高,无需修改
- 训练框架:PyTorch,无需修改
- 资源配额:请确保GPU不少于A800 * 4(推荐使用单机 8 卡配置运行以保证效率最大化),CPU与内存在可配置条件下越大越好,在更多资源条件下可以适当提高--global-batch-size等参数
- 共享内存:100GiB
- 数据集挂载:本示例中为空,具体用挂载用法与存储挂载类似
- 存储挂载:此处与开发机创建配置保持一致:源路径:/vl,挂载路径:/mnt/pfs
-
环境信息
- 镜像地址:由基本信息自动带出无需修改
- 执行命令:需要自行配置数据集路径,Tokenizer路径,Checkpoint加载/保存路径,可通过环境变量注入或直接替换执行命令代码进行修改,例如(替换15-18行):
1#! /bin/bash
2# The script needs to be run on at least 1 nodes.
3
4MEGATRON_PATH=${MEGATRON_PATH:-"/workspace/AIAK-Megatron"}
5AIAK_TRAINING_PATH=${AIAK_TRAINING_PATH:-"/workspace/AIAK-Training-LLM"}
6
7# ----------------------------------------------------------------------------------------
8# 用户自定义配置:
9# DATA_PATH: 数据集路径
10# TOKENIZER_PATH: Tokenizer路径
11# CHECKPOINT_LOAD_PATH: Checkpoint加载路径
12# CHECKPOINT_SAVE_PATH: Checkpoint保存路径
13# TENSORBOARD_PATH: Tensorboard日志保存路径, 在创建任务时开启Tensorboard后百舸自动注入环境变量
14# ----------------------------------------------------------------------------------------
15DATA_PATH="/mnt/pfs/qwen-2-5-vl-dataset/wds"
16TOKENIZER_PATH="/mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct"
17CHECKPOINT_LOAD_PATH="/mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct/qwen2_5-vl-7b-tp1-pp1"
18CHECKPOINT_SAVE_PATH="/mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct/output/qwen2_5-vl-7b-tp1-pp1/1"
19TENSORBOARD_PATH=$AIHC_TENSORBOARD_LOG_PATH
20
21GPUS_PER_NODE=8
22
23# Change for multinode config
24MASTER_ADDR=${MASTER_ADDR:-"localhost"}
25MASTER_PORT=${MASTER_PORT:-"6000"}
26NNODES=${WORLD_SIZE:-"1"}
27NODE_RANK=${RANK:-"0"}
28
29DISTRIBUTED_ARGS=(
30 --nproc_per_node $GPUS_PER_NODE
31 --nnodes $NNODES
32 --node_rank $NODE_RANK
33 --master_addr $MASTER_ADDR
34 --master_port $MASTER_PORT
35)
36
37# or you can setup qwen2_5-vl-7b by using the following command
38MODEL_ARGS=(
39 --model-name qwen2_5-vl-7b
40)
41
42DATA_ARGS=(
43 --tokenizer-type HFTokenizer \
44 --hf-tokenizer-path $TOKENIZER_PATH \
45 --data-path $DATA_PATH
46 --dataloader-type external
47 --split 100,0,0
48 --num-workers 16
49 --chat-template qwen2-vl
50)
51
52TRAINING_ARGS=(
53 --training-phase sft
54 --trainable-modules language_model adapter
55 --seq-length 1024
56 --max-position-embeddings 4096
57 --init-method-std 0.02
58 --micro-batch-size 1
59 --global-batch-size 128
60 --lr 0.0002
61 --min-lr 1.0e-5
62 --clip-grad 1.0
63 --weight-decay 0.01
64 --optimizer adam
65 --adam-beta1 0.9
66 --adam-beta2 0.95
67 --adam-eps 1e-05
68 --norm-epsilon 1e-6
69 --train-iters 5000
70 --lr-decay-iters 5000
71 --lr-decay-style cosine
72 --lr-warmup-fraction 0.002
73 --initial-loss-scale 65536
74 --bf16
75 --load $CHECKPOINT_LOAD_PATH
76 --save $CHECKPOINT_SAVE_PATH
77 --save-interval 10000000
78 --ckpt-format torch
79 --dataloader-save ${CHECKPOINT_SAVE_PATH}/dataloader
80)
81
82MODEL_PARALLEL_ARGS=(
83 --attention-backend flash
84 --pipeline-model-parallel-size 1
85 --tensor-model-parallel-size 1
86 --use-distributed-optimizer
87 --overlap-grad-reduce
88 --overlap-param-gather
89 --distributed-backend nccl
90)
91
92LOGGING_ARGS=(
93 --log-interval 1
94 --tensorboard-dir ${TENSORBOARD_PATH}
95 --log-timers-to-tensorboard
96)
97
98if [ -n "${WANDB_API_KEY}" ]; then
99 LOGGING_ARGS+=(
100 --wandb-project ${WANDB_PROJECT}
101 --wandb-exp-name ${WANDB_NAME}
102 )
103fi
104
105PYTHONPATH=$MEGATRON_PATH:$AIAK_TRAINING_PATH:$PYTHONPATH \
106 torchrun ${DISTRIBUTED_ARGS[@]} \
107 $AIAK_TRAINING_PATH/aiak_training_llm/train.py \
108 ${MODEL_ARGS[@]} \
109 ${DATA_ARGS[@]} \
110 ${TRAINING_ARGS[@]} \
111 ${MODEL_PARALLEL_ARGS[@]} \
112 ${LOGGING_ARGS[@]}
-
监控信息
- Tensorboard:打开,并选择PFS,后续此路径会自动注入执行命令中
- 其余容错与诊断,监控信息可选择性打开。
点击确定,即可开始训练任务,此数据集的SFT任务在1*8卡环境下使用该参数大约为1000iter/小时。
数据离线Packing:
您也可以使用先前离线处理的数据集,来体验更高效的训练过程,在百度百舸.AI计算平台控制台,点击【分布式训练】-【创建任务】开始创建训练任务并填写训练任务配置信息(在资源处与在线版唯一区别就是把显卡从 18 变成了 24):
-
基本信息
- 任务名称:输入您为本次任务命名的名称,例如:vl-7b-SFT-test-offline
- 可见范围:队列哪可见/仅创建人可见
-
创建方式:【基于开源模型训练模版创建】
- 模型:【qwen2.5】-> 【qwen2.5-vl-7b】
- 芯片类型:NVIDIA
- 训练模版:AIAK加速版
- 训练模式:选择【SFT】
- 训练方法:全量更新
-
资源配置(先配置此项)
- 资源池类型/资源池/队列:根据您的资源池类型选择A800资源所在的资源池和队列
- 优先级:默认为高,无需修改
- 训练框架:PyTorch,无需修改
- 资源配额: 实例数1,显卡为 A8008
- 共享内存:100GiB
- 数据集挂载:本示例中为空,具体用挂载用法与存储挂载类似
- 存储挂载:此处与开发机创建配置保持一致:源路径:/vl,挂载路径:/mnt/pfs
-
环境信息
- 镜像地址:由基本信息自动带出无需修改
- 执行命令:需要自行配置数据集路径,Tokenizer路径,Checkpoint加载/保存路径,可通过环境变量注入或直接替换执行命令代码进行修改,例如(替换15-18行):
- 同时声明使用离线数据集格式进行训练【--is-tokenized-data】,参考 50-53 行,pp 与 tp 精度与数据集合并时对齐(pp1,tp1),参考 88-89 行。
1#! /bin/bash
2# The script needs to be run on at least 1 nodes.
3
4MEGATRON_PATH=${MEGATRON_PATH:-"/workspace/AIAK-Megatron"}
5AIAK_TRAINING_PATH=${AIAK_TRAINING_PATH:-"/workspace/AIAK-Training-LLM"}
6
7# ----------------------------------------------------------------------------------------
8# 用户自定义配置:
9# DATA_PATH: 数据集路径
10# TOKENIZER_PATH: Tokenizer路径
11# CHECKPOINT_LOAD_PATH: Checkpoint加载路径
12# CHECKPOINT_SAVE_PATH: Checkpoint保存路径
13# TENSORBOARD_PATH: Tensorboard日志保存路径, 在创建任务时开启Tensorboard后百舸自动注入环境变量
14# ----------------------------------------------------------------------------------------
15DATA_PATH="/mnt/pfs/qwen-2-5-vl-dataset/data"
16TOKENIZER_PATH="/mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct"
17CHECKPOINT_LOAD_PATH="/mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct/qwen2_5-vl-7b-tp1-pp1"
18CHECKPOINT_SAVE_PATH="/mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct/qwen2_5-vl-7b-tp1-pp1/1"
19TENSORBOARD_PATH=$AIHC_TENSORBOARD_LOG_PATH
20
21GPUS_PER_NODE=8
22
23# Change for multinode config
24MASTER_ADDR=${MASTER_ADDR:-"localhost"}
25MASTER_PORT=${MASTER_PORT:-"6000"}
26NNODES=${WORLD_SIZE:-"1"}
27NODE_RANK=${RANK:-"0"}
28
29DISTRIBUTED_ARGS=(
30 --nproc_per_node $GPUS_PER_NODE
31 --nnodes $NNODES
32 --node_rank $NODE_RANK
33 --master_addr $MASTER_ADDR
34 --master_port $MASTER_PORT
35)
36
37# or you can setup qwen2_5-vl-7b by using the following command
38MODEL_ARGS=(
39 --model-name qwen2_5-vl-7b
40)
41
42DATA_ARGS=(
43 --tokenizer-type HFTokenizer \
44 --hf-tokenizer-path $TOKENIZER_PATH \
45 --data-path $DATA_PATH
46 --dataloader-type external
47 --split 100,0,0
48 --num-workers 16
49 --chat-template qwen2-vl
50 --packing-batch-size 10
51 --is-tokenized-data
52 --packing-pretrain-data
53 --packing-sft-data
54)
55
56TRAINING_ARGS=(
57 --training-phase sft
58 --trainable-modules language_model adapter
59 --seq-length 1024
60 --max-position-embeddings 4096
61 --init-method-std 0.02
62 --micro-batch-size 1
63 --global-batch-size 128
64 --lr 0.0002
65 --min-lr 1.0e-5
66 --clip-grad 1.0
67 --weight-decay 0.01
68 --optimizer adam
69 --adam-beta1 0.9
70 --adam-beta2 0.95
71 --adam-eps 1e-05
72 --norm-epsilon 1e-6
73 --train-iters 5000
74 --lr-decay-iters 5000
75 --lr-decay-style cosine
76 --lr-warmup-fraction 0.002
77 --initial-loss-scale 65536
78 --bf16
79 --load $CHECKPOINT_LOAD_PATH
80 --save $CHECKPOINT_SAVE_PATH
81 --save-interval 10000000
82 --ckpt-format torch
83 --dataloader-save ${CHECKPOINT_SAVE_PATH}/dataloader
84)
85
86MODEL_PARALLEL_ARGS=(
87 --attention-backend flash
88 --pipeline-model-parallel-size 1
89 --tensor-model-parallel-size 1
90 --use-distributed-optimizer
91 --overlap-grad-reduce
92 --overlap-param-gather
93 --distributed-backend nccl
94)
95
96LOGGING_ARGS=(
97 --log-interval 1
98 --tensorboard-dir ${TENSORBOARD_PATH}
99 --log-timers-to-tensorboard
100)
101
102if [ -n "${WANDB_API_KEY}" ]; then
103 LOGGING_ARGS+=(
104 --wandb-project ${WANDB_PROJECT}
105 --wandb-exp-name ${WANDB_NAME}
106 )
107fi
108
109PYTHONPATH=$MEGATRON_PATH:$AIAK_TRAINING_PATH:$PYTHONPATH \
110 torchrun ${DISTRIBUTED_ARGS[@]} \
111 $AIAK_TRAINING_PATH/aiak_training_llm/train.py \
112 ${MODEL_ARGS[@]} \
113 ${DATA_ARGS[@]} \
114 ${TRAINING_ARGS[@]} \
115 ${MODEL_PARALLEL_ARGS[@]} \
116 ${LOGGING_ARGS[@]}
权重转换
在开发机使用如下脚本进行权重转换,将mcore格式训练结果转换为hf格式用于后续部署工作,转换脚本参考位置为/workspace/AIAK-Training-LLM/examples/qwen2_5_vl/checkpoint_convert/convert_qwen2_5_vl_7b_mcore_to_hf.sh:
注意:LOAD 目录地址为结果中最后一次迭代的文件夹名,此处只运行了 50 次迭代因此文件夹名为iter_0000050,具体文件夹信息可见目录中 latest_iteration.txt。
1#! /bin/bash
2
3AIAK_TRAINING_PATH=${AIAK_TRAINING_PATH:-"/workspace/AIAK-Training-LLM"}
4AIAK_MAGATRON_PATH=${AIAK_MAGATRON_PATH:-"/workspace/AIAK-Megatron"}
5CONVERT_CHECKPOINT_PATH="$AIAK_TRAINING_PATH/tools/convert_checkpoint"
6
7SAVE=/mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct/output/hf
8LOAD=/mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct/output/qwen2_5-vl-7b-tp1-pp1/1/iter_0000050/
9
10SAVE_LANGUAGE_MODEL=/mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct/output/tmp/language-expert-hf
11SAVE_VISION_MODEL=/mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct/output/tmp/vision-model-hf
12SAVE_ADAPTER=/mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct/output/tmp/adapter-hf
13SAVE_PATCH=/mnt/pfs/qwen-2-5-vl-model/Qwen2.5-VL-7B-Instruct/output/tmp/patch-hf
14
15TP=1
16PP=1
17
18# llama: language expert
19python $CONVERT_CHECKPOINT_PATH/model.py \
20 --load_platform=mcore \
21 --megatron_path $AIAK_MAGATRON_PATH \
22 --save_platform=huggingface \
23 --common_config_path=$CONVERT_CHECKPOINT_PATH/config/qwen2_5-vl-7b/qwen2_5.json \
24 --tensor_model_parallel_size=$TP \
25 --pipeline_model_parallel_size=$PP \
26 --load_ckpt_path=$LOAD \
27 --save_ckpt_path=$SAVE_LANGUAGE_MODEL \
28 --safetensors \
29 --no_save_optim \
30 --no_load_optim
31
32# vit
33
34if [[ $PP -eq 1 ]]; then
35 LOAD_PATH=$LOAD
36else
37 LOAD_PATH=$LOAD/tmp/
38 mkdir -p $LOAD_PATH
39 for ((i=0;i<$TP;i++)); do
40 from=`printf "mp_rank_%02d_000" $i`
41 to=`printf "mp_rank_%02d" $i`
42 cp -r $LOAD/$from $LOAD_PATH/$to
43 done
44fi
45
46python $CONVERT_CHECKPOINT_PATH/model.py \
47 --load_platform=mcore \
48 --save_platform=huggingface \
49 --megatron_path $AIAK_MAGATRON_PATH \
50 --common_config_path=$CONVERT_CHECKPOINT_PATH/config/qwen2_5-vl-7b/vision-model.json \
51 --tensor_model_parallel_size=$TP \
52 --pipeline_model_parallel_size=1 \
53 --load_ckpt_path=$LOAD_PATH \
54 --save_ckpt_path=$SAVE_VISION_MODEL \
55 --safetensors \
56 --no_save_optim \
57 --no_load_optim
58
59if [[ $LOAD != $LOAD_PATH ]]; then
60 rm -rf $LOAD_PATH
61fi
62
63# adapter
64python $CONVERT_CHECKPOINT_PATH/custom/qwen2_vl/adapter.py \
65 --load_platform=mcore \
66 --save_platform=huggingface \
67 --megatron_path $AIAK_MAGATRON_PATH \
68 --common_config_path=$CONVERT_CHECKPOINT_PATH/config/qwen2_5-vl-7b/adapter.json \
69 --tensor_model_parallel_size=$TP \
70 --pipeline_model_parallel_size=$PP \
71 --load_ckpt_path=$LOAD \
72 --save_ckpt_path=$SAVE_ADAPTER
73
74# vision patch
75python $CONVERT_CHECKPOINT_PATH/custom/qwen2_vl/vision_patch.py \
76 --load_platform=mcore \
77 --save_platform=huggingface \
78 --megatron_path $AIAK_MAGATRON_PATH \
79 --tensor_model_parallel_size=$TP \
80 --pipeline_model_parallel_size=$PP \
81 --common_config_path=$CONVERT_CHECKPOINT_PATH/config/qwen2_5-vl-7b/vision-patch.json \
82 --load_ckpt_path=$LOAD \
83 --save_ckpt_path=$SAVE_PATCH
84
85# merge
86python $CONVERT_CHECKPOINT_PATH/custom/qwen2_vl/merge_huggingface.py \
87 --megatron_path $AIAK_MAGATRON_PATH \
88 --language_model_path $SAVE_LANGUAGE_MODEL \
89 --vision_model_path $SAVE_VISION_MODEL \
90 --vision_patch $SAVE_PATCH \
91 --adapter_path $SAVE_ADAPTER \
92 --save_ckpt_path $SAVE
93
94# BASE=/mnt/cluster/huggingface.co/Qwen/Qwen2_5-VL-7B-Instruct/
95# find $BASE -type f -not -iname '*safetensors*' -exec cp {} ${SAVE}/ ';'
96rm -rf $SAVE_LANGUAGE_MODEL
97rm -rf $SAVE_VISION_MODEL
98rm -rf $SAVE_ADAPTER
99rm -rf $SAVE_PATCH
最后输出结果为:Finished convert checkpoint mcore->huggingface即为正确的
