TurboQuant: Ist die Komprimierung und Leistung den Hype wert?

# Einführung

TurboQuant ist eine neuartige algorithmische Suite und Bibliothek, die kürzlich von Google eingeführt wurde. Ziel ist es, fortschrittliche Quantisierung und Komprimierung auf große Sprachmodelle (LLMs) und Vektorsuchmaschinen – unverzichtbare Elemente von Retrieval-Augmented Era (RAG)-Systemen – anzuwenden, um deren Effizienz drastisch zu verbessern. Es hat sich gezeigt, dass TurboQuant den Cache-Speicherverbrauch erfolgreich auf nur 3 Bit reduzieren kann, ohne dass eine Neuschulung des Modells erforderlich ist oder die Genauigkeit beeinträchtigt wird.

Wie gelingt das und ist es den Hype wirklich wert? Ziel dieses Artikels ist es, diese Fragen durch eine Beschreibung und ein praktisches Anwendungsbeispiel zu beantworten.

# TurboQuant auf den Punkt gebracht

Während LLMs und Vektorsuchmaschinen hochdimensionale Vektoren verwenden, um Informationen mit beeindruckenden Ergebnissen zu verarbeiten, erfordert dieser Aufwand große Mengen an Speicher, was möglicherweise zu erheblichen Engpässen im sogenannten Schlüsselwert-Cache (KV) führt – einem „digitalen Spickzettel“ mit schnellem Zugriff, der häufig verwendete Informationen für den Echtzeitabruf enthält. Durch die Verwaltung größerer Kontextlängen wird der KV-Cache-Zugriff linear skaliert, was die Speicherkapazität und Rechengeschwindigkeit erheblich einschränkt.

In den letzten Jahren eingesetzte Vektorquantisierungstechniken (VQ) tragen dazu bei, die Größe von Textvektoren zu verringern, um Engpässe zu beseitigen. Sie führen jedoch häufig zu einem zusätzlichen „Speicheraufwand“ und erfordern die Berechnung von Quantisierungskonstanten mit voller Genauigkeit für kleine Datenblöcke, wodurch der Grund für die Komprimierung teilweise untergraben wird.

TurboQuant ist eine Reihe von Algorithmen der nächsten Era für erweiterte Komprimierung ohne Genauigkeitsverlust. Das Drawback des Speicher-Overheads wird optimum gelöst, indem ein zweistufiger Prozess eingesetzt wird, der durch zwei Techniken unterstützt wird, die sich gegenseitig ergänzen:

  • PolarQuant: Dies ist die Komprimierungstechnik, die in der ersten Stufe angewendet wird. Es komprimiert hochwertige Daten, indem es Vektorkoordinaten einem Polarkoordinatensystem zuordnet. Dies vereinfacht die Datengeometrie und macht die Speicherung zusätzlicher Quantisierungskonstanten überflüssig – die Hauptursache für den Speicheraufwand.
  • QJL (quantisierter Johnson-Lindenstrauss): Die zweite Stufe des Komprimierungsprozesses. Der Schwerpunkt liegt auf der Entfernung möglicher Verzerrungen, die in der vorherigen Section eingeführt wurden, und fungiert als mathematischer Prüfer, der eine kleine Ein-Bit-Komprimierung anwendet, um versteckte Fehler oder verbleibende Verzerrungen zu entfernen, die aus der Anwendung von PolarQuant resultieren.

Ist TurboQuant den Hype wert?

Den experimentellen Ergebnissen und Beweisen zufolge lautet die kurze Antwort Ja. Durch die Vermeidung der teuren Datennormalisierung, die bei herkömmlichen Quantisierungsansätzen erforderlich ist, liefert 3-Bit-TurboQuant eine 8-fache Leistungssteigerung über 32-Bit unquantisierte Schlüssel auf einem H100 GPU-basierten Beschleuniger.

# Bewertung von TurboQuant

Das folgende Python-Codebeispiel veranschaulicht, wie Entwickler dies lokal auswerten können. Das Programm kann in einer lokalen IDE oder einer Google Colab-Pocket book-Umgebung ausgeführt werden und bietet einen konzeptionellen Vergleich zwischen unquantisierten Vektoren und der schnellen Komprimierung von TurboQuant.

Für den Betrieb von TurboQuant-Repositorys sind bestimmte Kernel erforderlich. Damit dieses Beispiel funktioniert, führen Sie zunächst die folgenden Installationen durch – vorzugsweise in einer Pocket book-Umgebung, es sei denn, Sie verfügen über ausreichend Speicherplatz auf Ihrem lokalen Laptop.

Installieren Sie zunächst TurboQuant:

In einer Google Colab-Umgebung installieren Sie einfach die Bibliothek und stellen Sie sicher, dass Ihr Laufzeit-Hardwarebeschleuniger auf eine T4-GPU eingestellt ist – verfügbar im kostenlosen Kontingent von Colab –, damit der folgende Code ordnungsgemäß ausgeführt wird.

Der folgende Code veranschaulicht einen einfachen Vergleich von Leistung und Speichernutzung bei Verwendung eines vorab trainierten Sprachmodells mit und ohne KV-Komprimierung von TurboQuant. Zuallererst die Importe, die wir brauchen werden:

import torch
import time
from transformers import AutoModelForCausalLM, AutoTokenizer
from turboquant import TurboQuantCache

