<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[GPUs.market Engineering blog]]></title><description><![CDATA[GPUs.market helps teams rent production-ready GPU infrastructure across a verified global capacity network. Choose the GPU, region, pricing model, and deployment shape that fits your workload, then launch dedicated hardware with SSH access and full control over your environment.]]></description><link>https://blog.gpus.market</link><image><url>https://cdn.hashnode.com/uploads/logos/6a22b13a41d5b05f1626f42c/dea138d6-064e-4b31-ae37-75fb37b048f6.png</url><title>GPUs.market Engineering blog</title><link>https://blog.gpus.market</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 22:24:06 GMT</lastBuildDate><atom:link href="https://blog.gpus.market/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Deploying Qwen3.8-2.4T-A95B with vLLM: Verified GPU Pods, Quants, and Serving Recipes]]></title><description><![CDATA[Qwen3.8-2.4T-A95B is a 2.4-trillion-parameter Mixture-of-Experts model with roughly 95B parameters active for each token. If you're planning to self-host it, the first thing to know is that this is a ]]></description><link>https://blog.gpus.market/deploying-qwen3-8-2-4t-a95b-with-vllm-verified-gpu-pods-quants-and-serving-recipes</link><guid isPermaLink="true">https://blog.gpus.market/deploying-qwen3-8-2-4t-a95b-with-vllm-verified-gpu-pods-quants-and-serving-recipes</guid><category><![CDATA[llm]]></category><category><![CDATA[AI]]></category><category><![CDATA[#qwen]]></category><category><![CDATA[NVIDIA]]></category><category><![CDATA[#ai-tools]]></category><dc:creator><![CDATA[Nick]]></dc:creator><pubDate>Fri, 14 Aug 2026 15:40:23 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6a22b13a41d5b05f1626f42c/772d5de6-7405-416e-b280-543dc6a2cf1b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Qwen3.8-2.4T-A95B is a 2.4-trillion-parameter Mixture-of-Experts model with roughly 95B parameters active for each token. If you're planning to self-host it, the first thing to know is that this is a genuinely large distributed model: even the low-precision checkpoints are measured in terabytes.</p>
<p>The official open checkpoint is:</p>
<pre><code class="language-text">Qwen/Qwen3.8-2.4T-A95B
</code></pre>
<p>The model has 512 routed experts and selects 10 of them per token alongside one shared expert. Its 92-layer backbone mixes 69 Gated DeltaNet linear-attention layers with 23 full-attention layers, with full attention appearing every fourth layer.</p>
<p>Native context is <strong>262,144 tokens</strong>, with an extended configuration available up to roughly <strong>1.01 million tokens</strong>.</p>
<p>The open checkpoint is text-only and always uses reasoning. This is different from Qwen's hosted <code>Qwen3.8-Max</code> service, which adds features such as vision input and non-thinking mode.</p>
<p>For GPU deployment, the main decision is not whether 2.4T parameters will somehow fit. It is <strong>which precision format gives you a documented configuration on the hardware you actually have</strong>.</p>
<h2>Start with the checkpoint that matches your GPUs</h2>
<p>The practical options today are:</p>
<table>
<thead>
<tr>
<th>Your GPUs</th>
<th>Checkpoint</th>
<th>Documented setup</th>
</tr>
</thead>
<tbody><tr>
<td><strong>8× B300</strong></td>
<td><code>Inferact/Qwen3.8-2.4T-A95B-NVFP4</code></td>
<td>TP8</td>
</tr>
<tr>
<td><strong>8× GB300</strong></td>
<td><code>Inferact/Qwen3.8-2.4T-A95B-NVFP4</code></td>
<td>TP8 across two NVL4 trays</td>
</tr>
<tr>
<td><strong>16× B300</strong></td>
<td><code>Qwen/Qwen3.8-2.4T-A95B-FP8</code></td>
<td>TP16</td>
</tr>
<tr>
<td><strong>16× GB300</strong></td>
<td><code>Qwen/Qwen3.8-2.4T-A95B-FP8</code></td>
<td>TP16</td>
</tr>
<tr>
<td><strong>12× GB300</strong></td>
<td><code>Qwen/Qwen3.8-2.4T-A95B-FP8</code></td>
<td>TP4 × PP3</td>
</tr>
<tr>
<td><strong>8× MI355X</strong></td>
<td><code>Inferact/Qwen3.8-2.4T-A95B-MXFP4</code></td>
<td>TP8</td>
</tr>
</tbody></table>
<p>The full BF16 checkpoint is roughly <strong>4.45 TiB</strong>. The official FP8 version is around <strong>2.27 TiB</strong>, while the NVFP4 checkpoint used in the NVIDIA eight-GPU recipe is around <strong>1.32 TiB</strong>.</p>
<p>That is why NVFP4 is the most approachable NVIDIA deployment if your goal is simply to get Qwen3.8 running without moving immediately to a 16-GPU cluster.</p>
<p>H100, H200, A100, B200 and smaller GPU configurations are not included here. Current vLLM material contains sizing information for some of those GPUs, but not equivalent end-to-end serving recipes. This guide does not turn memory estimates into deployment claims.</p>
<h2>Before starting the model</h2>
<p>The current vLLM recipe recommends a recent nightly build rather than an older stable release.</p>
<p>Create an environment with:</p>
<pre><code class="language-bash">uv venv
source .venv/bin/activate

uv pip install -U vllm \
  --extra-index-url https://wheels.vllm.ai/nightly

uv pip install -U "transformers&gt;=5.4.0"
</code></pre>
<p>Once you have a working build, pin it. Qwen3.8 relies on recently added model and kernel support, so continuously upgrading a production server to whatever nightly happens to be current is unnecessary risk.</p>
<h2>Running Qwen3.8 on 8× B300 or GB300</h2>
<p>For NVIDIA, the smallest documented configuration uses:</p>
<pre><code class="language-text">Inferact/Qwen3.8-2.4T-A95B-NVFP4
</code></pre>
<p>with eight GPUs.</p>
<p>Start with:</p>
<pre><code class="language-bash">vllm serve Inferact/Qwen3.8-2.4T-A95B-NVFP4 \
  --tensor-parallel-size 8 \
  --max-model-len 262144 \
  --kv-cache-dtype fp8 \
  --reasoning-parser qwen3 \
  --enable-auto-tool-choice \
  --tool-call-parser qwen3_coder \
  --speculative-config '{"method":"mtp","num_speculative_tokens":3}'
</code></pre>
<p>This configuration applies to an eight-GPU B300 system and is also documented across eight GB300 GPUs spanning two NVL4 trays.</p>
<p>vLLM's optimized NVFP4 path also uses:</p>
<pre><code class="language-bash">--linear-backend flashinfer_cutedsl
</code></pre>
<p>but that flag depends on having the matching FlashInfer environment. Add it when reproducing the corresponding vLLM container/software stack rather than assuming every vLLM installation has the required backend.</p>
<h3>Keep MTP enabled when you benchmark</h3>
<p>Qwen3.8 contains a built-in Multi-Token Prediction head. vLLM's published results show that using three speculative tokens can make a substantial difference.</p>
<p>On its low-latency tests:</p>
<pre><code class="language-text">FP8 TP16
Without MTP: 130 output tok/s/user
MTP-3:       307 output tok/s/user

NVFP4 TP8
Without MTP: 133 output tok/s/user
MTP-3:       304 output tok/s/user
</code></pre>
<p>Those are measurements from vLLM's hardware and workload, not promised performance for every server. They do make MTP-3 worth testing from the beginning:</p>
<pre><code class="language-bash">--speculative-config '{"method":"mtp","num_speculative_tokens":3}'
</code></pre>
<p>Using only one speculative token performed much less convincingly in the same testing. vLLM measured 64.8% acceptance for MTP-1, and at higher concurrency the extra speculative work could actually hurt throughput.</p>
<h2>Running the official FP8 checkpoint</h2>
<p>If you want Qwen's official FP8 checkpoint:</p>
<pre><code class="language-text">Qwen/Qwen3.8-2.4T-A95B-FP8
</code></pre>
<p>the documented low-latency configuration moves to <strong>16 GPUs</strong>.</p>
<p>On B300, that normally means two eight-GPU nodes using TP16.</p>
<p>The head node runs:</p>
<pre><code class="language-bash">vllm serve Qwen/Qwen3.8-2.4T-A95B-FP8 \
  --tensor-parallel-size 16 \
  --nnodes 2 \
  --node-rank 0 \
  --master-addr $HEAD_ADDR \
  --max-model-len 262144 \
  --kv-cache-dtype fp8 \
  --reasoning-parser qwen3 \
  --enable-auto-tool-choice \
  --tool-call-parser qwen3_coder \
  --speculative-config '{"method":"mtp","num_speculative_tokens":3}'
</code></pre>
<p>The second node uses the same distributed configuration with:</p>
<pre><code class="language-bash">--node-rank 1 \
--headless
</code></pre>
<p>Only rank 0 should expose the API server.</p>
<p>There is also a verified <strong>12× GB300</strong> FP8 configuration using:</p>
<pre><code class="language-text">TP4 × PP3
</code></pre>
<p>Why not TP12? Qwen3.8 has 64 full-attention heads, so its tensor-parallel size needs to divide 64. TP12 does not.</p>
<p>vLLM verified the TP4 × PP3 layout on 12 GB300 GPUs, including model loading, CUDA graph capture and generation. It is a useful option when you have three four-GPU GB300 trays, although the ordinary TP8 and TP16 setups remain simpler.</p>
<h2>Running it on AMD</h2>
<p>The documented AMD route uses:</p>
<pre><code class="language-text">Inferact/Qwen3.8-2.4T-A95B-MXFP4
</code></pre>
<p>on <strong>8× MI355X</strong>.</p>
<pre><code class="language-bash">vllm serve Inferact/Qwen3.8-2.4T-A95B-MXFP4 \
  --tensor-parallel-size 8 \
  --enable-auto-tool-choice \
  --tool-call-parser qwen3_coder \
  --reasoning-parser qwen3 \
  --speculative-config '{"method":"mtp","num_speculative_tokens":3}'
