TRL documentation

在 AWS Trainium 上进行训练

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.17.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

在 AWS Trainium 上进行训练

AWS Trainium 通过 torch-neuronx 包原生运行 PyTorch,该包会注册 neuron 设备。TRL 训练器无需修改代码即可在其上运行。Neuron 会为遇到的每个输入形状编译一个图,每次编译大约需要一分钟,因此本页的大部分内容都涉及如何保持形状静态。有关安装和 Transformers 方面的信息,请参阅 Transformers AWS Trainium 指南。

安装

按照 AWS Neuron 设置指南 安装 torch-neuronx,然后在同一环境中安装 TRL。

pip install trl

监督微调

SFTTrainer 快速入门可直接运行:

from datasets import load_dataset
from trl import SFTTrainer

trainer = SFTTrainer(
    model="Qwen/Qwen3-0.6B",
    train_dataset=load_dataset("trl-lib/Capybara", split="train"),
)
trainer.train()

在 Neuron 上,pad_to_multiple_of 的默认值为 128(即其 "auto" 值),因此序列会被填充为 128 的倍数。这将形状的数量(进而编译的次数)限制在 max_length / 128 以内。如果没有该设置,每个新的序列长度都会触发一次编译。在单个 NeuronCore 上,当 per_device_train_batch_size=4 时,上述示例的 20 个训练步骤在使用默认设置下耗时 130 秒,而使用 pad_to_multiple_of=None 时耗时 260 秒。

所有具有 pad_to_multiple_of 选项的训练器均适用此规则:DPO、KTO、Reward、GRPO、RLOO 和 Distillation。

编译模型

将 torch_compile=True 设置为 neuron 后端以编译模型。Dynamo 的自动动态形状会生成 Neuron 后端目前尚无法编译的图(#7660),因此请将其关闭:

import torch
from datasets import load_dataset
from trl import SFTConfig, SFTTrainer

torch._dynamo.config.automatic_dynamic_shapes = False

trainer = SFTTrainer(
    model="Qwen/Qwen3-0.6B",
    args=SFTConfig(torch_compile=True),
    train_dataset=load_dataset("trl-lib/Capybara", split="train"),
)
trainer.train()

第一步的编译大约需要 2 分钟。之后,在 per_device_train_batch_size=4 的设置下,Qwen3-0.6B 在单个 NeuronCore 上的训练速度为 1.15 秒/步,而未编译时为 1.71 秒/步。

在线方法

vLLM 无法在 Neuron 上运行,因此 GRPO 和 RLOO 使用 Transformers 进行生成。使用默认的 dynamic cache 时,每个生成的 token 都具有新的形状,一个 step 需要几分钟。请使用 static cache,它保持解码形状固定:

from datasets import load_dataset
from trl import GRPOConfig, GRPOTrainer


# Reward completions close to 200 characters
def reward_len(completions, **kwargs):
    return [-abs(200 - len(completion)) / 100 for completion in completions]


trainer = GRPOTrainer(
    model="Qwen/Qwen3-0.6B",
    reward_funcs=reward_len,
    args=GRPOConfig(
        per_device_train_batch_size=4,
        num_generations=4,
        max_completion_length=128,
        cache_implementation="static",
        model_init_kwargs={"dtype": "bfloat16"},
    ),
    train_dataset=load_dataset("trl-lib/tldr", split="train"),
)
trainer.train()

提示词在生成前也会被填充至 pad_to_multiple_of,因此静态缓存只需占用少数几种尺寸。每个新尺寸在单个 NeuronCore 上仍需编译约 12 分钟;一旦某个尺寸完成编译,本示例的单步耗时约为 25 秒。

目前,静态缓存需要一个 bf16 模型:如果使用默认的 fp32 模型,键和值最终会采用不同的数据类型(#7664)。

数据并行

在包含一个 Trainium2 芯片的 trn2.3xlarge 实例上,默认的 逻辑 NeuronCore 配置(LNC=2)会将芯片的 8 个物理 NeuronCore 配对为 4 个逻辑 NeuronCore。

要在所有四个上训练,请使用 Accelerate:

accelerate launch --num_processes 4 train.py

在此配置中,SFT 在 4 个 NeuronCore 上的运行速度是在 1 个 NeuronCore 上的 3.6 倍。

要将运行限制在 NeuronCore 的子集上,请将 NEURON_RT_VISIBLE_CORES 设置为 0,1、2,3 或 0-3。其他组合(例如 1,2)不受支持:Neuron 运行时无法在这些核心之间设置集合通信。

Update on GitHub