Wir werden ein nicht so großes LLM wie laden TinyLlama/TinyLlama-1.1B-Chat-v1.0trainiert für die Textgenerierung, und sein jeweiliger Tokenizer. Wir geben die Verwendung einer 16-Bit-Dezimal-Float-Genauigkeit an: Diese Possibility ist in der Regel in moderner {Hardware} effizienter.

model_id = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
tokenizer = AutoTokenizer.from_pretrained(model_id)
mannequin = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", torch_dtype=torch.float16)

Als Nächstes definieren wir das Szenario, indem wir eine große Modelleingabezeichenfolge simulieren, da TurboQuant wirklich glänzt, wenn Kontextfenster größer werden. Machen Sie sich keine Sorgen darüber, dass derselbe Inhalt 20 Mal in der Eingabe wiederholt wird: Hier kommt es auf die verwaltete Größe an, nicht auf die Sprache selbst.

immediate = "Clarify the historical past of the universe in nice element. " * 20 
inputs = tokenizer(immediate, return_tensors="pt").to("cuda")

Die folgende Funktion ist der Schlüssel zum Messen und Vergleichen der Ausführungszeit und der Speichernutzung im gesamten Textgenerierungsprozess, wobei die 3-Bit-Quantisierung von TurboQuant verwendet wird: use_tq=True oder deaktiviert, use_tq=False. Um saubere Messungen zu gewährleisten, wird zunächst der Cache geleert.

def run_unified_benchmark(use_tq=False):
    torch.cuda.empty_cache()
    
    # Initializing the precise cache kind
    cache = TurboQuantCache(bits=3) if use_tq else None
    
    start_time = time.time()
    with torch.no_grad():
        # Working the mannequin to generate output tokens
        outputs = mannequin.generate(**inputs, max_new_tokens=100, past_key_values=cache)
    
    length = time.time() - start_time
    
    # Isolating the Cache Reminiscence
    # As an alternative of measuring the entire 2GB mannequin, we measure the generated Cache dimension
    # For a 1.1B mannequin: (Layers: 22, Heads: 32, Head_Dim: 64)
    num_tokens = outputs.form(1)
    parts = 22 * 32 * 64 * num_tokens * 2 # Key + Worth
    
    if use_tq:
        mem_mb = (parts * 3) / (8 * 1024 * 1024) # 3-bit calculation
    else:
        mem_mb = (parts * 16) / (8 * 1024 * 1024) # 16-bit calculation
        
    return length, mem_mb

Abschließend führen wir den Vorgang zweimal durch – jeweils einmal mit den 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"--- THE VERDICT ---")
print(f"Baseline (FP16) Cache: {base_mem:.2f} MB")
print(f"TurboQuant (3-bit) Cache: {tq_mem:.2f} MB")
print(f"Speedup: {base_time / tq_time:.2f}x")
print(f"Reminiscence Saved: {base_mem - tq_mem:.2f} MB")

Ergebnisse:

--- THE VERDICT ---
Baseline (FP16) Cache: 42.45 MB
TurboQuant (3-bit) Cache: 7.86 MB
Speedup: 0.61x
Reminiscence Saved: 34.59 MB

Das Komprimierungsverhältnis beträgt im Hinblick auf den KV-Cache-Speicherbedarf beeindruckende bis zu 5,4-fache. Aber wie wäre es mit der Beschleunigung? Ist es mit TurboQuant wie erwartet? Nicht ganz, aber das ist regular, da die von uns verwendete Sequenz immer noch als kurz für die groß angelegten Szenarien gilt, für die TurboQuant gedacht ist, und wir dies in einer lokalen, nicht groß angelegten Infrastruktur ausführen. Der wahre Geschwindigkeitsgewinn mit TurboQuant entsteht, wenn die Kontextlänge und die verwendeten Hardwarebeschleuniger zusammen skalieren. Nehmen Sie einen Unternehmenscluster von H100-GPUs und lange RAG-Eingabeaufforderungen mit über 32.000 Token: In solchen Szenarien wird der Speicherverkehr erheblich reduziert, und mit TurboQuant kann eine bis zu 8-fache Durchsatzsteigerung erwartet werden.

Zusammenfassend lässt sich sagen, dass es einen Kompromiss zwischen Speicherbandbreite und Rechenlatenz gibt, und Sie können dies weiter bestätigen, indem Sie andere Einstellungen für die Eingabe- und Ausgabegrößen ausprobieren, z. B. die Eingabezeichenfolge mit 200 multiplizieren und festlegen max_new_tokens=250erhalten Sie möglicherweise etwas wie:

--- THE VERDICT ---
Baseline (FP16) Cache: 421.44 MB
TurboQuant (3-bit) Cache: 79.02 MB
Speedup: 0.57x
Reminiscence Saved: 342.42 MB

Letztendlich wird die transformative Leistung von TurboQuant für KI-Modelle durch seine Fähigkeit bewiesen, eine hohe Präzision beizubehalten und gleichzeitig in großen Umgebungen mit einer Systemeffizienz auf 3-Bit-Ebene zu arbeiten.

# Zusammenfassung

In diesem Artikel wurde TurboQuant vorgestellt und die Frage behandelt, ob es den Hype in Bezug auf Komprimierung und Leistung im Vergleich zu anderen herkömmlichen Quantisierungsmethoden, die in LLMs und anderen groß angelegten Inferenzmodellen verwendet werden, wert ist.

Iván Palomares Carrascosa ist ein führender Autor, Redner und Berater in den Bereichen KI, maschinelles Lernen, Deep Studying und LLMs. Er schult und leitet andere darin, KI in der realen Welt zu nutzen.

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert