mcpField
T
trl-training

trl-training

github.com/huggingface开发11.2k917 次安装5 天前更新
代码仓库

关于 trl-training

面向语言模型开发者的训练技能,介绍 TRL 中用于监督微调、偏好优化、在线强化学习、蒸馏和奖励建模的 Trainer,并说明配置与命令行训练方式。

主要功能

  1. 01SFT、DPO、GRPO 等 Trainer
  2. 02偏好与奖励模型训练
  3. 03序列打包和免填充选项
  4. 04LoRA 配置支持
  5. 05TRL 命令行训练

适用场景

  1. 01用对话数据微调语言模型
  2. 02根据优选与拒绝回答进行训练
  3. 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)。

评论

支持 Markdown