Skip to content
Back to skills

Post Training Grpo Rl Training

ASecurity

Orientação especializada para ajuste fino com GRPO/RL usando TRL para treinamento de modelos com raciocínio e tarefas específicas

  • 11 stars
  • 0 votes
  • 0 copies
  • 5 views
  • Added September 8, 2026
developmentpythongogitapi

Works with

  • api

Security analysis

A100/100

Pro scans all 4 files and shows the line behind each finding

Scanned September 8, 2026

npx -y skills add artubss/SKILLS-CLAUDE-CODE --skill post-training-grpo-rl-training --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Post Training Grpo Rl Training?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Post Training Grpo Rl Training
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/artubss-post-training-grpo-rl-training/badge)](https://www.skillsdirectory.com/skills/artubss-post-training-grpo-rl-training)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: grpo-rl-training
description: Orientação especializada para ajuste fino com GRPO/RL usando TRL para treinamento de modelos com raciocínio e tarefas específicas
version: 1.0.0
author: Orchestra Research
license: MIT
tags: [Post-Training, Reinforcement Learning, GRPO, TRL, RLHF, Reward Modeling, Reasoning, DPO, PPO, Structured Output]
dependencies: [transformers>=4.47.0, trl>=0.14.0, datasets>=3.2.0, peft>=0.14.0, torch]
---

# Treinamento GRPO/RL com TRL

Orientação em nível especializado para implementar Group Relative Policy Optimization (GRPO) usando a biblioteca Transformer Reinforcement Learning (TRL). Esta skill fornece padrões testados em produção, insights críticos e workflows prontos para produção no ajuste fino de modelos de linguagem com funções de recompensa customizadas.

## Quando Usar Esta Skill

Use treinamento GRPO quando precisar:
- **Impor formatos de saída específicos** (ex: tags XML, JSON, raciocínio estruturado)
- **Ensinar tarefas verificáveis** com métricas de correção objetivas (matemática, coding, verificação de fatos)
- **Melhorar capacidades de raciocínio** recompensando padrões chain-of-thought
- **Alinhar modelos a comportamentos específicos de domínio** sem dados de preferência rotulados
- **Otimizar múltiplos objetivos** simultaneamente (formato + correção + estilo)

**NÃO use GRPO para:**
- Tarefas simples de ajuste fino supervisionado (use SFT em vez disso)
- Tarefas sem sinais de recompensa claros
- Quando você já possui pares de preferência de alta qualidade (use DPO/PPO em vez disso)

---

## Conceitos Fundamentais

### 1. Fundamentos do Algoritmo GRPO

**Mecanismo Chave:**
- Gera **múltiplas conclusões** para cada prompt (tamanho do grupo: 4-16)
- Compara conclusões dentro de cada grupo usando funções de recompensa
- Atualiza a política para favorecer respostas com recompensa maior em relação ao grupo

**Diferença Crítica do PPO:**
- Não requer modelo de recompensa separado
- Mais eficiente em amostragem (aprende de comparações dentro do grupo)
- Mais simples de implementar e debugar

**Intuição Matemática:**
```
Para cada prompt p:
  1. Gera N conclusões: {c₁, c₂, ..., cₙ}
  2. Calcula recompensas: {r₁, r₂, ..., rₙ}
  3. Aprende a aumentar a probabilidade de conclusões com alta recompensa
     relativas às de baixa recompensa no mesmo grupo
```

### 2. Filosofia de Design de Função de Recompensa

**Regras de Ouro:**
1. **Componha múltiplas funções de recompensa** - Cada uma lida com um aspecto (formato, correção, estilo)
2. **Dimensione recompensas apropriadamente** - Peso maior = sinal mais forte
3. **Use recompensas incrementais** - Crédito parcial para conformidade parcial
4. **Teste recompensas independentemente** - Debugue cada função em isolamento

**Tipos de Função de Recompensa:**

| Tipo | Caso de Uso | Peso Exemplo |
|------|----------|----------------|
| **Correção** | Tarefas verificáveis (matemática, código) | 2.0 (maior) |
| **Formato** | Imposição de estrutura rigorosa | 0.5-1.0 |
| **Comprimento** | Encorajar verbosidade/concisão | 0.1-0.5 |
| **Estilo** | Penalizar padrões indesejados | -0.5 a 0.5 |

---

## Workflow de Implementação

### Passo 1: Preparação de Dataset

**Requisitos Críticos:**
- Prompts em formato chat (lista de dicts com 'role' e 'content')
- Incluir prompts de sistema para definir expectativas
- Para tarefas verificáveis, incluir respostas de verdade fundamental como colunas adicionais

**Exemplo de Estrutura:**
```python
from datasets import load_dataset, Dataset

SYSTEM_PROMPT = """
Responda no seguinte formato:
<reasoning>
[Seu pensamento passo a passo]
</reasoning>
<answer>
[Resposta final]
</answer>
"""

def prepare_dataset(raw_data):
    """
    Transforma dados brutos em formato compatível com GRPO.

    Retorna: Dataset com colunas:
    - 'prompt': List[Dict] com role/content (mensagens de sistema + usuário)
    - 'answer': str (verdade fundamental, opcional mas recomendado)
    """
    return raw_data.map(lambda x: {
        'prompt': [
            {'role': 'system', 'content': SYSTEM_PROMPT},
            {'role': 'user', 'content': x['question']}
        ],
        'answer': extract_answer(x['raw_answer'])
    })
```

**Dicas Profissionais:**
- Use exemplos one-shot ou few-shot no prompt de sistema para formatos complexos
- Mantenha prompts concisos (max_prompt_length: 256-512 tokens)
- Valide qualidade de dados antes do treinamento (lixo dentro = lixo fora)

### Passo 2: Implementação de Função de Recompensa

**Estrutura de Template:**
```python
def reward_function_name(
    prompts,        # List[List[Dict]]: Prompts originais
    completions,    # List[List[Dict]]: Gerações do modelo
    answer=None,    # Opcional: Verdade fundamental do dataset
    **kwargs        # Colunas adicionais do dataset
) -> list[float]:
    """
    Avalia conclusões e retorna recompensas.

    Retorna: Lista de floats (um por conclusão)
    """
    # Extrai texto de conclusão
    responses = [comp[0]['content'] for comp in completions]

    # Calcula recompensas
    rewards = []
    for response in responses:
        score = compute_score(response)
        rewards.append(score)

    return rewards
```

**Exemplo 1: Recompensa de Correção (Matemática/Coding)**
```python
def correctness_reward(prompts, completions, answer, **kwargs):
    """Recompensa respostas corretas com score alto."""
    responses = [comp[0]['content'] for comp in completions]
    extracted = [extract_final_answer(r) for r in responses]
    return [2.0 if ans == gt else 0.0
            for ans, gt in zip(extracted, answer)]
```

**Exemplo 2: Recompensa de Formato (Saída Estruturada)**
```python
import re

def format_reward(completions, **kwargs):
    """Recompensa formato estruturado tipo XML."""
    pattern = r'<reasoning>.*?</reasoning>\s*<answer>.*?</answer>'
    responses = [comp[0]['content'] for comp in completions]
    return [1.0 if re.search(pattern, r, re.DOTALL) else 0.0
            for r in responses]
```

**Exemplo 3: Recompensa de Formato Incremental (Crédito Parcial)**
```python
def incremental_format_reward(completions, **kwargs):
    """Concede crédito parcial para conformidade de formato."""
    responses = [comp[0]['content'] for comp in completions]
    rewards = []

    for r in responses:
        score = 0.0
        if '<reasoning>' in r:
            score += 0.25
        if '</reasoning>' in r:
            score += 0.25
        if '<answer>' in r:
            score += 0.25
        if '</answer>' in r:
            score += 0.25
        # Penaliza texto extra após tag de fechamento
        if r.count('</answer>') == 1:
            extra_text = r.split('</answer>')[-1].strip()
            score -= len(extra_text) * 0.001
        rewards.append(score)

    return rewards
```

**Insight Crítico:**
Combine 3-5 funções de recompensa para treinamento robusto. A ordem importa menos que a diversidade de sinais.

### Passo 3: Configuração de Treinamento

**Config Otimizada para Memória (GPU Pequena)**
```python
from trl import GRPOConfig

training_args = GRPOConfig(
    output_dir="outputs/grpo-model",

    # Taxa de aprendizado
    learning_rate=5e-6,          # Menor = mais estável
    adam_beta1=0.9,
    adam_beta2=0.99,
    weight_decay=0.1,
    warmup_ratio=0.1,
    lr_scheduler_type='cosine',

    # Configurações de batch
    per_device_train_batch_size=1,
    gradient_accumulation_steps=4,  # Batch efetivo = 4

    # Específico de GRPO
    num_generations=8,            # Tamanho do grupo: 8-16 recomendado
    max_prompt_length=256,
    max_completion_length=512,

    # Duração do treinamento
    num_train_epochs=1,
    max_steps=None,               # Ou defina passos fixos (ex: 500)

    # Otimização
    bf16=True,                    # Mais rápido em A100/H100
    optim="adamw_8bit",          # Otimizador eficiente em memória
    max_grad_norm=0.1,

    # Logging
    logging_steps=1,
    save_steps=100,
    report_to="wandb",            # Ou "none" para sem logging
)
```

**Config de Alto Desempenho (GPU Grande)**
```python
training_args = GRPOConfig(
    output_dir="outputs/grpo-model",
    learning_rate=1e-5,
    per_device_train_batch_size=4,
    gradient_accumulation_steps=2,
    num_generations=16,           # Grupos maiores = sinal melhor
    max_prompt_length=512,
    max_completion_length=1024,
    num_train_epochs=1,
    bf16=True,
    use_vllm=True,                # Geração rápida com vLLM
    logging_steps=10,
)
```

**Hiperparâmetros Críticos:**

| Parâmetro | Impacto | Dica de Ajuste |
|-----------|--------|----------------|
| `num_generations` | Tamanho do grupo para comparação | Comece com 8, aumente para 16 se GPU permitir |
| `learning_rate` | Velocidade de convergência/estabilidade | 5e-6 (seguro), 1e-5 (mais rápido, arriscado) |
| `max_completion_length` | Verbosidade de saída | Corresponda sua tarefa (512 para raciocínio, 256 para respostas curtas) |
| `gradient_accumulation_steps` | Tamanho de batch efetivo | Aumente se memória de GPU limitada |

### Passo 4: Setup de Modelo e Treinamento

**Setup Padrão (Transformers)**
```python
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig
from trl import GRPOTrainer

# Carrega modelo
model_name = "Qwen/Qwen2.5-1.5B-Instruct"
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.bfloat16,
    attn_implementation="flash_attention_2",  # 2-3x mais rápido
    device_map="auto"
)

tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token

# Opcional: LoRA para treinamento eficiente em parâmetros
peft_config = LoraConfig(
    r=16,                         # Rank (maior = mais capacidade)
    lora_alpha=32,               # Fator de escala (tipicamente 2*r)
    target_modules=[
        "q_proj", "k_proj", "v_proj", "o_proj",
        "gate_proj", "up_proj", "down_proj"
    ],
    task_type="CAUSAL_LM",
    lora_dropout=0.05,
)

# Inicializa trainer
trainer = GRPOTrainer(
    model=model,
    processing_class=tokenizer,
    reward_funcs=[
        incremental_format_reward,
        format_reward,
        correctness_reward,
    ],
    args=training_args,
    train_dataset=dataset,
    peft_config=peft_config,      # Remova para ajuste fino completo
)

# Treina
trainer.train()

# Salva
trainer.save_model("final_model")
```

**Setup Unsloth (2-3x Mais Rápido)**
```python
from unsloth import FastLanguageModel

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name="google/gemma-3-1b-it",
    max_seq_length=1024,
    load_in_4bit=True,
    fast_inference=True,
    max_lora_rank=32,
)

model = FastLanguageModel.get_peft_model(
    model,
    r=32,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
                    "gate_proj", "up_proj", "down_proj"],
    lora_alpha=32,
    use_gradient_checkpointing="unsloth",
)

# O resto é idêntico ao setup padrão
trainer = GRPOTrainer(model=model, ...)
trainer.train()
```

---

## Insights Críticos de Treinamento

### 1. Comportamento de Loss (PADRÃO ESPERADO)
- **Loss começa perto de 0 e AUMENTA durante treinamento**
- Isto é CORRETO - loss mede divergência KL da política inicial
- O modelo está aprendendo (divergindo do comportamento original para otimizar recompensas)
- Monitore métricas de recompensa em vez de loss para acompanhar progresso

### 2. Rastreamento de Recompensa
Métricas principais a acompanhar:
- `reward`: Média em todas as conclusões
- `reward_std`: Diversidade dentro de grupos (deve permanecer > 0)
- `kl`: Divergência KL de referência (deve crescer moderadamente)

**Padrão de Treinamento Saudável:**
```
Passo   Recompensa    Recompensa_Std   KL
100    0.5       0.3          0.02
200    0.8       0.25         0.05
300    1.2       0.2          0.08  ← Progressão boa
400    1.5       0.15         0.12
```

**Sinais de Aviso:**
- Recompensa std → 0 (modelo colapsando para resposta única)
- KL explodindo (> 0.5) (divergindo muito, reduza LR)
- Recompensa presa (funções de recompensa muito rigorosas ou problema de capacidade do modelo)

### 3. Armadilhas Comuns e Soluções

| Problema | Sintoma | Solução |
|---------|---------|----------|
| **Colapso de modo** | Todas as conclusões idênticas | Aumente `num_generations`, adicione penalidade de diversidade |
| **Sem aprendizado** | Recompensas planas | Verifique lógica de função de recompensa, aumente LR |
| **Erros OOM** | Memória de GPU excedida | Reduza `num_generations`, ative gradient checkpointing |
| **Treinamento lento** | < 1 it/s | Ative `use_vllm=True`, use Unsloth, reduza tamanho de seq |
| **Formato ignorado** | Modelo não segue estrutura | Aumente peso de recompensa de formato, adicione recompensas incrementais |

---

## Padrões Avançados

### 1. Treinamento em Multi-Estágios
Para tarefas complexas, treine em estágios:

```python
# Estágio 1: Conformidade de formato (epochs=1)
trainer_stage1 = GRPOTrainer(
    model=model,
    reward_funcs=[incremental_format_reward, format_reward],
    ...
)
trainer_stage1.train()

# Estágio 2: Correção (epochs=1)
trainer_stage2 = GRPOTrainer(
    model=model,
    reward_funcs=[format_reward, correctness_reward],
    ...
)
trainer_stage2.train()
```

### 2. Dimensionamento Adaptativo de Recompensa
```python
class AdaptiveReward:
    def __init__(self, base_reward_func, initial_weight=1.0):
        self.func = base_reward_func
        self.weight = initial_weight

    def __call__(self, *args, **kwargs):
        rewards = self.func(*args, **kwargs)
        return [r * self.weight for r in rewards]

    def adjust_weight(self, success_rate):
        """Aumenta peso se modelo com dificuldade, diminui se sucessos."""
        if success_rate < 0.3:
            self.weight *= 1.2
        elif success_rate > 0.8:
            self.weight *= 0.9
```

### 3. Integração Customizada de Dataset
```python
def load_custom_knowledge_base(csv_path):
    """Exemplo: Docs de plataforma de comunicação escolar."""
    import pandas as pd
    df = pd.read_csv(csv_path)

    dataset = Dataset.from_pandas(df).map(lambda x: {
        'prompt': [
            {'role': 'system', 'content': CUSTOM_SYSTEM_PROMPT},
            {'role': 'user', 'content': x['question']}
        ],
        'answer': x['expert_answer']
    })
    return dataset
```

---

## Deployment e Inference

### Salvar e Mesclar LoRA
```python
# Mescla adaptadores LoRA no modelo base
if hasattr(trainer.model, 'merge_and_unload'):
    merged_model = trainer.model.merge_and_unload()
    merged_model.save_pretrained("production_model")
    tokenizer.save_pretrained("production_model")
```

### Exemplo de Inference
```python
from transformers import pipeline

generator = pipeline(
    "text-generation",
    model="production_model",
    tokenizer=tokenizer
)

result = generator(
    [
        {'role': 'system', 'content': SYSTEM_PROMPT},
        {'role': 'user', 'content': "Quanto é 15 + 27?"}
    ],
    max_new_tokens=256,
    do_sample=True,
    temperature=0.7,
    top_p=0.9
)
print(result[0]['generated_text'])
```

---

## Checklist de Melhores Práticas

**Antes do Treinamento:**
- [ ] Valide formato de dataset (prompts como List[Dict])
- [ ] Teste funções de recompensa em dados de amostra
- [ ] Calcule max_prompt_length esperado dos dados
- [ ] Escolha num_generations apropriado baseado em memória de GPU
- [ ] Configure logging (wandb recomendado)

**Durante o Treinamento:**
- [ ] Monitore progressão de recompensa (deve aumentar)
- [ ] Verifique reward_std (deve permanecer > 0.1)
- [ ] Observe erros de OOM (reduza batch size se necessário)
- [ ] Amostre gerações a cada 50-100 passos
- [ ] Valide conformidade de formato em conjunto de retenção

**Após o Treinamento:**
- [ ] Mescle pesos de LoRA se usando PEFT
- [ ] Teste em prompts diversos
- [ ] Compare ao modelo baseline
- [ ] Documente pesos de recompensa e hiperparâmetros
- [ ] Salve config de reprodutibilidade

---

## Guia de Troubleshooting

### Workflow de Debug
1. **Isole funções de recompensa** - Teste cada uma independentemente
2. **Verifique distribuição de dados** - Garanta diversidade em prompts
3. **Reduza complexidade** - Comece com recompensa única, adicione gradualmente
4. **Monitore gerações** - Imprima amostras a cada N passos
5. **Valide lógica de extração** - Garanta que parsing de resposta funciona

### Correções Rápidas
```python
# Debug de função de recompensa
def debug_reward(completions, **kwargs):
    responses = [comp[0]['content'] for comp in completions]
    for i, r in enumerate(responses[:2]):  # Imprime as 2 primeiras
        print(f"Resposta {i}: {r[:200]}...")
    return [1.0] * len(responses)  # Recompensas dummy

# Teste sem treinamento
trainer = GRPOTrainer(..., reward_funcs=[debug_reward])
trainer.generate_completions(dataset[:1])  # Gera sem atualizar
```

---

## Referências e Recursos

**Documentação Oficial:**
- TRL GRPO Trainer: https://huggingface.co/docs/trl/grpo_trainer
- Artigo DeepSeek R1: https://arxiv.org/abs/2501.12948
- Docs Unsloth: https://docs.unsloth.ai/

**Repositórios de Exemplo:**
- Implementação Open R1: https://github.com/huggingface/open-r1
- Exemplos TRL: https://github.com/huggingface/trl/tree/main/examples

**Leitura Recomendada:**
- Padrão de Progressive Disclosure para instruções de agent
- Reward shaping em RL (Ng et al.)
- Artigo LoRA (Hu et al., 2021)

---

## Instruções de Uso para Agents

Quando esta skill é carregada:

1. **Leia este arquivo inteiro** antes de implementar treinamento GRPO
2. **Comece com a função de recompensa mais simples** (ex: baseada em comprimento) para validar setup
3. **Use os templates** no diretório `templates/` como pontos de partida
4. **Referencie exemplos** em `examples/` para implementações específicas de tarefa
5. **Siga o workflow** sequencialmente (não pule passos)
6. **Debugue incrementalmente** - adicione uma função de recompensa por vez

**Lembretes Críticos:**
- Sempre use múltiplas funções de recompensa (3-5 é ótimo)
- Monitore métricas de recompensa, não loss
- Teste funções de recompensa antes do treinamento
- Comece pequeno (num_generations=4), dimensione gradualmente
- Salve checkpoints frequentemente (a cada 100 passos)

Esta skill é projetada para **implementação em nível especializado**. Iniciantes devem começar com ajuste fino supervisionado antes de tentar GRPO.

Files in this skill

  • README.md3.4 KB
  • SKILL.md18.1 KB
  • examples/reward_functions_library.py11.3 KB
  • templates/basic_grpo_training.py6 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

View all in development →

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.