KI-Modelle und Plattformen

Optimierung der LLM-Bereitstellung: vLLM PagedAttention und die Zukunft des effizienten AI-Servings

mm
Unite.AI zu deinen bevorzugten Quellen auf Google hinzufügen

Die Bereitstellung von Large Language Models (LLMs) in realen Anwendungen stellt einzigartige Herausforderungen dar, insbesondere in Bezug auf Rechenressourcen, Latenz und Kosteneffizienz. In diesem umfassenden Leitfaden werden wir die Landschaft der LLM-Bereitstellung erkunden, mit besonderem Fokus auf vLLM (Vektor-Language-Modell), eine Lösung, die die Art und Weise, wie wir diese leistungsstarken Modelle bereitstellen und nutzen, neu definiert.

Die Herausforderungen der LLM-Bereitstellung

Bevor wir uns spezifischen Lösungen zuwenden, sollten wir die wichtigsten Herausforderungen betrachten, die die LLM-Bereitstellung zu einer komplexen Aufgabe machen:

Rechenressourcen

LLMs sind bekannt für ihre enormen Parameterzahlen, die von Milliarden bis hin zu Hunderten von Milliarden reichen. Zum Beispiel verfügt GPT-3 über 175 Milliarden Parameter, während neuere Modelle wie GPT-4 noch mehr Parameter haben. Diese enorme Größe übersetzt sich in signifikante Rechenanforderungen für die Inferenz.

Beispiel:
Betrachten wir ein relativ bescheidenes LLM mit 13 Milliarden Parametern, wie LLaMA-13B. Auch dieses Modell erfordert:

– Ungefähr 26 GB Speicher, um nur die Modellparameter zu speichern (bei 16-Bit-Genauigkeit)
– Zusätzlichen Speicher für Aktivierungen, Aufmerksamkeitsmechanismen und Zwischenberechnungen
– Erhebliche GPU-Rechenleistung für Echtzeit-Inferenz

Latenz

In vielen Anwendungen, wie z.B. Chatbots oder Echtzeit-Inhaltsgenerierung, ist eine geringe Latenz für eine gute Benutzererfahrung entscheidend. Die Komplexität von LLMs kann jedoch zu erheblichen Verarbeitungszeiten führen, insbesondere für längere Sequenzen.

Beispiel:
Stellen Sie sich einen Kunden-Service-Chatbot vor, der von einem LLM angetrieben wird. Wenn jede Antwort mehrere Sekunden dauert, um generiert zu werden, fühlt sich die Konversation für den Benutzer unnatürlich und frustrierend an.

Kosten

Die Hardware, die erforderlich ist, um LLMs im großen Maßstab auszuführen, kann extrem teuer sein. Hochleistungs-GPUs oder TPUs sind oft notwendig, und der Energieverbrauch dieser Systeme ist erheblich.

Beispiel:
Das Betreiben eines Clusters von NVIDIA-A100-GPUs (oft für LLM-Inferenz verwendet) kann Tausende von Dollar pro Tag an Cloud-Computing-Gebühren kosten.

Traditionelle Ansätze für die LLM-Bereitstellung

Bevor wir fortschrittlichere Lösungen erkunden, sollten wir einige traditionelle Ansätze für die LLM-Bereitstellung kurz betrachten:

Einfache Bereitstellung mit Hugging Transformers

Die Hugging Face Transformers-Bibliothek bietet eine einfache Möglichkeit, LLMs bereitzustellen, ist jedoch nicht für die hohe Durchsatzrate optimiert.

Beispielcode:

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

<p>model_name = "meta-llama/Llama-2-13b-hf"
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto")
tokenizer = AutoTokenizer.from_pretrained(model_name)</p>

<p>def generate_text(prompt, max_length=100):
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_length=max_length)
return tokenizer.decode(outputs[0], skip_special_tokens=True)</p>

<p>print(generate_text("Die Zukunft der KI ist"))</p>

Obwohl dieser Ansatz funktioniert, ist er für hoch frequentierte Anwendungen aufgrund seiner ineffizienten Ressourcennutzung und mangelnder Optimierungen für die Bereitstellung nicht geeignet.

Verwendung von TorchServe oder ähnlichen Frameworks

