ruler-combinedFinetuning 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-Notebookarrow-up-right.

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.

circle-check

🏁 Unsloth Gradient Checkpointing Verbesserungen

Unser Unsloth Gradient Checkpointingarrow-up-right 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 Bekmanarrow-up-right (Snowflake) haben wir Tiled MLP aus Snowflakes Arctic Long Sequence Training Papierarrow-up-right 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.

circle-check

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 DeepSpeedarrow-up-right haben ein Doku-Update für Tiled MLP innerhalb von DeepSpeed bereitgestellt.

circle-check

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-Notebookarrow-up-right.

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/unslotharrow-up-right oder unserer Dokumentation beitreten.

Zuletzt aktualisiert

War das hilfreich?