Feinabstimmung eines Open-Source LLM mit Axolotl unter Verwendung der Direkten Präferenzoptimierung (DPO)

LLMs haben unzählige neue Möglichkeiten für KI-Anwendungen eröffnet. Wenn Sie jemals Ihr eigenes Modell feinabstimmen wollten, zeigt Ihnen dieser Leitfaden, wie Sie dies einfach und ohne Schreiben von Code tun können. Mit Tools wie Axolotl und DPO werden wir den Prozess Schritt für Schritt durchgehen.

Was ist ein LLM?

Ein Large Language Model (LLM) ist ein leistungsstarkes KI-Modell, das auf riesigen Mengen von Textdaten trainiert wurde – zig Billionen Zeichen -, um die nächsten Wortfolgen in einer Sequenz vorherzusagen. Dies wurde erst in den letzten 2-3 Jahren durch die Fortschritte in der GPU-Berechnung möglich, die solche riesigen Modelle in wenigen Wochen trainiert haben.

Sie haben wahrscheinlich bereits mit LLMs durch Produkte wie ChatGPT oder Claude interagiert und aus erster Hand ihre Fähigkeit erlebt, menschenähnliche Antworten zu verstehen und zu generieren.

Warum ein LLM feinabstimmen?

Können wir nicht einfach für alles GPT-4o verwenden? Nun, obwohl es das leistungsstärkste Modell ist, das wir zum Zeitpunkt des Verfassens dieses Artikels haben, ist es nicht immer die praktischste Wahl. Die Feinabstimmung eines kleineren Modells mit 3 bis 14 Milliarden Parametern kann vergleichbare Ergebnisse zu einem Bruchteil der Kosten liefern. Darüber hinaus ermöglicht die Feinabstimmung Ihnen, Ihr geistiges Eigentum zu besitzen und Ihre Abhängigkeit von Dritten zu reduzieren.

Verständnis von Base-, Instruct- und Chat-Modellen

Bevor wir uns mit der Feinabstimmung befassen, ist es wichtig, die verschiedenen Arten von LLMs zu verstehen, die existieren:

  • Basismodelle: Diese sind auf großen Mengen unstrukturierten Textes vortrainiert, wie z.B. Bücher oder Internetdaten. Obwohl sie ein intrinsisches Verständnis von Sprache haben, sind sie nicht für Inferenz optimiert und erzeugen inkohärente Ausgaben. Basismodelle werden entwickelt, um als Ausgangspunkt für die Entwicklung spezialisierterer Modelle zu dienen.
  • Anweisungsmodelle: Auf Basismodellen aufgebaut, werden Anweisungsmodelle durch die Feinabstimmung mit strukturierten Daten wie Eingabe-Antwort-Paaren entwickelt. Sie sind darauf ausgelegt, spezifischen Anweisungen zu folgen oder Fragen zu beantworten.
  • Chatmodelle: Auch auf Basismodellen aufgebaut, aber im Gegensatz zu Anweisungsmodellen werden Chatmodelle auf konversationelle Daten trainiert, was es ihnen ermöglicht, an Hin-und-Her-Dialogen teilzunehmen.

Was ist Reinforcement Learning und DPO?

Reinforcement Learning (RL) ist eine Technik, bei der Modelle durch Rückmeldungen zu ihren Aktionen lernen. Es wird auf Anweisungs- oder Chatmodellen angewendet, um die Qualität ihrer Ausgaben weiter zu verfeinern. Typischerweise wird RL nicht auf Basismodellen durchgeführt, da es eine deutlich niedrigere Lernrate verwendet, die nicht ausreicht, um signifikante Verbesserungen zu erzielen.

DPO ist eine Form von RL, bei der das Modell mithilfe von Paaren aus guten und schlechten Antworten für dieselbe Eingabe/Konversation trainiert wird. Indem diese Paare präsentiert werden, lernt das Modell, die guten Beispiele zu bevorzugen und die schlechten zu vermeiden.

Wann sollte DPO verwendet werden

DPO ist besonders nützlich, wenn Sie den Stil oder das Verhalten Ihres Modells anpassen möchten, zum Beispiel:

  • Stilanpassungen: Ändern der Länge von Antworten, des Detaillierungsgrads oder des Selbstbewusstseins, das vom Modell ausgedrückt wird.
  • Sicherheitsmaßnahmen: Trainieren Sie das Modell, um die Beantwortung potenziell unsicherer oder unangemessener Anfragen abzulehnen.

Der DPO ist jedoch nicht geeignet, um dem Modell neues Wissen oder Fakten beizubringen. Für diesen Zweck sind Supervised Fine-Tuning (SFT) oder Retrieval-Augmented Generation (RAG) Techniken geeigneter.

Erstellen eines DPO-Datensatzes

In einer Produktionsumgebung würden Sie typischerweise einen DPO-Datensatz generieren, indem Sie Feedback von Ihren Benutzern verwenden, beispielsweise durch:

  • Benutzerfeedback: Implementierung eines Daumen-hoch/-runter-Mechanismus für Antworten.
  • Vergleichbare Auswahlmöglichkeiten: Benutzern zwei unterschiedliche Ausgaben präsentieren und sie bitten, die bessere auszuwählen.

Wenn Ihnen Benutzerdaten fehlen, können Sie auch einen synthetischen Datensatz erstellen, indem Sie größere, leistungsfähigere LLMs nutzen. Sie können beispielsweise schlechte Antworten mit einem kleineren Modell generieren und dann GPT-4o verwenden, um sie zu korrigieren.