Frameworks wie TorchServe bieten robustere Bereitstellungsfunktionen, einschließlich Lastenausgleich und Modellversionierung. Sie gehen jedoch nicht auf die spezifischen Herausforderungen der LLM-Bereitstellung ein, wie z.B. effizientes Speichermanagement für große Modelle.

Verständnis des Speichermanagements bei der LLM-Bereitstellung

Effizientes Speichermanagement ist für die Bereitstellung von Large Language Models (LLMs) aufgrund der umfangreichen Rechenressourcen, die erforderlich sind, entscheidend. Die folgenden Bilder veranschaulichen verschiedene Aspekte des Speichermanagements, die für die Optimierung der LLM-Leistung von wesentlicher Bedeutung sind.

Segmentiertes vs. gepagtes Speicher

Diese beiden Diagramme vergleichen segmentiertes Speicher- und gepagtes Speicher-Management-Techniken, die häufig in Betriebssystemen (OS) verwendet werden.

  • Segmentiertes Speicher: Diese Technik teilt den Speicher in verschiedene Segmente auf, von denen jedes einem anderen Programm oder Prozess entspricht. In einem LLM-Bereitstellungskontext können beispielsweise verschiedene Segmente für verschiedene Komponenten des Modells wie Tokenisierung, Einbettung und Aufmerksamkeitsmechanismen zugewiesen werden. Jedes Segment kann unabhängig wachsen oder schrumpfen, was Flexibilität bietet, aber möglicherweise zu Fragmentierung führt, wenn die Segmente nicht ordnungsgemäß verwaltet werden.
  • Gepagtes Speicher: Hier wird der Speicher in feste Seiten aufgeteilt, die auf physischen Speicher kartiert werden. Seiten können wie erforderlich ausgetauscht werden, was eine effiziente Nutzung der Speicherressourcen ermöglicht. Bei der LLM-Bereitstellung kann dies für die Verwaltung der großen Speichermengen, die für die Speicherung von Modellgewichten und Zwischenberechnungen erforderlich sind, entscheidend sein.

Speichermanagement in OS vs. vLLM

Dieses Bild kontrastiert traditionelles OS-Speichermanagement mit dem Speichermanagement-Ansatz, der in vLLM verwendet wird.

  • OS-Speichermanagement: In traditionellen Betriebssystemen werden Prozessen (z.B. Prozess A und Prozess B) Seiten des Speichers (Seite 0, Seite 1 usw.) im physischen Speicher zugewiesen. Diese Zuweisung kann zu Fragmentierung über die Zeit führen, da Prozesse Speicher anfordern und freigeben.
  • vLLM-Speichermanagement: Das vLLM-Framework verwendet einen Key-Value-(KV)-Cache, um den Speicher effizienter zu verwalten. Anfragen (z.B. Anfrage A und Anfrage B) werden Blöcke des KV-Caches (KV-Block 0, KV-Block 1 usw.) zugewiesen. Dieser Ansatz hilft, Fragmentierung zu minimieren und die Speicherressourcen zu optimieren, was eine schnellere und effizientere Modellbereitstellung ermöglicht.

Aufmerksamkeitsmechanismus in LLMs

Aufmerksamkeitsmechanismus in LLM

Aufmerksamkeitsmechanismus in LLMs

Der Aufmerksamkeitsmechanismus ist ein grundlegender Bestandteil von Transformer-Modellen, die häufig für LLMs verwendet werden. Dieses Diagramm veranschaulicht die Aufmerksamkeitsformel und ihre Komponenten:

  • Abfrage (Q): Ein neues Token im Decoder-Schritt oder das letzte Token, das das Modell gesehen hat.
  • Schlüssel (K): Vorheriger Kontext, auf den das Modell achten sollte.
  • Wert (V): Gewichtete Summe über den vorherigen Kontext.

Die Formel berechnet die Aufmerksamkeitsscores, indem sie das Skalarprodukt der Abfrage mit den Schlüsseln nimmt, durch die Quadratwurzel der Schlüsseldimension skaliert, eine Softmax-Funktion anwendet und schließlich das Skalarprodukt mit den Werten nimmt. Dieser Prozess ermöglicht es dem Modell, bei der Generierung jedes Tokens auf relevante Teile der Eingabesequenz zu achten.