</code></pre>
<p>One difference from the NVIDIA command is worth preserving: the current vLLM recipe does not recommend blindly adding FP8 KV cache to this ROCm setup.</p>
<p>Do not assume:</p>
<pre><code class="language-bash">--kv-cache-dtype fp8
</code></pre>
<p>works with every ROCm/vLLM combination. Add it only after confirming it on the exact software build running on the node.</p>
<p>AMD also publishes:</p>
<pre><code class="language-text">amd/Qwen3.8-2.4T-A95B-Quark-MXFP4
</code></pre>
<p>for MI350 and MI355 hardware.</p>
<p>In that conversion, routed experts use OCP MXFP4 while components such as attention, routers, the shared expert, LM head and MTP layer remain at higher precision.</p>
<p>AMD's published GSM8K reproduction reported:</p>
<pre><code class="language-text">FP8 baseline: 97.49
MXFP4:        97.49
</code></pre>
<p>That result was reproduced with SGLang at TP8 on MI35x hardware. It is evidence for the quality of AMD's quantization, not a vLLM throughput benchmark.</p>
<h2>How much context should you actually allocate?</h2>
<p>The open checkpoint natively supports:</p>
<pre><code class="language-text">262,144 tokens
</code></pre>
<p>and can be extended to about:</p>
<pre><code class="language-text">1,010,000 tokens
</code></pre>
<p>with vLLM:</p>
<pre><code class="language-bash">export VLLM_ALLOW_LONG_MAX_MODEL_LEN=1
</code></pre>
<p>and:</p>
<pre><code class="language-bash">--max-model-len 1010000 \
--hf-overrides '{"max_position_embeddings":1010000}'
</code></pre>
<p>There is little reason to enable 1M context automatically.</p>
<p>Long context consumes memory that could otherwise be used for concurrent requests. vLLM's own NVFP4 testing illustrates the tradeoff: a configuration sized around the 262K window could hold roughly 25 concurrent requests in the available KV-cache budget, while a much shorter workload around 8K input plus 1K output allowed hundreds.</p>
<p>If you're serving repository-scale coding agents, very long context may be worth the cost. If most requests are 10K or 20K tokens, reserving for one million tokens mostly reduces how many users the GPUs can serve at once.</p>
<p>Set:</p>
<pre><code class="language-bash">--max-model-len
</code></pre>
<p>for the workload you actually expect.</p>
<h2>Reasoning and tool calling</h2>
<p>Qwen3.8 is a reasoning model. The open checkpoint does not expose a normal non-thinking mode.</p>
<p>It supports three reasoning-effort settings:</p>
<pre><code class="language-text">xhigh
medium
low
</code></pre>
<p><code>xhigh</code> is the default.</p>
<p>Qwen also preserves thinking across turns by default, which matters for agentic sessions where earlier reasoning and tool interactions are part of the ongoing context.</p>
<p>Start vLLM with:</p>
<pre><code class="language-bash">--reasoning-parser qwen3 \
--enable-auto-tool-choice \
--tool-call-parser qwen3_coder
</code></pre>
<p>Qwen's recommended generation settings include:</p>
<pre><code class="language-text">temperature = 1.0
top_p = 0.95
top_k = 20
min_p = 0.0
presence_penalty = 0.0
repetition_penalty = 1.0
</code></pre>
<p>A normal OpenAI-compatible client looks like:</p>
<pre><code class="language-python">from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="EMPTY",
    timeout=3600,
)

response = client.chat.completions.create(
    model="Inferact/Qwen3.8-2.4T-A95B-NVFP4",
    messages=[
        {
            "role": "user",
            "content": "Review this distributed queue design and identify its failure modes."
        }
    ],
    reasoning_effort="medium",
    temperature=1.0,
    top_p=0.95,
    max_tokens=16384,
)

print(response.choices[0].message)
</code></pre>
<p>For hard coding and agent tasks, leave enough output budget for the reasoning trace. An aggressive <code>max_tokens</code> limit can terminate the generation before the model reaches its final answer.</p>
<h2>Loading a model this large</h2>
<p>At Qwen3.8's scale, startup time becomes part of operating the server.</p>
<p>vLLM's NVFP4 testing found that:</p>
<pre><code class="language-bash">--load-format fastsafetensors \
--safetensors-load-strategy lazy
</code></pre>
<p>reduced model load time from <strong>545 seconds to 306 seconds</strong> on the shared storage used in that test.</p>
<p>That result will vary with storage performance, but persistent model storage is clearly preferable to downloading or repeatedly copying a terabyte-scale checkpoint whenever a machine restarts.</p>
<p>vLLM also uses a larger engine startup timeout:</p>
<pre><code class="language-bash">export VLLM_ENGINE_READY_TIMEOUT_S=3600
</code></pre>
<p>And don't make your own readiness decision solely from whether the process is alive. Send a small request to:</p>
<pre><code class="language-text">/v1/chat/completions
</code></pre>
<p>and verify that the model can actually generate.</p>
<h2>Which GPU setup should you use?</h2>
<p>If you're renting GPUs specifically for Qwen3.8-2.4T-A95B, the current documented choices are fairly straightforward.</p>
<p><strong>8× B300 + NVFP4</strong> is the simplest NVIDIA configuration in the current vLLM recipe.</p>
<p><strong>8× GB300 + NVFP4</strong> gives you the equivalent Grace Blackwell path across two NVL4 trays.</p>
<p>Use <strong>16× B300 or GB300 + FP8</strong> when you specifically want the official FP8 checkpoint and have enough hardware for TP16.</p>
<p>If you have three GB300 trays, <strong>12× GB300 FP8 with TP4 × PP3</strong> is an upstream-verified alternative.</p>
<p>On AMD, use <strong>8× MI355X + MXFP4</strong>.</p>
<p>H100, H200, A100, B200 and smaller GPU counts are intentionally not recommended here. There may be enough aggregate memory in some of those configurations, but the current sources do not provide the same reproducible end-to-end deployment evidence.</p>
<p>For Qwen3.8, choosing the GPUs is only part of the deployment. The exact quant, tensor-parallel layout, KV-cache budget, vLLM build, network topology and MTP configuration all affect whether the resulting server is useful once real traffic starts hitting it.</p>
<h2>Sources</h2>
<h3>Qwen</h3>
<ul>
<li><p><strong>Qwen3.8-2.4T-A95B official model card</strong><br /><a href="https://huggingface.co/Qwen/Qwen3.8-2.4T-A95B">https://huggingface.co/Qwen/Qwen3.8-2.4T-A95B</a></p>
</li>
<li><p><strong>Official FP8 checkpoint</strong><br /><a href="https://huggingface.co/Qwen/Qwen3.8-2.4T-A95B-FP8">https://huggingface.co/Qwen/Qwen3.8-2.4T-A95B-FP8</a></p>
</li>
</ul>
<h3>vLLM</h3>
<ul>
<li><p><strong>Official Qwen3.8-2.4T-A95B deployment recipe</strong><br /><a href="https://recipes.vllm.ai/Qwen/Qwen3.8-2.4T-A95B">https://recipes.vllm.ai/Qwen/Qwen3.8-2.4T-A95B</a></p>
</li>
<li><p><strong>vLLM Qwen3.8 launch notes and benchmarks</strong><br /><a href="https://vllm.ai/blog/2026-08-12-qwen3.8">https://vllm.ai/blog/2026-08-12-qwen3.8</a></p>
</li>
</ul>
<h3>NVIDIA / Inferact</h3>
<ul>
<li><p><strong>Qwen3.8 NVFP4 checkpoint</strong><br /><a href="https://huggingface.co/Inferact/Qwen3.8-2.4T-A95B-NVFP4">https://huggingface.co/Inferact/Qwen3.8-2.4T-A95B-NVFP4</a></p>
</li>
<li><p><strong>Qwen3.8 MXFP4 checkpoint</strong><br /><a href="https://huggingface.co/Inferact/Qwen3.8-2.4T-A95B-MXFP4">https://huggingface.co/Inferact/Qwen3.8-2.4T-A95B-MXFP4</a></p>
</li>
</ul>
<h3>AMD</h3>
<ul>
<li><strong>AMD Qwen3.8 Quark MXFP4 checkpoint</strong><br /><a href="https://huggingface.co/amd/Qwen3.8-2.4T-A95B-Quark-MXFP4">https://huggingface.co/amd/Qwen3.8-2.4T-A95B-Quark-MXFP4</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Deploying Kimi K3 with vLLM: Verified GPU Pods, Quants, and Serving Recipes]]></title><description><![CDATA[Kimi K3 is Moonshot AI's 2.8-trillion-parameter Mixture-of-Experts model for coding, reasoning, agents, and multimodal work. It activates 16 of 896 routed experts for each token and supports a native ]]></description><link>https://blog.gpus.market/deploying-kimi-k3-with-vllm-verified-gpu-pods-quants-and-serving-recipes</link><guid isPermaLink="true">https://blog.gpus.market/deploying-kimi-k3-with-vllm-verified-gpu-pods-quants-and-serving-recipes</guid><category><![CDATA[llm]]></category><category><![CDATA[AI]]></category><category><![CDATA[NVIDIA]]></category><category><![CDATA[Kimi]]></category><category><![CDATA[kimi-k3]]></category><dc:creator><![CDATA[Nick]]></dc:creator><pubDate>Fri, 14 Aug 2026 14:40:46 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6a22b13a41d5b05f1626f42c/2a147411-a5ed-4a42-81a9-d0f801194fda.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Kimi K3 is Moonshot AI's 2.8-trillion-parameter Mixture-of-Experts model for coding, reasoning, agents, and multimodal work. It activates 16 of 896 routed experts for each token and supports a native context window of <strong>1,048,576 tokens</strong>.</p>
<p>The official checkpoint is:</p>
<pre><code class="language-text">moonshotai/Kimi-K3
</code></pre>
<p>K3 is unusual in that the released model is already designed around low-precision inference. Moonshot uses quantization-aware training, and the checkpoint ships with <strong>MXFP4 weights and MXFP8 activations</strong>. There is no separate "find a good 4-bit quant first" step before serving it.</p>
<p>Its attention stack combines Kimi Delta Attention, or KDA, with periodic full-attention layers. KDA keeps recurrent state rather than growing a conventional KV cache at every layer, which is part of what makes the million-token context window feasible.</p>
<p>If you're renting GPUs specifically to run Kimi K3, the hardware choices are fairly narrow. This is not a model where adding up VRAM across a few H100s is enough to decide whether a pod will work.</p>
<h2>Start with the native Moonshot checkpoint</h2>
<p>There are a few K3 variants, but the native release has the cleanest deployment path:</p>
<table>
<thead>
<tr>
<th>Checkpoint</th>
<th>What it is</th>
<th>Where it makes sense</th>
</tr>
</thead>
<tbody><tr>
<td><code>moonshotai/Kimi-K3</code></td>
<td>Native MXFP4 + MXFP8</td>
<td><strong>Best starting point</strong></td>
</tr>
<tr>
<td><code>RedHatAI/Kimi-K3-NVFP4</code></td>
<td>NVFP4 MoE conversion</td>
<td>NVIDIA NVFP4 experiments</td>
</tr>
<tr>
<td><code>amd/Kimi-K3-Quark-MXFP4-AttnFP8</code></td>
<td>MXFP4 experts + FP8 attention</td>
<td>AMD MI350 / MI355</td>
</tr>
</tbody></table>
<p>Red Hat's NVFP4 conversion is intended for vLLM, but its model card still carries compatibility notes around upstream support.</p>
<p>AMD's Quark checkpoint is vendor-published and has useful accuracy results, but its current reproduction path requires a small vLLM modification. Unless that particular quant is the reason you're deploying K3, bring up the native checkpoint first.</p>
<h2>The vLLM environment</h2>
<p>The current K3 recipe uses <strong>vLLM 0.27.1 or newer</strong> and provides dedicated images rather than expecting you to assemble all of the model-specific kernels yourself.</p>
<p>For NVIDIA:</p>
<pre><code class="language-text">vllm/vllm-openai:kimi-k3
</code></pre>
<p>For AMD:</p>
<pre><code class="language-text">vllm/vllm-openai_rocm:kimi-k3
</code></pre>
<p>The NVIDIA image currently uses CUDA 13, so the host needs an <strong>R580-series or newer NVIDIA driver</strong>.</p>
<p>With a model this large, using the dedicated image is worth it. K3 depends on several specialized attention, MoE, loading, and communication paths, and reproducing those from an arbitrary vLLM install adds failure points before the model even starts loading.</p>
<h2>Which GPUs can you actually use?</h2>
<p>The current upstream deployment paths are:</p>
<table>
<thead>
<tr>
<th>Hardware</th>
<th>Documented K3 setup</th>
</tr>
</thead>
<tbody><tr>
<td><strong>8× B300</strong></td>
<td>TP8, straightforward NVIDIA deployment</td>
</tr>
<tr>
<td><strong>8× GB300</strong></td>
<td>TP8, Grace Blackwell / NVL path</td>
</tr>
<tr>
<td><strong>16× B200</strong></td>
<td>TP8 × PP2 across multiple nodes</td>
</tr>
<tr>
<td><strong>8× MI355X</strong></td>
<td>TP8 ROCm deployment</td>
</tr>
<tr>
<td><strong>8× MI350X</strong></td>
<td>Supported ROCm hardware path</td>
</tr>
<tr>
<td><strong>16× GB200</strong></td>
<td>NVIDIA Dynamo production deployment</td>
</tr>
<tr>
<td><strong>32× GB200</strong></td>
<td>Disaggregated prefill/decode</td>
</tr>
<tr>
<td><strong>16× GB300</strong></td>
<td>Two TP8 production replicas</td>
</tr>
<tr>
<td><strong>24× GB300</strong></td>
<td>8 prefill + 16 decode</td>
</tr>
</tbody></table>
<p>H200, H100, A100, and 8× B200 are deliberately missing from that list.</p>
<p>There is an open vLLM Recipes issue around the published H200 path involving an OOM followed by a context-parallel runtime error. That does not prove K3 is impossible on H200; it does mean there is not a clean upstream recipe worth relying on today.</p>
<p>Likewise, the documented B200 configuration is <strong>16 GPUs</strong>, not eight. A large aggregate VRAM number is not enough reason to turn an 8× B200 pod into a K3 recommendation.</p>
<h2>Running K3 on 8× B300 or GB300</h2>
<p>For NVIDIA, this is the simplest place to begin.</p>
<p>The official vLLM quick-start is:</p>
<pre><code class="language-bash">vllm serve moonshotai/Kimi-K3 \
  --tensor-parallel-size 8 \
  --trust-remote-code \
  --load-format fastsafetensors \
  --enable-prefix-caching \
  --enable-auto-tool-choice \
  --tool-call-parser kimi_k3 \
  --reasoning-parser kimi_k3
