Chapter 07
训练算法:SFT / DPO / 增量预训练 / 奖励建模
XTuner 通过更换 model.type 切换算法。本章给四种主流算法的 wrapper 对照。
7.1model wrapper 全清单
| algo | type | 数据格式 |
|---|---|---|
| SFT | SupervisedFinetune | conversation |
| 预训练 / CPT | SupervisedFinetune + text 数据 | 纯文本 |
| DPO | DPO | chosen / rejected |
| ORPO | ORPO | 同 DPO |
| RM | Reward | chosen / rejected |
| VL SFT | LLaVAModel / InternVLChatModel | image + text |
7.2SFT
就是 ch03 例子的标准配方。要点:
model.type=SupervisedFinetune;- 用
process_hf_dataset+ map_fn; - chat template 与 base 一致;
- 开 use_varlen_attn + pack_to_max_length 加速。
7.3增量预训练(CPT)
给 base 模型继续 pretrain(如领域适配)。用 SFT model + 纯文本:
train_dataset = dict(
type=process_hf_dataset,
dataset=dict(type=load_dataset, path="./my_corpus.jsonl"),
tokenizer=tokenizer,
max_length=2048,
dataset_map_fn=pretrain_map_fn, # ★ 不加 chat template
template_map_fn=None, # ★ 关键
remove_unused_columns=True,
pack_to_max_length=True,
)
pretrain_map_fn 把每条 jsonl 当纯文本对待,不加角色标记。loss 算所有 token(不 mask)。
7.4DPO
model = dict(
type=DPO,
llm=dict(...),
ref_llm=None, # None = 用 LoRA disable_adapter
lora=dict(type=LoraConfig, ...),
beta=0.1,
)
train_dataset = dict(
type=build_preference_dataset,
dataset=dict(type=load_dataset, path="HuggingFaceH4/ultrafeedback_binarized"),
tokenizer=tokenizer,
max_length=2048,
dataset_map_fn=preference_map_fn,
is_dpo=True,
)
ref_llm=None 时 XTuner 用 LoRA disable_adapter 作为 reference,省一份模型显存。
7.5ORPO
model = dict(
type=ORPO,
llm=dict(...),
lora=dict(...),
beta=0.1,
)
# 数据同 DPO
ORPO 不需要 reference 模型,显存更省。
7.6Reward Model
model = dict(
type=Reward,
llm=dict(...),
lora=dict(...),
)
train_dataset = dict(
type=build_preference_dataset,
...,
is_reward=True,
)
训练 Bradley-Terry pairwise loss。注意 batch 内部会翻倍(chosen + rejected)。
7.7VL SFT
model = dict(
type=LLaVAModel,
freeze_llm=True, # 第 1 阶段冻结 LLM 只训 projector
freeze_visual_encoder=True,
pretrained_pth=None,
llm=dict(type=AutoModelForCausalLM.from_pretrained, ...),
visual_encoder=dict(type=CLIPVisionModel.from_pretrained, ...),
projector=dict(type=ProjectorConfig, ...),
)
详见 ch10。
7.8切算法的 checklist
- 改
model.type; - 改 dataset 的
process函数(preference vs supervised); - 改 chat template(如需);
- 检查
collate_fn(DPO 用专门的)。
7.9这章你需要带走的
- XTuner 切算法 = 换
model.type+ 换 dataset 处理函数; - SFT / 增量预训练共用 SupervisedFinetune;
- DPO 用
ref_llm=None+ LoRA 省一份模型; - ORPO 跳 reference 进一步省显存;
- RM 用
type=Reward+is_reward=True。