Bereitstellungs-Durchsatz-Vergleich

vLLM: Einfache, schnelle und kostengünstige LLM-Bereitstellung mit PagedAttention

vLLM: Einfache, schnelle und kostengünstige LLM-Bereitstellung mit PagedAttention

Dieses Bild präsentiert einen Vergleich des Bereitstellungs-Durchsatzes zwischen verschiedenen Frameworks (HF, TGI und vLLM) unter Verwendung von LLaMA-Modellen auf verschiedenen Hardware-Konfigurationen.

  • LLaMA-13B, A100-40GB: vLLM erreicht 14-mal bis 24-mal höheren Durchsatz als Hugging Face Transformers (HF) und 2,2-mal bis 2,5-mal höheren Durchsatz als Hugging Face Text Generation Inference (TGI).
  • LLaMA-7B, A10G: Ähnliche Trends werden beobachtet, wobei vLLM sowohl HF als auch TGI deutlich übertrifft.

vLLM: Eine neue LLM-Bereitstellungsarchitektur

vLLM, entwickelt von Forschern an der UC Berkeley, stellt einen bedeutenden Fortschritt in der LLM-Bereitstellungstechnologie dar. Lassen Sie uns seine wichtigsten Funktionen und Innovationen erkunden:

PagedAttention

Im Herzen von vLLM liegt PagedAttention, ein neuartiger Aufmerksamkeitsalgorithmus, der von der virtuellen Speicherverwaltung in Betriebssystemen inspiriert ist. Hier ist, wie es funktioniert:

Key-Value-(KV)-Cache-Partitionierung: Anstatt den gesamten KV-Cache kontinuierlich im Speicher zu speichern, teilt PagedAttention ihn in feste Blöcke auf.
Nicht-kontinuierlicher Speicher: Diese Blöcke können nicht-kontinuierlich im Speicher gespeichert werden, was ein flexibleres Speichermanagement ermöglicht.
On-Demand-Allokation: Blöcke werden nur dann zugewiesen, wenn sie benötigt werden, was den Speicherverschwendung reduziert.
Effiziente Freigabe: Mehrere Sequenzen können Blöcke teilen, was Optimierungen für Techniken wie paralleles Sampling und Strahlensuche ermöglicht.

Veranschaulichung:

“`
Traditioneller KV-Cache:
[Token 1 KV][Token 2 KV][Token 3 KV]…[Token N KV]
(Kontinuierliche Speicherzuweisung)
“`

PagedAttention-KV-Cache:
[Block 1] -> Physische Adresse A
[Block 2] -> Physische Adresse C
[Block 3] -> Physische Adresse B

(Nicht-kontinuierliche Speicherzuweisung)
“`

Dieser Ansatz reduziert die Speicherfragmentierung erheblich und ermöglicht eine viel effizientere Nutzung des GPU-Speichers.

kontinuierliches Batchen

vLLM implementiert kontinuierliches Batchen, das Anfragen dynamisch verarbeitet, sobald sie eintreffen, anstatt darauf zu warten, feste Batch-Größen zu bilden. Dies führt zu geringerer Latenz und höherem Durchsatz.

Beispiel:

“`
Zeit 0ms: Anfrage A trifft ein
Zeit 10ms: Beginn der Verarbeitung von Anfrage A
Zeit 15ms: Anfrage B trifft ein
Zeit 20ms: Beginn der Verarbeitung von Anfrage B (parallel zu A)
Zeit 25ms: Anfrage C trifft ein

