Como Fazer o Ajuste Fino de um Llama-2 (7B) para Superar o ChatGPT

Built for Speed: ~10ms Latency, Even Under Load
Blazingly fast way to build, track and deploy your models!
- Handles 350+ RPS on just 1 vCPU — no tuning needed
- Production-ready with full enterprise support
Grandes modelos de linguagem (LLMs) estão se tornando cada vez mais poderosos e estão sendo usados para uma variedade de tarefas, incluindo chatbots, geração de texto e resposta a perguntas. No entanto, os LLMs podem ser caros e intensivos em recursos para treinar. Nesta publicação do blog, mostraremos como fazer o fine-tuning de um LLM menor (7B) para ter um desempenho melhor que o ChatGPT.
Fine-tuning é um processo de treinamento de um LLM em um conjunto de dados específico para melhorar seu desempenho em uma tarefa particular. Neste caso, faremos o fine-tuning de um LLM de 7B para multiplicar dois números.
Então, vamos começar com o desempenho de diferentes grandes modelos de linguagem em uma tarefa simples de multiplicação: 458*987 = 452046.
Primeiro, vamos analisar o modelo Llama-2-7B recentemente lançado pela Meta. Nós implantamos o Llama-2 na TrueFoundry e o testamos com as integrações Langchain da TrueFoundry. Aqui está o resultado.

Como podemos ver claramente, ele não tem um bom desempenho na tarefa. (o que também é esperado dado o tamanho do modelo). Vamos ver como os modelos de ponta se comportam na mesma tarefa:
Vamos ver o resultado do ChatGPT (GPT3.5 Turbo):

Agora, a resposta (451.086) está muito próxima da resposta real, que é 452.046, mas a resposta não está correta.
Vamos tentar com um prompt diferente (para fazer um cálculo passo a passo e ver o que ele faz):
0:00/1×
ChatGPT com prompt personalizado para multiplicação
Mas, novamente, ele chega a um resultado incorreto: 450.606 🤨
Finalmente, vamos tentar o modelo de ponta (GPT-4) e verificar como ele se comporta na tarefa:

