Finetuning mit 500K Kontextlänge
Lerne, wie man mit Unsloth ein Kontextfenster von >500K Tokens für Finetuning aktiviert.
Wir führen neue Algorithmen in Unsloth ein, die die Grenzen des Trainings mit langen Kontexten für jede LLM und VLM. Das Training von LLMs wie gpt-oss-20b kann jetzt 500K+ Kontextlängen auf einer einzigen 80GB H100 GPU erreichen, verglichen mit zuvor 80K ohne Genauigkeitsverschlechterung.
Sie können > erreichen750K Kontextfenster auf einer B200 192GB GPU.
Probieren Sie 500K-Kontext gpt-oss-20b Fine-Tuning in unserem 80GB A100 Colab-Notebook.
Wir haben deutlich verbessert, wie Unsloth Speicherverbrauchsmuster, Geschwindigkeit und Kontextlängen handhabt:
60% geringerer VRAM-Verbrauch mit 3,2× längerer Kontext durch Unsloths neues gefused und gechunktes Kreuzentropie- Loss, ohne Einbußen bei Geschwindigkeit oder Genauigkeit
Erweiterte Aktivierungs-Auslagerung in Unsloths Gradient Checkpointing
Zusammenarbeit mit Stas Bekman von Snowflake an Tiled MLP, wodurch 2× mehr Kontexte ermöglicht werden
Unsloths Algorithmen ermöglichen gpt-oss-20b QLoRA (4bit) mit 290K Kontext auf einer H100 ohne Genauigkeitsverlust, und 500K+ mit aktiviertem Tiled MLP, insgesamt liefern sie >6,4× längere Kontextlängen.

📐 Unsloth Loss-Refactoring: Chunk & Fuse
Unsere neue fused Loss-Implementierung fügt hinzu dynamisches Sequenz-Chunking: anstatt die Logits des Sprachmodell-Kopfes und die Kreuzentropien über die gesamte Sequenz gleichzeitig zu berechnen, verarbeiten wir handhabbare Scheiben entlang der abgeflachten Sequenzdimension. Dadurch wird der Spitzenpeicher von GBs auf kleinere Chunks reduziert. Jeder Chunk führt weiterhin einen vollständig gefuseten Forward- + Backward-Durchlauf über torch.func.grad_and_value aus und behält die Genauigkeit der gemischten Präzision bei, indem bei Bedarf auf float32 hochskaliert wird. Diese Änderungen beeinträchtigen weder Trainingsgeschwindigkeit noch Genauigkeit.

Die Schlüsselinnovation ist, dass die Chunk-Größe zur Laufzeit automatisch gewählt wird basierend auf verfügbarem VRAM.
Wenn Sie mehr freien VRAM haben, werden größere Chunks für schnellere Durchläufe verwendet
Wenn Sie weniger VRAM haben, erhöht es die Anzahl der Chunks, um Speicherüberläufe zu vermeiden.
Dies entfernt manuelles Tuning und macht unseren Algorithmus robust gegenüber alten und neuen GPUs, Arbeitslasten und unterschiedlichen Sequenzlängen.
Aufgrund des automatischen Tunings verwenden kleinere Kontexte mehr VRAM (weniger Chunks) um unnötigen Overhead zu vermeiden. Für die obigen Plots passen wir die Anzahl der Loss-Chunks an, um realistische VRAM-Stufen widerzuspiegeln. Bei 80GB VRAM ergibt dies >3,2× längere Kontexte.
🏁 Unsloth Gradient Checkpointing Verbesserungen
Unser Unsloth Gradient Checkpointing Algorithmus, eingeführt im April 2024, wurde schnell populär und zum Industriestandard, da er mittlerweile in die meisten Trainingspakete integriert wurde. Er lagert Aktivierungen in den CPU-RAM aus, was 10× längere Kontextlängen ermöglichte. Unsere neuen Verbesserungen verwenden CUDA-Streams und andere Tricks, um höchstens 0.1% Trainings-Overhead mit keiner Auswirkung auf die Genauigkeit hinzuzufügen. Zuvor fügte er 1 bis 3% Trainings-Overhead hinzu.
Indem Aktivierungen sofort nach ihrer Erzeugung ausgelagert werden, minimieren wir die Spitzenaktivierungs-Fußabdruck und geben GPU-Speicher genau dann frei, wenn er benötigt wird. Dies verringert den Speicherbedarf bei Training mit langen Kontexten oder großen Batches stark, wo die Aktivierungen einer einzelnen Decoder-Schicht 2 GB überschreiten können.
Daher tragen Unsloths neue Algorithmen & Gradient Checkpointing zu den meisten Verbesserungen (3,2×) bei und ermöglichen 290k-Kontext-Längen QLoRA GPT-OSS Fine-Tuning auf einer einzelnen H100.
🔓 Tiled MLP: Freischaltung von 500K+
Mit Hilfe von Stas Bekman (Snowflake) haben wir Tiled MLP aus Snowflakes Arctic Long Sequence Training Papier und Blogbeitrag integriert. TiledMLP reduziert Aktivierungs-Speicher und ermöglicht deutlich längere Sequenzlängen, indem verborgene Zustände entlang der Sequenzdimension vor den schweren MLP-Projektionen gekachelt werden.
Wir führen außerdem einige Verbesserungen zur Benutzerfreundlichkeit ein:
Wir erhalten den RNG-Zustand über getilete Forward-Recomputations hinweg, sodass Dropout und andere stochastische Operationen zwischen Forward- und Backward-Replays konsistent sind. Das hält verschachtelte checkpointete Berechnungen stabil und numerisch identisch.
Unsere Implementierung patcht automatisch jedes Modul, das benannt ist oder typisiert ist als mlp, sodass fast alle Modelle mit MLP-Modulen von Haus aus für Tiled MLP unterstützt werden.
Abwägungen, die zu beachten sind
TiledMLP spart VRAM auf Kosten zusätzlicher Forward-Durchläufe. Da es sich innerhalb eines checkpointeten Transformer-Blocks befindet und selbst im Checkpoint-Stil geschrieben ist, wird es effektiv zu einem verschachtelten Checkpoint: ein MLP führt jetzt ~3 Forward-Durchläufe und 1 Backward-Durchlauf pro Schritt aus. Im Gegenzug können wir fast alle Zwischen-MLP-Aktivierungen aus dem VRAM entfernen und dennoch extrem lange Sequenzen unterstützen.

