Views
No views yet
vision_tower, multi_modal_projector, lm_head,
or the embeddings — the protection regexes did what they were meant toconfig.json consistent with the base model
(layers=36, kv_heads=8, hidden=4096, image_token_id, image_seq_length)Linear modules
(144 attention: q_proj / k_proj / v_proj / o_proj,
108 MLP: gate_proj / up_proj / down_proj)W4A16_ASYM, algorithm: AWQ (duo_scaling, n_grid=20)pack-quantized, group size 128lm_head,
normalization layers.741a7d03020411e666c6109218ab71e08151ef86| Dataset | lmms-lab/flickr30k |
| Samples | 128 (0 skipped) |
| Image size | 448×448, 1 patch per sample |
| Prompts | generic English / Korean scene-description instructions |
1vllm serve hsmin92/internvl35-8b-awq-w4a16-g128 \
2 --served-model-name internvl35-8b-awq \
3 --dtype bfloat16 \
4 --max-model-len 8192 \
5 --max-num-seqs 8 \
6 --max-num-batched-tokens 4096 \
7 --limit-mm-per-prompt '{"image":2,"video":0}' \
8 --gpu-memory-utilization 0.85 \
9 --kv-cache-memory-bytes 2880M \
10 --trust-remote-code \
11 --enable-auto-tool-choice \
12 --tool-call-parser hermes1weights 6,520 MiB (6,460 MiB on disk)
2context + activation peak 750 MiB
3CUDA graphs 150 MiB
4KV cache (pinned, fp16) 2,880 MiB -> 20,480 tokens
5────────────────────────────────────────
6vLLM process ~10,300 MiB -> utilization 0.8382 × 36 layers × 8 KV heads × 128 head_dim × 2 B),
so 20,480 tokens holds 2.5 full-length 8,192-token requests.docker compose logs vlm-prod | grep -E "Model loading took|GPU KV cache size"Model loading took exceeds 6,520 MiB, reduce --kv-cache-memory-bytes by
the difference. If startup is refused with Free memory ... is less than desired GPU memory utilization, lower --gpu-memory-utilization — the figure
that matters is the one in that error message, not what host nvidia-smi shows.--dtype bfloat16 — do not use half. On the sibling FP8 build, half
produced a server that started, returned HTTP 200 from /health, passed its
container health check, and answered every request with !!!!!!!! (dequant
overflow → NaN logits → argmax picks token 0). It fails silently. This build is
INT4 rather than FP8 so the same overflow is not expected, but the checkpoint
declares bfloat16 and there is no reason to deviate. Always send a real
request after a configuration change, not just a health check.--max-num-batched-tokens is not a VRAM knob. It also sizes the multimodal
encoder cache, and the vLLM default of 2048 rejects large images on any card:1image item with 2816 embedding tokens, which exceeds the
2pre-allocated encoder cache size 2048--max-num-seqs: the default of 128 costs throughput. When more concurrent
requests arrive than the KV cache holds, vLLM preempts and recomputes and
throughput falls below what a smaller limit achieves. Measured on the 4B build
(~1,084 prompt tokens/request, 16,128-token cache): at 16 concurrent requests,
--max-num-seqs 128 took 11.82 s while 8 took 6.54 s. Pick a limit the cache
can sustain — not the Maximum concurrency figure in the startup log, which
assumes every request fills the full context window.tool_choice field; Open WebUI sends
tool_choice: "auto" by default. Actual tool calling still does not work — the
bundled chat_template.jinja has no tool rendering, so tools=[...] is
silently ignored.| Input size | Image tokens | Tiles |
|---|---|---|
| 448×448 | 257 | 1 |
| 896×448 | 769 | 3 |
| 960×544 | 769 | 3 |
| 800×450 | 769 | 3 |
| 200×150 | 3,329 | 13 |
| 4000×300 | 3,329 | 13 |
response_format instead of scraping prose. Put maxLength on every free
text field — without an upper bound a model can ramble inside the string until
it hits max_tokens, returning truncated JSON.chat_template.jinja has no tool-calling support.1@article{wang2025internvl3_5,
2 title={InternVL3.5: Advancing Open-Source Multimodal Models in Versatility, Reasoning, and Efficiency},
3 author={Wang, Weiyun and Gao, Zhangwei and Gu, Lixin and Pu, Hengjun and Cui, Long and Wei, Xingguang and Liu, Zhaoyang and Jing, Linglin and Ye, Shenglong and Shao, Jie and others},
4 journal={arXiv preprint arXiv:2508.18265},
5 year={2025}
6}