Está muito próximo da resposta correta (452.046) e pode parecer correto para qualquer um. Mas, claramente, a resposta está incorreta.
Por que os LLMs estão tendo um desempenho ruim em tarefas simples de multiplicação?
A resposta para esta pergunta é muito simples. Elas não são "treinadas" para isso.
LLMs são treinadas em vastos conjuntos de dados de texto e código, mas esses dados nem sempre são estruturados de uma forma que seja útil para o raciocínio matemático. Por exemplo, os dados podem não incluir representações explícitas de conceitos matemáticos, como adição, subtração, multiplicação e divisão. Isso pode dificultar que as LLMs aprendam a realizar essas operações corretamente.
Então, pensamos: seria possível treinar uma LLM para realizar operações matemáticas? Fizemos um experimento e os resultados foram bastante promissores!
Ajuste fino do Llama-2 7B para aprender multiplicação
Curadoria de um Conjunto de Dados
Para começar, fizemos a curadoria de um conjunto de dados de 40.000 linhas de prompts e instruções. Tentamos imitar os passos exatos seguidos no método de multiplicação longa, que envolve a quebra do multiplicando e do multiplicador em seus dígitos individuais, depois multiplicando cada dígito do multiplicando por cada dígito do multiplicador e colocando os resultados nas posições apropriadas com base em seus valores de posição. Finalmente, todos os produtos individuais são somados para obter o resultado final.
Aqui está um prompt de exemplo:
Você é um assistente prestativo que fornece respostas detalhadas para perguntas de multiplicação. Certifique-se de fornecer uma explicação completa usando o método de multiplicação longa para o problema matemático apresentado abaixo.
Se você não souber a resposta para uma pergunta, por favor, não compartilhe informações falsas. Quanto é 5244 * 1932?
E aqui está uma resposta de exemplo:
Aqui estão os passos para multiplicar 5244 * 1932 usando o método de multiplicação longa.
Passo 1: Divida 5244 em seus dígitos individuais: 5 (casa dos milhares), 2 (casa das centenas), 4 (casa das dezenas) e 4 (casa das unidades).
Passo 2: Da mesma forma, divida 1932 em seus dígitos individuais: 1 (casa dos milhares), 9 (casa das centenas), 3 (casa das dezenas) e 2 (casa das unidades).
- 4 (da casa das unidades do primeiro número) * 2 (da casa das unidades do segundo número) = 8 -> Desloque 0 casas para a esquerda (porque estamos multiplicando pela casa das unidades do segundo número) para obter 8
- 4 (da casa das unidades do primeiro número) * 3 (da casa das dezenas do segundo número) = 12 -> Desloque 1 casa para a esquerda (porque estamos multiplicando pela casa das dezenas do segundo número) para obter 120
- 4 (da casa das unidades do primeiro número) * 9 (da casa das centenas do segundo número) = 36 -> Desloque 2 casas para a esquerda (porque estamos multiplicando pela casa das centenas do segundo número) para obter 3600
- 4 (da casa das unidades do primeiro número) * 1 (da casa dos milhares do segundo número) = 4 -> Desloque 3 casas para a esquerda (porque estamos multiplicando pela casa dos milhares do segundo número) para obter 4000
- 4 (da casa das dezenas do primeiro número) * 2 (da casa das unidades do segundo número) = 8 -> Desloque 1 casa para a esquerda (porque estamos multiplicando pela casa das unidades do segundo número) para obter 80
- 4 (da casa das dezenas do primeiro número) * 3 (da casa das dezenas do segundo número) = 12 -> Desloque 2 casas para a esquerda (porque estamos multiplicando pela casa das dezenas do segundo número) para obter 1200
- 4 (da casa das dezenas do primeiro número) * 9 (da casa das centenas do segundo número) = 36 -> Desloque 3 casas para a esquerda (porque estamos multiplicando pela casa das centenas do segundo número) para obter 36000
- 4 (da casa das dezenas do primeiro número) * 1 (da casa dos milhares do segundo número) = 4 -> Desloque-o 4 casas para a esquerda (porque estamos a multiplicar pela casa dos milhares do segundo número) para obter 40000
- 2 (da casa das centenas do primeiro número) * 2 (da casa das unidades do segundo número) = 4 -> Desloque-o 2 casas para a esquerda (porque estamos a multiplicar pela casa das unidades do segundo número) para obter 400
- 2 (da casa das centenas do primeiro número) * 3 (da casa das dezenas do segundo número) = 6 -> Desloque-o 3 casas para a esquerda (porque estamos a multiplicar pela casa das dezenas do segundo número) para obter 6000
- 2 (da casa das centenas do primeiro número) * 9 (da casa das centenas do segundo número) = 18 -> Desloque-o 4 casas para a esquerda (porque estamos a multiplicar pela casa das centenas do segundo número) para obter 180000
- 2 (da casa das centenas do primeiro número) * 1 (da casa dos milhares do segundo número) = 2 -> Desloque-o 5 casas para a esquerda (porque estamos a multiplicar pela casa dos milhares do segundo número) para obter 200000
- 5 (da casa dos milhares do primeiro número) * 2 (da casa das unidades do segundo número) = 10 -> Desloque-o 3 casas para a esquerda (porque estamos a multiplicar pela casa das unidades do segundo número) para obter 10000
- 5 (da casa dos milhares do primeiro número) * 3 (da casa das dezenas do segundo número) = 15 -> Desloque-o 4 casas para a esquerda (porque estamos a multiplicar pela casa das dezenas do segundo número) para obter 150000
- 5 (da casa dos milhares do primeiro número) * 9 (da casa das centenas do segundo número) = 45 -> Desloque-o 5 casas para a esquerda (porque estamos a multiplicar pela casa das centenas do segundo número) para obter 4500000
- 5 (da casa dos milhares do primeiro número) * 1 (da casa dos milhares do segundo número) = 5 -> Desloque-o 6 casas para a esquerda (porque estamos a multiplicar pela casa dos milhares do segundo número) para obter 5000000
Agora, some todos esses resultados:
A soma de 8 + 120 + 3600 + 4000 + 80 + 1200 + 36000 + 40000 + 400 + 6000 + 180000 + 200000 + 10000 + 150000 + 4500000 + 5000000 = 10131408.
Em seguida, escrevemos um script Python que gera pares de prompt-resposta selecionando aleatoriamente dois dígitos para multiplicação. Curamos um conjunto de dados com 40.000 linhas.
Ajustando o Modelo
Agora, assim que o conjunto de dados estiver pronto, precisamos ajustar o modelo.
Estamos a usar a variante de chat ajustada (7 mil milhões de parâmetros) da Meta de Llama-2 como modelo base.
Realizámos o ajuste fino usando ajuste fino QLora usando as bibliotecas BitsAndBytes e Peft. Aqui está a configuração lora que usámos:
LoraConfig(
lora_alpha=16,
lora_dropout=0.1,
r=64,
bias="none",
task_type="CAUSAL_LM",
target_modules=[
"q_proj",
"k_proj",
"v_proj",
"o_proj",
],
)
Levou cerca de 8 horas para treinar em uma máquina GPU A100 de 40GB para um conjunto de dados de 40.000 linhas.
Finalmente, implantamos o modelo ajustado em TrueFoundry novamente e aqui estão os resultados:

Então, finalmente!! Podemos ver que o modelo ajustado é capaz de calcular o resultado corretamente.
Conclusão
Embora a aritmética não seja uma tarefa para a qual usaremos LLM, este exemplo demonstra como um LLM "pequeno" (7B parâmetros) ajustado corretamente para uma tarefa específica pode superar os LLMs "grandes" (como GPT3.5 turbo - 175B parâmetros e GPT-4) em uma tarefa específica.
Os modelos menores com ajuste fino têm baixo custo de inferência, são melhores em tarefas especializadas e podem ser facilmente implantados na sua própria nuvem!
Publicamos um artigo detalhado no blog sobre o ajuste fino do Llama 2
TrueFoundry AI Gateway delivers ~3–4 ms latency, handles 350+ RPS on 1 vCPU, scales horizontally with ease, and is production-ready, while LiteLLM suffers from high latency, struggles beyond moderate RPS, lacks built-in scaling, and is best for light or prototype workloads.
The fastest way to build, govern and scale your AI

















.webp)






.webp)

.webp)
.webp)





.png)



