SuperAPI AI 工具集

trl-training

智能体与模型

查看项目

更新于 10-15 18:31

技能介绍

TRL(Transformers Reinforcement Learning)用于对大语言模型进行后训练。每种方法都配有一个 Trainer 类和一个 Config 数据类,Config 继承自 transformers.TrainingArguments,因此其所有参数在任何训练器配置中均可使用。

主要训练器与数据集类型对应关系:

  • SFTTrainer:语言建模或 prompt-completion 数据
  • DPOTrainer:偏好数据(chosen/rejected 成对)
  • GRPOTrainer:仅 prompt + 奖励函数
  • DistillationTrainer:仅 prompt + 教师模型(on-policy 蒸馏)
  • KTOTrainer:非配对偏好(每条样本一个布尔标签)
  • RewardTrainer:偏好数据(chosen/rejected 成对),训练标量奖励模型而非策略模型

更多训练器(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", # 模型 ID 或 PreTrainedModel 实例 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, # 截断长度;None 表示不截断 packing=True, # 将序列打包进 max_length 块:减少填充 token,提高吞吐 padding_free=True, # 展平批次,无填充;需要 FlashAttention;packing 会隐含启用 use_liger_kernel=True, # 融合 Liger 内核,降低峰值内存 assistant_only_loss=True, # 仅在 assistant 轮次计算损失(对话式数据集) )

GRPO:在线强化学习

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, # 或列表;奖励会求和 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)。生成通常是瓶颈——可通过 use_vllm=True 启用 vLLM:vllm_mode="colocate" 共享训练 GPU(用 vllm_gpu_memory_utilization 设置大小);vllm_mode="server" 使用单独的 trl vllm-serve --model <model_id>。

AsyncGRPOTrainer(trl.experimental.async_grpo)实现相同算法,但将生成与训练解耦:后台 worker 从 vLLM 服务器流式获取 completions,训练循环同时消费它们,使两者重叠而非交替进行。

命令行: 参数与配置字段对应: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)。