Article

Asynchrones Continuous Batching für maximale GPU-Auslastung

LLM Inference Continuous Batching Performance

Continuous Batching revolutioniert die LLM-Inference, aber ein oft übersehener Flaschenhals verschwendet dennoch bis zu einem Viertel der Runtime: synchrone CPU-GPU-Koordination. Dieser Artikel zeigt, wie asynchrones Batching die Lücken schließt und die GPU-Auslastung maximiert.

Das Problem synchroner Batches

Bei naivem synchronen Batching warten CPU und GPU abwechselnd: Während die GPU rechnet, ist die CPU idle. Während die CPU den nächsten Batch vorbereitet, wartet die GPU. Bei hunderten Schritten pro Sekunde summieren sich diese Lücken zu echtem Throughput-Verlust.

Die CPU muss für jeden Schritt den Batch zusammenstellen: Anfragen auswählen, KV-Cache-Tabellen aktualisieren, fertige Requests entfernen und neue aufnehmen, Inputs zur GPU übertragen. Erst dann kann die GPU rechnen. Nach der Forward-Pass und Sampling-Phase wartet die GPU erneut auf die CPU-Vorbereitung.

Messbare Auswirkungen

In Profiling-Tests mit einem 8B-Modell bei Batch-Größe 32 und 8K Token-Generation macht die CPU-Idle-Zeit knapp 24% der Gesamtruntime aus. Das sind fast 15 Minuten pro Stunde verschwendeter GPU-Zeit. Bei H200-Kosten von etwa $5 pro Stunde summiert sich das schnell zu signifikanten Kosten.

Die asynchrone Lösung

Der Schlüssel liegt in der Entkopplung: CPU- und GPU-Arbeit werden in separate Pipelines aufgeteilt, die parallel laufen. Die GPU muss nie auf CPU-Vorbereitung warten, weil bereits ein vorbereiteter Batch bereitsteht.

Das erreicht man durch Double-Buffering oder Ring-Buffer-Strategien: Während die GPU Batch N verarbeitet, bereitet die CPU bereits Batch N+1 vor. Das erfordert sorgfältige Memory-Planung, da zwei Sätze von KV-Cache-Metadaten gleichzeitig im RAM liegen müssen.

Implementierung mit vLLM

Frameworks wie vLLM bieten asynchrones Batching bereits als Option. Wichtig ist, dass die CPU-Vorbereitung tatsächlich schneller ist als die GPU-Berechnung – sonst entsteht ein anderer Flaschenhals. Bei sehr kleinen Modellen oder extrem kurzen Sequenzen kann der Overhead dominieren.

Die Profiling-Ergebnisse zeigen: Mit asynchronem Batching verschwinden die Lücken fast vollständig. Die GPU-Auslastung steigt von typischerweise ~75% auf nahezu 100%. Für Inference-Endpoints, die stundenlang laufen, bedeutet das signifikante Kosteneinsparungen bei gleicher Hardware.

Praktische Tipps

Die optimale Batch-Größe hängt vom Modell und Sequenzlängen ab. Bei asynchronem Batching kann man aggressivere Batch-Größen wählen, da die GPU durch CPU-Wartezeiten nicht mehr ausgebremst wird. Memory-Planung wird komplexer – der Overhead lohnt sich aber ab einer bestimmten Request-Rate.

Originalartikel