</code></pre>
<p><code>fastsafetensors</code> matters more than usual here because the K3 repository is enormous. Model-loading speed becomes part of the deployment experience.</p>
<p>Prefix caching is also worth enabling deliberately:</p>
<pre><code class="language-bash">--enable-prefix-caching
</code></pre>
<p>K3 has a hybrid cache: recurrent KDA state in most layers and conventional KV cache in the full-attention layers. vLLM knows how to handle that hybrid structure, but prefix caching is not something to assume is active unless it has been enabled.</p>
<p>If you want FP8 KV cache, use:</p>
<pre><code class="language-bash">--kv-cache-dtype fp8
</code></pre>
<p>with the attention configuration from the K3 recipe:</p>
<pre><code class="language-bash">--attention-config '{"use_prefill_query_quantization":true,"mla_prefill_backend":"flashinfer"}'
</code></pre>
<p>A fuller server command becomes:</p>
<pre><code class="language-bash">vllm serve moonshotai/Kimi-K3 \
  --host 0.0.0.0 \
  --port 8000 \
  --served-model-name kimi-k3 \
  --tensor-parallel-size 8 \
  --trust-remote-code \
  --load-format fastsafetensors \
  --kv-cache-dtype fp8 \
  --attention-config '{"use_prefill_query_quantization":true,"mla_prefill_backend":"flashinfer"}' \
  --enable-prefix-caching \
  --enable-auto-tool-choice \
  --tool-call-parser kimi_k3 \
  --reasoning-parser kimi_k3
</code></pre>
<p>On GB200 and GB300 NVLink systems, the current recipe also recommends:</p>
<pre><code class="language-bash">export NCCL_MNNVL_ENABLE=1
export NCCL_CUMEM_ENABLE=1
export NCCL_NVLS_ENABLE=1
</code></pre>
<p>Those variables belong to the NVLink setup; they are not generic flags to copy onto unrelated PCIe hardware.</p>
<h2>If you have B200, plan for 16 GPUs</h2>
<p>K3's documented B200 deployment uses:</p>
<pre><code class="language-text">16× B200
TP8 × PP2
</code></pre>
<p>So the model is split with tensor parallelism across eight GPUs and pipeline parallelism across two stages.</p>
<p>The serving configuration includes:</p>
<pre><code class="language-bash">vllm serve moonshotai/Kimi-K3 \
  --host 0.0.0.0 \
  --port 8000 \
  --served-model-name kimi-k3 \
  --tensor-parallel-size 8 \
  --pipeline-parallel-size 2 \
  --trust-remote-code \
  --load-format fastsafetensors \
  --kv-cache-dtype fp8 \
  --attention-config '{"use_prefill_query_quantization":true,"mla_prefill_backend":"flashinfer"}' \
  --enable-prefix-caching \
  --enable-auto-tool-choice \
  --tool-call-parser kimi_k3 \
  --reasoning-parser kimi_k3
</code></pre>
<p>That is only the model-side configuration. A 16-GPU deployment still needs the nodes, ranks, and network interfaces configured correctly for distributed vLLM.</p>
<p>If your provider only offers an eight-GPU B200 pod, do not assume that the same command with <code>--pipeline-parallel-size 1</code> gives you an equivalent supported setup. It does not match the published topology.</p>
<h2>Running K3 on AMD</h2>
<p>The clean AMD route uses <strong>8× MI355X or MI350X</strong> and the native Moonshot checkpoint.</p>
<p>A starting MI355X configuration is:</p>
<pre><code class="language-bash">export VLLM_ROCM_USE_AITER=1
export SAFETENSORS_FAST_GPU=1
export VLLM_USE_BREAKABLE_CUDAGRAPH=0

vllm serve moonshotai/Kimi-K3 \
  --host 0.0.0.0 \
  --port 8000 \
  --served-model-name kimi-k3 \
  --trust-remote-code \
  --tensor-parallel-size 8 \
  --load-format auto \
  --gpu-memory-utilization 0.95 \
  --mm-encoder-tp-mode data \
  --max-num-seqs 128 \
  --max-num-batched-tokens 4096 \
  --enable-auto-tool-choice \
  --tool-call-parser kimi_k3 \
  --reasoning-parser kimi_k3
