Het fijnafstemmen van een open-source LLM met Axolotl met behulp van Directe Voorkeurs Optimalisatie (DPO)

LLM’s hebben talloze nieuwe mogelijkheden ontgrendeld voor AI-toepassingen. Als je ooit je eigen model hebt willen verfijnen, zal deze gids je laten zien hoe je dit gemakkelijk kunt doen zonder enige code te schrijven. Met behulp van tools zoals Axolotl en DPO zullen we stap voor stap door het proces gaan.

Wat Is een LLM?

Een Large Language Model (LLM) is een krachtig AI-model dat is getraind op enorme hoeveelheden tekstgegevens – tientallen biljoenen tekens – om de volgende reeks woorden in een sequentie te voorspellen. Dit is pas in de afgelopen 2-3 jaar mogelijk geworden door de vooruitgang die is geboekt in GPU-rekenkracht, waardoor dergelijke enorme modellen in een paar weken kunnen worden getraind.

Je hebt waarschijnlijk al interactie gehad met LLM’s via producten zoals ChatGPT of Claude eerder en hebt uit de eerste hand hun vermogen ervaren om mensachtige reacties te begrijpen en genereren.

Waarom Een LLM Verfijnen?

Kunnen we niet gewoon GPT-4o voor alles gebruiken? Nou, hoewel het het krachtigste model is dat we op het moment van schrijven van dit artikel hebben, is het niet altijd de meest praktische keuze. Het verfijnen van een kleiner model, variërend van 3 tot 14 miljard parameters, kan vergelijkbare resultaten opleveren tegen een fractie van de kosten. Bovendien stelt verfijning je in staat om je intellectuele eigendom te bezitten en vermindert het je afhankelijkheid van derden.

Understanding Base, Instruct, and Chat Models

Voordat we ons storten op verfijning, is het essentieel om de verschillende soorten LLM’s te begrijpen die bestaan:

  • Basismodellen: Deze zijn vooraf opgeleid op grote hoeveelheden ongestructureerde tekst, zoals boeken of internetgegevens. Hoewel ze een intrinsiek begrip van taal hebben, zijn ze niet geoptimaliseerd voor inferentie en zullen ze onsamenhangende resultaten produceren. Basismodellen zijn ontwikkeld om te dienen als startpunt voor het ontwikkelen van meer gespecialiseerde modellen.
  • Instructiemodellen: Gebouwd bovenop basismodellen, zijn instructiemodellen fijn afgestemd met behulp van gestructureerde gegevens zoals prompt-responsparen. Ze zijn ontworpen om specifieke instructies te volgen of vragen te beantwoorden.
  • Chatmodellen: Ook gebouwd op basismodellen, maar in tegenstelling tot instructiemodellen worden chatmodellen getraind op conversatiegegevens, waardoor ze kunnen deelnemen aan heen-en-weer dialogen.

Wat Is Versterkend Leren en DPO?

Versterkend Leren (RL) is een techniek waarbij modellen leren door feedback te ontvangen op hun acties. Het wordt toegepast op instructie- of chatmodellen om de kwaliteit van hun resultaten verder te verfijnen. Meestal wordt RL niet bovenop basismodellen uitgevoerd, omdat het een veel lagere leersnelheid gebruikt die de situatie niet voldoende zal veranderen.

DPO is een vorm van RL waarbij het model wordt getraind met paren van goede en slechte antwoorden voor dezelfde prompt/conversatie. Door deze paren te presenteren, leert het model om de goede voorbeelden te verkiezen en de slechte te vermijden.

Wanneer DPO Te Gebruiken

DPO is bijzonder nuttig wanneer u de stijl of het gedrag van uw model wilt aanpassen, bijvoorbeeld:

  • Stijlaanpassingen: Pas de lengte van reacties aan, het niveau van detail, of de mate van vertrouwen die door het model wordt uitgedrukt.
  • Veiligheidsmaatregelen: Train het model om te weigeren te antwoorden op potentieel onveilige of ongepaste prompts.

