TRL documentation
Treinador GRPO
Treinador GRPO
Visão geral
O TRL oferece suporte ao GRPO Trainer para o treinamento de modelos de linguagem, conforme descrito no artigo DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models, de Zhihong Shao, Peiyi Wang, Qihao Zhu, Runxin Xu, Junxiao Song, Mingchuan Zhang, Y. K. Li, Y. Wu, Daya Guo.
O resumo do artigo é o seguinte:
O raciocínio matemático representa um desafio significativo para os modelos de linguagem devido à sua natureza complexa e estruturada. Neste artigo, apresentamos o DeepSeekMath 7B, que continua o pré-treinamento do DeepSeek-Coder-Base-v1.5 7B com 120B de tokens relacionados a matemática obtidos do Common Crawl, juntamente com dados de linguagem natural e código. O DeepSeekMath 7B alcançou uma impressionante pontuação de 51,7% no benchmark de nível competitivo MATH, sem recorrer a toolkits externos e técnicas de votação, aproximando-se do nível de desempenho do Gemini-Ultra e do GPT-4. A autoconsistência sobre 64 amostras do DeepSeekMath 7B atinge 60,9% no MATH. A capacidade de raciocínio matemático do DeepSeekMath é atribuída a dois fatores-chave: primeiro, aproveitamos o potencial significativo dos dados web publicamente disponíveis por meio de um pipeline de seleção de dados meticulosamente projetado. Segundo, introduzimos a Group Relative Policy Optimization (GRPO), uma variante da Proximal Policy Optimization (PPO), que aprimora as habilidades de raciocínio matemático enquanto otimiza simultaneamente o uso de memória da PPO.
Este método de pós-treinamento foi contribuído por Quentin Gallouédec.
Início rápido
Este exemplo demonstra como treinar um modelo usando o método GRPO. Treinamos um modelo Qwen2.5 0.5B Instruct com os prompts do conjunto de dados DeepMath-103K. Você pode visualizar os dados do conjunto de dados aqui:
Abaixo está o script para treinar o modelo. accuracy_reward precisa do math-verify, que você pode instalar com pip install trl[math_verify].
# train_grpo.py
from datasets import load_dataset
from trl import GRPOTrainer
from trl.rewards import accuracy_reward
dataset = load_dataset("trl-lib/DeepMath-103K", split="train")
trainer = GRPOTrainer(
model="Qwen/Qwen2.5-0.5B-Instruct",
reward_funcs=accuracy_reward,
train_dataset=dataset,
)
trainer.train()Execute o script usando o seguinte comando:
torchrun --nproc_per_node 8 train_grpo.py
Distribuído em 8 GPUs, o treinamento leva aproximadamente 1 dia.

Observação: As curvas de recompensa acima foram geradas com
Qwen/Qwen2-0.5B-Instruct. Os resultados comQwen/Qwen2.5-0.5B-Instructserão qualitativamente semelhantes.
Olhando mais a fundo para o método GRPO
GRPO é um algoritmo de aprendizado online, o que significa que ele melhora iterativamente usando os dados gerados pelo próprio modelo treinado durante o treinamento. A intuição por trás do objetivo do GRPO é maximizar a vantagem das conclusões geradas, garantindo que o modelo permaneça próximo da política de referência. Para entender como o GRPO funciona, ele pode ser dividido em quatro etapas principais: gerar conclusões, calcular a vantagem, estimar a divergência de KL e calcular a perda.