Die Plots vergleichen aktive Speichertimelines für den Forward- und Backward-Durchlauf einer einzelnen Decoder-Schicht während eines Trainingsschritts mit langem Kontext, ohne Tiled MLP (links) und mit Tiled MLP (rechts). Ohne Tiled MLP tritt der VRAM-Peak während des MLP-Backwards auf; mit Tiled MLP verschiebt er sich zur gefuseten Loss-Berechnung. Wir sehen ~40% geringeren VRAM-Verbrauch, und da der gefusete Loss sich dynamisch basierend auf verfügbarem VRAM autchunks, wäre der Peak mit Tiled MLP auf kleineren GPUs noch kleiner.

Um zu zeigen, dass die Kreuzentropie nicht der neue Engpass ist, fixieren wir deren Chunk-Größe, anstatt sie dynamisch zu wählen, und verdoppeln dann die Anzahl der Chunks. Dies reduziert die speicherbezogenen Loss-Spitzen erheblich. Der maximale Speicherbedarf tritt nun in beiden Fällen während des Backwards auf, und die Gesamtzeit ist ähnlich, obwohl Tiled MLP einen kleinen Overhead hinzufügt: ein großes GEMM wird zu vielen sequentiellen Matmuls, plus dem oben genannten zusätzlichen Forward-Durchlauf.
Insgesamt lohnt sich der Kompromiss: Ohne Tiled MLP kann das Training mit langen Kontexten ungefähr 2× so viel Speicher erfordern, während mit Tiled MLP eine einzelne GPU nur etwa eine 1,3× Erhöhung der Schrittzeit für dieselbe Kontextlänge in Kauf nimmt.
Tiled MLP in Unsloth aktivieren:
Setzen Sie einfach unsloth_tiled_mlp = True in from_pretrained und Tiled MLP ist aktiviert. Wir folgen derselben Logik wie im Arctic-Papier und wählen num_shards = ceil(seq_len/hidden_size). Jede Kachel wird auf Sequenzlängen wirken, die dieselbe Größe wie die Hidden-Dimension des Modells haben, um Durchsatz und Speicherersparnis auszubalancieren.
Wir haben auch diskutiert, wie Tiled MLP effektiv 3 Forward-Durchläufe und 1 Backward macht, verglichen mit normalem Gradient Checkpointing, das 2 Forward-Durchläufe und 1 Backward macht, und Stas Bekman und DeepSpeed haben ein Doku-Update für Tiled MLP innerhalb von DeepSpeed bereitgestellt.
Wenn beim nächsten Mal beim Fine-Tuning der Speicher ausgeht, versuchen Sie, unsloth_tiled_mlp = Trueeinzuschalten. Dies sollte etwas VRAM sparen, solange die Kontextlänge länger ist als die Hidden-Dimension des LLM.
Mit unserem neuesten Update ist es jetzt möglich, mit einem kleineren Modell auf einer einzelnen GPU 1M Kontextlänge zu erreichen!
Probieren Sie 500K-Kontext gpt-oss-20b Fine-Tuning in unserem 80GB A100 Colab-Notebook.
Wenn Sie es bis hierher geschafft haben, veröffentlichen wir diese Woche einen neuen Blog über unsere neuesten Verbesserungen in der Trainingsgeschwindigkeit – bleiben Sie dran, indem Sie unserem Reddit r/unsloth oder unserer Dokumentation beitreten.
Zuletzt aktualisiert
War das hilfreich?