</code></pre>
<p>The vision encoder is handled differently from the language model because it is tiny by comparison and does not benefit from being split in the same way across TP8.</p>
<p>AMD also publishes:</p>
<pre><code class="language-text">amd/Kimi-K3-Quark-MXFP4-AttnFP8
</code></pre>
<p>for MI350 and MI355. It stores the experts and shared experts in OCP MXFP4 while keeping attention in FP8.</p>
<p>AMD reports <strong>96.36 on 5-shot GSM8K versus 96.82 for the native model</strong> in its published evaluation.</p>
<p>The catch is that the current reproduction instructions ask you to modify vLLM's <code>quark_ocp_mx.py</code> and set:</p>
<pre><code class="language-python">self.emulate = True
</code></pre>
<p>That is manageable if you're building your own image, but it is one more moving part. The native K3 checkpoint is the simpler deployment if you just want the model running.</p>
<h2>DSpark can make decoding much faster</h2>
<p>K3 has an open DSpark draft model:</p>
<pre><code class="language-text">Inferact/Kimi-K3-DSpark
</code></pre>
<p>Add it to a compatible deployment with:</p>
<pre><code class="language-bash">--speculative-config '{"model":"Inferact/Kimi-K3-DSpark","method":"dspark","num_speculative_tokens":7,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"block"}'
</code></pre>
<p>vLLM's GB300 testing reported:</p>
<pre><code class="language-text">TP16 without DSpark: 118 tok/s
TP16 with DSpark:    370 tok/s
</code></pre>
<p>That is about a <strong>3.1× increase in single-stream decode speed</strong> in that specific test.</p>
<p>It is worth testing if decode latency matters, but don't budget a deployment around "3× faster" before measuring your own prompts. Speculative decoding depends on how often the draft model's tokens are accepted.</p>
<h2>The million-token context is real, but expensive</h2>
<p>K3 supports:</p>
<pre><code class="language-text">1,048,576 tokens
</code></pre>
<p>natively.</p>
<p>Most of its layers use KDA recurrent state rather than a conventional ever-growing KV cache, while periodic full-attention layers preserve global recall. This gives K3 a much better long-context memory profile than a model where every layer uses ordinary full attention.</p>
<p>It still does not make a million-token request cheap.</p>
<p>Long context competes with concurrent users, output tokens, model buffers, attention state, and everything else living in GPU memory. A K3 pod that works well for 32K or 128K requests does not automatically have useful concurrency at 1M.</p>
<p>Set the context limit around what you're actually doing with the model. If the endpoint is for codebase-scale agents, long context may be worth the trade. If most requests are relatively short, giving every request access to a million tokens mostly consumes capacity that could have served other requests.</p>
<h2>Reasoning and tool calls need one K3-specific detail</h2>
<p>K3 exposes its reasoning in:</p>
<pre><code class="language-text">reasoning_content
</code></pre>
<p>and supports:</p>
<pre><code class="language-text">low
high
max
</code></pre>
<p>for <code>reasoning_effort</code>.</p>
<p><code>max</code> is the default.</p>
<p>vLLM needs:</p>
<pre><code class="language-bash">--reasoning-parser kimi_k3 \
--tool-call-parser kimi_k3 \
--enable-auto-tool-choice
</code></pre>
<p>There is one behavior that matters a lot if you're building agents: <strong>K3 was trained with preserved thinking history</strong>.</p>
<p>When the assistant has already made a tool call or completed a reasoning turn, send the complete previous assistant message back on the next turn, including:</p>
<pre><code class="language-text">reasoning_content
content
tool_calls
</code></pre>
<p>Saving only the visible <code>content</code> throws away information the model expects to see in a multi-turn agent session.</p>
<p>Tool-call output should also be schema-validated before execution. vLLM notes that K3 can occasionally emit a tool-call shape that its parser does not accept cleanly. If the generated call is malformed, reject or retry it rather than sending malformed arguments into a real tool.</p>
<h2>K3 can take images too</h2>
<p>The native checkpoint is multimodal, so the same server can accept text and image input through the OpenAI-compatible API:</p>
<pre><code class="language-python">from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="EMPTY",
    timeout=3600,
)

response = client.chat.completions.create(
    model="kimi-k3",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://example.com/image.png"
                    }
                },
                {
                    "type": "text",
                    "text": "Explain what is happening in this image."
                }
            ]
        }
    ],
    max_tokens=2048,
)

print(response.choices[0].message.content)
</code></pre>
<p>That makes one K3 deployment useful for coding agents that also need to inspect screenshots, diagrams, UI states, or other visual input.</p>
<h2>When 8 GPUs are no longer enough</h2>
<p>For larger shared services, NVIDIA Dynamo publishes K3 deployments on GB200 and GB300 NVL72 systems:</p>
<pre><code class="language-text">16× GB200    aggregated TP16
32× GB200    16 prefill + 16 decode

16× GB300    two TP8 replicas
24× GB300    8 prefill + 16 decode
</code></pre>
<p>Those are not just bigger versions of the <code>vllm serve</code> command above. Dynamo adds routing, distributed serving, and KV transfer between workers.</p>
<p>If you're bringing up one K3 endpoint, start with 8× B300/GB300 or 8× MI355X. Dynamo starts making sense when the problem changes from "run the model" to "serve substantial shared traffic."</p>
<h2>Which K3 setup should you choose?</h2>
<p>If you're selecting GPUs for K3 today, the simplest documented choices are:</p>
<p><strong>NVIDIA:</strong> use <strong>8× B300 or 8× GB300</strong> with the native Moonshot checkpoint.</p>
<p><strong>B200:</strong> the published route is <strong>16× B200</strong>, using TP8 × PP2.</p>
<p><strong>AMD:</strong> use <strong>8× MI355X or MI350X</strong> with the native checkpoint.</p>
<p>The alternative NVFP4 and Quark checkpoints are worth testing when you have a specific reason to optimize around those formats. DSpark is worth benchmarking once the baseline server is stable.</p>
<p>H200, H100, A100, and 8× B200 should not be treated as equivalent alternatives just because their aggregate memory looks plausible. The current upstream deployment evidence is not at the same level.</p>
<p>For Kimi K3, a useful GPU setup is one that can reproduce the model load, context length, reasoning parser, tool calls, multimodal input, concurrency, and sustained generation on a pinned runtime. That's the standard that matters once you're paying for the GPUs.</p>
<h2>Sources</h2>
<h3>Moonshot AI</h3>
<ul>
<li><p><strong>Kimi K3 official model card</strong><br /><a href="https://huggingface.co/moonshotai/Kimi-K3">https://huggingface.co/moonshotai/Kimi-K3</a></p>
</li>
<li><p><strong>Moonshot AI</strong><br /><a href="https://www.moonshot.ai/">https://www.moonshot.ai/</a></p>
</li>
</ul>
<h3>vLLM</h3>
<ul>
<li><p><strong>Official Kimi K3 deployment recipe</strong><br /><a href="https://recipes.vllm.ai/moonshotai/Kimi-K3">https://recipes.vllm.ai/moonshotai/Kimi-K3</a></p>
</li>
<li><p><strong>Kimi K3 launch guide and benchmarks</strong><br /><a href="https://vllm.ai/blog/2026-07-27-k3">https://vllm.ai/blog/2026-07-27-k3</a></p>
</li>
<li><p><strong>Current H200 deployment issue</strong><br /><a href="https://github.com/vllm-project/recipes/issues/698">https://github.com/vllm-project/recipes/issues/698</a></p>
</li>
</ul>
<h3>NVIDIA</h3>
<ul>
<li><strong>NVIDIA Dynamo Kimi K3 production recipes</strong><br /><a href="https://docs.nvidia.com/dynamo/dev/recipes/kimi-k3">https://docs.nvidia.com/dynamo/dev/recipes/kimi-k3</a></li>
</ul>
<h3>AMD</h3>
<ul>
<li><strong>AMD Kimi K3 Quark MXFP4 + FP8 checkpoint</strong><br /><a href="https://huggingface.co/amd/Kimi-K3-Quark-MXFP4-AttnFP8">https://huggingface.co/amd/Kimi-K3-Quark-MXFP4-AttnFP8</a></li>
</ul>
<h3>Alternative Quantization</h3>
<ul>
<li><strong>Red Hat Kimi K3 NVFP4</strong><br /><a href="https://huggingface.co/RedHatAI/Kimi-K3-NVFP4">https://huggingface.co/RedHatAI/Kimi-K3-NVFP4</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Running GLM-5.2 in Production with vLLM: Quants, GPU Pods, and Verified Serving Recipes]]></title><description><![CDATA[GLM-5.2 is Z.ai’s 743B-parameter Mixture-of-Experts model for coding, reasoning, and long-running agent workflows. Only about 39B parameters are active for each token, and the model supports a native ]]></description><link>https://blog.gpus.market/running-glm-5-2-in-production-with-vllm-quants-gpu-pods-and-verified-serving-recipes</link><guid isPermaLink="true">https://blog.gpus.market/running-glm-5-2-in-production-with-vllm-quants-gpu-pods-and-verified-serving-recipes</guid><category><![CDATA[llm]]></category><category><![CDATA[AI]]></category><category><![CDATA[#ai-tools]]></category><category><![CDATA[NVIDIA]]></category><category><![CDATA[vLLM]]></category><category><![CDATA[glm-5]]></category><dc:creator><![CDATA[Nick]]></dc:creator><pubDate>Fri, 14 Aug 2026 13:20:19 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6a22b13a41d5b05f1626f42c/b0fe64b1-9054-419a-89f7-592086c555c3.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>GLM-5.2 is Z.ai’s 743B-parameter Mixture-of-Experts model for coding, reasoning, and long-running agent workflows. Only about <strong>39B parameters are active for each token</strong>, and the model supports a native context window of <strong>1,048,576 tokens</strong>.</p>
<p>If you are renting GPUs to run it yourself, two parts of the architecture matter more than the raw parameter count.</p>
<p>The first is <strong>IndexShare</strong>. Instead of running a separate sparse-attention indexer in every layer, GLM-5.2 reuses one indexer across groups of four layers. Z.ai reports that this cuts per-token FLOPs by about <strong>2.9× at 1M context</strong>.</p>
<p>The second is <strong>Multi-Token Prediction</strong>, or MTP. GLM-5.2 can draft up to five tokens ahead during decoding. Z.ai reports roughly a 20% increase in accepted draft length over the previous GLM generation. Whether that produces a worthwhile speedup on your server still depends on how often those draft tokens are accepted on your actual prompts.</p>
<p>For most vLLM deployments, start with:</p>
<pre><code class="language-text">zai-org/GLM-5.2-FP8
</code></pre>
<p>The FP8 checkpoint is much easier to deploy than the full BF16 model and has the broadest set of published GPU recipes.</p>
<h2>Which checkpoint fits your hardware?</h2>
<p>The main choices are:</p>
<table>
<thead>
<tr>
<th>Checkpoint</th>
<th>Approx. size</th>
<th>Where it makes sense</th>
</tr>
</thead>
<tbody><tr>
<td><code>zai-org/GLM-5.2</code></td>
<td>~1.51 TB</td>
<td>BF16, large multi-node setups</td>
</tr>
<tr>
<td><code>zai-org/GLM-5.2-FP8</code></td>
<td>~756 GB</td>
<td><strong>Best default for NVIDIA and AMD</strong></td>
</tr>
<tr>
<td><code>nvidia/GLM-5.2-NVFP4</code></td>
<td>~465 GB</td>
<td>B200 / B300</td>
</tr>
<tr>
<td><code>amd/GLM-5.2-MXFP4</code></td>
<td>~438 GB</td>
<td>MI355X</td>
</tr>
</tbody></table>
<p>If you simply want to get GLM-5.2 running, FP8 is the least complicated starting point.</p>
<p>The full BF16 checkpoint needs a larger multi-node configuration and extra loader setup, so there is little reason to begin there unless BF16 is specifically required.</p>
<p>NVIDIA’s NVFP4 checkpoint is interesting on Blackwell because it reduces the model footprint substantially. AMD has a separate MXFP4 checkpoint for MI355X.</p>
<h2>Set up vLLM before renting a long-lived pod</h2>
<p>The current GLM-5.2 recipe uses:</p>
<pre><code class="language-text">vLLM 0.23.0
</code></pre>
<p>as its stable baseline.</p>
<p>Install it with:</p>
<pre><code class="language-bash">uv venv
source .venv/bin/activate

