paint-brush
Einführung in die Inferenzoptimierung von Large Language Models (LLM): 1. Hintergrund und Problemformulierungvon@mandliya
1,329 Lesungen
1,329 Lesungen

Einführung in die Inferenzoptimierung von Large Language Models (LLM): 1. Hintergrund und Problemformulierung

von Ravi Mandliya11m2024/11/04
Read on Terminal Reader

Zu lang; Lesen

In diesem Beitrag geben wir einen kurzen Überblick über die LLM-Inferenz, ihre Bedeutung und die damit verbundenen Herausforderungen. Wir werden auch die wichtigsten Problemformulierungen skizzieren, die unsere Untersuchung von Optimierungstechniken leiten werden.
featured image - Einführung in die Inferenzoptimierung von Large Language Models (LLM): 1. Hintergrund und Problemformulierung
Ravi Mandliya HackerNoon profile picture

Überblick über die Inferenz von Large Language Models (LLM), ihre Bedeutung, Herausforderungen und wichtigsten Problemformulierungen.


Large Language Models (LLMs) haben das Feld der Verarbeitung natürlicher Sprache (NLP) revolutioniert, indem sie eine breite Palette von Anwendungen ermöglichen, von Chatbots und KI-Agenten bis hin zur Code- und Inhaltsgenerierung. Der Einsatz von LLMs in realen Szenarien ist jedoch häufig mit Herausforderungen in Bezug auf Latenz, Ressourcenverbrauch und Skalierbarkeit verbunden.


In dieser Blog-Serie werden wir verschiedene Optimierungstechniken für LLM-Inferenz untersuchen. Wir werden uns mit Strategien zur Reduzierung von Latenz, Speicherbedarf und Rechenkosten befassen, von Caching-Mechanismen bis hin zu Hardwarebeschleunigungen und Modellquantisierung.


In diesem Beitrag geben wir einen kurzen Überblick über die LLM-Inferenz, ihre Bedeutung und die damit verbundenen Herausforderungen. Wir werden auch die wichtigsten Problemformulierungen skizzieren, die unsere Untersuchung von Optimierungstechniken leiten werden.

Modellinferenz: Ein Überblick

Unter Modellinferenz versteht man den Prozess, bei dem ein trainiertes maschinelles Lernmodell verwendet wird, um auf der Grundlage neuer Eingabedaten Vorhersagen zu treffen oder Ausgaben zu generieren. Im Kontext von LLMs umfasst Inferenz die Verarbeitung von Texteingaben und die Generierung kohärenter und kontextbezogen relevanter Textausgaben.


Das Modell wird nur einmal oder in regelmäßigen Abständen trainiert, während die Inferenz weitaus häufiger erfolgt, in Produktionsumgebungen wahrscheinlich Tausende Mal pro Sekunde.


Die Inferenzoptimierung ist unerlässlich, um sicherzustellen, dass LLMs effektiv in realen Anwendungen eingesetzt werden können. Das Ziel besteht darin, die Latenz (die Zeit, die zum Generieren einer Antwort benötigt wird) zu minimieren, den Ressourcenverbrauch (CPU, GPU, Speicher) zu reduzieren und die Skalierbarkeit (die Fähigkeit, zunehmende Lasten zu bewältigen) zu verbessern.


Beispielsweise erfordert GPT-3 (mit 175 Milliarden Parametern) erhebliche Rechenressourcen für die Inferenz. Optimierungen können die Antwortzeiten von 1–2 Sekunden auf Millisekunden reduzieren, wodurch LLMs für interaktive Anwendungen praktischer werden.

Übersicht über die Transformer-Architektur

Transformer-Architektur (Quelle: Attention is All You Need)


Die Transformer-Architektur, die Aufmerksamkeitsmechanismen verwendet, ist zur Grundlage der meisten modernen LLMs geworden. Diese Architektur umfasst Positionskodierungen, Multi-Head-Self-Attention, Feedforward-Neuralnetze und Layer-Normalisierung. Transformer werden im Allgemeinen in drei Haupttypen eingeteilt:


  • Nur-Encoder-Modelle (z. B. BERT) sind für Aufgaben wie Textklassifizierung und Named-Entity-Erkennung konzipiert. Sie konvertieren eine Eingabesequenz in eine Darstellung mit fester Länge – Einbettung. Diese Modelle sind bidirektional, d. h. sie berücksichtigen den Kontext sowohl von links als auch von rechts eines Tokens, was zu einem besseren Verständnis des Eingabetextes führen kann.


  • Für Aufgaben zur Textgenerierung werden ausschließlich Decoder-Modelle (z. B. GPT-3) verwendet. Aus einer Eingabesequenz generieren sie Text Token für Token, abhängig von den zuvor generierten Token. Diese Modelle sind unidirektional, d. h. sie berücksichtigen nur den Kontext von links eines Tokens, was für Aufgaben wie Sprachmodellierung geeignet ist. Dies ist die gängigste LLM-Architektur.


  • Encoder-Decoder-Modelle (z. B. T5) waren die ursprüngliche Architektur, die in dem Artikel „Attention is All You Need“ vorgestellt wurde. Diese Modelle sind für Aufgaben konzipiert, die sowohl Verständnis als auch Generierung erfordern, wie z. B. Übersetzung und Zusammenfassung. Sie verarbeiten die Eingabesequenz mit dem Encoder und generieren dann die Ausgabesequenz mit dem Decoder.


