Parameter des vLLM Engines, die wir besprechen werden:
- max-num-batched-tokens
- max-model-len
- gpu-memory-utilization
- enable-prefix-caching
- enable-chunked-prefill
- enforce-eager
max-model-len:
TL;DR entsprechend der maximalen Anzahl verwendeter Tokens (Eingabe + Ausgabe)
- Standardmäßig ist die maximale Modell-Länge gleich der maximalen Kontextlänge der von Ihnen verwendeten Modell. Zum Beispiel beträgt sie für die Modell llama 3 8B instruct 8192.
- Wenn Sie die maximale Kontextlänge für Ihren Anwendungsfall bestimmen können und sie kleiner als die maximale Kontextlänge Ihrer Modell ist, sollten Sie diesen Parameter auf diesen Wert setzen.
- Dies verhindert nicht nur Fehler durch Speicherfehler bei der Modell-Initialisierung oder beim Modell-Verwendung, sondern hilft auch bei der Einstellung anderer Parameter wie max-num-batched-tokens und gpu-memory-utilization.
- Der Wert beinhaltet sowohl die Anzahl der Eingabe- als auch der Ausgabetokens, daher, wenn in Ihrem Fall die Gesamtanzahl der Tokens nicht übersteigt, sagen wir, 2046, setzen Sie diesen Parameter auf diesen Wert.
max-num-batched-tokens:
TL;DR Beginnen Sie mit max-model-len, versuchen Sie dann, diesen Wert zu verdoppeln: max-model-len * 2, dann * 3… bis Sie einen Speicherfehler oder eine Warnung über Verdrängung erhalten. Wählen Sie einen Wert, der eine gute Leistung bietet. Wenn Sie enable-chunked-prefill verwenden, beginnen Sie mit einem kleineren Wert, z. B. 128, und testen Sie verschiedene Werte. Siehe Erläuterungen unten.
- Beachten Sie, dass dieser Parameter die Anzahl der Tokens, nicht die Paketgröße angibt.
- Jede Anfrage muss zwei Phasen durchlaufen: die Präfüllphase (Berechnung der KV-Werte für die Eingabetokens und Verteilung dieser Werte im KV-Cache) und die Dekodierungsphase, bei der rekursiv das direkte Berechnen der Tokens erfolgt.
- Daher ist der minimale Wert dieses Parameters gleich der maximalen Modell-Länge, die Sie für die Präfüllung festgelegt haben (sofern Sie nicht chunked-prefill verwenden, mehr dazu später).
- Je mehr Tokens im Batch sind, desto mehr Präfüllungen gibt es, wodurch der erste Token schneller generiert wird. Der vLLM-Planner bevorzugt standardmäßig Präfüllungen.
- Ein großer Batch-Größe kann daher die Durchsatzleistung erhöhen, funktioniert jedoch nicht in allen Fällen, da Durchsatz und Latenz auch vom Verhältnis von Rechenressourcen und GPU-Speicher abhängen (mehr dazu im Abschnitt chunked-prefill), und Präfüllungen tendenziell viel Rechenressourcen benötigen, weshalb sie schnell die maximale Anzahl der Tokens im Batch erreichen, die wir speichern können.
- Daher ist es besser, mit dem Wert max-model-len zu beginnen, diesen Wert zu verdoppeln und zu beobachten, wie sich die Leistung verändert, bis ein Speicherfehler oder eine Warnung über Verdrängung auftritt, wie in diesem Dokument beschrieben, um die richtige Anzahl der Tokens im Batch zu wählen. Versuchen Sie dann diese Theorie anzuwenden, um zu verstehen, wie Ihre System funktioniert.
enable-prefix-caching:
Kurzfassung Aktivieren Sie es, es sei denn, Sie verwenden enable-chunked-prefill
- Es speichert die berechneten KV-Werte für spätere Verwendung, was viel Zeit spart.
- Wenn ein Großteil Ihrer Anfrage bei der Eingabe der Daten unverändert bleibt, werden Sie eine signifikant höhere Leistung beobachten im Vergleich zu einer Konfiguration, bei der nur ein kleiner Teil der Tokens in der Anfrage unverändert bleibt.
- Wenn der Parameter enable-chunked-prefill aktiviert ist, ist dieser Parameter nicht zulässig (zur Zeit der Veröffentlichung dieses Artikels)
gpu-memory-utilization:
TL;DR Je mehr, desto besser, sofern kein Speicherfehler auftritt. Standardmäßig 0,9
- Je mehr GPU-Speicher für den Speicher des KV-Caches bereitgestellt wird, desto höher ist die Leistung.
- Verringern Sie diesen Wert, wenn Sie einen Speicherfehler erhalten oder wenn der GPU weitere Aufgaben ausführt, die diesen Wert verringern.
enforce-eager:
TL;DR Falls Speicher fehlt, aktivieren Sie diese Funktion
- Bei Verwendung wird kein CUDA-Graph erstellt, was die Leistung beeinflussen kann, aber Speicher spart, der sonst für den Graph benötigt wurde.
- Bei bestimmten Einstellungen hat der CUDA-Graph keinen signifikanten Einfluss auf die Leistung, und der gesparte Speicher kann hilfreich sein, um die Werte der oben genannten Parameter wie gpu-memory-utilization, max-num-batched-tokens usw. zu erhöhen.
enable-chunked-prefill:
TL;DR Versuchen Sie, diese Funktion zu aktivieren und verwenden Sie batchierte Tokens, beginnen Sie mit dem Wert 128 und erhöhen Sie diesen schrittweise. Vergleichen Sie dies mit der Konfiguration ohne diesen Parameter. Weitere Details unten.
- Die Dekodierungsphase ist weniger rechenintensiv als die Präfüllphase (Vektor-Matrix-Multiplikation statt Matrix-Matrix-Multiplikation), aber mehr Speicherintensiv, da sie die berechneten KV-Werte lesen muss.
- Wenn Sie mehr erfahren möchten, lesen Sie diesen Artikel und diese vLLM-Seite.
- Wie bereits erwähnt, bevorzugt der vLLM-Planner standardmäßig die Präfüllung, die rechenintensiv ist, während die Dekodierung im Speicher das Engpass ist, was die vollständige Nutzung der Dekodierung mit geringen Rechenressourcen und hoher Speicheranforderung behindert, da die KV-Werte gelesen werden müssen.
- Chunk prefill teilt die Präfüllphase in kleinere Abschnitte, was die Anzahl der Tokens im Batch reduziert und es ermöglicht, den Batch zu bilden, indem Anfragen zur Dekodierung zusammengefasst und Anfragen zur Präfüllung in Abschnitte aufgeteilt werden, um die GPU-Ressourcen effizient zu nutzen, indem sowohl rechenintensive Abschnitte zur Präfüllung als auch ausreichend viele Dekodierungsanfragen mit geringer Rechenintensität, aber hoher Speicheranforderung kombiniert werden.
- Versuchen Sie es erneut, diese Funktion zu aktivieren und verwenden Sie eine kleine maximale Anzahl von Tokens im Batch, z. B. 128, und erhöhen Sie diesen schrittweise, bis Sie die gewünschten Durchsatz- und Latenzwerte erreichen.
- Diese Methode kann die Latenz zwischen den Tokens reduzieren, da die Dekodierung Vorrang hat, aufgrund des kleinen Batch-Größen (was die Speicherlast reduziert), kann jedoch den Durchsatz beeinflussen, daher müssen verschiedene Batch-Größen getestet werden, und die Ergebnisse müssen mit der Konfiguration ohne diesen Parameter verglichen werden.
Beispiel:
- Wir werden den vLLM API-Eingangspunkt verwenden, anstatt einen Server, der mit OpenAI kompatibel ist.
- Um einen Server ohne Chunked-Prefill zu starten, können Sie den folgenden Beispiel verwenden:
python3 -m vllm.entrypoints.api_server — model MaziyarPanahi/Meta-Llama-3–8B-Instruct-GPTQ — gpu-memory-utilization 0.95 — port 5000 — dtype half — enforce-eager — max-model-len 4096 — max-num-batched-tokens 8192 — enable-prefix-caching
- Wenn die Chunked-Prefill-Funktion aktiviert ist, könnte das Kommando wie folgt aussehen:
python3 -m vllm.entrypoints.api_server — model MaziyarPanahi/Meta-Llama-3–8B-Instruct-GPTQ — gpu-memory-utilization 0.95 — port 5000 — dtype half — enforce-eager — max-model-len 4096 — max-num-batched-tokens 256 — enable-chunked-prefill
- Senden Sie eine Anfrage an die oben genannte Endpunkt des Servers, um die Leistung bei verschiedenen Parametern zu testen.
- Führen Sie einen Benchmark mit den vLLM bereitgestellten Skripten durch, und ich werde ebenfalls versuchen, einen ähnlichen Skript zu schreiben und hier zu teilen.