uv pip install "vllm==0.23.0" --torch-backend=auto
uv pip install "transformers&gt;=5.9.0"
</code></pre>
<p>There are also dedicated Docker images:</p>
<pre><code class="language-text">vllm/vllm-openai:glm52
</code></pre>
<p>or, for CUDA 12.x:</p>
<pre><code class="language-text">vllm/vllm-openai:glm52-cu129
</code></pre>
<p>A basic launch looks like:</p>
<pre><code class="language-bash">docker run --gpus all \
  -p 8000:8000 \
  --ipc=host \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  vllm/vllm-openai:glm52 \
  zai-org/GLM-5.2-FP8 \
  --tensor-parallel-size 8 \
  --tool-call-parser glm47 \
  --reasoning-parser glm45 \
  --enable-auto-tool-choice \
  --served-model-name glm-5.2-fp8 \
  --max-model-len 131072
</code></pre>
<p>For good FP8 performance, the current recipe also expects <strong>DeepGEMM</strong>. Install it using the <code>install_deepgemm.sh</code> helper supplied by the vLLM setup.</p>
<p>One version caveat is worth knowing before debugging speculative decoding: if you need <strong>tool calling and MTP at the same time</strong>, the current vLLM guidance points to the latest <code>main</code> branch because not every relevant fix is present in 0.23.0.</p>
<h2>Which GPUs should you rent?</h2>
<p>These are the useful upstream-backed configurations:</p>
<table>
<thead>
<tr>
<th>Hardware</th>
<th>Checkpoint</th>
<th>Published setup</th>
</tr>
</thead>
<tbody><tr>
<td><strong>8× H200</strong></td>
<td>FP8</td>
<td>TP8</td>
</tr>
<tr>
<td><strong>8× H20</strong></td>
<td>FP8</td>
<td>TP8 + DSpark</td>
</tr>
<tr>
<td><strong>8× B200</strong></td>
<td>FP8</td>
<td>Full 1M-context recipe</td>
</tr>
<tr>
<td><strong>8× B200 / B300</strong></td>
<td>NVIDIA NVFP4</td>
<td>TP8</td>
</tr>
<tr>
<td><strong>8× MI300X</strong></td>
<td>FP8</td>
<td>ROCm + AITER</td>
</tr>
<tr>
<td><strong>8× MI355X</strong></td>
<td>FP8</td>
<td>ROCm + AITER</td>
</tr>
<tr>
<td><strong>8× MI355X</strong></td>
<td>AMD MXFP4</td>
<td>TP8</td>
</tr>
</tbody></table>
<p>H100, A100, 4× H200, and smaller B200 configurations are deliberately not included here. They may be possible, but the current GLM-5.2 recipe does not provide an equivalent end-to-end deployment path for them.</p>
<p>That distinction matters if you are paying by the hour. A configuration that looks plausible from VRAM alone is not the same thing as one with a published runtime, kernel path, and serving command.</p>
<h2>8× H200 is the straightforward NVIDIA setup</h2>
<p>For normal FP8 serving on Hopper, the published recipe uses TP8, FP8 KV cache, and GLM-5.2’s five-token MTP head:</p>
<pre><code class="language-bash">vllm serve zai-org/GLM-5.2-FP8 \
  --kv-cache-dtype fp8 \
  --tensor-parallel-size 8 \
  --speculative-config.method mtp \
  --speculative-config.num_speculative_tokens 5 \
  --tool-call-parser glm47 \
  --reasoning-parser glm45 \
  --enable-auto-tool-choice \
  --served-model-name glm-5.2-fp8
</code></pre>
<p>If you want a conventional NVIDIA pod and do not need the full million-token context window, this is the cleanest place to start.</p>
<h2>H20 has a separate DSpark path</h2>
<p>On 8× H20, vLLM publishes a recipe using an external DSpark speculator rather than the built-in MTP head:</p>
<pre><code class="language-bash">vllm serve zai-org/GLM-5.2-FP8 \
  --tensor-parallel-size 8 \
  --tool-call-parser glm47 \
  --reasoning-parser glm45 \
  --enable-auto-tool-choice \
  --max-model-len 200000 \
  --max-num-seqs 16 \
  --max-num-batched-tokens 32768 \
  --speculative-config '{"model":"RedHatAI/GLM-5.2-speculator.dspark","num_speculative_tokens":7,"method":"dspark"}' \
  --served-model-name glm-5.2-fp8
</code></pre>
<p>vLLM reports <strong>70+ tokens/sec for a single request</strong> on this setup.</p>
<p>Treat that as a result from their exact configuration, not as the number every H20 rental will produce.</p>
<h2>If you actually need 1M context, use the B200 recipe</h2>
<p>The important full-context NVIDIA setup is:</p>
<pre><code class="language-text">8× B200
GLM-5.2-FP8
FP8 KV cache
</code></pre>
<p>Run:</p>
<pre><code class="language-bash">VLLM_DEEP_GEMM_WARMUP=skip \
vllm serve zai-org/GLM-5.2-FP8 \
  --kv-cache-dtype fp8_e4m3 \
  --tensor-parallel-size 8 \
  --speculative-config.method mtp \
  --speculative-config.num_speculative_tokens 5 \
  --max-num-seqs 32 \
  --tool-call-parser glm47 \
  --reasoning-parser glm45 \
  --enable-auto-tool-choice \
  --served-model-name glm-5.2-fp8
</code></pre>
<p>The setting to pay attention to here is:</p>
<pre><code class="language-bash">--max-num-seqs 32
</code></pre>
<p>Every active request competes for the same KV-cache budget. If long-context requests start running out of memory, lower this value. If your prompts are shorter, you can usually afford more concurrency.</p>
<p>FP8 KV cache is also a major part of this configuration:</p>
<pre><code class="language-bash">--kv-cache-dtype fp8_e4m3
</code></pre>
<p>It cuts the cache footprint enough to make the million-token window practical on the published B200 setup.</p>
<p><code>VLLM_DEEP_GEMM_WARMUP=skip</code> reduces startup time by skipping the initial DeepGEMM JIT warmup. Kernels then compile as requests begin arriving.</p>
<h2>Blackwell users can trade FP8 for NVFP4</h2>
<p>NVIDIA publishes:</p>
<pre><code class="language-text">nvidia/GLM-5.2-NVFP4
</code></pre>
<p>for B200 and B300.</p>
<p>This is an NVIDIA Model Optimizer conversion, not a random community quant. The MoE expert linear layers move to NVFP4, while components such as the shared expert, attention, embeddings, and other parts of the model remain at higher precision.</p>
<p>Serve it with:</p>
<pre><code class="language-bash">vllm serve nvidia/GLM-5.2-NVFP4 \
  --tensor-parallel-size 8 \
  --enable-expert-parallel \
  --trust-remote-code \
  --reasoning-parser glm45 \
  --tool-call-parser glm47 \
  --enable-auto-tool-choice \
  --kv-cache-dtype fp8_e4m3 \
  --host 0.0.0.0 \
  --port 8000
</code></pre>
<p>You do not need:</p>
<pre><code class="language-bash">--quantization nvfp4
</code></pre>
<p>because vLLM reads the quantization configuration from the checkpoint itself.</p>
<p>If you are choosing between FP8 and NVFP4 on Blackwell, NVFP4 is the option to test when model footprint matters more than sticking to the native FP8 release.</p>
<h2>Running GLM-5.2 on AMD</h2>
<p>For MI300X and MI355X, the FP8 route uses AMD’s AITER kernels:</p>
<pre><code class="language-bash">VLLM_ROCM_USE_AITER=1 \
VLLM_ROCM_USE_AITER_FUSION_SHARED_EXPERTS=1 \
vllm serve zai-org/GLM-5.2-FP8 \
  --kv-cache-dtype fp8_e4m3 \
  --tensor-parallel-size 8 \
  --speculative-config.method mtp \
  --speculative-config.num_speculative_tokens 5 \
  --tool-call-parser glm47 \
  --reasoning-parser glm45 \
  --enable-auto-tool-choice \
  --gpu-memory-utilization 0.80 \
  --max-model-len 524288 \
  --max-num-seqs 32 \
  --linear-backend aiter \
  --moe-backend aiter
</code></pre>
<p>The published starting context here is <strong>524,288 tokens</strong>. That is not the model’s maximum; GLM-5.2 still supports 1M. Increase it only after confirming that the server has enough KV-cache headroom.</p>
<p>The <code>0.80</code> GPU-memory utilization value is also intentional. It leaves space for ROCm runtime allocations and MTP graph capture instead of trying to occupy virtually every byte of HBM on startup.</p>
<h3>MI355X also has an MXFP4 option</h3>
<p>AMD publishes:</p>
<pre><code class="language-text">amd/GLM-5.2-MXFP4
</code></pre>
<p>and the current recipe uses <strong>8× MI355X with TP8</strong>:</p>
<pre><code class="language-bash">export HIP_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
export VLLM_ROCM_USE_AITER=1
export VLLM_ROCM_USE_AITER_FUSION_SHARED_EXPERTS=1
export VLLM_USE_V2_MODEL_RUNNER=1
export VLLM_ROCM_USE_AITER_FP8BMM=0
export VLLM_ROCM_USE_AITER_FP4BMM=0

vllm serve amd/GLM-5.2-MXFP4 \
  --trust-remote-code \
  --kv-cache-dtype fp8_e4m3 \
  --tensor-parallel-size 8 \
  --gpu-memory-utilization 0.90 \
  --max-model-len 32768 \
  --tool-call-parser glm47 \
  --enable-auto-tool-choice \
  --reasoning-parser glm45 \
  --no-enable-prefix-caching \
  --served-model-name glm-5.2-mxfp4
