<?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>推理引擎 on Richelieu's Blog</title><link>https://beaiera.top/tags/%E6%8E%A8%E7%90%86%E5%BC%95%E6%93%8E/</link><description>Recent content in 推理引擎 on Richelieu's Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 01 Jun 2026 11:10:00 +0800</lastBuildDate><atom:link href="https://beaiera.top/tags/%E6%8E%A8%E7%90%86%E5%BC%95%E6%93%8E/index.xml" rel="self" type="application/rss+xml"/><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></channel></rss>