TRL documentation

KTO Trainer

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

and get access to the augmented documentation experience

to get started

KTO Trainer

All_models-KTO-blue

Visão geral

O TRL oferece suporte ao Treinador de Otimização Kahneman-Tversky (KTO) para o treinamento de modelos de linguagem, conforme descrito no artigo KTO: Model Alignment as Prospect Theoretic Optimization de Kawin Ethayarajh, Winnie Xu, Niklas Muennighoff, Dan Jurafsky, Douwe Kiela.

O resumo do artigo é o seguinte:

A teoria da perspectiva de Kahneman & Tversky nos diz que os humanos percebem variáveis aleatórias de uma maneira enviesada, porém bem definida; por exemplo, os humanos são notoriamente avessos a perdas. Mostramos que os objetivos para alinhar LLMs com feedback humano incorporam implicitamente muitos desses vieses — o sucesso desses objetivos (por exemplo, DPO) em relação à minimização da entropia cruzada pode ser atribuído em parte ao fato de serem funções de perda conscientes dos humanos (HALOs). No entanto, as funções de utilidade que esses métodos atribuem aos humanos ainda diferem daquelas na literatura da teoria da perspectiva. Usando um modelo de utilidade humana de Kahneman-Tversky, propomos um HALO que maximiza diretamente a utilidade das gerações, em vez de maximizar a log-verossimilhança das preferências, como os métodos atuais fazem. Chamamos essa abordagem de Otimização de Kahneman-Tversky (KTO), e ela iguala ou supera o desempenho de métodos baseados em preferências em escalas de 1B a 30B. Crucialmente, o KTO não precisa de preferências — apenas de um sinal binário de se uma saída é desejável ou indesejável para uma entrada dada. Isso o torna muito mais fácil de usar no mundo real, onde dados de preferência são escassos e caros.

O código oficial pode ser encontrado em ContextualAI/HALOs.

Este método de pós-treinamento foi contribuído por Kashif Rasul, Younes Belkada, Lewis Tunstall, Pablo Vicente e, posteriormente, refatorado por Albert Villanova del Moral.

Início rápido

Este exemplo demonstra como treinar um modelo usando o método KTO. Usamos o modelo Qwen 0.5B como modelo base. Usamos os dados de preferência do KTO Mix 14k. Você pode visualizar os dados no dataset aqui:

Abaixo está o script para treinar o modelo:

# train_kto.py
from datasets import load_dataset
from trl import KTOConfig, KTOTrainer
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
train_dataset = load_dataset("trl-lib/kto-mix-14k", split="train")

training_args = KTOConfig(output_dir="Qwen2-0.5B-KTO")
trainer = KTOTrainer(model=model, args=training_args, processing_class=tokenizer, train_dataset=train_dataset)
trainer.train()

Execute o script usando o seguinte comando:

accelerate launch train_kto.py

Distribuído em 8 x H100 GPUs, o treinamento leva aproximadamente 30 minutos. Você pode verificar o progresso do treinamento analisando o gráfico de recompensa. Uma tendência de aumento na margem de recompensa indica que o modelo está melhorando e gerando respostas melhores ao longo do tempo.

kto qwen2 reward margin

Para ver como o modelo treinado se comporta, você pode usar o Transformers Chat CLI.

$ transformers chat trl-lib/Qwen2-0.5B-KTO
<quentin_gallouedec>:
What is the best programming language?

<trl-lib/Qwen2-0.5B-KTO>:
The best programming language can vary depending on individual preferences, industry-specific requirements, technical skills, and familiarity with the specific use case or task. Here are some widely-used programming languages that have been noted as popular and widely used:

