📚 Módulo 7: Configuração de Treinamento com TRL (Aprendizado por Reforço de Transformadores)

7.1 O Que É TRL e Por Que Usá-lo?

TRL (Transformer Reinforcement Learning) é uma biblioteca da Hugging Face projetada para treinar modelos de linguagem com abordagens modernas, incluindo Ajuste Fino Supervisionado (SFT), RLHF (Aprendizado por Reforço a partir de Feedback Humano) e DPO (Otimização de Preferência Direta).

Para ajuste fino supervisionado com LoRA/QLoRA, usamos o SFTTrainer, que estende o Trainer padrão da Hugging Face com otimizações para geração de texto. Vantagens:

  • Tratamento automático de sequências de comprimento variável.
  • Suporte integrado para conjuntos de dados no formato Alpaca.
  • Compatibilidade nativa com PEFT e quantização.
  • Integração com ferramentas como Weights & Biases (wandb).
  • Otimizações de memória e desempenho.

7.2 Instalação e Configuração Inicial

# Instalar TRL
!pip install -q trl

# Importar componentes
from trl import SFTTrainer
from transformers import TrainingArguments

7.3 Configurar TrainingArguments

Define hiperparâmetros de treinamento: lote, épocas, taxa de aprendizado, logging, etc.

training_args = TrainingArguments(
    output_dir="./results",
    num_train_epochs=3,
    per_device_train_batch_size=4,
    gradient_accumulation_steps=4,
    optim="paged_adamw_8bit",
    save_steps=500,
    logging_steps=100,
    learning_rate=2e-4,
    weight_decay=0.01,
    fp16=True,
    bf16=False,
    max_grad_norm=0.3,
    warmup_ratio=0.03,
    lr_scheduler_type="cosine",
    report_to="wandb",
    evaluation_strategy="steps",
    eval_steps=500,
    save_total_limit=2,
    load_best_model_at_end=True,
    metric_for_best_model="eval_loss",
    greater_is_better=False,
    push_to_hub=False,
)

Notas:

  • batch_size=4 + accumulation=4 → lote efetivo de 16.
  • paged_adamw_8bit evita estouro de memória em QLoRA.
  • Use bf16=True se GPU suportar (A100/H100).
  • Substitua report_to="wandb" por "none" se não usar Weights & Biases.

7.4 Preparar o Conjunto de Dados para SFTTrainer

O SFTTrainer requer dados formatados em texto único por exemplo.

from datasets import Dataset

dataset_dict = {
    "instruction": [
        "Escreva uma descrição curta para um produto tecnológico.",
        "Resuma o seguinte texto em uma frase.",
    ],
    "input": [
        "Produto: Fones de ouvido sem fio com cancelamento de ruído. Preço: $129,99.",
        "A IA generativa está transformando indústrias como educação, entretenimento e saúde ao permitir a criação automatizada de conteúdo de alta qualidade.",
    ],
    "output": [
        "Aproveite sua música sem distrações com estes fones de ouvido sem fio de alta fidelidade. Com cancelamento ativo de ruído e até 30 horas de duração da bateria, são ideais para viajar, trabalhar ou simplesmente relaxar. Apenas $129,99.",
        "A IA generativa está revolucionando setores-chave ao automatizar a criação de conteúdo de alta qualidade.",
    ]
}

dataset = Dataset.from_dict(dataset_dict)

def formatting_prompts_func(examples):
    instructions = examples["instruction"]
    inputs = examples["input"]
    outputs = examples["output"]
    texts = []
    for instruction, input_text, output in zip(instructions, inputs, outputs):
        text = f"### Instrução:\n{instruction}\n\n### Entrada:\n{input_text}\n\n### Resposta:\n{output}"
        texts.append(text)
    return texts

7.5 Criar e Iniciar o SFTTrainer

trainer = SFTTrainer(
    model=model,
    args=training_args,
    train_dataset=dataset,
    formatting_func=formatting_prompts_func,
    max_seq_length=512,
    tokenizer=tokenizer,
    packing=False,
)

trainer.train()

Observação: Para conjuntos grandes, separe train_dataset e eval_dataset e passe ambos ao treinador. Aqui, para simplificação, usamos apenas treinamento.

Course Info

Course: AI-course3

Language: PT

Lesson: Module7