“`

Mit kontinuierlichem Batchen kann vLLM jede Anfrage sofort verarbeiten, anstatt zu warten, bis sie in vordefinierte Batches gruppiert sind.

Effizientes paralleles Sampling

Für Anwendungen, die mehrere Ausgabemuster pro Prompt erfordern (z.B. kreative Schreibassistenten), zeichnet sich vLLM durch seine Fähigkeit aus, den KV-Cache für gemeinsame Präfixe zu teilen.

Beispielcode mit vLLM:


from vllm import LLM, SamplingParams

<p>llm = LLM(model="meta-llama/Llama-2-13b-hf")
prompts = ["Die Zukunft der KI ist"]</p>

<p># Erzeuge 3 Muster pro Prompt
sampling_params = SamplingParams(n=3, temperature=0.8, max_tokens=100)
outputs = llm.generate(prompts, sampling_params)</p>

<p>for output in outputs:
print(f"Prompt: {output.prompt}")
for i, out in enumerate(output.outputs):
print(f"Muster {i + 1}: {out.text}")</p>

Dieser Code generiert effizient mehrere Muster für den angegebenen Prompt, indem er vLLMs Optimierungen nutzt.

Leistungsbewertung von vLLM

Um die Auswirkungen von vLLM wirklich zu würdigen, sollten wir uns einige Leistungsvergleiche ansehen:

Durchsatzvergleich

Basierend auf den bereitgestellten Informationen übertrifft vLLM andere Bereitstellungs-Lösungen deutlich:

– Bis zu 24-mal höherer Durchsatz im Vergleich zu Hugging Face Transformers
– 2,2-mal bis 3,5-mal höherer Durchsatz als Hugging Face Text Generation Inference (TGI)

Veranschaulichung:

“`
Durchsatz (Tokens pro Sekunde)
|
| ****
| ****
| ****
| **** ****
| **** **** ****
| **** **** ****
|————————
HF TGI vLLM
“`

Speicher-Effizienz

Die PagedAttention von vLLM führt zu nahezu optimaler Speicherausnutzung:

– Nur etwa 4 % Speicherverschwendung, im Vergleich zu 60-80 % in herkömmlichen Systemen
– Diese Effizienz ermöglicht die Bereitstellung größerer Modelle oder die Verarbeitung mehrerer Anfragen gleichzeitig mit der gleichen Hardware

Erste Schritte mit vLLM

Nachdem wir die Vorteile von vLLM erkundet haben, sollten wir den Prozess der Einrichtung und Verwendung in Ihren Projekten durchlaufen.

6.1 Installation

Die Installation von vLLM ist mithilfe von pip einfach:


!pip install vllm

6.2 Grundlegende Verwendung für Offline-Inferenz

Hier ist ein einfaches Beispiel für die Verwendung von vLLM für die Offline-Textgenerierung:

from vllm import LLM, SamplingParams

<p># Initialisieren des Modells
llm = LLM(model="meta-llama/Llama-2-13b-hf")</p>

<p># Vorbereiten der Prompts
prompts = [
"Schreiben Sie ein kurzes Gedicht über künstliche Intelligenz:",
"Erklären Sie Quantencomputing in einfachen Worten:"
]</p>

<p># Festlegen der Sampling-Parameter
sampling_params = SamplingParams(temperature=0.8, max_tokens=100)</p>

<p># Generieren von Antworten
outputs = llm.generate(prompts, sampling_params)</p>

<p># Ausgeben der Ergebnisse
for output in outputs:
print(f"Prompt: {output.prompt}")
print(f"Generierter Text: {output.outputs[0].text}\n")</p>

Dieses Skript zeigt, wie man ein Modell lädt, Sampling-Parameter festlegt und Text für mehrere Prompts generiert.

6.3 Einrichten eines vLLM-Servers

Für die Online-Bereitstellung bietet vLLM einen OpenAI-kompatiblen API-Server. Hier ist, wie man ihn einrichtet:

1. Starten des Servers:

python -m vllm.entrypoints.openai.api_server --model meta-llama/Llama-2-13b-hf

2. Abfragen des Servers mit curl:

curl http://localhost:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{"model": "meta-llama/Llama-2-13b-hf", "prompt": "Die Vorteile der künstlichen Intelligenz umfassen:", "max_tokens": 100, "temperature": 0.7}'

Diese Einrichtung ermöglicht es Ihnen, Ihr LLM mit einer Schnittstelle bereitzustellen, die mit der OpenAI-API kompatibel ist, was die Integration in bestehende Anwendungen erleichtert.

Erweiterte Themen zu vLLM

Obwohl vLLM bedeutende Verbesserungen bei der LLM-Bereitstellung bietet, gibt es weitere Überlegungen und erweiterte Themen, die zu erkunden sind:

7.1 Modell-Quantisierung

Für noch effizientere Bereitstellung, insbesondere auf Hardware mit begrenztem Speicher, können Quantisierungstechniken eingesetzt werden. Obwohl vLLM selbst derzeit keine Quantisierung unterstützt, kann es in Verbindung mit quantisierten Modellen verwendet werden:

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

<p># Laden eines quantisierten Modells
model_name = "meta-llama/Llama-2-13b-hf"
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", load_in_8bit=True)
tokenizer = AutoTokenizer.from_pretrained(model_name)</p>

<p># Verwenden des quantisierten Modells mit vLLM
from vllm import LLM</p>

<p>llm = LLM(model=model, tokenizer=tokenizer)

7.2 Verteilte Inferenz

Für extrem große Modelle oder hoch frequentierte Anwendungen kann eine verteilte Inferenz über mehrere GPUs oder Maschinen erforderlich sein. Obwohl vLLM dies nicht nativ unterstützt, kann es in verteilte Systeme mithilfe von Frameworks wie Ray integriert werden:

import ray
from vllm import LLM

<p>@ray.remote(num_gpus=1)
class DistributedLLM:
def __init__(self, model_name):
self.llm = LLM(model=model_name)</p>

<p>def generate(self, prompt, params):
return self.llm.generate(prompt, params)</p>

<p># Initialisieren verteilter LLMs
llm1 = DistributedLLM.remote("meta-llama/Llama-2-13b-hf")
llm2 = DistributedLLM.remote("meta-llama/Llama-2-13b-hf")</p>

<p># Verwenden sie parallel
result1 = llm1.generate.remote("Prompt 1", sampling_params)
result2 = llm2.generate.remote("Prompt 2", sampling_params)</p>

<p># Abrufen der Ergebnisse
print(ray.get([result1, result2]))

7.3 Überwachung und Beobachtbarkeit

Bei der Bereitstellung von LLMs in der Produktion ist die Überwachung von entscheidender Bedeutung. Obwohl vLLM keine integrierte Überwachung bietet, kann es mit Tools wie Prometheus und Grafana integriert werden:

from prometheus_client import start_http_server, Summary
from vllm import LLM

<p># Definieren von Metriken
REQUEST_TIME = Summary('request_processing_seconds', 'Zeit, die für die Anfrageverarbeitung aufgewendet wird')</p>

<p># Initialisieren von vLLM
llm = LLM(model="meta-llama/Llama-2-13b-hf")</p>

<p># Exponieren von Metriken
start_http_server(8000)</p>

<p># Verwenden des Modells mit Überwachung
@REQUEST_TIME.time()
def process_request(prompt):
return llm.generate(prompt)</p>

# Ihre Servingleiste hier

Diese Einrichtung ermöglicht es Ihnen, Metriken wie die Anfrageverarbeitungszeit zu verfolgen, die in Grafana-Dashboards visualisiert werden können.

Schlussfolgerung

Die effiziente Bereitstellung von Large Language Models ist eine komplexe, aber entscheidende Aufgabe im Zeitalter der KI. vLLM mit seinem innovativen PagedAttention-Algorithmus und seiner optimierten Implementierung stellt einen bedeutenden Schritt nach vorne bei der Bereitstellung von LLMs dar.

Durch die deutliche Verbesserung des Durchsatzes, die Reduzierung von Speicherverschwendung und die Ermöglichung flexiblerer Bereitstellungsoptionen öffnet vLLM neue Möglichkeiten für die Integration leistungsstarker Sprachmodelle in eine Vielzahl von Anwendungen. Ob Sie einen Chatbot, ein Content-Generierungssystem oder eine andere NLP-Anwendung entwickeln, das Verständnis und die Nutzung von Tools wie vLLM werden der Schlüssel zum Erfolg sein.

Ich habe die letzten fünf Jahre damit verbracht, mich in die faszinierende Welt des Machine Learning und Deep Learning zu vertiefen. Mein Engagement und meine Expertise haben mich dazu geführt, an über 50 verschiedenen Software-Entwicklungsprojekten mit einem besonderen Fokus auf AI/ML beizutragen. Meine anhaltende Neugier hat mich auch zum Bereich der Natural Language Processing hingezogen, einem Feld, das ich weiter erforschen möchte.