Here are some other factors to consider when choosing a programming language for a project:

 1 JavaScript: JavaScript is at the heart of the web and can be used for building web applications, APIs, and interactive front-end applications like frameworks like React and Angular. It's similar to C, C++, and F# in syntax structure and is accessible and easy to learn, making it a popular choice for beginners and professionals alike.
 2 Java: Known for its object-oriented programming (OOP) and support for Java 8 and .NET, Java is used for developing enterprise-level software applications, high-performance games, as well as mobile apps, game development, and desktop applications.
 3 C++: Known for its flexibility and scalability, C++ offers comprehensive object-oriented programming and is a popular choice for high-performance computing and other technical fields. It's a powerful platform for building real-world applications and games at scale.
 4 Python: Developed by Guido van Rossum in 1991, Python is a high-level, interpreted, and dynamically typed language known for its simplicity, readability, and versatility.

Tipo e formato de dataset esperados

O KTO requer um conjunto de dados de preferência não pareada. Alternativamente, você pode fornecer um conjunto de dados de preferência pareada (também conhecido simplesmente como conjunto de dados de preferências). Nesse caso, o treinador o converterá automaticamente para o formato não pareado, separando as respostas escolhidas e rejeitadas, atribuindo label = True às conclusões escolhidas e label = False às rejeitadas.

O KTOTrainer é compatível com os formatos de dataset padrão e conversacional. Quando fornecido com um dataset conversacional, o trainer aplica automaticamente o chat template ao dataset.

# Standard format
unpaired_preference_example = {"prompt": "The sky is", "completion": " blue.", "label": True}

# Conversational format
unpaired_preference_example = {"prompt": [{"role": "user", "content": "What color is the sky?"}],
                               "completion": [{"role": "assistant", "content": "It is blue."}],
                               "label": True}

Em teoria, o conjunto de dados deve conter pelo menos uma conclusão escolhida e uma rejeitada. No entanto, alguns usuários executaram o KTO com sucesso usando apenas dados escolhidos ou apenas rejeitados. Ao usar apenas dados rejeitados, é aconselhável adotar uma taxa de aprendizado conservadora.

Aprofundando-se no método KTO

A Otimização Kahneman-Tversky (KTO) é um método de treinamento projetado para alinhar um modelo de linguagem usando apenas um sinal binário de se uma saída é desejável ou indesejável para uma entrada dada, em vez de pares de conclusões preferidas/despreferidas. Baseando-se na teoria da perspectiva de Kahneman e Tversky, ela define uma perda consciente do humano (HALO) que maximiza diretamente a utilidade das gerações, ponderando exemplos desejáveis e indesejáveis de forma assimétrica para refletir a aversão à perda humana.

Esta seção detalha como o KTO funciona na prática, abordando as etapas principais: pré-processamento e cálculo da perda.

Pré-processamento e tokenização

Durante o treinamento, cada exemplo deve conter um prompt, uma completion e um label booleano indicando se a completion é desejável (True) ou indesejável (False). Para mais detalhes sobre os formatos esperados, consulte Dataset formats. O KTOTrainer tokeniza cada entrada usando o tokenizer do modelo.

Calculando a perda

O termo de divergência KL usado pela perda KTO é estimado ao emparelhar cada prompt com uma conclusão não correspondente retirada de outra parte do lote. Por esse motivo, os tipos de perda que estimam o termo KL (todos, exceto apo_zero_unpaired) exigem um tamanho de lote de treinamento por dispositivo maior que 1 e uma estratégia de amostragem sequencial, para que os pares não correspondentes sejam estáveis ao longo de um lote.

A perda usada no KTO (Eq. 7 do artigo) é definida da seguinte forma: LKTO(θ)=E(x,y) ⁣[w(y)(1−v(x,y))] \mathcal{L}_{\mathrm{KTO}}(\theta) = \mathbb{E}_{(x,y)}\!\left[ w(y)\Big(1 - v(x, y)\Big) \right]

