Chapter 07

训练算法:SFT / DPO / 增量预训练 / 奖励建模

📌 commit 964f70e切换算法 = 换 model wrapper

XTuner 通过更换 model.type 切换算法。本章给四种主流算法的 wrapper 对照。

7.1model wrapper 全清单

algotype数据格式
SFTSupervisedFinetuneconversation
预训练 / CPTSupervisedFinetune + text 数据纯文本
DPODPOchosen / rejected
ORPOORPO同 DPO
RMRewardchosen / rejected
VL SFTLLaVAModel / InternVLChatModelimage + text

7.2SFT

就是 ch03 例子的标准配方。要点:

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

  1. model.type
  2. 改 dataset 的 process 函数(preference vs supervised);
  3. 改 chat template(如需);
  4. 检查 collate_fn(DPO 用专门的)。

7.9这章你需要带走的