</code></pre>
<p>There is a significant tradeoff here: the published MXFP4 recipe uses only a <strong>32K context window</strong>.</p>
<p>If you are choosing GLM-5.2 specifically because you need hundreds of thousands of tokens of context, use the FP8 ROCm recipe instead.</p>
<p>AMD reports <strong>93.93 on GSM8K versus 94.09 for the base model</strong>, or roughly <strong>99.8% score recovery</strong>, for this MXFP4 conversion.</p>
<p>The MTP layer itself remains at higher precision. The published command simply does not enable speculative decoding, so do not read the absence of <code>--speculative-config</code> as evidence that MTP has been removed from the checkpoint.</p>
<h2>Don't allocate 1M context just because the model supports it</h2>
<p>GLM-5.2 can handle:</p>
<pre><code class="language-text">1,048,576 tokens
</code></pre>
<p>but there is no reason for every endpoint to reserve enough memory for million-token requests.</p>
<p>The current recipes themselves use very different context limits:</p>
<table>
<thead>
<tr>
<th>Setup</th>
<th>Context</th>
</tr>
</thead>
<tbody><tr>
<td>Basic Docker launch</td>
<td>131K</td>
</tr>
<tr>
<td>8× H20 + DSpark</td>
<td>200K</td>
</tr>
<tr>
<td>AMD FP8</td>
<td>524K</td>
</tr>
<tr>
<td>AMD MXFP4</td>
<td>32K</td>
</tr>
<tr>
<td>8× B200 FP8</td>
<td>Full 1M</td>
</tr>
</tbody></table>
<p>A coding agent working over a giant repository may justify 500K or 1M context. A normal API dominated by 10K prompts probably does not.</p>
<p>Longer context consumes KV cache that could otherwise serve more users, so choose <code>--max-model-len</code> around the traffic you expect rather than the largest number on the model card.</p>
<h2>Reasoning and tool calling</h2>
<p>Thinking is enabled by default.</p>
<p>GLM-5.2 supports three useful modes:</p>
<pre><code class="language-text">Think Max
Think High
Non-thinking
</code></pre>
<p>Think Max is the default.</p>
<p>For Think High:</p>
<pre><code class="language-bash">curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "glm-5.2-fp8",
    "messages": [
      {
        "role": "user",
        "content": "Design a fault-tolerant distributed queue."
      }
    ],
    "temperature": 1,
    "max_tokens": 4096,
    "chat_template_kwargs": {
      "reasoning_effort": "high"
    }
  }'
</code></pre>
<p>For a fast non-thinking response, pass:</p>
<pre><code class="language-json">{
  "enable_thinking": false
}
</code></pre>
<p>through <code>chat_template_kwargs</code>.</p>
<p>If you are building an agent or tool-using application, start vLLM with:</p>
<pre><code class="language-bash">--tool-call-parser glm47 \
--reasoning-parser glm45 \
--enable-auto-tool-choice
</code></pre>
<h2>Which GLM-5.2 setup should you choose?</h2>
<p>If you are renting GPUs specifically for GLM-5.2, the current upstream paths make the decision fairly simple.</p>
<p><strong>8× H200 + FP8</strong> is the straightforward NVIDIA setup.</p>
<p><strong>8× H20 + FP8</strong> is the documented choice if you specifically want the DSpark serving path.</p>
<p>If you really need the full <strong>1M context window</strong>, use <strong>8× B200 + FP8</strong>.</p>
<p>On Blackwell, <strong>8× B200 or B300 + NVIDIA NVFP4</strong> is the lower-footprint alternative.</p>
<p>For AMD, use <strong>8× MI300X or MI355X + FP8</strong> when long context matters. Use <strong>8× MI355X + MXFP4</strong> when reducing the model footprint matters more than the published 32K context limit.</p>
<p>H100, A100, 4× H200, and smaller B200 pods are intentionally not recommended here. The current upstream GLM-5.2 material does not provide comparable deployment evidence for them.</p>
<p>If a GPU configuration is not in the published recipe, don't assume it is equivalent just because the weights look as though they should fit. For a model this large, the runtime, low-precision kernels, KV-cache budget, parallelism strategy, and sustained load matter as much as raw HBM capacity.</p>
<h2>Sources</h2>
<h3>Z.ai</h3>
<ul>
<li><p><strong>GLM-5.2 model card</strong><br /><a href="https://huggingface.co/zai-org/GLM-5.2">https://huggingface.co/zai-org/GLM-5.2</a></p>
</li>
<li><p><strong>GLM-5.2 FP8 checkpoint</strong><br /><a href="https://huggingface.co/zai-org/GLM-5.2-FP8">https://huggingface.co/zai-org/GLM-5.2-FP8</a></p>
</li>
</ul>
<h3>vLLM</h3>
<ul>
<li><strong>Official GLM-5.2 deployment recipe</strong><br /><a href="https://recipes.vllm.ai/zai-org/GLM-5.2">https://recipes.vllm.ai/zai-org/GLM-5.2</a></li>
</ul>
<h3>NVIDIA</h3>
<ul>
<li><strong>GLM-5.2 NVFP4 checkpoint</strong><br /><a href="https://huggingface.co/nvidia/GLM-5.2-NVFP4">https://huggingface.co/nvidia/GLM-5.2-NVFP4</a></li>
</ul>
<h3>AMD</h3>
<ul>
<li><strong>GLM-5.2 MXFP4 checkpoint</strong><br /><a href="https://huggingface.co/amd/GLM-5.2-MXFP4">https://huggingface.co/amd/GLM-5.2-MXFP4</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Deploying DeepSeek V4 Flash 0731 with vLLM: Verified GPU Pods, Quants, and Serving Recipes]]></title><description><![CDATA[DeepSeek V4 Flash 0731 is the current official Flash release:
deepseek-ai/DeepSeek-V4-Flash-0731

It keeps the same underlying architecture as the earlier V4 Flash preview, but DeepSeek re-trained the]]></description><link>https://blog.gpus.market/deploying-deepseek-v4-flash-0731-with-vllm-verified-gpu-pods-quants-and-serving-recipes</link><guid isPermaLink="true">https://blog.gpus.market/deploying-deepseek-v4-flash-0731-with-vllm-verified-gpu-pods-quants-and-serving-recipes</guid><category><![CDATA[llm]]></category><category><![CDATA[NVIDIA]]></category><category><![CDATA[Deepseek]]></category><category><![CDATA[AI]]></category><category><![CDATA[#ai-tools]]></category><category><![CDATA[vLLM]]></category><dc:creator><![CDATA[Nick]]></dc:creator><pubDate>Fri, 14 Aug 2026 12:39:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6a22b13a41d5b05f1626f42c/90820e71-9ab4-4ae2-882e-f23b9256aada.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>DeepSeek V4 Flash <code>0731</code> is the current official Flash release:</p>
<pre><code class="language-text">deepseek-ai/DeepSeek-V4-Flash-0731
</code></pre>
<p>It keeps the same underlying architecture as the earlier V4 Flash preview, but DeepSeek re-trained the model for much stronger agentic performance. The published results are a big jump: <strong>82.7 on Terminal Bench 2.1 versus 61.8 for the preview</strong>, and <strong>54.4 on DeepSWE versus 7.3</strong>.</p>
<p>The model is MIT-licensed and ungated.</p>
<p>Under the hood, V4 Flash is a <strong>284B-parameter Mixture-of-Experts model</strong> with roughly <strong>13B parameters active per token</strong>. It supports a native context window of <strong>1,048,576 tokens</strong> and uses a hybrid attention design combining Compressed Sparse Attention (CSA) with Heavily Compressed Attention (HCA).</p>
<p>The checkpoint is already aggressively compressed. Routed experts are stored in <strong>MXFP4 with FP8 scales</strong>, while linear, attention, and router layers use FP8. At serving time, the KV cache can also be stored in FP8.</p>
<p>DeepSeek reports that V4 needs roughly <strong>27% of V3.2's inference FLOPs per token</strong> and about <strong>10% of its KV-cache footprint at 1M context</strong>.</p>
<p>If Hugging Face shows roughly 304–305B parameters for the repository, that does not contradict the 284B model size. The fused <code>0731</code> repository also contains the DSpark speculative-decoding module.</p>
<p>The checkpoint is around <strong>167 GB on disk</strong>, compared with roughly 160 GB for the preview. Do not use those figures as direct VRAM requirements. vLLM's MI325X validation, for example, measured about <strong>148.66 GiB of resident model memory</strong> for the preview checkpoint.</p>
<p>That difference is partly units: Hugging Face reports decimal GB, while GPU memory is normally discussed in GiB. More importantly, loading the weights is only part of the memory budget. KV cache, runtime buffers, kernels, and concurrency all need room too.</p>
<h2>Which checkpoint should you use?</h2>
<p>For most users, start with:</p>
<pre><code class="language-text">deepseek-ai/DeepSeek-V4-Flash-0731
</code></pre>
<p>The other variants are useful when a particular GPU or runtime path requires them:</p>
<table>
<thead>
<tr>
<th>Checkpoint</th>
<th>What it gives you</th>
</tr>
</thead>
<tbody><tr>
<td><code>deepseek-ai/DeepSeek-V4-Flash-0731</code></td>
<td>Current official release with DSpark</td>
</tr>
<tr>
<td><code>deepseek-ai/DeepSeek-V4-Flash</code></td>
<td>Older preview with MTP</td>
</tr>
<tr>
<td><code>deepseek-ai/DeepSeek-V4-Flash-DSpark</code></td>
<td>Preview weights with DSpark</td>
</tr>
<tr>
<td><code>nvidia/DeepSeek-V4-Flash-NVFP4</code></td>
<td>NVIDIA NVFP4 conversion of the preview</td>
</tr>
<tr>
<td><code>MJPansa/DeepSeek-V4-Flash-0731-NVFP4</code></td>
<td>Community NVFP4 conversion of <code>0731</code></td>
</tr>
<tr>
<td><code>yiminyuan/DeepSeek-V4-Flash-0731-INT4-W4A16</code></td>
<td>Community INT4 transcode</td>
</tr>
<tr>
<td>Unsloth <code>0731</code> GGUF variants</td>
<td>llama.cpp / CPU+GPU setups</td>
</tr>
</tbody></table>
<p>One detail matters if you are choosing NVIDIA's NVFP4 checkpoint: <strong>it is based on the preview weights, not</strong> <code>0731</code>. You get the NVIDIA NVFP4 execution path, but not the newer post-training that produced the large agentic gains above.</p>
<p>The community W4A16 conversion is also not proof that stock <code>0731</code> runs cleanly on A100. Its published end-to-end validation used Radeon Pro W6800X Duo hardware with CPU offload.</p>
<h2>Pin vLLM before you start</h2>
<p>The minimum runtime depends on the path you are using:</p>
<table>
<thead>
<tr>
<th>What you need</th>
<th>vLLM version</th>
</tr>
</thead>
<tbody><tr>
<td>DeepSeek V4 model support</td>
<td><code>0.20.0+</code></td>
</tr>
<tr>
<td>DSpark on NVIDIA</td>
<td><code>0.25.0+</code></td>
</tr>
<tr>
<td>DSpark on ROCm</td>
<td><code>0.26.0+</code></td>
</tr>
</tbody></table>
<p>For the documented NVIDIA <code>0731</code> setup:</p>
<pre><code class="language-bash">docker pull vllm/vllm-openai:v0.25.0
</code></pre>
<p>Once you have a working deployment, keep the version pinned. A model this dependent on specialized kernels is not a good place to discover that <code>latest</code> changed underneath you.</p>
<h2>Which GPUs can you actually use?</h2>
<p>The current DeepSeek and vLLM recipes give you these reproducible paths:</p>
<table>
<thead>
<tr>
<th>Hardware</th>
<th>Published deployment</th>
</tr>
</thead>
<tbody><tr>
<td><strong>4× GB300</strong></td>
<td>DeepSeek's own <code>0731</code> command</td>
</tr>
<tr>
<td><strong>4× B300</strong></td>
<td>vLLM Blackwell path</td>
</tr>
<tr>
<td><strong>4× B200</strong></td>
<td>vLLM Blackwell path</td>
</tr>
<tr>
<td><strong>4× H200</strong></td>
<td>vLLM Hopper path</td>
</tr>
<tr>
<td><strong>8× H200</strong></td>
<td>Prefill/decode deployment</td>
</tr>
<tr>
<td><strong>8× RTX PRO 6000 96GB</strong></td>
<td>Explicit <code>0731</code> validation</td>
</tr>
<tr>
<td><strong>1× MI325X 256GB</strong></td>
<td>Validated single-GPU, 4K context</td>
</tr>
<tr>
<td><strong>4× MI355X 288GB</strong></td>
<td>Validated ROCm setup</td>
</tr>
<tr>
<td><strong>2× DGX Spark / GB10</strong></td>
<td>Specialized two-node recipe</td>
</tr>
<tr>
<td><strong>DGX Station GB300</strong></td>
<td>Single-GPU profile</td>
</tr>
</tbody></table>
<p>For ordinary multi-GPU serving on H200, B200, and B300, vLLM's recommended pattern is:</p>
<pre><code class="language-text">Data Parallel = 4
Expert Parallel = enabled
</code></pre>
<p>H100, A100, 2× H200, 2× B200, 1× B200, and MI300X are not included here because the current recipe does not provide the same level of end-to-end deployment evidence.</p>
<h2>4× GB300: the cleanest <code>0731</code> reference</h2>
<p>DeepSeek publishes this command for a single 4× GB300 node:</p>
<pre><code class="language-bash">vllm serve deepseek-ai/DeepSeek-V4-Flash-0731 \
  --trust-remote-code \
  --kv-cache-dtype fp8 \
  --block-size 256 \
  --data-parallel-size 4 \
  --enable-expert-parallel \
  --moe-backend deep_gemm_mega_moe \
  --attention-config '{"use_fp4_indexer_cache": true}' \
  --speculative-config '{"method":"dspark","num_speculative_tokens":7,"draft_sample_method":"greedy"}'
