From f6da3ea3082c7d170eb94d29a279c8e5c765ec21 Mon Sep 17 00:00:00 2001 From: Charles Frye Date: Thu, 11 Jun 2026 23:28:13 +0000 Subject: [PATCH 01/14] initial draft, no images --- ...neration-speculative-decoding-dflash-v2.md | 164 ++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md diff --git a/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md b/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md new file mode 100644 index 000000000..2ca360d8c --- /dev/null +++ b/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md @@ -0,0 +1,164 @@ +--- +title: "The next generation of speculative decoding: DFlash and Spec V2" +author: "Z Lab, Modal, and SGLang Teams" +date: "June 12, 2026" +previewImg: /images/blog/nemotron-3-ultra/image1.png +type: blog +--- + +Using Z Lab's DFlash speculative decoding models with SGLang’s newly default Spec V2 engine, you can achieve state-of-the-art latencies for LLM inference serving. + +Below, we describe DFlash’s novel diffusion \+ KV injection strategy for speculative decoding, why that matters for achieving massive speedups, and how the teams at [Z Lab](https://z-lab.ai), SGLang, and [Modal](https://modal.com) worked together to make those speedups available to everyone. + +And we mean everyone! You can [run tensor-parallel Qwen 3.6 35B-A3B with DFlash right now](https://modal.com/docs/examples/sglang_low_latency) on Modal's serverless GPUs, achieving decode speeds of up to 1k tps: +```shell +git clone https://github.com/modal-labs/modal-examples +cd modal-examples +uvx modal setup && uvx modal run 06_gpu_and_ml/llm-serving/sglang_low_latency.py +``` + +## DFlash: Parallel drafting with KV injection + +Transformer-based large language models (LLMs) are powerful, but their autoregressive decoding process makes inference slow: tokens must be generated one by one, with low [arithmetic intensity](https://modal.com/gpu-glossary/perf/arithmetic-intensity) that makes them a poor fit for modern hardware. + +[Speculative decoding](https://arxiv.org/abs/2211.17192) addresses this bottleneck by using a smaller, faster draft model to propose multiple tokens, which are then verified in parallel by the target LLM, with no impact on model quality. + +However, many speculative decoding methods, like the [EAGLE series](https://arxiv.org/abs/2503.01840) and the native MTP modules in recent models like [Gemma 4](https://blog.google/innovation-and-ai/technology/developers-tools/multi-token-prediction-gemma-4/) and [DeepSeek-V4](https://www.lmsys.org/blog/2026-04-25-deepseek-v4/), still rely on sequential autoregression – but in the draft model instead of the target. The draft model generates draft tokens one-by-one, which makes them a poor fit for modern hardware and limits the achievable speedup. + +That’s why the Z Lab developed [DFlash](https://arxiv.org/abs/2602.06036), which uses a lightweight block diffusion draft model to generate an entire block of draft tokens in parallel, just the way that GPUs and TPUs like. Xiaomi's Mimo v2.5-Pro-UltraSpeed uses DFlash to achieve [over 1k output tps](https://mimo.xiaomi.com/blog/mimo-tilert-1000tps). + +Using block diffusion for speculative drafting is non-trivial. Directly training a small block diffusion model as the drafter leads to low acceptance length, while using an existing large diffusion LLM like [SpecDiff-2](https://arxiv.org/abs/2511.00606) as the drafter introduces a large memory footprint and high drafting cost. + +The key insight of DFlash is simple: the target LLM knows the context best. Inspired by previous methods like [Medusa](https://arxiv.org/abs/2401.10774), [EAGLE](https://arxiv.org/html/2503.01840v1) and [Apple's MTP](https://arxiv.org/abs/2507.11851), we extract hidden representations of the context tokens from the target model. But different from previous work, we inject them directly into the draft model’s KV cache. This allows the draft model to skip modeling the full context from scratch and focus purely on predicting the next block of tokens – using the same tensors as the later layers of the target model\! + +![][image1] + +With this design, DFlash leverages the rich contextual features produced by the powerful target LLM while keeping the draft model extremely small and efficient. As a result, DFlash achieves high acceptance length with low drafting latency. + +### Why is DFlash so fast? + +Speculative decoding speedup mainly depends on two factors: how many drafted tokens are accepted per cycle and how much extra cost the draft model adds. DFlash improves both. + +DFlash achieves a similar acceptance length to a 5-layer EAGLE-3 drafter, but thanks to its ultra-fast parallel drafting, it delivers much higher end-to-end speedup. Results are reported as `acc_len / speedup`. + +| Task | EAGLE-3 (5 layers) | DFlash | +| :-------- | :----------------- | :------------- | +| GSM8K | 4.2 / 2.1x | **4.2 / 3.3x** | +| HumanEval | 4.3 / 2.2x | **4.0 / 3.2x** | +| MT-Bench | 3.1 / 1.4x | **3.0 / 2.2x** | + +**DFlash drafts faster** + +Autoregressive drafters like EAGLE-3 generate draft tokens one by one. As the draft length grows, the drafting cost grows roughly linearly. To keep latency low, these methods usually rely on very shallow draft models, which limits draft quality. + +DFlash avoids this bottleneck with a block diffusion drafter. It generates the whole draft block in parallel with a single forward pass, making drafting much more hardware-friendly. A 5-layer DFlash drafter generating 16 tokens has lower drafting latency than even a 1-layer EAGLE-3 drafter. + +**![][image2]** + +We can observe the independent impact of this technique in end-to-end benchmarks, where DFlash still provides a higher end-to-end speedup than EAGLE-3, even at lower acceptance lengths. + +| Task | EAGLE-3 (5 layers) | DFlash (diffusion only) | +| :-------- | :----------------- | :------------------------- | +| GSM8K | 4.2 / 2.1x | **3.5 / 2.9x** | +| HumanEval | 4.3 / 2.2x | **3.5 / 2.9x** | +| MT-Bench | 3.1 / 1.4x | **2.6 / 2.0x** | + +**KV injection increases acceptance lengths** + +Fast drafting only helps if the drafted tokens are accepted. Existing methods like EAGLE-3 use target model features only at the input of the draft model, so this information can fade as the draft model gets deeper. + +DFlash instead injects target features into the KV cache of every draft layer. This keeps the drafter strongly conditioned on the target model’s context throughout generation, allowing deeper drafters to produce higher-quality drafts. + +We can also observe the independent impact of this technique in end-to-end-benchmarks, where DFlash in autoregressive mode results in a higher speedup due to higher acceptance lengths. + +| Task | EAGLE-3 (5 layers) | DFlash (injection only) | +| :-------- | :----------------- | :------------------------- | +| GSM8K | 4.2 / 2.1x | **4.8 / 2.4x** | +| HumanEval | 4.3 / 2.2x | **4.6 / 2.3x** | +| MT-Bench | 3.1 / 1.4x | **3.4 / 1.5x** | + +The benchmark numbers in this section are from the initial implementation of DFlash as part of R &D by Z Lab. Based on these impressive results, the teams at Modal and SGLang joined the project to optimize end-to-end performance in the SGLang inference engine. + +## Implementing DFlash in SGLang + +DFlash is now available in SGLang, offering state-of-the-art inference speeds to real production deployments. + +Bringing a performance optimization technique like DFlash from research to prod requires two basic components: implementing the technique inside a high-performance engine and then optimizing the performance of the end-to-end system, from host scheduler to GPU execution. + +The DFlash integration into SGLang can be split into two parts along these lines. First, DFlash was added to the original ([now deprecated](https://github.com/sgl-project/sglang/pull/25464)) V1 speculative decoding engine. Besides implementing a new draft model architecture, this also required integration of KV caches across draft and target to support injection. Second, DFlash was added to the new V2 speculative decoding engine, which offers improved performance through [reduced synchronization with the host](https://modal.com/blog/host-overhead-inference-efficiency). + +In the [initial implementation of DFlash](https://github.com/sgl-project/sglang/pull/22077), we added support for this new model architecture to the existing speculative decoding engine. This included the addition of a `DFlashWorker` to control the draft model execution and the actual `DFlashDraftModel` that it drives. + +As a reminder, SGLang uses a scheduler process (mostly on the host) to drive execution of model worker processes (mostly on the accelerators). One counterintuitive aspect of the way speculative decoding works in SGLang is that the draft model worker is the one that talks to the scheduler (via methods like `.forward_batch_generation`). It wraps a target model’s worker for the verification passes and calls it when the drafts are ready. Keep this in mind if you look at the code or a trace\! + +That’s not new in DFlash. The main novelty is the KV injection, which ties state between the draft and target models. For methods like EAGLE, the draft KV cache is fully private to the draft model, calculated based on KV projection of the draft’s own latents. In DFlash, the latents of the target model are instead passed through a KV projection by the draft model. + +We don’t want to store those latents and cut into precious KV cache space and we want all requests that have the same prefix to share the radix cache. So we run the draft KV projection ahead of the rest of the draft forward pass – *immediate materialization*. That needs to be fast, so we added a layer-batched linear projection and a fused Triton kernel for the norm+RoPE post-processing. + +## Eliminating host overhead for DFlash with Spec V2 and overlap shceduling + +That worked and was fast, but we knew it could be faster. We were concurrently working on the V2 speculative decoding engine, so the next step was to [combine DFlash with the V2 engine](https://github.com/sgl-project/sglang/pull/23000), which is what’s now available in SGLang. + +The key goal of the V2 engine as a whole is to reduce points of host-device synchronization, which [kill inference performance](https://modal.com/blog/host-overhead-inference-efficiency), no matter how fast the GPU is or how good the kernels are. The solution is called the *overlap scheduler*. + +In particular, there’s two key opportunities for overlap: + +1. host-side `pop_and_process` cleanup after the GPU finishes batch N-1 (e.g. stop token detection, request metadata updates) can overlap with GPU work on batch N; +2. host KV allocation (in `prepare_for_decode`) for batch N can overlap with GPU work on batch N-1. + +Under V2 with these optimizations, performance improved by over 25%, from \~9,700 tok/s to \~12,300 tok/s, when running Qwen 3-8B on a single B200 at concurrency 32 ([details here](https://github.com/sgl-project/sglang/pull/20547)). + +The aforementioned optimizations can be used by all draft models. But DFlash is able to take greater advantage of overlap scheduling. In particular, because DFlash uses immediate materialization from the target to construct the draft KV, it doesn’t need a separate draft-extend step to run the draft model on only accepted tokens and populate KV. This draft-extend step, used in EAGLE, requires that accepted tokens are known before host-side planning can proceed. + +**Try DFlash in SGLang now** + +Unlike posts from proprietary inference providers, you don’t have to just read this blog and feel FOMO. You can [read the code](https://github.com/sgl-project/sglang/pull/23000). You can deploy a DFlash-accelerated SGLang server [right now](https://modal.com/docs/examples/sglang_low_latency), and then start tinkering. + +More broadly: you can run inference at state-of-the-art intelligences and speeds thanks to the work of the open-weights model builders, systems researchers, and the open source community. Whether it’s research work on techniques like DFlash by the [Z Lab](https://z-lab.ai/) or features and performance enhancements from open source contributors like [Modal](https://modal.com/), the world’s best work on LLM inference is landing in the SGLang open source engine for you to build on and with. + +![](/images/blog/nemotron-3-ultra/image1.png) + +## TL;DR: About Nemotron 3 Ultra + +### What Miles supports + + + +*Figure: rollout/raw\_reward on dapo-math-17k at 8k max context length, rising from \~0.55 to \~0.58 over the run.* + +### Nemotron 3 Ultra RL example + +```shell +## Miles docker image for nemotron-3-ultra + +docker pull radixark/miles:nemotron-3-ultra +cd /root/miles + +## convert hf to dist + +## env (optional): MODELS_DIR=/your/models + +HF=$MODELS_DIR/NVIDIA-Nemotron-3-Ultra-550B-A55B-BF16 +bash scripts/convert-nemotron-3-ultra-550b-hf-to-dist.sh + +## Launch RL (128 GPU, colocate) + +## head pod: +bash scripts/run-nemotron-3-ultra-550b-a55b.sh head + +## each worker pod: +bash scripts/run-nemotron-3-ultra-550b-a55b.sh worker +``` + +## Summary + + +## Acknowledgement + +Thanks to everyone who contributed to bringing Spec V2 and DFlash to SGLang. + +Z Lab: + +Modal: + +SGLang: From 26be1fa2e85ac60fe8506c85be98a2e5775a7b86 Mon Sep 17 00:00:00 2001 From: Charles Frye Date: Fri, 12 Jun 2026 00:46:44 +0000 Subject: [PATCH 02/14] nearly complete draft --- ...neration-speculative-decoding-dflash-v2.md | 82 ++++++------------ .../blog/dflash-v2/dflash-arch-diagram.webp | Bin 0 -> 46828 bytes .../blog/dflash-v2/dflash-headline-perf.webp | Bin 0 -> 11994 bytes .../blog/dflash-v2/dflash-perf-big-sweep.webp | Bin 0 -> 3038 bytes .../dflash-vs-eagle-draft-latency.webp | Bin 0 -> 24904 bytes 5 files changed, 26 insertions(+), 56 deletions(-) create mode 100644 public/images/blog/dflash-v2/dflash-arch-diagram.webp create mode 100644 public/images/blog/dflash-v2/dflash-headline-perf.webp create mode 100644 public/images/blog/dflash-v2/dflash-perf-big-sweep.webp create mode 100644 public/images/blog/dflash-v2/dflash-vs-eagle-draft-latency.webp diff --git a/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md b/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md index 2ca360d8c..62c4acd5e 100644 --- a/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md +++ b/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md @@ -2,15 +2,18 @@ title: "The next generation of speculative decoding: DFlash and Spec V2" author: "Z Lab, Modal, and SGLang Teams" date: "June 12, 2026" -previewImg: /images/blog/nemotron-3-ultra/image1.png +previewImg: /images/blog/dflash-v2/dflash-arch-diagram.webp type: blog --- Using Z Lab's DFlash speculative decoding models with SGLang’s newly default Spec V2 engine, you can achieve state-of-the-art latencies for LLM inference serving. + + Below, we describe DFlash’s novel diffusion \+ KV injection strategy for speculative decoding, why that matters for achieving massive speedups, and how the teams at [Z Lab](https://z-lab.ai), SGLang, and [Modal](https://modal.com) worked together to make those speedups available to everyone. And we mean everyone! You can [run tensor-parallel Qwen 3.6 35B-A3B with DFlash right now](https://modal.com/docs/examples/sglang_low_latency) on Modal's serverless GPUs, achieving decode speeds of up to 1k tps: + ```shell git clone https://github.com/modal-labs/modal-examples cd modal-examples @@ -23,23 +26,23 @@ Transformer-based large language models (LLMs) are powerful, but their autoregre [Speculative decoding](https://arxiv.org/abs/2211.17192) addresses this bottleneck by using a smaller, faster draft model to propose multiple tokens, which are then verified in parallel by the target LLM, with no impact on model quality. -However, many speculative decoding methods, like the [EAGLE series](https://arxiv.org/abs/2503.01840) and the native MTP modules in recent models like [Gemma 4](https://blog.google/innovation-and-ai/technology/developers-tools/multi-token-prediction-gemma-4/) and [DeepSeek-V4](https://www.lmsys.org/blog/2026-04-25-deepseek-v4/), still rely on sequential autoregression – but in the draft model instead of the target. The draft model generates draft tokens one-by-one, which makes them a poor fit for modern hardware and limits the achievable speedup. +However, many speculative decoding methods, like the [EAGLE series](https://arxiv.org/abs/2503.01840) and the native multi-token prediction (MTP) modules in recent models like [Gemma 4](https://blog.google/innovation-and-ai/technology/developers-tools/multi-token-prediction-gemma-4/) and [DeepSeek-V4](https://www.lmsys.org/blog/2026-04-25-deepseek-v4/), still rely on sequential autoregression – but in the draft model instead of the target. The draft model generates draft tokens one-by-one, which makes them a poor fit for modern hardware and limits the achievable speedup. -That’s why the Z Lab developed [DFlash](https://arxiv.org/abs/2602.06036), which uses a lightweight block diffusion draft model to generate an entire block of draft tokens in parallel, just the way that GPUs and TPUs like. Xiaomi's Mimo v2.5-Pro-UltraSpeed uses DFlash to achieve [over 1k output tps](https://mimo.xiaomi.com/blog/mimo-tilert-1000tps). +That’s why the Z Lab developed [DFlash](https://arxiv.org/abs/2602.06036), which uses a lightweight block diffusion draft model to generate an entire block of draft tokens in parallel, just the way that GPUs and TPUs like. Xiaomi's new Mimo v2.5-Pro-UltraSpeed uses DFlash to achieve [over 1k output tps](https://mimo.xiaomi.com/blog/mimo-tilert-1000tps). Using block diffusion for speculative drafting is non-trivial. Directly training a small block diffusion model as the drafter leads to low acceptance length, while using an existing large diffusion LLM like [SpecDiff-2](https://arxiv.org/abs/2511.00606) as the drafter introduces a large memory footprint and high drafting cost. -The key insight of DFlash is simple: the target LLM knows the context best. Inspired by previous methods like [Medusa](https://arxiv.org/abs/2401.10774), [EAGLE](https://arxiv.org/html/2503.01840v1) and [Apple's MTP](https://arxiv.org/abs/2507.11851), we extract hidden representations of the context tokens from the target model. But different from previous work, we inject them directly into the draft model’s KV cache. This allows the draft model to skip modeling the full context from scratch and focus purely on predicting the next block of tokens – using the same tensors as the later layers of the target model\! +The key insight of DFlash is simple: the target LLM knows the context best. Inspired by previous methods like [Medusa](https://arxiv.org/abs/2401.10774), [EAGLE](https://arxiv.org/html/2503.01840v1) and MTP ([Gloeckle et al., 2024](https://arxiv.org/abs/2404.19737); [Samragh et al., 2025](https://arxiv.org/abs/2507.11851)), we extract hidden representations of the context tokens from the target model. But different from previous work, we inject them directly into the draft model’s KV cache. This allows the draft model to skip modeling the full context from scratch and focus purely on predicting the next block of tokens – using the same tensors as the later layers of the target model\! -![][image1] +![](/images/blog/dflash-v2/dflash-arch-diagram.webp) -With this design, DFlash leverages the rich contextual features produced by the powerful target LLM while keeping the draft model extremely small and efficient. As a result, DFlash achieves high acceptance length with low drafting latency. +With this design, DFlash leverages the rich, highly relevant contextual features produced by the target LLM while keeping the draft model extremely small and efficient. As a result, DFlash achieves high acceptance length with low drafting latency. ### Why is DFlash so fast? -Speculative decoding speedup mainly depends on two factors: how many drafted tokens are accepted per cycle and how much extra cost the draft model adds. DFlash improves both. +Speculative decoding speedup mainly depends on two factors: how many drafted tokens are accepted per cycle and how much extra cost the draft model adds. DFlash improves both, using two distinct techniques. -DFlash achieves a similar acceptance length to a 5-layer EAGLE-3 drafter, but thanks to its ultra-fast parallel drafting, it delivers much higher end-to-end speedup. Results are reported as `acc_len / speedup`. +Concretely, DFlash achieves a similar acceptance length to a 5-layer EAGLE-3 drafter, but thanks to its ultra-fast parallel drafting, it delivers much higher end-to-end speedup. Results are reported as `acc_len / speedup`. | Task | EAGLE-3 (5 layers) | DFlash | | :-------- | :----------------- | :------------- | @@ -51,9 +54,9 @@ DFlash achieves a similar acceptance length to a 5-layer EAGLE-3 drafter, but th Autoregressive drafters like EAGLE-3 generate draft tokens one by one. As the draft length grows, the drafting cost grows roughly linearly. To keep latency low, these methods usually rely on very shallow draft models, which limits draft quality. -DFlash avoids this bottleneck with a block diffusion drafter. It generates the whole draft block in parallel with a single forward pass, making drafting much more hardware-friendly. A 5-layer DFlash drafter generating 16 tokens has lower drafting latency than even a 1-layer EAGLE-3 drafter. +DFlash avoids this bottleneck with a block diffusion drafter. It generates the whole draft block in parallel with a single forward pass, making drafting much more hardware-friendly. A 5-layer DFlash drafter generating 16 tokens has lower drafting latency than a shallower EAGLE-3 drafter. -**![][image2]** + We can observe the independent impact of this technique in end-to-end benchmarks, where DFlash still provides a higher end-to-end speedup than EAGLE-3, even at lower acceptance lengths. @@ -69,7 +72,7 @@ Fast drafting only helps if the drafted tokens are accepted. Existing methods li DFlash instead injects target features into the KV cache of every draft layer. This keeps the drafter strongly conditioned on the target model’s context throughout generation, allowing deeper drafters to produce higher-quality drafts. -We can also observe the independent impact of this technique in end-to-end-benchmarks, where DFlash in autoregressive mode results in a higher speedup due to higher acceptance lengths. +We can also observe the independent impact of this technique in end-to-end-benchmarks, where DFlash in autoregressive mode still runs faster due to higher acceptance lengths. | Task | EAGLE-3 (5 layers) | DFlash (injection only) | | :-------- | :----------------- | :------------------------- | @@ -77,11 +80,9 @@ We can also observe the independent impact of this technique in end-to-end-bench | HumanEval | 4.3 / 2.2x | **4.6 / 2.3x** | | MT-Bench | 3.1 / 1.4x | **3.4 / 1.5x** | -The benchmark numbers in this section are from the initial implementation of DFlash as part of R &D by Z Lab. Based on these impressive results, the teams at Modal and SGLang joined the project to optimize end-to-end performance in the SGLang inference engine. - ## Implementing DFlash in SGLang -DFlash is now available in SGLang, offering state-of-the-art inference speeds to real production deployments. +The benchmark numbers in this section are from the initial implementation of DFlash as part of R&D by Z Lab. Based on these impressive results, the teams at Modal and SGLang collaborated with Z Lab to optimize end-to-end performance in the SGLang inference engine. Bringing a performance optimization technique like DFlash from research to prod requires two basic components: implementing the technique inside a high-performance engine and then optimizing the performance of the end-to-end system, from host scheduler to GPU execution. @@ -95,7 +96,7 @@ That’s not new in DFlash. The main novelty is the KV injection, which ties sta We don’t want to store those latents and cut into precious KV cache space and we want all requests that have the same prefix to share the radix cache. So we run the draft KV projection ahead of the rest of the draft forward pass – *immediate materialization*. That needs to be fast, so we added a layer-batched linear projection and a fused Triton kernel for the norm+RoPE post-processing. -## Eliminating host overhead for DFlash with Spec V2 and overlap shceduling +## Eliminating host overhead for DFlash with Spec V2 and overlap scheduling That worked and was fast, but we knew it could be faster. We were concurrently working on the V2 speculative decoding engine, so the next step was to [combine DFlash with the V2 engine](https://github.com/sgl-project/sglang/pull/23000), which is what’s now available in SGLang. @@ -110,55 +111,24 @@ Under V2 with these optimizations, performance improved by over 25%, from \~9,70 The aforementioned optimizations can be used by all draft models. But DFlash is able to take greater advantage of overlap scheduling. In particular, because DFlash uses immediate materialization from the target to construct the draft KV, it doesn’t need a separate draft-extend step to run the draft model on only accepted tokens and populate KV. This draft-extend step, used in EAGLE, requires that accepted tokens are known before host-side planning can proceed. -**Try DFlash in SGLang now** - -Unlike posts from proprietary inference providers, you don’t have to just read this blog and feel FOMO. You can [read the code](https://github.com/sgl-project/sglang/pull/23000). You can deploy a DFlash-accelerated SGLang server [right now](https://modal.com/docs/examples/sglang_low_latency), and then start tinkering. - -More broadly: you can run inference at state-of-the-art intelligences and speeds thanks to the work of the open-weights model builders, systems researchers, and the open source community. Whether it’s research work on techniques like DFlash by the [Z Lab](https://z-lab.ai/) or features and performance enhancements from open source contributors like [Modal](https://modal.com/), the world’s best work on LLM inference is landing in the SGLang open source engine for you to build on and with. - -![](/images/blog/nemotron-3-ultra/image1.png) - -## TL;DR: About Nemotron 3 Ultra - -### What Miles supports - - +## High-performance DFlash speculative models are available for a variety of models -*Figure: rollout/raw\_reward on dapo-math-17k at 8k max context length, rising from \~0.55 to \~0.58 over the run.* +TODO: Write this section up once we have final model list and numbers. -### Nemotron 3 Ultra RL example +![](/images/blog/dflash-v2/dflash-perf-big-sweep.webp) -```shell -## Miles docker image for nemotron-3-ultra - -docker pull radixark/miles:nemotron-3-ultra -cd /root/miles - -## convert hf to dist - -## env (optional): MODELS_DIR=/your/models - -HF=$MODELS_DIR/NVIDIA-Nemotron-3-Ultra-550B-A55B-BF16 -bash scripts/convert-nemotron-3-ultra-550b-hf-to-dist.sh - -## Launch RL (128 GPU, colocate) +## Try DFlash in SGLang now -## head pod: -bash scripts/run-nemotron-3-ultra-550b-a55b.sh head - -## each worker pod: -bash scripts/run-nemotron-3-ultra-550b-a55b.sh worker -``` - -## Summary +Unlike posts from proprietary inference providers, you don’t have to just read this blog and feel FOMO. You can [read the code](https://github.com/sgl-project/sglang/pull/23000). You can deploy a DFlash-accelerated SGLang server [right now](https://modal.com/docs/examples/sglang_low_latency), and then start tinkering. +More broadly: you can run inference at state-of-the-art intelligences and speeds thanks to the work of the open-weights model builders, systems researchers, and the open source community. Whether it’s research work on techniques like DFlash by the [Z Lab](https://z-lab.ai/) or features and performance enhancements from open source contributors like [Modal](https://modal.com/), the world’s best work on LLM inference is landing in the SGLang open source engine for you to build on and with. -## Acknowledgement +## Acknowledgements Thanks to everyone who contributed to bringing Spec V2 and DFlash to SGLang. -Z Lab: +Z Lab: Jian Chen, Yesheng Liang, and Zhijian Liu. -Modal: +Modal: David Wang and Charles Frye. -SGLang: +SGLang: Qiaolin Yu and Liangsheng Yin. diff --git a/public/images/blog/dflash-v2/dflash-arch-diagram.webp b/public/images/blog/dflash-v2/dflash-arch-diagram.webp new file mode 100644 index 0000000000000000000000000000000000000000..e89b992ff0cf598abfede5a4090d6c6a59ac4500 GIT binary patch literal 46828 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 literal 0 HcmV?d00001 diff --git a/public/images/blog/dflash-v2/dflash-headline-perf.webp b/public/images/blog/dflash-v2/dflash-headline-perf.webp new file mode 100644 index 0000000000000000000000000000000000000000..56b7c93b43de8da576bca3226b03a57a3a8d2761 GIT binary patch literal 11994 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 XF2(VWH{+Xaw$PNZ;D1j@0O0=s)_`bl literal 0 HcmV?d00001 diff --git a/public/images/blog/dflash-v2/dflash-perf-big-sweep.webp b/public/images/blog/dflash-v2/dflash-perf-big-sweep.webp new file mode 100644 index 0000000000000000000000000000000000000000..0f8a9df860a49d8b890741b364d67e0bacc67ac4 GIT binary patch literal 3038 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 cTS(P_00_v@d;kCgJ2XC6000000000008G Date: Fri, 12 Jun 2026 01:56:00 +0000 Subject: [PATCH 03/14] update headline figure --- ...neration-speculative-decoding-dflash-v2.md | 5 ++++- .../blog/dflash-v2/dflash-headline-perf.webp | Bin 11994 -> 11710 bytes 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md b/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md index 62c4acd5e..b4cd02729 100644 --- a/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md +++ b/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md @@ -8,7 +8,10 @@ type: blog Using Z Lab's DFlash speculative decoding models with SGLang’s newly default Spec V2 engine, you can achieve state-of-the-art latencies for LLM inference serving. - +
+ + Workload: Qwen 3.5 397B-A17B (BF16), HumanEval. Settings: greedy decoding, thinking enabled, max new tokens 4096. Hardware: 8xB200. +
Below, we describe DFlash’s novel diffusion \+ KV injection strategy for speculative decoding, why that matters for achieving massive speedups, and how the teams at [Z Lab](https://z-lab.ai), SGLang, and [Modal](https://modal.com) worked together to make those speedups available to everyone. diff --git a/public/images/blog/dflash-v2/dflash-headline-perf.webp b/public/images/blog/dflash-v2/dflash-headline-perf.webp index 56b7c93b43de8da576bca3226b03a57a3a8d2761..45d2f77ba0c98ee1edb0c30444dbbbfa49556bbf 100644 GIT binary patch literal 11710 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 XF2(VWH{+Xaw$PNZ;D1j@0O0=s)_`bl From 55e50f8d47dd755f8614ad865f7bc93cec0db7a3 Mon Sep 17 00:00:00 2001 From: Charles Frye Date: Fri, 12 Jun 2026 01:57:42 +0000 Subject: [PATCH 04/14] update release date --- ...2026-06-12-next-generation-speculative-decoding-dflash-v2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md b/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md index b4cd02729..21a459139 100644 --- a/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md +++ b/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md @@ -1,7 +1,7 @@ --- title: "The next generation of speculative decoding: DFlash and Spec V2" author: "Z Lab, Modal, and SGLang Teams" -date: "June 12, 2026" +date: "June 15, 2026" previewImg: /images/blog/dflash-v2/dflash-arch-diagram.webp type: blog --- From f18a3d3b71e80a730e18611c1f1c4011566d060a Mon Sep 17 00:00:00 2001 From: Charles Frye Date: Fri, 12 Jun 2026 16:14:35 -0700 Subject: [PATCH 05/14] Update blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md Co-authored-by: Qiaolin Yu --- ...2026-06-12-next-generation-speculative-decoding-dflash-v2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md b/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md index 21a459139..6cf8e6e18 100644 --- a/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md +++ b/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md @@ -134,4 +134,4 @@ Z Lab: Jian Chen, Yesheng Liang, and Zhijian Liu. Modal: David Wang and Charles Frye. -SGLang: Qiaolin Yu and Liangsheng Yin. +SGLang: Qiaolin Yu, Liangsheng Yin, and Khoa Pham. From 5bd9a7966f06eb784e1148c2787cf9ea8bfb55de Mon Sep 17 00:00:00 2001 From: Charles Frye Date: Fri, 12 Jun 2026 23:42:31 +0000 Subject: [PATCH 06/14] minor fixes from review --- ...t-generation-speculative-decoding-dflash-v2.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md b/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md index 6cf8e6e18..834432d13 100644 --- a/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md +++ b/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md @@ -6,13 +6,18 @@ previewImg: /images/blog/dflash-v2/dflash-arch-diagram.webp type: blog --- -Using Z Lab's DFlash speculative decoding models with SGLang’s newly default Spec V2 engine, you can achieve state-of-the-art latencies for LLM inference serving. +Using Modal and Z Lab's DFlash speculative decoding models with SGLang’s newly default Spec V2 engine, you can achieve state-of-the-art latencies for LLM inference serving. Our jointly-released DFlash model for Qwen 3.5 397B-A17B achieves about 4x the throughput of the baseline model and 2x the throughput of the native MTP speculation.
- Workload: Qwen 3.5 397B-A17B (BF16), HumanEval. Settings: greedy decoding, thinking enabled, max new tokens 4096. Hardware: 8xB200. + Workload: Qwen 3.5 397B-A17B (BF16), HumanEval. Settings: greedy decoding, thinking enabled, max new tokens 4096. Hardware: 8xB200. Acceptance lengths are averaged across requests.
+To celebrate this collaboration, we're releasing this model in triplicate across our Hugging Face organizations: +- [`z-lab/Qwen3.5-397B-A17B-DFlash`](https://huggingface.co/z-lab/Qwen3.5-397B-A17B-DFlash) +- [`modal-labs/Qwen3.5-397B-A17B-DFlash`](https://huggingface.co/modal-labs/Qwen3.5-397B-A17B-DFlash) +- [`lmsys/Qwen3.5-397B-A17B-DFlash`](https://huggingface.co/lmsys/Qwen3.5-397B-A17B-DFlash) + Below, we describe DFlash’s novel diffusion \+ KV injection strategy for speculative decoding, why that matters for achieving massive speedups, and how the teams at [Z Lab](https://z-lab.ai), SGLang, and [Modal](https://modal.com) worked together to make those speedups available to everyone. And we mean everyone! You can [run tensor-parallel Qwen 3.6 35B-A3B with DFlash right now](https://modal.com/docs/examples/sglang_low_latency) on Modal's serverless GPUs, achieving decode speeds of up to 1k tps: @@ -114,12 +119,14 @@ Under V2 with these optimizations, performance improved by over 25%, from \~9,70 The aforementioned optimizations can be used by all draft models. But DFlash is able to take greater advantage of overlap scheduling. In particular, because DFlash uses immediate materialization from the target to construct the draft KV, it doesn’t need a separate draft-extend step to run the draft model on only accepted tokens and populate KV. This draft-extend step, used in EAGLE, requires that accepted tokens are known before host-side planning can proceed. -## High-performance DFlash speculative models are available for a variety of models +## High-performance DFlash draft models are available for a variety of models -TODO: Write this section up once we have final model list and numbers. +Today, we're releasing a new DFlash draft model for Qwen 3.5 397B-A17B. ![](/images/blog/dflash-v2/dflash-perf-big-sweep.webp) +You can find more high-quality drafters in Z Lab's [DFlash collection on Hugging Face](https://huggingface.co/collections/z-lab/dflash). And keep your eyes peeled for more models soon. + ## Try DFlash in SGLang now Unlike posts from proprietary inference providers, you don’t have to just read this blog and feel FOMO. You can [read the code](https://github.com/sgl-project/sglang/pull/23000). You can deploy a DFlash-accelerated SGLang server [right now](https://modal.com/docs/examples/sglang_low_latency), and then start tinkering. From f037e65fbf52dc44bab563c99c2f514fe8ba62d8 Mon Sep 17 00:00:00 2001 From: Charles Frye Date: Sat, 13 Jun 2026 00:52:58 +0000 Subject: [PATCH 07/14] incorporate suggestions from #2 --- ...neration-speculative-decoding-dflash-v2.md | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md b/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md index 834432d13..3b4f2f216 100644 --- a/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md +++ b/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md @@ -14,6 +14,7 @@ Using Modal and Z Lab's DFlash speculative decoding models with SGLang’s newly To celebrate this collaboration, we're releasing this model in triplicate across our Hugging Face organizations: + - [`z-lab/Qwen3.5-397B-A17B-DFlash`](https://huggingface.co/z-lab/Qwen3.5-397B-A17B-DFlash) - [`modal-labs/Qwen3.5-397B-A17B-DFlash`](https://huggingface.co/modal-labs/Qwen3.5-397B-A17B-DFlash) - [`lmsys/Qwen3.5-397B-A17B-DFlash`](https://huggingface.co/lmsys/Qwen3.5-397B-A17B-DFlash) @@ -34,13 +35,13 @@ Transformer-based large language models (LLMs) are powerful, but their autoregre [Speculative decoding](https://arxiv.org/abs/2211.17192) addresses this bottleneck by using a smaller, faster draft model to propose multiple tokens, which are then verified in parallel by the target LLM, with no impact on model quality. -However, many speculative decoding methods, like the [EAGLE series](https://arxiv.org/abs/2503.01840) and the native multi-token prediction (MTP) modules in recent models like [Gemma 4](https://blog.google/innovation-and-ai/technology/developers-tools/multi-token-prediction-gemma-4/) and [DeepSeek-V4](https://www.lmsys.org/blog/2026-04-25-deepseek-v4/), still rely on sequential autoregression – but in the draft model instead of the target. The draft model generates draft tokens one-by-one, which makes them a poor fit for modern hardware and limits the achievable speedup. +However, many speculative decoding methods, like the [EAGLE series](https://arxiv.org/abs/2503.01840) and the native multi-token prediction (MTP) modules in recent models like [Gemma 4](https://blog.google/innovation-and-ai/technology/developers-tools/multi-token-prediction-gemma-4/) and [DeepSeek-V4](https://www.lmsys.org/blog/2026-04-25-deepseek-v4/), still rely on sequential autoregression – but in the draft model instead of the target. The draft model generates draft tokens one-by-one,a poor fit for modern hardware and a limit on achievable speedup. -That’s why the Z Lab developed [DFlash](https://arxiv.org/abs/2602.06036), which uses a lightweight block diffusion draft model to generate an entire block of draft tokens in parallel, just the way that GPUs and TPUs like. Xiaomi's new Mimo v2.5-Pro-UltraSpeed uses DFlash to achieve [over 1k output tps](https://mimo.xiaomi.com/blog/mimo-tilert-1000tps). +That’s why Z Lab developed [DFlash](https://arxiv.org/abs/2602.06036), which uses a lightweight block diffusion draft model to generate an entire block of draft tokens in parallel, just the way GPUs and TPUs like. Xiaomi's new MiMo v2.5-Pro-UltraSpeed uses DFlash to achieve [over 1k output tps](https://mimo.xiaomi.com/blog/mimo-tilert-1000tps). Using block diffusion for speculative drafting is non-trivial. Directly training a small block diffusion model as the drafter leads to low acceptance length, while using an existing large diffusion LLM like [SpecDiff-2](https://arxiv.org/abs/2511.00606) as the drafter introduces a large memory footprint and high drafting cost. -The key insight of DFlash is simple: the target LLM knows the context best. Inspired by previous methods like [Medusa](https://arxiv.org/abs/2401.10774), [EAGLE](https://arxiv.org/html/2503.01840v1) and MTP ([Gloeckle et al., 2024](https://arxiv.org/abs/2404.19737); [Samragh et al., 2025](https://arxiv.org/abs/2507.11851)), we extract hidden representations of the context tokens from the target model. But different from previous work, we inject them directly into the draft model’s KV cache. This allows the draft model to skip modeling the full context from scratch and focus purely on predicting the next block of tokens – using the same tensors as the later layers of the target model\! +The key insight of DFlash is simple: the target LLM knows the context best. Inspired by previous methods like [Medusa](https://arxiv.org/abs/2401.10774), [EAGLE](https://arxiv.org/html/2503.01840v1) and MTP ([Gloeckle et al., 2024](https://arxiv.org/abs/2404.19737); [Samragh et al., 2025](https://arxiv.org/abs/2507.11851)), we extract hidden representations of the context tokens from the target model. Unlike previous work, we inject them directly into the draft model’s KV cache. This scales better with increased draft depth. KV injection also allows the draft model to skip modeling the full context from scratch and focus purely on predicting the next block of tokens – using the same tensors as the later layers of the target model\! ![](/images/blog/dflash-v2/dflash-arch-diagram.webp) @@ -48,9 +49,9 @@ With this design, DFlash leverages the rich, highly relevant contextual features ### Why is DFlash so fast? -Speculative decoding speedup mainly depends on two factors: how many drafted tokens are accepted per cycle and how much extra cost the draft model adds. DFlash improves both, using two distinct techniques. +Speculative decoding speedup mainly depends on two factors: how many drafted tokens are accepted per cycle and how much extra cost the draft model adds. DFlash improves both: diffusion drafting lowers draft cost and KV injection raises acceptance. -Concretely, DFlash achieves a similar acceptance length to a 5-layer EAGLE-3 drafter, but thanks to its ultra-fast parallel drafting, it delivers much higher end-to-end speedup. Results are reported as `acc_len / speedup`. +Concretely, let's compare end-to-end acceptance lengths and speeds for a 5-layer EAGLE-3 drafter and several 5-layer DFlash variant drafters trained for Qwen 3-4B on the same dataset. Baseline DFlash achieves a similar acceptance length to a 5-layer EAGLE-3 drafter, but thanks to its ultra-fast parallel drafting, it delivers much higher end-to-end speedup. Results are reported as `acc_len / speedup`. | Task | EAGLE-3 (5 layers) | DFlash | | :-------- | :----------------- | :------------- | @@ -62,31 +63,31 @@ Concretely, DFlash achieves a similar acceptance length to a 5-layer EAGLE-3 dra Autoregressive drafters like EAGLE-3 generate draft tokens one by one. As the draft length grows, the drafting cost grows roughly linearly. To keep latency low, these methods usually rely on very shallow draft models, which limits draft quality. -DFlash avoids this bottleneck with a block diffusion drafter. It generates the whole draft block in parallel with a single forward pass, making drafting much more hardware-friendly. A 5-layer DFlash drafter generating 16 tokens has lower drafting latency than a shallower EAGLE-3 drafter. +DFlash avoids this bottleneck with a block diffusion drafter. It generates a whole block of tokens in parallel with a single forward pass, making drafting much more hardware-friendly. A 5-layer DFlash drafter generating 4, 8, or even 16 tokens has much lower drafting latency than a single-layer EAGLE-3 drafter producing 4 tokens. -We can observe the independent impact of this technique in end-to-end benchmarks, where DFlash still provides a higher end-to-end speedup than EAGLE-3, even at lower acceptance lengths. +We can observe the independent impact of this technique by ablating other DFlash architectural features. DFlash still provides a higher end-to-end speedup than EAGLE-3, even at lower acceptance lengths, thanks to its faster drafting. | Task | EAGLE-3 (5 layers) | DFlash (diffusion only) | -| :-------- | :----------------- | :------------------------- | -| GSM8K | 4.2 / 2.1x | **3.5 / 2.9x** | -| HumanEval | 4.3 / 2.2x | **3.5 / 2.9x** | -| MT-Bench | 3.1 / 1.4x | **2.6 / 2.0x** | +| :-------- | :----------------- | :---------------------- | +| GSM8K | 4.2 / 2.1x | **3.5 / 2.9x** | +| HumanEval | 4.3 / 2.2x | **3.5 / 2.9x** | +| MT-Bench | 3.1 / 1.4x | **2.6 / 2.0x** | **KV injection increases acceptance lengths** -Fast drafting only helps if the drafted tokens are accepted. Existing methods like EAGLE-3 use target model features only at the input of the draft model, so this information can fade as the draft model gets deeper. +Fast drafting only helps if the drafted tokens are accepted. EAGLE-3 uses target model features only at the input of the draft model, and this signal fades in deeper draft models. DFlash instead injects target features into the KV cache of every draft layer. This keeps the drafter strongly conditioned on the target model’s context throughout generation, allowing deeper drafters to produce higher-quality drafts. -We can also observe the independent impact of this technique in end-to-end-benchmarks, where DFlash in autoregressive mode still runs faster due to higher acceptance lengths. +We can also observe the independent impact of KV injection by ablating the diffusion drafting. DFlash in autoregressive mode still produces higher speedups in our end-to-end benchmark due to higher acceptance lengths. | Task | EAGLE-3 (5 layers) | DFlash (injection only) | -| :-------- | :----------------- | :------------------------- | -| GSM8K | 4.2 / 2.1x | **4.8 / 2.4x** | -| HumanEval | 4.3 / 2.2x | **4.6 / 2.3x** | -| MT-Bench | 3.1 / 1.4x | **3.4 / 1.5x** | +| :-------- | :----------------- | :---------------------- | +| GSM8K | 4.2 / 2.1x | **4.8 / 2.4x** | +| HumanEval | 4.3 / 2.2x | **4.6 / 2.3x** | +| MT-Bench | 3.1 / 1.4x | **3.4 / 1.5x** | ## Implementing DFlash in SGLang @@ -102,15 +103,15 @@ As a reminder, SGLang uses a scheduler process (mostly on the host) to drive exe That’s not new in DFlash. The main novelty is the KV injection, which ties state between the draft and target models. For methods like EAGLE, the draft KV cache is fully private to the draft model, calculated based on KV projection of the draft’s own latents. In DFlash, the latents of the target model are instead passed through a KV projection by the draft model. -We don’t want to store those latents and cut into precious KV cache space and we want all requests that have the same prefix to share the radix cache. So we run the draft KV projection ahead of the rest of the draft forward pass – *immediate materialization*. That needs to be fast, so we added a layer-batched linear projection and a fused Triton kernel for the norm+RoPE post-processing. +We don’t want to store those latents and cut into precious KV cache space and we want all requests that have the same prefix to share the radix cache. So we run the draft KV projection ahead of the rest of the draft forward pass – _immediate materialization_. That needs to be fast, so we added a layer-batched linear projection and a fused Triton kernel for the norm+RoPE post-processing. ## Eliminating host overhead for DFlash with Spec V2 and overlap scheduling That worked and was fast, but we knew it could be faster. We were concurrently working on the V2 speculative decoding engine, so the next step was to [combine DFlash with the V2 engine](https://github.com/sgl-project/sglang/pull/23000), which is what’s now available in SGLang. -The key goal of the V2 engine as a whole is to reduce points of host-device synchronization, which [kill inference performance](https://modal.com/blog/host-overhead-inference-efficiency), no matter how fast the GPU is or how good the kernels are. The solution is called the *overlap scheduler*. +The key goal of the V2 engine as a whole is to reduce points of host-device synchronization, which [kill inference performance](https://modal.com/blog/host-overhead-inference-efficiency), no matter how fast the GPU is or how good the kernels are. The solution is called the _overlap scheduler_. -In particular, there’s two key opportunities for overlap: +In particular, there are two key opportunities for overlap: 1. host-side `pop_and_process` cleanup after the GPU finishes batch N-1 (e.g. stop token detection, request metadata updates) can overlap with GPU work on batch N; 2. host KV allocation (in `prepare_for_decode`) for batch N can overlap with GPU work on batch N-1. @@ -131,7 +132,7 @@ You can find more high-quality drafters in Z Lab's [DFlash collection on Hugging Unlike posts from proprietary inference providers, you don’t have to just read this blog and feel FOMO. You can [read the code](https://github.com/sgl-project/sglang/pull/23000). You can deploy a DFlash-accelerated SGLang server [right now](https://modal.com/docs/examples/sglang_low_latency), and then start tinkering. -More broadly: you can run inference at state-of-the-art intelligences and speeds thanks to the work of the open-weights model builders, systems researchers, and the open source community. Whether it’s research work on techniques like DFlash by the [Z Lab](https://z-lab.ai/) or features and performance enhancements from open source contributors like [Modal](https://modal.com/), the world’s best work on LLM inference is landing in the SGLang open source engine for you to build on and with. +More broadly: you can run inference at optimal intelligence, speed, and cost thanks to the work of the open-weights model builders, systems researchers, and the open source community. Whether it’s research work on techniques like DFlash by the [Z Lab](https://z-lab.ai/) or features and performance enhancements from open source contributors like [Modal](https://modal.com/), the world’s best work on LLM inference is landing in the SGLang open source engine for you to build on and with. ## Acknowledgements From d091150f5fed669982eb86898c4b2ee8efb7d5c9 Mon Sep 17 00:00:00 2001 From: Charles Frye Date: Sun, 14 Jun 2026 23:00:11 +0000 Subject: [PATCH 08/14] update with new benchmark numbers and figures --- ...eration-speculative-decoding-dflash-v2.md} | 22 +++++++++++------- .../blog/dflash-v2/dflash-headline-perf.webp | Bin 11710 -> 7732 bytes .../blog/dflash-v2/dflash-perf-big-sweep.webp | Bin 3038 -> 33914 bytes 3 files changed, 13 insertions(+), 9 deletions(-) rename blog/{2026-06-12-next-generation-speculative-decoding-dflash-v2.md => 2026-06-15-next-generation-speculative-decoding-dflash-v2.md} (86%) diff --git a/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md b/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md similarity index 86% rename from blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md rename to blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md index 3b4f2f216..67d43f222 100644 --- a/blog/2026-06-12-next-generation-speculative-decoding-dflash-v2.md +++ b/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md @@ -6,11 +6,11 @@ previewImg: /images/blog/dflash-v2/dflash-arch-diagram.webp type: blog --- -Using Modal and Z Lab's DFlash speculative decoding models with SGLang’s newly default Spec V2 engine, you can achieve state-of-the-art latencies for LLM inference serving. Our jointly-released DFlash model for Qwen 3.5 397B-A17B achieves about 4x the throughput of the baseline model and 2x the throughput of the native MTP speculation. +Using Modal and Z Lab's DFlash speculative decoding models with SGLang’s newly default Spec V2 engine, you can achieve state-of-the-art latencies for LLM inference serving. Our new, jointly-released DFlash model for Qwen 3.5 397B-A17B achieves higher throughput than both the baseline model and native MTP speculation in all the settings we benchmarked. At concurrency 1 on the HumanEval coding dataset, it achieves 4x the throughput of baseline and 1.5x the throughput of MTP.
- Workload: Qwen 3.5 397B-A17B (BF16), HumanEval. Settings: greedy decoding, thinking enabled, max new tokens 4096. Hardware: 8xB200. Acceptance lengths are averaged across requests. + Workload: Qwen 3.5 397B-A17B (BF16), HumanEval. Settings: greedy decoding, thinking enabled, max new tokens 4096. Hardware: 8xB200 on Modal. Acceptance lengths are averaged across requests. Draft token/block counts selected for maximum throughput (MTP: 7 steps; DFlash: block size 16).
To celebrate this collaboration, we're releasing this model in triplicate across our Hugging Face organizations: @@ -91,7 +91,7 @@ We can also observe the independent impact of KV injection by ablating the diffu ## Implementing DFlash in SGLang -The benchmark numbers in this section are from the initial implementation of DFlash as part of R&D by Z Lab. Based on these impressive results, the teams at Modal and SGLang collaborated with Z Lab to optimize end-to-end performance in the SGLang inference engine. +The benchmark numbers in the above section are from the initial implementation of DFlash as part of R&D by Z Lab. Based on these impressive results, the teams at Modal and SGLang collaborated with Z Lab to optimize end-to-end performance in the SGLang inference engine. Bringing a performance optimization technique like DFlash from research to prod requires two basic components: implementing the technique inside a high-performance engine and then optimizing the performance of the end-to-end system, from host scheduler to GPU execution. @@ -116,21 +116,25 @@ In particular, there are two key opportunities for overlap: 1. host-side `pop_and_process` cleanup after the GPU finishes batch N-1 (e.g. stop token detection, request metadata updates) can overlap with GPU work on batch N; 2. host KV allocation (in `prepare_for_decode`) for batch N can overlap with GPU work on batch N-1. -Under V2 with these optimizations, performance improved by over 25%, from \~9,700 tok/s to \~12,300 tok/s, when running Qwen 3-8B on a single B200 at concurrency 32 ([details here](https://github.com/sgl-project/sglang/pull/20547)). +Under V2 with these optimizations, performance improved by over 33%, from \~11.4 ktok/s to \~15.3 ktok/s, when running Qwen 3-8B on a single B200 at concurrency 32 ([details here](https://github.com/sgl-project/sglang/pull/23000)). -The aforementioned optimizations can be used by all draft models. But DFlash is able to take greater advantage of overlap scheduling. In particular, because DFlash uses immediate materialization from the target to construct the draft KV, it doesn’t need a separate draft-extend step to run the draft model on only accepted tokens and populate KV. This draft-extend step, used in EAGLE, requires that accepted tokens are known before host-side planning can proceed. +The aforementioned optimizations are broadly applicable to draft-model speculative decoding. DFlash benefits more from overlap scheduling because each next step can be planned from a fixed block-size watermark: it carries `new_seq_lens` on GPU plus separate planning/reserved host KV lengths, so scheduler planning does not require refreshing the current CPU seq-lens mirror. ## High-performance DFlash draft models are available for a variety of models -Today, we're releasing a new DFlash draft model for Qwen 3.5 397B-A17B. +Today, we're releasing a new DFlash draft model for Qwen 3.5 397B-A17B. It achieves higher throughput than the model's native MTP speculation in all of the settings we tested, from GSM8K to HumanEval to MT-Bench and for request concurrencies from 1 to 32. + +
+ + For benchmark details and to reproduce the numbers yourself, see the Hugging Face repo. +
-![](/images/blog/dflash-v2/dflash-perf-big-sweep.webp) -You can find more high-quality drafters in Z Lab's [DFlash collection on Hugging Face](https://huggingface.co/collections/z-lab/dflash). And keep your eyes peeled for more models soon. +You can find more high-quality drafters in Z Lab's [DFlash collection on Hugging Face](https://huggingface.co/collections/z-lab/dflash). And keep your eyes peeled for more models soon! ## Try DFlash in SGLang now -Unlike posts from proprietary inference providers, you don’t have to just read this blog and feel FOMO. You can [read the code](https://github.com/sgl-project/sglang/pull/23000). You can deploy a DFlash-accelerated SGLang server [right now](https://modal.com/docs/examples/sglang_low_latency), and then start tinkering. +Unlike posts from proprietary inference providers, you don’t have to just read this blog and feel FOMO. You can [read the code](https://github.com/sgl-project/sglang/pull/23000). You can deploy a DFlash-accelerated SGLang server [right now](https://modal.com/docs/examples/sglang_low_latency) and then start tinkering. More broadly: you can run inference at optimal intelligence, speed, and cost thanks to the work of the open-weights model builders, systems researchers, and the open source community. Whether it’s research work on techniques like DFlash by the [Z Lab](https://z-lab.ai/) or features and performance enhancements from open source contributors like [Modal](https://modal.com/), the world’s best work on LLM inference is landing in the SGLang open source engine for you to build on and with. diff --git a/public/images/blog/dflash-v2/dflash-headline-perf.webp b/public/images/blog/dflash-v2/dflash-headline-perf.webp index 45d2f77ba0c98ee1edb0c30444dbbbfa49556bbf..b1fa55ee16a988a0056b7c5c5b010cfaa3b7b10e 100644 GIT binary patch literal 7732 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 literal 11710 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 z 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 literal 3038 zcmeHIYcvxM8{dc_mnGzuVe}8pHRe9KCy~o&B&9S(a*GUem#L7s=hCDMvFWx#hLGl# zODaO-mN1QNuG|0p_MZ2=eR{vW=lq{f&-tC-m*;mmkLyWW+tK|1fTxY+8ILoDinM?2 z;6gwtP`#B`p2u8G0%t`aD1nXT!O}b_FDM~RR9VP%# z!u8_nusSy=yYOB5TKqliX9SEh!5QD7&JKL}i-B0=E+Qz{HEuqa%hda|!|M6+p7~H{ zb1Z|D4_vLC9 zhNM53hJ8yyCtR&tTn(z#@Ce24Lw&El)z~LXl%B=vSmz1Z9B%ocEUN*wD9YMyDWsC{^|0M4Jrg`iH0EfFZ1Ng%PT`87H@(c;vzugrn zp-R3rcLTm`)peJm4+iSz)?|@3)%&w+JqKli0tH?^p-$fVm5G3uL|oV zMF>8W$0U?`%D0Ses#D%b3oBrC#dmNt%`;N;SgkT|189;oom|)(jq2ogrZ!Wj8!<7W z%10#CQgSKl5Je!XYGS(IC|gB1F0il}S<3K8Ug(V*%RSmwCKj`5B)Kgd9YS%o9}v{u ziy8uRtae3qvyQJznYg+(O2%xN`o+coILB5cPfar(_Eq${S zusvacPZG3X7GT|7EMB2*|AbfeUsQNXtJBxSR;rGA3PgUAJVEW4WRKw+e8i6P)%YFj zLrdIysB8)jgz7YZ4Ab9E)&xb0mp{#Kk8&as(jkx9_3LH_Jp$;G4;H1v@z4?Bspt7;u+3V%xg)VunXjW~k9?oEtbb zfO{}zDsXCm{oc*hhtMR0FvW^rlsoLihLLV8MOQBDI01PSk?|!W7d6x5pQ^FFC1v$u zTZPfwsY7L_*Gsf^R9KXNG^g4r*Frr%Xn4px$}1)79lsy+E&Kel$`35Ik`QKFGG24E z9yL&ceY)zdm*8TaD_^x2X>D^ZICVo|)P?-=ISlkmtL+s}P*7s|n1)nVe%mOH8%aeBbcHZv|a(}~`L|kW7 zT6E;)&6Lpit1}Pe;+_$RjR!Y97iL^Yy_!6tRZZtcyBKK5xVsY`KFD0($a59M+Wq1+ zIH9?GHJ0+x0Wz31k4*B?GU?bUTAodW+5>j=n zNKm8ZY2&P4A>kL5t(}YDEC`1PoLz#2J4I*L%gZ@(SNNdD{i(`?ldIHu`TkWxgDG_k z)7SF|6c+`=jugf}3`FG@|6OG5sFlvqw3;>T*3zAfD1*NA- z+&6(AB%|IbcZl&`lkQPLYBZJvTjd62-Z`*{QG9$z6>X|exCS`PgSEnMG=vXago~E2 zWwT~RK+OAXI*g#E^pta7+HD;J>dJlvkkY=8*juQ-cv?f8dB!$%lh`LynlV|S1HbmxV4R^XMUH;BnLGUu!S zgXZUnZNmS>hd82P1f~-3fW<@VYq00>?l8#l)4vS4jDme^3|E8N7am<%ba@raShX?dq z#kJSVr53e~x}4-te!{zj5F1MRP^+&GSQ=WpVNRb6&-o`?!lSgycJ Date: Sun, 14 Jun 2026 23:10:35 +0000 Subject: [PATCH 09/14] remove watermark section --- ...2026-06-15-next-generation-speculative-decoding-dflash-v2.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md b/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md index 67d43f222..f99db23b5 100644 --- a/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md +++ b/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md @@ -118,8 +118,6 @@ In particular, there are two key opportunities for overlap: Under V2 with these optimizations, performance improved by over 33%, from \~11.4 ktok/s to \~15.3 ktok/s, when running Qwen 3-8B on a single B200 at concurrency 32 ([details here](https://github.com/sgl-project/sglang/pull/23000)). -The aforementioned optimizations are broadly applicable to draft-model speculative decoding. DFlash benefits more from overlap scheduling because each next step can be planned from a fixed block-size watermark: it carries `new_seq_lens` on GPU plus separate planning/reserved host KV lengths, so scheduler planning does not require refreshing the current CPU seq-lens mirror. - ## High-performance DFlash draft models are available for a variety of models Today, we're releasing a new DFlash draft model for Qwen 3.5 397B-A17B. It achieves higher throughput than the model's native MTP speculation in all of the settings we tested, from GSM8K to HumanEval to MT-Bench and for request concurrencies from 1 to 32. From 1224d00324b5a7dcd1dbfcfcd512715966a0f0e0 Mon Sep 17 00:00:00 2001 From: Charles Frye Date: Sun, 14 Jun 2026 23:18:09 +0000 Subject: [PATCH 10/14] add Z Lab shoutout --- ...2026-06-15-next-generation-speculative-decoding-dflash-v2.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md b/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md index f99db23b5..e6c56b58b 100644 --- a/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md +++ b/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md @@ -134,6 +134,8 @@ You can find more high-quality drafters in Z Lab's [DFlash collection on Hugging Unlike posts from proprietary inference providers, you don’t have to just read this blog and feel FOMO. You can [read the code](https://github.com/sgl-project/sglang/pull/23000). You can deploy a DFlash-accelerated SGLang server [right now](https://modal.com/docs/examples/sglang_low_latency) and then start tinkering. +You can also train a DFlash speculator model for your own data or target model. The same block diffusion plus KV injection approach can be applied to most target LLMs. Reach out to [Z Lab](https://z-lab.ai) or [Modal](https://modal.com) if you're interested! + More broadly: you can run inference at optimal intelligence, speed, and cost thanks to the work of the open-weights model builders, systems researchers, and the open source community. Whether it’s research work on techniques like DFlash by the [Z Lab](https://z-lab.ai/) or features and performance enhancements from open source contributors like [Modal](https://modal.com/), the world’s best work on LLM inference is landing in the SGLang open source engine for you to build on and with. ## Acknowledgements From 2fcf4730ef3e7c2bdababd4952db5549609e4ee4 Mon Sep 17 00:00:00 2001 From: Charles Frye Date: Sun, 14 Jun 2026 23:24:18 +0000 Subject: [PATCH 11/14] update headline-perf figure with new palette --- .../blog/dflash-v2/dflash-headline-perf.webp | Bin 7732 -> 7656 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/blog/dflash-v2/dflash-headline-perf.webp b/public/images/blog/dflash-v2/dflash-headline-perf.webp index b1fa55ee16a988a0056b7c5c5b010cfaa3b7b10e..466fc2d08faf5eed4e567f50639d7fbfcf3ff28c 100644 GIT binary patch literal 7656 zcmZ{HRZtvU&?WBf?(Qyu1h>I$u;5N`cZU!>0WwH%m!N|M*Wf+`cL_4M+ibr2cWd`$ z`{`D-p6+wIs&!Np6}PD2;0zRGwSZb;bPNC9THSED@EkP=yYL^r%IB&v7c(-@T?B;J z6QDb~KCr&sMWRLLY4L}`4@u4A?rz4ve}U<}e0j?`lG-(=c&)x7T*PD!F*sJgg#D!T ze;a>Jc`aVWy);96A%A1NvfskIO4+4d=@IPdee!{suA;z6(Y{5zSwByo89ao^OD**X zca1-FyxBwRP7xnjuQktU*QLCq24OJR=-uxJP1Mcyu+rDe2ZT4dSHagm_xYn?rD5AW zyJ0CX{%04c*Yz}X^Ga$6miJo!jPhpk&*t}i-L=_0?B#VL^auvKSAT7XT`?~51|*o= z^s?=ICdv7g)4j3t8+E!T{#xM@fS$AdfkR$ZT6HeKrD9kSd& zOs>D@TS-Ed#6F56{|}h|ikoq1Th-?H-etul2@q|m+Yt>kd$3*RjN9OTi!2sd(5aYg z%I0Spg-d2F6@(ze(`l6(UYblz{$Fgmt@^94|I|6()P;L7sK$udvo`+o>u8x}B?Jju zh=>3{X?C*L$BCm;=ai0DA}g6PEX^}ru}zk05wY zT*bXAmSj{My1}@dZ0)xT7CKe_3N5*Q!ic73pWKBjgApxCM9m(yEd zD95l=VrhM+VG~xih_2Xc6QxuNCEpQ-UlAGgpoB|QUKJg#srcm#1wV}hL0dyu(HM%f zk$8nAC{K&rL>83CD*gX)Bi~2l6amd!G!G3I2{m@d^Q8G_VqHR5X4%ckA>N_Kn1MhQ zT;zWwD!}{O8@;u_yz0@i>mpy}rVhc8_g&Gt(NJXK{*PrG*?E!00^Z1_Ua!c~3^-$- zCe^xo+eZ`$L8(Hu)Pg04|FS77nVj}A0dg>NH$>+5LYIn+jBctZ6O}WJZ+ltiBV}As z*zOnd!!Si4m6iYTGxo)TUHPJ$#iRnFMXk9A{x@Q0X*ra^;Sw(kp(~*tfs~cH3Ckz=e`{XhJ3XE4*i`wq z=IfqgzX!Pkh%8mj-`+ISL7ocqXcAS-)Gka}8mm%(d%XCw+wduDO}C zIAWg@3PNagL730B$crpM%^v*M>d_fe9LkDPNyz*{KoycAJk!Wvz$pY{HX2v0Tv>H}WfkdB|s3IWE*zSBV^G@d9XUL%OhW5d6b{#zCJYb{=+ z0IL6whs;b#0}{cHQsAM0Mv$rdP`7H`ss+r_Ga{tz{jWHdbC*-qwv~^7ag;h4a37i; zUc-ivMj7v@Y100sCUi`8O;|jYWi_-#2%1M|5?AnCHI;)``sr4M@T#w|U%*FvD)OBL z#KlzehL}9@vylbbw11jXlLtdr~uTmiWJwVe8+^#0U2V6LlnlGgj8LEjOnmv#U;8 z>$Dfq1q5ktW;B{h<)*CbURiT?TA3!vnO@^BL##(o5&9Jh>P>xzaIt=_%CvaI{$wKgaFx7PXh zgd49^$sbIyzIXejzh|{4qp!Kz#`elw$#vJxqc=|`TMhZNiOC84uJKV*C&qnD1H=3Q zBn@E!(r|`TMUophDZPl&X_(jB$aPuO4cDJvBc{q1qKwR2VFC{oOHtt!ne9a7g-vhD7$-Le6tDDrkmHm|rmv`@J`?KyEj_ zbe@$6R{P1?*mL<`5DN(rncG%oX5F6@#B(I+&4gR-O4XbR&QKUT?VDB-Pc3Qr=gXIh z@4GxuRV?eY=*(lmj7GG4wE>hW$1}WA5-c^3gtxgno-2wE75VNg`hKi^KVRaCmF(>a zZl9cye)%T_bmK6;AevMB;s`F^%hB7OMz6^CrWYH+5B&kLIEWz|Mx?3DQYhY5KLs02 z9=IRr?n#nz0pXFD)LMfF;5U|(y;9x9OA$@8LoA;uw||B-s@b+8M2 z%p04+pBVdut_@<8IfU>W6qrr!Sq}v3X#7g3oc$|`9=y?ERfmuWO};bnp+mWcZ$4q@ zNgRtXb2clznp4G8XEps0(*RKxiZ*M)Jy4!ozgxyU4ee-NwIa{!BPei95TUJ9-|-X2 z#bFWdWzWRZsd~~a{SU}2lHl}}CVc-Go|7wn zMm8*hT@tUdwmZF4V;#u%H$hjdB+EZLQThXhM+C#+OETR2Pd-tBEy`oeQ*dstV2aI| z&+-7+sn*W+3loh*Mb`~0O8u`l&-tQpHIp{uJBmxFuC+!p>{vy9S}L&Tx$8A0c!Svx zwc%+>Gxtbq&)|_6flyBYZkw;A5=}>NRuB!r_Ko{xg=>9F*z1C`AmhTK zj$G55$B(Wf)x>lAOKTt{=Q^vkyR-d);aV6$zSw=SCagH*?&prYUST0xGpUzs;I*;J z-~>mCLfP7KNVCU$5Zz!=Z9`~<-^yM0h;_hRND7=Rd7ISW=%Fl&ob#l}ghQ}4O;DeEkeH%G^8p^}7FpJ|n9%afXv8vnJns69Splj=FDs28_n4N-7q*@TVIi*N z{LC4Kxk6G4{GVnvMx++sq+3YPHPzkGI_lSbXdlpJ1C86q)qKsT|3LK>rJdpdY^Jv0 zmqes);QkaMo7yC)UvzADF{9%l-Ymyl&uvGijvDBUHDh7Oy;$1$7rqsz?%MYIJEJk-9f}+!ug4l zQHJ$8Mvqy$aPnl3GqR32rQt7948mN8!_)e`8tp*Z(J~c5f!2f6dE}nu&3yxcOBVHi z2M8YpZhH9&qHuYoLk3vNZ$_KZHFp(AUuA!g+2i$%^;yK1yyzrxCRsv}ODcjv8^J2mA6wAuMqxtZQTopXSwJy5``fLb zTmtEVIo-O_b+MTEDOXf2-;12r{#v-|gyG4a5U8t&m1-wTq7Ps%Q};Bgse}hShZ^3{ z%6Pi+%W2AmwQ&S5d*<$`v)3v|X)8$kefuu!dksZ98mdFiJl+aH-9%GXRa)oX0X<6o zseccY7TX&rd50>7K00jRH6+~qZh`fr679rQPYd_9&(3wa0$fgghGTkBM|oHqAD@ly z@vZ0l)z)Yz?u;SMN=l3`I>o)oBLHQi{Z(F$s|p9uS- z4@Ui5kIt+6BU>#ypW8kE*zn9rvti7giljfDeZ;aCbS2l%N_+SAkSLO}5&=(<;DGQQ zlmEzC$7U#|2YE9@K0v%oh>1LQVi^ChdHMdMTNk8 zD8Ug)Q@zxV|p`s1v$2Uj|k@pu}0)Y*x92Zdt z={ozH6bg-s(IF(evz)>tgCQB-r%HYuPdMO_^ePfCL02(>>Y$0^i1V%K3m1ZwkGLVd zY@%T~FA2t}(T*VPHan4wc_squ0`s^N8^)p(LEfc%G!h%1P)^Rn0dlssX;Tmz@rijT z)*q{rRcRrEzQ(K4DmNAPPV6}XU}0;cF8ZgbK+W0A+fh9wD3BwwEi(3MOqrM+?wLm; z!H|_oo}+TT5yb&>a5NwfG_rr`v(_TuJ@JS1D}MEEMay}ttP8#STc2WrwAEIsz2Rai z+9USi1+bp}V(OfN$r}yW(TEBYuNW=MALd%Yy_$RxZ9@Vg4d3Mq$->ALw;CHG>xM%T z@G})&B1kS0#`qD^{-(&ohi}VN9e=R%H-aT(uwc$%EApoPcx?Jgy!m}W?u&|Q0%z>6oAG`V}%5Fncj4m#Pz0{!*c5Ow1InwIm5TBQJQEaZl zg9ipZf$W&0IECn+F4=qZ0{EQuKyqY}H$cVId2zxk33I*y_2Y<8Y`X|$>eG6MaHnArjzJ#d9qdKlg6pFDCqCRUqz8HcnWi|57d3C8y8}(#`#NO}v za?RiS_$j6fKr_mLCjxlB7`L%)#J-O|cgU&`s?j;wK@pdShzCESzVh`sQ+t1)#q&M9 zh@)#WJygA9h@%z*Bf2J_o$0#mqaD}WJiyj<|8Tv%M^T@rk@+C)8dN}ITwAm1#;@hf zM{;ibUfr93%$$9&;5z$dZjsCB7&kX7cyofSxP2o|A4}ar8rrG+b>M?j3q=ZC>_>OR z%3Et2YSvDc-s*HZtnek#H4o{2C)}ra*-r-N0_zL!%5+GWgP|hx3o8O|-WBfnMEL*7gZ>cO!H2&RD z@vg=9kpzLhIp4{Ib=M(d7m#dEbb9`XjBDajCIbgcWmd#2W~Syw@Cs`qsH50IOL)n{ z3BC{5r#%&}H$xtV$L5Zn3p-X9XX5Jq`RFjjSsv~|_bcq~g6NP!EL)awrcb1<=E3Hp z0Xs21fcroKd~N9Nf>AXTTIb*;s)rdOcGQZ(oaRL#GZ+p5$E#{@l+!4pO zbu8kvp8RCfk%X~3V*AvvJ*5c~MMk{*h=v3$17=5TWKDgnqtJ94Pc^(CnXNXM5}&rc zbh{(B*lzMRhvA4YNp5cybFHejpnVefxv@ZRL*c{vp7<}|)*5<%-;Hoa4edpmZbHT+ zGr)4r9wokPaT$zKUg^zc?SeJaHQ&r;b>nmp3e(o&Ydmy95}whX*3h0-{4FJJ6int@ zI+qBZ+ShdD$3U5g7#PsZ#eT6-NUS`vQ{N1$O*KZJCbc?9ftbohtwsd%h+H+ zeb*X%#fE%waUubN`#K*SE)XZ5IB;W5PG^XPEcw;RJ_RhA9IQYWSBkZcWR(;f0++=Z z{TOESw3>mGMAxJ>02GJn+)ZrRfOiJ(Edjnbn?D|W1P)Msb_oXTnV}jVlMW3oiu{%l zGUnB~o*;_!LZ0~zM9mq(u?TY0spab}9>L%+<%|t|-^Rtm5Yu%JH9~QIL~Eu}-N}A> zK@f0jm6pt>z}^CW52CRVUwNm0Mm$@Qrub7gqwu;3FW%FuiY^@pQq5Qv(BxVI@d$aK zdjtztAB>Vnn&M+`!0Xdf2ijVf-6Ixl0snG#o_$1+yIRfh)I$k4Jkt_;aO9r=G(N+% z!$`d}rpFWX?*$lc{Gd|Y%RdYmOcXwvJ_%^7_~By8Eu{Ll-b1IP;Ms%w4(V%n73bdR zpoJkRD~kEC)@xz(m>qWJkBwLo*Y1x>3V@nOQ+-AXFuc37BgG+bDRZHdo0&1LG#Aj1 zk4elwiW!EUa}i+}CXJBQO%jC`b6D=(f?*qWnbO`s0AVpopvPyNB8Ywt)34v(r3l?^ zEDk(<##h&mY@j2Kr2cYnIwj_y&}2hgr3J;)PO5-S>F4fN4xSvD`Ya_DwBTI}wC@>M z@kLSg4hA=ZXuVdr-6nGE^met8*qkB-p=msP=-j+@?eLX(iPp#OW?iTZXabGsZ^Hb- zE+yv9Wf5XD#~ucCl$2U!AcFps;VKo>jLZ?7B$=$ho5!qT7?a6PE$w+kX}g(y1t= zU+Q0BqN_G*G9ui145ZhdOQuc=X(M0)Yw@R8YKAVlX8w9fU;cFqI)bZvfHcfiTL+xroFQ&P&oJW*3(tI!%$Mdth(W064*m{eQY73Y- z`$xc3KcH_^ou~rnZI)UNdx4ioXub)>;+CU+Y#{$8dcmERt4!2qq&ESFd1Xl!;dL>o zl}G{k{pp&n#gFkt)#cI_owX_p+Zr+dYG62vCc9ahO{YPO$3ML&(km#jYXJ$K3gYgq zigmr;;SXhL4+;++(x-MCcyR5UU5x6#$w@5w`vSxC{x*p>tw~jWS9O>+4d*CDo75ib ztP4$3g%(-F);!Wc6=n|UzN&l@C4>u)=}IYRIZ<3Y#6xscn7A2{a#xq*ar<7FgF(w5 zj~rzyq^_=+Q|T##fhP#(ev0lfq0(X-uU8o^RvMt{91hRbuKHVmDFw*#$H%O~X z0Bv~v>*>KIkjH5t^DFX0K0IH9AXcc`P^UpRgQb3@SFp??6$glwHQQAZ+DySL4Pw_`7MvY)1@@uJ=LIbC6KRND%G7!nyI^U}#xSDnenN|%=hzuJ)9{4w z3on}d)GLsrt`56cOH14g+-onTs#o+ub!UZ`C4_zSqCk!=^KpDy3$2+@O*rVUR_LWY z_M#fC*-Z*{A`0}iv zv*gV_*s4P~$d5favU;Z<+}sMjGo=*i9yNJUh1qJ)9X!`nP9%>lo*{1eaG zbAB)`udReRoEqfHr064aeWiT+^3cEW?N()+;*dP?0eF7jkXueM?ajG=&K(r@>hOYf zhjqSj)!Xze_IiAcHDwZJG8w4j4-=^IV)1Np`@Z^yd}=aw|W$}nO*)yy$waY!CDBJFB*8r za7lB1cG__2JZ%eTJ#SsR&CK+I%YvaD|6f1j&Cm;MQxR7K|7|{&czJy3o~sUd;%Nxi z=l4yRfIGBS+wU;}1yEYY>=jh6KkDU>7QD(&PEyR##VZyZ_-RH#U++1eka)bX5dg_0; zeDO5yTf@s-{qS5=0{G-wib>pN2T}*-|0J)Q(`?JUm%<^e%4s0$u}qsvdQ39m68wJo zk5(A(9BV+G@(Y^B!(0t>3{*|Ni1!~#cszXKW->&6MuQhanrTcb&x67}cdy(jSh*zB0Iy>e z&pgJ35R&J`{;*PPX_+tPsHib3n1IDf*lI(ml$z2+!HuQb=cY2px5=xCD`v4`Cit-ndU$y`ibOh%L4hDCBrU3RK6O6*c%{z;_ng+m7*`Ggi z$dqVSa!@vStJ0=ACG7u*YYt{2>>!cG?{pbvJ$&bA6p=uwvc z6NREj%}KFg58=Nrp*(~pva zkj?=*r8UTkstdupm|DP-z)F-xTbXi<9G57~Pdqn$8HEn}ElwrHbDFe{NqswP&8M>6 zAg{|ux)VNW#Dl(H5Xyv)#-f~$VZ`knUGy!~3VSjop=sh6ABHG4rOeM){Qu+f|J&AS z1RC3dQ_*|Og3pW;|A*=DhQ?&}pZ)#gHyEB!pshPjBP)@b>)G?EOnbzBgtJRWuCFX) z*%eZY=GYboyi&C~RI25+d+Na7IpwKJXF>Vp@Km|~MT)=D3ihi&Jmk3&NecLy+$-wx zvX!6prHz|2xQR%ZojT>sCX`asde+$nW0|tN=k^Tp8rai9EJa|5!*uempLRrRxX|Kgyx-(~S4kyRo7?Assu z8qN_@cnfdnLWUxL~DVvu%UdWw>{cH3W8~GNpQ}wd5vJWi&>(K96(q)nlGGGFm zURBqg9KVW#cq-y@fVRK3*T2d0p%y1O23qy)tui|>)DVsRUxJ}~|Gn~3rCsv~-dO>F zw|8bEE|i1byt=a@`p|IYt5$xj%9nq{Fstv|8jWHFpru|E>z=Ud;3tii&yZGt4qkXeP@cFcF> zHaG-{_@3n`V~th@-nc9T7D~TLK_xxJC)aY#8?&nYT$ScK0Whl^^}&v8*FtBm+3Ahi zphAGdH!8cW4QMhh7dEm_nLYc}0I1Kaf3kZ-+|-zc@c`^~>O*Bp=Z1~o%*NNs+(C41 zEOz@u!?EC68WNg(0_gc#IHsU7qw4$${wZ-0+8dIljv>Ae`3x+`lr95`)kKn9L`qQX zoN35~UIBugD@k^N5BNJEI8A}q?h62!PP)SvVh8E5C`V3AlnIwr_p!9k=MTp4_MZ>G z^#&of)4XQ=5yuuENAZI#&Q@cKspvskbP@X%D-w##(TBf)SXOo9bj`|nkUSW?!kS=C zLbIB9e-OHTuXfBNA#;2`zP+%UVqTwTA;4ab{sIeu3_-OYW?MrI>(65LB32#^YpiDo z3K~Q-byqkq&oFknt~2dew>L)MvTFatx<+H-b|O+fE}N3Ej6}8>;{K{uAk;$vZ4O?T zN{B;HUBD#_7?Io|bg7{pF7rVk*8|iDf5KQAhMb`XN{Dv84vWU6Sd)SNs`6JL6v0r^ z5-G0k2eEvcsXptAD#F@#6sC7j#{dNGb-;K%VuSPNzL}h3cE_#P@yOHO;laXE6-KKxI}3V7QFt1N!q1XXT9gw8&{(lV zrZ<$_;2&=`DO4%af!oJ3J*KI@oA^J@FGC5C((8p?LQL`0ZYoe|w5|;Okf#)Ae#`B< zegyQm-GCl%ILIh6j>pFaO_bJ>d%Tpc)R(dUro`9~JUNZmOs*Io*OcVEqjPM|T z0PG{Tcx9S&@2M0#5|tbc+<3p%(Z0NePP*=eIL?f!Z1Eh?KmS!}(g3@zt$x5+oS8bQ zjlrYmszBoF*;<39POYD5fx@BM^G^~fUZ=0jjNq`Tt%+1iL%iv{Ha7&H+QFyoig zC~P4ekSGDkU>Qrkd#k+TLJxHrx&D(}N4d@G`|Y64&g(MUe4^#jRr?5TO5E;~y97^_ zuE*Z2xVbK7d{qTzH^NB@L7jVHUE&O(?1Qt!YYBc_1MAq3DO`JqU}ya#O$t1Siy!tU zfli+bMh`r$QrJ&XH^RH>Xz#yFw--b*4WG zC0}wR_db6Y%tGdik_S!}Rva~Z=gG5v^D7hof+o;Zg?yJcEo|>Y)xY#Zg#`)j3P62( z{!m6v*XMXtPNVO%-du1tAiLD45Ry60>&#Dv4+t`^RIQBG$W`{pPJV^VPG-UemrCe4wW;b5v*pLgO+=e)9gmev2H$Qzs9n`jBRka5 z-g)h^t3G*~X-WH5neZ1*-7N^k&!W?1v{uWmmvbk%g z(nvBSN4mEKnD_eClL&XCX>8b>^|LxKf+EHv-_05jY+zRr9ITSkZa|>IwPy@2~LovG^@bxn_UO1^JN7b$GT5p$!K6p^A*V`02 z@qBY(@4^!V@UiLnOcNkx)R|{-HXv40M9;)FPZ*n>bo|wfv)tY^w5z`s`mu^=K9IRK z`nu+OVpfpR9<9_m{8s$I06WmY04;$tdIHcmn>z5*2o{=mmKd{7PdBjV?m$C*s$$HB zle)Iku(BwmJlQOj{L+g9&poWvfs*E|aeYNu@J@AFJGfi=X>krBZ5OdU;w&IxIXw2%Ug~Zg`r>&36rI&Ti3-dldvj*ux{00JAfg!ipE!NvZd>r^jhzFkW}Xj(voZ|?JYAYfl%1iSZU1QXanl5y@i_M}dG>7593XK?vLcio;^oHn_WFZfb+e|Dm&(uH zCm;s1{3mVKPq?M%F<9k}QxVfJ4mVAF{|nPfX(K-{W?p?pNA8YF@x2SnKy2IGQJo_ZJFZ`L? z@@gdk$LJk-6b6YQB`pvFgPfND$}1B%moK4fyZOt4vHW+Qw% zPVe{5i;S;_f>}(^HuAZ&ix+R5x2e{ANX9!y9M%6mDL&J;2M|4V%b7gJ-y7@5Gjvc#K6)4da0Exe8yN3cZinr<}!3#G|)Tj=;2YY6$ex%~CDZQogRy zW_q+Dx5fQ>^(@%18b><5&gaK_VLU8&PIYC(V)!OhQJy^KLu)8sEj=i1>i%K_!$W%M zn)sLVd7{(aG7GHf*K}7OEq;Y)`V+v*3!=zOL88#c`F%SwKJ zBC5yYHP>v9STdY@p}#uDR_302ghSxO{E$t;My#*Ym=-oy1Z0s7Cr~v&{JM+C^h(Rh z7drhzHh{SR1yNw)+-AYMiNrcG8l;DTvAsP2%+|YY{#2u zS~?C{n4IACCVaHKy-niB7jr{kkAWv8B^LEsY^uU*Hgn zPXgJI8*+S9b}8bI)`blVDxuLj6-{Y-TEy7u{MviPAO~Zrf5{GxCt|JqW7u$hKu_`N zJy6whce^m~DP>o2&R-}F85K-8u>f)=W0~i|$9f~22TJ5P8o19lSvT>~_n&U-1IC>4 z<&`6IuCN&?ge2`ESy`gKDGTt%1m^L&Z!wD!BEOxR>l-~1Sw!ifsa~bE`;K76Naar+ zd$vW+&DL_yIWACxZQWe+BwcQu=ImMwCj)U25ZiQ6>I$bbkAu(AyJDGg1p6NNGxp#= zXAlRGw01=x-NH-$@uLlxTzo;{`_c=Xy)yxohY#=Bm5$0aA123h{McwUozs&Y8k zQ=)u~J>3Tv5RezTJ5Q`O$0d&=J?4sk)QQ6uwa!q=y5%V;ac=LI!ZbQqr8N}1=V_vk zPa(qdj93iH0z1KuJPeZ$^0jn+^zHEPDbrL4RHMQ$%h{~R`l-dZg`0#|c1TyCjaZ(O zHuJ#70AG?P*WXcEMPnV3P_gtFm)2LwY-dYF3O$;TOuoYiT-FC!koaVS4o8)99ZLtyx5<#{-2ax+Blu%D10|?FJEVTIc<QhgGF{- z7EjVYl{vs@m2@h~nu|vuAdew+)eiz5Ww`hahE1dt(Viz)o4JzS7#VgWHPWaLL{^xs z&h^2_uQlw-+@Kf*XtM9pO5uvl0Q(yY2mF z@4QxTXLV85cdUiwb-C4C0mau6-@Q*j+$&GH>mNKw&}50g;wR`n^bOY{B?!K$UYuP< z)4rRPI(c(f1-;Spv^P|&>SQL&By?&6`l@Dm;*_S80--A_JhAm!0 zxt>o~822>hbveQ7y?_|Fc(Tb?mN#{&#)>XZkAZvx?@o)WF!!U>$b!q(tzSV0-+dNnCUu36d_h=*q?*`c;j71S$AT4BV3pCwP8=x#YheZ0 zev_@bRC^l_+BsfKFht-;bMfWIs5i-j?|sZ4={ccHSM@1SAzc{jF${299Ez%ozH;mg z$@L3Lgx8_xD{LI=A)rf1T#{UeHvS9Yz? zG?l0E;xDc(hYimYY_rW%WrvRVdC1^7Rt{OtmVE3})So8xMziJohi(;tz>F|l@#{+? z_PYoo+Xr_{v=P&KAX2IOR?0>^{ebQGcbKO6RerwO5pJ6|!>2I%?E5EV@)Nb%o)j*+ zkX98Lmv64r_2^v28Vd{Uz&Y=wjB=q}Q+ngl= zmmN^>>&Z-`o-j0daTX(E>6m|kuwi8q&A-g>Dvq`1w*VLeLNyxj~4Q|q6R zy=P^csn=mp!4G;W;oWa6VI?J4z z(A)=%moYg$q%y>vN{Kt^*GOLSxrPZhBG!77B~&Vc1bQGv#=;)&ba%l9d-46yj4Z3N zL6M4okC6O=xNW*r-|6ZS#U|9zDON-XC?lrM2>})MmYM{_EK#U`1ZNj3sw!h!`!l>O ziGg~ZVP+wx;3E?Pe^Uq_4$2%akGM?ir6rCZ+In!JJ@(L}kmJ^FdKhKlxB@3|!{Y!( zjj4if=0N>n^2juZ^I&bENl`$zp#UCdhFbK*`r}L+dazf=M`za$nsXyGz6h|aOm3dy z-HZ)uXF13xOm{6zHAj+al3*X0$3~5b{vm^QH0o|v$vy&SIc|wSz5a8V44oHL+fPHN zO>}E*>i#^J4=}0v9!qe@s@L9M1V7E{??%1q=y<0y-tlzJ_TdHIRweib;uaiA(c>f? z2g7$n{Pkm@^x?$i_Dz__RBJAoE_m5(@XYMzk!qi*HlaD@mi<_&FN69Oah^UqVxfkh zj5oX<-nOJD^YjpS5Kyp6PcKs5c4@mwQS?;$E*fm6krTbpP4dbBI5d`Roc`JUOuaZD z3UA!~jyKf%_}8w3++2~kJRk*uva4nm#p!Zh>n1MC>t%=6Qo;{B8;b5HL*>>~h&2!& zNR=di@`LI;tkekd_QVerY5hsg=Zs&gp~@zvGAE|`*|QpcSa~eHhq%9i`nwn9_r!(T zay-e9iy_T^rQMB9K1R_TM(#ZH_HPXK@xq0Dx}K+rpumZ%p?= zmQkti+BjAPWS*q%^sMA}tSzM^2X-YE+= z^0yXMtsTJ~aT{qrIX=xf(L+$lDy`ICcYEeb;_ zA95vLKt?rUT2h`=vB7-xN3I z+?kN?#jsISL*pzqC+XVke}z+%r3zkRh%s4gNt_rn$vBjIy?9bpLI9)EiGCI|jugiVy&?wf`$3x~7@V|jWi=;tVO2*V-}So)v3 zuWWL^)Ui8!oWo0to4g#~n{O}G@4LMMH`>OIq*?LKprRzfIE#P=>rLxMcia#I*k<+rl?;q%Ye!)j}RABbTEG#b_%STPV4MM+zsEc^C2ioIlnPo2}-7S@66`YC=GARZzF@$Y9B(0v!>Wdi2# zuls$2j8+r?Vq)mvn`&kE?UPt><8IK{^ajiHQHVifCxO*D4%dh(^%Zh9mcK#-afH;6 zC&Px#T}^}Sv?Xh?NUF6Pmf_cT1EVau@PHj_BpD&^G=!&20xNUzoTy#a^pMBUds1;O z9QIeo){*jzAsWm)a&sV5F*t92N^K~CZCI3|zSezTVUc?@XWQ;zPtA1L*l4R6X=(tl zbco$E4Y&VtI~$zznc3k!l_fEp-?-DH$4n+^;JVkGy`F{w{N!;}r6Uma{nv1SOzQ1J z1jM6b%-LG%Bj&*tov+ERJcr! zSV{$x)SFP5yuMfCq|)IrpU2wVBK(4sM5N!hOoBEspr#HiWSO6ZRXNEi6({eb{vLHV4exv oG?zbe;CR&fU&RCD&Z~4w(SU;#$=PgF&k&lQuLS>o1^|Hn2Qa1>o&W#< From df0eec3fde18e217124c1c1e3893e1c6766e57fd Mon Sep 17 00:00:00 2001 From: Charles Frye Date: Sun, 14 Jun 2026 23:28:00 +0000 Subject: [PATCH 12/14] minor text fixes --- ...26-06-15-next-generation-speculative-decoding-dflash-v2.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md b/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md index e6c56b58b..8df83141c 100644 --- a/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md +++ b/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md @@ -6,7 +6,7 @@ previewImg: /images/blog/dflash-v2/dflash-arch-diagram.webp type: blog --- -Using Modal and Z Lab's DFlash speculative decoding models with SGLang’s newly default Spec V2 engine, you can achieve state-of-the-art latencies for LLM inference serving. Our new, jointly-released DFlash model for Qwen 3.5 397B-A17B achieves higher throughput than both the baseline model and native MTP speculation in all the settings we benchmarked. At concurrency 1 on the HumanEval coding dataset, it achieves 4x the throughput of baseline and 1.5x the throughput of MTP. +Using Modal and Z Lab's DFlash speculative decoding models with SGLang’s newly default Spec V2 engine, you can achieve state-of-the-art latencies for LLM inference serving. Our new, jointly-released DFlash model for Qwen 3.5 397B-A17B achieves higher throughput than both the baseline model and native MTP speculation in all the settings we benchmarked. At concurrency 1 on the HumanEval coding dataset, it achieves >4.3x the throughput of baseline and 1.5x the throughput of MTP.
@@ -21,7 +21,7 @@ To celebrate this collaboration, we're releasing this model in triplicate across Below, we describe DFlash’s novel diffusion \+ KV injection strategy for speculative decoding, why that matters for achieving massive speedups, and how the teams at [Z Lab](https://z-lab.ai), SGLang, and [Modal](https://modal.com) worked together to make those speedups available to everyone. -And we mean everyone! You can [run tensor-parallel Qwen 3.6 35B-A3B with DFlash right now](https://modal.com/docs/examples/sglang_low_latency) on Modal's serverless GPUs, achieving decode speeds of up to 1k tps: +And we mean everyone! You can [run tensor-parallel Qwen 3.6 35B-A3B with DFlash and Spec V2 right now](https://modal.com/docs/examples/sglang_low_latency) on Modal's serverless GPUs, achieving decode speeds of up to 1k tps: ```shell git clone https://github.com/modal-labs/modal-examples From 46606d64616c9dc7806f7addae19e372c7493308 Mon Sep 17 00:00:00 2001 From: Charles Frye Date: Mon, 15 Jun 2026 14:54:20 +0000 Subject: [PATCH 13/14] update 'try it' sections' --- ...neration-speculative-decoding-dflash-v2.md | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md b/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md index 8df83141c..81228b05a 100644 --- a/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md +++ b/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md @@ -19,16 +19,33 @@ To celebrate this collaboration, we're releasing this model in triplicate across - [`modal-labs/Qwen3.5-397B-A17B-DFlash`](https://huggingface.co/modal-labs/Qwen3.5-397B-A17B-DFlash) - [`lmsys/Qwen3.5-397B-A17B-DFlash`](https://huggingface.co/lmsys/Qwen3.5-397B-A17B-DFlash) -Below, we describe DFlash’s novel diffusion \+ KV injection strategy for speculative decoding, why that matters for achieving massive speedups, and how the teams at [Z Lab](https://z-lab.ai), SGLang, and [Modal](https://modal.com) worked together to make those speedups available to everyone. - -And we mean everyone! You can [run tensor-parallel Qwen 3.6 35B-A3B with DFlash and Spec V2 right now](https://modal.com/docs/examples/sglang_low_latency) on Modal's serverless GPUs, achieving decode speeds of up to 1k tps: +You can try the model yourself with this command: ```shell -git clone https://github.com/modal-labs/modal-examples -cd modal-examples -uvx modal setup && uvx modal run 06_gpu_and_ml/llm-serving/sglang_low_latency.py +export SGLANG_ENABLE_OVERLAP_PLAN_STREAM=1 + +python -m sglang.launch_server \ + --model-path Qwen/Qwen3.5-397B-A17B \ + --trust-remote-code \ + --speculative-algorithm DFLASH \ + --speculative-draft-model-path modal-labs/Qwen3.5-397B-A17B-DFlash \ + --speculative-dflash-block-size 8 \ + --speculative-draft-attention-backend fa4 \ + --attention-backend trtllm_mha \ + --linear-attn-prefill-backend triton \ + --linear-attn-decode-backend flashinfer \ + --mamba-scheduler-strategy extra_buffer \ + --tp-size 8 \ + --max-running-requests 32 \ + --cuda-graph-max-bs-decode 32 \ + --cuda-graph-backend-prefill tc_piecewise \ + --enable-flashinfer-allreduce-fusion \ + --mem-fraction-static 0.8 \ + --host 0.0.0.0 \ ``` +Below, we describe DFlash’s novel diffusion \+ KV injection strategy for speculative decoding, why that matters for achieving massive speedups, and how the teams at [Z Lab](https://z-lab.ai), SGLang, and [Modal](https://modal.com) worked together to make those speedups available to everyone. + ## DFlash: Parallel drafting with KV injection Transformer-based large language models (LLMs) are powerful, but their autoregressive decoding process makes inference slow: tokens must be generated one by one, with low [arithmetic intensity](https://modal.com/gpu-glossary/perf/arithmetic-intensity) that makes them a poor fit for modern hardware. @@ -132,7 +149,7 @@ You can find more high-quality drafters in Z Lab's [DFlash collection on Hugging ## Try DFlash in SGLang now -Unlike posts from proprietary inference providers, you don’t have to just read this blog and feel FOMO. You can [read the code](https://github.com/sgl-project/sglang/pull/23000). You can deploy a DFlash-accelerated SGLang server [right now](https://modal.com/docs/examples/sglang_low_latency) and then start tinkering. +Unlike posts from proprietary inference providers, you don’t have to just read this blog and feel FOMO. You can [read the code](https://github.com/sgl-project/sglang/pull/23000). You can deploy a DFlash-accelerated SGLang server [on Modal right now](https://modal.com/docs/examples/sglang_low_latency) and then start tinkering. You can also train a DFlash speculator model for your own data or target model. The same block diffusion plus KV injection approach can be applied to most target LLMs. Reach out to [Z Lab](https://z-lab.ai) or [Modal](https://modal.com) if you're interested! From 5ee2c408ebdd29c54e30817e4e608d73473a0b94 Mon Sep 17 00:00:00 2001 From: Charles Frye Date: Mon, 15 Jun 2026 08:54:06 -0700 Subject: [PATCH 14/14] Update blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md Co-authored-by: Qiaolin Yu --- ...2026-06-15-next-generation-speculative-decoding-dflash-v2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md b/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md index 81228b05a..8a5313bf9 100644 --- a/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md +++ b/blog/2026-06-15-next-generation-speculative-decoding-dflash-v2.md @@ -149,7 +149,7 @@ You can find more high-quality drafters in Z Lab's [DFlash collection on Hugging ## Try DFlash in SGLang now -Unlike posts from proprietary inference providers, you don’t have to just read this blog and feel FOMO. You can [read the code](https://github.com/sgl-project/sglang/pull/23000). You can deploy a DFlash-accelerated SGLang server [on Modal right now](https://modal.com/docs/examples/sglang_low_latency) and then start tinkering. +You don’t have to just read this blog and feel FOMO. You can [read the code](https://github.com/sgl-project/sglang/pull/23000). You can deploy a DFlash-accelerated SGLang server using the command shown at the start of this post — or spin one up on [Modal](https://modal.com/docs/examples/sglang_low_latency). You can also train a DFlash speculator model for your own data or target model. The same block diffusion plus KV injection approach can be applied to most target LLMs. Reach out to [Z Lab](https://z-lab.ai) or [Modal](https://modal.com) if you're interested!