Echter, DPO is niet geschikt voor het onderwijzen van het model met nieuwe kennis of feiten. Hiervoor zijn Supervised Fine-Tuning (SFT) of Retrieval-Augmented Generation (RAG) technieken geschikter.

Een DPO Dataset maken

In een productieomgeving genereer je doorgaans een DPO dataset met feedback van je gebruikers, bijvoorbeeld door:

  • Gebruikersfeedback: Het implementeren van een duim-omhoog/duim-omlaag mechanisme op reacties.
  • Vergelijkende keuzes: Gebruikers twee verschillende uitkomsten voorleggen en hen vragen de betere te kiezen.

Als je geen gebruikersdata hebt, kun je ook een synthetische dataset creëren door gebruik te maken van grotere, meer capabele LLM’s. Bijvoorbeeld, je kunt slechte antwoorden genereren met een kleiner model en deze vervolgens laten corrigeren door GPT-4o.

Voor de eenvoud gebruiken we een kant-en-klare dataset van HuggingFace: olivermolenschot/alpaca_messages_dpo_test. Als je de dataset inspecteert, zul je merken dat deze prompts bevat met gekozen en afgewezen antwoorden – dit zijn de goede en slechte voorbeelden. Deze data is synthetisch gemaakt met behulp van GPT-3.5-turbo en GPT-4.

Je hebt over het algemeen tussen de 500 en 1.000 datapunten nodig om effectieve training te hebben zonder overfitting. De grootste DPO datasets bevatten tot 15.000–20.000 paren.

Fijn-tuning Qwen2.5 3B Instruct met Axolotl

We zullen Axolotl gebruiken om het Qwen2.5 3B Instruct-model verder te verfijnen, dat momenteel bovenaan de OpenLLM Leaderboard staat voor zijn grootteklasse. Met Axolotl kun je een model verfijnen zonder ook maar één regel code te schrijven – alleen een YAML-configuratiebestand. Hieronder staat de config.yml die we zullen gebruiken:

base_model: Qwen/Qwen2.5-3B-Instruct
strict: false

# Axolotl will automatically map the dataset from HuggingFace to the prompt template of Qwen 2.5
chat_template: qwen_25
rl: dpo
datasets:
  - path: olivermolenschot/alpaca_messages_dpo_test
    type: chat_template.default
    field_messages: conversation
    field_chosen: chosen
    field_rejected: rejected
    message_field_role: role
    message_field_content: content

# We pick a directory inside /workspace since that's typically where cloud hosts mount the volume
output_dir: /workspace/dpo-output

# Qwen 2.5 supports up to 32,768 tokens with a max generation of 8,192 tokens
sequence_len: 8192

# Sample packing does not currently work with DPO. Pad to sequence length is added to avoid a Torch bug
sample_packing: false
pad_to_sequence_len: true

# Add your WanDB account if you want to get nice reporting on your training performance
wandb_project:
wandb_entity:
wandb_watch:
wandb_name:
wandb_log_model:

# Can make training more efficient by batching multiple rows together
gradient_accumulation_steps: 1
micro_batch_size: 1

# Do one pass on the dataset. Can set to a higher number like 2 or 3 to do multiple
num_epochs: 1

# Optimizers don't make much of a difference when training LLMs. Adam is the standard
optimizer: adamw_torch

# DPO requires a smaller learning rate than regular SFT
lr_scheduler: constant
learning_rate: 0.00005

# Train in bf16 precision since the base model is also bf16
bf16: auto

# Reduces memory requirements
gradient_checkpointing: true

# Makes training faster (only suported on Ampere, Ada, or Hopper GPUs)
flash_attention: true

# Can save multiple times per epoch to get multiple checkpoint candidates to compare
saves_per_epoch: 1

logging_steps: 1
warmup_steps: 0

