Qwen2.5-VL - 训练 执行命令
flyfish
Bash脚本内容
#!/bin/bash
# 分布式训练配置
MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"} # 主节点地址,默认本地训练
MASTER_PORT=${MASTER_PORT:-$(shuf -i 20001-29999 -n 1)} # 主节点端口,随机选择避免冲突
NNODES=${WORLD_SIZE:-1} # 节点数量,默认为1(单机训练)
# DeepSpeed优化配置(使用ZeRO3内存优化技术)
deepspeed=./scripts/zero3.json
# 模型配置(使用HuggingFace上的Qwen2.5-VL-32B-Instruct多模态模型)
llm=Qwen/Qwen2.5-VL-32B-Instruct
# 训练超参数设置
lr=2e-7 # 学习率,较低的值适合大模型微调
batch_size=2 # 每设备训练批次大小
grad_accum_steps=8 # 梯度累积步数,等效于batch_size*grad_accum_steps=16
# 训练入口脚本
entry_file=qwenvl/train/train_qwen.py
# 数据集配置(需替换为实际公开数据集名称)
datasets=public_dataset1,public_dataset2
# 输出配置
run_name="qwen2vl-baseline" # 训练任务名称
output_dir=./output # 模型输出目录
# 训练参数集合
args="
--deepspeed ${deepspeed} \ # 使用DeepSpeed优化
--model_name_or_path "${llm}" \ # 指定预训练模型路径
--dataset_use ${datasets} \ # 指定使用的数据集
--data_flatten True \ # 数据扁平化处理
--tune_mm_vision False \ # 冻结视觉编码器参数(使用预训练能力)
--tune_mm_mlp True \ # 训练视觉到语言的映射层(适配多模态对齐)
--tune_mm_llm True \ # 训练大语言模型部分参数(学习跨模态推理)
--bf16 \ # 使用BF16混合精度训练(提高效率)
--output_dir ${output_dir} \ # 输出目录
--num_train_epochs 0.5 \ # 训练半个轮次(节约资源)
--per_device_train_batch_size ${batch_size} \ # 每设备训练批次
--per_device_eval_batch_size $((batch_size*2)) \ # 评估批次大小加倍
--gradient_accumulation_steps ${grad_accum_steps} \ # 梯度累积步数
--max_pixels 50176 \ # 最大图像像素数(224x224)
--min_pixels 784 \ # 最小图像像素数(28x28)
--eval_strategy "no" \ # 不进行评估(节省时间)
--save_strategy "steps" \ # 按步数保存模型
--save_steps 1000 \ # 每1000步保存一次
--save_total_limit 1 \ # 最多保存1个检查点(节省空间)
--learning_rate ${lr} \ # 学习率
--weight_decay 0 \ # 权重衰减(正则化)
--warmup_ratio 0.03 \ # 学习率预热比例
--max_grad_norm 1 \ # 梯度裁剪阈值
--lr_scheduler_type "cosine" \ # 余弦学习率调度
--logging_steps 1 \ # 每步记录日志
--model_max_length 8192 \ # 模型最大输入长度(支持长文本)
--gradient_checkpointing True \ # 使用梯度检查点(节约显存)
--dataloader_num_workers 4 \ # 数据加载器工作线程数
--run_name ${run_name} \ # 训练任务名称
--report_to wandb" # 使用WandB记录训练过程
# 启动分布式训练
torchrun --nproc_per_node=${NPROC_PER_NODE} \ # 每节点进程数(GPU数)
--master_addr=${MASTER_ADDR} \ # 主节点地址
--master_port=${MASTER_PORT} \ # 主节点端口
${entry_file} ${args} # 执行训练脚本并传递参数
多模态训练策略:
–tune_mm_vision False:冻结视觉编码器,复用预训练能力
–tune_mm_mlp True:训练视觉到语言的映射层,优化跨模态对齐
–tune_mm_llm True:微调语言模型,学习基于视觉信息的推理能力
DeepSpeed 优化:
使用 ZeRO3 内存优化技术,大幅降低训练显存需求
结合 BF16 混合精度和梯度检查点,进一步提升效率
训练设置:
小批次 + 梯度累积实现大有效批次
余弦学习率调度 + 预热策略,稳定训练过程
每 1000 步保存一次模型,仅保留最新检查点
JSON文件是DeepSpeed的ZeRO-3优化配置
{
"fp16": {
"enabled": "auto",
"loss_scale": 0,
"loss_scale_window": 1000,
"initial_scale_power": 16,
"hysteresis": 2,
"min_loss_scale": 1
},
"bf16": {
"enabled": "auto"
},
"train_micro_batch_size_per_gpu": "auto",
"train_batch_size": "auto",
"gradient_accumulation_steps": "auto",
"zero_optimization": {
"stage": 3,
"overlap_comm": true,
"contiguous_gradients": true,
"sub_group_size": 1e9,
"reduce_bucket_size": "auto",
"stage3_prefetch_bucket_size": "auto",
"stage3_param_persistence_threshold": "auto",
"stage3_max_live_parameters": 1e9,
"stage3_max_reuse_distance": 1e9,
"stage3_gather_16bit_weights_on_model_save": true
}
}
- 混合精度训练:使用BF16/FP16降低参数精度
- ZeRO-3优化:分片存储优化器状态、梯度和模型参数
- 自动调优:多个参数设为
"auto"
,让DeepSpeed根据硬件自动调整
1. FP16配置
"fp16": {
"enabled": "auto",
"loss_scale": 0,
"loss_scale_window": 1000,
"initial_scale_power": 16,
"hysteresis": 2,
"min_loss_scale": 1
}
enabled
: 是否启用FP16混合精度训练。"auto"
表示根据硬件自动决定(GPU支持BF16时优先使用BF16)。loss_scale
: 静态损失缩放因子。设为0时启用动态损失缩放(自适应调整缩放因子)。loss_scale_window
: 动态损失缩放的窗口大小。每经过这么多步,评估一次是否需要调整缩放因子。initial_scale_power
: 初始损失缩放因子为2的16次方(65536)。hysteresis
: 损失缩放因子调整的滞后参数。连续多次梯度溢出才降低缩放因子。min_loss_scale
: 最小损失缩放因子,防止缩放因子过小导致精度问题。
2. BF16配置
"bf16": {
"enabled": "auto"
}
enabled
: 是否启用BF16混合精度训练。"auto"
表示根据硬件自动决定(NVIDIA A100、H100等支持BF16的GPU会启用)。BF16比FP16更适合大模型训练,能减少舍入误差。
3. 批次配置
"train_micro_batch_size_per_gpu": "auto",
"train_batch_size": "auto",
"gradient_accumulation_steps": "auto"
train_micro_batch_size_per_gpu
: 每个GPU实际处理的微批次大小。"auto"
表示由DeepSpeed根据显存自动计算。train_batch_size
: 全局有效批次大小。gradient_accumulation_steps
: 梯度累积步数。"auto"
表示DeepSpeed根据前两者自动计算(train_batch_size = micro_batch_size * grad_accum_steps
)。
4. ZeRO-3优化配置
"zero_optimization": {
"stage": 3,
"overlap_comm": true,
"contiguous_gradients": true,
"sub_group_size": 1e9,
"reduce_bucket_size": "auto",
"stage3_prefetch_bucket_size": "auto",
"stage3_param_persistence_threshold": "auto",
"stage3_max_live_parameters": 1e9,
"stage3_max_reuse_distance": 1e9,
"stage3_gather_16bit_weights_on_model_save": true
}
stage
: ZeRO优化阶段。3
表示启用ZeRO-3,将优化器状态、梯度和模型参数都分片到不同GPU,大幅降低显存需求。overlap_comm
: 是否重叠通信和计算。启用后可隐藏通信延迟,提高训练效率。contiguous_gradients
: 是否将梯度连续存储。有助于减少内存碎片。sub_group_size
: 通信子组大小。设为极大值(1e9)表示所有GPU参与通信。reduce_bucket_size
: 梯度归约的桶大小。"auto"
表示自动调整。stage3_prefetch_bucket_size
: ZeRO-3预取桶的大小。控制参数预取的粒度。stage3_param_persistence_threshold
: 参数持久化阈值。小于此值的参数会被频繁卸载以节省显存。stage3_max_live_parameters
: 同时活跃的最大参数数量。控制内存使用上限。stage3_max_reuse_distance
: 参数重用的最大距离。影响参数卸载策略。stage3_gather_16bit_weights_on_model_save
: 保存模型时,是否将参数收集为16位格式。启用后可减小模型文件大小。
数据集
data/__init__.py
DATASET_NAME1 = {
"annotation_path": "/media/user/Qwen2.5-VL-main/qwen-vl-finetune/demo/single_images.json",
"data_path": "/media/user/Qwen2.5-VL-main/qwen-vl-finetune/",
}
data_dict = {
"cambrian_737k": CAMBRIAN_737K,
"cambrian_737k_pack": CAMBRIAN_737K_PACK,
"mp_doc": MP_DOC,
"clevr_mc": CLEVR_MC,
"videochatgpt": VIDEOCHATGPT,
"dataset_name1": DATASET_NAME1,
}
据硬件条件配置指南 NNODES、NPER_NODE、WORLD_SIZE、RANK、LOCAL_RANK之后
执行
chmod +x ./scripts/sft_32b.sh
./scripts/sft_32b