关于 trl-training
面向语言模型开发者的训练技能,介绍 TRL 中用于监督微调、偏好优化、在线强化学习、蒸馏和奖励建模的 Trainer,并说明配置与命令行训练方式。
主要功能
- 01SFT、DPO、GRPO 等 Trainer
- 02偏好与奖励模型训练
- 03序列打包和免填充选项
- 04LoRA 配置支持
- 05TRL 命令行训练
适用场景
- 01用对话数据微调语言模型
- 02根据优选与拒绝回答进行训练
- 03使用自定义奖励函数运行在线强化学习
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ huggingface/ skills --skill trl-training安装后在 Claude Code 中输入/trl-training确认已加载。
详细介绍
TRL
每种方法都配有一个 *Trainer 类和一个 *Config 数据类。配置类继承自 transformers.TrainingArguments,因此它的所有参数都可用于任意 Trainer 配置。
| Trainer | 数据集类型 |
|---|---|
SFTTrainer | 语言建模或提示词补全 |
DPOTrainer | 偏好数据(chosen/rejected 对) |
GRPOTrainer | 仅提示词 + 奖励函数 |
DistillationTrainer | 仅提示词 + 教师模型(on-policy 蒸馏) |
KTOTrainer | 非配对偏好数据(每个样本带布尔标签) |
RewardTrainer | 偏好数据(chosen/rejected 对);训练标量奖励模型,而不是策略模型 |
还有许多其他 Trainer(OnlineDPO、ORPO、CPO、GKD 等)位于 trl.experimental 中,其 API 尚不稳定:https://huggingface.co/docs/trl/experimental_overview
from datasets import load_dataset
from trl import SFTConfig, SFTTrainer
trainer = SFTTrainer(
model="Qwen/Qwen2.5-0.5B", # model ID or a PreTrainedModel instance
args=SFTConfig(output_dir="Qwen2.5-0.5B-SFT"),
train_dataset=load_dataset("trl-lib/Capybara", split="train"),
)
trainer.train()
将 model 设为字符串,并通过 model_init_kwargs 传递模型加载参数(例如 {"dtype": "bfloat16", "attn_implementation": "kernels-community/flash-attn2"}),而不要自行调用 from_pretrained。Tokenizer/processor 会根据模型自动推断;只有在两者不同时才传入 processing_class。使用 LoRA 时,传入 peft_config=LoraConfig(...)。
数据集格式
对话格式:{"messages": [{"role": ..., "content": ...}]}(语言建模)或 {"prompt": [...], "completion": [...]}。聊天模板会自动应用,切勿自行应用。允许包含额外列;GRPO 会将这些列传递给奖励函数。参考:https://huggingface.co/docs/trl/dataset_formats
SFT:重要字段
SFTConfig(
max_length=1024, # truncation length; None disables truncation
packing=True, # pack sequences into max_length blocks: fewer pad tokens, higher throughput
padding_free=True, # flatten batch, no padding; requires FlashAttention; implied by packing
use_liger_kernel=True, # fused Liger kernels, reduces peak memory
assistant_only_loss=True, # loss only on assistant turns (conversational datasets)
)
GRPO:在线 RL
def reward_len(completions, **kwargs):
return [-abs(20 - len(c[0]["content"])) for c in completions]
trainer = GRPOTrainer(
model="Qwen/Qwen2.5-0.5B-Instruct",
reward_funcs=reward_len, # or a list; rewards are summed
args=GRPOConfig(output_dir="Qwen2.5-0.5B-GRPO", max_completion_length=512),
train_dataset=load_dataset("trl-lib/DeepMath-103K", split="train"),
)
奖励函数通过关键字参数接收 prompts、completions、completion_ids、trainer_state,以及数据集中的所有额外列——对于不使用的参数,请接受 **kwargs。返回 list[float],每个 completion 对应一个奖励。使用对话数据时,completions 是消息列表的列表,而不是字符串。
生成批次大小为 per_device_train_batch_size × num_processes × steps_per_generation(或直接设置 generation_batch_size),且必须能被 num_generations 整除(默认为 8)。生成通常是瓶颈——启用 vLLM:use_vllm=True:vllm_mode="colocate" 会与训练 GPU 共用资源(通过 vllm_gpu_memory_utilization 设置大小);vllm_mode="server" 则使用单独的 trl vllm-serve --model <model_id>。
AsyncGRPOTrainer(trl.experimental.async_grpo)实现了相同的算法,但将生成与训练解耦:后台工作线程从 vLLM 服务流式获取 completion,训练循环同时使用这些内容,从而让两者重叠执行,而非交替进行。
CLI
标志与配置字段一致:trl sft --model_name_or_path Qwen/Qwen2.5-0.5B --dataset_name trl-lib/Capybara。通过 --config 使用 YAML;通过 --accelerate_config zero3 使用分布式预设(Python 脚本:accelerate launch train.py)。