</code></pre>
<p>This is specifically a <strong>Blackwell</strong> recipe.</p>
<p>These two options:</p>
<pre><code class="language-bash">--moe-backend deep_gemm_mega_moe
--attention-config '{"use_fp4_indexer_cache": true}'
</code></pre>
<p>should not be copied onto H200.</p>
<p>You may also see the FP4 indexer setting written upstream as:</p>
<pre><code class="language-bash">--attention_config.use_fp4_indexer_cache True
</code></pre>
<p>Use the syntax supported by the vLLM build you pinned.</p>
<h2>B200 and B300</h2>
<p>For 4× B200 or 4× B300, a useful starting point is:</p>
<pre><code class="language-bash">vllm serve deepseek-ai/DeepSeek-V4-Flash-0731 \
  --host 0.0.0.0 \
  --port 8000 \
  --trust-remote-code \
  --kv-cache-dtype fp8 \
  --block-size 256 \
  --data-parallel-size 4 \
  --enable-expert-parallel \
  --moe-backend deep_gemm_mega_moe \
  --attention-config '{"use_fp4_indexer_cache": true}' \
  --tokenizer-mode deepseek_v4 \
  --reasoning-parser deepseek_v4 \
  --tool-call-parser deepseek_v4 \
  --enable-auto-tool-choice
</code></pre>
<p>To add DSpark:</p>
<pre><code class="language-bash">--speculative-config '{"method":"dspark","num_speculative_tokens":7,"draft_sample_method":"greedy"}'
</code></pre>
<p>There is a small upstream disagreement here: DeepSeek's model card uses <code>greedy</code>, while the current vLLM recipe generator uses <code>probabilistic</code>.</p>
<p>If speculative decoding matters to your workload, benchmark both rather than treating either value as universally best.</p>
<h2>H200 uses a different path</h2>
<p>H200 is Hopper, so the Blackwell FP4 indexer and <code>deep_gemm_mega_moe</code> overrides are intentionally absent.</p>
<p>Start with:</p>
<pre><code class="language-bash">vllm serve deepseek-ai/DeepSeek-V4-Flash-0731 \
  --host 0.0.0.0 \
  --port 8000 \
  --trust-remote-code \
  --kv-cache-dtype fp8 \
  --block-size 256 \
  --data-parallel-size 4 \
  --enable-expert-parallel \
  --tokenizer-mode deepseek_v4 \
  --reasoning-parser deepseek_v4 \
  --tool-call-parser deepseek_v4 \
  --enable-auto-tool-choice \
  --max-model-len auto
</code></pre>
<p>If you have a full <strong>8× H200 node</strong>, vLLM also documents a more advanced layout with four GPUs handling prefill and four handling decode. KV state is transferred using Mooncake or NIXL, with <code>vllm-router</code> in front.</p>
<p>Those published prefill/decode examples currently use the <strong>preview checkpoint</strong>, not <code>0731</code>, so keep that distinction if you are reproducing them exactly.</p>
<h2>RTX PRO 6000 Blackwell needs two extra setup steps</h2>
<p>vLLM has an explicit <code>0731</code> validation for:</p>
<pre><code class="language-text">8× RTX PRO 6000 Blackwell
TP8
Expert Parallel
</code></pre>
<p>using:</p>
<pre><code class="language-text">vllm/vllm-openai:v0.25.0
</code></pre>
<p>Before starting the model, install the required FlashInfer build:</p>
<pre><code class="language-bash">/usr/bin/python3.12 -m pip install \
  --no-deps \
  flashinfer-python==0.6.14

export FLASHINFER_DISABLE_VERSION_CHECK=1
</code></pre>
<p>The <code>--no-deps</code> is important. Installing FlashInfer normally can replace PyTorch and break vLLM's compiled extensions.</p>
<p>Then run:</p>
<pre><code class="language-bash">vllm serve deepseek-ai/DeepSeek-V4-Flash-0731 \
  --trust-remote-code \
  --kv-cache-dtype fp8 \
  --block-size 256 \
  --enable-expert-parallel \
  --tensor-parallel-size 8 \
  --tokenizer-mode deepseek_v4 \
  --tool-call-parser deepseek_v4 \
  --enable-auto-tool-choice \
  --reasoning-parser deepseek_v4
</code></pre>
<p>On this particular profile, <strong>do not enable MTP or DSpark</strong>. Both currently fail during warmup on the <code>sm_120</code> sparse-MLA path.</p>
<h2>AMD: one MI325X can run it, with limits</h2>
<p>The single-GPU MI325X validation is one of the more useful upstream tests because vLLM publishes actual memory observations rather than just saying the model fits.</p>
<p>The validated setup is:</p>
<pre><code class="language-text">1× MI325X 256GB
TP1
4K context
10 GB explicit KV cache
</code></pre>
<p>Run:</p>
<pre><code class="language-bash">export VLLM_ROCM_USE_AITER=1

vllm serve deepseek-ai/DeepSeek-V4-Flash \
  --host 0.0.0.0 \
  --port 8002 \
  --tensor-parallel-size 1 \
  --kv-cache-dtype fp8_e4m3 \
  --max-model-len 4096 \
  --enable-chunked-prefill \
  --max-num-batched-tokens 256 \
  --kv-cache-memory-bytes 10000000000 \
  --distributed-executor-backend mp \
  --trust-remote-code \
  --tokenizer-mode deepseek_v4 \
  --moe-backend triton_unfused \
  --enforce-eager
</code></pre>
<p>vLLM measured about <strong>148.66 GiB of model memory after loading</strong> and reports successful chat, non-thinking, and Think High tests over a 24-hour allocation.</p>
<p>This is a useful single-GPU option if 4K context is enough. It should not be interpreted as a one-GPU million-token deployment.</p>
<p>The published AMD validation uses the preview checkpoint. If you want <code>0731</code> with DSpark on ROCm, use <strong>vLLM 0.26.0 or newer</strong>.</p>
<h2>4× MI355X</h2>
<p>The other documented AMD path uses TP4 across four MI355X GPUs:</p>
<pre><code class="language-bash">export VLLM_ROCM_USE_AITER=1

