Einführung
TurboQuant ist eine neuartige algorithmische Suite und Bibliothek, die kürzlich von Google vorgestellt wurde. Ihr Ziel ist es, fortschrittliche Quantisierungs- und Kompressionstechniken auf große Sprachmodelle (LLMs) und Vektorsuchmaschinen anzuwenden. Diese Technologien sind unverzichtbare Bestandteile von Retrieval-augmented Generation (RAG)-Systemen und sollen deren Effizienz erheblich steigern. TurboQuant hat gezeigt, dass es den Speicherverbrauch auf nur 3 Bit reduzieren kann, ohne dass eine erneute Modelltrainierung erforderlich ist oder die Genauigkeit leidet.
Wie gelingt dies und rechtfertigt es wirklich den Hype? Dieser Artikel zielt darauf ab, diese Fragen zu beantworten, indem er eine Beschreibung und ein praktisches Beispiel für die Anwendung von TurboQuant bietet.
TurboQuant im Überblick
Obwohl LLMs und Vektorsuchmaschinen hochdimensionale Vektoren verwenden, um Informationen mit beeindruckenden Ergebnissen zu verarbeiten, erfordert dieser Prozess enorme Mengen an Speicher. Dies kann zu erheblichen Engpässen im sogenannten Key-Value (KV)-Cache führen, einem schnellen Zugriffssystem, das häufig genutzte Informationen für die Echtzeitabfrage enthält. Das Verwalten größerer Kontextlängen führt zu einer linearen Skalierung des Zugriffs auf den KV-Cache, was die Speicherkapazität und die Rechengeschwindigkeit stark einschränkt.
In den letzten Jahren haben Techniken der Vektorquantisierung (VQ) dazu beigetragen, die Größe von Textvektoren zu reduzieren, um Engpässe abzubauen. Diese Methoden bringen jedoch oft einen zusätzlichen „Speicheraufwand“ mit sich und erfordern die Berechnung von Quantisierungs-Konstanten in voller Präzision auf kleinen Datenblöcken, was den Grund für die Kompression teilweise untergräbt.
TurboQuant ist eine Sammlung von Algorithmen der nächsten Generation für fortschrittliche Kompression ohne Verlust an Genauigkeit. Es geht das Problem des Speicheraufwands optimal an, indem es einen zweistufigen Prozess mit zwei sich ergänzenden Techniken anwendet:
- PolarQuant: Diese Kompressionstechnik wird in der ersten Phase angewendet. Sie komprimiert hochwertige Daten, indem sie Vektorkoordinaten in ein Polarkoordinatensystem abbildet. Dadurch wird die Datengeometrie vereinfacht und die Notwendigkeit, zusätzliche Quantisierungs-Konstanten zu speichern – die Hauptursache für den Speicheraufwand – entfällt.
- QJL (Quantized Johnson-Lindenstrauss): Die zweite Phase des Kompressionsprozesses. Sie konzentriert sich darauf, mögliche Verzerrungen zu beseitigen, die in der vorherigen Phase eingeführt wurden, und fungiert als mathematischer Prüfer, der eine kleine, einbitte Kompression anwendet, um versteckte Fehler oder verbleibende Verzerrungen, die durch die Anwendung von PolarQuant entstanden sind, zu entfernen.
Ist TurboQuant den Hype wert?
Laut experimentellen Ergebnissen und Beweisen lautet die kurze Antwort ja. Durch das Vermeiden der kostspieligen Daten-Normalisierung, die in traditionellen Quantisierungsansätzen erforderlich ist, erzielt TurboQuant mit 3 Bit eine Leistungssteigerung von 8x im Vergleich zu 32-Bit unquantisierten Schlüsseln auf einem H100 GPU-basierten Beschleuniger.
Bewertung von TurboQuant
Im Folgenden wird ein Beispiel in Python gezeigt, das veranschaulicht, wie Entwickler dies lokal bewerten können. Das Programm kann in einer lokalen IDE oder in einer Google Colab-Notebook-Umgebung ausgeführt werden, um einen konzeptionellen Vergleich zwischen unquantisierten Vektoren und der schnellen Kompression von TurboQuant zu ermöglichen.
Die TurboQuant-Repositories erfordern spezifische Kerne, um zu funktionieren. Um dieses Beispiel zum Laufen zu bringen, sollten die folgenden Installationen zuerst durchgeführt werden – vorzugsweise in einer Notebook-Umgebung, es sei denn, Sie haben ausreichend Speicherplatz auf Ihrem lokalen Rechner.
Zuerst TurboQuant installieren:
pip install turboquant
In einer Google Colab-Umgebung installieren Sie einfach die Bibliothek und stellen sicher, dass Ihr Hardware-Beschleuniger auf eine T4 GPU eingestellt ist – verfügbar in der kostenlosen Colab-Stufe – damit der folgende Code ordnungsgemäß ausgeführt werden kann.
Der folgende Code veranschaulicht einen einfachen Vergleich von Leistung und Speicherverbrauch bei der Verwendung eines vortrainierten Sprachmodells mit und ohne die KV-Kompression von TurboQuant. Zunächst die benötigten Importe:
import torch
import time
from transformers import AutoModelForCausalLM, AutoTokenizer
from turboquant import TurboQuantCache
Wir laden ein nicht allzu großes LLM wie TinyLlama/TinyLlama-1.1B-Chat-v1.0, das für die Textgenerierung trainiert wurde, sowie den entsprechenden Tokenizer. Wir geben an, dass wir 16-Bit-Dezimal-Gleitkommapräzision verwenden: Diese Option ist in modernen Hardwareumgebungen in der Regel effizienter.
model_id = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", torch_dtype=torch.float16)
Als Nächstes definieren wir das Szenario, indem wir einen großen Eingabestring simulieren, da TurboQuant besonders gut abschneidet, wenn die Kontextfenster größer werden. Machen Sie sich keine Sorgen, dass der gleiche Inhalt 20 Mal im Eingabetext wiederholt wird: Hier zählt die verwaltete Größe, nicht die Sprache selbst.
prompt = "Erklären Sie die Geschichte des Universums im Detail. " * 20
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
Die folgende Funktion ist entscheidend, um die Ausführungszeit und den Speicherverbrauch im gesamten Textgenerierungsprozess zu messen und zu vergleichen, wobei die 3-Bit-Quantisierung von TurboQuant verwendet wird, entweder mit use_tq=True oder deaktiviert mit use_tq=False. Der Cache wird zuerst geleert, um saubere Messungen zu gewährleisten.
def run_unified_benchmark(use_tq=False):
torch.cuda.empty_cache()
# Initialisierung des spezifischen Cache-Typs
cache = TurboQuantCache(bits=3) if use_tq else None
start_time = time.time()
with torch.no_grad():
# Modell ausführen, um Ausgabetoken zu generieren
outputs = model.generate(**inputs, max_new_tokens=100, past_key_values=cache)
duration = time.time() - start_time
# Isolierung des Cache-Speichers
# Anstatt das gesamte 2GB-Modell zu messen, messen wir die Größe des generierten Caches
# Für ein 1.1B Modell: [Schichten: 22, Köpfe: 32, Kopf_Dim: 64]
num_tokens = outputs.shape[1]
elements = 22 * 32 * 64 * num_tokens * 2 # Schlüssel + Wert
if use_tq:
mem_mb = (elements * 3) / (8 * 1024 * 1024) # 3-Bit-Berechnung
else:
mem_mb = (elements * 16) / (8 * 1024 * 1024) # 16-Bit-Berechnung
return duration, mem_mb
Wir führen den Prozess schließlich zweimal aus – einmal mit jeder der beiden angegebenen Einstellungen – und vergleichen die Ergebnisse:
base_time, base_mem = run_unified_benchmark(use_tq=False)
tq_time, tq_mem = run_unified_benchmark(use_tq=True)
print(f"--- DAS URTEIL ---")
print(f"Baseline (FP16) Cache: {base_mem:.2f} MB")
print(f"TurboQuant (3-Bit) Cache: {tq_mem:.2f} MB")
print(f"Geschwindigkeit: {base_time / tq_time:.2f}x")
print(f"Speicher gespart: {base_mem - tq_mem:.2f} MB")
Ergebnisse:
--- DAS URTEIL ---
Baseline (FP16) Cache: 42.45 MB
TurboQuant (3-Bit) Cache: 7.86 MB
Geschwindigkeit: 0.61x
Speicher gespart: 34.59 MB
Das Kompressionsverhältnis beträgt beeindruckende bis zu 5.4x in Bezug auf den Speicherbedarf des KV-Caches. Aber wie sieht es mit der Geschwindigkeitssteigerung aus? Entspricht sie den Erwartungen mit TurboQuant? Nicht ganz, aber das ist normal, da die verwendete Sequenz immer noch als kurz für die großangelegten Szenarien gilt, für die TurboQuant gedacht ist, und wir führen dies in einer lokalen, nicht großangelegten Infrastruktur aus. Der tatsächliche Geschwindigkeitsgewinn mit TurboQuant tritt auf, wenn die Kontextlänge und die verwendeten Hardwarebeschleuniger zusammen skaliert werden. Nehmen Sie einen Unternehmenscluster von H100 GPUs und lange RAG-Prompts mit über 32K Tokens: In solchen Szenarien wird der Speicherverkehr erheblich reduziert, und ein Durchsatzanstieg von bis zu 8x in der Geschwindigkeit kann mit TurboQuant erwartet werden.
Zusammenfassend lässt sich sagen, dass es einen Kompromiss zwischen Speicherbandbreite und Rechenlatenz gibt, und dies kann weiter bestätigt werden, indem andere Einstellungen für die Eingangs- und Ausgangsgrößen ausprobiert werden, z. B. indem der Eingabestring um das 200-fache multipliziert und max_new_tokens=250 gesetzt wird. Sie könnten etwas wie Folgendes erhalten:
--- DAS URTEIL ---
Baseline (FP16) Cache: 421.44 MB
TurboQuant (3-Bit) Cache: 79.02 MB
Geschwindigkeit: 0.57x
Speicher gespart: 342.42 MB
Letztendlich wird die transformative Leistung von TurboQuant für KI-Modelle durch seine Fähigkeit bewiesen, eine hohe Präzision aufrechtzuerhalten, während es mit einer Systemeffizienz auf 3-Bit-Ebene in großangelegten Umgebungen arbeitet.
Fazit
Dieser Artikel hat TurboQuant vorgestellt und die Frage behandelt, ob es den Hype wert ist, insbesondere in Bezug auf Kompression und Leistung im Vergleich zu anderen traditionellen Quantisierungsmethoden, die in LLMs und anderen großangelegten Inferenzmodellen verwendet werden.
Iván Palomares Carrascosa ist ein führender Experte, Autor, Redner und Berater im Bereich KI, maschinelles Lernen, Deep Learning und LLMs. Er schult und berät andere darin, KI in der realen Welt zu nutzen.
Quellen: kdnuggets
Bildquelle: KI generiert