4.5.3,两个后端。Hugging Face Trainer 后端八个方法:sft,以及 swift rlhf 背后的
dpo / kto / cpo / orpo / rm / grpo / gkd。Megatron 后端另有三个:megatron-sft、
megatron-grpo、megatron-gkd。配置是扁平的命令行参数 —— 只有一层,没有点号路径 —— 适配器把训练
入口放在 torchrun 下启动。
参数绑到哪些字段
和 verl、TRL 不同,这里验证集文件是可选的。改设
split_dataset_ratio,ms-swift 会从训练集里切一份
出来;显式传了 --validation-data 就用显式的那份,比例参数被忽略。
训练数据是本地的 jsonl / json / csv / parquet 文件,经 datasets 读取,所以扩展名决定用哪个
loader。列名遵循 ms-swift 自己的 schema(messages,或 query/response)—— 平台不做重映射。
LoRA 是一个参数,不是另一个方法
tuner_type:full 训练全部参数,lora 只训练适配器。学习率跟着它走 —— LoRA 大约要
全参的 10~100 倍,ms-swift 自己的默认值分别是 1e-5 和 1e-4。
其余一切不变,导出也一样。平台读的是这一趟实际写出来的东西:全参 checkpoint 直接登记,适配器
目录用 swift export --merge_lora 合回底座模型。没有 -lora 方法要挑,也没有格式会选错。
实验配置是逃生口
实验里的config.yaml 承载这个方法没有暴露成参数的 ms-swift 标志,扁平书写:
model、dataset、val_dataset、
output_dir、logging_dir、add_version、report_to),会被拒绝而不是被忽略 —— 请去设那个参数,
这样控制台显示的才是真正生效的值。
一个 GRPO trainer,多个已发表方法
importance_sampling_level=sequence 就是 GSPO。epsilon_high 设得比 epsilon 大就是 DAPO 的
clip-higher。advantage_estimator 能切到 RLOO 和 REINFORCE++。scale_rewards=none 是 Dr. GRPO 的
无偏形式。这些都不需要换一个方法。
偏好这一族也一样:ms-swift/cpo 设 loss_type=simpo 就是 SimPO,而 CPO 和 ORPO 都完全不加载参考
模型 —— 同样模型规模下显存大约是 DPO 的一半。
rollout 引擎 vLLM 跑在训练卡上(vllm_mode=colocate),所以 vllm_gpu_memory_utilization 要和训练
状态共享同一张卡的显存,OOM 时先动它 —— 在动 batch size 之前。
Megatron 后端
Dockerfile.msswift-megatron)和单独一个设置(TUNEPLANE_IMAGE_MS_SWIFT_MEGATRON),因为
Megatron-core 与 TransformerEngine 不在另一张里。模型在 Hugging Face 后端放得下就用那个:模型覆盖
一样,栈更简单。
megatron-grpo 和 megatron-gkd 走 ms-swift 自己的 Ray 流水线,这是 ms-swift 唯一用到 Ray 的地方。
placement 由平台编译 —— 每个 worker 组拿几张卡、横跨几台机器、哪些组共卡 —— 来自 profile 与角色到
资源池的映射。config.yaml 里不需要也不允许写卡的事,写了会被拒绝。把 rollout(或 teacher)角色
映射到独立资源池就能给它独立的卡;映射到同一个池,这些组会被声明为共卡。
Megatron-core 自己的参数(save_interval、eval_interval、log_interval)放在实验的 config.yaml
里,而不是作为超参 —— 它们属于上游 Megatron 的参数面,不是 ms-swift 的,目录不会装作拥有它们。
确认成功
tp job logs 会先打出数据预处理,然后是第一个优化步。Charts 页开始出现 train/loss 和
train/token_accuracy(GRPO 则是 train/reward 和 train/reward_zero_std_frac)。盯住最后这个:
一组回复全部得分相同,优势就是 0,也就没有梯度,而 loss 曲线看上去照样在动。
ms-swift 的运行不上报验证样本 —— 它在 trainer 见到数据之前就完成了编码,共用的样本观察器拿不到文本。
指标序列不受影响。