Vernetzen Sie sich mit uns

Künstliche Intelligenz

Optimierung der LLM-Bereitstellung: vLLM PagedAttention und die Zukunft effizienter KI-Bereitstellung

mm
Stellen Sie die vLLM-Inferenz-Engine bereit, um große Sprachmodelle auszuführen

Der Einsatz von Large Language Models (LLMs) in realen Anwendungen stellt einzigartige Herausforderungen dar, insbesondere in Bezug auf Rechenressourcen, Latenz und Kosteneffizienz. In diesem umfassenden Leitfaden erkunden wir die Landschaft der LLM-Bereitstellung und konzentrieren uns dabei insbesondere auf vLLM (vector Language Model), eine Lösung, die die Art und Weise, wie wir diese leistungsstarken Modelle einsetzen und mit ihnen interagieren, neu gestaltet.

Die Herausforderungen bei der Bereitstellung großer Sprachmodelle

Bevor wir uns mit konkreten Lösungen befassen, wollen wir die wichtigsten Herausforderungen untersuchen, die die Bereitstellung von LLM zu einer komplexen Aufgabe machen:

Computerressourcen

LLMs sind bekannt für ihre enormen Parameterzahlen, die von Milliarden bis zu Hunderten von Milliarden reichen. So verfügt GPT-3 beispielsweise über 175 Milliarden Parameter, während neuere Modelle wie GPT-4 Schätzungen zufolge sind es sogar noch mehr. Allein diese schiere Größe bedeutet einen erheblichen Rechenaufwand für die Inferenz.

Ejemplo:
Betrachten Sie eine relativ bescheidene LLM mit 13 Milliarden Parametern, wie LLaMA-13B. Selbst dieses Modell erfordert:

– Ungefähr 26 GB Speicher nur zum Speichern der Modellparameter (bei angenommener 16-Bit-Präzision)
– Zusätzlicher Speicher für Aktivierungen, Aufmerksamkeitsmechanismen und Zwischenberechnungen
– Hohe GPU-Rechenleistung für Echtzeit-Inferenz

Latency

Bei vielen Anwendungen, wie etwa Chatbots oder der Echtzeit-Inhaltsgenerierung, ist eine geringe Latenz für ein gutes Benutzererlebnis entscheidend. Die Komplexität von LLMs kann jedoch zu erheblichen Verarbeitungszeiten führen, insbesondere bei längeren Sequenzen.

Ejemplo:
Stellen Sie sich einen Kundenservice-Chatbot vor, der von einem LLM betrieben wird. Wenn die Generierung jeder Antwort mehrere Sekunden dauert, wirkt die Konversation für die Benutzer unnatürlich und frustrierend.

Kosten

Die Hardware, die zum Ausführen von LLMs in großem Maßstab erforderlich ist, kann extrem teuer sein. Oft sind High-End-GPUs oder TPUs erforderlich, und der Energieverbrauch dieser Systeme ist beträchtlich.

Ejemplo:
Der Betrieb eines Clusters aus NVIDIA A100 GPUs (häufig für LLM-Inferenz verwendet) kann Tausende von Dollar pro Tag an Cloud-Computing-Gebühren kosten.

Traditionelle Ansätze für LLM-Dienste

Bevor wir uns mit fortgeschritteneren Lösungen befassen, wollen wir kurz einige traditionelle Ansätze zur Bereitstellung von LLMs betrachten:

Einfache Bereitstellung mit Hugging Face Transformers

Die Bibliothek „Hugging Face Transformers“ bietet eine unkomplizierte Möglichkeit zum Bereitstellen von LLMs, ist jedoch nicht für die Bereitstellung mit hohem Durchsatz optimiert.

Beispielcode:

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

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

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)

print(generate_text("The future of AI is"))

Dieser Ansatz funktioniert zwar, ist jedoch aufgrund der ineffizienten Nutzung von Ressourcen und fehlender Optimierungen für die Bereitstellung nicht für Anwendungen mit hohem Datenverkehr geeignet.

Verwenden von TorchServe oder ähnlichen Frameworks

Frameworks wie TorchServe bieten robustere Serving-Funktionen, darunter Lastausgleich und Modellversionierung. Sie berücksichtigen jedoch immer noch nicht die spezifischen Herausforderungen des LLM-Servings, wie etwa eine effiziente Speicherverwaltung für große Modelle.

Grundlegendes zur Speicherverwaltung beim LLM-Serving