Opzetten van de Cloudomgeving

Om de training uit te voeren, zullen we een cloudhostingservice zoals Runpod of Vultr gebruiken. Dit is wat je nodig zult hebben:

  • Docker Image: Kloon de winglian/axolotl-cloud:main Docker-image die door het Axolotl-team wordt geleverd.
  • *Hardwarevereisten: Een 80GB VRAM GPU (zoals een 1×A100 PCIe-node) zal meer dan voldoende zijn voor dit model van deze omvang.
  • Opslag: 200GB aan volumestorage zal alle bestanden bevatten die we nodig hebben.
  • CUDA-versie: Je CUDA-versie moet minstens 12.1 zijn.

*Dit type training wordt beschouwd als een volledige verfijning van de LLM, en is dus zeer VRAM-intensief. Als je de training lokaal wilt uitvoeren, zonder te vertrouwen op cloudhosts, zou je kunnen proberen QLoRA te gebruiken, wat een vorm van Begeleid Fijnafstemmen is. Hoewel het theoretisch mogelijk is om DPO & QLoRA te combineren, wordt dit zeer zelden gedaan.

Stappen om de training te starten

  1. Stel HuggingFace Cache Directory in:
export HF_HOME=/workspace/hf

Dit zorgt ervoor dat het oorspronkelijke model wordt gedownload naar onze volumestorage die persistent is.

  1. Maak Configuratiebestand aan: Bewaar het config.yml-bestand dat we eerder hebben gemaakt in /workspace/config.yml.
  1. Start Training:
python -m axolotl.cli.train /workspace/config.yml

En voilà! Je training zou moeten beginnen. Nadat Axolotl het model en de trainingsdata heeft gedownload, zou je output moeten zien die vergelijkbaar is met dit:

[2024-12-02 11:22:34,798] [DEBUG] [axolotl.train.train:98] [PID:3813] [RANK:0] loading model

[2024-12-02 11:23:17,925] [INFO] [axolotl.train.train:178] [PID:3813] [RANK:0] Starting trainer...

De training zou slechts enkele minuten in beslag moeten nemen omdat dit een kleine dataset is van slechts 264 rijen. Het gefinetunede model wordt opgeslagen in /workspace/dpo-output.

Het model uploaden naar HuggingFace

Je kunt je model uploaden naar HuggingFace met behulp van de CLI:

  1. Installeer de HuggingFace Hub CLI:
pip install huggingface_hub[cli]
  1. Upload het model:
huggingface-cli upload /workspace/dpo-output yourname/yourrepo

Vervang yourname/yourrepo door je daadwerkelijke HuggingFace gebruikersnaam en repository naam.

Het evalueren van je gefinetunede model

Voor evaluatie wordt het aanbevolen om zowel het originele als gefinetunede model te hosten met behulp van een tool zoals Text Generation Inference (TGI). Voer vervolgens inferentie uit op beide modellen met een temperatuurinstelling van 0 (om deterministische uitvoer te garanderen) en vergelijk handmatig de reacties van de twee modellen.

Deze hands-on benadering biedt betere inzichten dan alleen vertrouwen op trainings evaluatieverliesmetrieken, die mogelijk niet de nuances van taalgeneratie in LLMs vastleggen.

Conclusie

Het fijn afstemmen van een LLM met behulp van DPO stelt je in staat om modellen aan te passen aan de behoeften van jouw applicatie, terwijl de kosten beheersbaar blijven. Door de stappen in dit artikel te volgen, kun je de kracht van open-source tools en datasets benutten om een model te creëren dat aansluit bij jouw specifieke vereisten. Of je nu de stijl van de reacties wilt aanpassen of veiligheidsmaatregelen wilt implementeren, DPO biedt een praktische benadering om je LLM te verfijnen.

Veel succes met het fijn afstemmen!

Source:
https://www.sitepoint.com/fine-tuning-llm-with-direct-preference-optimization-dpo/