12 Punkte von GN⁺ 2024-05-29 | Noch keine Kommentare. | Auf WhatsApp teilen
  • Erklärung, wie sich das GPT-2-(124M)-Modell mit llm.c in 90 Minuten für 20 $ reproduzieren lässt
  • GPT-2 (124M) ist das kleinste Modell, das OpenAI 2019 veröffentlicht hat
  • Mit einem 8X-A100-80GB-SXM-Node bei Lambda liegen die Kosten bei etwa 14 $ pro Stunde, insgesamt also bei rund 20 $
    • Das Training ist auch auf einer einzelnen GPU möglich, dauert dann aber länger (4–24 Stunden)

Vergleich der Ergebnisse

  • Auf dem FineWeb-Validierungsdatensatz zeigt es bessere Leistung als der von OpenAI veröffentlichte Checkpoint
    • Allerdings wurde GPT-2 mit WebText trainiert, daher ist der Vergleich nicht vollständig fair
  • Auch die HellaSwag-Genauigkeit wurde gemessen: Mit 29,9 liegt sie nahe an GPT-3 Small (124M) mit 33,7
    • GPT-2 (124M) mit 29,4 wird bereits übertroffen
    • Hier wurde jedoch mit 10B Tokens trainiert, während GPT-3 mit 300B Tokens trainiert wurde

Minimale Umgebungseinrichtung

  • GPU erforderlich (Lambda Labs empfohlen)
  • Anleitung basiert auf Linux x86 64bit Ubuntu 22.04 mit CUDA 12
  • Installation von miniconda und anschließend der PyTorch-Nightly-Version (optional)
  • Installation der für den Tokenizer benötigten Pakete
  • Installation von cuDNN für mehr Geschwindigkeit (optional)
  • Installation von MPI bei Nutzung mehrerer GPUs (optional)
  • Vorverarbeitung des FineWeb-10B-Token-Datensatzes (~1 Stunde)
  • Kompilieren von llm.c (gemischte Präzision, cuDNN FlashAttention)

Training ausführen

  • Beispielbefehl für die Nutzung einer einzelnen GPU
  • Ausführung mit mpirun bei Multi-GPU-Betrieb (8 GPUs)
  • Erklärung der wichtigsten Argumente
    • -i, -j: Pfade zu Trainings-/Validierungsdaten
    • -o: Speicherpfad für Logs und Checkpoints
    • -e: Modellinitialisierung (GPT-2 mit Tiefe 12)
    • -b: Micro-Batch-Größe (bei Speichermangel reduzieren)
    • -t: maximale Sequenzlänge
    • -d: gesamte Batch-Größe (siehe GPT-3-Paper)
    • -r: Recompute-Einstellung (spart Speicher)
    • -z: ZeRO-1 (Sharding des Optimizer-Status)
    • Weitere Einstellungen wie Weight Decay, Lernrate, Checkpoint-Intervall usw.

Trainingsverlauf

  • Bei 10B Trainingstokens und einer Batch-Größe von 0,5M werden etwa 20K Schritte erwartet
  • Für eine A100-40GB-PCIe-GPU werden Zeit pro Schritt, MFU und Token-Durchsatz ausgegeben
  • Zu Beginn des Trainings tritt Gradient Exploding auf, wird aber durch Clipping behoben

Visualisierung

  • Bereitgestellt wird ein Jupyter-Notebook, das Log-Dateien parst und die Trainingskurven visualisiert

Tokenizer

  • Wird benötigt, um Integer-Tokens in Zeichenketten umzuwandeln
  • Kann mit einem PyTorch-Skript erzeugt werden

Sampling

  • Aktuell nicht für Inferenz optimiert
  • Mit kleineren Code-Anpassungen sind unconditional/conditional Sampling möglich

Codestruktur

  • Der Großteil der Implementierung befindet sich in der Datei train_gpt2.cu
  • Die ersten 500 Zeilen enthalten Setups für MPI, NCCL, cuDNN, cuBLAS usw.
  • Die folgenden 1500 Zeilen enthalten Forward/Backward des Transformers
  • Die nächsten 1000 Zeilen implementieren das GPT-2-Modell
  • Die letzten 1000 Zeilen enthalten Trainingsschleife, Argument-Parsing usw.

350M-Modell

  • 10B Tokens reichen nicht aus, stattdessen werden 30B Tokens verwendet
  • Mit 8X A100 80GB dauert das 14 Stunden und kostet etwa 200 $

FAQ

  • Sampling möglich?: Ja, aber ineffizient.
  • Chat möglich?: Derzeit nur Pretraining, kein Chat-Fine-Tuning.
  • Verteiltes Training über mehrere Nodes?: Möglich, aber noch nicht getestet.
  • Bitgenau deterministisch?: Nahezu deterministisch, aber einige Kernel-Patches sind nötig.
  • FP8-Training möglich?: Aktuell wird mit BF16 trainiert, FP8-Unterstützung folgt bald.
  • Unterstützung für Nicht-NVIDIA-GPUs?: Derzeit nur C/CUDA.

Meinung von GN⁺

  • GPT-2 ist als Ursprung moderner LLMs ein äußerst wichtiges Modell. Auch GPT-3 und andere LLMs unterscheiden sich im Kern nicht grundlegend von GPT-2.
  • Dieses Projekt ermöglicht es praktisch jedem, ein Modell auf GPT-2-Niveau selbst zu vertretbaren Kosten zu trainieren. Das dürfte sehr dabei helfen, das Verständnis für LLMs zu vertiefen.
  • Allerdings ist es derzeit noch nicht für Inferenz optimiert, weshalb der praktische Einsatz in realen Services eingeschränkt ist. Auch Fine-Tuning zu einem dialogorientierten Modell wird nicht unterstützt.
  • Aktuell werden nur NVIDIA-GPUs unterstützt; künftig wäre Unterstützung für verschiedene Plattformen wie AMD oder Apple Silicon wünschenswert.
  • Ähnliche Open-Source-Projekte mit vergleichbarem Ziel sind Megatron-LM, DeepSpeed und FairSeq. Sie haben jeweils eigene Vor- und Nachteile und sollten je nach Einsatzzweck gewählt werden.
  • Im Sinne eines lebendigen LLM-Entwicklungsökosystems ist dies ein äußerst ermutigendes Projekt. Die weitere Entwicklung bleibt spannend.

Noch keine Kommentare.

Noch keine Kommentare.