Aufgrund der umfangreichen erforderlichen Rechenressourcen ist eine effiziente Speicherverwaltung für die Bereitstellung großer Sprachmodelle (LLMs) von entscheidender Bedeutung. Die folgenden Abbildungen veranschaulichen verschiedene Aspekte der Speicherverwaltung, die für die Optimierung der LLM-Leistung von entscheidender Bedeutung sind.

Segmentierter vs. seitenbasierter Speicher

Diese beiden Diagramme vergleichen die in Betriebssystemen (OS) häufig verwendeten Techniken zur Verwaltung segmentierter und ausgelagerter Speicher.

  • Segmentierter Speicher: Diese Technik unterteilt den Speicher in verschiedene Segmente, die jeweils einem anderen Programm oder Prozess entsprechen. Beispielsweise können in einem LLM-Serving-Kontext verschiedene Segmente verschiedenen Komponenten des Modells zugewiesen werden, wie etwa Tokenisierung, Einbettung und Aufmerksamkeitsmechanismen. Jedes Segment kann unabhängig wachsen oder schrumpfen, was Flexibilität bietet, aber möglicherweise zu Fragmentierung führt, wenn die Segmente nicht richtig verwaltet werden.
  • Ausgelagerter Speicher: Hier wird der Speicher in Seiten fester Größe aufgeteilt, die dem physischen Speicher zugeordnet werden. Seiten können nach Bedarf ein- und ausgelagert werden, was eine effiziente Nutzung der Speicherressourcen ermöglicht. Beim LLM-Serving kann dies für die Verwaltung der großen Speichermengen, die zum Speichern von Modellgewichten und Zwischenberechnungen erforderlich sind, von entscheidender Bedeutung sein.

Speicherverwaltung im Betriebssystem vs. vLLM

Dieses Bild stellt die traditionelle Speicherverwaltung des Betriebssystems dem in vLLM verwendeten Speicherverwaltungsansatz gegenüber.

  • Betriebssystem-Speicherverwaltung: In herkömmlichen Betriebssystemen werden Prozessen (z. B. Prozess A und Prozess B) Speicherseiten (Seite 0, Seite 1 usw.) im physischen Speicher zugewiesen. Diese Zuweisung kann im Laufe der Zeit zu einer Fragmentierung führen, da Prozesse Speicher anfordern und freigeben.
  • vLLM-Speicherverwaltung: Das vLLM-Framework verwendet einen Key-Value-Cache (KV), um den Speicher effizienter zu verwalten. Anfragen (z. B. Anfrage A und Anfrage B) werden Blöcke des KV-Cache zugewiesen (KV-Block 0, KV-Block 1 usw.). Dieser Ansatz trägt dazu bei, die Fragmentierung zu minimieren und die Speichernutzung zu optimieren, was eine schnellere und effizientere Modellbereitstellung ermöglicht.

Aufmerksamkeitsmechanismus in LLMs

Aufmerksamkeitsmechanismus im LLM

Aufmerksamkeitsmechanismus in LLMs

Der Aufmerksamkeitsmechanismus ist eine grundlegende Komponente 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 Aufmerksamkeitswerte, indem sie das Skalarprodukt der Abfrage mit den Schlüsseln nimmt, mit der 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, sich beim Generieren jedes Tokens auf relevante Teile der Eingabesequenz zu konzentrieren.

Vergleich des Serving-Durchsatzes

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

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

Dieses Bild zeigt einen Vergleich des Durchsatzes zwischen verschiedenen Frameworks (HF, TGI und vLLM) unter Verwendung von LLaMA-Modelle auf verschiedenen Hardware-Setups.

  • LLaMA-13B, A100-40GB: vLLM erreicht einen 14- bis 24-mal höheren Durchsatz als HuggingFace Transformers (HF) und einen 2.2- bis 2.5-mal höheren Durchsatz als HuggingFace Text Generation Inference (TGI).
  • LLaMA-7B, A10G: Es sind ähnliche Trends zu beobachten, wobei vLLM sowohl HF als auch TGI deutlich übertrifft.

vLLM: Eine neue LLM-Serving-Architektur

vLLM, entwickelt von Forscher an der UC Berkeleystellt einen bedeutenden Fortschritt in der LLM-Serving-Technologie dar. Lassen Sie uns die wichtigsten Funktionen und Innovationen erkunden:

Seitenaufmerksamkeit

