Tokenwerk · Das LLM-Lehrbuch

Kapitel 10 · II · Von Zahlen zu Sprache · 5 Minuten

Deine Python-Werkstatt

Eine kleine, nachvollziehbare Umgebung auf Mac, Windows oder Linux. Erst ein verlässlicher Rechenweg, dann größere Modelle.

Warum Python und PyTorch?

Die Website ist mit Vue gebaut. Das eigentliche Modell programmieren wir in Python, weil PyTorch mit Zahlenfeldern rechnen, Ableitungen automatisch bestimmen und Rechenchips wie Grafikkarten nutzen kann. PyTorch übernimmt Multiplikationen und Differentiation (das Berechnen von Ableitungen), aber nicht unsere Architektur, den Tokenizer oder die Datenentscheidungen. Du baust die Modellklassen selbst, statt ein fertiges Modell mit from_pretrained zu laden.

Du musst Python nicht perfekt beherrschen. Listen, Dictionaries, Funktionen, Klassen und Schleifen reichen für den Einstieg. Eine eigene Modellklasse erbt von nn.Module. Gewichte, die du als Attribute (nn.Parameter) oder als Untermodule (z. B. nn.Linear) anlegst, registriert das Modul automatisch. model.parameters() liefert anschließend alle registrierten Parameter, also normalerweise die trainierbaren Zahlen. Eine lokale Variable, die nur ein Tensor ist, wird nicht automatisch ein Parameter: Dafür gibt es nn.Parameter.

Umgebung einrichten

Installiere Python 3.11 oder 3.12. Verwende eine virtuelle Umgebung, damit dieses Projekt nicht die Pakete anderer Projekte verändert. Lade das Projektpaket über den Download im Lehrbuch herunter und entpacke es.

bash
# macOS / Linux
cd tokenwerk-project
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements.txt

In PowerShell lautet die Aktivierung anders:

powershell
py -3.12 -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -r requirements.txt

Wenn PowerShell die Aktivierung blockiert, kannst du den Interpreter direkt aufrufen: .\.venv\Scripts\python.exe -m pip install -r requirements.txt. Du musst keine systemweite Richtlinie ändern, nur um dieses Projekt zu starten.

Für eine NVIDIA-GPU brauchst du eine passend zu deinem System gebaute PyTorch-Version; unter Windows installiert pip install torch eine reine CPU-Version. Benutze dafür den offiziellen Installationsselektor. Die simple Installation in requirements.txt ist keine Zusage für jede CUDA-Konfiguration. Prüfe nach der Installation:

python
import torch
print(torch.__version__)
print('CUDA:', torch.cuda.is_available())
print('MPS:', torch.backends.mps.is_available())
x = torch.tensor([1., 2., 3.], requires_grad=True)
(x.square().sum()).backward()
print(x.grad)  # tensor([2., 4., 6.])

Dein Mac als Lernmaschine

Auf einem Apple-Silicon-Mac stellt PyTorch mit mps einen Beschleuniger bereit. CPU ist für kleine Tests oft der einfachere und sogar schnellere Ausgangspunkt: Auf einem Apple-Silicon-Mac brauchten 200 Trainingsschritte unseres kleinen Modells auf der CPU 1,3 Sekunden, mit mps 4,1 Sekunden – bei identischem Loss. MPS lohnt sich erst bei größeren Modellen und Batches. Apples eigenes Framework MLX ist eine Alternative zu PyTorch; dieses Buch und das Projekt verwenden PyTorch, auf dem Mac also cpu oder mps. Ein Mac mit 16 GB gemeinsamem Arbeitsspeicher ist für den didaktischen Weg geeignet; der gesamte Speicher steht aber nicht dem Modell zur Verfügung. Betriebssystem, Programme, Gewichte, Gradienten, Optimizer und Zwischenwerte teilen ihn sich. Beginne mit der Micro-Konfiguration, nicht mit Milliarden Parametern.

python
def device_name():
    if torch.cuda.is_available():
        return 'cuda'
    if torch.backends.mps.is_available():
        return 'mps'
    return 'cpu'

Eine Operation auf einem Beschleuniger ist nicht automatisch schneller. Kleine Matrixmultiplikationen können durch Übertragung und Startkosten begrenzt werden. Ein fairer Zeitvergleich braucht Aufwärmen und Synchronisation; ein einzelner unvorbereiteter Zeitstempel misst sonst womöglich nur das Einreihen einer Operation.

Optionaler Funktionstest des vollständigen Projekts

bash
python tests.py
python prepare.py --demo --out runs/demo --vocab-size 320
python train.py --data runs/demo --out runs/micro --steps 100 --device cpu
python sample.py --checkpoint runs/micro/last.pt --prompt "Die Katze" --tokens 60

Die folgenden Fachbegriffe gehören zu späteren Kapiteln. Du musst die vollständige Pipeline jetzt noch nicht verstehen oder ausführen; dies ist ein optionaler Installationstest.

tests.py prüft unter anderem Tokenizer-Roundtrips, Tensorformen, Kausalität, endlichen Loss und die SFT-Maske. Die 100 Schritte sind ein kurzer Funktionstest. Erwartest du danach gute Texte, verwechselst du eine laufende Pipeline mit einem fertig trainierten Modell.

Orientierung für später: die Projektdateien

Datei Aufgabe
tokenizer.py Byte-BPE lernen, speichern, laden und anwenden
model.py Klassischer und moderner Decoder
prepare.py Dokumente trennen und Tokenfolgen erzeugen
train.py Pretraining, Validierung und Checkpoints
sft.py Antwortbeispiele mit Maskierung trainieren
sample.py Text oder Antwort autoregressiv erzeugen
tests.py Kleine, gezielte Funktionsprüfungen

Ein Checkpoint enthält nicht nur Gewichte. Für eine Fortsetzung brauchst du auch Architekturkonfiguration, Optimizer-Zustand, Schrittzahl und möglichst Zufallszustände. Der Tokenizer ist Teil der Identität eines Modells: Ein anderer Tokenizer mit denselben IDs kann denselben Gewichten völlig andere Bedeutungen zuweisen. Deshalb speichert das Projekt die Tokenizer-Daten auch im Checkpoint.

Kleine Schritte statt langer blinder Läufe

Für jetzt genügen die Installation und der Ableitungstest. Ein Zahlenfeld heißt in PyTorch Tensor; square() quadriert seine Werte, sum() addiert sie und backward() berechnet die Ableitungen. Aus [1,2,3] werden die Quadrate [1,4,9], ihre Summe 14 und die Ableitungen [2,4,6]. Das nächste Kapitel erklärt solche Zahlenfelder und ihre Formen ausführlich.

Sobald du die späteren Modellkapitel bearbeitet hast: Führe zuerst die Tests aus. Dann prüfe eine kleine Gruppe von Beispielen (einen Batch), einen Forward-Pass und einen Backward-Pass. Danach trainiere auf wenigen Beispielen so lange, bis das Modell sie überanpassen kann. Erst wenn das klappt, erhöhe die Datenmenge. Ein Fehler im Target-Shift wird durch mehr Rechenzeit nicht repariert. Er wird nur teurer.