Da Nur-Decoder-Modelle die gängigste LLM-Architektur für autoregressive Aufgaben sind, konzentriert sich diese Reihe auf Optimierungstechniken speziell für diesen Modelltyp.

Überblick über den Aufmerksamkeitsmechanismus

Der Aufmerksamkeitsmechanismus ist eine Schlüsselkomponente der Transformer-Architektur, die es dem Modell ermöglicht, sich bei der Ausgabegenerierung auf verschiedene Teile der Eingabesequenz zu konzentrieren. Er berechnet eine gewichtete Summe der Eingabedarstellungen, wobei die Gewichte durch die Relevanz jedes Eingabetokens für das aktuell generierte Ausgabetoken bestimmt werden. Dieser Mechanismus ermöglicht es dem Modell, Abhängigkeiten zwischen Tokens zu erfassen, unabhängig von ihrer Distanz in der Eingabesequenz.

Aufmerksamkeitsmechanismus bei der Arbeit


Der Aufmerksamkeitsmechanismus kann rechenintensiv sein, insbesondere bei langen Eingabesequenzen, da er die Berechnung paarweiser Interaktionen zwischen allen Token erfordert (Komplexität O(n^2) . Sehen wir uns das Ganze Schritt für Schritt genauer an:


  1. Eingabedarstellung : Jedes Token in der Eingabesequenz wird als Vektor dargestellt, normalerweise durch Einbettungen.


  2. Abfrage-, Schlüssel-, Wertevektoren : Für jedes Token werden drei Vektoren berechnet: ein Abfragevektor ( Q_i ), ein Schlüsselvektor ( K_i ) und ein Wertevektor ( V_i ). Diese Vektoren werden mithilfe gelernter linearer Transformationen aus den Eingabedarstellungen abgeleitet.


  3. Aufmerksamkeitswerte : Die Aufmerksamkeitswerte werden berechnet, indem das Skalarprodukt des Abfragevektors des aktuellen Tokens mit den Schlüsselvektoren aller vorherigen Token in der Eingabesequenz berechnet wird. Dies führt zu einem Wert, der angibt, wie viel Aufmerksamkeit auf jedes Token gelegt werden soll.


  4. Softmax-Normalisierung : Die Aufmerksamkeitswerte werden dann mithilfe der Softmax-Funktion normalisiert, um Aufmerksamkeitsgewichte zu erhalten, die sich zu 1 summieren.


  5. Gewichtete Summe : Schließlich wird die Ausgabedarstellung für das aktuelle Token unter Verwendung der Aufmerksamkeitsgewichte als gewichtete Summe der Wertevektoren berechnet.

Mehrköpfige Aufmerksamkeit

Multi-Head Attention ist eine Erweiterung des Aufmerksamkeitsmechanismus, die es dem Modell ermöglicht, gemeinsam Informationen aus verschiedenen Darstellungsunterräumen an verschiedenen Positionen zu berücksichtigen. Anstatt einen einzigen Satz von Aufmerksamkeitsgewichten zu haben, berechnet Multi-Head Attention mehrere Sätze von Aufmerksamkeitsbewertungen parallel, jeder mit seinen eigenen gelernten linearen Transformationen.


Die Ausgaben dieser Aufmerksamkeitsköpfe werden dann verkettet und linear transformiert, um die endgültige Ausgabedarstellung zu erzeugen.


Dieser Mechanismus verbessert die Fähigkeit des Modells, verschiedene Beziehungen und Abhängigkeiten in den Eingabedaten zu erfassen, was zu einer verbesserten Leistung bei verschiedenen NLP-Aufgaben führt.

Multihead-Aufmerksamkeit

Überblick über den Inferenzberechnungsprozess

Nachdem wir uns mit LLMs und Transformer-Architektur vertraut gemacht haben, wollen wir nun den Inferenzberechnungsprozess skizzieren. Die Inferenz generiert die nächsten $n$ Token für eine gegebene Eingabesequenz und kann in zwei Phasen unterteilt werden:


  1. Vorfüllphase : In dieser Phase wird ein Vorwärtsdurchlauf durch das Modell für die Eingabesequenz durchgeführt und Schlüssel- und Wertedarstellungen werden für jedes Token berechnet. Diese Darstellungen werden zur späteren Verwendung in der Dekodierungsphase in einem KV-Cache gespeichert. Darstellungen aller Token in jeder Schicht werden parallel berechnet.

    Vorfüllphase während der LLM-Inferenz

  2. Dekodierungsphase : In dieser Phase generiert das Modell die Ausgabetokens einzeln und autoregressiv. Für jedes Token ruft das Modell die Schlüssel- und Wertdarstellungen aus dem während der Vorfüllphase gespeicherten KV-Cache ab, zusammen mit der Abfragedarstellung des aktuellen Eingabetokens, um das nächste Token in der Sequenz zu berechnen.


    Dieser Prozess wird fortgesetzt, bis ein Abbruchkriterium erfüllt ist (z. B. Erreichen einer maximalen Länge oder Generieren eines Sequenzende-Tokens). Die neuen Schlüssel- und Wertdarstellungen werden für nachfolgende Token im KV-Cache gespeichert. In dieser Phase wird auch eine Token-Sampling-Strategie angewendet, um das nächste zu generierende Token zu bestimmen (z. B. Greedy Search, Beam Search, Top-k-Sampling).

    Dekodierungsphase während der LLM-Inferenz

Komplexität der Inferenzberechnung

Für ein Präfix der Länge L , der Einbettungsgröße d und ein Modell mit h Köpfen und n Schichten kann die Komplexität der Inferenzberechnung wie folgt analysiert werden:

  • Vorfüllphase : In der Vorfüllphase berechnen wir die anfängliche Darstellung für alle Token in der Eingabe. Die Komplexität ist hier:

    Hier:

    • Erster Term O(Ln .d^2) : Stellt die Feedforward-Berechnung dar, die jedes Token unabhängig über mehrere Schichten hinweg verarbeitet. Dies skaliert linear sowohl mit der Sequenzlänge L als auch mit der Anzahl der Schichten n .


    • Zweiter Term O(L^2. nh d) : Stellt die Kosten des Aufmerksamkeitsmechanismus dar. Hier interagiert jedes Token mit jedem anderen Token, was zu einer Komplexität L^2 für die Aufmerksamkeitsberechnung pro Schicht führt. Die Komplexität wächst quadratisch mit der Sequenzlänge, was bei langen Sequenzen zu einem großen Engpass werden kann.


  • Dekodierungsphase : Die Dekodierungsphase ist der autoregressive Teil. Die Komplexität ist:

  • Hier:

    • Feedforward-Berechnung : Für jedes generierte Token führen wir in jeder Schicht Feedforward-Operationen durch. Da dies jeweils für ein Token (nicht für die gesamte Sequenz) durchgeführt wird, beträgt die Komplexität pro Token: O(nd^2) .


    • Aufmerksamkeitsberechnung mit Caching : Jedes neue Token interagiert mit der vorhandenen Sequenz durch Aufmerksamkeit und verwendet dabei die zuvor berechneten Schlüssel-Wert-Paare. Für jedes generierte Token ist diese Aufmerksamkeitsberechnung proportional zur Sequenzlänge L, was ergibt: O(Lnd .h)


Wie wir sehen können, wird die Komplexität der Inferenzberechnung von der Länge der Eingabesequenz ( L ), der Anzahl der Schichten ( n ), der Anzahl der Aufmerksamkeitsköpfe ( h ) und der Einbettungsgröße ( d ) beeinflusst. Diese Komplexität kann in Echtzeitanwendungen zu einem Engpass werden, insbesondere bei langen Eingabesequenzen und/oder großen Modellen.

Bedeutung des KV-Caching

KV-Caching ist eine entscheidende Optimierungstechnik für die LLM-Inferenz, insbesondere in der Dekodierungsphase. Durch das Speichern der während der Vorfüllphase berechneten Schlüssel- und Wertdarstellungen kann das Modell redundante Berechnungen für zuvor verarbeitete Token vermeiden.


Dadurch werden der Rechenaufwand und die Latenz während der Inferenz erheblich reduziert, da das Modell nur die Aufmerksamkeitswerte für das neu generierte Token berechnen muss, anstatt die Schlüssel- und Wertedarstellungen für alle Token in der Eingabesequenz neu zu berechnen.


Dadurch sind die Kosten linear in Bezug auf die Anzahl der generierten Token und nicht quadratisch in Bezug auf die Eingabelänge.


Allerdings erfordert das KV-Caching zusätzlichen Speicher zum Speichern der Schlüssel- und Wertedarstellungen, was in Umgebungen mit eingeschränkten Ressourcen einen Kompromiss darstellen kann.

Berechnungen für ein Beispielmodell

Berechnen wir den Speicherbedarf für das Modell LLaMA 7B.

Modellkonfiguration

  • Parameter: 7 Milliarden
  • Einbettungsgröße ( d_model ): 4096
  • Anzahl der Schichten: 32
  • Anzahl der Aufmerksamkeitsköpfe ( d_head ): 32
  • Kopfmaß ( d_head ): 128 (4096/32)
  • Maximale Sequenzlänge (L): 2048
  • Datentyp: float16 (2 Bytes pro Element)

Speicherberechnung

  1. Cachegröße pro Ebene : Für jede Ebene müssen wir sowohl Schlüssel als auch Werte speichern
    • Schlüsselgröße pro Token = d_head × num_heads = 128 × 32 = 4096 Elemente

    • Wertgröße pro Token = d_head × num_heads = 128 × 32 = 4096 Elemente

    • Gesamtzahl der Elemente pro Token pro Ebene = 4096 + 4096 = 8192 Elemente


  2. Speicher pro Schicht für vollständige Sequenz : Für die vollständige Sequenz der Länge L = 2048 Token
    • Elemente pro Schicht = L × 8192 = 2048 × 8192 = 16.777.216 Elemente

    • Speicher pro Schicht (in Bytes) = 16.777.216 × 2 = 33.554.432 Bytes = 33,55 MB


  3. Gesamter KV-Cache-Speicher für alle Ebenen : Da wir 32 Ebenen haben
    • Gesamtspeicher = 33,55 × 32 MB = 1073,6 MB

Gesamtspeicherbedarf

  • Modellgewichte: 7 Milliarden Parameter × 2 Bytes/Parameter = 14 GB


  • KV-Cache-Speicher: 1073,6 MB


  • Sonstiger Speicheraufwand (z. B. Aktivierungen, Zwischenergebnisse): ~1-2 GB


Der Gesamtspeicherbedarf beträgt also: 14 GB (Modellgewichte) + 1–2 GB (Overhead) + 1073,6 MB (KV-Cache) = 15–16 GB . Diese Berechnung liefert uns eine Schätzung des Speicherbedarfs für das LLaMA 7B-Modell während der Inferenz. LLaMA 7B ist relativ klein im Vergleich zu Modellen wie GPT-3 (175 Milliarden Parameter), die sowohl für die Modellgewichte als auch für den KV-Cache deutlich mehr Speicher benötigen würden.


Außerdem wäre der Ressourcenbedarf bei einer Skalierung auf $m$ gleichzeitige Benutzer $m$-mal höher. Daher sind Optimierungstechniken für die Bereitstellung großer Modelle in ressourcenbeschränkten Umgebungen von entscheidender Bedeutung.

Metriken zur Bewertung der Inferenzoptimierung

Bei der Bewertung der Wirksamkeit von Inferenzoptimierungstechniken können verschiedene Kennzahlen berücksichtigt werden:

  1. Vorfülllatenz : Die Zeit, die zum Ausführen der Vorfüllphase der Inferenz benötigt wird, auch Time-to-First-Token-Latenz (TTFT) genannt. Diese Metrik ist entscheidend für interaktive Anwendungen, bei denen Benutzer schnelle Antworten erwarten. Faktoren wie Modellgröße, Eingabelänge und Hardwarefunktionen können diese Metrik beeinflussen.


  2. Dekodierungslatenz : Die Zeit, die zum Generieren jedes nachfolgenden Tokens nach der Vorfüllphase benötigt wird, auch Inter-Token-Latenz (ITL) genannt. Diese Metrik ist wichtig, um die Reaktionsfähigkeit des Modells während der Textgenerierung zu messen. Für Anwendungen wie Chatbots ist eine niedrige ITL gut, aber schneller ist nicht immer besser, da 6-8 Token pro Sekunde für die menschliche Interaktion oft ausreichen. Zu den Einflussfaktoren gehören KV-Cachegröße, Sampling-Strategie und Hardware.


  3. End-to-End-Latenz : Die Gesamtzeit vom Empfang der Eingabe bis zur Generierung der endgültigen Ausgabe. Diese Metrik ist wichtig für das Verständnis der Gesamtleistung des Inferenzprozesses und wird durch Vorfüllen, Dekodierung und andere Komponentenlatenzen (z. B. JSON-Parsing) beeinflusst. Zu den Einflussfaktoren gehören Modellgröße, Eingabelänge und Hardware sowie die Effizienz der gesamten Pipeline.


  4. Maximale Anforderungsrate, auch QPS (Abfragen pro Sekunde) genannt : Die Anzahl der Inferenzanforderungen, die pro Sekunde verarbeitet werden können. Diese Metrik ist entscheidend für die Bewertung der Skalierbarkeit des Modells in Produktionsumgebungen. Faktoren wie Modellgröße, Hardware und Optimierungstechniken können QPS beeinflussen. Wenn beispielsweise 15 QPS für eine P90-Latenz über 1 GPU bereitgestellt werden, wären für die Bereitstellung von 300 QPS 20 GPUs erforderlich. Zu den Einflussfaktoren gehören Hardwareressourcen, Lastausgleich und Optimierungstechniken.


  5. FLOPS (Fließkommaoperationen pro Sekunde) : Die Anzahl der Fließkommaoperationen, die das Modell pro Sekunde ausführen kann. Diese Metrik ist nützlich, um den Rechenaufwand der Inferenz zu verstehen und kann verwendet werden, um die Effizienz verschiedener Modelle und Optimierungstechniken zu vergleichen. Zu den Einflussfaktoren zählen Modellarchitektur, Hardware und Optimierungstechniken.

Arten von Inferenzoptimierungstechniken

Wir werden alle diese Optimierungen in den nächsten Beiträgen der Serie behandeln.

  • Optimierung der Modellarchitektur : Ändern der Modellarchitektur zur Verbesserung der Inferenzeffizienz, z. B. durch Reduzieren der Anzahl von Ebenen oder Aufmerksamkeitsköpfen oder durch Verwenden effizienterer Aufmerksamkeitsmechanismen (z. B. spärliche Aufmerksamkeit).


  • Systemoptimierung : Optimierung der zugrunde liegenden Hardware- und Software-Infrastruktur, z. B. durch Verwendung spezieller Hardware (z. B. TPUs, GPUs) oder Optimierung des Software-Stacks (z. B. durch Verwendung effizienter Bibliotheken und Frameworks). Dies kann unterteilt werden in:


    • Speicherverwaltung : Effiziente Verwaltung der Speichernutzung, um den Overhead zu reduzieren und die Leistung zu verbessern.

    • Effiziente Berechnung : Nutzung von Parallelität und Optimierung der Berechnung zur Reduzierung der Latenz.

    • Batchverarbeitung : Gleichzeitige Verarbeitung mehrerer Anfragen zur Verbesserung des Durchsatzes.

    • Planung : Effiziente Planung von Aufgaben zur Maximierung der Ressourcennutzung.


  • Modellkomprimierungen : Techniken wie Quantisierung, Beschneiden und Destillation können verwendet werden, um die Größe des Modells zu reduzieren und die Inferenzgeschwindigkeit zu verbessern, ohne die Leistung erheblich zu beeinträchtigen.


  • Algorithmusoptimierung : Verbesserung der für die Inferenz verwendeten Algorithmen, z. B. durch die Verwendung effizienterer Sampling-Strategien oder die Optimierung des Aufmerksamkeitsmechanismus. Spekulative Dekodierung beispielsweise, die es dem Modell ermöglicht, mehrere Token parallel zu generieren, kann die Dekodierungslatenz erheblich reduzieren.

    Taxonomie der Optimierungstechniken


Abschluss

In diesem Beitrag haben wir einen Überblick über die LLM-Inferenz, ihre Bedeutung und die damit verbundenen Herausforderungen gegeben. Wir haben auch die wichtigsten Problemformulierungen skizziert, die unsere Untersuchung von Optimierungstechniken in nachfolgenden Beiträgen leiten werden.


Wenn wir die Feinheiten der LLM-Inferenz und die Faktoren verstehen, die ihre Leistung beeinflussen, können wir die Bedeutung von Optimierungstechniken besser einschätzen, um LLMs für reale Anwendungen praktischer zu machen. Im nächsten Beitrag werden wir uns eingehender mit spezifischen Optimierungstechniken und deren Implementierungen befassen und uns dabei auf die Reduzierung von Latenz und Ressourcenverbrauch bei gleichbleibender Modellleistung konzentrieren.

Verweise