<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>VLLM on Richelieu's Blog</title><link>https://beaiera.top/tags/vllm/</link><description>Recent content in VLLM on Richelieu's Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 05 Jun 2026 12:00:00 +0800</lastBuildDate><atom:link href="https://beaiera.top/tags/vllm/index.xml" rel="self" type="application/rss+xml"/><item><title>vLLM 中的 Attention Sink 与 Sliding Window Attention 深度解析</title><link>https://beaiera.top/posts/vllm-deepseek-v4-attention-sink-swa/</link><pubDate>Fri, 05 Jun 2026 12:00:00 +0800</pubDate><guid>https://beaiera.top/posts/vllm-deepseek-v4-attention-sink-swa/</guid><description>&lt;h2 id="概述"&gt;概述&lt;/h2&gt;
&lt;p&gt;本文围绕 vLLM 推理引擎中的两个关键注意力机制展开深入分析：&lt;strong&gt;Attention Sink&lt;/strong&gt;（注意力沉没）和 &lt;strong&gt;Sliding Window Attention&lt;/strong&gt;（滑动窗口注意力，SWA）。内容涵盖它们的设计原理、vLLM 中的代码实现、KV cache 管理流程，以及 DeepSeek V4 模型如何运用这些技术。&lt;/p&gt;
&lt;p&gt;所有分析基于 vLLM 代码库中 DeepSeek V4 相关的实现。&lt;/p&gt;</description></item><item><title>vLLM Daily — 2026-06-05</title><link>https://beaiera.top/posts/vllm-daily-2026-06-05/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0800</pubDate><guid>https://beaiera.top/posts/vllm-daily-2026-06-05/</guid><description>&lt;p&gt;共 &lt;strong&gt;58&lt;/strong&gt; 个 commit，涉及 &lt;strong&gt;345&lt;/strong&gt; 个文件，+12156/-3907 行变动。&lt;/p&gt;</description></item><item><title>vLLM Daily — 2026-06-04</title><link>https://beaiera.top/posts/vllm-daily-2026-06-04/</link><pubDate>Thu, 04 Jun 2026 00:00:00 +0800</pubDate><guid>https://beaiera.top/posts/vllm-daily-2026-06-04/</guid><description>&lt;p&gt;共 &lt;strong&gt;63&lt;/strong&gt; 个 commit，涉及 &lt;strong&gt;375&lt;/strong&gt; 个文件，+13551/-4389 行变动。&lt;/p&gt;</description></item><item><title>vLLM Daily — 2026-06-03</title><link>https://beaiera.top/posts/vllm-daily-2026-06-03/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0800</pubDate><guid>https://beaiera.top/posts/vllm-daily-2026-06-03/</guid><description>&lt;p&gt;共 &lt;strong&gt;79&lt;/strong&gt; 个 commit，涉及 &lt;strong&gt;371&lt;/strong&gt; 个文件，+13084/-2832 行变动。&lt;/p&gt;</description></item><item><title>DeepSeek V4 MegaMoE Kernel 深度解析</title><link>https://beaiera.top/posts/2026-06-02-deepseek-v4-megamoe/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +0800</pubDate><guid>https://beaiera.top/posts/2026-06-02-deepseek-v4-megamoe/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;h3 id="经典-moe-的计算过程"&gt;经典 MoE 的计算过程&lt;/h3&gt;
&lt;p&gt;在深入 MegaMoE 之前，先梳理一下经典 MoE（Mixture of Experts）层的完整计算流程。以一个具体配置为例：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;T = 8 # 当前 batch 中的 token 数
H = 7168 # hidden size
I = 2048 # intermediate size（每个 expert 的 FFN 中间维度）
E = 256 # 总 expert 数量
K = 6 # 每个 token 激活的 expert 数（top-K）
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="第一步路由routing"&gt;第一步：路由（Routing）&lt;/h4&gt;
&lt;p&gt;输入 &lt;code&gt;hidden_states&lt;/code&gt; 形状为 &lt;code&gt;[T, H]&lt;/code&gt;（即 &lt;code&gt;[8, 7168]&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;通过 Gate 线性层：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gate = hidden_states @ W_gate^T # W_gate: [E, H]
→ gate: [T, E] = [8, 256] # 每个 token 对每个 expert 的得分
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;对每个 token 施加 scoring 函数（如 &lt;code&gt;softmax&lt;/code&gt; 或 &lt;code&gt;sqrt(softplus)&lt;/code&gt;），然后取 top-K：&lt;/p&gt;</description></item><item><title>DeepSeek V4 MoE 量化技术详解</title><link>https://beaiera.top/posts/2026-06-02-deepseek-v4-moe-quantization/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +0800</pubDate><guid>https://beaiera.top/posts/2026-06-02-deepseek-v4-moe-quantization/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;本文整理自一次围绕 vLLM 代码库中 DeepSeek V4 MoE 模块的技术讨论，内容涉及 MXFP4 与 NVFP4 的量化方案对比、Block Quantized GEMM 的设计原理、FP4 packed 存储格式、以及 DeepGEMM 库中 FP8×FP4 在 Blackwell 硬件上的具体实现。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一deepseek-v4-moe-核心优化概览"&gt;一、DeepSeek V4 MoE 核心优化概览&lt;/h2&gt;
&lt;p&gt;DeepSeek V4 的 MoE 模块在 vLLM 中的实现包含了大量优化：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;优化&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DeepGEMM MegaMoE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;融合 EP dispatch + L1 GEMM + SwiGLU + L2 GEMM + EP combine 为单 mega-kernel，NVLink 通信与计算重叠&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FP4 (MXFP4/NVFP4) 权重量化&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4-bit 浮点权重 + UE8M0 block scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Expert Parallelism 多后端&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DeepEP、FlashInfer NVLink、MORI、NIXL 等多种 all-to-all 策略&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fused TopK Bias Routing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;sqrt(softplus) 得分函数、e_score_correction_bias、hash MoE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EPLB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;每层跟踪 expert 负载，动态重新分配&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fused MLA Kernel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Q-norm + RoPE + KV quant + cache insert 融合为单 CUDA 核&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MTP (Multi-Token Prediction)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;共享 MoE 架构的 speculative decoding&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="二mxfp4-与-nvfp4-的区别"&gt;二、MXFP4 与 NVFP4 的区别&lt;/h2&gt;
&lt;p&gt;DeepSeek V4 Flash 使用 FP4 权重，有两个可选方案：&lt;strong&gt;MXFP4&lt;/strong&gt; (OCP 开放标准) 和 &lt;strong&gt;NVFP4&lt;/strong&gt; (NVIDIA 私有格式)。切换由 HuggingFace config 中的 &lt;code&gt;moe_quant_algo&lt;/code&gt; 字段控制。&lt;/p&gt;</description></item><item><title>vLLM PCP/DCP 技术笔记</title><link>https://beaiera.top/posts/2026-06-02-vllm-pcp-dcp-tech-notes/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +0800</pubDate><guid>https://beaiera.top/posts/2026-06-02-vllm-pcp-dcp-tech-notes/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;vLLM 中引入了两个上下文并行维度——Prefill Context Parallel (PCP) 和 Decode Context Parallel (DCP)。本文是源码分析记录，覆盖配置入口、进程组初始化、通信模式、KV cache 布局、LSE 合并机制、各 attention backend 支持情况，以及一些数学推导。&lt;/p&gt;</description></item><item><title>vLLM SP/AsyncTP/Quant 技术笔记</title><link>https://beaiera.top/posts/2026-06-02-vllm-sp-asynctp-quant-tech-notes/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +0800</pubDate><guid>https://beaiera.top/posts/2026-06-02-vllm-sp-asynctp-quant-tech-notes/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;vLLM 中实现了多种并行策略与编译优化。本文聚焦三条密切关联的技术线：&lt;strong&gt;Sequence Parallelism (SP)&lt;/strong&gt;、&lt;strong&gt;Async Tensor Parallelism (AsyncTP)&lt;/strong&gt; 与 &lt;strong&gt;量化 (Quantization)&lt;/strong&gt; 的协同工作方式，涵盖概念辨析、GEMM-通信融合原理、量化感知改写以及配置细节。&lt;/p&gt;</description></item><item><title>vLLM 编译系统完全解析</title><link>https://beaiera.top/posts/2026-06-02-vllm-compilation-system/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +0800</pubDate><guid>https://beaiera.top/posts/2026-06-02-vllm-compilation-system/</guid><description>&lt;p&gt;vLLM 的编译系统在标准 PyTorch &lt;code&gt;torch.compile&lt;/code&gt; 之上做了大量定制：分段编译（Piecewise Compilation）、字节码 Hook、AOT 缓存、动态形状管 理等。本文从多个实际调试问题出发，系统梳理 vLLM 编译系统的核心机制。&lt;/p&gt;</description></item><item><title>DeepSeek-v2 Routed Scaling Factor 应用时机详解</title><link>https://beaiera.top/posts/deepseek-routed-scaling/</link><pubDate>Mon, 01 Jun 2026 11:40:00 +0800</pubDate><guid>https://beaiera.top/posts/deepseek-routed-scaling/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;DeepSeek-V2/V3 系列模型采用了 MoE（Mixture of Experts）架构，其中 &lt;code&gt;routed_scaling_factor&lt;/code&gt; 是一个重要的超参数，用于缩放 routed expert 的输出。该系数来自模型 config，在 &lt;code&gt;DeepseekV2MoE.__init__&lt;/code&gt; 中初始化：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;routed_scaling_factor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;routed_scaling_factor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;默认值通常为 &lt;code&gt;1.0&lt;/code&gt;，但 DeepSeek-V2 系列（如 deepseek-v2、deepseek-coder-v2）设置的典型值是 &lt;code&gt;2.5&lt;/code&gt; 或 &lt;code&gt;1.0&lt;/code&gt;，取决于具体子模型。&lt;/p&gt;
&lt;h2 id="控制开关"&gt;控制开关&lt;/h2&gt;
&lt;p&gt;在 vLLM 的 &lt;code&gt;deepseek_v2.py&lt;/code&gt; 中，关键代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;apply_routed_scale_to_output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_rocm_aiter_moe_enabled&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;routed_scaling_factor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;routed_scaling_factor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;apply_routed_scale_to_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_rocm_aiter_moe_enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个 bool 值决定了 &lt;code&gt;routed_scaling_factor&lt;/code&gt; 由谁处理——是 kernel 内部还是 runner 外部。&lt;/p&gt;</description></item><item><title>vLLM embed.py 扩展：添加非 EngineArgs 自定义参数</title><link>https://beaiera.top/posts/vllm-embed-args/</link><pubDate>Mon, 01 Jun 2026 11:30:00 +0800</pubDate><guid>https://beaiera.top/posts/vllm-embed-args/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;vLLM 官方示例 &lt;code&gt;examples/basic/offline_inference/embed.py&lt;/code&gt; 展示了一个标准的 Embedding 推理流程，其参数解析采用如下模式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FlexibleArgumentParser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EngineArgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_cli_args&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;llm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LLM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nb"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;核心流程是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建 &lt;code&gt;FlexibleArgumentParser&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;EngineArgs.add_cli_args(parser)&lt;/code&gt; 将 EngineArgs 的所有字段注册为 CLI 参数&lt;/li&gt;
&lt;li&gt;解析参数后通过 &lt;code&gt;LLM(**vars(args))&lt;/code&gt; 直接解包传给 LLM 构造函数&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这种模式对纯 EngineArgs 场景工作良好，但当你需要添加业务相关的自定义参数（如 &lt;code&gt;--batch-size&lt;/code&gt;、&lt;code&gt;--input-file&lt;/code&gt;）时，就会遇到一个问题：&lt;strong&gt;非 EngineArgs 的参数会被一起传给 &lt;code&gt;LLM()&lt;/code&gt;，导致 &lt;code&gt;TypeError&lt;/code&gt;&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="问题所在"&gt;问题所在&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;LLM.__init__&lt;/code&gt; 只接受 &lt;code&gt;EngineArgs&lt;/code&gt; 中定义的字段。如果在 parser 上添加了额外的自定义参数，&lt;code&gt;vars(args)&lt;/code&gt; 会包含这些多余字段，直接解包传入 &lt;code&gt;LLM()&lt;/code&gt; 会导致类似这样的错误：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;TypeError: LLM.__init__() got an unexpected keyword argument &amp;#39;custom_param&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;解决方案的核心思路是：&lt;strong&gt;在将参数传给 &lt;code&gt;LLM()&lt;/code&gt; 之前，把自定义参数剥离出来&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="三种解决方案"&gt;三种解决方案&lt;/h2&gt;
&lt;h3 id="方法一手动按字段过滤最直观"&gt;方法一：手动按字段过滤（最直观）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FlexibleArgumentParser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EngineArgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_cli_args&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;--custom-param&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;--batch-size&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Namespace&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;engine_args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;EngineArgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__dataclass_fields__&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;llm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LLM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;engine_args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Custom param: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;custom_param&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Batch size: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;原理&lt;/strong&gt;：&lt;code&gt;EngineArgs&lt;/code&gt; 是一个 dataclass，&lt;code&gt;__dataclass_fields__&lt;/code&gt; 包含所有声明字段的元信息。遍历 &lt;code&gt;vars(args)&lt;/code&gt; 字典，只保留 key 存在于 &lt;code&gt;__dataclass_fields__&lt;/code&gt; 中的条目即可。&lt;/p&gt;</description></item><item><title>DeepSeek MLA 在 DCP 分布式环境中的 Prefill 阶段解析</title><link>https://beaiera.top/posts/mla-dcp-prefill/</link><pubDate>Mon, 01 Jun 2026 11:20:00 +0800</pubDate><guid>https://beaiera.top/posts/mla-dcp-prefill/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;DeepSeek 提出的 MLA（Multi-head Latent Attention）通过将 KV 压缩到低维 latent 空间，大幅降低了推理时的 KV cache 开销。但在 DCP（Decode Context Parallel，即上下文并行）分布式环境下，MLA 的 prefill 阶段设计与 decode 阶段有显著差异。本文从实现角度展开分析。&lt;/p&gt;
&lt;h2 id="什么是-dcp"&gt;什么是 DCP&lt;/h2&gt;
&lt;p&gt;DCP（Decode Context Parallel）是一种将 KV cache 按序列维度切分到多个 GPU 的分布式策略。每个 rank 只持有完整 KV cache 的 &lt;code&gt;1/dcp_world_size&lt;/code&gt;，从而减少单卡显存占用，支持更长的上下文。&lt;/p&gt;
&lt;p&gt;与更常见的 DP（Data Parallel，扛并发）和 EP（Expert Parallel，分摊 MoE 参数显存）不同，DCP 解决的是&lt;strong&gt;单请求长上下文&lt;/strong&gt;场景下 KV cache 放不下的问题。&lt;/p&gt;
&lt;h2 id="mla-prefill-vs-decode两条不同的路径"&gt;MLA Prefill vs Decode：两条不同的路径&lt;/h2&gt;
&lt;p&gt;MLA 在 prefill 和 decode 阶段走了截然不同的计算路径：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Prefill (&lt;code&gt;forward_mha&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Decode (&lt;code&gt;forward_mqa&lt;/code&gt;)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;KV 形态&lt;/td&gt;
&lt;td&gt;完整 MHA（N 头）&lt;/td&gt;
&lt;td&gt;Latent（1 头）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Head dim&lt;/td&gt;
&lt;td&gt;&lt;code&gt;P+R&lt;/code&gt;（~192）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Lkv+R&lt;/code&gt;（~576）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;计算特性&lt;/td&gt;
&lt;td&gt;Sq ≈ Skv，计算密集&lt;/td&gt;
&lt;td&gt;Sq ≪ Skv，避免显存搬运&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Prefill&lt;/strong&gt; 走 MHA 路径：&lt;code&gt;kv_c&lt;/code&gt; 通过 &lt;code&gt;W_UK&lt;/code&gt;/&lt;code&gt;W_UV&lt;/code&gt; 解压成完整多头 K/V（N 个头），然后做标准的多头注意力。因为 prefill 时新 token 数和 context 长度在同一量级，展开 KV 做计算密集的 attention 是划算的。&lt;/p&gt;</description></item><item><title>vLLM GPU UBatchWrapper 中的 Barrier 机制解析</title><link>https://beaiera.top/posts/vllm-ubatch-barrier/</link><pubDate>Mon, 01 Jun 2026 11:10:00 +0800</pubDate><guid>https://beaiera.top/posts/vllm-ubatch-barrier/</guid><description>&lt;h2 id="背景什么是-ubatchwrapper"&gt;背景：什么是 UBatchWrapper&lt;/h2&gt;
&lt;p&gt;在 vLLM 的 GPU 推理引擎中，&lt;code&gt;UBatchWrapper&lt;/code&gt;（位于 &lt;code&gt;vllm/v1/worker/gpu_ubatch_wrapper.py&lt;/code&gt;）是一个&lt;strong&gt;模型包装器&lt;/strong&gt;。它拦截对原始模型的调用，在内部将一次大 batch 的 forward 拆分成多个 &lt;strong&gt;micro-batch（ubatch）&lt;/strong&gt;，并利用多线程 + CUDA stream 实现计算与通信的重叠。&lt;/p&gt;
&lt;p&gt;核心目标：&lt;strong&gt;解决 MoE 模型中 all2all 通信开销大的问题&lt;/strong&gt;——让一个 ubatch 在做计算时，另一个 ubatch 的通信已经在背后并行执行。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="线程模型与同步原语"&gt;线程模型与同步原语&lt;/h2&gt;
&lt;h3 id="threadingbarrier集结号"&gt;threading.Barrier：集结号&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;UBatchWrapper&lt;/code&gt; 在初始化时创建&lt;strong&gt;一个&lt;/strong&gt; &lt;code&gt;threading.Barrier&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ready_barrier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;threading&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Barrier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_ubatches&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;threading.Barrier&lt;/code&gt; 不关心具体有哪些线程，只计数&lt;/strong&gt;。内部维护一个计数器，每当有线程调用 &lt;code&gt;barrier.wait()&lt;/code&gt;，计数器就 +1。当总数达到构造时指定的 &lt;code&gt;parties&lt;/code&gt; 值（这里是 &lt;code&gt;num_ubatches + 1&lt;/code&gt;），所有正在 &lt;code&gt;wait()&lt;/code&gt; 的线程&lt;strong&gt;同时被释放&lt;/strong&gt;，计数器归零。&lt;/p&gt;
&lt;p&gt;这里的 &lt;code&gt;+1&lt;/code&gt; 包含了 &lt;strong&gt;N 个 ubatch 线程 + 1 个主线程&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ready_barrier.wait()&lt;/code&gt; 在三处被调用：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;文件&lt;/th&gt;
&lt;th&gt;行号&lt;/th&gt;
&lt;th&gt;调用方&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpu_ubatch_wrapper.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;261&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;主线程&lt;/strong&gt; 在 &lt;code&gt;_capture_ubatches&lt;/code&gt; 中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpu_ubatch_wrapper.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;325&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;主线程&lt;/strong&gt; 在 &lt;code&gt;_run_ubatches&lt;/code&gt; 中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ubatching.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;每个 ubatch 线程&lt;/strong&gt; 在 &lt;code&gt;UBatchContext.__enter__&lt;/code&gt; 中&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;少一个线程到达，所有人全部卡住。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>mhc_pre_torch 的数学公式与 CUDA 代码解释</title><link>https://beaiera.top/posts/mhc-preact-torch-math/</link><pubDate>Mon, 01 Jun 2026 11:00:00 +0800</pubDate><guid>https://beaiera.top/posts/mhc-preact-torch-math/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;mHC（multi-Head Combinatorial）是 DeepSeek V4 模型中引入的一种&lt;strong&gt;多头残差混合机制&lt;/strong&gt;。它将传统 Transformer 中单一的残差向量扩展为 $M$ 个并行的残差副本（multi-head residual），并在每个 block 前后通过可学习的门控和组合矩阵对多头残差进行变换。&lt;/p&gt;
&lt;p&gt;本文以 &lt;code&gt;mhc_pre_torch&lt;/code&gt; 为核心，从数学公式出发逐行对照 PyTorch 代码，并延伸至 &lt;code&gt;mhc_post_torch&lt;/code&gt; 和整个 mHC 流水线，帮助读者完整理解这一算子的设计思路与实现细节。&lt;/p&gt;</description></item><item><title>vLLM Cascade Attention：用法、场景与原理解析</title><link>https://beaiera.top/posts/vllm-cascade-attention/</link><pubDate>Mon, 01 Jun 2026 10:50:00 +0800</pubDate><guid>https://beaiera.top/posts/vllm-cascade-attention/</guid><description>&lt;h2 id="概述"&gt;概述&lt;/h2&gt;
&lt;p&gt;Cascade Attention（级联注意力）是 vLLM 推理引擎中针对&lt;strong&gt;多请求共享长前缀&lt;/strong&gt;场景的一种注意力优化技术。它将标准 attention 拆解为 prefix（前缀）和 suffix（后缀）两个阶段，显著降低 KV cache 的全局内存读取量，在共享 system prompt 的批量推理场景中可实现最高数十倍的 attention 加速。&lt;/p&gt;
&lt;p&gt;本文将深入剖析 cascade attention 的设计思想、使用方式、适用场景、实现原理，并与 FlashAttention、FlashDecoding 等其他优化技术进行对比。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一cascade-attention-的核心思想"&gt;一、Cascade Attention 的核心思想&lt;/h2&gt;
&lt;h3 id="标准-attention-的冗余"&gt;标准 Attention 的冗余&lt;/h3&gt;
&lt;p&gt;在大语言模型的批量推理中，多个请求往往共享一个较长的 system prompt。例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chatbot 场景&lt;/strong&gt;：所有请求共享 &amp;ldquo;You are a helpful assistant&amp;hellip;&amp;rdquo; 等 system prompt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Document QA&lt;/strong&gt;：多用户对同一篇文档提问，文档内容为公共前缀&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-Consistency&lt;/strong&gt;：对同一 prompt 采样多条推理路径&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;标准 attention 的处理方式是每个 request 独立计算其完整的注意力——包括共享的 system prompt。这意味着&lt;strong&gt;同一份前缀 KV cache 被重复加载多次&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="cascade-的拆解思路"&gt;Cascade 的拆解思路&lt;/h3&gt;
&lt;p&gt;Cascade attention 将一次 attention 计算拆成三步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Prefix 阶段&lt;/strong&gt;：将所有请求的 query 拼成一个&amp;quot;大序列&amp;quot;，对共享前缀做一次非因果（bidirectional）attention&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suffix 阶段&lt;/strong&gt;：每个请求各自对其独有的后缀做因果（causal）attention&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Merge&lt;/strong&gt;：通过 LSE（log-sum-exp）rescaling 将两阶段结果加权合并&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;数学上等价于标准 attention，但计算量和显存带宽需求大幅降低。&lt;/p&gt;</description></item><item><title>vLLM TorchDynamo 编译：FX Graph 分割原理与实践</title><link>https://beaiera.top/posts/vllm-torch-fx-graph-split/</link><pubDate>Mon, 01 Jun 2026 10:40:00 +0800</pubDate><guid>https://beaiera.top/posts/vllm-torch-fx-graph-split/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;vLLM 利用 PyTorch 2.x 的 &lt;code&gt;torch.compile&lt;/code&gt; 路径，通过 TorchDynamo 捕获模型计算图，再经过图分割（graph splitting）和分段编译（piecewise compilation）来优化 GPU kernel 执行效率。本文将深入剖析 FX Graph 的分割原理及其背后的设计思想。&lt;/p&gt;
&lt;h2 id="一torchdynamo-编译概览"&gt;一、TorchDynamo 编译概览&lt;/h2&gt;
&lt;p&gt;TorchDynamo 是一个 Python 级别的 JIT 编译器，它通过 &lt;code&gt;PEP 523&lt;/code&gt; 的 frame evaluation callback 在 Python 字节码执行之前捕获计算图。vLLM 利用这一机制，将模型 forward 函数中的计算捕获为 &lt;code&gt;fx.GraphModule&lt;/code&gt;，然后送入自定义后端 &lt;code&gt;VllmBackend&lt;/code&gt; 进行编译。&lt;/p&gt;
&lt;p&gt;编译流程大致如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;model.forward()
└── TorchDynamo 捕获计算图
└── fx.GraphModule (原始完整图)
└── VllmBackend.__call__()
├── split_graph() → 图分割
├── PiecewiseCompileInterpreter → 分段编译
└── codegen → 生成胶水函数
└── 返回可调用对象给 Dynamo
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="二fx-graph-分割split_graph-的工作原理"&gt;二、FX Graph 分割：split_graph 的工作原理&lt;/h2&gt;
&lt;h3 id="21-为什么需要分割"&gt;2.1 为什么需要分割&lt;/h3&gt;
&lt;p&gt;vLLM 的模型计算中包含两种性质不同的算子：&lt;/p&gt;</description></item><item><title>DeepSeek MLA 中 QKV Head Dimension 的处理差异</title><link>https://beaiera.top/posts/deepseek-mla-head-dim/</link><pubDate>Mon, 01 Jun 2026 10:20:00 +0800</pubDate><guid>https://beaiera.top/posts/deepseek-mla-head-dim/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;Multi-head Latent Attention（MLA）是 DeepSeek-V2/V3 系列模型中最核心的架构创新之一。它在标准 Multi-Head Attention（MHA）的基础上引入了低秩压缩，大幅降低了 KV cache 的显存占用，同时保持了与 MHA 相当的模型质量。&lt;/p&gt;
&lt;p&gt;本文从 &lt;strong&gt;QKV head dimension 处理差异&lt;/strong&gt; 这一视角切入，深入分析 MLA 的设计原理、vLLM 中的具体实现，以及这种设计带来的性能收益。&lt;/p&gt;
&lt;h2 id="1-标准-mha-回顾"&gt;1. 标准 MHA 回顾&lt;/h2&gt;
&lt;p&gt;在标准 MHA 中，给定输入序列 &lt;code&gt;X ∈ ℝ^{S×D}&lt;/code&gt;，Q、K、V 通过三个独立的线性变换得到：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Q = X @ W_Q → [S, H, d_head]
K = X @ W_K → [S, H, d_head]
V = X @ W_V → [S, H, d_head]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其中 &lt;code&gt;d_head = D / H&lt;/code&gt;，三者&lt;strong&gt;完全相等&lt;/strong&gt;。注意力计算为：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Attention(Q, K, V) = softmax(Q @ K^T / √d_head) @ V → [S, H, d_head]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;输出再经 &lt;code&gt;W_O&lt;/code&gt; 映射回 &lt;code&gt;D&lt;/code&gt; 维。这种 Q/K/V 共享同一 head dim 的设计深入人心，以至于很多人默认这是注意力机制的&amp;quot;必须要求&amp;quot;。&lt;/p&gt;</description></item><item><title>DeepSeek V3 MoE 模块计算与通信逻辑详解</title><link>https://beaiera.top/posts/deepseek-v3-moe/</link><pubDate>Mon, 01 Jun 2026 10:10:00 +0800</pubDate><guid>https://beaiera.top/posts/deepseek-v3-moe/</guid><description>&lt;h2 id="概述"&gt;概述&lt;/h2&gt;
&lt;p&gt;DeepSeek V3 的 MoE（Mixture of Experts）模块是其核心组成部分，采用 &lt;strong&gt;Shared + Routed Expert&lt;/strong&gt; 架构。本文基于 vLLM 代码库，深入分析其计算流程、通信模式、量化方案以及性能优化策略。&lt;/p&gt;</description></item><item><title>vLLM TurboQuant 介绍：极低比特 KV Cache 量化</title><link>https://beaiera.top/posts/turboquant-intro/</link><pubDate>Mon, 01 Jun 2026 10:00:00 +0800</pubDate><guid>https://beaiera.top/posts/turboquant-intro/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;大语言模型（LLM）推理时，KV Cache 是显存消耗的主要来源之一。以 LLaMA-70B 为例，在 4096 上下文长度下，KV Cache 占用超过 40 GB 显存。传统的 FP16 KV Cache 每个 token 需要 2 × head_dim × num_heads × 2 bytes = 大量显存。如果能将 KV Cache 压缩到 3-4 bit，就可以将显存占用降低到原来的 1/4 到 1/5，从而支持更长的上下文、更大的 batch size，或在更少的 GPU 上运行同一模型。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TurboQuant&lt;/strong&gt;（Zandieh et al., ICLR 2026）正是为此而生——它是 vLLM 中实现的一种极低比特 KV Cache 量化方法，通过 Hadamard 旋转 + Lloyd-Max 最优标量量化 + Norm Correction 的组合，将 KV Cache 压缩至 3-4 bit，最高实现 4.9× 压缩比。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="为什么需要-turboquant"&gt;为什么需要 TurboQuant？&lt;/h2&gt;
&lt;p&gt;在 TurboQuant 之前，vLLM 已经支持了 FP8 KV Cache（2× 压缩，几乎无损）。但 2× 压缩在某些场景下仍然不够：&lt;/p&gt;</description></item><item><title>vLLM 量化方法详解：原理、算法与实现</title><link>https://beaiera.top/posts/vllm-quantization-methods/</link><pubDate>Mon, 01 Jun 2026 09:00:00 +0800</pubDate><guid>https://beaiera.top/posts/vllm-quantization-methods/</guid><description>&lt;blockquote&gt;
&lt;p&gt;本文档聚焦于 vLLM 中与 NVIDIA GPU 兼容的通用量化方法，排除了框架特定方案（GGUF、Compressed-Tensors、Quark、Hummingbird）和硬件厂商专有方案（ModelOpt、INC、NVFP4）。涵盖：数学原理、量化/反量化公式、位宽与分组结构、核心算法步骤、Kernel 级实现细节及硬件要求。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="目录"&gt;目录&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="#1-fp8-w8a8%E5%8A%A8%E6%80%81%E9%9D%99%E6%80%81%E9%87%8F%E5%8C%96"&gt;FP8 W8A8（动态/静态量化）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-awq%E6%BF%80%E6%B4%BB%E6%84%9F%E7%9F%A5%E6%9D%83%E9%87%8D%E9%87%8F%E5%8C%96"&gt;AWQ（激活感知权重量化）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-gptq--marlin"&gt;GPTQ / Marlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#4-awq-marlin"&gt;AWQ Marlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#5-bitsandbytesnf4--qlora"&gt;BitsAndBytes（NF4 / QLoRA）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#6-mxfp4ocp-mx-%E8%A7%84%E8%8C%83"&gt;MXFP4（OCP MX 规范）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#7-online-quantization%E5%9C%A8%E7%BA%BF%E9%87%8F%E5%8C%96"&gt;Online Quantization（在线量化）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#8-turboquant"&gt;TurboQuant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#9-fp8--int8-kv-cache"&gt;FP8 / INT8 KV Cache&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#10-%E5%AF%B9%E6%AF%94%E6%80%BB%E7%BB%93"&gt;对比总结&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="1-fp8-w8a8动态静态量化"&gt;1. FP8 W8A8（动态/静态量化）&lt;/h2&gt;
&lt;h3 id="论文"&gt;论文&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FP8 格式标准&lt;/strong&gt;: &lt;em&gt;FP8 Formats for Deep Learning&lt;/em&gt; (Micikevicius et al., 2022, arXiv:2209.05433)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vLLM 实现&lt;/strong&gt;: 主要面向 H100/H200 GPU，利用 &lt;code&gt;torch._scaled_mm&lt;/code&gt; 调用 Tensor Core。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="概述"&gt;概述&lt;/h3&gt;
&lt;p&gt;FP8 W8A8 将权重和激活均量化为 FP8 格式。支持两种调度模式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;静态量化&lt;/strong&gt;：校准集上预计算 scale，推理时固定。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态量化&lt;/strong&gt;：推理时实时统计最大值计算 scale。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="量化公式"&gt;量化公式&lt;/h3&gt;
&lt;p&gt;FP8 有两种指数位宽子格式：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;格式&lt;/th&gt;
&lt;th&gt;符号位&lt;/th&gt;
&lt;th&gt;指数位&lt;/th&gt;
&lt;th&gt;尾数位&lt;/th&gt;
&lt;th&gt;最大值&lt;/th&gt;
&lt;th&gt;最小值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;E4M3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;448&lt;/td&gt;
&lt;td&gt;1/16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E5M2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;57344&lt;/td&gt;
&lt;td&gt;1/64&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;量化核心操作：&lt;/p&gt;</description></item></channel></rss>