trl-training — Claude Code skill: what it does, how to install
Helps write and debug TRL post-training code for language models, including SFT, DPO, GRPO, KTO and reward-model training.
npx skills add huggingface/skills --skill trl-training -a claude-codeWhat trl-training does
This skill guides work with the TRL Python API and CLI for post-training language models. It covers SFTTrainer, DPOTrainer, GRPOTrainer, DistillationTrainer, KTOTrainer, and RewardTrainer; their configuration classes extend transformers.TrainingArguments.
It maps training methods to dataset shapes: chosen/rejected pairs for DPO, prompts plus reward functions for GRPO, and per-sample preference labels for KTO. Chat templates are applied automatically to conversational data, so applying them manually is a mistake. Trainers under trl.experimental have unstable APIs, which matters if your code depends on a fixed interface.
For SFT, it covers max_length, sequence packing, padding_free, Liger kernels, and assistant-only loss. For GRPO, reward functions return a list[float] per completion, while the generation batch must divide by num_generations, which defaults to 8. It also covers trl sft, YAML configuration, and accelerate launches.
What it helps with
- write SFT code with
SFTTrainerandSFTConfig - format preference pairs for
DPOTrainer - implement a reward function for
GRPOTrainer - configure LoRA with
peft_config=LoraConfig(...) - run training through
trl sft
Example prompts for the agent
- Help me write SFT training code with
SFTTrainerfor my dataset. - Review my
GRPOTrainerreward function: why does it receive conversational completions? - Build a
trl sftcommand using a YAML config and--accelerate_config zero3.
How to install trl-training
1Skills CLI (Vercel)
npx skills add huggingface/skills --skill trl-training -a claude-code2Manually: put the files in place
~/.claude/skills/trl-training/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/trl-training/
1Skills CLI (Vercel)
npx skills add huggingface/skills --skill trl-training -a codex2Manually: put the files in place
.agents/skills/trl-training/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add huggingface/skills --skill trl-training -a cursor2Manually: put the files in place
.cursor/skills/trl-training/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install huggingface/skills trl-training2Manually: put the files in place
.github/skills/trl-training/SKILL.md1Skills CLI (Vercel)
npx skills add huggingface/skills --skill trl-training -a gemini-cli2Platform CLI
gemini skills install https://github.com/huggingface/skills --path skills/trl-trainingManually: put the files in place
.devin/skills/trl-training/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add huggingface/skills --skill trl-training -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about trl-training
How do I install trl-training in Claude Code?
Run npx skills add huggingface/skills --skill trl-training -a claude-code. The skill is available at ~/.claude/skills/trl-training/SKILL.md.
What does trl-training do?
It is a skill for writing and debugging TRL post-training code. It covers SFT, DPO, GRPO, KTO, distillation, and reward-model training.
What should I account for when using GRPO?
Reward functions return a list[float], with one value for each completion. The generation batch must be divisible by num_generations; generation can use vLLM through use_vllm=True.
Source text
SKILL.md · Apache-2.0
---
name: trl-training
description: Post-train LLMs with TRL (Transformers Reinforcement Learning) — SFT, DPO, GRPO, KTO, and reward-model training. Use when writing or debugging training code with the TRL Python API or the trl CLI.
license: Apache-2.0
metadata:
author: huggingface
documentation: https://huggingface.co/docs/trl
---
# TRL
Each method pairs a `*Trainer` class with a `*Config` dataclass. Configs extend `transformers.TrainingArguments`, so all of its arguments work in any trainer config.
| Trainer | Dataset type |
|---|---|
| `SFTTrainer` | language modeling or prompt-completion |
| `DPOTrainer` | preference (chosen/rejected pairs) |
| `GRPOTrainer` | prompt-only + reward function(s) |
| `DistillationTrainer` | prompt-only + a teacher model (on-policy distillation) |
| `KTOTrainer` | unpaired preference (per-sample bool label) |
| `RewardTrainer` | preference (chosen/rejected pairs); trains a scalar reward model, not a policy |
Many more trainers (OnlineDPO, ORPO, CPO, GKD, …) live in `trl.experimental` with unstable APIs: https://huggingface.co/docs/trl/experimental_overview
```python
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()
```
Pass `model` as a string and route loading kwargs through `model_init_kwargs` (e.g. `{"dtype": "bfloat16", "attn_implementation": "kernels-community/flash-attn2"}`) instead of calling `from_pretrained` yourself. The tokenizer/processor is inferred from the model; pass `processing_class` only when it differs. For LoRA, pass `peft_config=LoraConfig(...)`.
## Dataset formats
Conversational: `{"messages": [{"role": ..., "content": ...}]}` (language modeling) or `{"prompt": [...], "completion": [...]}`. The chat template is applied automatically — never apply it yourself. Extra columns are allowed; GRPO forwards them to reward functions. Reference: https://huggingface.co/docs/trl/dataset_formats
## SFT: the fields that matter
```python
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: online RL
```python
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"),
)
```
Reward functions are called with keyword arguments `prompts`, `completions`, `completion_ids`, `trainer_state`, plus every extra dataset column — accept `**kwargs` for the ones you ignore. Return `list[float]`, one reward per completion. With conversational data, `completions` is a list of message lists, not strings.
The generation batch is `per_device_train_batch_size × num_processes × steps_per_generation` (or set `generation_batch_size` directly) and must be divisible by `num_generations` (default 8). Generation is the usual bottleneck — enable vLLM with `use_vllm=True`: `vllm_mode="colocate"` shares the training GPUs (size with `vllm_gpu_memory_utilization`); `vllm_mode="server"` uses a separate `trl vllm-serve --model <model_id>`.
`AsyncGRPOTrainer` (`trl.experimental.async_grpo`) implements the same algorithm with generation decoupled from training: a background worker streams completions from a vLLM server while the training loop consumes them, so the two overlap instead of alternating.
## CLI
Flags mirror the config fields: `trl sft --model_name_or_path Qwen/Qwen2.5-0.5B --dataset_name trl-lib/Capybara`. YAML via `--config`; distributed presets via `--accelerate_config zero3` (Python scripts: `accelerate launch train.py`).
© huggingface · Apache-2.0 · huggingface/skills