Zur Vereinfachung verwenden wir einen vorgefertigten Datensatz von HuggingFace: olivermolenschot/alpaca_messages_dpo_test. Wenn Sie den Datensatz überprüfen, werden Sie feststellen, dass er Anfragen mit ausgewählten und abgelehnten Antworten enthält – dies sind die guten und schlechten Beispiele. Diese Daten wurden synthetisch mit GPT-3.5-turbo und GPT-4 erstellt.

Sie benötigen im Allgemeinen mindestens zwischen 500 und 1.000 Datenpaare, um ein effektives Training ohne Overfitting zu erreichen. Die größten DPO-Datensätze enthalten bis zu 15.000–20.000 Paare.

Feinabstimmung von Qwen2.5 3B Instruct mit Axolotl

Wir werden Axolotl verwenden, um das Qwen2.5 3B Instruct-Modell feinzutunen, das derzeit an der Spitze der OpenLLM-Rangliste für seine Größenklasse steht. Mit Axolotl können Sie ein Modell feinabstimmen, ohne eine einzige Codezeile schreiben zu müssen – nur eine YAML-Konfigurationsdatei. Nachfolgend die config.yml, die wir verwenden werden:

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

Einrichten der Cloud-Umgebung

Zum Ausführen des Trainings verwenden wir einen Cloud-Hosting-Service wie Runpod oder Vultr. Hier ist, was Sie benötigen werden:

  • Docker-Image: Klonen Sie das Docker-Image winglian/axolotl-cloud:main, das vom Axolotl-Team bereitgestellt wird.
  • *Hardware-Anforderungen: Eine 80GB VRAM-GPU (wie ein 1×A100 PCIe-Knoten) wird für diese Modellgröße mehr als ausreichend sein.
  • Speicher: 200GB Volumenspeicher, um alle benötigten Dateien unterzubringen.
  • CUDA-Version: Ihre CUDA-Version sollte mindestens 12.1 sein.

*Dieser Typ des Trainings gilt als vollständige Feinabstimmung des LLM und ist daher sehr VRAM-intensiv. Wenn Sie das Training lokal durchführen möchten, ohne auf Cloud-Hosts angewiesen zu sein, könnten Sie versuchen, QLoRA zu verwenden, was eine Form des überwachten Feinabstimmens ist. Obwohl es theoretisch möglich ist, DPO & QLoRA zu kombinieren, wird dies nur sehr selten gemacht.

Schritte zum Starten des Trainings

  1. Legen Sie das HuggingFace-Cache-Verzeichnis fest:
export HF_HOME=/workspace/hf

Dadurch wird sichergestellt, dass das ursprüngliche Modell in unseren persistenten Volumenspeicher heruntergeladen wird.

  1. Erstellen Sie die Konfigurationsdatei: Speichern Sie die config.yml-Datei, die wir zuvor erstellt haben, unter /workspace/config.yml.
  1. Starten Sie das Training:
python -m axolotl.cli.train /workspace/config.yml

Und voilà! Ihr Training sollte beginnen. Nachdem Axolotl das Modell und die Trainingsdaten heruntergeladen hat, sollten Sie eine Ausgabe sehen, die ähnlich wie diese aussieht:

[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...

Das Training sollte nur wenige Minuten in Anspruch nehmen, da es sich um einen kleinen Datensatz von nur 264 Zeilen handelt. Das feinabgestimmte Modell wird unter /workspace/dpo-output gespeichert.

Hochladen des Modells auf HuggingFace

Sie können Ihr Modell auf HuggingFace mit der Befehlszeilenschnittstelle hochladen:

  1. Installieren Sie die HuggingFace Hub CLI:
pip install huggingface_hub[cli]
  1. Modell hochladen:
huggingface-cli upload /workspace/dpo-output yourname/yourrepo

Ersetzen Sie yourname/yourrepo durch Ihren tatsächlichen HuggingFace-Benutzernamen und den Repository-Namen.

Auswertung Ihres feinabgestimmten Modells

Für die Auswertung wird empfohlen, sowohl das originale als auch das feinabgestimmte Modell mithilfe eines Tools wie Text Generation Inference (TGI) zu hosten. Führen Sie dann Schlussfolgerungen auf beiden Modellen mit einer Temperaturvoreinstellung von 0 durch (um deterministische Ausgaben sicherzustellen) und vergleichen Sie manuell die Antworten der beiden Modelle.

Dieser praktische Ansatz liefert bessere Einblicke als nur auf Trainingsauswertungsverlustmetriken zu vertrauen, die möglicherweise nicht die Feinheiten der Sprachgenerierung in LLMs erfassen.

Abschluss

Durch das Feintuning eines LLM mit DPO können Sie Modelle anpassen, um besser auf die Bedürfnisse Ihrer Anwendung zuzuschneiden, und dabei die Kosten im Rahmen zu halten. Indem Sie den Schritten in diesem Artikel folgen, können Sie die Leistungsfähigkeit von Open-Source-Tools und Datensätzen nutzen, um ein Modell zu erstellen, das Ihren spezifischen Anforderungen entspricht. Ob Sie den Stil von Antworten anpassen oder Sicherheitsmaßnahmen implementieren möchten, DPO bietet einen praktischen Ansatz zur Verfeinerung Ihres LLM.

Viel Erfolg beim Feintuning!

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