I have been running deepseek-ai/DeepSeek-V4-Flash-0731(1M Token) and RedHatAI/Qwen3.5-9B-FP8-dynamic across a 2× NVIDIA DGX Spark cluster.
Turning DeepSeek into a Multimodal Model with Pilco-mmbridge
I actively use Claude Code with Unity MCP and Unreal Engine MCP.
DeepSeek is currently my preferred model because it can process a large amount of context at a relatively low cost. After the July 31 update, its performance improved significantly.
The main limitation is that DeepSeek does not have vision capabilities.
To address this, I started Pilco-mmbridge after testing the setup in real work and using it extensively myself.
The project combines:
Text-Only Model + Multimodal Model
without fine-tuning, so a text-only model can also handle image-based tasks through a separate vision model.
My current recommended combination is:
DeepSeek-V4-Flash-0731
+
Qwen3.5-9B-FP8-dynamic
Qwen handles images and OCR, while DeepSeek handles the main reasoning and final response.
Gemma 4 12B can also be used in a similar omni-style setup, but in my experience its OCR performance is relatively weak. Because I often need to read error messages, warning dialogs, file paths, logs, and UI text accurately, I currently prefer the DeepSeek and Qwen combination.
I mainly use this setup with:
Claude Code
+
MCP or other agent tools
+
Pilco-mmbridge
It can be used in any workflow that requires visual analysis, including screenshots, error messages, documents, user interfaces, charts, application states, game screens, and other information that cannot be fully understood through text alone.
It can also be used outside game development whenever a text-only model needs vision support.
Setup is simple. Serve both models with vLLM, then connect the two API endpoints to Pilco-mmbridge.
The recipes below are configured to serve both models on a 2× DGX Spark cluster.
DeepSeek-V4-Flash-0731
vllm serve /workspace/Model/DeepSeek-V4-Flash-0731 \
--host 0.0.0.0 --port 8000 \
--distributed-executor-backend ray \
--tensor-parallel-size 2 \
--trust-remote-code \
--gpu-memory-utilization 0.75 \
--enable-auto-tool-choice \
--enable-prefix-caching \
--reasoning-parser deepseek_v4 \
--tool-call-parser deepseek_v4 \
--tokenizer-mode deepseek_v4 \
--max-num-batched-tokens 4096 \
--max-model-len 1048576 \
--block-size 256 \
--kv-cache-dtype fp8 \
--speculative-config '{"method":"dspark","num_speculative_tokens":5,"draft_sample_method":"greedy"}' \
--default-chat-template-kwargs '{"thinking": true, "reasoning_effort": "high"}' \
--max-num-seqs 10
(EngineCore pid=433) INFO 08-01 05:59:31 [kv_cache_utils.py:2168] GPU KV cache size: 1,127,367 tokens
(EngineCore pid=433) INFO 08-01 05:59:31 [kv_cache_utils.py:2169] Maximum concurrency for 1,048,576 tokens per request: 1.08x
(APIServer pid=9) INFO 08-01 06:26:08 [metrics.py:120] SpecDecoding metrics: Mean acceptance length: 4.00, Accepted throughput: 5.40 tokens/s, Drafted throughput: 9.00 tokens/s, Accepted: 54 tokens, Drafted: 90 tokens, Per-position acceptance rate: 0.778, 0.778, 0.556, 0.500, 0.389, Avg Draft acceptance rate: 60.0%
(APIServer pid=9) INFO 08-01 06:26:18 [loggers.py:273] Engine 000: Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 64.9 tokens/s, Running: 1 reqs, Waiting: 0 reqs, GPU KV cache usage: 7.8%, Prefix cache hit rate: 64.1%
Qwen3.5-9B-FP8-dynamic
vllm serve /workspace/Model/Qwen3.5-9B-FP8-dynamic \
--host 0.0.0.0 --port 8001 \
--distributed-executor-backend ray \
--trust-remote-code \
--tensor-parallel-size 2 \
--gpu-memory-utilization 0.075 \
--reasoning-parser qwen3 \
--enable-auto-tool-choice \
--enable-prefix-caching \
--tool-call-parser qwen3_coder \
--default-chat-template-kwargs '{"enable_thinking": false}' \
--max-num-batched-tokens 2048 \
--max-model-len 65536 \
--kv-cache-dtype fp8 \
--max-num-seqs 10
(EngineCore pid=254) INFO 08-01 06:09:10 [kv_cache_utils.py:2168] GPU KV cache size: 88,331 tokens
(EngineCore pid=254) INFO 08-01 06:09:10 [kv_cache_utils.py:2169] Maximum concurrency for 65,536 tokens per request: 1.35x
(APIServer pid=9) INFO 08-01 06:10:55 [loggers.py:273] Engine 000: Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 33.2 tokens/s, Running: 1 reqs, Waiting: 0 reqs, GPU KV cache usage: 12.0%, Prefix cache hit rate: 0.0%, MM cache hit rate: 0.0%
I will continue updating the project and sharing tested recipes in this thread.