onde o valor v(x,y) v(x, y) é v(x,y)={σ ⁣(β(log⁡πθ(y∣x)πref(y∣x)−KL))if y is desirableσ ⁣(β(KL−log⁡πθ(y∣x)πref(y∣x)))if y is undesirable v(x, y) = \begin{cases} \sigma\!\left(\beta\big(\log\frac{\pi_{\theta}(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)} - \mathrm{KL}\big)\right) & \text{if } y \text{ is desirable} \\ \sigma\!\left(\beta\big(\mathrm{KL} - \log\frac{\pi_{\theta}(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)}\big)\right) & \text{if } y \text{ is undesirable} \end{cases}

Aqui x x é o prompt, y y é a conclusão, πθ \pi_{\theta} é o modelo de política em treinamento, πref \pi_{\mathrm{ref}} é o modelo de referência, σ \sigma é a função sigmoide, β>0 \beta > 0 controla o desvio em relação ao modelo de referência, e KL \mathrm{KL} é o termo de divergência KL estimado. O peso w(y) w(y) é desirable_weight para conclusões desejáveis e undesirable_weight para as indesejáveis, usado para compensar um desequilíbrio entre o número de exemplos desejáveis e indesejáveis.

Tipos de Perda

loss_type=Descrição
"kto" (padrão)A perda KTO do artigo KTO. Uma perda consciente de humanos (HALO) baseada na teoria da perspectiva de Kahneman-Tversky que maximiza a utilidade de conclusões desejáveis e a minimiza para as indesejáveis, usando um termo de divergência KL estimado como ponto de referência.
"apo_zero_unpaired"A variante não pareada da perda APO-zero do artigo APO. Ela aumenta a probabilidade de conclusões desejáveis e diminui a probabilidade das indesejáveis, sem estimar o termo de divergência KL. Use esta perda quando você acredita que as conclusões desejáveis são melhores que a saída padrão do modelo.

Métricas registradas

Durante o treinamento e a avaliação, registramos as seguintes métricas:

  • global_step: O número total de etapas do otimizador realizadas até o momento.
  • epoch: O número do epoch atual, com base na iteração do conjunto de dados.
  • num_tokens: O número total de tokens processados até o momento.
  • loss: A perda média de KTO no intervalo de registro atual.
  • entropy: A entropia média da distribuição de tokens prevista pelo modelo para tokens não mascarados.
  • aux_loss: A perda auxiliar de balanceamento de carga de um modelo Mixture-of-Experts, antes de ser escalada por router_aux_loss_coef e adicionada à perda. Registrada apenas quando o modelo é um modelo MoE e router_aux_loss_coef é diferente de zero.
  • kl: A divergência de KL média estimada entre o modelo de política e o modelo de referência, usada como ponto de referência na perda KTO.
  • learning_rate: a taxa de aprendizado atual, que pode mudar dinamicamente se um agendador for usado.
  • grad_norm: A norma L2 dos gradientes, calculada antes do recorte de gradientes.
  • logits/chosen: Os valores médios de logit atribuídos pelo modelo aos tokens na conclusão escolhida (desejável).
  • logits/rejected: Os valores médios de logit atribuídos pelo modelo aos tokens na conclusão rejeitada (indesejável).
  • logps/chosen: A média da log-probabilidade atribuída pelo modelo aos tokens na conclusão escolhida (desejável).
  • logps/rejected: A média da log-probabilidade atribuída pelo modelo aos tokens na conclusão rejeitada (indesejável).
  • rewards/chosen: A recompensa implícita média calculada para a conclusão escolhida (desejável), calculada como βlog⁡πθ(y∣x)πref(y∣x) \beta \log \frac{\pi_{\theta}(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)} .
  • rewards/rejected: A recompensa implícita média calculada para a conclusão rejeitada (indesejável), calculada como βlog⁡πθ(y∣x)πref(y∣x) \beta \log \frac{\pi_{\theta}(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)} .
  • rewards/margins: A margem média de recompensa implícita entre as conclusões escolhidas e rejeitadas.

Personalização

Compatibilidade e restrições

Algumas combinações de argumentos são intencionalmente restritas na implementação atual do KTOTrainer:

  • Adaptadores PEFT que visam lm_head não são suportados (use modules_to_save=["lm_head"] em vez disso).
  • sync_ref_model=True não é suportado ao treinar com modelos PEFT que não mantêm um ref_model independente.
  • sync_ref_model=True não pode ser combinado com precompute_ref_log_probs=True.
  • precompute_ref_log_probs=True não é suportado com IterableDataset (treino ou avaliação) nem com conjuntos de dados de visão.
  • Os tipos de perda que estimam o termo de divergência KL (todos, exceto "apo_zero_unpaired") exigem train_sampling_strategy="sequential" e um tamanho de lote de treinamento por dispositivo maior que 1.

Inicialização do modelo

Você pode passar diretamente os kwargs do método from_pretrained() para o KTOConfig. Por exemplo, se você quiser carregar um modelo em uma precisão diferente, análogo a

model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-0.5B-Instruct", dtype=torch.bfloat16)

você pode fazer isso passando o argumento model_init_kwargs={"dtype": torch.bfloat16} para o KTOConfig.

from trl import KTOConfig

training_args = KTOConfig(
    model_init_kwargs={"dtype": torch.bfloat16},
)

Observe que todos os argumentos de palavra-chave de from_pretrained() são suportados.

Treine adaptadores com PEFT

Suportamos integração estreita com a biblioteca 🤗 PEFT, permitindo que qualquer usuário treine adaptadores de forma conveniente e os compartilhe no Hub, em vez de treinar o modelo inteiro.

from datasets import load_dataset
from trl import KTOTrainer
from peft import LoraConfig

dataset = load_dataset("trl-lib/kto-mix-14k", split="train")

trainer = KTOTrainer(
    "Qwen/Qwen2-0.5B-Instruct",
    train_dataset=dataset,
    peft_config=LoraConfig(),
)

trainer.train()

Você também pode continuar o treinamento do seu PeftModel. Para isso, primeiro carregue um PeftModel fora do KTOTrainer e passe-o diretamente para o trainer sem passar o argumento peft_config.

Ao treinar adaptadores, você geralmente usa uma taxa de aprendizado mais alta do que no ajuste fino completo, pois apenas novos parâmetros estão sendo aprendidos.

Tool Calling com KTO

O KTOTrainer oferece suporte completo ao ajuste fino de modelos com capacidades de tool calling. Nesse caso, cada exemplo do conjunto de dados deve incluir:

  • As mensagens da conversa (prompt e completion), incluindo qualquer chamada de ferramenta (tool_calls) e respostas de ferramenta (mensagens com o papel tool)
  • A lista de ferramentas disponíveis na coluna tools, geralmente fornecida como esquemas JSON

Para mais detalhes sobre a estrutura esperada do conjunto de dados, consulte a seção Formato do Conjunto de Dados — Chamada de Ferramenta.

Treinando Modelos de Visão e Linguagem

KTOTrainer oferece suporte completo ao treinamento de Vision-Language Models (VLMs). Para treinar um VLM, forneça um conjunto de dados com uma coluna image (uma única imagem por amostra) ou uma coluna images (lista de imagens por amostra). Para mais informações sobre a estrutura esperada do conjunto de dados, consulte a seção Dataset Format — Vision Dataset.

from trl import KTOConfig, KTOTrainer
from datasets import load_dataset

trainer = KTOTrainer(
    model="Qwen/Qwen2.5-VL-3B-Instruct",
    args=KTOConfig(max_length=None),
    train_dataset=load_dataset("trl-internal-testing/zen-image", "conversational_unpaired_preference", split="train"),
)
trainer.train()

Para VLMs, a truncagem pode remover tokens de imagem, levando a erros durante o treinamento. Para evitar isso, defina max_length=None no KTOConfig. Isso permite que o modelo processe o comprimento total da sequência sem truncar tokens de imagem.

KTOConfig(max_length=None, ...)

Use max_length apenas quando você tiver verificado que a truncagem não removerá os tokens de imagem para todo o conjunto de dados.

Script de exemplo

Fornecemos um script de exemplo para treinar um modelo usando o método KTO. O script está disponível em trl/scripts/kto.py

Para testar o script KTO com o modelo Qwen2 0.5B no conjunto de dados UltraFeedback, execute o seguinte comando:

accelerate launch trl/scripts/kto.py \
    --model_name_or_path Qwen/Qwen2-0.5B-Instruct \
    --dataset_name trl-lib/kto-mix-14k \
    --num_train_epochs 1 \
    --output_dir Qwen2-0.5B-KTO

Dicas de uso

Para Modelos Mixture of Experts: Habilitando a perda auxiliar

MOEs são mais eficientes quando a carga é distribuída de forma aproximadamente igual entre os especialistas.
Para garantir que treinemos MOEs de maneira semelhante durante o ajuste de preferências, é benéfico adicionar a perda auxiliar do balanceador de carga à perda final.

Esta opção é ativada definindo output_router_logits=True na configuração do modelo (por exemplo, MixtralConfig).
Para ajustar a contribuição da perda auxiliar para a perda total, use o hiperparâmetro router_aux_loss_coef=... (padrão: 0.001) na configuração do modelo.

Recomendações de tamanho de lote

Use um tamanho de lote por etapa de pelo menos 4 e um tamanho de lote efetivo entre 16 e 128. Mesmo que o seu tamanho de lote efetivo seja grande, se o seu tamanho de lote por etapa for inadequado, a estimativa de KL no KTO será inadequada.

Recomendações de taxa de aprendizado

Cada escolha de beta tem uma taxa de aprendizado máxima que pode tolerar antes que o desempenho do aprendizado se degrade. Para a configuração padrão de beta = 0.1, a taxa de aprendizado normalmente não deve exceder 1e-6 para a maioria dos modelos. À medida que beta diminui, a taxa de aprendizado também deve ser reduzida de forma correspondente. Em geral, recomendamos fortemente manter a taxa de aprendizado entre 5e-7 e 5e-6. Mesmo com conjuntos de dados pequenos, desaconselhamos o uso de uma taxa de aprendizado fora dessa faixa. Em vez disso, opte por mais épocas para obter melhores resultados.

Dados desbalanceados

Os parâmetros desirable_weight e undesirable_weight da KTOConfig referem-se aos pesos aplicados às perdas para exemplos desejáveis/positivos e indesejáveis/negativos. Por padrão, ambos são 1. No entanto, se você tiver mais de um ou do outro, deve aumentar o peso do tipo menos comum para que a proporção entre (desirable_weight ×\times número de positivos) e (undesirable_weight ×\times número de negativos) esteja na faixa de 1:1 a 4:3.

KTOTrainer

classe trl.KTOTrainer

< >

( model: str | PreTrainedModel | PeftModelref_model: transformers.modeling_utils.PreTrainedModel | None = Noneargs: trl.trainer.kto_config.KTOConfig | None = Nonedata_collator: collections.abc.Callable[[list[typing.Any]], dict[str, typing.Any]] | 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 = Nonecompute_metrics: collections.abc.Callable[[transformers.trainer_utils.EvalPrediction], dict] | 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 = None )

Parâmetros

  • model (str ou PreTrainedModel ou PeftModel) — 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 em args.model_init_kwargs. Se dtype não for especificado em args.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.
  • ref_model (PreTrainedModel, opcional) — Modelo de referência usado para calcular as probabilidades log de referência. Se fornecido, este modelo é usado diretamente como a política de referência. Ele não pode ser um PeftModel. Se for None, o trainer usará automaticamente a política inicial correspondente a model, ou seja, o estado do modelo antes do início do treinamento KTO.
    • Se fornecido, este modelo é usado diretamente como a política de referência. Ele não pode ser um PeftModel.
    • Se None, o trainer usará automaticamente a política inicial correspondente a model, ou seja, o estado do modelo antes do início do treinamento KTO.
  • args (KTOConfig, opcional) — Configuração para este treinador. Se None, uma configuração padrão é usada.
  • data_collator (DataCollator, opcional) — Função a ser usada para formar um lote a partir de uma lista de elementos do train_dataset ou eval_dataset processado. O padrão será DataCollatorForUnpairedPreference se o modelo for um modelo de linguagem e DataCollatorForVisionUnpairedPreference se o modelo for um modelo de visão-linguagem. Collators personalizados devem truncar sequências antes do padding; o trainer não aplica truncamento após a colação.
  • train_dataset (Dataset ou IterableDataset) — Dataset a ser usado para o treinamento. Este trainer suporta o tipo preferência não pareada . 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).

    Quando train_dataset é um IterableDataset (por exemplo, um dataset em streaming), max_steps deve 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 que train_dataset.
  • processing_class (PreTrainedTokenizerBase ou 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_token será usado como padrão.
  • compute_metrics (Callable[[EvalPrediction], dict], opcional) — A função que será usada para calcular métricas na avaliação. Deve receber um EvalPrediction e retornar um dicionário de strings para valores de métricas. Ao passar SFTConfig com batch_eval_metrics definido como True, sua função compute_metrics deve receber um argumento booleano compute_result. Isso será acionado após o último lote de avaliação para sinalizar que a função precisa calcular e retornar as estatísticas de resumo globais, em vez de acumular as estatísticas do nível do lote. Os logits que ela recebe são recalculados com uma passagem de frente extra. Isso está obsoleto e será removido na v2.0.0.
  • 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 de AdamW no seu modelo e um agendador dado por get_linear_schedule_with_warmup controlado por args.
  • quantization_config (BitsAndBytesConfig, opcional) — Configuração de quantização usada ao carregar o modelo a partir de um identificador de modelo. Combine com peft_config para treinamento QLoRA. Ignorado se o modelo já estiver instanciado.
  • peft_config (PeftConfig, opcional) — Configuração PEFT usada para envolver o modelo. Se None, o modelo não é envolvido.

Trainer para o método de Otimização de Kahneman-Tversky (KTO). Este algoritmo foi inicialmente proposto no artigo KTO: Model Alignment as Prospect Theoretic Optimization. Esta classe é um wrapper em torno da classe Trainer e herda todos os seus atributos e métodos.

Exemplo:

>>> from trl import KTOTrainer
>>> from datasets import load_dataset

>>> dataset = load_dataset("trl-lib/kto-mix-14k", split="train")

>>> trainer = KTOTrainer(
...     model="Qwen/Qwen2.5-0.5B-Instruct",
...     train_dataset=dataset,
... )
>>> trainer.train()

treino

< >

( 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 (str ou bool, opcional) — Se for um str, caminho local para um checkpoint salvo por uma instância anterior de Trainer. Se for um bool e for igual a True, carrega o último checkpoint em args.output_dir salvo por uma instância anterior de Trainer. Se presente, o treinamento será retomado a partir dos estados do modelo/otimizador/agendador carregados aqui.
  • trial (optuna.Trial ou dict[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.

save_model

< >

( output_dir: str | None = None_internal_call: bool = False )

Salvará o modelo, para que você possa recarregá-lo usando from_pretrained().

Salvará apenas a partir do processo principal.

push_to_hub

< >

( commit_message: str | None = 'End of training'blocking: bool = Truetoken: str | None = Nonerevision: str | 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ão True) — Se a função deve retornar apenas quando o git push tiver terminado.
  • token (str, opcional, padrão None) — 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”.
  • 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.

KTOConfig

classe trl.KTOConfig

< >

( 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 = 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 = Truelabel_names: list[str] | None = Nonetrain_sampling_strategy: str = 'sequential'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 = Truedataset_num_proc: int | None = Nonemax_length: int | None = 1024pad_to_multiple_of: int | str | None = 'auto'precompute_ref_log_probs: bool = Falseprecompute_ref_batch_size: int | None = Noneloss_type: str = 'kto'beta: float = 0.1desirable_weight: float = 1.0undesirable_weight: float = 1.0activation_offloading: bool = Falsesync_ref_model: bool = Falseref_model_mixup_alpha: float = 0.6ref_model_sync_steps: int = 512 )

Parâmetros que controlam o modelo

  • model_init_kwargs (dict[str, Any], opcional) — Argumentos de palavra-chave para from_pretrained, usados quando o argumento model do KTOTrainer é fornecido como uma string. O valor de revision também é usado ao carregar a classe de processamento.
  • trust_remote_code (bool, opcional, padrão False) — Se permite carregar modelos e tokenizers que incluem código Python personalizado do Hub. Encaminhado para from_pretrained e from_pretrained.
  • 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 como 0.0 para desativá-la. Falha quando usado com um modelo não-MoE.
  • disable_dropout (bool, opcional, padrão True) — Se deve desabilitar o dropout no modelo e no modelo de referência.

Parâmetros que controlam o pré-processamento dos dados

  • dataset_num_proc (int, opcional) — Número de processos a serem usados para processar o conjunto de dados.
  • max_length (int or None, opcional, padrão 1024) — Comprimento máximo da sequência tokenizada. Sequências maiores que max_length são truncadas pela direita. Se None, nenhum truncamento é aplicado.
  • pad_to_multiple_of (int ou str, opcional, padrão "auto") — Se definido, as sequências serão preenchidas 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.
  • precompute_ref_log_probs (bool, opcional, padrão False) — Se as probabilidades log do modelo de referência para todo o conjunto de dados de treinamento devem ser pré-computadas antes do treinamento. Isso permite economizar memória durante o treinamento, pois o modelo de referência não precisa ser mantido em memória.
  • precompute_ref_batch_size (int, opcional) — Tamanho do lote a ser usado ao pré-computar as probabilidades log do modelo de referência. Isso pode ser definido com um valor maior que o tamanho do lote de treinamento para acelerar o pré-processamento. Se None, o padrão é per_device_train_batch_size para treinamento e per_device_eval_batch_size para avaliação.

Parâmetros que controlam o treinamento

  • loss_type (str, opcional, padrão é "kto") — Tipo de perda a ser usado. Os valores possíveis são:
    • "kto": perda KTO do paper KTO.
    • "apo_zero_unpaired": Variante não pareada da perda APO-zero do paper APO.
  • beta (float, opcional, padrão 0.1) — Parâmetro que controla o desvio em relação ao modelo de referência. Valores maiores de β indicam menor desvio em relação ao modelo de referência.
  • desirable_weight (float, opcional, padrão 1.0) — As perdas desejáveis são ponderadas por este fator para compensar o número desigual de pares desejáveis e indesejáveis.
  • undesirable_weight (float, opcional, padrão 1.0) — As perdas indesejáveis são ponderadas por este fator para compensar o número desigual de pares desejáveis e indesejáveis.
  • activation_offloading (bool, opcional, padrão False) — Se as ativações devem ser transferidas para a CPU.
  • sync_ref_model (bool, opcional, padrão False) — Se deve sincronizar o modelo de referência com o modelo ativo a cada ref_model_sync_steps passos, usando o parâmetro ref_model_mixup_alpha. Essa sincronização origina-se do artigo TR-DPO. sync_ref_model=True ainda não é compatível com PEFT ou precompute_ref_log_probs=True.
  • ref_model_mixup_alpha (float, opcional, padrão 0.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 definir sync_ref_model=True.
  • ref_model_sync_steps (int, opcional, padrão 512) — 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 definir sync_ref_model=True.

Classe de configuração para o KTOTrainer.

Esta classe inclui apenas os parâmetros específicos para o treinamento KTO. 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 é 10 em vez de 500.
  • gradient_checkpointing: O padrão é True em vez de False.
  • bf16: Padrão é True se fp16 não estiver definido, em vez de False.
  • learning_rate: O valor padrão é 1e-6 em vez de 5e-5.
  • train_sampling_strategy: O padrão é "sequential" em vez de "random". Os tipos de perda que estimam o termo de divergência KL (todos, exceto "apo_zero_unpaired") exigem amostragem sequencial, pois a conclusão KL para cada exemplo é pré-computada em relação aos seus vizinhos em um lote de ordem fixa; qualquer outra estratégia quebra esse pareamento.
Update on GitHub