增量预训练是在已有预训练模型基础上,继续在新数据上进行预训练,让模型学习新知识或适应新领域的技术。业界普遍认为"预训练学知识,指令微调学格式",增量预训练是领域大模型构建的关键步骤。
定义:在已有预训练基座模型基础上,继续用领域/新语种数据训练,更新模型参数。
优势:
适用场景:
定义:从零开始,用大规模数据训练整个模型。
优势:
劣势:
适用场景:
| 对比维度 | 增量预训练 | 全量预训练 |
|---|---|---|
| 计算成本 | 低 | 高 |
| 数据需求 | 几B tokens | 上百B tokens |
| 周期 | 天/周 | 月/季度 |
| 保留通用能力 | ✓ | ✗ |
| 领域适配效果 | 好 | 更好(数据足够时) |
主流选择:
经验建议:起步优先选LLaMA系列,生态成熟,坑少。
经典开源数据集:
实践建议:刚开始不需要太多数据,先收集GB量级的领域文本跑通流程,再逐步扩大。
数据清洗要点:
直接使用3D并行(张量并行+流水线并行+数据并行),推荐 Megatron-DeepSpeed,已有多个成功案例。
缺点:checkpoint转换麻烦,门槛较高。
分两种情况:
显存不够时,可以使用 LoRA 进行增量预训练,只训练低秩矩阵,显存占用大大降低。
至少需要几B tokens,否则几十条数据不如直接做微调。
增量预训练开始阶段,通常会出现loss上升,随后慢慢收敛,这是正常现象。
学习率大小的影响:
经验法则:
warmup_ratio:
关系:学习率越大,通常需要更大的warmup比例,二者相辅相成。
实验对比不同预热步数:
实践启示:资源不允许充分训练时,较小学习率+较长warmup是更稳妥的选择。
实验对比不同最大学习率:
实践启示:根据你的资源和目标选择:如果追求下游领域性能,资源充足,可以用较大学习率;如果要保留更多原能力,资源有限,用较小学习率。
实验发现:在原数据集上继续训练时,使用Rewarmup效果不如常量学习率,且学习率越大损伤越大。
结论:训练中断重启时,应该恢复学习率到中断前的状态(包括数值和衰减率),不要重新warmup。
以Llama 2中文增量预训练为例:
目标:保持原模型权重不变,只训练LoRA低秩矩阵,高效让模型支持中文。
语料构建:可以使用中文书籍项目(如shu数据集),纯文本格式,每本一个txt文件。
参数设置示例:
1lr = 2e-4 # 学习率
2lora_rank = 64 # LoRA秩
3lora_alpha = 128 # LoRA缩放系数
4lora_trainable = "q_proj,v_proj,k_proj,o_proj,gate_proj,down_proj,up_proj"
5modules_to_save = "embed_tokens,lm_head" # 需要保存的模块
6lora_dropout = 0.05
7block_size = 512 # 最大序列长度
8per_device_train_batch_size = 1启动命令示例:
1torchrun --nnodes 1 --nproc_per_node 1 scripts/training/run_clm_pt_with_peft.py \
2 --deepspeed ${deepspeed_config_file} \
3 --model_name_or_path ${pretrained_model} \
4 --tokenizer_name_or_path ${chinese_tokenizer_path} \
5 --dataset_dir ${dataset_dir} \
6 --data_cache_dir ${data_cache} \
7 --per_device_train_batch_size ${per_device_train_batch_size} \
8 --do_train \
9 --fp16 \
10 --max_steps ${training_steps} \
11 --lr_scheduler_type cosine \
12 --learning_rate ${lr} \
13 --warmup_ratio 0.05 \
14 --weight_decay 0.01 \
15 --output_dir ${output_dir} \
16 --lora_rank ${lora_rank} \
17 --lora_alpha ${lora_alpha} \
18 --trainable ${lora_trainable} \
19 --modules_to_save ${modules_to_save} \
20 --lora_dropout ${lora_dropout}**为什么需要增量预训练?
**增量预训练和全量预训练怎么选择?
**增量预训练学习率怎么设置?
**增量预训练初期loss上升正常吗?
**训练中断后重新启动,学习率应该怎么处理?
**LoRA能否用于增量预训练?
**中文适配LLaMA怎么做增量预训练?