Das Herzstück von vLLM ist PagedAttention, ein neuartiger Aufmerksamkeitsalgorithmus, der von der virtuellen Speicherverwaltung in Betriebssystemen inspiriert ist. So funktioniert er:

- Schlüssel-Wert-Cache-Partitionierung (KV): Anstatt den gesamten KV-Cache zusammenhängend im Speicher zu speichern, unterteilt PagedAttention ihn in Blöcke fester Größe.
- Nicht zusammenhängender Speicher: Diese Blöcke können nicht zusammenhängend im Speicher gespeichert werden, was eine flexiblere Speicherverwaltung ermöglicht.
- On-Demand-Zuweisung: Blöcke werden nur bei Bedarf zugewiesen, wodurch die Speicherverschwendung reduziert wird.
- Effizientes Teilen: Mehrere Sequenzen können Blöcke gemeinsam nutzen, was Optimierungen für Techniken wie paralleles Sampling und Strahlensuche ermöglicht.

Illustration:

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

PagedAttention KV-Cache:
[Block 1] -> Physikalische Adresse A
[Block 2] -> Physikalische Adresse C
[Block 3] -> Physikalische Adresse B
...
(Nicht zusammenhängende Speicherzuweisung)
“`

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

Kontinuierliche Dosierung

vLLM implementiert kontinuierliches Batching, das Anfragen dynamisch verarbeitet, sobald sie eintreffen, anstatt darauf zu warten, Batches mit fester Größe zu bilden. Dies führt zu geringerer Latenz und höherem Durchsatz.

Ejemplo:
Stellen Sie sich einen Strom eingehender Anfragen vor:

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

Durch kontinuierliches Batching kann vLLM sofort mit der Verarbeitung aller Anfragen beginnen, anstatt darauf zu warten, sie in vordefinierte Batches zu gruppieren.

Effizientes paralleles Sampling

Bei Anwendungen, die mehrere Ausgabebeispiele pro Eingabeaufforderung erfordern (z. B. kreative Schreibassistenten), sind die Speicherfreigabefunktionen von vLLM von Vorteil. Es kann mehrere Ausgaben generieren und gleichzeitig den KV-Cache für gemeinsam genutzte Präfixe wiederverwenden.

Beispielcode mit vLLM:

from vllm import LLM, SamplingParams

llm = LLM(model="meta-llama/Llama-2-13b-hf")
prompts = ["The future of AI is"]

# Generate 3 samples per prompt
sampling_params = SamplingParams(n=3, temperature=0.8, max_tokens=100)
outputs = llm.generate(prompts, sampling_params)

for output in outputs:
print(f"Prompt: {output.prompt}")
for i, out in enumerate(output.outputs):
print(f"Sample {i + 1}: {out.text}")

Dieser Code generiert effizient mehrere Beispiele für die angegebene Eingabeaufforderung und nutzt dabei die Optimierungen von vLLM.

Benchmarking der vLLM-Leistung

Um die Auswirkungen von vLLM wirklich einzuschätzen, sehen wir uns einige Leistungsvergleiche an:

Durchsatzvergleich

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

– Bis zu 24x höherer Durchsatz im Vergleich zu Hugging Face Transformers
– 2.2- bis 3.5-mal höherer Durchsatz als Hugging Face Text Generation Inference (TGI)

Illustration:

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

Speichereffizienz

PagedAttention von vLLM führt zu einer nahezu optimalen Speichernutzung:

– Nur etwa 4 % Speicherverschwendung, im Vergleich zu 60–80 % bei herkömmlichen Systemen
– Diese Effizienz ermöglicht die Bereitstellung größerer Modelle oder die Bearbeitung mehrerer gleichzeitiger Anfragen mit derselben Hardware

Erste Schritte mit vLLM

Nachdem wir nun die Vorteile von vLLM erkundet haben, gehen wir nun den Prozess der Einrichtung und Verwendung in Ihren Projekten durch.

6.1-Installation

Die Installation von vLLM ist mit pip unkompliziert:

!pip install vllm

6.2 Grundlegende Verwendung für Offline-Inferenz

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

from vllm import LLM, SamplingParams

# Initialize the model
llm = LLM(model="meta-llama/Llama-2-13b-hf")

# Prepare prompts
prompts = [
"Write a short poem about artificial intelligence:",
"Explain quantum computing in simple terms:"
]

# Set sampling parameters
sampling_params = SamplingParams(temperature=0.8, max_tokens=100)

# Generate responses
outputs = llm.generate(prompts, sampling_params)

# Print the results
for output in outputs:
print(f"Prompt: {output.prompt}")
print(f"Generated text: {output.outputs[0].text}\n")

Dieses Skript zeigt, wie ein Modell geladen, Sampling-Parameter festgelegt und Text für mehrere Eingabeaufforderungen generiert wird.

6.3 Einrichten eines vLLM-Servers

Für die Online-Bereitstellung stellt vLLM einen OpenAI-kompatiblen API-Server bereit. So richten Sie ihn ein:

1. Starten Sie den Server:

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

2. Fragen Sie den Server mit curl ab:

curl http://localhost:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "meta-llama/Llama-2-13b-hf",
"prompt": "The benefits of artificial intelligence include:",
"max_tokens": 100,
"temperature": 0.7
}'

Mit diesem Setup können Sie Ihr LLM mit einer Schnittstelle bereitstellen, die mit der API von OpenAI kompatibel ist, sodass die Integration in vorhandene Anwendungen problemlos möglich ist.

Weiterführende Themen zu vLLM

Obwohl vLLM erhebliche Verbesserungen bei der LLM-Bereitstellung bietet, müssen weitere Überlegungen und fortgeschrittene Themen berücksichtigt werden:

7.1 Modellquantisierung

Für eine 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

# Load a quantized model
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)

# Use the quantized model with vLLM
from vllm import LLM

llm = LLM(model=model, tokenizer=tokenizer)

7.2 Verteilte Inferenz

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

import ray
from vllm import LLM

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

  def generate(self, prompt, params):
    return self.llm.generate(prompt, params)

# Initialize distributed LLMs
llm1 = DistributedLLM.remote("meta-llama/Llama-2-13b-hf")
llm2 = DistributedLLM.remote("meta-llama/Llama-2-13b-hf")

# Use them in parallel
result1 = llm1.generate.remote("Prompt 1", sampling_params)
result2 = llm2.generate.remote("Prompt 2", sampling_params)

# Retrieve results
print(ray.get([result1, result2]))

7.3 Überwachung und Beobachtbarkeit

Beim Einsatz von LLMs in der Produktion ist die Überwachung von entscheidender Bedeutung. vLLM bietet zwar keine integrierte Überwachung, Sie können sie jedoch in Tools wie Prometheus und Grafana integrieren:

from prometheus_client import start_http_server, Summary
from vllm import LLM

# Define metrics
REQUEST_TIME = Summary('request_processing_seconds', 'Time spent processing request')

# Initialize vLLM
llm = LLM(model="meta-llama/Llama-2-13b-hf")

# Expose metrics
start_http_server(8000)

# Use the model with monitoring
@REQUEST_TIME.time()
  def process_request(prompt):
      return llm.generate(prompt)

# Your serving loop here

Mit diesem Setup können Sie Kennzahlen wie die Anforderungsverarbeitungszeit verfolgen, die in Grafana-Dashboards visualisiert werden können.

Fazit

Die effiziente Bereitstellung großer Sprachmodelle ist im Zeitalter der künstlichen Intelligenz eine komplexe, aber entscheidende Aufgabe. vLLM stellt mit seinem innovativen PagedAttention-Algorithmus und der optimierten Implementierung einen bedeutenden Fortschritt dar, der die Bereitstellung von LLM zugänglicher und kostengünstiger macht.

Durch die drastische Verbesserung des Durchsatzes, die Reduzierung der Speicherverschwendung und die Ermöglichung flexiblerer Bereitstellungsoptionen eröffnet vLLM neue Möglichkeiten für die Integration leistungsstarker Sprachmodelle in eine breite Palette von Anwendungen. Egal, ob Sie einen Chatbot, ein System zur Inhaltsgenerierung oder eine andere NLP-gestützte Anwendung erstellen, das Verständnis und die Nutzung von Tools wie vLLM sind der Schlüssel zum Erfolg.

Ich habe die letzten fünf Jahre damit verbracht, in die faszinierende Welt des maschinellen Lernens und des Deep Learning einzutauchen. Meine Leidenschaft und mein Fachwissen haben dazu geführt, dass ich an über 50 verschiedenen Software-Engineering-Projekten mitgewirkt habe, mit besonderem Schwerpunkt auf KI/ML. Meine anhaltende Neugier hat mich auch zur Verarbeitung natürlicher Sprache geführt, einem Bereich, den ich gerne weiter erforschen möchte.