TT Lab
Blog

한국어 English 日本語 中文

Get started
Blog

Blog

Parallelization, Multimodal, and Pooling: What You Can and Cannot Benchmark with a Single GPU

Status: Draft (2026-10-27), pooling and multimodal benchmarked, parallelization unbenchmarked. Pooling measurements were conducted on 2026-10-27 using a single 8GB laptop GPU (Ada generation) and vLLM 0.31.0. Parallelization and multimodal features were unbenchmarked, and details are based solely on official documentation (0.32.0) and papers. Measurements for LoRA multi-serving can be found in Toss ML/AI Infra Preparation, Part 15. Added on 2026-10-27. Following approval, we downloaded vLLM 0.32.0 images and Qwen3-VL-2B-Instruct (Apache-2.0, safetensors 4.26GB) to add the multimodal measurements in Section 2-1. This content was marked as "Unbenchmarked" in the initial edition. Writing Rules: Measured data is the default. Unmeasured items are marked as "Unbenchmarked," and unverified items are marked as "Unverified."

Table of Contents

1. Four Types of Parallelism: What is Divided?

Method Option What is Divided Communication Use Case
Tensor Parallelism (TP) --tensor-parallel-size Matrices of a single layer are split across GPUs All-reduce per layer When the model does not fit on a single GPU, within a single server
Pipeline Parallelism (PP) --pipeline-parallel-size Layers are divided sequentially, assigning a few layers per GPU Only activations between stages Spanning multiple servers, when NVLink is unavailable
Data Parallelism (DP) --data-parallel-size The entire model is replicated without splitting Almost none (except for MoE) When increasing throughput
Expert Parallelism (EP) --enable-expert-parallel MoE experts are distributed across GPUs All-to-all tokens toward experts Large MoE models

To check whether a model fits, look for two lines in the startup logs: GPU KV cache size: N tokens and Maximum concurrency for M tokens per request: Kx . The experimental server in this series achieved "9.82x based on 40,208-token and 4,096-token requests." The documentation advises adding GPUs if this concurrency falls below the target.

Because we only have a single GPU, all four methods are unbenchmarked. Toss ML/AI Infra Preparation Part 24 includes measurements of transferring KV caches by linking two GPUs of the same family over 1GbE (where split serving was over 20x slower), so that article serves as a proxy for the cost of connecting GPUs over slow links.

2. Multimodal Inputs

vLLM serves models that accept images, video, and audio using the same OpenAI-compatible API. If you insert content blocks into chat message image_url, video_url, input_audio , the API server's processor downloads and preprocesses the media, sending it to the model's encoder. A single image is converted into multiple placeholder tokens within the prompt, and the prefix cache mixes the image hash into the placeholder block's hash so that identical images share caches (refer to Part 2's prefix cache design document).

In operations, you should prioritize this over performance.

In the initial edition, vision-language models were unbenchmarked because they required downloading new models. Following approval, we measured them in Section 2-1 below.

2-1. 2026-10-27 Benchmark: Running a 2B Vision-Language Model on an 8GB GPU

First, Getting It to Start

Configuration Remaining Memory for KV KV Space Result
Default (--gpu-memory-utilization 0.85) -0.07GiB Startup failure: "No available memory for the cache blocks"
--limit-mm-per-prompt '{"image":1,"video":0}' Adding only -0.07GiB Same failure
Memory utilization 0.92 0.47GiB 4,352 tokens (1.06 requests of 4,096 tokens) Started
0.92 + Size Hint {"image":{"count":1,"width":896,"height":896},"video":0} 2.13GiB 19,904 tokens (4.86 requests) Started

When starting up, vLLM measures memory by running the encoder once with the "largest image the model can accept." Logs indicated that the encoder cache budget was set to 16,384 tokens. With 4GB of weights plus that budget, no KV space remained on the 8GB GPU. Reducing just the number of image counts did not help, but providing the actual expected image size increased KV space by 4.5x. This is the primary knob to tweak when running vision-language models on small GPUs.

Results (Size-Hinted Server)

Metric 448×448 896×896
Prompt Tokens (Image + Question) 220 808
Median TTFT for New Image 67.9ms 238.0ms
Same image, repeated question 31.8ms (208 cached tokens) 32.7ms (800 cached tokens)
Same image, different question 32.1ms (192 cached tokens) 33.4ms (784 cached tokens)

SSRF: Does the Server Download on Behalf of the User?

Requested Image URL Default Server --allowed-media-domains example.com
http://127.0.0.1:8000/health(Server Itself) 400 "Failed to load image: cannot identify image file" (5.5ms) 400 "The URL must be from one of the allowed domains" (2.6ms)
http://127.0.0.1:8000/metrics 400, same message 400, same rejection
file:///etc/passwd 500 "Cannot load local files without --allowed-local-media-path」 Same as above

The default server's message is "not an image." This means the server actually sent a request to that internal address and received a response. Although the response body was not returned, a requester could probe the internal network via this server and discover what is open based on response times and errors. Specifying allowed domains rejected requests before downloading. Local files were blocked by default. For any service accepting image URLs, --allowed-media-domains is not optional but mandatory.

3. Pooling: Embeddings and Reranking on the Same Engine

Models that extract the final hidden states instead of generating text are called pooling modelsby vLLM. Running with --runner pooling provides /v1/embeddings, /score, /rerank, /classify, /pooling instead of generation. Causal models default to using the last token (LAST), while BERT-family models default to the first token (CLS). The official documentation notes upfront that "pooling model support is for convenience and does not guarantee being faster than other approaches."

Method

Result

Task Request Performed Median Latency (5 runs) Throughput Notes
Embedding 64 sentences × approx. 127 tokens 371.8ms 172 per sec (approx. 21,900 tokens) Dimension 1,024
Reranking 1 question + 32 documents 33.9ms 944 per sec Correct document ranked 1st with 0.993

4. Multi-LoRA Serving

This is a feature that mounts multiple LoRA adapters on a single base model and uses a different adapter for each request (--enable-lora --max-loras --max-lora-rank). The values measured with a 1.7B model on the same 8GB-class GPU are covered in LoRA adapter serving. Using adapters was 8.5% to 17.9% slower, and throughput dropped significantly when the number of adapters exceeded the number of slots. There are two additional points to add in this edition.

5. Unverified Items

References

Sign in to like

Comments

No comments yet.

Sign in to leave a comment