Einführung | Schlussfolgerung | Ausbildung | Zusammensetzbarkeit | Benutzerdefinierte Kernel | Alpha-Funktionen | Installation | Integrationen | Videos | Lizenz | Zitat
Torchao: PyTorch-Bibliothek für benutzerdefinierte Datentypen und Optimierungen. Quantisieren und sparsifizieren Sie Gewichte, Gradienten, Optimierer und Aktivierungen für Inferenz und Training.
Von dem Team, das Ihnen die schnelle Serie gebracht hat
Torchao funktioniert sofort mit torch.compile()
und FSDP2
über die meisten PyTorch-Modelle auf Huggingface.
Das Quantisieren und Sparsifizieren Ihrer Modelle ist ein einfacher Vorgang, der bei jedem Modell mit einem nn.Linear
funktionieren sollte, einschließlich Ihres bevorzugten HuggingFace-Modells. Eine ausführlichere Gebrauchsanweisung finden Sie hier, Sparsity hier und ein HuggingFace-Inferenzbeispiel hier
Als Schlussfolgerung haben wir die Möglichkeit von
from torchao . quantization . quant_api import (
quantize_ ,
int8_dynamic_activation_int8_weight ,
int4_weight_only ,
int8_weight_only
)
quantize_ ( m , int4_weight_only ())
Für gpt-fast ist int4_weight_only()
die beste Option bei bs=1, da es die Tok/s verdoppelt und die VRAM-Anforderungen im Vergleich zu einer mit Torch.compilierten Basislinie um etwa 65 % reduziert .
Wenn Sie nicht über genügend VRAM verfügen, um Ihr gesamtes Modell auf der GPU zu quantisieren, und die CPU-Quantisierung zu langsam ist, können Sie das Geräteargument wie folgt verwenden: quantize_(model, int8_weight_only(), device="cuda")
das sendet und quantisieren Sie jede Ebene einzeln für Ihre GPU.
Wenn Sie bei einer dieser Techniken eine Verlangsamung feststellen oder sich nicht sicher sind, welche Option Sie verwenden sollen, sollten Sie die Verwendung von Autoquant in Betracht ziehen, das automatisch ein Profil der Ebenen erstellt und die beste Methode zur Quantisierung jeder Ebene auswählt.
model = torchao . autoquant ( torch . compile ( model , mode = 'max-autotune' ))
Wir stellen auch eine entwicklerorientierte API zur Verfügung, damit Sie Ihre eigenen Quantisierungsalgorithmen implementieren können. Verwenden Sie daher bitte den hervorragenden HQQ-Algorithmus als motivierendes Beispiel.
Wir haben die KV-Cache-Quantisierung und andere Funktionen hinzugefügt, um Rückschlüsse auf lange Kontextlängen (und notwendigerweise Speichereffizienz) zu ermöglichen.
In der Praxis ermöglichen uns diese Funktionen zusammen mit der int4-Gewichtsquantisierung , den Spitzenspeicher um ~55 % zu reduzieren , was bedeutet, dass wir Llama3.1-8B-Schlussfolgerungen mit einer Kontextlänge von 130 KB und nur 18,9 GB Spitzenspeicher ziehen können. Weitere Details finden Sie hier
Die Quantisierung nach dem Training kann zu einem schnellen und kompakten Modell führen, kann aber auch zu einer Verschlechterung der Genauigkeit führen. Wir empfehlen, Quantization Aware Training (QAT) auszuprobieren, um diese Einschränkung zu überwinden. In Zusammenarbeit mit Torchtune haben wir ein QAT-Rezept entwickelt, das erhebliche Genauigkeitsverbesserungen gegenüber herkömmlicher PTQ zeigt und 96 % der Genauigkeitsverschlechterung bei Hellaswag und 68 % der Ratlosigkeitsverschlechterung bei Wikitext für Llama3 im Vergleich zur Post-Training-Quantisierung (PTQ) wiederherstellt. . Und ein vollständiges Rezept haben wir hier bereitgestellt
from torchao . quantization . qat import Int8DynActInt4WeightQATQuantizer
qat_quantizer = Int8DynActInt4WeightQATQuantizer ()
# Insert "fake quantize" operations into linear layers.
# These operations simulate quantization numerics
model = qat_quantizer . prepare ( model )
# Run Training...
# Convert fake quantize to actual quantize operations
model = qat_quantizer . convert ( model )
Torchao.float8 implementiert Trainingsrezepte mit den skalierten Float8-D-Typen, wie in https://arxiv.org/abs/2209.05433 beschrieben.
Bei aktiviertem torch.compile
zeigen aktuelle Ergebnisse eine Durchsatzgeschwindigkeit von bis zu 1,5x bei 128 H100 GPU LLaMa 3 70B Pretraining-Jobs (Details)
from torchao . float8 import convert_to_float8_training
convert_to_float8_training ( m , module_filter_fn = ...)
Und für ein vollständiges bis minimales Trainingsrezept für das Vortraining mit float8 können Sie sich Torchtitan ansehen
Wir haben Unterstützung für halbstrukturierte 2:4-Sparsity mit 6 % End-to-End-Beschleunigung für ViT-L hinzugefügt. Vollständiger Blog hier
Die Codeänderung ist ein 1-Zeiler. Das vollständige Beispiel finden Sie hier
swap_linear_with_semi_sparse_linear ( model , { "seq.0" : SemiSparseLinear })
ADAM benötigt doppelt so viel Speicher wie die Modellparameter, sodass wir den Optimiererstatus auf entweder 8 oder 4 Bit quantisieren können, wodurch die VRAM-Anforderungen des Optimierers über eine fp16-Basislinie effektiv um das Zweifache bzw. Vierfache reduziert werden
from torchao . prototype . low_bit_optim import AdamW8bit , AdamW4bit , AdamWFp8
optim = AdamW8bit ( model . parameters ()) # replace with Adam4bit and AdamFp8 for the 4 / fp8 versions
In der Praxis sind wir etwas langsamer als von Experten geschriebene Kernel, aber die Implementierungen für diese Optimierer wurden in ein paar hundert Zeilen PyTorch-Code geschrieben und kompiliert, also verwenden Sie sie bitte oder kopieren Sie sie und fügen Sie sie für Ihre quantisierten Optimierer ein. Benchmarks hier
Wir unterstützen auch das CPU-Offloading einzelner GPUs, bei dem sowohl die Farbverläufe (gleiche Größe wie Gewichte) als auch die Optimierer effizient an die CPU gesendet werden. Dies allein kann Ihren VRAM-Bedarf um 60 % reduzieren.
optim = CPUOffloadOptimizer ( model . parameters (), torch . optim . AdamW , fused = True )
optim . load_state_dict ( ckpt [ "optim" ])
torch.compile
: Ein wichtiges Designprinzip für uns ist die Zusammensetzbarkeit, da jeder neue DType oder jedes neue Layout, das wir bereitstellen, mit unserem Compiler funktionieren muss. Es sollte keine Rolle spielen, ob die Kernel in reinem PyTorch, CUDA, C++ oder Triton geschrieben sind – alles sollte einfach funktionieren! Also schreiben wir die DType-, Layout- oder Bitpacking-Logik in reinem PyTorch und generieren durch Code effiziente Kernel.Das beste Beispiel, das wir haben, wenn wir die Zusammensetzbarkeit von Niederbit-D-Typen mit Kompilierung und fsdp kombinieren, ist NF4, das wir zur Implementierung des QLoRA-Algorithmus verwendet haben. Wenn Sie also an der Schnittstelle dieses Bereichs forschen, würden wir uns freuen, von Ihnen zu hören.
Wir haben mit torch.compile()
Unterstützung für das Erstellen und Veröffentlichen von benutzerdefinierten Operationen hinzugefügt, die keine Grafikunterbrechungen verursachen. Wenn Sie also gerne Kernel schreiben, es aber hassen, sie so zu verpacken, dass sie auf allen Betriebssystemen und Cuda-Versionen funktionieren, würden wir gerne Beiträge dafür annehmen Ihre benutzerdefinierten Operationen. Wir haben ein paar Beispiele, denen Sie folgen können
quantize_(model, fpx_weight_only(3, 2))
Wenn Sie der Meinung sind, dass es andere CUDA-Kernel gibt, die wir uns genauer ansehen sollten, hinterlassen Sie bitte einen Kommentar zu diesem Problem
Dinge, auf die wir uns freuen, die aber mehr Zeit zum Garen im Ofen brauchen
quantize_(model, int8_weight_only_quantized_training())
einfach zu verwenden. Bei dieser Arbeit handelt es sich um einen Prototyp, da die Speicher-Benchmarks noch nicht überzeugend sind. torchao
nutzt mehrere neue Funktionen in Pytorch großzügig. Es wird empfohlen, es mit der aktuellen Nightly- oder neuesten stabilen Version von PyTorch zu verwenden.
Stabile Version von Pypi, die standardmäßig CUDA 12.1 verwendet
pip install torchao
Stabile Veröffentlichung aus dem PyTorch-Index
pip install torchao --extra-index-url https://download.pytorch.org/whl/cu121 # full options are cpu/cu118/cu121/cu124
Nächtliche Veröffentlichung
pip install --pre torchao --index-url https://download.pytorch.org/whl/nightly/cu121 # full options are cpu/cu118/cu121/cu124
Für die meisten Entwickler möchten Sie wahrscheinlich auf die Erstellung benutzerdefinierter C++/CUDA-Erweiterungen verzichten, um die Iteration zu beschleunigen
USE_CPP=0 pip install -e .
Wir haben auch das Glück, in einige der führenden Open-Source-Bibliotheken integriert zu sein, darunter
torchao
wird unter der BSD 3-Lizenz veröffentlicht.
Wenn Sie die Torchao-Bibliothek nützlich finden, zitieren Sie sie bitte wie folgt in Ihrer Arbeit.
@software { torchao ,
title = { torchao: PyTorch native quantization and sparsity for training and inference } ,
author = { torchao maintainers and contributors } ,
url = { https//github.com/pytorch/torchao } ,
license = { BSD-3-Clause } ,
month = oct,
year = { 2024 }