Saltar para o conteúdo principal
Versão: 2.0.0

Ajuste fino de um LLM de código aberto com llama.cpp

Aperfeiçoar os LLM

É possível ajustar um LLM de fonte aberta para

  • Ensiná-lo a seguir conversas.
  • Ensiná-lo a respeitar e a seguir instruções.
  • Fazer com que se recuse a responder a determinadas perguntas.
  • Dar-lhe um estilo específico de "falar".
  • Tornar a resposta em determinados formatos (por exemplo, JSON).
  • Concentrar-se numa área de domínio específica.
  • Ensina-lhe certos conhecimentos.

Para o fazer, é necessário criar um conjunto de pares de perguntas e respostas para mostrar ao modelo o pedido e a resposta esperada. Depois, pode utilizar uma ferramenta de afinação para efetuar o treino e fazer com que o modelo responda à resposta esperada para cada pergunta.

Como afinar um LLM de código aberto com llama.cpp

A popular ferramenta llama.cpp vem com um afinar utilitário. Ele funciona bem em CPUs! Este guia de ajuste fino é reproduzido com permissão do site de Tony Yuan Finetune um LLM de fonte aberta para a disciplina de química projeto.

Construir o utilitário de ajuste fino a partir de llama.cpp

O afinar em llama.cpp pode trabalhar com ficheiros GGUF quantizados em CPUs, reduzindo assim drasticamente os requisitos de hardware e as despesas para afinação de LLMs.

Veja e descarregue o código fonte llama.cpp.

git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp

Compilar o binário llama.cpp.

mkdir build
cd build
cmake ...
cmake --build . --config Release

Se tiver a GPU NVIDIA e o kit de ferramentas CUDA instalados, deve construir o llama.cpp com suporte CUDA.

mkdir build
cd build
cmake ... -DLLAMA_CUBLAS=ON -DCMAKE_CUDA_COMPILER=/usr/local/cuda/bin/nvcc
cmake --build . --config Release

Obter o modelo básico

Vamos utilizar o modelo Llama2 chat 13B do Meta como modelo de base. Note-se que estamos a utilizar diretamente um ficheiro de modelo GGUF quantizado Q5 para poupar recursos informáticos. Você pode usar qualquer um dos modelos GGUF compatíveis com Llama2 no Hugging Face.

cd ... # mudar para o diretório llama.cpp
cd models/
curl -LO https://huggingface.co/gaianet/Llama-2-13B-Chat-GGUF/resolve/main/llama-2-13b-chat.Q5_K_M.gguf

Criar um conjunto de perguntas e respostas para afinação

Em seguida, obtivemos mais de 1700 pares de QAs para a disciplina de química. É como o seguinte num ficheiro CSV.

QuestãoResposta
O que é que o hidrogénio tem de único?É o elemento mais abundante no universo, constituindo mais de 75% de toda a matéria.
Qual é o principal componente de Júpiter?O hidrogénio é o principal componente de Júpiter e dos outros planetas gigantes gasosos.
O hidrogénio pode ser utilizado como combustível?Sim, o hidrogénio é utilizado como combustível para foguetões. Também pode alimentar células de combustível para gerar eletricidade.
Qual é o número atómico do mercúrio?O número atómico do mercúrio é 80
O que é Mercúrio?O mercúrio é um metal prateado que é líquido à temperatura ambiente. Tem um número atómico de 80 na tabela periódica. É tóxico para os seres humanos.

Utilizámos o GPT-4 para me ajudar a criar muitos destes QAs.

Depois, escrevemos um Script Python para converter cada linha do ficheiro CSV numa amostra de QA no formato de modelo de chat Llama2. Repare que cada par de QA começa com <SFT> como indicador para que o programa de afinação inicie uma amostra. O resultado treinar.txt pode agora ser utilizado para o ajuste fino.

Colocar o treinar.txt no ficheiro llama.cpp/modelos com o modelo de base GGUF.

Finetune!

Use o seguinte comando para iniciar o processo de ajuste fino em suas CPUs. Estou colocando-o em segundo plano para que ele possa ser executado continuamente agora. Pode levar vários dias ou mesmo algumas semanas, dependendo de quantas CPUs você tem.

nohup ../build/bin/finetune --model-base llama-2-13b-chat.Q5_K_M.gguf --lora-out lora.bin --train-data train.txt --sample-start '<SFT>' --adam-iter 1024 &

Pode verificar o processo a cada poucas horas na secção nohup.out ficheiro. O ficheiro indicará o perda para cada iteração. É possível parar o processo quando o valor perda é constantemente inferior a 0.1.

Nota 1 Se tiver várias CPUs (ou núcleos de CPU), pode acelerar o processo de ajuste fino adicionando um -t para o comando acima para usar mais threads. Por exemplo, se você tiver 60 núcleos de CPU, você pode fazer -t 60 para utilizar todos eles.

Nota 2 Se o processo de afinação for interrompido, pode reiniciá-lo a partir de ponto de controlo-250.gguf. O próximo ficheiro que produz é ponto de controlo-260.gguf.

nohup ../build/bin/finetune --model-base llama-2-13b-chat.Q5_K_M.gguf --checkpoint-in checkpoint-250.gguf --lora-out lora.bin --train-data train.txt --sample-start '<SFT>' --adam-iter 1024 &

Fundir

O processo de ajuste fino actualiza várias camadas da rede neural do LLM. Essas camadas actualizadas são guardadas num ficheiro chamado lora.bin e pode agora fundi-los de novo com o LLM de base para criar o novo LLM aperfeiçoado.

../build/bin/export-lora --model-base llama-2-13b-chat.Q5_K_M.gguf --lora lora.bin --model-out chemistry-assistant-13b-q5_k_m.gguf

O resultado é este ficheiro.

curl -LO https://huggingface.co/juntaoyuan/chemistry-assistant-13b/resolve/main/chemistry-assistant-13b-q5_k_m.gguf

Nota 3 Se se pretender utilizar um ponto de controlo para gerar um lora.bin utilize o seguinte comando. Isto é necessário quando se acredita que o ficheiro final lora.bin é um sobreajuste.

../build/bin/finetune --model-base llama-2-13b-chat.Q5_K_M.gguf --checkpoint-in checkpoint-250.gguf --only-write-lora --lora-out lora.bin