增量预训练 (CPT, Continuous Pre-Training) llama-factory 训练配置
前一阵子 qwen3 模型出来了,正好公司新的 GPU 资源也申请下来,就基于新的基座模型重新训练一下,实现性能飞跃嘿嘿。
1. 路径依赖篇
由于上一版的模型是基于 Qwen2.5-Coder:3b 训练的,服务器也只有 A100 80G * 2,所以在用 llamafactory 训练的时候没有考虑参数并行等问题,直接用了模板给的默认训练配置:
bf16: true
cutoff_len: 2048
dataset: afsim_train_data
dataset_dir: data
ddp_timeout: 180000000
do_train: true
finetuning_type: full
flash_attn: auto
gradient_accumulation_steps: 8
learning_rate: 5.0e-05
logging_steps: 5
lr_scheduler_type: cosine
max_grad_norm: 1.0
max_samples: 100000
model_name_or_path: /data/wzr/LLM-MODELS/Qwen/Qwen2___5-Coder-3B-Instruct/
num_train_epochs: 3.0
optim: adamw_torch
output_dir: saves/Qwen2.5-Coder-3B-Instruct/full/train_2025-01-07-21-03-26
packing: true
per_device_train_batch_size: 2
plot_loss: true
preprocessing_num_workers: 16
report_to: none
save_steps: 100
stage: pt
template: qwen
trust_remote_code: true
warmup_steps: 0
当时看两张 A100 卡上的资源都跑的满满的,加上官方文档也提到:
如果 CUDA_VISIBLE_DEVICES 没有指定,则默认使用所有GPU
我不知怎么的就以为这个训练使用了参数并行或者张量并行(可怕的潜意识)。直到我拿到新的服务器(A800 80G * 8),发现连 qwen3-14b 的模型都 OOM 了。
我先去查了一下理论显存的消耗:
Total VRAM = Model Parameters + Optimizer States + Activations
| Method | 8B | 14B | 30B |
|---|---|---|---|
| Full (pure_bf16) | 60GB | 120GB | 300GB |
(注:以上表格中为估算值,pre-train 阶段的训练实际还要更大些)
除了优化算法、batch size、cutoff length 等因素的差异,数量级应该差不多就是表格中的数值了。8卡服务器不可能连14b的模型都跑不起来。
最开始以为是 llamafactory 的 bug,毕竟 qwen3 出来时间还比较短,万一没适配好或者底层依赖库有问题什么的。搜索一番 issue 好像没人提这个问题,考虑到 qwen3 在社区的热度很高,不可能有明显的 bug 还没人发现。此时我已经隐隐约约感到可能是训练参数配置的问题了。
2. 再查文档篇
果然,llamafactory 官方文档中 分布训练-DeepSpeed 写的清清楚楚:
DeepSpeed 是由微软开发的一个开源深度学习优化库,旨在提高大模型训练的效率和速度。在使用 DeepSpeed 之前,您需要先估计训练任务的显存大小,再根据任务需求与资源情况选择合适的 ZeRO 阶段。
ZeRO-1: 仅划分优化器参数,每个GPU各有一份完整的模型参数与梯度。
ZeRO-2: 划分优化器参数与梯度,每个GPU各有一份完整的模型参数。
ZeRO-3: 划分优化器参数、梯度与模型参数。
也就是说,如果没有显式配置 DeepSpeed 的 stage 为 ZeRO-3,那么 14b 的模型权重、gradient 等数据会在所有卡上都复制一份,那就已经占用了接近一半的显存了。
最后使用如下参数启动训练:
llamafactory-cli train \
--stage pt \
--do_train True \
--model_name_or_path /root/private_data/SothisAI/model/Aihub/Qwen3-30B-A3B/main/Qwen3-30B-A3B \
--preprocessing_num_workers 16 \
--finetuning_type full \
--template qwen3 \
--flash_attn auto \
--dataset_dir data \
--dataset afsim_train_data \
--cutoff_len 2048 \
--learning_rate 5e-05 \
--num_train_epochs 5.0 \
--max_samples 100000 \
--per_device_train_batch_size 2 \
--gradient_accumulation_steps 8 \
--lr_scheduler_type cosine \
--max_grad_norm 1.0 \
--logging_steps 5 \
--save_steps 100 \
--warmup_steps 0 \
--packing True \
--enable_thinking True \
--report_to none \
--freeze_vision_tower True \
--freeze_multi_modal_projector True \
--image_max_pixels 589824 \
--image_min_pixels 1024 \
--video_max_pixels 65536 \
--video_min_pixels 256 \
--output_dir saves/Qwen3-30B-A3B/full/train_deepspeed_z3_2025-05-25-17-02-33 \
--bf16 True \
--plot_loss True \
--trust_remote_code True \
--ddp_timeout 180000000 \
--include_num_input_tokens_seen True \
--optim adamw_torch \
--deepspeed cache/ds_z3_config.json
连 30b 的模型都跑的稳稳的,每张卡大概占用 70G 的显存。

浙公网安备 33010602011771号