Modelos grandes de linguagem (LLMs) pré-treinados podem não ser ideais para suas necessidades específicas. O ajuste fino melhora o desempenho desses modelos em tarefas determinadas. Este guia apresenta estratégias de ajuste fino (SFT/DPO), técnicas (parâmetros completos, LoRA e QLoRA) e oferece uma visão geral dos principais hiperparâmetros.
Métodos de ajuste fino
SFT/DPO
No Model Gallery, você pode ajustar modelos usando ajuste fino supervisionado (SFT) e otimização direta de preferência (DPO). O processo de treinamento de um modelo grande de linguagem (LLM) geralmente inclui as três etapas a seguir:
1. Pré-treinamento (PT)
O pré-treinamento é a primeira etapa do processo de treinamento de LLMs. Nessa fase, o modelo aprende gramática fundamental, raciocínio lógico e conhecimento de senso comum a partir de um corpus de texto massivo.
Objetivo: proporcionar ao modelo compreensão de linguagem, raciocínio lógico e conhecimento de senso comum.
Exemplos de modelos: o Model Gallery oferece diversos modelos pré-treinados, como as séries Qwen e Llama.
2. Ajuste fino supervisionado (SFT)
O ajuste fino supervisionado adapta ainda mais um modelo pré-treinado para que ele tenha excelente desempenho em domínios específicos, diálogos e cenários de perguntas e respostas.
Objetivo: aprimorar o formato e o conteúdo da saída do modelo.
Exemplo de problema: capacitar o modelo a fornecer respostas de nível especialista para perguntas em um domínio específico, como medicina tradicional chinesa.
Solução: ajuste finamente o modelo usando pares de perguntas e respostas do domínio específico, como medicina tradicional chinesa.
3. Otimização de preferência (PO)
Após o ajuste fino supervisionado, um modelo pode gerar respostas gramaticalmente corretas, mas factualmente imprecisas ou desalinhadas com os valores humanos. A otimização de preferência (PO) refina ainda mais as capacidades de diálogo do modelo e o alinha aos valores humanos. Os principais métodos incluem a otimização de política proximal (PPO), baseada em aprendizado por reforço, e a otimização direta de preferência (DPO), que otimiza diretamente o modelo de linguagem. A DPO utiliza um paradigma implícito de aprendizado por reforço que não exige um modelo de recompensa explícito nem maximiza diretamente um sinal de recompensa, tornando seu processo de treinamento mais estável que o PPO.
3.1 Otimização direta de preferência (DPO)
Um modelo DPO consiste em dois componentes principais: um modelo grande de linguagem (LLM) em treinamento e um modelo de referência. O modelo de referência, também um LLM ajustado finamente, possui parâmetros congelados para evitar que o modelo treinado se desvie do comportamento esperado.
Formato dos dados de treinamento: tripletas compostas por (prompt, chosen (resposta preferida
y_{\text{win}} ), rejected (resposta menos preferiday_{\text{lose}} ))-
A função de perda é mostrada abaixo. O algoritmo DPO visa aumentar a probabilidade de o modelo gerar a resposta escolhida em relação ao modelo de referência, enquanto diminui a probabilidade de gerar a resposta rejeitada.
\text{loss} = \max_{\pi_\theta} \left\{ \mathbb{E}_{(x, y_{\text{win}}, y_{\text{lose}}) \sim \mathcal{D}} \left[ \log \sigma \left( \beta \log \frac{\pi_\theta(y_{\text{win}}|x)}{\pi_{\text{ref}}(y_{\text{win}}|x)} - \beta \log \frac{\pi_\theta(y_{\text{lose}}|x)}{\pi_{\text{ref}}(y_{\text{lose}}|x)} \right) \right] \right\} σ é a função Sigmoide, que mapeia o resultado para um intervalo de (0, 1).
β é um hiperparâmetro, geralmente definido entre 0,1 e 0,5, que ajusta a sensibilidade da função de perda.
PEFT: LoRA/QLoRA
As técnicas de ajuste fino eficiente em parâmetros (PEFT) alcançam desempenho competitivo congelando a maioria dos parâmetros de um modelo e ajustando finamente apenas um pequeno subconjunto. Como menos parâmetros são atualizados, isso também reduz os requisitos de dados e recursos computacionais. O Model Gallery suporta ajuste fino de parâmetros completos, além de dois métodos PEFT: LoRA e QLoRA.
LoRA (adaptação de baixo posto)
A técnica LoRA adiciona um caminho paralelo à matriz de parâmetros de um modelo (por exemplo, uma matriz de tamanho m×n). Esse caminho consiste no produto de duas matrizes de baixo posto (de tamanhos m×r e r×n, onde r é muito menor que m e n). Durante a passagem direta, a entrada passa tanto pela matriz de parâmetros original quanto pelo caminho LoRA, e suas saídas são somadas. Durante o treinamento, os parâmetros originais permanecem congelados e apenas o caminho LoRA é treinado. Como o caminho LoRA é composto por duas matrizes de baixo posto, ele possui muito menos parâmetros que a matriz original, o que reduz significativamente a sobrecarga computacional do treinamento.
QLoRA (LoRA quantizado)
O QLoRA combina a quantização do modelo com a técnica LoRA. Além de introduzir um caminho LoRA, o QLoRA quantiza o modelo grande para precisão de 4 bits ou 8 bits durante o carregamento. Durante a computação, esses parâmetros quantizados são desquantizados para 16 bits para processamento. Esse método não apenas otimiza o armazenamento dos parâmetros do modelo quando não estão em uso, mas também reduz ainda mais o consumo de memória GPU durante o treinamento em comparação ao LoRA.
Seleção do método de treinamento e preparação de dados
Ao escolher entre SFT e DPO, considere seu caso de uso específico e consulte as descrições técnicas na seção anterior.
Escolha entre parâmetros completos, LoRA e QLoRA
Para tarefas complexas, recomenda-se o treinamento de parâmetros completos, pois permite que o modelo utilize todos os seus parâmetros, resultando em melhor desempenho.
Em tarefas mais simples, indicamos o uso de LoRA ou QLoRA, que oferecem tempos de treinamento mais rápidos e exigem menos recursos computacionais.
Para conjuntos de dados pequenos (de algumas centenas a alguns milhares de exemplos), LoRA ou QLoRA ajudam a evitar o overfitting do modelo.
Se seus recursos computacionais forem limitados, escolha QLoRA para reduzir ainda mais o consumo de memória GPU. No entanto, esteja ciente de que as etapas adicionais de quantização e desquantização podem aumentar o tempo de treinamento do QLoRA em comparação ao LoRA.
Preparação dos dados de treinamento
Tarefas simples não exigem grandes volumes de dados.
Requisitos de dados para SFT: alguns milhares de pontos de dados costumam ser suficientes. Nesse caso, a qualidade dos dados é mais importante que a quantidade.
Hiperparâmetros
learning_rate
A taxa de aprendizado determina o tamanho do passo para atualizações de parâmetros em cada iteração. Uma taxa de aprendizado maior pode acelerar o treinamento, mas pode causar atualizações de parâmetros muito agressivas, impedindo a convergência para o mínimo da função de perda. Uma taxa de aprendizado menor proporciona um processo de convergência mais estável, mas pode aumentar o tempo de treinamento ou levar o modelo a ficar preso em um ótimo local. O uso do otimizador AdamW pode prevenir eficazmente problemas de não convergência a longo prazo.
num_train_epochs
Uma época é um conceito fundamental em machine learning e deep learning. Ela representa uma única passagem completa por todo o conjunto de dados de treinamento. Por exemplo, se você definir o número de épocas como 10, o modelo iterará sobre o conjunto de dados completo 10 vezes para atualizar seus parâmetros de treinamento.
Poucas épocas podem levar ao underfitting, enquanto muitas podem causar overfitting. Recomendamos definir esse valor entre 2 e 10. Para conjuntos de dados pequenos, aumente o número de épocas para evitar underfitting. Para conjuntos de dados grandes, 2 épocas costumam ser suficientes. Além disso, uma taxa de aprendizado menor geralmente exige mais épocas. Monitore a precisão do conjunto de validação e interrompa o treinamento quando ela parar de melhorar.
per_device_train_batch_size
Na prática, os parâmetros do modelo não são atualizados após o processamento de todo o conjunto de dados de treinamento de uma só vez. Em vez disso, o treinamento é dividido em várias iterações usando subconjuntos menores de dados (batches) para melhorar a eficiência. O tamanho do batch é o número de amostras de treinamento usadas em cada iteração. Por exemplo, se o tamanho do batch for definido como 32, o modelo usará 32 amostras de treinamento em cada etapa de treinamento. O parâmetro per_device_train_batch_size especifica o número de amostras processadas por cada GPU em uma única iteração de treinamento.
O parâmetro de tamanho do batch ajusta principalmente a velocidade do treinamento, não sua eficácia. Um tamanho de batch menor aumenta a variância da estimativa do gradiente, exigindo mais iterações para convergir. Aumentar o tamanho do batch pode reduzir o tempo total de treinamento.
O tamanho ideal de batch é normalmente o valor máximo que seu hardware suporta. Acesse Model Gallery > Job Management > Training Jobs, clique em um nome de job específico e visualize as métricas GPU Memory Usage Rate e Memory Usage Rate na página Task monitoring para selecionar o maior tamanho de batch que não cause estouro de memória da GPU.
Aumentar o número de GPUs mantendo o
per_device_train_batch_sizeconstante equivale a aumentar o tamanho total do batch.
seq_length
Para um LLM, os dados de treinamento são processados por um tokenizador em uma sequência de tokens. O comprimento da sequência é o tamanho da sequência de tokens que o modelo aceita para uma única amostra de treinamento. Se a sequência de tokens de uma amostra de treinamento exceder esse comprimento, ela será truncada; se for menor, será preenchida.
Durante o treinamento, selecione um comprimento de sequência apropriado com base na distribuição dos comprimentos das sequências de tokens em seus dados de treinamento. Para uma determinada sequência de texto, diferentes tokenizadores geralmente produzem sequências de tokens de comprimentos semelhantes, então você pode usar uma ferramenta como a ferramenta online de cálculo de tokens da OpenAI para estimar o comprimento da sequência de tokens do seu texto.
Para o algoritmo SFT, estime o comprimento da sequência de system prompt + instrução + saída. Para o algoritmo DPO, estime os comprimentos das sequências de system prompt + prompt + chosen e system prompt + prompt + rejected, e use o maior valor.
lora_dim/lora_rank
Ao aplicar LoRA em um Transformer, ele é aplicado principalmente ao componente de atenção multi-cabeça. Pesquisas demonstraram que:
Adaptar múltiplas matrizes de pesos dentro do módulo de atenção multi-cabeça produz melhores resultados do que adaptar apenas um único tipo de matriz de pesos.
Aumentar o posto não necessariamente captura um subespaço mais significativo; uma matriz de adaptação de baixo posto pode ser suficiente.
No algoritmo llm_deepspeed_peft fornecido no Model Gallery, o LoRA adapta todos os quatro tipos de matrizes de pesos no módulo de atenção multi-cabeça, e o valor padrão do posto é 32.
lora_alpha
O fator de escala do LoRA. Um lora_alpha maior aumenta a influência da matriz LoRA e é adequado para conjuntos de dados de treinamento menores. Um lora_alpha menor diminui a influência da matriz LoRA e é adequado para conjuntos de dados de treinamento maiores. O valor de lora_alpha fica tipicamente entre 0,5 e 2 vezes o valor de lora_dim.
dpo_beta
Este hiperparâmetro controla o grau de desvio em relação ao modelo de referência. O valor padrão é 0,1. Um valor beta mais alto resulta em menor desvio do modelo de referência. Esse parâmetro é ignorado durante o treinamento SFT.
load_in_4bit/load_in_8bit
Usado no QLoRA para carregar o modelo base com precisão de 4 bits e 8 bits, respectivamente.
gradient_accumulation_steps
Um tamanho de batch grande exige mais memória GPU e pode causar um erro CUDA out of memory (OOM). O acúmulo de gradientes permite um tamanho efetivo de batch maior (= tamanho do batch × gradient_accumulation_steps) atualizando o modelo apenas após acumular gradientes em vários batches. Isso ajuda a evitar erros OOM e melhora a velocidade de convergência.
apply_chat_template
Quando apply_chat_template é definido como true, os dados de treinamento são formatados automaticamente com o chat template padrão do modelo. Se quiser usar um chat template personalizado, defina apply_chat_template como false e insira manualmente os tokens especiais necessários em seus dados de treinamento. Mesmo que apply_chat_template seja true, você ainda pode personalizar o system prompt.
system_prompt
No system prompt, forneça instruções, orientações e informações de contexto para ajudar o modelo a responder melhor às consultas dos usuários. Por exemplo, use o seguinte system prompt: "Você é um agente de atendimento ao cliente entusiasmado e profissional. Você é amigável, conciso e gosta de usar exemplos para resolver problemas dos usuários."