vllm serve deepseek-ai/DeepSeek-V4-Flash \
  --host localhost \
  --port 8001 \
  --dtype auto \
  --kv-cache-dtype fp8 \
  --tensor-parallel-size 4 \
  --max-num-seqs 512 \
  --max-num-batched-tokens 8192 \
  --distributed-executor-backend mp \
  --trust-remote-code \
  --gpu-memory-utilization 0.9 \
  --tokenizer-mode deepseek_v4 \
  --reasoning-parser deepseek_v4 \
  --tool-call-parser deepseek_v4 \
  --enable-auto-tool-choice \
  --compilation-config '{"mode":3,"cudagraph_mode":"FULL_DECODE_ONLY"}'
</code></pre>
<p>The published validation also includes 8-shot GSM8K results:</p>
<pre><code class="language-text">Flexible-extract exact match: 0.9439
Strict-match exact match:     0.9431
</code></pre>
<p>TP8 is available when lower latency matters more than reproducing the published TP4 setup.</p>
<h2>DGX Spark is a special case</h2>
<p>A single DGX Spark GB10 has 128 GB of unified memory, so the documented path uses <strong>two machines at TP2</strong>, one GB10 per node.</p>
<p>It also uses a specialized image:</p>
<pre><code class="language-text">eugr/spark-vllm-b12x:latest
</code></pre>
<p>rather than the standard vLLM container, plus ConnectX/RoCE network configuration between the nodes.</p>
<p>If you are using DGX Spark, follow that recipe as its own deployment path. It is not equivalent to a normal two-GPU Blackwell pod.</p>
<p>vLLM also carries a single-GPU <strong>DGX Station GB300</strong> profile. The currently published command uses the preview checkpoint with MTP rather than the <code>0731</code> DSpark release.</p>
<h2>Don't size every server for 1M context</h2>
<p>DeepSeek V4 Flash supports:</p>
<pre><code class="language-text">1,048,576 tokens
</code></pre>
<p>but that does not mean every deployment should reserve enough memory to serve a million-token request.</p>
<p>The MI325X profile makes the distinction obvious: the model supports 1M context, while that particular validated server configuration supports 4K.</p>
<p>Several vLLM recipes therefore use:</p>
<pre><code class="language-bash">--max-model-len auto
</code></pre>
<p>instead of forcing the model's architectural maximum.</p>
<p>V4 also has a hybrid CSA+HCA cache, so generic dense-transformer calculations such as "X GB per 100K tokens" are not reliable across every configuration.</p>
<p>Use the memory profile vLLM prints at startup. If you need to reserve a fixed cache budget, use:</p>
<pre><code class="language-bash">--kv-cache-memory-bytes
</code></pre>
<p>Most published configurations use:</p>
<pre><code class="language-bash">--kv-cache-dtype fp8
</code></pre>
<p>or, on ROCm:</p>
<pre><code class="language-bash">--kv-cache-dtype fp8_e4m3
</code></pre>
<p>to reduce cache memory.</p>
<p>If you are using <code>--data-parallel-size 4</code>, remember that scheduling settings such as <code>--max-num-seqs</code> and <code>--max-num-batched-tokens</code> apply <strong>per data-parallel rank</strong>, not once for the entire four-GPU server.</p>
<h2>Reasoning and tool calling</h2>
<p>DeepSeek V4 Flash supports three reasoning levels:</p>
<pre><code class="language-text">low
high
max
</code></pre>
<p>DeepSeek's recommended sampling depends on what you are doing:</p>
<table>
<thead>
<tr>
<th>Workload</th>
<th>Temperature</th>
<th>Top-p</th>
</tr>
</thead>
<tbody><tr>
<td>Normal chat / reasoning</td>
<td>1.0</td>
<td>1.0</td>
</tr>
<tr>
<td>Agentic work</td>
<td>1.0</td>
<td>0.95</td>
</tr>
</tbody></table>
<p>If you are serving Think High or Think Max, leave room for very long outputs. DeepSeek recommends allowing up to <strong>384K output tokens</strong> for the deeper reasoning modes, and the vLLM recipe notes that Think Max needs:</p>
<pre><code class="language-text">--max-model-len &gt;= 393216
</code></pre>
<p>to avoid truncating the reasoning budget.</p>
<p>For the OpenAI-compatible vLLM endpoint, start the server with:</p>
<pre><code class="language-bash">--tokenizer-mode deepseek_v4 \
--reasoning-parser deepseek_v4 \
--tool-call-parser deepseek_v4 \
--enable-auto-tool-choice
</code></pre>
<p>A normal request looks like:</p>
<pre><code class="language-bash">curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-ai/DeepSeek-V4-Flash-0731",
    "messages": [
      {
        "role": "user",
        "content": "Explain optimistic and pessimistic locking."
      }
    ],
    "temperature": 1.0,
    "top_p": 1.0,
    "max_tokens": 2048
  }'
</code></pre>
<p>For an agentic request with Think High:</p>
<pre><code class="language-python">from openai import OpenAI

client = OpenAI(
    base_url="http://YOUR_SERVER_IP:8000/v1",
    api_key="EMPTY",
)

response = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V4-Flash-0731",
    messages=[
        {
            "role": "user",
            "content": "Find the race condition in this worker design."
        }
    ],
    temperature=1.0,
    top_p=0.95,
    extra_body={
        "chat_template_kwargs": {
            "thinking": True,
            "reasoning_effort": "high"
        }
    },
)

print(response.choices[0].message)
</code></pre>
<h2>Keep the model on persistent storage</h2>
<p>Current Hugging Face tooling uses the <code>hf</code> CLI:</p>
<pre><code class="language-bash">export HF_HOME=/workspace/huggingface
mkdir -p "$HF_HOME"

hf download deepseek-ai/DeepSeek-V4-Flash-0731
</code></pre>
<p>At roughly 167 GB, repeatedly downloading the checkpoint every time a pod is recreated gets expensive in both time and bandwidth. Persistent model storage is worth setting up from the beginning.</p>
<h2>Which DeepSeek V4 Flash setup should you choose?</h2>
<p>If you are choosing GPUs specifically for <code>DeepSeek-V4-Flash-0731</code>, the current upstream paths are fairly clear.</p>
<p><strong>4× GB300</strong> is the cleanest reference because DeepSeek publishes the exact <code>0731</code> command.</p>
<p><strong>4× B200 or B300</strong> gives you the equivalent Blackwell DP4 + expert-parallel route.</p>
<p><strong>4× H200</strong> is the documented Hopper setup. Do not copy the Blackwell FP4-specific flags into it.</p>
<p>If you have <strong>8× H200</strong>, vLLM also has a more advanced prefill/decode design, although the published commands currently use the preview checkpoint.</p>
<p><strong>8× RTX PRO 6000 Blackwell</strong> is explicitly validated for <code>0731</code>, but MTP and DSpark need to stay off in the current profile.</p>
<p>On AMD, <strong>1× MI325X</strong> is a real validated option if a 4K context limit is acceptable, while <strong>4× MI355X</strong> gives you the stronger multi-GPU ROCm path.</p>
<p>H100, A100, 2× H200, 2× B200, 1× B200, and MI300X are intentionally not recommended here. The current upstream material does not provide equivalent deployment recipes for them.</p>
<p>With V4 Flash, the useful question is not simply whether the checkpoint can fit in aggregate memory. You need enough headroom for the actual runtime, a supported kernel path for the GPU architecture, enough KV cache for the context you plan to serve, and a configuration that stays up under real concurrent traffic.</p>
<h2>Sources</h2>
<h3>DeepSeek</h3>
<ul>
<li><p><strong>DeepSeek V4 Flash 0731 model card</strong><br /><a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash-0731">https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash-0731</a></p>
</li>
<li><p><strong>DeepSeek V4 Flash preview — architecture and precision</strong><br /><a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash">https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash</a></p>
</li>
<li><p><strong>DeepSeek V4 technical report</strong><br /><a href="https://arxiv.org/abs/2606.19348">https://arxiv.org/abs/2606.19348</a></p>
</li>
</ul>
<h3>vLLM</h3>
<ul>
<li><p><strong>DeepSeek V4 Flash deployment recipe</strong><br /><a href="https://recipes.vllm.ai/deepseek-ai/DeepSeek-V4-Flash">https://recipes.vllm.ai/deepseek-ai/DeepSeek-V4-Flash</a></p>
</li>
<li><p><strong>Raw hardware profiles and validations</strong><br /><a href="https://raw.githubusercontent.com/vllm-project/recipes/main/models/deepseek-ai/DeepSeek-V4-Flash.yaml">https://raw.githubusercontent.com/vllm-project/recipes/main/models/deepseek-ai/DeepSeek-V4-Flash.yaml</a></p>
</li>
<li><p><strong>FP8 KV-cache documentation</strong><br /><a href="https://docs.vllm.ai/en/latest/features/quantization/quantized%5C_kvcache/">https://docs.vllm.ai/en/latest/features/quantization/quantized\_kvcache/</a></p>
</li>
</ul>
<h3>Alternative checkpoints</h3>
<ul>
<li><p><strong>NVIDIA DeepSeek V4 Flash NVFP4</strong><br /><a href="https://huggingface.co/nvidia/DeepSeek-V4-Flash-NVFP4">https://huggingface.co/nvidia/DeepSeek-V4-Flash-NVFP4</a></p>
</li>
<li><p><strong>Community</strong> <code>0731</code> <strong>NVFP4 conversion</strong><br /><a href="https://huggingface.co/MJPansa/DeepSeek-V4-Flash-0731-NVFP4">https://huggingface.co/MJPansa/DeepSeek-V4-Flash-0731-NVFP4</a></p>
</li>
<li><p><strong>Community</strong> <code>0731</code> <strong>INT4/W4A16 conversion</strong><br /><a href="https://huggingface.co/yiminyuan/DeepSeek-V4-Flash-0731-INT4-W4A16">https://huggingface.co/yiminyuan/DeepSeek-V4-Flash-0731-INT4-W4A16</a></p>
</li>
<li><p><strong>Unsloth DeepSeek V4 GGUF documentation</strong><br /><a href="https://unsloth.ai/docs/models/deepseek-v4">https://unsloth.ai/docs/models/deepseek-v4</a></p>
</li>
</ul>
]]></content:encoded></item></channel></rss>