Gerando complementos
Em cada etapa de treinamento, amostramos um lote de prompts e geramos um conjunto de completions para cada prompt (denotado como ).
Calculando a vantagem
Para cada uma das sequências, calculamos a recompensa usando um modelo de recompensa ou uma função de recompensa. Para estar alinhado com a natureza comparativa dos modelos de recompensa — geralmente treinados em conjuntos de dados de comparações entre saídas para a mesma pergunta —, a vantagem é calculada para refletir essas comparações relativas. Ela é normalizada da seguinte forma:
Essa abordagem dá nome ao método: Group Relative Policy Optimization (GRPO).
Foi demonstrado no artigo Understanding R1-Zero-Like Training: A Critical Perspective que a escalação por pode causar um viés de dificuldade no nível da pergunta. Você pode desativar essa escalação definindo
scale_rewards=Falseem GRPOConfig. Observe que desativar a escalação baseada em std também remove a normalização de variância, de modo que as magnitudes das atualizações dependem diretamente da escala bruta da recompensa e da composição do lote.
Como mostrado em Parte I: Truques ou Armadilhas? Uma Análise Aprofundada do RL para Raciocínio de LLMs (Lite PPO), calcular a média no nível local (grupo) e o desvio padrão no nível global (lote) permite um ajuste de recompensa mais robusto. Você pode usar essa estratégia de escalonamento definindo
scale_rewards="batch"em GRPOConfig.
Estimando a divergência de KL
A divergência de KL é estimada usando o aproximador introduzido por Schulman et al. (2020). O aproximador é definido da seguinte forma:
Calculando a perda
O objetivo é maximizar a vantagem, garantindo que o modelo permaneça próximo da política de referência. Consequentemente, a perda é definida da seguinte forma:
onde o primeiro termo representa a vantagem escalonada e o segundo termo penaliza as desvios em relação à política de referência por meio da divergência de KL.
Observe que, em comparação com a formulação original em DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models, não escalamos por porque foi demonstrado no artigo Understanding R1-Zero-Like Training: A Critical Perspective que isso introduz um viés de comprimento no nível da resposta. Mais detalhes em tipos de perda.
Observe que, em comparação com a formulação original em DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models, usamos por padrão, o que significa que o termo de divergência KL não é utilizado. Essa escolha é motivada por vários estudos recentes (por exemplo, Open-Reasoner-Zero: An Open Source Approach to Scaling Up Reinforcement Learning on the Base Model) ) que demonstraram que o termo de divergência KL não é essencial para o treinamento com GRPO. Como resultado, tornou-se prática comum excluí-lo (por exemplo, Understanding R1-Zero-Like Training: A Critical Perspective, DAPO: An Open-Source LLM Reinforcement Learning System at Scale). Se você deseja incluir o termo de divergência KL, pode definir
betaem GRPOConfig para um valor diferente de zero.
No artigo original, essa formulação é generalizada para considerar múltiplas atualizações após cada geração (denotadas por , pode ser definido com num_iterations em GRPOConfig) aproveitando o objetivo substituto com corte:
onde garante que as atualizações não se desviem excessivamente da política de referência, limitando a razão de política entre e . Quando (padrão no TRL), o objetivo substituto com recorte simplifica-se para o objetivo original.
Tipos de Perda
Várias formulações do objetivo foram propostas na literatura. Inicialmente, o objetivo do GRPO foi definido da seguinte forma:
onde
O artigo DAPO destaca as limitações da perda em nível de amostra do algoritmo GRPO em cenários de CoT longo, onde respostas mais longas são penalizadas de forma insuficiente, resultando em saídas de menor qualidade. A solução proposta é uma normalização em nível de token, que lida melhor com sequências mais longas ao atribuir recompensas mais equilibradas aos tokens individuais, independentemente do comprimento da resposta:
Para usar essa formulação, defina loss_type="dapo" em GRPOConfig.
Além disso, foi demonstrado no artigo Understanding R1-Zero-Like Training: A Critical Perspective que a formulação inicial do GRPO introduz um viés de comprimento da resposta. Eles mostram que, embora a formulação do DAPO reduza esse viés, ela não o elimina completamente. Para remover totalmente esse viés, eles propõem dividir por uma constante em vez do comprimento da sequência, resultando na seguinte formulação:
Recomenda-se que esta constante seja o comprimento máximo de conclusão. Para usar essa formulação, defina loss_type="dr_grpo" no GRPOConfig.
Alternativamente, no artigo SAPO, a equipe do Qwen propõe substituir o mecanismo de “hard” clipping do GRPO por um mecanismo de soft gating suave e controlado por temperatura. Enquanto o GRPO zera os gradientes quando a política se desvia demais da referência, o SAPO usa uma região de confiança suave que decai o peso do gradiente de forma gradual. Isso permite que o modelo retenha sinais de aprendizado úteis de tokens “near-on-policy”, enquanto suprime o ruído proveniente de desvios extremos.
A função de perda é definida como:
A função de soft-gating é definida usando a função sigmoide como:
A temperatura é escolhida com base no sinal da vantagem :
Eles recomendam o uso de temperaturas assimétricas, (os valores padrão são ). Isso garante que o modelo seja penalizado de forma mais rigorosa por ações “ruins” para evitar instabilidade, enquanto é mais permissivo com ações “boas”.
Para usar essa formulação, defina loss_type="sapo" no GRPOConfig.
Métricas registradas
Durante o treinamento e a avaliação, registramos as seguintes métricas:
num_tokens: O número total de tokens processados até o momento, incluindo tanto prompts quanto completions. Ao usar ferramentas, apenas tokens que não são de ferramentas são contabilizados.step_time: O tempo médio (em segundos) por etapa de treinamento (incluindo a geração).completions/mean_length: O comprimento médio das conclusões geradas. Ao usar ferramentas, apenas os tokens que não são de ferramentas são contados.completions/min_length: O comprimento mínimo das conclusões geradas. Ao usar ferramentas, apenas os tokens que não são de ferramentas são contados.completions/max_length: O comprimento máximo das conclusões geradas. Ao usar ferramentas, apenas os tokens que não são de ferramentas são contados.completions/mean_terminated_length: O comprimento médio das conclusões geradas que terminam com EOS. Ao usar ferramentas, apenas os tokens que não são de ferramentas são contados.completions/min_terminated_length: O comprimento mínimo das conclusões geradas que terminam com EOS. Ao usar ferramentas, apenas os tokens que não são de ferramentas são contados.completions/max_terminated_length: O comprimento máximo das completions geradas que terminam com EOS. Ao usar ferramentas, apenas os tokens que não são de ferramentas são contados.completions/clipped_ratio: A proporção de conclusões truncadas (clipped).tools/call_frequency: O número médio de chamadas de ferramentas por conclusão no lote de geração. Registrado apenas quandotoolssão fornecidas.tools/failure_frequency: A fração de chamadas de ferramenta que falharam (a ferramenta não foi encontrada, lançou uma exceção ou o tipo de chamada não é suportado). É0.0quando nenhuma ferramenta foi chamada. Registrado apenas quandotoolssão fornecidas.rewards/{reward_func_name}/mean: A recompensa média de uma função de recompensa específica. Quando um ambiente possui a recompensa por meio deget_reward,{reward_func_name}é o nome da classe do ambiente.rewards/{reward_func_name}/std: O desvio padrão da recompensa de uma função de recompensa específica.reward: A recompensa média geral após somar as recompensas entre as funções (ponderada porreward_weights).reward_std: O desvio padrão dos recompensas somadas entre as funções (ponderado porreward_weights), calculado sobre o lote completo.frac_reward_zero_std: A fração de amostras no lote de geração com desvio padrão de recompensa igual a zero, o que implica que há pouca diversidade para aquele prompt (todas as respostas estão corretas ou incorretas).sampling/sampling_logp_difference/mean: A diferença absoluta média entre as probabilidades logarítmicas retornadas pelo amostrador (vLLM) e as recalculadas pelo modelo de treinamento, nos tokens de conclusão. Um valor crescente indica um aumento na divergência entre treinamento e inferência. Registrado apenas quandouse_vllm=Trueevllm_importance_sampling_correction=True.sampling/sampling_logp_difference/max: A maior diferença absoluta desse tipo. Registrado apenas quandouse_vllm=Trueevllm_importance_sampling_correction=True.sampling/importance_sampling_ratio/min: a menor razão de amostragem de importância usada para corrigir a divergência entre treinamento e inferência, após a aplicação da restrição selecionada porvllm_importance_sampling_mode(limitada a[C_min, C_max]para os modos*_truncate, definida como zero para os modos*_mask). Calculada sobre os tokens de conclusão, ou sobre as sequências para os modossequence_*. Registrada apenas quandouse_vllm=Trueevllm_importance_sampling_correction=True.sampling/importance_sampling_ratio/mean: A média da razão de amostragem de importância restrita. Registrado apenas quandouse_vllm=Trueevllm_importance_sampling_correction=True.sampling/importance_sampling_ratio/max: A maior razão de amostragem por importância restrita. Registrado apenas quandouse_vllm=Trueevllm_importance_sampling_correction=True.policy_loss: O valor da perda do gradiente de política (antes de qualquer bônus de entropia). Registrado quandoentropy_coefé diferente de zero ouuse_adaptive_entropy=True.entropy: Entropia média das previsões de tokens entre as conclusões geradas. (Semask_truncated_completions=True, os tokens das sequências mascaradas são excluídos.)entropy_coef: O coeficiente atual de regularização de entropia. Registrado quandoentropy_coefé diferente de zero ouuse_adaptive_entropy=True. Atualizado uma vez por passo do otimizador quandouse_adaptive_entropy=True.aux_loss: A perda auxiliar de balanceamento de carga de um modelo Mixture-of-Experts, antes de ser escalada porrouter_aux_loss_coefe adicionada à perda. Registrada apenas quando o modelo é um modelo MoE erouter_aux_loss_coefé diferente de zero.kl: A divergência KL média entre o modelo e o modelo de referência, calculada sobre as conclusões geradas. Registrado apenas sebetafor diferente de zero.clip_ratio/region_mean: A proporção de tokens (ou sequências, seimportance_sampling_level="sequence") probabilidades em que o objetivo do GRPO é limitado para permanecer dentro da região de confiança: . Um valor mais alto significa que mais tokens são limitados, o que restringe o quanto a política pode mudar.clip_ratio/low_mean: A média da razão de probabilidades de tokens (ou sequências, seimportance_sampling_level="sequence") foram cortadas no limite inferior da região de confiança: .clip_ratio/low_min: A menor fração por conclusão de tokens (ou da própria sequência, seimportance_sampling_level="sequence") for truncada no limite inferior da região de confiança: .clip_ratio/high_mean: A proporção média de probabilidades de tokens (ou sequências, seimportance_sampling_level="sequence") foram cortadas no limite superior da região de confiança: .clip_ratio/high_max: A maior fração de tokens por conclusão (ou a própria sequência, seimportance_sampling_level="sequence") for truncada no limite superior da região de confiança: .cispo_clip_ratio: A proporção de pesos de amostragem de importância de tokens (ou sequências, seimportance_sampling_level="sequence") ) que foram truncados emepsilon_highenquanto tinham uma vantagem positiva: . Registrado apenas quandoloss_type="cispo".vespo/phi_seq_mean: O valor médio da ponderação Gamma do VESPO aplicada aos pesos de importância no nível da sequência. Valores abaixo de1.0significam que as sequências estão sendo desvalorizadas. Registrado apenas quandoloss_type="vespo".
Personalização
Acelere o treinamento com geração impulsionada por vLLM
A geração é frequentemente o principal gargalo ao treinar com métodos online. Para acelerar a geração, você pode usar vLLM, um motor de inferência de alto rendimento e baixa latência para LLMs. Para ativá-lo, primeiro instale o pacote com
pip install trl[vllm]
Suportamos duas formas de usar o vLLM durante o treinamento: modo servidor e modo colocalizado.
Por padrão, a Amostragem de Importância com Máscara em nível de sequência (
vllm_importance_sampling_mode="sequence_mask") é ativada para a geração do vLLM para lidar com a incompatibilidade entre geração e treinamento que ocorre ao usar diferentes frameworks. Isso pode ser desativado definindovllm_importance_sampling_correction=False. Para mais informações, consulte Masked Importance Sampling e Sequence-level Importance Sampling
Opção 1: Modo Colocate
Neste modo, o vLLM é executado dentro do processo do trainer e compartilha a memória da GPU com o modelo de treinamento. Isso evita a inicialização de um servidor separado e pode melhorar a utilização da GPU, mas pode levar a disputas de memória nas GPUs de treinamento. Este é o modo padrão.
from trl import GRPOConfig
training_args = GRPOConfig(
...,
use_vllm=True, # vllm_mode="colocate" by default
)Opção 2: Modo servidor
Neste modo, o vLLM é executado em um processo separado (e usando GPUs separadas) e se comunica com o treinador via HTTP. Isso é ideal se você tiver GPUs dedicadas para inferência.
Inicie o servidor vLLM:
VLLM_SERVER_DEV_MODE=1 vllm serve <model_name> \ --weight-transfer-config '{"backend": "nccl"}' \ --logprobs-mode processed_logprobs \ --max-logprobs -1Ative o modo de servidor no seu script de treinamento:
from trl import GRPOConfig training_args = GRPOConfig( ..., use_vllm=True, vllm_mode="server", )
Certifique-se de que o servidor está usando GPUs diferentes das do trainer; caso contrário, você pode encontrar erros do NCCL. Você pode especificar as GPUs a serem usadas com a variável de ambiente
CUDA_VISIBLE_DEVICES.
Dependendo do tamanho do modelo e dos requisitos gerais de memória de GPU para o treinamento, você pode precisar ajustar o parâmetro
vllm_gpu_memory_utilizationem GRPOConfig para evitar subutilização ou erros de memória insuficiente.Fornecemos um HF Space para ajudar a estimar a utilização recomendada de memória de GPU com base na configuração do seu modelo e nas configurações do experimento. Basta usá-lo da seguinte forma para obter a recomendação de
vllm_gpu_memory_utilization:Se o valor recomendado não funcionar no seu ambiente, sugerimos adicionar uma pequena margem (por exemplo, +0.05 ou +0.1) ao valor recomendado para garantir estabilidade.
Se você ainda estiver recebendo erros de memória insuficiente, defina
vllm_enable_sleep_modecomo True e os parâmetros e o cache do vllm serão descarregados durante a etapa de otimização. Para mais informações, consulte Reduzindo o uso de memória com o vLLM Sleep Mode.
Por padrão, o GRPO usa
MASTER_ADDR=localhosteMASTER_PORT=12345para o vLLM, mas você pode sobrescrever esses valores definindo as variáveis de ambiente de acordo.
Para mais informações, consulte Aceleração do treinamento com vLLM.
Lidando com a Divergência entre Treinamento e Inferência
Embora o vLLM acelere significativamente a inferência, ele também desacopla o motor de inferência do motor de treinamento. Em teoria, esses motores são matematicamente idênticos, mas, na prática, podem produzir saídas diferentes devido a efeitos de precisão e otimizações específicas de hardware. Essa divergência reflete os diferentes objetivos de otimização dos dois sistemas. Os motores de inferência visam maximizar o throughput de amostragem, tipicamente medido em tokens por segundo, mantendo uma fidelidade de amostragem aceitável. Os frameworks de treinamento, por outro lado, focam na estabilidade numérica e na precisão para o cálculo de gradientes, frequentemente usando formatos de maior precisão, como FP32, para pesos mestres e estados do otimizador. Essas prioridades e restrições diferentes introduzem um descompasso inevitável, embora sutil, entre o treinamento e a inferência.
Esse descompasso leva a uma atualização de gradiente enviesada, que foi observada para desestabilizar o treinamento ([1][2][3][4][5]). Para simplificar, considere o gradiente de política REINFORCE:
Aqui denota prompts amostrados de alguma distribuição de dados, e é a política implementada pelo mecanismo de treinamento. Com o vLLM no fluxo, obtemos uma política de inferência separada , para que o gradiente de política efetivo se torne
Isso transforma um problema de RL que, de outra forma, seria on policy em um problema off policy.
A maneira padrão de corrigir esse deslocamento de distribuição é a amostragem de importância (IS). Oferecemos duas variantes de IS: Amostragem de Importância Truncada (TIS) e Amostragem de Importância com Máscara (MIS). Ambas as variantes podem ser aplicadas no nível de token ou no nível de sequência. Seja o peso de importância, por exemplo por token ou por sequência. Sob o TIS, as proporções fora da faixa [vllm_importance_sampling_clip_min, vllm_importance_sampling_clip_max] são truncadas,
O original artigo TIS propôs um único mecanismo de recorte de limite superior, ou seja, . A implementação no TRL generalizou isso introduzindo também um limite inferior, resultando na formulação de dois lados mostrada acima, inspirada no IcePop método.
Observe que no IcePop, os limites são rotulados como e enquanto no TRL usamos e .
Sob o MIS, as proporções fora dessa faixa são definidas como zero, de modo que essas amostras não contribuem para o gradiente. Em outras palavras, amostras atípicas têm seu peso reduzido sob o TIS e são descartadas sob o MIS. A flag de configuração vllm_importance_sampling_mode seleciona tanto a variante de IS (mascaramento ou truncamento) quanto a granularidade (nível de token ou nível de sequência).
A amostragem de importância é a resposta algorítmica fundamentada para a incompatibilidade entre treinamento e inferência. No entanto, também existem abordagens mais diretas que tentam reduzir a incompatibilidade entre os próprios dois motores. A maioria delas são soluções de engenharia. Por exemplo, o MiniMax M1 usa uma cabeça de modelo de linguagem em FP32 no motor de inferência. A Thinking Machines explorou kernels de inferência determinísticos, embora isso venha com um custo significativo de eficiência. O vLLM demonstrou políticas consistentes em nível de bit ao se basear nos kernels determinísticos invariantes em lote da Thinking Machines, mas, até novembro de 2025, ainda há uma penalidade substancial de throughput em relação à inferência padrão do vLLM.
Acelere o treinamento com o loteamento contínuo do transformers
Como alternativa ao vLLM, você pode usar o mecanismo de lote contínuo integrado do transformers para uma geração mais rápida. O lote contínuo remove as sequências finalizadas do lote imediatamente, em vez de esperar a mais lenta terminar. Para tarefas com comprimentos de conclusão variáveis (por exemplo, raciocínio matemático), isso resulta em uma geração mais rápida e menor uso de VRAM em comparação com o generate() padrão em tamanhos de lote grandes (N≥32).
O loteamento contínuo é uma atualização direta, sem necessidade de configuração de servidor ou sincronização de pesos. Ele é executado no processo e é adequado para treinamento em uma única GPU ou ambientes com restrições de memória. Para obter o máximo de throughput de geração em escala, use o vLLM.
from trl import GRPOConfig
training_args = GRPOConfig(
...,
use_transformers_continuous_batching=True,
transformers_continuous_batching_config={
"use_cuda_graph": False,
"max_memory_percent": 0.4, # lower values leave more VRAM for the training backward pass
},
)O TRL define
max_memory_percentcomo0.5(em vez de0.9do Transformers) para deixar VRAM suficiente para a passagem de retropropagação do treinamento. Ajuste para0.3–0.4em lotes de geração grandes (N≥32) ou se você vir erros de memória insuficiente.
Para um exemplo completo de treinamento, consulte examples/grpo_continuous_batching/grpo_continuous_batching.py.
GRPO em escala: treine um modelo de 70B+ em vários nós
Ao treinar modelos grandes como Qwen2.5-72B, você precisa de várias otimizações-chave para tornar o treinamento eficiente e escalável em várias GPUs e nós. Essas incluem:
- DeepSpeed ZeRO Stage 3: o ZeRO utiliza paralelismo de dados para distribuir os estados do modelo (pesos, gradientes, estados do otimizador) entre várias GPUs e CPUs, reduzindo os requisitos de memória e computação em cada dispositivo. Como modelos grandes não cabem em uma única GPU, o uso do ZeRO Stage 3 é obrigatório para treinar esse tipo de modelo. Para mais detalhes, consulte DeepSpeed Integration.
- torchrun: o lançador do PyTorch inicia um processo por GPU em cada nó e os conecta por meio de um ponto de encontro comum. Para mais detalhes, consulte Distributing Training.
- vLLM: Consulte a seção anterior para saber como usar o vLLM para acelerar a geração.
Abaixo está um exemplo de script SLURM para treinar um modelo de 70B com GRPO em vários nós. Este script treina um modelo em 4 nós e usa o 5º nó para geração com vLLM.
#!/bin/bash
#SBATCH --nodes=5
#SBATCH --gres=gpu:8
# Get the list of allocated nodes
NODELIST=($(scontrol show hostnames $SLURM_JOB_NODELIST))
# Assign the first 4 nodes for training and the 5th node for vLLM
TRAIN_NODES="${NODELIST[@]:0:4}" # Nodes 0, 1, 2, 3 for training
VLLM_NODE="${NODELIST[4]}" # Node 4 for vLLM
# Run training on the first 4 nodes (Group 1)
srun --nodes=4 --ntasks=4 --nodelist="${NODELIST[@]:0:4}" torchrun \
--nnodes 4 \
--nproc_per_node 8 \
--node_rank $SLURM_PROCID \
--rdzv_backend c10d \
--rdzv_endpoint ${NODELIST[0]}:29500 \
train_grpo.py \
--server_ip $VLLM_NODE &
# Run vLLM server on the 5th node (Group 2)
srun --nodes=1 --ntasks=1 --nodelist="${NODELIST[4]}" env VLLM_SERVER_DEV_MODE=1 vllm serve Qwen/Qwen2.5-72B --tensor-parallel-size 8 \
--weight-transfer-config '{"backend": "nccl"}' \
--logprobs-mode processed_logprobs \
--max-logprobs -1 &
waitimport argparse
from datasets import load_dataset
from trl import GRPOTrainer, GRPOConfig
from trl.rewards import accuracy_reward
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--vllm_server_host", type=str, default="", help="The server IP")
args = parser.parse_args()
dataset = load_dataset("trl-lib/DeepMath-103K", split="train")
training_args = GRPOConfig(
per_device_train_batch_size=4,
deepspeed="examples/deepspeed_configs/zero3.json",
use_vllm=True,
vllm_mode="server",
vllm_server_host=args.vllm_server_host.replace("ip-", "").replace("-", "."), # from ip-X-X-X-X to X.X.X.X
)
trainer = GRPOTrainer(
model="Qwen/Qwen2.5-72B",
args=training_args,
reward_funcs=accuracy_reward,
train_dataset=dataset
)
trainer.train()
if __name__=="__main__":
main()Usando uma função de recompensa personalizada
O GRPOTrainer suporta o uso de funções de recompensa personalizadas em vez de modelos de recompensa densos. Para garantir compatibilidade, sua função de recompensa deve atender aos seguintes requisitos:
As funções de recompensa podem ser chamadas síncronas em Python ou corrotinas assíncronas async def. Quando você fornece várias funções de recompensa assíncronas, elas são aguardadas de forma concorrente (executadas em paralelo via asyncio.gather), de modo que suas latências se sobrepõem.
Argumentos de entrada:
A função deve aceitar os seguintes argumentos como palavras-chave:
prompts(contém os prompts),completions(contém as completions geradas),completion_ids(contém as conclusões tokenizadas),trainer_state(TrainerState): O estado atual do trainer. Isso pode ser usado para implementar funções de recompensa dinâmicas, como aprendizado por currículo, em que a recompensa é ajustada com base no progresso do treinamento.log_extra: uma funçãolog_extra(column: str, values: list)para adicionar colunas extras à tabela de completions. Veja o Exemplo 6.log_metric: uma função chamávellog_metric(name: str, value: float)para registrar métricas escalares como gráficos ao lado dekl,entropy, etc. Veja o Exemplo 6.environments: uma lista de instâncias de ambiente, uma por conclusão. Presente apenas quandoenvironment_factoryé fornecido. Use isso para ler o estado acumulado durante o episódio (por exemplo,env.counter). Para ambientes com estado, prefira deixar que o ambiente possua a recompensa por meio de um métodoget_reward— veja Recompensas.- Todos os nomes de colunas (exceto
prompt) que o conjunto de dados pode ter. Por exemplo, se o conjunto de dados contiver uma coluna chamadaground_truth, a função será chamada comground_truthcomo argumento de palavra-chave.
A maneira mais fácil de atender a esse requisito é usar
**kwargsna assinatura da função.Dependendo do formato do conjunto de dados, a entrada variará:
- Para o formato padrão,
promptsecompletionsserão listas de strings. - Para o formato conversacional,
promptsecompletionsserão listas de dicionários de mensagens.
- Para o formato padrão,
Valor de retorno: A função deve retornar uma lista de floats. Cada float representa a recompensa correspondente a uma única conclusão.
Exemplo 1: Recompensar conclusões mais longas
Abaixo está um exemplo de uma função de recompensa para um formato padrão que recompensa conclusões mais longas:
def reward_func(completion_ids, **kwargs):
"""Reward function that assigns higher scores to longer completions (in terms of token count)."""
return [float(len(ids)) for ids in completion_ids]Você pode testá-lo da seguinte forma:
>>> prompts = ["The sky is", "The sun is"] # not used in the reward function, but the trainer will pass it
>>> completions = [" blue.", " in the sky."] # not used in the reward function, but the trainer will pass it
>>> completion_ids = [[6303, 13], [304, 279, 12884, 13]]
>>> reward_func(prompts=prompts, completions=completions, completion_ids=completion_ids)
[2.0, 4.0]Exemplo 1.1: Recompensar conclusões mais longas (com base no número de caracteres)
Mesmo que no exemplo anterior, mas desta vez a função de recompensa é baseada no número de caracteres em vez de tokens.
def reward_func(completions, **kwargs):
"""Reward function that assigns higher scores to longer completions (in terms of character count)."""
return [float(len(completion)) for completion in completions]Você pode testá-lo da seguinte forma:
>>> prompts = ["The sky is", "The sun is"]
>>> completions = [" blue.", " in the sky."]
>>> completion_ids = [[6303, 13], [304, 279, 12884, 13]] # not used in the reward function, but the trainer will pass it
>>> reward_func(prompts=prompts, completions=completions, completion_ids=completion_ids)
[6.0, 12.0]Exemplo 2: Recompensar conclusões com um formato específico
Abaixo está um exemplo de uma função de recompensa que verifica se a conclusão possui um formato específico. Este exemplo é inspirado na função format reward usada no artigo DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning. Ele foi projetado para um formato conversacional, em que os prompts e as conclusões consistem em mensagens estruturadas.
import re
def format_reward_func(completions, **kwargs):
"""Reward function that checks if the completion has a specific format."""
pattern = r"^<think>.*?</think><answer>.*?</answer>$"
completion_contents = [completion[0]["content"] for completion in completions]
matches = [re.match(pattern, content) for content in completion_contents]
return [1.0 if match else 0.0 for match in matches]Você pode testar esta função da seguinte forma:
>>> prompts = [
... [{"role": "user", "content": "What is the result of (1 + 2) * 4?"}],
... [{"role": "user", "content": "What is the result of (3 + 1) * 2?"}],
... ]
>>> completions = [
... [{"role": "assistant", "content": "<think>The sum of 1 and 2 is 3, which we multiply by 4 to get 12.</think><answer>(1 + 2) * 4 = 12</answer>"}],
... [{"role": "assistant", "content": "The sum of 3 and 1 is 4, which we multiply by 2 to get 8. So (3 + 1) * 2 = 8."}],
... ]
>>> format_reward_func(prompts=prompts, completions=completions)
[1.0, 0.0]Exemplo 3: Recompensar conclusões com base em uma referência
Abaixo está um exemplo de uma função de recompensa que verifica se a conclusão está correta. Este exemplo é inspirado na função de recompensa de precisão usada no artigo DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning.
Este exemplo é projetado para o formato padrão, onde o conjunto de dados contém uma coluna chamada ground_truth.
import re
def reward_func(completions, ground_truth, **kwargs):
# Regular expression to capture content inside \boxed{}
matches = [re.search(r"\\boxed\{(.*?)\}", completion) for completion in completions]
contents = [match.group(1) if match else "" for match in matches]
# Reward 1 if the content is the same as the ground truth, 0 otherwise
return [1.0 if c == gt else 0.0 for c, gt in zip(contents, ground_truth)]Você pode testar esta função da seguinte forma:
>>> prompts = ["Problem: Solve the equation $2x + 3 = 7$. Solution:", "Problem: Solve the equation $3x - 5 = 10$."]
>>> completions = [r" The solution is \boxed{2}.", r" The solution is \boxed{6}."]
>>> ground_truth = ["2", "5"]
>>> reward_func(prompts=prompts, completions=completions, ground_truth=ground_truth)
[1.0, 0.0]Exemplo 4: Funções de recompensa multitarefa
Abaixo está um exemplo de uso de múltiplas funções de recompensa no GRPOTrainer. Neste exemplo, definimos duas funções de recompensa específicas para tarefas: math_reward_func e coding_reward_func. A math_reward_func recompensa problemas de matemática com base na sua correção, enquanto a coding_reward_func recompensa problemas de programação com base em se a solução funciona.
from datasets import Dataset
from trl import GRPOTrainer
# Define a dataset that contains both math and coding problems
dataset = Dataset.from_list(
[
{"prompt": "What is 2+2?", "task": "math"},
{"prompt": "Write a function that returns the sum of two numbers.", "task": "code"},
{"prompt": "What is 3*4?", "task": "math"},
{"prompt": "Write a function that returns the product of two numbers.", "task": "code"},
]
)
# Math-specific reward function
def math_reward_func(prompts, completions, task, **kwargs):
rewards = []
for prompt, completion, t in zip(prompts, completions, task):
if t == "math":
# Calculate math-specific reward
correct = check_math_solution(prompt, completion)
reward = 1.0 if correct else -1.0
rewards.append(reward)
else:
# Return None for non-math tasks
rewards.append(None)
return rewards
# Coding-specific reward function
def coding_reward_func(prompts, completions, task, **kwargs):
rewards = []
for prompt, completion, t in zip(prompts, completions, task):
if t == "code":
# Calculate coding-specific reward
works = test_code_solution(prompt, completion)
reward = 1.0 if works else -1.0
rewards.append(reward)
else:
# Return None for non-coding tasks
rewards.append(None)
return rewards
# Use both task-specific reward functions
trainer = GRPOTrainer(
model="Qwen/Qwen2.5-0.5B-Instruct",
reward_funcs=[math_reward_func, coding_reward_func],
train_dataset=dataset,
)
trainer.train()Neste exemplo, o math_reward_func e o coding_reward_func são projetados para funcionar com um conjunto de dados misto que contém problemas de matemática e de programação. A coluna task no conjunto de dados é usada para determinar qual função de recompensa aplicar a cada problema. Se não houver uma função de recompensa relevante para uma amostra no conjunto de dados, a função de recompensa retornará None, e o GRPOTrainer continuará com as funções e tarefas válidas. Isso permite que o GRPOTrainer lide com múltiplas funções de recompensa com diferentes alcances de aplicação.
Observe que o GRPOTrainer ignorará as recompensas None retornadas pelas funções de recompensa e considerará apenas as recompensas retornadas pelas funções relevantes. Isso garante que o modelo seja treinado nas tarefas relevantes e ignore as tarefas para as quais não há uma função de recompensa relevante.
Exemplo 5: Funções de recompensa assíncronas
Funções de recompensa personalizadas também podem ser definidas como corrotinas async def. Isso é útil se a sua recompensa depender de I/O lento (por exemplo, chamar um serviço remoto). Quando você passa várias funções de recompensa assíncronas, o GRPOTrainer as executa de forma concorrente, de modo que a latência delas se sobrepõe.
Abaixo está um exemplo mínimo de uma função de recompensa assíncrona que simula uma operação limitada por E/S:
import asyncio
async def async_reward_func(prompts, completions, **kwargs):
# Simulate an I/O-bound call (e.g., HTTP request, database lookup)
await asyncio.sleep(0.01)
# Simple toy reward: 1.0 if the completion is non-empty, else 0.0
return [1.0 if completion else 0.0 for completion in completions]Exemplo 6: Registro de colunas e métricas extras
Abaixo está um exemplo de uma função de recompensa que registra colunas extras na tabela de conclusões e métricas escalares como gráficos.
import re
def reward_func(completions, ground_truth, log_extra=None, log_metric=None, **kwargs):
extracted = [re.search(r"\\boxed\{(.*?)\}", c) for c in completions]
extracted = [m.group(1) if m else None for m in extracted]
rewards = [1.0 if e == gt else 0.0 for e, gt in zip(extracted, ground_truth)]
if log_extra:
log_extra("golden_answer", list(ground_truth))
log_extra("extracted_answer", [e or "[none]" for e in extracted])
if log_metric:
log_metric("accuracy", sum(rewards) / len(rewards))
return rewardsPassando a função de recompensa para o treinador
Para usar sua função de recompensa personalizada, passe-a para o GRPOTrainer da seguinte forma:
from trl import GRPOTrainer
trainer = GRPOTrainer(
reward_funcs=reward_func,
...,
)Você pode passar várias funções de recompensa como uma lista; essa lista pode incluir tanto funções síncronas quanto assíncronas:
from trl import GRPOTrainer
trainer = GRPOTrainer(
reward_funcs=[reward_func, async_reward_func1, async_reward_func2],
...,
)e a recompensa será calculada como a soma das recompensas de cada função, ou como a soma ponderada, se reward_weights for fornecido na configuração.
Observe que o GRPOTrainer suporta múltiplas funções de recompensa de diferentes tipos. Consulte a documentação dos parâmetros para mais detalhes.
Regularização de entropia
Para incentivar a exploração e evitar que a política colapse para saídas quase determinísticas, você pode adicionar um bônus de entropia ao objetivo de treinamento. A regularização de entropia aumenta a perda do GRPO da seguinte forma:
em que é a entropia média por token da política e é o coeficiente de entropia. O bônus é sempre a entropia média por token, independentemente de loss_type; ele não é reescalado para corresponder à normalização da política de um tipo de perda (por exemplo, o denominador batch_size * max_completion_length do Dr. GRPO), portanto entropy_coef tem o mesmo significado para todos os tipos de perda.
Entropia estática — um coeficiente fixo ao longo do treinamento:
from trl import GRPOConfig, GRPOTrainer
training_args = GRPOConfig(entropy_coef=0.05, ...)Entropia adaptativa — o coeficiente é atualizado a cada passo do otimizador com base em uma entropia alvo, conforme introduzido em Skywork-OR1. Quando a entropia atual cai para ou abaixo de entropy_target, o coeficiente é incrementado em entropy_coef_delta; caso contrário, é decrementado. O coeficiente é aplicado apenas (ou seja, é não nulo) enquanto a entropia estiver no nível ou abaixo do alvo:
training_args = GRPOConfig(
entropy_coef=0.01, # initial coefficient
use_adaptive_entropy=True,
entropy_target=5.0, # target mean per-token entropy (nats); tune for your model
entropy_coef_delta=0.005, # step size per optimizer step
entropy_coef_min=0.0,
entropy_coef_max=1.0,
...
)Modelos de linguagem típicos apresentam entropias por token de 2 a 10 nats, portanto o valor padrão
entropy_target=0.2quase nunca aciona a regularização — o bônus só entra em ação quando a entropia é igual ou inferior ao alvo, ou seja, em colapso quase completo. Defina-o com um valor significativo para o seu modelo, por exemplo, próximo da entropia observada no início do treinamento (registrada como a métricaentropy). Ao usartop_entropy_quantile < 1.0,entropy_targetse aplica ao subconjunto de tokens de alta entropia — a entropia desse subconjunto será maior que aentropyregistrada para todos os tokens, portanto, calibre de acordo.
Quando use_adaptive_entropy=True, o coeficiente de entropia atual entropy_coef é salvo junto com cada checkpoint e restaurado ao retomar, de modo que o treinamento é totalmente retomável.
Experimentação Rápida para GRPO
RapidFire AI é um motor de experimentação de código aberto que se integra ao TRL e permite iniciar múltiplas configurações de GRPO simultaneamente, mesmo em uma única GPU. Em vez de testar configurações sequencialmente, o RapidFire permite ver todas as suas curvas de aprendizado mais cedo, interromper execuções com baixo desempenho e clonar as promissoras com novas configurações em andamento sem reiniciar. Para mais informações, consulte RapidFire AI Integration.
Treinamento de Agentes
O GRPO oferece suporte a treinamento de agentes: o modelo chama ferramentas durante a geração e aprende com o resultado.
- Uma ferramenta é uma função Python simples (síncrona ou assíncrona) exposta ao modelo. Use
toolspara chamadas sem estado (uma calculadora, uma busca na web). - Um environment é a forma mais geral: um objeto com estado, criado do zero para cada rollout, cujos métodos públicos são expostos como ferramentas, além de um hook de ciclo de vida
resete umget_rewardopcional que permite que ele possua a recompensa. Useenvironment_factoryquando precisar de estado por rollout, de um hook de reset ou de recompensa gerenciada pelo environment.
Elas se compõem — você pode passar tools independentes junto com um environment_factory.
Ferramentas
O argumento tools espera uma lista de funções Python (síncronas ou assíncronas) que definem as ferramentas disponíveis para o agente:
from trl import GRPOTrainer
trainer = GRPOTrainer(
tools=[tool1, tool2],
...,
)Cada ferramenta deve ser uma função Python padrão com argumentos e tipos de retorno com type hints, além de uma docstring no estilo Google descrevendo seu propósito, argumentos e valor de retorno. Para mais detalhes, consulte o Guia de passagem de ferramentas.
O loop de chamada de ferramentas do GRPO exige que o modelo de chat seja preservador de prefixo (a adição de uma mensagem de ferramenta não deve alterar a forma como as mensagens anteriores são renderizadas). Para famílias de modelos conhecidas (por exemplo, Qwen3, DeepSeek-V3), o TRL substitui automaticamente o modelo de treinamento por um modelo corrigido quando as ferramentas estão habilitadas. Consulte Modelos de Chat para a lista completa.
Use max_tool_calling_iterations no GRPOConfig para limitar o número de turnos de chamada de ferramentas. Por padrão, não há limite, e a geração é interrompida quando o modelo produz um turno de resposta sem chamadas de ferramentas, quando a conclusão (todos os turnos e resultados das ferramentas) atinge max_completion_length tokens, ou quando a sequência completa atinge o comprimento máximo do modelo (vllm_max_model_length com vllm_mode="colocate", ou o max_position_embeddings do modelo, caso contrário).
Exemplo:
from trl import GRPOTrainer
def multiply(a: int, b: int) -> int:
"""
Multiplies two integers.
Args:
a: The first integer.
b: The second integer.
Returns:
The product of the two integers.
"""
return a * b
async def async_add(a: int, b: int) -> int:
"""
Asynchronously adds two integers.
Args:
a: The first integer.
b: The second integer.
Returns:
The sum of the two integers.
"""
return a + b
trainer = GRPOTrainer(
tools=[multiply, async_add],
...,
)Ambientes
Você também pode fornecer ferramentas por meio de environment_factory. Neste modo, o GRPOTrainer cria uma instância de ambiente por rollout e expõe os métodos públicos do ambiente como ferramentas.
environment_factoryrequertransformers>=5.2.0.
Ao usar um environment_factory, o ambiente possui os dados: não há um train_dataset externo. Em cada rollout, reset() produz a tarefa — amostragem própria de um corpus mantido pelo ambiente, ou geração de um estado proceduralmente — e retorna o prompt. max_steps define o comprimento do treinamento. O seguinte é um exemplo mínimo de um ambiente que amostra um alvo e expõe um método increment (exposto como uma ferramenta).
import random
from trl import GRPOConfig, GRPOTrainer
class IncrementEnv:
# Reserved methods
def reset(self, **kwargs) -> str | None: # required; called at the start of each rollout
self.counter = 0
self.target = random.randint(1, 6) # self-sample the task
return f"Increment the counter by {self.target}." # returned string becomes the prompt
def get_reward(self) -> float: # optional: the environment scores itself from its own state
return float(self.counter == self.target)
# Public methods (exposed as tools)
def increment(self, step: int) -> int:
"""
Increment the internal counter.
Args:
step: Value to add to the counter.
Returns:
The updated counter value.
"""
self.counter += step
return self.counter
trainer = GRPOTrainer(
model="Qwen/Qwen3-0.6B",
args=GRPOConfig(max_steps=1000, chat_template_kwargs={"enable_thinking": False}),
environment_factory=IncrementEnv,
)
trainer.train()Uma classe de ambiente possui dois métodos reservados: reset e get_reward. Diferentemente de qualquer outro método público, esses não são expostos ao modelo como ferramentas.
reset(obrigatório) é chamado quando o rollout começa. Ele pode retornarNoneou uma string. No GRPO, quando retorna uma string, essa string é o prompt do usuário.get_reward(opcional, síncrona ou assíncrona) não recebe argumentos e retorna umfloat: o ambiente pontua o episódio que acabou de executar com base no seu próprio estado interno (o jogo terminou em uma vitória? a palavra foi adivinhada?). É chamada uma vez por rollout concluído e atua como fonte de recompensa.
Como o ambiente realiza a autoamostragem a cada
reset(), osGmembros de um grupo GRPO podem não compartilhar o mesmo estado inicial, tornando a linha de base do grupo ligeiramente mais ruidosa. Para estados idênticos dentro de um grupo, faça com quereset()derive o estado deterministicamente a partir de uma chave compartilhada.
Fornecendo um conjunto de dados externo (opcional)
Em vez de deixar que o ambiente faça a amostragem por conta própria, você pode fornecer um train_dataset externo. Por exemplo, quando suas tarefas já estão em um dataset, ou para rotear entre múltiplos ambientes. A cada rollout, o trainer amostra uma linha, usa sua coluna "prompt" como prompt e passa as outras colunas da linha para reset() como argumentos de palavra-chave (para que o ambiente leia a tarefa do dataset).
from datasets import Dataset
from trl import GRPOTrainer
# Each row carries the prompt and the task data (here, the counter target to reach).
dataset = Dataset.from_dict(
{
"prompt": [[{"role": "user", "content": f"Increment the counter to {i}."}] for i in range(1, 7)],
"target": list(range(1, 7)),
}
)
class IncrementEnv:
def reset(self, target, **kwargs) -> None: # the row's `target` column arrives as a keyword argument
self.counter = 0
self.target = target
def get_reward(self) -> float:
return float(self.counter == self.target)
def increment(self, step: int) -> int: # exposed as a tool (see the full docstring above)
self.counter += step
return self.counter
trainer = GRPOTrainer(
model="Qwen/Qwen3-0.6B",
train_dataset=dataset, # the dataset owns the task; the "target" column reaches reset(target=...)
environment_factory=IncrementEnv,
)
trainer.train()Recompensas
Recompensas pertencentes ao ambiente e recompensas pertencentes ao treinador não são exclusivas. Passe reward_funcs para recompensas que são naturais de calcular a partir da conclusão (por exemplo, uma verificação de formato no texto) e deixe o ambiente retornar sua recompensa dependente do estado por meio de get_reward. Todas as fontes são somadas; reward_weights se aplica apenas a reward_funcs (o ambiente possui sua própria escala).
def format_reward(completions, **kwargs): # trainer-owned: scores the completion text
...
trainer = GRPOTrainer(
model="Qwen/Qwen3-0.6B",
args=GRPOConfig(max_steps=1000),
reward_funcs=format_reward, # trainer-owned: scores the completion
environment_factory=IncrementEnv, # env-owned: scores its internal state via `get_reward`
)A reward_func também pode ler o estado do ambiente diretamente: quando environment_factory está definido, o trainer passa um kwarg environments (uma instância por completion). Isso é ocasionalmente útil, mas para recompensas dependentes de estado, prefira get_reward.
Isso funciona de forma idêntica para AsyncGRPOTrainer.
Vários ambientes
Para treinar em uma mistura de tarefas em uma única execução (por exemplo, uma tarefa de codificação e um jogo), passe um dicionário que mapeia nomes de ambientes para fábricas, em vez de um único chamável. Cada rollout seleciona seu ambiente por meio de um campo environment no conjunto de dados, e somente as ferramentas daquele ambiente são expostas. Isso evita vazar ferramentas irrelevantes (a ferramenta move do jogo para um exemplo de codificação, e vice-versa). Cada ambiente ainda possui seus próprios dados e retorna o prompt de reset(), de modo que o conjunto de dados precisa apenas da coluna environment para rotear entre eles.
import random
from datasets import Dataset
from trl import GRPOConfig, GRPOTrainer
class CodingEnv:
def reset(self, **kwargs) -> str:
n = random.randint(1, 20)
return f"Compute the {n}th Fibonacci number."
def run_code(self, code: str) -> str: # exposed as a tool only for "coding" examples
"""Run the given Python code and return its stdout.
Args:
code: The Python source to execute.
Returns:
The captured standard output.
"""
...
class GameEnv:
def reset(self, **kwargs) -> str:
return "Reach the goal tile."
def move(self, action: str) -> str: # exposed as a tool only for "game" examples
"""Apply an action to the game and return the new observation.
Args:
action: One of "up", "down", "left", "right".
Returns:
The observation after the move.
"""
...
# The dataset only routes: each row picks the environment for that rollout
dataset = Dataset.from_dict({"environment": ["coding", "game"] * 500})
trainer = GRPOTrainer(
model="Qwen/Qwen3-0.6B",
args=GRPOConfig(chat_template_kwargs={"enable_thinking": False}),
train_dataset=dataset,
reward_funcs=reward_func,
environment_factory={"coding": CodingEnv, "game": GameEnv},
)
trainer.train()A função de recompensa ainda recebe o ambiente de cada exemplo através de reward_kwargs["environments"], permitindo que ela faça um branch com base no tipo de ambiente (por exemplo, isinstance(env, CodingEnv)). As instâncias de ambiente são reutilizadas entre os passos (com reset entre episódios), de modo que um __init__ caro é pago uma única vez, em vez de a cada passo. O campo environment é consumido pelo trainer e não é encaminhado para reset.
Respostas de Ferramentas Multimodais
Ferramentas podem retornar imagens junto com texto ao retornar uma lista de blocos de conteúdo. Isso é útil para o treinamento de agentes VLM em que a ferramenta fornece feedback visual (por exemplo, capturas de tela, gráficos, capturas de câmera).
from PIL import Image
def take_screenshot() -> list:
"""
Takes a screenshot of the current screen.
Returns:
The screenshot image with a description.
"""
img = Image.open("screenshot.png")
return [{"type": "image", "image": img}, {"type": "text", "text": "Here is the screenshot."}]As imagens retornadas são injetadas automaticamente na conversa e passadas ao VLM para as subsequentes rodadas de geração.
Modelos Suportados
Testado com:
- Beam — por exemplo,
reflection/Beam-1.0-501B-A23B - DeepSeek-R1 — por exemplo,
deepseek-ai/DeepSeek-R1 - Gemma4 — por exemplo,
google/gemma-4-E2B-it - GLM-4-MoE (4.5, 4.6 ou 4.7) — por exemplo,
zai-org/GLM-4.7 - GPT-OSS — por exemplo,
openai/gpt-oss-20b - Llama 3.1 — por exemplo,
meta-llama/Llama-3.1-8B-Instruct - Llama 3.2 — por exemplo,
meta-llama/Llama-3.2-3B-Instruct - Qwen2.5 — por exemplo,
Qwen/Qwen2.5-0.5B-Instruct - Qwen3 — por exemplo,
Qwen/Qwen3-0.6B - Qwen3-VL — por exemplo,
Qwen/Qwen3-VL-2B-Instruct - Qwen3.5 — por exemplo,
Qwen/Qwen3.5-2B - Qwen3.6 — por exemplo,
Qwen/Qwen3.6-35B-A3B
A compatibilidade com todos os LLMs não é garantida. Se você acredita que um modelo deve ser suportado, sinta-se à vontade para abrir uma issue no GitHub — ou, melhor ainda, enviar um pull request com as alterações necessárias.
Integrações de Ambiente
Todos os ambientes se conectam ao mesmo slot environment_factory, portanto, são intercambiáveis no nível do TRL — escolha aquele cujo ecossistema se adequa à sua tarefa:
| Integração | O que é | Use-o quando |
|---|---|---|
| OpenEnv | O padrão de ambiente aberto (API no estilo Gymnasium, servida via WebSocket ou execução em contêiner), apoiado pela Hugging Face e pela comunidade. | Você está usando um ambiente OpenEnv pronto do Hub, ou definindo o seu próprio em conformidade com o padrão aberto (por exemplo, Wordle, Sudoku, Catch). |
| OpenReward | Uma integração com ambientes que falam ORS (o catálogo openreward.ai ou seu próprio servidor ORS); as tarefas e as recompensas são servidas via HTTP. | Você deseja treinar contra um ambiente ORS: o catálogo (por exemplo, Eigent/SETA), um que você hospeda na sua própria infraestrutura, ou um servidor local que você está desenvolvendo. |
| Harbor | Uma integração com as suítes de tarefas do Harbor: cada tarefa é uma instrução, uma imagem de sandbox real (docker, e2b, …) e um verificador dentro da sandbox. | Você deseja treinar contra uma suíte de tarefas do Harbor: uma árvore de tarefas, cada uma sendo um sandbox autossuficiente mais um verificador (por exemplo, um agente de análise de dados que explora arquivos em um sandbox e escreve uma resposta que um avaliador verifica). |
Treinando Modelos de Visão e Linguagem
O GRPO suporta o treinamento de Vision-Language Models (VLMs) em conjuntos de dados multimodais que contêm tanto texto quanto imagens.
Modelos Suportados
Testado com:
- Gemma3 — por exemplo,
google/gemma-3-4b-it - LLaVA-NeXT — por exemplo,
llava-hf/llava-v1.6-mistral-7b-hf - Qwen2-VL — por exemplo,
Qwen/Qwen2-VL-2B-Instruct - Qwen2.5-VL — por exemplo,
Qwen/Qwen2.5-VL-3B-Instruct - SmolVLM2 — por exemplo,
HuggingFaceTB/SmolVLM2-2.2B-Instruct
A compatibilidade com todos os VLMs não é garantida. Se você acredita que um modelo deve ser suportado, sinta-se à vontade para abrir uma issue no GitHub — ou, melhor ainda, enviar um pull request com as alterações necessárias.
Início rápido
Use grpo_vlm.py para fazer o fine-tuning de um VLM. Comando de exemplo para treinamento em lmms-lab/multimodal-open-r1-8k-verified:
torchrun --nproc_per_node 8 examples/grpo_visual_math/grpo_visual_math.py \
--deepspeed examples/deepspeed_configs/zero3.json \
--model_name_or_path Qwen/Qwen2.5-VL-3B-Instruct \
--output_dir grpo-Qwen2.5-VL-3B-Instruct \
--learning_rate 1e-5 \
--dtype bfloat16 \
--max_completion_length 1024 \
--use_vllm \
--vllm_mode colocate \
--use_peft \
--lora_target_modules "q_proj", "v_proj" \
--log_completionsDicas de configuração
- Use LoRA nas camadas de projeção de visão-linguagem
- Ative a quantização de 4 bits para reduzir o uso de memória
- VLMs exigem muita memória — comece com tamanhos de lote menores
- A maioria dos modelos é compatível com o vLLM (modos
serverecolocate)
Formato do Conjunto de Dados
Cada amostra de treinamento deve incluir:
prompt: Texto formatado por meio do modelo de chat do processadorimage/images: Imagem PIL ou lista de Imagens PIL
O trainer trata automaticamente a conversão de imagem para tensor por meio do processador de imagens do modelo.
GRPOTrainer
classe trl.GRPOTrainer
< source >( model: str | PreTrainedModel | PeftModelreward_funcs: str | transformers.modeling_utils.PreTrainedModel | collections.abc.Callable[..., list[float | None]] | list[str | transformers.modeling_utils.PreTrainedModel | collections.abc.Callable[..., list[float | None]]] | None = Noneargs: trl.trainer.grpo_config.GRPOConfig | None = Nonetrain_dataset: datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset | None = Noneeval_dataset: datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset | datasets.dataset_dict.DatasetDict | datasets.dataset_dict.IterableDatasetDict | dict[str, datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset] | None = Noneprocessing_class: transformers.tokenization_utils_base.PreTrainedTokenizerBase | transformers.processing_utils.ProcessorMixin | None = Nonereward_processing_classes: transformers.tokenization_utils_base.PreTrainedTokenizerBase | list[transformers.tokenization_utils_base.PreTrainedTokenizerBase] | None = Nonecallbacks: list[transformers.trainer_callback.TrainerCallback] | None = Noneoptimizers: tuple[typing.Optional[torch.optim.Optimizer], typing.Optional[torch.optim.lr_scheduler.LambdaLR]] = (None, None)quantization_config: BitsAndBytesConfig | None = Nonepeft_config: PeftConfig | None = Nonetools: list[collections.abc.Callable] | None = Nonerollout_func: collections.abc.Callable[[list[str], 'GRPOTrainer'], dict[str, typing.Any]] | None = Noneenvironment_factory: collections.abc.Callable[[], trl.trainer.grpo_trainer._SupportsReset] | dict[str, collections.abc.Callable[[], trl.trainer.grpo_trainer._SupportsReset]] | None = None )
Parâmetros
- model (
strou PreTrainedModel ouPeftModel) — Modelo a ser treinado. Pode ser:- Uma string, sendo o model id de um modelo pré-treinado hospedado em um repositório de modelos no huggingface.co, ou um
caminho para um diretório contendo pesos de modelo salvos usando
save_pretrained, por exemplo,
'./my_model_directory/'. O modelo é carregado usando<ModelArchitecture>.from_pretrained(onde<ModelArchitecture>é derivado da configuração do modelo) com os argumentos de palavra-chave emargs.model_init_kwargs. Sedtypenão for especificado emargs.model_init_kwargs, o padrão éfloat32. Isso difere de from_pretrained, onde (desde a versão 5 do Transformers) o dtype é inferido a partir da configuração do modelo. - Um objeto PreTrainedModel. Somente modelos de linguagem causais são suportados.
- Um objeto
PeftModel. Somente modelos de linguagem causais são suportados.
- Uma string, sendo o model id de um modelo pré-treinado hospedado em um repositório de modelos no huggingface.co, ou um
caminho para um diretório contendo pesos de modelo salvos usando
save_pretrained, por exemplo,
- reward_funcs (
RewardFunc | list[RewardFunc], opcional) — Funções de recompensa a serem usadas para calcular as recompensas. Para calcular as recompensas, chamamos todas as funções de recompensa com os prompts e as conclusões e somamos as recompensas. Pode ser omitido quando a recompensa é fornecida pelo ambiente através deenvironment_factory(veja abaixo). Pode ser:-
Uma única função de recompensa, como:
-
Uma string: o ID do modelo de um modelo pré-treinado hospedado em um repositório de modelos no huggingface.co, ou um caminho para um diretório contendo pesos de modelo salvos usando save_pretrained, por exemplo,
'./my_model_directory/'. O modelo é carregado usando from_pretrained comnum_labels=1e os argumentos de palavra-chave emargs.model_init_kwargs. -
Um objeto PreTrainedModel: apenas modelos de classificação de sequência são suportados.
-
Uma função de recompensa personalizada: a função recebe os prompts e as conclusões geradas, além de quaisquer colunas adicionais no conjunto de dados. Ela deve retornar uma lista de recompensas. Funções de recompensa personalizadas podem ser síncronas ou assíncronas e também podem retornar
Nonequando a recompensa não se aplica a essas amostras. Isso é útil para treinamento multitarefa, em que diferentes funções de recompensa se aplicam a diferentes tipos de amostras. Quando uma função de recompensa retornaNonepara uma amostra, essa função de recompensa é excluída do cálculo da recompensa para aquela amostra. Para mais detalhes, consulte Usando uma função de recompensa personalizada.O estado do trainer também é passado para a função de recompensa. O estado do trainer é uma instância de TrainerState e pode ser acessado por meio do argumento
trainer_statena assinatura da função de recompensa.
-
-
Uma lista de funções de recompensa, em que cada item pode ser independentemente qualquer um dos tipos acima. A mistura de diferentes tipos dentro da lista (por exemplo, um ID de modelo em string e uma função de recompensa personalizada) é permitida.
-
- args (GRPOConfig, opcional) —
Configuração para este treinador. Se
None, uma configuração padrão é usada. - train_dataset (Dataset ou IterableDataset, opcional) —
Dataset a ser usado para o treinamento. Ele deve incluir uma coluna
"prompt". Colunas adicionais no dataset são ignoradas. O formato das amostras pode ser:- Padrão: Cada amostra contém texto simples.
- Conversacional: cada amostra contém mensagens estruturadas (por exemplo, papel e conteúdo).
Pode ser omitido apenas quando um
environment_factoryé fornecido e o ambiente possui (ou gera proceduralmente) os dados, retornando o prompt de seu métodoreset(). Nesse caso,max_stepsdeve ser definido para estabelecer a duração do treinamento.Quando
train_dataseté um IterableDataset (por exemplo, um dataset em streaming),max_stepsdeve ser definido nos argumentos de treinamento, pois seu comprimento não pode ser inferido e o número total de etapas de treinamento é necessário para limitar o loop de treinamento e configurar o agendador de taxa de aprendizado. - eval_dataset (Dataset, IterableDataset, DatasetDict, IterableDatasetDict ou
dict[str, Dataset | IterableDataset]) — Dataset a ser usado para avaliação. Ele deve atender aos mesmos requisitos quetrain_dataset. - processing_class (PreTrainedTokenizerBase, ProcessorMixin, opcional) —
Classe de processamento usada para processar os dados. O lado do padding deve ser definido como “left”. Se
None, a classe de processamento é carregada a partir do nome do modelo com from_pretrained. Um token de padding,tokenizer.pad_token, deve ser definido. Se a classe de processamento não tiver definido um token de padding,tokenizer.eos_tokenserá usado como padrão. - reward_processing_classes (PreTrainedTokenizerBase ou
list[PreTrainedTokenizerBase], opcional) — Classes de processamento correspondentes às funções de recompensa especificadas emreward_funcs. Pode ser:- Uma única classe de processamento: usada quando
reward_funcscontém apenas uma função de recompensa. - Uma lista de classes de processamento: deve corresponder à ordem e ao comprimento das funções de recompensa em
reward_funcs. Se definido comoNone, ou se um elemento da lista correspondente a um PreTrainedModel forNone, o tokenizer do modelo é carregado automaticamente usando from_pretrained. Para elementos emreward_funcsque são funções de recompensa personalizadas (não PreTrainedModel), as entradas correspondentes emreward_processing_classessão ignoradas.
- Uma única classe de processamento: usada quando
- callbacks (lista de TrainerCallback, opcional) —
Lista de callbacks para personalizar o loop de treinamento. Adicionará esses à lista de callbacks padrão detalhada aqui.
Se você deseja remover um dos callbacks padrão utilizados, use o método remove_callback.
- optimizers (
tuple[torch.optim.Optimizer | None, torch.optim.lr_scheduler.LambdaLR | None], opcional, padrão(None, None)) — Uma tupla contendo o otimizador e o agendador a serem usados. Por padrão, será uma instância deAdamWno seu modelo e um agendador dado por get_linear_schedule_with_warmup controlado porargs. - quantization_config (BitsAndBytesConfig, opcional) —
Configuração de quantização usada ao carregar o modelo a partir de um identificador de modelo. Combine com
peft_configpara treinamento QLoRA. Ignorado se o modelo já estiver instanciado. - peft_config (
PeftConfig, opcional) — Configuração PEFT usada para envolver o modelo. SeNone, o modelo não é envolvido. - tools (lista de
Callable, opcional) — Uma lista de funções de ferramenta chamáveis (síncronas ou assíncronas) que o modelo pode invocar durante a geração. Cada ferramenta deve ser uma função Python padrão com argumentos e valores de retorno com type hints apropriados, e um docstring no estilo Google descrevendo seu propósito, argumentos e valor de retorno. Para mais detalhes, veja: https://huggingface.co/docs/transformers/en/chat_extras#passing-tools. O modelo usa o nome da função, os type hints e o docstring para determinar como chamá-la. Certifique-se de que o chat template do modelo suporta o uso de ferramentas e de que ele foi fine-tuned para tool calling. - rollout_func (
RolloutFunc, opcional) — Função a ser utilizada para gerar completions. Ela recebe a lista de prompts alocados ao processo atual e a instância do trainer. Deve retornar um dict com os campos"prompt_ids","completion_ids"e"logprobs", e pode opcionalmente retornar"logprob_token_ids"(mesma forma que"logprobs"). Quaisquer outros campos são encaminhados para as funções de recompensa. A função recebe o slice de prompts por processo sem duplicação; é responsável por retornar o número correto de completions por prompt (vejanum_generations/num_generations_evalno trainer). Este recurso é experimental e pode ser alterado ou removido a qualquer momento sem aviso prévio. - environment_factory (
EnvironmentFactoryoudict[str, EnvironmentFactory], opcional) — Um chamável que cria e retorna uma instância de ambiente, ou um dicionário que mapeia nomes de ambientes para esses chamáveis. A classe do ambiente deve definir métodos que podem ser invocados como ferramentas durante a geração. Cada método deve atender aos mesmos requisitos dastoolsdescritas acima. O ambiente também deve implementar um método chamávelresetque pode ser usado para redefinir o estado entre gerações. O métodoresetdeve retornarNoneou uma string: quando retorna uma string, essa string é adicionada à última mensagem do usuário antes da geração. O ambiente também pode definir um métodoget_rewardque não recebe argumentos e retorna umfloat: quando presente, o ambiente possui a recompensa, eget_rewardé chamado uma vez por rollout concluído para pontuá-lo a partir do estado interno do ambiente. Ele atua como uma fonte de recompensa adicional (com peso 1, registrada sob o nome da classe do ambiente) junto comreward_funcs, que então se torna opcional.Com um único callable, todos os exemplos usam o mesmo ambiente, com uma instância por rollout para que suas interações permaneçam isoladas. Com um dicionário, cada exemplo deve ter um campo
environmentque seleciona seu ambiente pelo nome, e apenas as ferramentas desse ambiente são expostas em seu prompt — permitindo que uma única execução misture tarefas (por exemplo, um ambiente de codificação e um jogo). Este recurso é experimental e pode ser alterado ou removido a qualquer momento sem aviso prévio.
Trainer para o método Group Relative Policy Optimization (GRPO). Este algoritmo foi inicialmente proposto no artigo DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models.
Exemplo:
>>> from trl import GRPOTrainer
>>> from trl.rewards import accuracy_reward
>>> from datasets import load_dataset
>>> dataset = load_dataset("trl-lib/DeepMath-103K", split="train")
>>> trainer = GRPOTrainer(
... model="Qwen/Qwen2.5-0.5B-Instruct",
... reward_funcs=accuracy_reward,
... train_dataset=dataset,
... )
>>> trainer.train()treino
< source >( resume_from_checkpoint: str | bool | None = Nonetrial: optuna.Trial | dict[str, Any] | None = Noneignore_keys_for_eval: list[str] | None = None ) → ~trainer_utils.TrainOutput
Parâmetros
- resume_from_checkpoint (
stroubool, opcional) — Se for umstr, caminho local para um checkpoint salvo por uma instância anterior deTrainer. Se for umboole for igual aTrue, carrega o último checkpoint em args.output_dir salvo por uma instância anterior deTrainer. Se presente, o treinamento será retomado a partir dos estados do modelo/otimizador/agendador carregados aqui. - trial (
optuna.Trialoudict[str, Any], opcional) — A execução do trial ou o dicionário de hiperparâmetros para a busca de hiperparâmetros. - ignore_keys_for_eval (
list[str], opcional) — Uma lista de chaves na saída do seu modelo (se for um dicionário) que devem ser ignoradas ao coletar previsões para avaliação durante o treinamento.
Retorna
~trainer_utils.TrainOutput
Objeto contendo a contagem de etapas globais, a perda de treinamento e as métricas.
Ponto de entrada principal do treinamento.
Salvará o modelo, para que você possa recarregá-lo usando from_pretrained().
Salvará apenas a partir do processo principal.
push_to_hub
< source >( commit_message: str | None = 'End of training'blocking: bool = Truetoken: str | None = Nonerevision: str | None = Noneprivate: bool | None = None**kwargs )
Parâmetros
- commit_message (
str, opcional, padrão"End of training") — Mensagem a ser commitada durante o push. - blocking (
bool, opcional, padrãoTrue) — Se a função deve retornar apenas quando ogit pushtiver terminado. - token (
str, opcional, padrãoNone) — Token com permissão de escrita para sobrescrever os argumentos originais do Trainer. - revision (
str, opcional) — A revisão git de onde o commit será feito. O padrão é o topo do ramo “main”. - private (
bool, opcional) — Se o repositório deve ser privado quando for criado. O padrão éargs.hub_private_repo. Não tem efeito se o repositório já existir. - kwargs (
dict[str, Any], opcional) — Argumentos de palavra-chave adicionais passados para~Trainer.create_model_card.
Envie self.model e self.processing_class para o hub de modelos do 🤗 no repositório self.args.hub_model_id.
GRPOConfig
classe trl.GRPOConfig
< source >( output_dir: str | None = Noneper_device_train_batch_size: int = 8num_train_epochs: float = 3.0max_steps: int = -1learning_rate: float = 1e-06lr_scheduler_type: transformers.trainer_utils.SchedulerType | str = 'linear'lr_scheduler_kwargs: dict | str | None = Nonewarmup_steps: float = 0optim: transformers.training_args.OptimizerNames | str = 'adamw_torch_fused'optim_args: str | None = Noneweight_decay: float = 0.0adam_beta1: float = 0.9adam_beta2: float = 0.999adam_epsilon: float = 1e-08optim_target_modules: None | str | list[str] = Nonegradient_accumulation_steps: int = 1average_tokens_across_devices: bool = Truemax_grad_norm: float = 1.0label_smoothing_factor: float = 0.0bf16: bool | None = Nonefp16: bool = Falsebf16_full_eval: bool = Falsefp16_full_eval: bool = Falsetf32: bool | None = Noneactivation_checkpointing: bool | None = Noneactivation_checkpointing_kwargs: dict[str, typing.Any] | str | None = Nonegradient_checkpointing: bool = Truegradient_checkpointing_kwargs: dict[str, typing.Any] | str | None = Nonetorch_compile: bool = Falsetorch_compile_backend: str | None = Nonetorch_compile_mode: str | None = Noneuse_liger_kernel: bool = Falseliger_kernel_config: dict[str, bool] | None = Noneuse_cache: bool = Falseneftune_noise_alpha: float | None = Nonetorch_empty_cache_steps: int | None = Noneauto_find_batch_size: bool = Falselogging_strategy: transformers.trainer_utils.IntervalStrategy | str = 'steps'logging_steps: float = 10logging_first_step: bool = Falselog_on_each_node: bool = Truelogging_nan_inf_filter: bool = Trueinclude_num_input_tokens_seen: str | bool = 'no'log_level: str = 'passive'log_level_replica: str = 'warning'disable_tqdm: bool | None = Nonereport_to: None | str | list[str] = 'none'run_name: str | None = Noneproject: str = 'huggingface'trackio_space_id: str | None = Nonetrackio_bucket_id: str | None = Nonetrackio_static_space_id: typing.Union[str, NoneType, typing.Literal[False]] = Noneeval_strategy: transformers.trainer_utils.IntervalStrategy | str = 'no'eval_steps: float | None = Noneeval_delay: float = 0per_device_eval_batch_size: int = 8prediction_loss_only: bool = Falseeval_on_start: bool = Falseeval_do_concat_batches: bool = Trueeval_use_gather_object: bool = Falseeval_accumulation_steps: int | None = Noneinclude_for_metrics: list[str] = <factory>batch_eval_metrics: bool = Falsesave_only_model: bool = Falsesave_strategy: transformers.trainer_utils.SaveStrategy | str = 'steps'save_steps: float = 500save_on_each_node: bool = Falsesave_total_limit: int | None = Noneenable_jit_checkpoint: bool = Falsepush_to_hub: bool = Falsehub_token: str | None = Nonehub_private_repo: bool | None = Nonehub_model_id: str | None = Nonehub_strategy: transformers.trainer_utils.HubStrategy | str = 'every_save'hub_always_push: bool = Falsehub_revision: str | None = Noneload_best_model_at_end: bool = Falsemetric_for_best_model: str | None = Nonegreater_is_better: bool | None = Noneignore_data_skip: bool = Falserestore_callback_states_from_checkpoint: bool = Falsefull_determinism: bool = Falseseed: int = 42data_seed: int | None = Noneuse_cpu: bool = Falseaccelerator_config: dict | str | None = Noneparallelism_config: accelerate.parallelism_config.ParallelismConfig | None = Nonedataloader_drop_last: bool = Falsedataloader_num_workers: int = 0dataloader_pin_memory: bool = Truedataloader_persistent_workers: bool = Falsedataloader_prefetch_factor: int | None = Nonedataloader_multiprocessing_context: str | None = Nonedataloader_in_order: bool = Trueremove_unused_columns: bool | None = Falselabel_names: list[str] | None = Nonetrain_sampling_strategy: str = 'random'length_column_name: str = 'length'ddp_find_unused_parameters: bool | None = Noneddp_bucket_cap_mb: int | None = Noneddp_broadcast_buffers: bool | None = Noneddp_static_graph: bool | None = Noneddp_backend: str | None = Noneddp_timeout: int = 1800fsdp: str | None = Nonefsdp_config: dict[str, typing.Any] | str | None = Nonedeepspeed: dict | str | None = Nonedebug: str | list[transformers.debug_utils.DebugOption] = ''skip_memory_metrics: bool = Truedo_train: bool = Falsedo_eval: bool = Falsedo_predict: bool = Falseresume_from_checkpoint: str | None = Nonelocal_rank: int = -1model_init_kwargs: dict[str, typing.Any] | str | None = Nonetrust_remote_code: bool = Falserouter_aux_loss_coef: float | None = Nonedisable_dropout: bool = Falsecast_lm_head_to_fp32: bool = Falsenum_generations: int | None = 8num_generations_eval: int | None = Nonemax_completion_length: int | None = 512ds3_gather_for_generation: bool = Trueshuffle_dataset: bool | None = Truepad_to_multiple_of: int | str | None = 'auto'generation_batch_size: int | None = Nonesteps_per_generation: int | None = Nonetemperature: float = 1.0top_p: float = 1.0top_k: int = 0min_p: float | None = Nonegeneration_kwargs: dict | str | None = Nonechat_template_kwargs: dict | str | None = Nonerepetition_penalty: float = 1.0cache_implementation: str | None = Noneuse_vllm: bool = Falsevllm_mode: str = 'colocate'vllm_model_impl: str = 'vllm'vllm_enable_sleep_mode: bool = Falsevllm_structured_outputs_regex: str | None = Nonevllm_server_base_url: str | None = Nonevllm_server_host: str = '0.0.0.0'vllm_server_port: int = 8000vllm_server_timeout: float = 240.0vllm_group_port: int = 51216vllm_gpu_memory_utilization: float = 0.3vllm_max_model_length: int | None = Nonevllm_tensor_parallel_size: int = 1beta: float = 0.0num_iterations: int = 1epsilon: float = 0.2delta: float | None = Noneepsilon_high: float | None = Nonesapo_temperature_neg: float = 1.05sapo_temperature_pos: float = 1.0vespo_k_pos: float = 2.0vespo_lambda_pos: float = 3.0vespo_k_neg: float = 3.0vespo_lambda_neg: float = 2.0importance_sampling_level: str = 'token'reward_weights: list[float] | None = Nonemulti_objective_aggregation: str = 'sum_then_normalize'scale_rewards: str = 'group'loss_type: str = 'dapo'mask_truncated_completions: bool = Falsesync_ref_model: bool = Falseref_model_mixup_alpha: float = 0.6ref_model_sync_steps: int = 512top_entropy_quantile: float = 1.0entropy_coef: float = 0.0use_adaptive_entropy: bool = Falseentropy_coef_min: float = 0.0entropy_coef_max: float = 1.0entropy_coef_delta: float = 0.005entropy_target: float = 0.2max_tool_calling_iterations: int | None = Nonevllm_importance_sampling_correction: bool = Truevllm_importance_sampling_mode: str = 'sequence_mask'vllm_importance_sampling_clip_max: float | None = 3.0vllm_importance_sampling_clip_min: float | None = Noneoff_policy_mask_threshold: float | None = Noneuse_bias_correction_kl: bool = Truelog_completions: bool = Falselog_multimodal: bool = Truenum_completions_to_print: int | None = Nonelog_unique_prompts: bool = Falselog_completions_hub_repo: str | None = Noneuse_transformers_continuous_batching: bool = Falsetransformers_continuous_batching_config: dict | str | None = Noneuse_transformers_paged: bool = Falsevllm_importance_sampling_cap: float | None = None )
Parâmetros que controlam o modelo e o modelo de referência
- model_init_kwargs (
stroudict[str, Any], opcional) — Argumentos de palavra-chave para from_pretrained, usados quando o argumentomodeldo GRPOTrainer é fornecido como uma string. O valor derevisiontambém é usado ao carregar as classes de processamento. - trust_remote_code (
bool, opcional, padrãoFalse) — Se permite carregar modelos e tokenizers que incluem código Python personalizado do Hub. Encaminhado para from_pretrained e from_pretrained. Também aplicado a cargas de reward-model e reward-tokenizer. - router_aux_loss_coef (
float, opcional) — Coeficiente da perda auxiliar de balanceamento de carga para modelos Mixture-of-Experts (MoE), adicionada à perda de treinamento com esse peso. Quando não definido, o valor declarado na configuração do modelo é utilizado. Defina como0.0para desativá-la. Falha quando usado com um modelo não-MoE. - disable_dropout (
bool, opcional, padrãoFalse) — Se deve desabilitar o dropout no modelo. Isso é útil para treinar com um modelo de referência, pois impede que o modelo gere logprobs diferentes para a mesma entrada. - cast_lm_head_to_fp32 (
bool, opcional, padrãoFalse) — Se deve converter a camada de modelagem de linguagem dos modelos de política e de referência para float32. Conforme recomendado pela receita ScaleRL. Essa flag é suportada apenas quando o modelo possui camadas de embedding de palavras e de modelagem de linguagem não vinculadas, ou seja, quandotie_word_embeddingsna configuração do modelo é False.
Parâmetros que controlam o pré-processamento dos dados
- remove_unused_columns (
bool, opcional, padrãoFalse) — Se deve manter apenas a coluna"prompt"no conjunto de dados. Se você usar uma função de recompensa personalizada que requer qualquer coluna além de"prompts"e"completions", deve manter isso comoFalse. - num_generations (
int, opcional, padrão é8) — Número de gerações por prompt a amostrar. O tamanho efetivo do lote (num_processes * per_device_batch_size * gradient_accumulation_steps) deve ser divisível por este valor.- gradient_accumulation_steps) deve ser divisível por este valor.
- num_generations_eval (
int, opcional) — Número de gerações a amostrar durante a avaliação. Isso permite usar menos gerações durante a avaliação para economizar computação. SeNone, usa o valor denum_generations. - max_completion_length (
intouNone, opcional, padrão512) — Comprimento máximo da conclusão gerada. - ds3_gather_for_generation (
bool, opcional, padrãoTrue) — Esta configuração se aplica ao DeepSpeed ZeRO-3. Se habilitado, os pesos do modelo de política são reunidos para a geração, melhorando a velocidade de geração. No entanto, desabilitar esta opção permite treinar modelos que excedem a capacidade de VRAM de uma única GPU, embora com o custo de uma geração mais lenta. Desabilitar esta opção não é compatível com a geração do vLLM. - shuffle_dataset (
bool, opcional, padrãoTrue) — Se deve embaralhar o conjunto de dados de treinamento. - pad_to_multiple_of (
intoustr, opcional, padrão"auto") — Se definido, os ids dos prompts e dos completions serão preenchidos até um múltiplo deste valor."auto"preenche até um múltiplo de 128 no Neuron (AWS Trainium), que compila uma vez por forma de entrada, e não preenche em outros ambientes.
Parâmetros que controlam a geração
- generation_batch_size (
int, opcional) — Tamanho do lote a ser usado para a geração. Se forNone, o valor padrão é o tamanho efetivo do lote de treinamento:per_device_train_batch_size * num_processes * steps_per_generation. Em outras palavras, há um lote de geração processado por etapa de otimização. Exclusivo mutuamente comsteps_per_generation. - steps_per_generation (
int, opcional) — Número de etapas por geração. SeNone, o valor padrão égradient_accumulation_steps. Exclusivo comgeneration_batch_size. - temperature (
float, opcional, padrão1.0) — Temperatura para amostragem. Quanto maior a temperatura, mais aleatórias são as conclusões. - top_p (
float, opcional, padrão1.0) — Float que controla a probabilidade cumulativa dos tokens principais a serem considerados. Deve estar em (0, 1]. Defina como1.0para considerar todos os tokens. - top_k (
int, opcional, padrão0) — Número de tokens do vocabulário com maior probabilidade a serem mantidos para o filtro top-k. Se0, o filtro top-k é desativado e todos os tokens são considerados. - min_p (
float, opcional) — Probabilidade mínima do token, que será escalada pela probabilidade do token mais provável. Deve ser um valor entre0.0e1.0. Valores típicos estão na faixa de0.01-0.2. - generation_kwargs (
dict[str, Any], opcional) — Argumentos de palavra-chave adicionais para passar ao GenerationConfig (se estiver usando transformers) ouSamplingParams(se estiver usando vLLM) ao amostrar as conclusões. Isso pode ser usado para personalizar ainda mais o comportamento da geração, como definirsuppress_tokens,num_beams, etc. Se contiver chaves que conflitam com os outros parâmetros de geração (comomin_p,top_p, etc.), eles os substituirão. - chat_template_kwargs (
dict[str, Any], opcional) — Argumentos de palavra-chave adicionais para passar à funçãoapply_chat_templateao gerar completions. - repetition_penalty (
float, opcional, padrão1.0) — Float que penaliza novos tokens com base em sua presença no prompt e no texto gerado até o momento. Valores >1.0incentivam o modelo a usar novos tokens, enquanto valores <1.0incentivam o modelo a repetir tokens. - cache_implementation (
str, opcional) — Implementação do método de cache para uma geração mais rápida quandouse_vllmestá definido comoFalse.
Parâmetros que controlam a aceleração da geração com vLLM
- use_vllm (
bool, opcional, padrãoFalse) — Se deve usar o vLLM para gerar completions. Se definido comoTrue, o trainer usará o vLLM para geração em vez do padrão model.generate(). Requer quevllmesteja instalado. - vllm_mode (
str, opcional, padrão é"colocate") — Modo a ser usado para a integração com o vLLM quandouse_vllmestá definido comoTrue. Deve ser um dos valores"server"ou"colocate"."server": O trainer enviará solicitações de geração para um servidor vLLM separado. Certifique-se de que um servidor vLLM está em execução (inicie comvllm serve)."colocate": o vLLM será executado no mesmo processo e compartilhará as GPUs de treinamento. Isso evita a necessidade de um servidor separado, mas pode causar contenda de recursos com o treinamento.
- vllm_model_impl (
str, opcional, padrão"vllm") — Implementação do modelo a ser usada para o vLLM. Deve ser uma das opções"transformers"ou"vllm"."transformers": Use o backendtransformerspara a implementação do modelo."vllm": Use a bibliotecavllmpara a implementação do modelo. - vllm_enable_sleep_mode (
bool, opcional, padrãoFalse) — Ativa o modo de suspensão do vLLM para descarregar pesos/cache durante o passo do otimizador. Mantém o uso de memória da GPU baixo, mas acordar o mecanismo adiciona latência de transferência entre host e dispositivo. - vllm_structured_outputs_regex (
str, opcional) — Regex para saídas estruturadas do vLLM. SeNone(padrão), as saídas estruturadas ficam desativadas.
Parâmetros que controlam o servidor vLLM (usados apenas quando `vllm_mode` é `"server"`)
- vllm_server_base_url (
str, opcional) — URL base para o servidor vLLM (por exemplo,"http://localhost:8000"). Se fornecida,vllm_server_hostevllm_server_portsão ignorados. - vllm_server_host (
str, opcional, padrão"0.0.0.0") — Host do servidor vLLM para conexão. Ignorado sevllm_server_base_urlfor fornecido. - vllm_server_port (
int, opcional, padrão8000) — Porta do servidor vLLM para conexão. Ignorado sevllm_server_base_urlfor fornecido. - vllm_server_timeout (
float, opcional, padrão240.0) — Duração total do tempo limite, em segundos, para aguardar que o servidor vLLM esteja ativo. Se o servidor não estiver ativo após o tempo limite, umConnectionErrorserá lançado. - vllm_group_port (
int, opcional, padrão51216) — Número da porta para o grupo de atualização de pesos. Isso é usado para se comunicar com o servidor vLLM. A menos que a porta esteja ocupada, não há necessidade de alterá-la.
Parâmetros que controlam a execução do vLLM co-localizado (usados apenas quando `vllm_mode` é `"colocate"`)
- vllm_gpu_memory_utilization (
float, opcional, padrão0.3) — Controla a utilização de memória de GPU para o vLLM. Esta configuração só se aplica quandovllm_modeestá definido como"colocate". Se você estiver usandovllm_mode="server", este parâmetro deve ser passado separadamente ao iniciar o servidor vLLM por meio da flag--vllm_gpu_memory_utilization. - vllm_max_model_length (
int, opcional) — Janela de contexto para o vLLM. Defina-a com pelo menos o comprimento máximo do prompt no conjunto de dados maismax_completion_length; se omitida, ela é inferida a partir da configuração do modelo. - vllm_tensor_parallel_size (
int, opcional, padrão1) — Controla o tamanho da paralelização de tensor para o vLLM. Essa configuração só se aplica quandovllm_modeestá definido como"colocate". Se você estiver usandovllm_mode="server", este parâmetro deve ser passado separadamente ao iniciar o servidor vLLM por meio da flag--vllm_tensor_parallel_size.
Parâmetros que controlam o treinamento
- beta (
float, opcional, padrão0.0) — Coeficiente KL. Se0.0(padrão), o modelo de referência não é carregado, reduzindo o uso de memória e melhorando a velocidade de treinamento. DeepSeek-R1 incentivizes reasoning in LLMs through reinforcement learning usa um valor de0.001. - num_iterations (
int, opcional, padrão1) — Número de iterações por lote (denotado como μ no algoritmo). - epsilon (
float, opcional, padrão0.2) — Valor para o recorte (clipping). - delta (
float, opcional) — Ativa o limite superior de clipping na perda GRPO de dois lados quando definido como um float. SeNone(padrão), o clipping padrão do GRPO é usado. Recomendado ser maior que1 + εquando ativado. Este método é introduzido no relatório técnico do INTELLECT-2. - epsilon_high (
float, opcional) — Valor superior de epsilon para o recorte. Se não for especificado, o valor padrão será o mesmo do limite inferior especificado no argumentoepsilon. O paper DAPO recomenda0.28. Quando usado comloss_type='cispo', isso corresponde ao parâmetro ε_max especificado no paper ScaleRL e o valor padrão é o recomendado5.0. - sapo_temperature_neg (
float, opcional, padrão1.05) — Temperatura para tokens com pontuações de vantagem não positivas, utilizada na função de perdasapo. Este parâmetro foi introduzido no artigo Soft Adaptive Policy Optimization. - sapo_temperature_pos (
float, opcional, padrão1.0) — Temperatura para tokens com pontuações de vantagem positivas, utilizada na função de perdasapo. Este parâmetro é introduzido no artigo Soft Adaptive Policy Optimization. - vespo_k_pos (
float, opcional, padrão2.0) — parâmetro k para vantagens positivas, é o expoente da potência na perda VESPO. Controla o quão agressivamente reduzimos o peso de amostras com pesos de importância baixos (quando a razão de amostragem de importância < 1). - vespo_lambda_pos (
float, opcional, padrão3.0) — parâmetro lambda para vantagens positivas, é o fator de decaimento na perda VESPO. Controla o quão agressivamente rebaixamos o peso de amostras com pesos de importância altos (quando a razão de amostragem de importância > 1). - vespo_k_neg (
float, opcional, padrão3.0) — parâmetro k para vantagens negativas, é o expoente da potência na perda VESPO. Controla o quão agressivamente reduzimos o peso de amostras com pesos de importância baixos (quando a razão de amostragem de importância < 1). - vespo_lambda_neg (
float, opcional, padrão2.0) — parâmetro lambda para vantagens negativas, é o fator de decaimento exponencial na perda VESPO. Controla o quão agressivamente rebaixamos o peso de amostras com pesos de importância altos (quando a razão de amostragem de importância > 1). - importance_sampling_level (
str, opcional, padrão"token") — Controla se as razões de amostragem de importância são calculadas no nível"token"ou"sequence"."token"mantém as razões brutas de log-probabilidade por token (um peso por token)."sequence"faz a média das razões de log-probabilidade entre os tokens válidos para produzir uma única razão por sequência. O artigo GSPO mostra que a amostragem no nível de sequência frequentemente resulta em treinamento mais estável e melhor alinhamento com recompensas no nível de sequência. - reward_weights (
list[float], opcional) — Pesos para cada função de recompensa. Deve corresponder ao número de funções de recompensa. SeNone, todas as recompensas são ponderadas igualmente com peso1.0. - multi_objective_aggregation (
str, opcional, padrão é"sum_then_normalize") — Método para agregar múltiplas funções de recompensa. Os valores suportados são:"sum_then_normalize"(padrão): primeiro soma as recompensas ponderadas de cada função de recompensa e, em seguida, aplica a escala/normalização de recompensa especificada porscale_rewards(vejascale_rewardspara mais detalhes)."normalize_then_sum": Primeiro normaliza/escala cada função de recompensa entre as gerações (dentro de cada grupo), em seguida soma as recompensas normalizadas usando os pesos especificados. A recompensa agregada é então normalizada no nível do lote ao formar as vantagens. Esta é a abordagem sugerida pelo artigo GDPO: Group reward-Decoupled Normalization Policy Optimization for Multi-reward RL Optimization.
- scale_rewards (
stroubool, opcional, padrão é"group") — Especifica a estratégia de escala para recompensas. Os valores suportados são:Trueou"group"(padrão): as recompensas são escaladas pelo desvio padrão dentro de cada grupo, garantindo variância unitária dentro de um grupo."batch": as recompensas são escaladas pelo desvio padrão de todo o lote, conforme recomendado no artigo PPO Lite.Falseou"none": nenhuma escala é aplicada. O artigo do Dr. GRPO recomenda não escalar as recompensas, pois a escalação pelo desvio padrão introduz um viés de dificuldade por pergunta.
- loss_type (
str, opcional, padrão é"dapo") — Especifica a formulação de perda a ser usada. Os valores suportados são:"grpo": Agrega as perdas no nível de tokens normalizando pelo comprimento da sequência. Não é recomendado devido ao viés de comprimento — essa abordagem tende a favorecer conclusões mais curtas com vantagens positivas e mais longas com vantagens negativas."dr_grpo": agrega as perdas no nível de tokens normalizando com uma constante global. Esse método foi introduzido no artigo Dr. GRPO para eliminar o viés de comprimento. O valor da constante corresponde amax_completion_length."dapo"(padrão): agrega as perdas no nível de token normalizando pelo número de tokens ativos no lote acumulado global. Esse método foi introduzido no artigo DAPO para eliminar o viés de comprimento."bnpo": Agrega as perdas no nível de token normalizando pelo número de tokens ativos no lote local. Observe que a normalização é realizada apenas sobre o lote local, portanto, os resultados podem variar ligeiramente dependendo do tamanho do lote local, apesar de um tamanho de lote efetivo constante. Ao usarper_device_train_batch_size==1, a perda é equivalente à perda do GRPO."cispo": Recorta os pesos de amostragem de importância em vez dos pesos de amostragem de importância escalados pela vantagem. Os pesos recortados são então multiplicados pelas vantagens e pelos log probs do modelo de política. As perdas individuais de tokens são agregadas normalizando pelo número de tokens ativos no lote global acumulado. Este método foi introduzido no artigo MiniMax-M1."sapo": perda de Soft Adaptive Policy Optimization, conforme introduzido no artigo sobre Soft Adaptive Policy Optimization. Substitui o recorte rígido por um controle suave, regulado por temperatura, que atenua adaptativamente as atualizações fora da política, preservando os sinais de aprendizado úteis."luspo": Perda de Otimização de Política de Sequência Sem Viés de Comprimento. Uma perda em nível de sequência que escala a perda de cada sequência pelo seu comprimento. Esta é uma modificação do GSPO e requerimportance_sampling_level="sequence". Introduzido no artigo LUSPO."vespo": Variational Sequence-Level Soft Policy Optimization. Substitui o recorte rígido por uma função de ponderação Gamma suave e assimétrica aplicada diretamente aos pesos de importância em nível de sequência. Introduzido no artigo VESPO.
- mask_truncated_completions (
bool, opcional, padrãoFalse) — Quando habilitado, as conclusões truncadas são excluídas do cálculo da perda, evitando que sejam penalizadas incorretamente e introduzam ruído durante o treinamento. De acordo com o DAPO, essa é uma boa prática para a estabilidade do treinamento. - sync_ref_model (
bool, opcional, padrãoFalse) — Se deve sincronizar o modelo de referência com o modelo ativo a cadaref_model_sync_stepspassos, usando o parâmetroref_model_mixup_alpha. Essa sincronização origina-se do artigo TR-DPO. - ref_model_mixup_alpha (
float, opcional, padrão0.6) — parâmetro α do paper TR-DPO, que controla a mistura entre a política atual e a política de referência anterior durante as atualizações. A política de referência é atualizada de acordo com a equação:π_ref = α * π_θ + (1 - α) * π_ref_prev. Para usar este parâmetro, você deve definirsync_ref_model=True. - ref_model_sync_steps (
int, opcional, padrão512) — parâmetro τ do paper TR-DPO, que determina a frequência com que a política atual é sincronizada com a política de referência. Para usar este parâmetro, você deve definirsync_ref_model=True. - top_entropy_quantile (
float, opcional, padrão1.0) — parâmetro ρ do artigo Beyond the 80/20 Rule. Mantém no termo de perda da política apenas o quantil superior-ρ de tokens pela entropia da distribuição de probabilidade em cada posição da sequência, melhorando os resultados. Intervalo:[0.0-1.0]. Um valor de0.0mascara todos os tokens, exceto o de maior entropia;1.0mantém todos os tokens. O artigo recomenda um valor de0.2. Se usado commask_truncated_completions=True, apenas tokens de conclusões não truncadas são considerados. - entropy_coef (
float, opcional, padrão0.0) — Coeficiente do termo de regularização de entropia na perda. Um valor positivo adiciona um bônus de entropia que incentiva a exploração, impedindo que a política colapse para saídas quase determinísticas. O bônus é sempre a entropia média por token, independentemente deloss_type; ele não é reescalado para corresponder à normalização da política de um tipo de perda, portantoentropy_coeftem o mesmo significado para todos os tipos de perda. Quandouse_adaptive_entropy=True, este valor atua como o coeficiente inicial e é atualizado a cada passo do otimizador. Não tem efeito quando definido como0.0(padrão). - use_adaptive_entropy (
bool, opcional, padrãoFalse) — Se deve usar o controle adaptativo de entropia, introduzido em Skywork-OR1. Quando habilitado, o coeficiente de entropiaentropy_coefé atualizado a cada passo do otimizador: incrementado porentropy_coef_deltaquando a entropia atual está abaixo deentropy_targete decrementado caso contrário. O coeficiente é aplicado apenas quando a entropia está em ou abaixo deentropy_target. - entropy_coef_min (
float, opcional, padrão0.0) — Limite inferior para o coeficiente de entropia ao usar controle adaptativo de entropia. - entropy_coef_max (
float, opcional, padrão1.0) — Limite superior para o coeficiente de entropia ao usar controle adaptativo de entropia. - entropy_coef_delta (
float, opcional, padrão0.005) — Tamanho do passo para ajustar o coeficiente de entropia em cada passo do otimizador durante o controle adaptativo de entropia. - entropy_target (
float, opcional, padrão0.2) — Entropia média por token alvo (em nats) usada pelo controle adaptativo de entropia. O coeficiente é aplicado somente quando a entropia atual cai para este valor ou abaixo. Medida sobre o mesmo conjunto de tokens da perda de política: todos os tokens de conclusão por padrão, ou apenas o subconjunto de alta entropia quandotop_entropy_quantile < 1.0. Modelos de linguagem típicos têm entropias por token na faixa de 2–10 nats, então o padrão de0.2quase nunca ativa a regularização (apenas em colapso quase completo da entropia); defina-o próximo da entropia que você observa no início do treinamento (registrado como a métricaentropy) para que o bônus seja ativado antes que a política colapse (e considere o subconjunto de tokens ao usartop_entropy_quantile). - max_tool_calling_iterations (
int, opcional) — Número máximo de turnos de chamada de ferramentas ao treinar um agente. SeNone, não há limite e a geração para quando o modelo gera um turno de resposta sem chamadas de ferramentas, quando a conclusão (todos os turnos e resultados das ferramentas) atingemax_completion_lengthtokens, ou quando a sequência completa atinge o comprimento máximo do modelo (vllm_max_model_lengthcomvllm_mode="colocate", omax_position_embeddingsdo modelo caso contrário). - vllm_importance_sampling_correction (
bool, opcional, padrãoTrue) — Se deve aplicar Importance Sampling (IS) para corrigir a discrepância entre os logprobs de conclusão do vLLM e os logprobs de treinamento recalculados. Se definido comoFalse, nenhum IS é aplicado, independentemente devllm_importance_sampling_mode. QuandoTrue, o modo selecionado determina como as razões de IS são calculadas e limitadas. Comtop_p < 1,top_k > 0oumin_p > 0, os logprobs recalculados são normalizados sobre o conjunto de candidatos do qual cada token foi amostrado, o que requer vLLM 0.28 ou posterior e, no modo servidor, um servidor iniciado com--return-sampling-mask(e--enable-scale-outa partir do vLLM 0.30); caso contrário, as razões de IS serão enviesadas. O vLLM limita esse conjunto de candidatos comtop_k, portantotop_p < 1,min_p > 0e saídas estruturadas, que o restringem aos tokens permitidos pela gramática, requeremtop_k > 0(por exemplo,top_k=512). Saídas estruturadas, que de outra forma travariam o treinamento, também requerem esse conjunto de candidatos. O vLLM também aplicarepetition_penaltyaos logprobs que retorna, portantorepetition_penalty != 1.0requervllm_importance_sampling_correction=False. - vllm_importance_sampling_mode (
str, opcional, padrão é"sequence_mask") — Especifica como a Importance Sampling é executada quandovllm_importance_sampling_correction=True. Os valores possíveis são:"token_truncate": IS truncado em nível de token. As proporções por token são limitadas a [C_min, C_max]."token_mask": IS mascarado em nível de token. As proporções por token fora de [C_min, C_max] são definidas como zero."sequence_truncate": IS truncado em nível de sequência. Uma única razão de sequência é limitada a [C_min, C_max] e aplicada a todos os tokens da sequência."sequence_mask": IS mascarado em nível de sequência. Sequências com razões fora de [C_min, C_max] são mascaradas.
- vllm_importance_sampling_clip_max (
float, opcional, padrão3.0) — Limite superior de importance sampling C_max usado porvllm_importance_sampling_mode. Para os modos*_truncate, as razões de importance são limitadas superiormente em C_max. Para os modos*_mask, as razões maiores que C_max são definidas como zero. - vllm_importance_sampling_clip_min (
float, opcional) — Limite inferior de importance sampling C_min usado porvllm_importance_sampling_mode. Para os modos*_truncate, as razões são recortadas por baixo em C_min. Para os modos*_mask, as razões abaixo de C_min são definidas como zero. Para mascarar estritamente as razões abaixo de C_min sem limite superior, definavllm_importance_sampling_clip_max=None. - off_policy_mask_threshold (
float, opcional) — Limiar para mascaramento de sequências off-policy. SeNone, o mascaramento de sequências off-policy é desativado. Quando definido, sequências com vantagens negativas e alta divergência de KL são mascaradas para estabilizar o treinamento. Este parâmetro corresponde ao limiardeltana Equação 9 do artigo DeepSeek-V3.2. Ele espera um valor positivo (por exemplo, 0.5). - use_bias_correction_kl (
bool, opcional, padrãoTrue) — Se deve multiplicar o termo KL pela razão de amostragem de importância, para que o gradiente da KL se torne o gradiente não viesado da KL reversa, conforme descrito no paper do DeepSeek-V3.2. Isso altera o gradiente da KL sempre quebeta != 0, incluindo no on-policy: a razão é diferenciável, então afeta o gradiente mesmo onde seu valor é exatamente 1. A propriedade de KL reversa não viesada vale paraimportance_sampling_level="token"; com"sequence", um peso de nível de sequência é propagado para a KL por token.
Parâmetros que controlam o registro de logs
- log_completions (
bool, opcional, padrãoFalse) — Se deve registrar uma amostra de pares (prompt, completion) a cadalogging_stepspassos. Se orichestiver instalado, ele imprime a amostra. Se o registro dowandbe/ou dotrackioestiver habilitado, ele registra a amostra nowandbe/ou notrackio. - log_multimodal (
bool, opcional, padrãoTrue) — Se deve registrar conteúdo multimodal (imagens, vídeos, etc.) junto com as conclusões. Desative isso para reduzir o tamanho do log ao usar dados multimodais de alta resolução. - num_completions_to_print (
int, opcional) — Número de conclusões a serem exibidas comrich. SeNone, todas as conclusões são registradas. - log_unique_prompts (
bool, opcional, padrãoFalse) — Se deve registrar prompts únicos. SeTrue, apenas prompts únicos são registrados. SeFalse, todos os prompts são registrados. - log_completions_hub_repo (
str, opcional) — Repositório do Hugging Face Hub para salvar as completions. Deve ser um nome de repositório completo como'username/reponame'ou'orgname/reponame', ou apenas'reponame', no qual caso o repositório será criado no namespace do usuário do Hugging Face atualmente conectado. Observe que este repositório será público a menos que você definahub_private_repo=Trueou o padrão da sua organização seja criar repositórios privados.
Parâmetros que controlam a aceleração da geração com o continuous batching do Transformers
- use_transformers_continuous_batching (
bool, opcional, padrãoFalse) — Se deve usar o motor de continuous batching do transformers para gerar completions. Requertransformers>=5.8.0. - transformers_continuous_batching_config (
dict, opcional) — Argumentos de palavra-chave paraContinuousBatchingConfig.
Parâmetros obsoletos
- use_transformers_paged —
O parâmetro
use_transformers_pagedestá obsoleto e será removido na versão v2.0.0. Useuse_transformers_continuous_batchingem vez disso. - vllm_importance_sampling_cap —
O parâmetro
vllm_importance_sampling_capestá obsoleto e será removido na versão v2.0.0. Usevllm_importance_sampling_clip_maxem vez disso.
Classe de configuração para o GRPOTrainer.
Esta classe inclui apenas os parâmetros específicos para o treinamento GRPO. Para a lista completa de argumentos de treinamento, consulte a documentação de TrainingArguments. Observe que os valores padrão nesta classe podem diferir dos presentes em TrainingArguments.
Usando HfArgumentParser, podemos transformar essa classe em argumentos argparse que podem ser especificados na linha de comando.
Esses parâmetros possuem valores padrão diferentes de TrainingArguments:
logging_steps: O valor padrão é10em vez de500.gradient_checkpointing: O padrão éTrueem vez deFalse.bf16: Padrão éTruesefp16não estiver definido, em vez deFalse.learning_rate: O valor padrão é1e-6em vez de5e-5.