Google Kubernetes Engine (GKE) bietet eine detaillierte Kontrolle für die Inferenz von Large Language Models (LLM) bei optimaler Leistung und Kosten. In diesem Leitfaden werden Best Practices für die Optimierung der Inferenz und Bereitstellung von offenen LLMs mit GPUs in GKE mithilfe der vLLM und Text Generation Inference (TGI) Bereitstellungs-Frameworks beschrieben.
Eine zusammenfassende Checkliste mit den Best Practices finden Sie in der Zusammenfassung der Checkliste.
Eine konsolidierte Übersicht über alle GKE-Best Practices finden Sie unter Best Practices für GKE.Ziele
Dieser Leitfaden richtet sich an Kunden von generativer KI, neue oder bestehende GKE-Nutzer, ML-Entwickler und LLMOps-Entwickler (DevOps), die ihre LLM-Arbeitslasten mit GPUs und Kubernetes optimieren möchten.
Nach Abschluss dieses Leitfadens können Sie:
- Techniken zur LLM-Optimierung nach dem Training auswählen, einschließlich Quantisierung, Tensor-Parallelität und Arbeitsspeicheroptimierung.
- Die allgemeinen Vor- und Nachteile bei der Auswahl dieser Optimierungstechniken abwägen.
- Offene LLM-Modelle in GKE mit Bereitstellungs-Frameworks wie vLLM oder TGI mit aktivierten Optimierungseinstellungen bereitstellen.
Übersicht über Techniken zur Optimierung der LLM-Bereitstellung
Im Gegensatz zu Nicht-KI-Arbeitslasten weisen LLM-Arbeitslasten aufgrund ihrer Abhängigkeit von Matrixmultiplikationsvorgängen in der Regel eine höhere Latenz und einen geringeren Durchsatz auf. Um die LLM-Inferenzleistung zu verbessern, können Sie spezielle Hardwarebeschleuniger (z. B. GPUs und TPUs) und optimierte Bereitstellungs-Frameworks verwenden.
Sie können eine oder mehrere der folgenden Best Practices anwenden, um die Latenz von LLM-Arbeitslasten zu reduzieren und gleichzeitig den Durchsatz und die Kosteneffizienz zu verbessern:
In den Beispielen in diesem Leitfaden wird das Gemma 7B-LLM zusammen mit den Bereitstellungs-Frameworks vLLM oder TGI verwendet, um diese Best Practices anzuwenden. Die beschriebenen Konzepte und Funktionen gelten jedoch für die meisten gängigen offenen LLMs.
Hinweise
Bevor Sie die Beispiele in diesem Leitfaden ausprobieren, führen Sie die folgenden erforderlichen Aufgaben aus:
Folgen Sie der Anleitung in diesen Leitfäden, um auf das Gemma Modell zuzugreifen, Ihre Umgebung vorzubereiten und Ressourcen zu erstellen und zu konfigurieren Cloud de Confiance by S3NS :
- Offene Gemma-Modelle mit GPUs in GKE mit vLLM bereitstellen
- Offene Gemma-Modelle mit GPUs in GKE mit Hugging Face TGI bereitstellen
Speichern Sie das Hugging Face-Zugriffstoken in Ihrem Kubernetes-Secret.
Klonen Sie das Beispiel-Repository https://github.com/GoogleCloudPlatform/kubernetes-engine-samples/ in Ihre lokale Entwicklungsumgebung.
Ändern Sie Ihr Arbeitsverzeichnis in
/kubernetes-engine-samples/ai-ml/llm-serving-gemma/:
Best Practice: Quantisierung
Die Quantisierung ist eine Technik, die der verlustbehafteten Bildkomprimierung ähnelt. Sie reduziert die Modellgröße, indem Gewichte in Formaten mit geringerer Genauigkeit (8 Bit oder 4 Bit) dargestellt werden, wodurch die Arbeitsspeicheranforderungen sinken. Wie bei der Bildkomprimierung ist die Quantisierung jedoch ein Kompromiss: Eine geringere Modellgröße kann zu einer geringeren Genauigkeit führen.
Es gibt verschiedene Quantisierungsmethoden, die jeweils eigene Vor- und Nachteile haben. Einige wie AWQ und GPTQ erfordern eine Vorquantisierung und sind auf Plattformen wie Hugging Face oder Kaggle verfügbar. Wenn Sie beispielsweise GPTQ auf das Llama-2 13B-Modell und AWQ auf das Gemma 7B-Modell anwenden, können Sie die Modelle auf einer einzelnen L4-GPU anstelle von zwei L4-GPUs ohne Quantisierung bereitstellen.
Sie können die Quantisierung auch mit Tools wie AutoAWQ
und AutoGPTQ durchführen. Diese Methoden können die Latenz und den Durchsatz verbessern. Im Gegensatz dazu erfordern Techniken mit EETQ und der Bibliothek bitsandbytes für die Quantisierung keine vorab quantisierten Modelle. Daher können sie eine geeignete Wahl sein, wenn keine vorab quantisierten Versionen verfügbar sind.
Die beste Quantisierungstechnik hängt von Ihren spezifischen Zielen und der Kompatibilität der Technik mit dem Bereitstellungs-Framework ab, das Sie verwenden möchten. Weitere Informationen finden Sie im Leitfaden zur Quantisierung von Hugging Face.
Wählen Sie einen dieser Tabs aus, um ein Beispiel für die Anwendung der Quantisierung mit den Frameworks TGI oder vLLM zu sehen:
TGI
GKE unterstützt die folgenden Quantisierungsoptionen mit TGI:
awqgptqeetqbitsandbytesbitsandbytes-nf4bitsandbytes-fp4
Die Quantisierungsmethoden AWQ und GPTQ erfordern vorquantisierte Modelle, während die Quantisierung mit EETQ und bitsandbytes auf jedes Modell angewendet werden kann. Weitere Informationen zu diesen Optionen finden Sie in diesem Hugging Face-Artikel.
Wenn Sie die Quantisierung verwenden möchten, legen Sie den
-–quantize Parameter fest, wenn Sie den Modellserver starten.
Das folgende Snippet zeigt, wie Sie Gemma 7B mit der bitsandbytes-Quantisierung mithilfe von TGI in GKE optimieren.
Verwenden Sie den folgenden Befehl, um diese Konfiguration anzuwenden:
kubectl apply -f tgi/tgi-7b-bitsandbytes.yaml
vLLM
GKE unterstützt die folgenden Quantisierungsoptionen mit vLLM:
gptqmit 4-Bit-Quantisierung (nicht für Gemma unterstützt, aber für andere Modelle verfügbar)awqsqueezellm- KV-Cache-Quantisierungen mit den Formaten FP8 (8-Bit-Gleitkomma) E5M2 und E4M3.
Wenn Sie die Modellquantisierung mit vLLM verwenden möchten, müssen die Modelle vorquantisiert werden.
Legen Sie beim Starten der Laufzeit den Parameter –quantization fest.
Das folgende Snippet zeigt, wie Sie das Gemma 7B-Modell mit der awq-Quantisierung mithilfe von vLLM in GKE optimieren:
Verwenden Sie den folgenden Befehl, um diese Konfiguration anzuwenden:
kubectl apply -f vllm/vllm-7b-awq.yaml
Latenz durch KV-Cache-Quantisierung verbessern
Sie können die FP8 E5M2-KV-Cache-Quantisierung verwenden, um den Arbeitsspeicherbedarf des KV-Cache erheblich zu reduzieren und die Latenz zu verbessern, insbesondere bei großen Batchgrößen. Dadurch wird jedoch die Inferenzgenauigkeit verringert.
Wenn Sie die FP8 E5M2-KV-Cache-Quantisierung aktivieren möchten, legen Sie den Parameter --kv-cache-dtype fp8_e5m2 fest:
Verwenden Sie den folgenden Befehl, um diese Konfiguration anzuwenden:
kubectl apply -f vllm/vllm-7b-kvcache.yaml
Best Practice: Tensor-Parallelität
Tensor-Parallelität ist eine Technik, die die Rechenlast auf mehrere GPUs verteilt. Dies ist wichtig, wenn Sie große Modelle ausführen, die die Arbeitsspeicherkapazität einer einzelnen GPU überschreiten. Dieser Ansatz kann kostengünstiger sein, da Sie mehrere erschwingliche GPUs anstelle einer einzelnen teuren GPU verwenden können. Außerdem kann der Durchsatz der Modellinferenz verbessert werden. Die Tensor-Parallelität nutzt die Tatsache, dass Tensorvorgänge unabhängig voneinander auf kleineren Datenblöcken ausgeführt werden können.
Weitere Informationen zu dieser Technik finden Sie im Leitfaden zur Tensor-Parallelität von Hugging Face.
Wählen Sie einen dieser Tabs aus, um ein Beispiel für die Anwendung der Tensor-Parallelität mit den Frameworks TGI oder vLLM zu sehen:
TGI
Mit TGI verwendet die Bereitstellungslaufzeit standardmäßig alle GPUs, die für den Pod verfügbar sind. Sie können die Anzahl der zu verwendenden GPUs festlegen, indem Sie den Parameter --num-shard mit der Anzahl der GPUs als Wert angeben.
Das folgende Snippet zeigt, wie Sie das für Gemma 7B optimierte Modell mit Tensor-Parallelität und zwei L4-GPUs optimieren:
Verwenden Sie den folgenden Befehl, um diese Konfiguration anzuwenden:
kubectl apply -f tgi/tgi-7b-it-tensorparallelism.yaml
In GKE Autopilot-Clustern wird durch Ausführen dieses Befehls ein Pod mit minimalen Ressourcenanforderungen von 21 vCPUs und 78 GiB Arbeitsspeicher erstellt.
vLLM
vLLM unterstützt die verteilte Tensor-Parallel-Inferenz. vLLM aktiviert die Funktion standardmäßig, wenn mehr als eine GPU verfügbar ist.
Das folgende Snippet zeigt, wie Sie das für Gemma 7B optimierte Modell mit Tensor-Parallelität und zwei L4-GPUs optimieren:
Verwenden Sie den folgenden Befehl, um diese Konfiguration anzuwenden:
kubectl apply -f vllm/vllm-7b-it-tensorparallelism.yaml
In GKE Autopilot-Clustern wird durch Ausführen dieses Befehls ein Pod mit minimalen Ressourcenanforderungen von 21 vCPUs und 78 GiB Arbeitsspeicher erstellt.
Best Practice: Optimierung des Modellspeichers
Die Optimierung der Arbeitsspeichernutzung von LLMs ist entscheidend für eine effiziente Inferenz. In diesem Abschnitt werden Optimierungsstrategien für die Aufmerksamkeitsebene vorgestellt, z. B. Paged Attention und Flash Attention. Diese Strategien verbessern die Arbeitsspeichereffizienz und ermöglichen längere Eingabesequenzen und eine reduzierte GPU-Leerlaufzeit. In diesem Abschnitt wird auch beschrieben, wie Sie die Größe der Modellein- und ‑ausgabe an die Arbeitsspeicherbeschränkungen anpassen und für bestimmte Bereitstellungsframeworks optimieren können.
Optimierung der Aufmerksamkeitsebene
Self-attention-Schichten ermöglichen es Modellen, den Kontext bei der Sprachverarbeitung zu verstehen, da sich die Bedeutung von Wörtern je nach Kontext ändern kann. Diese Schichten speichern jedoch Eingabetoken-Gewichte, Schlüssel (K) und Werte (V) im GPU-vRAM. Wenn die Eingabesequenz länger wird, führt dies zu einem quadratischen Wachstum der Größe und der Berechnungszeit.
Die Verwendung von KV-Caching ist besonders nützlich bei langen Eingabesequenzen, bei denen der Overhead der Self-Attention erheblich sein kann. Dieser Optimierungsansatz reduziert die Rechenverarbeitung auf eine lineare Komplexität.
Zu den spezifischen Techniken zur Optimierung von Aufmerksamkeitsmechanismen in LLMs gehören:
- Paged Attention: Paged Attention verbessert die Speicherverwaltung für große Modelle und lange Eingabesequenzen durch Auslagerungstechniken, ähnlich dem virtuellen Arbeitsspeicher des Betriebssystems. Dadurch werden Fragmentierung und Duplizierung im KV-Cache effektiv reduziert, was längere Eingabesequenzen ermöglicht, ohne dass der GPU-Arbeitsspeicher aufgebraucht wird.
- Flash Attention: Flash Attention verringert GPU-Arbeitsspeicherengpässe, indem die Datenübertragungen zwischen GPU-RAM und L1-Cache während der Tokengenerierung minimiert werden. Dadurch wird die Leerlaufzeit für Rechenkerne eliminiert und die Inferenz- und Trainingsleistung für GPUs erheblich verbessert.
Feinabstimmung der Modelleingabe und -ausgabe
Die Arbeitsspeicheranforderungen hängen von der Eingabe- und Ausgabegröße ab. Eine längere Ausgabe und mehr Kontext erfordern mehr Ressourcen, während eine kürzere Ausgabe und weniger Kontext Kosten sparen können, indem eine kleinere, günstigere GPU verwendet wird.
Wählen Sie einen dieser Tabs aus, um ein Beispiel für die Feinabstimmung der Arbeitsspeicheranforderungen der Modelleingabe- und -ausgabe in den TGI- oder vLLM-Frameworks zu sehen:
TGI
Die TGI-Bereitstellungslaufzeit prüft die Arbeitsspeicheranforderungen beim Start und startet nicht, wenn der maximal mögliche Modellspeicherbedarf nicht in den verfügbaren GPU-Arbeitsspeicher passt. Durch diese Prüfung werden Abstürze aufgrund von Arbeitsspeichermangel bei speicherintensiven Arbeitslasten vermieden.
GKE unterstützt die folgenden TGI-Parameter zur Optimierung der Arbeitsspeicheranforderungen des Modells:
Das folgende Snippet zeigt, wie Sie ein für Gemma 7B
optimiertes Modell mit einer einzelnen L4-GPU mit den Parametereinstellungen
--max-total-tokens=3072, --max-batch-prefill-tokens=512,
--max-input-length=512 bereitstellen:
Verwenden Sie den folgenden Befehl, um diese Konfiguration anzuwenden:
kubectl apply -f tgi/tgi-7b-token.yaml
vLLM
Konfigurieren Sie in vLLM die Kontextlänge des Modells, die sich direkt auf die KV-Cache-Größe und die GPU-RAM-Anforderungen auswirkt. Kleinere Kontextlängen ermöglichen die Verwendung günstigerer GPUs. Der Standardwert ist die maximale Anzahl von Token, die das Modell akzeptiert. Begrenzen Sie die maximale Kontextlänge bei Bedarf mit --max-model-len MAX_MODEL_LEN.
So übersteigt z. B. das für Gemma 7B optimierte Modell mit einer Standardkontextlänge von 8.192 die Arbeitsspeicherkapazität einer einzelnen NVIDIA L4-GPU. Wenn Sie das Modell auf einer L4-GPU bereitstellen möchten, begrenzen Sie die kombinierte Länge von Prompts und Ausgaben, indem Sie --max-model-len auf einen Wert unter 640 festlegen. Durch diese Anpassung kann das Modell trotz seiner großen Standardkontextlänge auf einer einzelnen L4-GPU ausgeführt werden.
Verwenden Sie das folgende Snippet, um die Bereitstellung mit dem geänderten Tokenlimit durchzuführen:
Verwenden Sie den folgenden Befehl, um diese Konfiguration anzuwenden:
kubectl apply -f vllm/vllm-7b-token.yaml
Zusammenfassung der Checkliste
| Optimierungsziel | Übung |
|---|---|
| Latenz |
|
| Durchsatz |
|
| Kosteneffizienz |
|
Nächste Schritte
- Eine End-to-End-Anleitung zur Containerkonfiguration finden Sie unter LLM mit mehreren GPUs in GKE bereitstellen.
- Wenn Sie eine cloudverwaltete LLM-Bereitstellungslösung benötigen, stellen Sie Ihr Modell über Vertex AI Model Garden bereit.