Skip to content

Commit 8940e2b

Browse files
committed
Add GB10 VLM MTP catalog config
1 parent 5f61bdc commit 8940e2b

2 files changed

Lines changed: 98 additions & 9 deletions

File tree

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
kind: engine_asset
2+
_profile: vllm
3+
metadata:
4+
name: vllm-mtp-blackwell
5+
type: vllm
6+
version: "mtp-gb10"
7+
supported_model_types: [llm, vlm]
8+
hardware:
9+
gpu_arch: Blackwell
10+
vram_min_mib: 4096
11+
image:
12+
# Custom GB10 ARM64 build with MTP support for Qwen3.6.
13+
# NOTE: private registry, requires pre-pull on target machine.
14+
name: qujing/vllm-gb10-mtp
15+
tag: "latest"
16+
platforms: [linux/arm64]
17+
startup:
18+
env: {}
19+
# VLM requires patching: the image's vllm_flash_attn/ is missing layers/ subdir,
20+
# causing VLM vision encoder rotary embedding to fail with:
21+
# ModuleNotFoundError: No module named 'vllm.vllm_flash_attn.layers'
22+
# Fix: create a 2-file shim on host that bridges to standalone flash_attn package:
23+
# mkdir -p /path/to/vllm_flash_attn_layers
24+
# echo 'from flash_attn.layers import *' > __init__.py
25+
# echo 'from flash_attn.layers.rotary import *' > rotary.py
26+
# Then add extra_volumes in runtime overlay:
27+
# extra_volumes:
28+
# - name: flash-attn-layers-patch
29+
# host_path: /path/to/vllm_flash_attn_layers
30+
# mount_path: /usr/local/lib/python3.12/dist-packages/vllm/vllm_flash_attn/layers
31+
# read_only: true
32+
# Without this patch, text-only (language_model_only: true) works fine;
33+
# only VLM image input triggers the missing module error.
34+
default_args:
35+
gpu_memory_utilization: 0.80
36+
max_model_len: 131072
37+
health_check:
38+
timeout_s: 600
39+
amplifier:
40+
features:
41+
- mtp
42+
time_constraints:
43+
cold_start_s: [120, 300]
44+
model_switch_s: [120, 300]
45+
runtime:
46+
default: "container"
47+
platform_recommendations:
48+
linux/arm64: "container"

catalog/models/qwen3.6-35b-a3b.yaml

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ variants:
109109
gpu_arch: Blackwell
110110
vram_min_mib: 40960
111111
unified_memory: true
112-
engine: vllm
112+
engine: vllm-mtp-blackwell
113113
format: safetensors
114114
default_config:
115115
gpu_memory_utilization: 0.92
@@ -125,9 +125,9 @@ variants:
125125
mm_encoder_attn_backend: TORCH_SDPA
126126
skip_mm_profiling: true
127127
max_num_batched_tokens: 8192
128-
speculative_config:
129-
method: mtp
130-
num_speculative_tokens: 1
128+
# speculative_config must be a JSON string, not a YAML map —
129+
# configToFlags() uses fmt.Sprintf("%v") which renders maps as map[k:v], not JSON.
130+
speculative_config: '{"method":"mtp","num_speculative_tokens":1}'
131131
expected_performance:
132132
startup_time_s: 190
133133
cold_start_time_s: 300
@@ -172,11 +172,11 @@ variants:
172172
skip_mm_profiling: true
173173
max_num_batched_tokens: 8192
174174
max_num_seqs: 1
175-
async_scheduling: false
176-
speculative_config:
177-
method: dflash
178-
model: /models/Qwen3.6-35B-A3B-DFlash
179-
num_speculative_tokens: 10
175+
no_async_scheduling: true
176+
# speculative_config must be a JSON string (see MTP variant comment).
177+
# async_scheduling: false does NOT work — configToFlags omits false bools.
178+
# Use no_async_scheduling: true instead.
179+
speculative_config: '{"method":"dflash","model":"/models/Qwen3.6-35B-A3B-DFlash","num_speculative_tokens":10}'
180180
expected_performance:
181181
startup_time_s: 376
182182
cold_start_time_s: 420
@@ -321,3 +321,44 @@ variants:
321321
58277: [13.749, 26.2, 4239]
322322
116532: [35.169, 19.9, 3313]
323323
233039: [109.196, 13.5, 2134]
324+
325+
# --- GB10 MTP + VLM: multimodal (text + image input) with MTP speculative decoding ---
326+
# Requires vllm-mtp-blackwell engine with flash_attn layers patch (see engine YAML comments).
327+
# Key differences from text-only MTP variant:
328+
# - No language_model_only (enables vision encoder cross-attention)
329+
# - attention_backend: TRITON_ATTN (FA2 _vllm_fa2_C broken in MTP image)
330+
# - mm_encoder_attn_backend: TORCH_SDPA (VLM non-causal attention fallback)
331+
# - skip_mm_profiling: true (avoid VLM encoder memory profiling crash)
332+
# - extra_volumes patch required for vllm_flash_attn/layers/ (rotary embedding)
333+
# DFlash + VLM is NOT viable on GB10 SM121: FA2 non-causal kernels lack SM121 PTX,
334+
# and TRITON_ATTN does not support non-causal attention required by DFlash spec decoding.
335+
- name: qwen3.6-35b-a3b-blackwell-vllm-mtp-vlm
336+
hardware:
337+
gpu_arch: Blackwell
338+
vram_min_mib: 40960
339+
unified_memory: true
340+
engine: vllm-mtp-blackwell
341+
format: safetensors
342+
default_config:
343+
gpu_memory_utilization: 0.80
344+
max_model_len: 131072
345+
dtype: bfloat16
346+
enforce_eager: true
347+
trust_remote_code: true
348+
reasoning_parser: qwen3
349+
enable_auto_tool_choice: true
350+
tool_call_parser: qwen3_xml
351+
attention_backend: TRITON_ATTN
352+
mm_encoder_attn_backend: TORCH_SDPA
353+
skip_mm_profiling: true
354+
max_num_batched_tokens: 8192
355+
max_num_seqs: 4
356+
no_async_scheduling: true
357+
speculative_config: '{"method":"mtp","num_speculative_tokens":1}'
358+
expected_performance:
359+
startup_time_s: 212
360+
cold_start_time_s: 300
361+
tokens_per_second: [27, 41]
362+
tpot_ms: [24, 37]
363+
vram_mib: 68710
364+
notes: "Validated 2026-05-13 on gb10-4t. Text decode ~40 tok/s, VLM (image+text) ~37 tok/s. First request has ~10s JIT Triton warmup. Requires flash_attn layers patch volume mount (see engine YAML). Model loads 67.1 GiB, total boot ~212s (main model 174s + MTP drafter 16s + KV cache). MTP acceptance gives ~80% speedup over baseline 22 tok/s. DFlash+VLM failed on SM121 due to FA2 non-causal PTX incompatibility."

0 commit comments

Comments
 (0)