TRL documentation

Entrenamiento en 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

Entrenamiento en AWS Trainium

AWS Trainium ejecuta PyTorch de forma nativa a través del paquete torch-neuronx, que registra el dispositivo neuron. Los entrenadores de TRL funcionan en él sin cambios de código. Neuron compila un grafo para cada forma de entrada que detecta, y cada compilación tarda aproximadamente un minuto, por lo que la mayor parte de esta página se centra en mantener las formas estáticas. Para la instalación y el lado de Transformers, consulte la guía de AWS Trainium para Transformers.

Instalación

Instale torch-neuronx siguiendo la guía de configuración de AWS Neuron y, a continuación, instale TRL en el mismo entorno.

pip install trl

Ajuste fino supervisado

La guía de inicio rápido de SFTTrainer se ejecuta tal cual:

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()

En Neuron, pad_to_multiple_of tiene un valor predeterminado de 128 (su valor "auto"), por lo que las secuencias se rellenan hasta un múltiplo de 128. Esto limita el número de formas, y por tanto de compilaciones, a max_length / 128. Sin ello, cada nueva longitud de secuencia provoca una compilación. En un NeuronCore, con per_device_train_batch_size=4, 20 pasos del ejemplo anterior tardan 130 s con el valor predeterminado y 260 s con pad_to_multiple_of=None.

Lo mismo aplica a cada entrenador que tenga la opción pad_to_multiple_of: DPO, KTO, Reward, GRPO, RLOO y Distillation.

Compilar el modelo

Establezca torch_compile=True para compilar el modelo con el backend neuron. Las formas dinámicas automáticas de Dynamo generan grafos que el backend Neuron aún no puede compilar (#7660), así que desactívelas:

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()

El primer paso compila durante aproximadamente 2 minutos. Después de eso, con per_device_train_batch_size=4, Qwen3-0.6B entrena a 1.15 s/paso en un solo NeuronCore, frente a 1.71 s/paso sin compilación.

Métodos en línea

vLLM no se ejecuta en Neuron, por lo que GRPO y RLOO generan con Transformers. Con la caché dinámica predeterminada, cada token generado tiene una forma nueva y un paso tarda varios minutos. Utilice la caché estática, que mantiene las formas de decodificación fijas:

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()

Los prompts también se rellenan hasta pad_to_multiple_of antes de la generación, por lo que la caché estática solo ocupa unos pocos tamaños. Cada nuevo tamaño aún se compila durante unos 12 minutos en un NeuronCore; una vez que un tamaño está compilado, un paso de este ejemplo tarda unos 25 s.

La caché estática requiere un modelo bf16 por ahora: con el modelo fp32 predeterminado, las claves y los valores terminan en diferentes dtypes (#7664).

Paralelismo de datos

En una instancia trn2.3xlarge, que contiene un chip Trainium2, la configuración predeterminada de NeuronCore lógicos (LNC=2) agrupa los 8 NeuronCore físicos del chip en 4 NeuronCore lógicos.

Para entrenar en los cuatro, inicie un proceso por NeuronCore con torchrun:

torchrun --nproc_per_node 4 train.py

En esta configuración, SFT se ejecuta 3,6 veces más rápido en 4 NeuronCores que en 1.

Para restringir una ejecución a un subconjunto de NeuronCores, establezca NEURON_RT_VISIBLE_CORES en 0,1, 2,3 o 0-3. Otras combinaciones, como 1,2, no se admiten: el runtime de Neuron no puede configurar los colectivos entre ellas.

Update on GitHub