<?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>CUDA on Richelieu's Blog</title><link>https://beaiera.top/tags/cuda/</link><description>Recent content in CUDA on Richelieu's Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 02 Jun 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://beaiera.top/tags/cuda/index.xml" rel="self" type="application/rss+xml"/><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 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></channel></rss>