<?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 Wilson Wu</title><link>https://wilsonwu.me/zh/tags/vllm/</link><description>Recent content in Vllm on Wilson Wu</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Mon, 03 Aug 2026 00:00:00 -0400</lastBuildDate><atom:link href="https://wilsonwu.me/zh/tags/vllm/index.xml" rel="self" type="application/rss+xml"/><item><title>在 vLLM Semantic Router 中使用 Microsoft Foundry 远程 Embedding 推理</title><link>https://wilsonwu.me/zh/blog/2026/azure-foundry-embeddings-with-vllm-sr/</link><pubDate>Mon, 03 Aug 2026 00:00:00 -0400</pubDate><guid>https://wilsonwu.me/zh/blog/2026/azure-foundry-embeddings-with-vllm-sr/</guid><description>&lt;h2 id="1-引言"&gt;1. 引言&lt;/h2&gt;
&lt;p&gt;在 vLLM Semantic Router 的设计中，Embedding 推理是驱动语义路由的核心信号之一。&lt;/p&gt;
&lt;p&gt;官方教程已经演示了如何使用&lt;strong&gt;远程 Embedding 推理提供商（Remote Embedding Providers）&lt;/strong&gt;替代本地 Embedding 推理服务：&lt;/p&gt;</description><content:encoded><![CDATA[<h2 id="1-引言">1. 引言</h2>
<p>在 vLLM Semantic Router 的设计中，Embedding 推理是驱动语义路由的核心信号之一。</p>
<p>官方教程已经演示了如何使用<strong>远程 Embedding 推理提供商（Remote Embedding Providers）</strong>替代本地 Embedding 推理服务：</p>
<p>👉 <a href="https://vllm-sr.ai/docs/tutorials/global/remote-embeddings/">https://vllm-sr.ai/docs/tutorials/global/remote-embeddings/</a></p>
<p>然而，在实际生产环境中，一个更为关键的问题随之而来：</p>

<blockquote>
  <p>如何使用企业级、可扩展的 Embedding 推理服务来支持语义路由？</p>

</blockquote>
<p>本文基于官方教程中的场景，并结合 <strong>Microsoft Foundry Embedding 模型</strong>，演示如何构建一个具备以下特性的智能路由系统：</p>
<ul>
<li>无需 GPU</li>
<li>无需在本地部署 Embedding 模型</li>
<li>生产就绪</li>
</ul>
<h2 id="2-回顾远程-embedding-推理提供商">2. 回顾：远程 Embedding 推理提供商</h2>
<p>在 vLLM Semantic Router 中，路由器运行在 CPU 上，不依赖 GPU 推理能力。</p>
<p>通过远程 Embedding 推理提供商：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>路由器 → 远程 Embedding 推理 API → 向量
</span></span></code></pre></div><p>我们可以：</p>
<ul>
<li>将嵌入计算完全卸载到云服务</li>
<li>统一多模型的语义能力</li>
<li>解耦路由与推理</li>
</ul>
<h2 id="3-教程场景沿用官方测试场景">3. 教程场景（沿用官方测试场景）</h2>
<p>在官方教程中，核心流程如下：</p>
<p><img alt="远程嵌入流程" loading="lazy" src="/zh/blog/2026/azure-foundry-embeddings-with-vllm-sr/1-remote-embeddings-flow.png"></p>
<h3 id="第-1-步定义语义路由">第 1 步：定义语义路由</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">routing</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">decisions</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">math</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">when</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">semantic_similarity</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">text</span>: <span style="color:#e6db74">&#34;math question&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">threshold</span>: <span style="color:#ae81ff">0.8</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">general</span>
</span></span></code></pre></div><h3 id="第-2-步发送请求">第 2 步：发送请求</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>curl http://localhost:8888/v1/chat/completions <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -d <span style="color:#e6db74">&#39;{
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;model&#34;: &#34;MoM&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;messages&#34;: [{&#34;role&#34;: &#34;user&#34;, &#34;content&#34;: &#34;What is 1+1?&#34;}]
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">  }&#39;</span>
</span></span></code></pre></div><p>路由器将执行以下操作：</p>
<ol>
<li>生成嵌入向量</li>
<li>执行语义匹配</li>
<li>选择目标模型</li>
</ol>
<h2 id="4-第-0-步在-microsoft-foundry-中创建-embedding-模型">4. 第 0 步：在 Microsoft Foundry 中创建 Embedding 模型</h2>
<p>在与 vLLM Semantic Router 集成之前，我们首先需要在 Microsoft Foundry 中部署一个 Embedding 模型。</p>
<h3 id="41-创建-foundry-项目">4.1 创建 Foundry 项目</h3>
<ol>
<li>前往 <strong>Microsoft Foundry 门户</strong></li>
<li>创建新项目（或选择现有项目）</li>
<li>确保该项目已关联 Azure 订阅</li>
</ol>
<h3 id="42-部署嵌入模型">4.2 部署嵌入模型</h3>
<p>在模型目录中：</p>
<ol>
<li>搜索 <strong>Embedding 模型</strong></li>
<li>选择受支持的模型（例如 <code>text-embedding-3-small</code>）</li>
<li>单击 <strong>Deploy（部署）</strong></li>
</ol>
<p>部署完成后，你将获得：</p>
<ul>
<li>Endpoint URL</li>
<li>API Key</li>
<li>Model Name</li>
</ul>
<p>示例：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>Endpoint: https://&lt;your-foundry-resource&gt;.inference.ai.azure.com
</span></span><span style="display:flex;"><span>Model: text-embedding-3-small
</span></span><span style="display:flex;"><span>API Key: ******
</span></span></code></pre></div><h3 id="43-验证-embedding-推理-api">4.3 验证 Embedding 推理 API</h3>
<p>你可以直接测试该终结点：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>curl https://&lt;your-foundry-endpoint&gt;/v1/embeddings <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -H <span style="color:#e6db74">&#34;api-key: &lt;your-api-key&gt;&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -H <span style="color:#e6db74">&#34;Content-Type: application/json&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -d <span style="color:#e6db74">&#39;{
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;input&#34;: &#34;Hello world&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">  }&#39;</span>
</span></span></code></pre></div><p>如果调用成功，你将收到包含向量的响应。</p>
<h2 id="5-升级使用-microsoft-foundry-替代本地-embedding-模型">5. 升级：使用 Microsoft Foundry 替代本地 Embedding 模型</h2>
<p>现在，我们将教程中的 Embedding 推理提供商替换为：</p>

<blockquote>
  <p>✅ Microsoft Foundry Embedding 模型</p>

</blockquote>
<p><img alt="Microsoft Foundry Embedding 模型" loading="lazy" src="/zh/blog/2026/azure-foundry-embeddings-with-vllm-sr/2-microsoft-foundry-embedding-model.png"></p>
<h2 id="6-为什么选择-microsoft-foundry-embedding-模型">6. 为什么选择 Microsoft Foundry Embedding 模型</h2>
<p>Microsoft Foundry 提供：</p>
<ul>
<li>高质量 Embedding 模型（更强的语义理解能力）</li>
<li>托管 API（无需自行部署）</li>
<li>全球可用性与企业级 SLA</li>
<li>与 Azure AI 生态系统无缝集成</li>
</ul>
<p>更重要的是：</p>

<blockquote>
  <p>它可以直接充当 Semantic Router 的“语义大脑”</p>

</blockquote>
<h2 id="7-集成将-microsoft-foundry-用作远程-embedding-推理提供商">7. 集成：将 Microsoft Foundry 用作远程 Embedding 推理提供商</h2>
<h3 id="71-配置-embedding-推理提供商">7.1 配置 Embedding 推理提供商</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">providers</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">embedding</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">type</span>: <span style="color:#ae81ff">remote</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">provider</span>: <span style="color:#ae81ff">openai-compatible</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">base_url</span>: <span style="color:#ae81ff">https://&lt;your-foundry-endpoint&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">api_key</span>: <span style="color:#ae81ff">&lt;your-api-key&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">model</span>: <span style="color:#ae81ff">text-embedding-3-small</span>
</span></span></code></pre></div><p>说明：</p>
<ul>
<li>Foundry 提供兼容 OpenAI 的 API</li>
<li>可以直接复用 Semantic Router 的远程 Embedding 推理提供商</li>
<li>无需额外适配</li>
</ul>
<h3 id="72-路由器工作流">7.2 路由器工作流</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>用户请求
</span></span><span style="display:flex;"><span>   ↓
</span></span><span style="display:flex;"><span>Semantic Router
</span></span><span style="display:flex;"><span>   ↓
</span></span><span style="display:flex;"><span>Microsoft Foundry Embedding 推理 API
</span></span><span style="display:flex;"><span>   ↓
</span></span><span style="display:flex;"><span>向量相似度计算
</span></span><span style="display:flex;"><span>   ↓
</span></span><span style="display:flex;"><span>路由决策
</span></span><span style="display:flex;"><span>   ↓
</span></span><span style="display:flex;"><span>目标模型（vLLM / API）
</span></span></code></pre></div><h2 id="8-相比官方教程的主要改进">8. 相比官方教程的主要改进</h2>
<table>
	<thead>
			<tr>
					<th>能力</th>
					<th>原始方案</th>
					<th>Microsoft Foundry 方案</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>嵌入来源</td>
					<td>本地 / 模拟</td>
					<td>云端高质量模型</td>
			</tr>
			<tr>
					<td>部署成本</td>
					<td>需要模型或容器</td>
					<td>零运维</td>
			</tr>
			<tr>
					<td>可扩展性</td>
					<td>单一环境</td>
					<td>多区域</td>
			</tr>
			<tr>
					<td>语义质量</td>
					<td>中等</td>
					<td>企业级</td>
			</tr>
	</tbody>
</table>
<h2 id="9-实际价值">9. 实际价值</h2>
<h3 id="-1-真正的无-gpu-架构">🚀 1. 真正的“无 GPU 架构”</h3>
<p>路由器本身运行在 CPU 上。</p>
<p>Embedding 模型与推理能力完全外部化：</p>
<ul>
<li>Foundry → Embedding 模型</li>
<li>vLLM / API → 推理</li>
</ul>
<h3 id="-2-更准确的语义路由">🧠 2. 更准确的语义路由</h3>
<p>在教程场景中：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>&#34;What is 1+1?&#34; → math 路由
</span></span><span style="display:flex;"><span>&#34;Tell me a joke&#34; → general 路由
</span></span></code></pre></div><p>使用 Foundry 嵌入后，可以获得：</p>
<ul>
<li>更稳定的语义理解</li>
<li>更好的多语言支持</li>
<li>对边界场景更准确的判断</li>
</ul>
<h3 id="-3-统一的多模型入口">🌐 3. 统一的多模型入口</h3>
<p>结合 Semantic Router：</p>
<ul>
<li>Microsoft Foundry（Embedding 模型）</li>
<li>vLLM（自托管推理）</li>
<li>OpenAI / 其他 API</li>
</ul>
<p>从而实现真正的：</p>

<blockquote>
  <p><strong>多提供商智能路由</strong></p>

</blockquote>
<h2 id="10-架构洞察">10. 架构洞察</h2>
<p>此次升级的本质是：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>升级前：
</span></span><span style="display:flex;"><span>路由器 = 基础设施 + 智能
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>升级后：
</span></span><span style="display:flex;"><span>路由器 = 智能
</span></span><span style="display:flex;"><span>Foundry = AI 能力
</span></span></code></pre></div><p>由此形成清晰的分层架构：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>[ AI 能力层 ] → Microsoft Foundry
</span></span><span style="display:flex;"><span>[ 路由层    ] → Semantic Router
</span></span><span style="display:flex;"><span>[ 推理层    ] → vLLM / APIs
</span></span></code></pre></div><h2 id="11-总结">11. 总结</h2>
<p>通过将 Microsoft Foundry 与官方远程 Embedding 模型教程相结合，我们实现了一套生产就绪的架构：</p>
<ul>
<li>无需本地 Embedding 模型</li>
<li>无需 GPU</li>
<li>高质量的语义能力</li>
<li>企业级可靠性</li>
</ul>
<p>这不仅是一次功能增强，更是 Semantic Router 的一次关键演进：</p>

<blockquote>
  <p>从“本地工具”演进为“云原生 AI 路由层”</p>

</blockquote>
]]></content:encoded></item><item><title>大语言模型推理并行策略全景解析：TP / DP / PP / EP 原理与 vLLM 实战性能验证</title><link>https://wilsonwu.me/zh/blog/2025/llm-inference-parallelism-in-vllm/</link><pubDate>Wed, 24 Dec 2025 00:00:00 -0500</pubDate><guid>https://wilsonwu.me/zh/blog/2025/llm-inference-parallelism-in-vllm/</guid><description>&lt;p&gt;当大语言模型的参数规模跨过几十亿门槛之后，一个事实变得不可回避：&lt;strong&gt;单卡时代已经结束&lt;/strong&gt;。无论是训练还是推理，模型本身的参数规模、KV Cache 的增长速度，以及真实业务中并发请求带来的显存与算力压力，都决定了大模型必须运行在多 GPU、甚至多节点的环境中。&lt;/p&gt;</description><content:encoded><![CDATA[<p>当大语言模型的参数规模跨过几十亿门槛之后，一个事实变得不可回避：<strong>单卡时代已经结束</strong>。无论是训练还是推理，模型本身的参数规模、KV Cache 的增长速度，以及真实业务中并发请求带来的显存与算力压力，都决定了大模型必须运行在多 GPU、甚至多节点的环境中。</p>
<p><img alt="分布式推理趋势" loading="lazy" src="/zh/blog/2025/llm-inference-parallelism-in-vllm/1-overview.png"></p>
<p>然而，<strong>用多张卡跑模型</strong>并不是一个简单的资源堆叠问题。在实践中，工程团队很快会发现：<strong>不同的拆分方式，带来的性能表现差异可能是数量级的</strong>。有的配置 TTFT 极低，却在高并发下迅速失速；有的方案吞吐惊人，却难以满足在线服务对延迟的要求；还有一些组合在理论上看似合理，却在真实硬件拓扑下被通信成本完全吞噬。</p>
<p>在训练与推理阶段，业界逐步沉淀出四类核心并行策略：</p>
<ul>
<li><strong>TP（Tensor Parallelism，张量并行）</strong></li>
<li><strong>DP（Data Parallelism，数据并行）</strong></li>
<li><strong>PP（Pipeline Parallelism，流水线并行）</strong></li>
<li><strong>EP（Expert Parallelism，专家并行，主要用于 MoE）</strong></li>
</ul>
<p><img alt="alt text" loading="lazy" src="/zh/blog/2025/llm-inference-parallelism-in-vllm/2-parallelism.png"></p>
<h2 id="大语言模型四种核心并行策略基础">大语言模型四种核心并行策略基础</h2>
<h3 id="tensor-parallelismtp算子级拆分">Tensor Parallelism（TP）：算子级拆分</h3>
<p>核心思想：将单层内部的矩阵计算（如 Linear / Attention）沿维度切分到多张 GPU 上并行计算。</p>
<p>典型拆分方式：</p>
<ul>
<li>Linear 层按 <code>hidden_size</code> 或 <code>num_heads</code> 切分</li>
<li>Attention 的 Q / K / V 或 FFN 的中间层拆分</li>
</ul>
<p><img alt="alt text" loading="lazy" src="/zh/blog/2025/llm-inference-parallelism-in-vllm/3-tp.png"></p>
<p>优点：</p>
<ul>
<li>单层显存占用显著下降</li>
<li>单 token 延迟较低（适合推理）</li>
</ul>
<p>代价：</p>
<ul>
<li>每一层都需要 <strong>All-Reduce / All-Gather</strong></li>
<li>通信频繁，对 NVLink / IB 依赖高</li>
</ul>
<p>适用场景：</p>
<ul>
<li>单模型过大但层数不多</li>
<li>对 <strong>TTFT（Time To First Token）</strong>敏感的在线推理</li>
</ul>
<h3 id="data-parallelismdp请求级复制">Data Parallelism（DP）：请求级复制</h3>
<p>核心思想：模型完整复制到多张 GPU，每张 GPU 处理不同请求或 batch。</p>
<p><img alt="alt text" loading="lazy" src="/zh/blog/2025/llm-inference-parallelism-in-vllm/4-dp.png"></p>
<p>优点：</p>
<ul>
<li>实现简单</li>
<li>无模型内部通信</li>
<li>吞吐线性扩展</li>
</ul>
<p>代价：</p>
<ul>
<li>显存需求最高（每卡一整模型）</li>
<li>单请求延迟不变</li>
</ul>
<p>适用场景：</p>
<ul>
<li>模型能放进单卡</li>
<li>离线推理 / 高并发吞吐</li>
</ul>
<h3 id="pipeline-parallelismpp层级切分">Pipeline Parallelism（PP）：层级切分</h3>
<p>核心思想：将模型按层切分到多张 GPU，请求在 GPU 间<strong>流水线式</strong>流动。</p>
<p><img alt="alt text" loading="lazy" src="/zh/blog/2025/llm-inference-parallelism-in-vllm/5-pp.png"></p>
<p>优点：</p>
<ul>
<li>几乎无层内通信</li>
<li>显存效率高（比 DP 好）</li>
</ul>
<p>代价：</p>
<ul>
<li>pipeline bubble（气泡）带来空转</li>
<li>小 batch 下延迟显著升高</li>
</ul>
<p>适用场景：</p>
<ul>
<li>超深模型（如 70B+）</li>
<li>长序列推理或训练</li>
</ul>
<h3 id="expert-parallelismepmoe-专属并行">Expert Parallelism（EP）：MoE 专属并行</h3>
<p>核心思想：在 MoE（Mixture of Experts）模型中，不同 Expert 分布在不同 GPU 上，仅被激活的 Expert 参与计算。</p>
<p><img alt="alt text" loading="lazy" src="/zh/blog/2025/llm-inference-parallelism-in-vllm/6-ep.png"></p>
<p>优点：</p>
<ul>
<li>参数规模大但计算稀疏</li>
<li>性能/参数比极高</li>
</ul>
<p>代价：</p>
<ul>
<li>Token 路由与负载不均</li>
<li>通信模式复杂</li>
</ul>
<p>适用场景：</p>
<ul>
<li>MoE 模型（如 Mixtral、DeepSeek-MoE）</li>
<li>高参数规模、可接受一定调度复杂度</li>
</ul>
<h2 id="并行策略并非互斥而是可组合的">并行策略并非互斥，而是可组合的</h2>
<p>在真实系统中，并行策略通常<strong>组合使用</strong>：</p>
<table>
	<thead>
			<tr>
					<th>组合方式</th>
					<th>典型用途</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>TP × DP</td>
					<td>推理最常见组合</td>
			</tr>
			<tr>
					<td>TP × PP</td>
					<td>超大模型训练 / 推理</td>
			</tr>
			<tr>
					<td>TP × EP</td>
					<td>MoE 推理</td>
			</tr>
			<tr>
					<td>DP × EP</td>
					<td>高吞吐 MoE 服务</td>
			</tr>
			<tr>
					<td>TP × PP × DP</td>
					<td>大规模分布式集群</td>
			</tr>
	</tbody>
</table>
<p>问题不在于<strong>能不能用</strong>，而在于：<strong>不同组合，在真实推理负载下，性能表现差异极大。</strong></p>
<p>这正是 vLLM 非常适合做验证的原因。</p>
<h2 id="vllm-中的并行能力概览">vLLM 中的并行能力概览</h2>
<p>vLLM 是一个面向<strong>高性能 LLM 推理</strong>的引擎，其核心优势包括：</p>
<ul>
<li>高效 KV Cache 管理（PagedAttention）</li>
<li>原生支持 <strong>TP / PP</strong></li>
<li>对 DP 友好（多实例、多副本）</li>
<li>MoE 模型中支持 EP（依赖模型实现）</li>
</ul>
<p>在 vLLM 中，并行配置主要通过<strong>启动参数 + 资源拓扑</strong>控制。</p>
<h2 id="基于-vllm-的并行策略配置示例">基于 vLLM 的并行策略配置示例</h2>
<h3 id="tensor-parallelismtp">Tensor Parallelism（TP）</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>vllm serve meta-llama/Llama-2-70b-hf <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --tensor-parallel-size <span style="color:#ae81ff">4</span>
</span></span></code></pre></div><p>含义：</p>
<ul>
<li>模型每一层被拆分到 4 张 GPU</li>
<li>适合单请求低延迟验证</li>
</ul>
<h3 id="pipeline-parallelismpp">Pipeline Parallelism（PP）</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>vllm serve meta-llama/Llama-2-70b-hf <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --pipeline-parallel-size <span style="color:#ae81ff">2</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --tensor-parallel-size <span style="color:#ae81ff">2</span>
</span></span></code></pre></div><p>含义：</p>
<ul>
<li>2-stage pipeline</li>
<li>每 stage 内 2-way TP</li>
<li>总 GPU 数 = 4</li>
</ul>
<h3 id="data-parallelismdp">Data Parallelism（DP）</h3>
<p>vLLM 本身不显式声明 DP，而是通过<strong>多实例部署</strong>实现：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># GPU 0-3</span>
</span></span><span style="display:flex;"><span>CUDA_VISIBLE_DEVICES<span style="color:#f92672">=</span>0,1,2,3 vllm serve ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># GPU 4-7</span>
</span></span><span style="display:flex;"><span>CUDA_VISIBLE_DEVICES<span style="color:#f92672">=</span>4,5,6,7 vllm serve ...
</span></span></code></pre></div><p>再通过上层负载均衡（如 Kubernetes / Gateway）实现 DP。</p>
<h3 id="expert-parallelismep">Expert Parallelism（EP）</h3>
<p>对于 MoE 模型（如 Mixtral）：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>vllm serve mistralai/Mixtral-8x7B-Instruct <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --tensor-parallel-size <span style="color:#ae81ff">4</span>
</span></span></code></pre></div><p>vLLM 会自动将 Expert 分布到 TP 组内 GPU（模型内部实现 EP）。</p>
<h2 id="如何在-vllm-中验证并行组合的真实性能">如何在 vLLM 中“验证”并行组合的真实性能</h2>
<h3 id="核心评测指标">核心评测指标</h3>
<p>建议至少关注以下指标：</p>
<table>
	<thead>
			<tr>
					<th>指标</th>
					<th>含义</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>TTFT</td>
					<td>首 token 延迟</td>
			</tr>
			<tr>
					<td>Tokens/s</td>
					<td>生成吞吐</td>
			</tr>
			<tr>
					<td>GPU 利用率</td>
					<td>并行效率</td>
			</tr>
			<tr>
					<td>KV Cache 命中率</td>
					<td>长上下文效率</td>
			</tr>
			<tr>
					<td>通信开销</td>
					<td>TP / EP 成本</td>
			</tr>
	</tbody>
</table>
<h3 id="推荐对比实验矩阵">推荐对比实验矩阵</h3>
<p>以 8 GPU 为例：</p>
<table>
	<thead>
			<tr>
					<th>方案</th>
					<th>TP</th>
					<th>PP</th>
					<th>DP</th>
					<th>适用目标</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>A</td>
					<td>8</td>
					<td>1</td>
					<td>1</td>
					<td>最低延迟</td>
			</tr>
			<tr>
					<td>B</td>
					<td>4</td>
					<td>2</td>
					<td>1</td>
					<td>显存均衡</td>
			</tr>
			<tr>
					<td>C</td>
					<td>2</td>
					<td>2</td>
					<td>2</td>
					<td>吞吐优先</td>
			</tr>
			<tr>
					<td>D</td>
					<td>1</td>
					<td>1</td>
					<td>8</td>
					<td>最大并发</td>
			</tr>
	</tbody>
</table>
<p>通过固定输入长度与请求并发，对比上述方案即可得到清晰结论。</p>
<h3 id="实际经验结论常见规律">实际经验结论（常见规律）</h3>
<ul>
<li><strong>TP 越大，TTFT 越低，但通信越重</strong></li>
<li><strong>PP 提升显存利用率，但对小 batch 极不友好</strong></li>
<li><strong>DP 是吞吐的唯一线性放大手段</strong></li>
<li><strong>MoE 的 EP 在低并发下可能反而变慢</strong></li>
</ul>
<h2 id="总结">总结</h2>
<p>并行策略没有<strong>最优解</strong>，只有<strong>最适解</strong>，TP / DP / PP / EP 并不是竞争关系，而是：</p>

<blockquote>
  <p><strong>在模型规模、请求模式、硬件拓扑三者约束下的工程权衡。</strong></p>

</blockquote>
<p>vLLM 提供了一个极其适合做<strong>并行策略验证与对比实验</strong>的平台。真正有价值的工作不是“支持了什么并行”，而是：</p>
<ul>
<li>在你的模型</li>
<li>在你的硬件</li>
<li>在你的真实请求负载下</li>
</ul>
<p><strong>验证哪种组合，才是最优解。</strong></p>
]]></content:encoded></item><item><title>大语言模型（LLM）推理加速：预填充（Prefill）和解码（Decode）解耦（PD 分离）</title><link>https://wilsonwu.me/zh/blog/2025/llm-pd-disaggregated/</link><pubDate>Mon, 22 Dec 2025 00:00:00 -0500</pubDate><guid>https://wilsonwu.me/zh/blog/2025/llm-pd-disaggregated/</guid><description>&lt;p&gt;随着大语言模型（LLM）在对话系统、智能助手和 Agent 场景中的广泛落地，推理系统面临的核心挑战已从“能不能跑”转向“&lt;strong&gt;如何以更低延迟、更高吞吐、更稳定的方式运行&lt;/strong&gt;”。在这一背景下，&lt;strong&gt;PD Disaggregated（Prefill / Decode 解耦）&lt;/strong&gt; 逐渐成为大规模在线推理系统中的关键架构思想。&lt;/p&gt;</description><content:encoded><![CDATA[<p>随着大语言模型（LLM）在对话系统、智能助手和 Agent 场景中的广泛落地，推理系统面临的核心挑战已从“能不能跑”转向“<strong>如何以更低延迟、更高吞吐、更稳定的方式运行</strong>”。在这一背景下，<strong>PD Disaggregated（Prefill / Decode 解耦）</strong> 逐渐成为大规模在线推理系统中的关键架构思想。</p>
<p>本文将不依赖任何具体推理框架，从 <strong>模型推理执行流</strong> 的角度，系统阐述什么是 PD Disaggregated、为什么需要它，以及它为 LLM 推理系统带来的核心优势。</p>
<h2 id="llm-推理的两个本质阶段">LLM 推理的两个本质阶段</h2>
<p>所有自回归大语言模型的推理过程，本质上都可以拆解为两个阶段：</p>
<p><img alt="两个阶段" loading="lazy" src="/zh/blog/2025/llm-pd-disaggregated/1-inference-2-phase.png"></p>
<h3 id="prefill预填充阶段">Prefill（预填充阶段）</h3>
<p>Prefill 阶段负责处理用户输入的完整 Prompt，其主要任务包括：</p>
<ul>
<li>对输入序列进行一次完整前向计算；</li>
<li>构建上下文对应的 KV Cache；</li>
<li>生成第一个输出 Token。</li>
</ul>
<p>这一阶段具有如下特征：</p>
<ul>
<li><strong>计算密集型（Compute-bound）</strong></li>
<li>大规模矩阵乘法（GEMM）占主导</li>
<li>序列长度通常较长</li>
<li>对批处理（Batching）高度友好</li>
</ul>
<h3 id="decode解码阶段">Decode（解码阶段）</h3>
<p>Decode 阶段进入逐 Token 生成过程，每一步都会：</p>
<ul>
<li>输入上一个生成的 Token；</li>
<li>读取历史 KV Cache；</li>
<li>生成下一个 Token，直到结束条件满足。</li>
</ul>
<p>其特征与 Prefill 明显不同：</p>
<ul>
<li><strong>访存密集型（Memory-bound）</strong></li>
<li>计算规模小，但 KV Cache 访问频繁</li>
<li>强延迟敏感</li>
<li>执行步数随生成长度线性增长</li>
</ul>
<h2 id="问题根源prefill-与-decode-的异构性">问题根源：Prefill 与 Decode 的“异构性”</h2>
<p>Prefill 与 Decode 并非同一类工作负载，它们在多个维度上呈现出<strong>显著异构性</strong>：</p>
<table>
	<thead>
			<tr>
					<th>维度</th>
					<th>Prefill</th>
					<th>Decode</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>计算模式</td>
					<td>大算子、密集计算</td>
					<td>小算子、频繁访存</td>
			</tr>
			<tr>
					<td>批处理需求</td>
					<td>大 batch 效果最好</td>
					<td>batch 过大反而增加延迟</td>
			</tr>
			<tr>
					<td>延迟容忍度</td>
					<td>相对较高</td>
					<td>极低</td>
			</tr>
			<tr>
					<td>资源瓶颈</td>
					<td>算力</td>
					<td>显存带宽 / KV Cache</td>
			</tr>
	</tbody>
</table>
<p>如果将这两种阶段<strong>混合部署、统一调度</strong>，就会导致资源使用上的结构性低效。</p>
<h2 id="什么是-pd-disaggregated">什么是 PD Disaggregated</h2>
<p><strong>PD Disaggregated（Prefill / Decode 解耦）</strong>，指的是在推理系统架构层面：</p>

<blockquote>
  <p><strong>将 Prefill 与 Decode 视为两类不同的工作负载，并在调度、资源分配甚至部署拓扑上对它们进行解耦设计。</strong></p>

</blockquote>
<p>需要强调的是：</p>
<ul>
<li>这并不是模型结构的拆分；</li>
<li>也不是参数的拆分；</li>
<li>而是<strong>推理执行路径与资源使用方式的解耦</strong>。</li>
</ul>
<p>PD Disaggregated 的核心思想是：
<strong>让 Prefill 为吞吐服务，让 Decode 为延迟服务。</strong></p>
<h2 id="为什么必须进行-pd-解耦">为什么必须进行 PD 解耦</h2>
<h3 id="gpu-利用率的结构性浪费">GPU 利用率的结构性浪费</h3>
<p>混合执行时常见现象包括：</p>
<ul>
<li>Decode 阶段算子太小，GPU 算力无法被充分利用；</li>
<li>Prefill 阶段的大算子又会阻塞 Decode；</li>
<li>结果是整体 GPU 利用率“看起来不低，但效率很差”。</li>
</ul>
<p>PD 解耦后，可以针对不同阶段采用不同的调度和批策略，显著改善有效算力利用。</p>
<h3 id="延迟不可预测尾延迟恶化">延迟不可预测，尾延迟恶化</h3>
<p>在在线推理场景中，Decode 阶段直接决定用户体验：</p>
<ul>
<li>首 Token 延迟（TTFT）</li>
<li>单 Token 延迟（TPOT）</li>
<li>P99 / P999 延迟</li>
</ul>
<p>如果 Decode 被 Prefill 阻塞，哪怕吞吐提升，用户体验也会显著下降。
PD Disaggregated 能从架构层面<strong>隔离延迟敏感路径</strong>。</p>
<h3 id="扩展性受限">扩展性受限</h3>
<p>在混合架构下：</p>
<ul>
<li>Prefill 和 Decode 只能按同一比例扩容；</li>
<li>无法根据实际负载特征独立扩展某一阶段。</li>
</ul>
<p>而真实业务中：</p>
<ul>
<li>Chat、Agent 场景 Decode 占比极高；</li>
<li>离线生成、批处理 Prefill 占比更高。</li>
</ul>
<p>PD 解耦使得 <strong>按阶段独立扩展成为可能</strong>。</p>
<h2 id="pd-disaggregated-的典型架构形态">PD Disaggregated 的典型架构形态</h2>
<p>在工程实践中，PD Disaggregated 通常体现为以下形式之一：</p>
<h3 id="调度级解耦soft-disaggregation">调度级解耦（Soft Disaggregation）</h3>
<ul>
<li>Prefill 与 Decode 共享模型参数；</li>
<li>但在调度层面对二者区别对待；</li>
<li>Decode 拥有更高优先级。</li>
</ul>
<p>这是最轻量、最容易落地的形态。</p>
<h3 id="资源级解耦resource-disaggregation">资源级解耦（Resource Disaggregation）</h3>
<ul>
<li>Prefill 与 Decode 使用不同的 GPU 资源池；</li>
<li>Prefill GPU 偏向算力型；</li>
<li>Decode GPU 偏向显存带宽与 KV Cache 容量。</li>
</ul>
<p>该模式在大规模集群中尤为常见。</p>
<h3 id="服务级解耦service-disaggregation">服务级解耦（Service Disaggregation）</h3>
<ul>
<li>Prefill 与 Decode 成为独立服务；</li>
<li>中间通过 KV Cache 或状态句柄连接；</li>
<li>可独立伸缩、独立调度。</li>
</ul>
<p>这是 PD Disaggregated 的“完全形态”，也是复杂度最高的一种。</p>
<h2 id="pd-disaggregated-带来的核心优势">PD Disaggregated 带来的核心优势</h2>
<h3 id="更高吞吐与更低延迟并存">更高吞吐与更低延迟并存</h3>
<p>传统架构往往需要在吞吐与延迟之间取舍，而 PD 解耦允许：</p>
<ul>
<li>Prefill 极致批量化；</li>
<li>Decode 极致低延迟。</li>
</ul>
<h3 id="更稳定的尾延迟">更稳定的尾延迟</h3>
<p>Decode 不再被大规模 Prefill 阻塞，P99 / P999 延迟显著改善，这对生产系统至关重要。</p>
<h3 id="更合理的资源利用">更合理的资源利用</h3>
<p>不同阶段匹配不同资源类型，避免“用算力型 GPU 跑访存密集任务”这类结构性浪费。</p>
<h3 id="更强的系统演进能力">更强的系统演进能力</h3>
<p>PD Disaggregated 为后续优化打开空间，例如：</p>
<ul>
<li>KV Cache 分层存储；</li>
<li>Decode 专用硬件；</li>
<li>面向 Agent 的长时会话优化。</li>
</ul>
<h2 id="总结">总结</h2>
<p>PD Disaggregated 并不是某个框架的特性，而是<strong>对 LLM 推理本质的抽象与再设计</strong>：</p>
<ul>
<li>Prefill 和 Decode 在计算形态上天然异构；</li>
<li>强行混合只会掩盖效率问题；</li>
<li>解耦是走向规模化、高质量推理服务的必经之路。</li>
</ul>
<p>可以预见，随着模型规模继续增长、应用形态日益复杂，<strong>PD Disaggregated 将从“高级优化”演变为 LLM 推理系统的默认架构假设</strong>。</p>
]]></content:encoded></item><item><title>Fara-7B：微软推出的高效电脑操作代理模型</title><link>https://wilsonwu.me/zh/blog/2025/microsoft-fara-7b/</link><pubDate>Fri, 28 Nov 2025 00:00:00 -0500</pubDate><guid>https://wilsonwu.me/zh/blog/2025/microsoft-fara-7b/</guid><description>介绍微软最新发布的 Fara-7B 模型，这是一个专为电脑操作设计的 7B 参数模型，以及如何通过 vLLM 进行部署和使用。</description><content:encoded><![CDATA[<p><img alt="Fara-7B" loading="lazy" src="/zh/blog/2025/microsoft-fara-7b/1-fara-7b.png"></p>
<p>微软研究院最近发布了 <strong>Fara-7B</strong>，这是一款专为电脑操作（Computer Use）设计的代理小语言模型（Agentic SLM）。与传统的聊天模型不同，Fara-7B 旨在通过像人类一样使用鼠标和键盘来完成任务。</p>
<h2 id="什么是-fara-7b">什么是 Fara-7B？</h2>
<p>Fara-7B 是一个拥有 70 亿参数的模型，基于 <a href="https://arxiv.org/abs/2502.13923">Qwen2.5-VL-7B</a> 构建。它的主要特点包括：</p>
<ul>
<li><strong>视觉感知</strong>：它通过视觉感知网页（截图）来操作，不需要依赖辅助功能树（Accessibility Trees）或额外的解析模型。</li>
<li><strong>高效紧凑</strong>：尽管只有 7B 参数，但在同类模型中实现了最先进的性能，甚至在某些基准测试中可以与更大的模型竞争。</li>
<li><strong>端侧运行</strong>：由于体积小，它可以在设备上本地运行，从而降低延迟并提高隐私安全性。</li>
</ul>
<p><img alt="使用" loading="lazy" src="/zh/blog/2025/microsoft-fara-7b/2-usage.png"></p>
<h2 id="核心技术">核心技术</h2>
<p>Fara-7B 的训练利用了微软开发的合成数据生成管道，该管道基于 <a href="https://www.microsoft.com/en-us/research/articles/magentic-one-a-generalist-multi-agent-system-for-solving-complex-tasks/">Magentic-One</a> 框架。它通过“观察-思考-行动”（observe-think-act）的循环来执行任务。</p>
<p>在每个步骤中，模型会接收：</p>
<ol>
<li>用户指令</li>
<li>完整的操作历史</li>
<li>最近的三张屏幕截图</li>
</ol>
<p>然后，它会输出一个推理信息（“思考”下一步行动），随后调用工具（如 <code>click(x,y)</code>、<code>type()</code> 等）来执行操作。</p>
<p><img alt="工作流程" loading="lazy" src="/zh/blog/2025/microsoft-fara-7b/3-workflow.png"></p>
<h2 id="性能表现">性能表现</h2>
<p>在 WebVoyager、Online-Mind2Web 等基准测试中，Fara-7B 展现了强大的性能。例如在 WebVoyager 上，它的任务成功率达到了 73.5%，超过了 UI-TARS-1.5-7B (66.4%) 和 GPT-4o (SoM Agent, 65.1%)。</p>
<h2 id="如何通过-vllm-使用-fara-7b">如何通过 vLLM 使用 Fara-7B</h2>
<p>Fara-7B 已经发布在 <a href="https://huggingface.co/microsoft/Fara-7B">Hugging Face</a> 上。由于它是基于 Qwen2.5-VL 的，我们可以使用 vLLM 来高效地部署和推理。</p>
<h3 id="安装-vllm">安装 vLLM</h3>
<p>首先确保你安装了最新版本的 <code>vllm</code>：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>pip install vllm
</span></span></code></pre></div><h3 id="python-代码示例">Python 代码示例</h3>
<p>以下是一个使用 vLLM 加载 Fara-7B 并进行推理的 Python 脚本示例：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> vllm <span style="color:#f92672">import</span> LLM, SamplingParams
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> PIL <span style="color:#f92672">import</span> Image
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> requests
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> io <span style="color:#f92672">import</span> BytesIO
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">run_fara_7b</span>():
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># 模型名称</span>
</span></span><span style="display:flex;"><span>    model_name <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;microsoft/Fara-7B&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># 初始化 LLM</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Fara-7B 基于 Qwen2.5-VL，因此使用类似的配置</span>
</span></span><span style="display:flex;"><span>    llm <span style="color:#f92672">=</span> LLM(
</span></span><span style="display:flex;"><span>        model<span style="color:#f92672">=</span>model_name,
</span></span><span style="display:flex;"><span>        trust_remote_code<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>,
</span></span><span style="display:flex;"><span>        max_model_len<span style="color:#f92672">=</span><span style="color:#ae81ff">4096</span>,  <span style="color:#75715e"># 根据显存大小调整</span>
</span></span><span style="display:flex;"><span>        limit_mm_per_prompt<span style="color:#f92672">=</span>{<span style="color:#e6db74">&#34;image&#34;</span>: <span style="color:#ae81ff">1</span>},
</span></span><span style="display:flex;"><span>        mm_processor_kwargs<span style="color:#f92672">=</span>{
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;min_pixels&#34;</span>: <span style="color:#ae81ff">28</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">28</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;max_pixels&#34;</span>: <span style="color:#ae81ff">1280</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">28</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">28</span>,
</span></span><span style="display:flex;"><span>        },
</span></span><span style="display:flex;"><span>    )
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># 加载示例图片（这里仅作演示，实际使用中应为屏幕截图）</span>
</span></span><span style="display:flex;"><span>    image_url <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg&#34;</span>
</span></span><span style="display:flex;"><span>    response <span style="color:#f92672">=</span> requests<span style="color:#f92672">.</span>get(image_url)
</span></span><span style="display:flex;"><span>    image <span style="color:#f92672">=</span> Image<span style="color:#f92672">.</span>open(BytesIO(response<span style="color:#f92672">.</span>content))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># 构建 Prompt</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># 注意：Fara-7B 使用特定的 Prompt 格式</span>
</span></span><span style="display:flex;"><span>    prompt <span style="color:#f92672">=</span> (
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;&lt;|im_start|&gt;system</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">You are a helpful assistant.&lt;|im_end|&gt;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;&lt;|im_start|&gt;user</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&lt;|vision_start|&gt;&lt;|image_pad|&gt;&lt;|vision_end|&gt;&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Describe this image in detail.&lt;|im_end|&gt;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;&lt;|im_start|&gt;assistant</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>    )
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># 准备输入</span>
</span></span><span style="display:flex;"><span>    inputs <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;prompt&#34;</span>: prompt,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;multi_modal_data&#34;</span>: {
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;image&#34;</span>: image
</span></span><span style="display:flex;"><span>        },
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># 采样参数</span>
</span></span><span style="display:flex;"><span>    sampling_params <span style="color:#f92672">=</span> SamplingParams(temperature<span style="color:#f92672">=</span><span style="color:#ae81ff">0.2</span>, max_tokens<span style="color:#f92672">=</span><span style="color:#ae81ff">512</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># 生成结果</span>
</span></span><span style="display:flex;"><span>    outputs <span style="color:#f92672">=</span> llm<span style="color:#f92672">.</span>generate([inputs], sampling_params<span style="color:#f92672">=</span>sampling_params)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> o <span style="color:#f92672">in</span> outputs:
</span></span><span style="display:flex;"><span>        print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Generated text: </span><span style="color:#e6db74">{</span>o<span style="color:#f92672">.</span>outputs[<span style="color:#ae81ff">0</span>]<span style="color:#f92672">.</span>text<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> __name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;__main__&#34;</span>:
</span></span><span style="display:flex;"><span>    run_fara_7b()
</span></span></code></pre></div><h3 id="命令行启动-api-服务">命令行启动 API 服务</h3>
<p>如果你想启动一个兼容 OpenAI API 的服务，可以使用以下命令：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>vllm serve microsoft/Fara-7B <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --trust-remote-code <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --limit-mm-per-prompt image<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --mm-processor-kwargs <span style="color:#e6db74">&#39;{&#34;min_pixels&#34;: 784, &#34;max_pixels&#34;: 1003520}&#39;</span>
</span></span></code></pre></div><p>注意：<code>min_pixels</code> 对应 28x28，<code>max_pixels</code> 对应 1280x28x28。</p>
<h2 id="总结">总结</h2>
<p>Fara-7B 是微软在代理小模型领域的一次重要尝试，它证明了小模型在复杂的电脑操作任务中也能有出色的表现。通过开源权重，开发者可以更轻松地探索和构建基于 GUI 的自动化代理。</p>
]]></content:encoded></item><item><title>AI 推理的最佳选择 - vLLM</title><link>https://wilsonwu.me/zh/blog/2025/the-best-ai-inference-vllm/</link><pubDate>Wed, 15 Oct 2025 00:00:00 -0400</pubDate><guid>https://wilsonwu.me/zh/blog/2025/the-best-ai-inference-vllm/</guid><description>随着各组织从大语言模型（LLM）的试验阶段迈向生产部署，选择哪种推理平台就成了一项关键的业务决策。这个选择不仅影响性能，也影响灵活性、成本优化，以及应对快速变化业务需求的能力。</description><content:encoded><![CDATA[<p>原文链接：<a href="https://medium.com/open-5g-hypercore/episode-xxx-the-best-choice-for-ai-inference-vllm-286b2af2df71">The Best Choice for AI Inference -&gt; vLLM</a></p>

<blockquote>
  <p>注意：本译文已获得的原文作者翻译授权，为避免广告嫌疑，本文中移除了特定产品和品牌的商业宣传内容，仅保留技术特性及企业级产品功能描述，相关内容请以原文为准。</p>

</blockquote>
<p><img alt="AI 推理的最佳选择 - vLLM" loading="lazy" src="/zh/blog/2025/the-best-ai-inference-vllm/1-vllm.png"></p>
<p>随着各组织从大语言模型（LLM）的试验阶段迈向生产部署，选择哪种推理平台就成了一项关键的业务决策。这个选择不仅影响性能，也影响灵活性、成本优化，以及应对快速变化业务需求的能力。</p>
<p>对于技术人员和方案架构师在评估 LLM 推理平台时，应该重点考虑以下三大因素：</p>
<ol>
<li><strong>架构灵活性</strong>：能否在不同硬件加速器和混合云环境间部署，而不会被某一家厂商锁定。</li>
<li><strong>运行可扩展性</strong>：支持从单 GPU 部署扩展到分布式多节点的高级部署模式。</li>
<li><strong>生态开放性</strong>：对最广泛的模型与内核支持，以及能与各种企业软件生态系统整合。</li>
</ol>
<p>vLLM 在开源基础、先进内存管理能力，以及即将推出的分布式部署蓝图方面，独特地满足这些需求。与专有或硬件专用方案不同，这套组合提供了在成本、性能和运营需求上随时优化调整的自由。</p>
<p>本文将深入分析为何 vLLM 在其技术架构与能力上（尤其是其 KV-Cache 管理、并行策略，以及未来的 llm-d 分布式能力）提供了最可持续的生产级 LLM 部署路径。</p>
<hr>
<h2 id="开源优势">开源优势</h2>
<h3 id="社区驱动的大规模创新">社区驱动的大规模创新</h3>
<p>LLM 推理的发展，根本上受到开源创新的推动。过去一年半以来 <a href="https://blog.vllm.ai/2025/01/27/v1-alpha-release.html">vLLM V1: A Major Upgrade to vLLM’s Core Architecture | vLLM 博客（英文版）</a>，vLLM 在支持多样模型、功能和硬件后端方面取得显著成绩，从伯克利大学的研究项目成长为开源 AI 生态中的事实标准之一 <a href="https://blog.vllm.ai/2025/01/10/vllm-2024-wrapped-2025-vision.html">vLLM 2024 Retrospective and 2025 Vision | vLLM 博客（英文版）</a>。</p>
<p><img alt="vLLM 社区发展" loading="lazy" src="/zh/blog/2025/the-best-ai-inference-vllm/2-vllm-growth.png"></p>

<blockquote>
  <p><a href="https://inferenceops.substack.com/p/state-of-the-model-serving-communities-269">vLLM 社区发展参考链接</a></p>

</blockquote>
<p>vLLM 现在隶属于 PyTorch 基金会托管项目（<a href="https://github.com/vllm-project/vllm">GitHub — vllm-project/vllm: A high-throughput and memory-efficient inference and serving engine for LLMs</a>），这保证了其长远的可持续性和治理机制。</p>
<h3 id="企业支持与开源结合">企业支持与开源结合</h3>
<p>许多企业及产品及解决方案对 vLLM 的态度类似于其对 Linux/OpenStack/Kubernetes 的策略：在社区驱动创新基础上，加入企业级支持、安全性和运维工具。这样模型即可部署在本地、公有云或混合云中，避免绑定。</p>
<p>这种方式带来的好处包括：</p>
<ul>
<li><strong>无厂商绑定</strong>：用户可自由选择部署环境</li>
<li><strong>透明开发</strong>：安全漏洞与缺陷公开追踪与快速修复</li>
<li><strong>社区贡献共享</strong>：一个组织开发的功能惠及整个生态</li>
<li><strong>可定制性</strong>：源代码开放，可针对特定需求修改</li>
</ul>
<p>此外，vLLM 在以下方面具备战略优势：</p>
<ul>
<li><strong>硬件无关性</strong>：不局限于 NVIDIA，支持 AMD、Intel、TPU 等多种平台（<a href="https://github.com/vllm-project/vllm">GitHub — vllm-project/vllm: A high-throughput and memory-efficient inference and serving engine for LLMs</a>）</li>
<li><strong>快速功能迭代</strong>：vLLM v1 对其核心模块（调度器、KV 缓存管理、worker、采样器、API 服务等）进行了全面重构（<a href="https://blog.vllm.ai/2025/01/27/v1-alpha-release.html">vLLM V1: A Major Upgrade to vLLM’s Core Architecture | vLLM 博客（英文版）</a>）</li>
<li><strong>生态整合</strong>：原生兼容 Hugging Face、OpenAI API、Kubernetes 生态</li>
<li><strong>成本优化</strong>：可以为不同工作负载选择最具性价比的硬件</li>
</ul>
<hr>
<h2 id="架构灵活性与并行化策略">架构灵活性与并行化策略</h2>
<h3 id="理解并行化understanding-parallelization">理解并行化（Understanding Parallelization）</h3>
<p>大型语言模型带来了特殊的扩展挑战。例如：一个拥有 70B 参数 的模型，仅其权重（使用 FP16 精度）就需约 140GB 内存，这远远超过单一卡片的容量。基于 vLLM 及相关产品和解决方案通过四种互补的并行化策略来应对这些挑战，每一种策略都解决不同类型的扩展问题。</p>
<h3 id="数据并行data-parallelism-dp跨请求扩展">数据并行（Data Parallelism, DP）：跨请求扩展</h3>
<p>数据并行是最简单的一种扩展模式：在多个服务器上运行完整模型的多个副本，每个副本处理不同的请求批次。在这种模式下：</p>
<ul>
<li><strong>维护完整模型</strong>：每个加速器／服务器保存整个模型的权重。</li>
<li><strong>分配请求</strong>：请求由负载均衡器分发给不同的副本。</li>
<li><strong>支持线性扩展</strong>：增加服务器数目可以线性提升吞吐量。</li>
<li><strong>简化部署</strong>：部署相对简单，不需要对模型进行切分（sharding）。</li>
</ul>
<pre tabindex="0"><code class="language-code" data-lang="code">          [负载均衡器]
               |
    ------------------------
    |          |           |
[Server1]  [Server2]  [Server3]
[Model A]  [Model A]  [Model A]
    |          |           |
[Batch 1]  [Batch 2]  [Batch 3]

关键：每台服务器都有完整的模型副本并行处理不同的请求
</code></pre><p>此模式与基于 KServe 的 Replica-Sets 用于模型副本服务很好的契合，能自动根据请求负载进行扩展，同时保有模型服务的简单性。</p>
<h3 id="流水线并行pipeline-parallelism-pp按层分配">流水线并行（Pipeline Parallelism, PP）：按层分配</h3>
<p>流水线并行将模型按照层（layers）分拆，不同的加速器处理不同的网络层：</p>
<ul>
<li><strong>顺序处理</strong>：请求在 GPU 间依次通过模型层进行处理。</li>
<li><strong>内存均衡</strong>：内存需求在多个设备间较为均匀分布。</li>
<li><strong>灵活部署</strong>：部署灵活，可以跨多个节点，不一定依赖特别高速的互联。</li>
<li><strong>微批处理</strong>：通过微批处理（micro-batching）来保持 GPU 利用率。</li>
</ul>
<pre tabindex="0"><code class="language-code" data-lang="code">Request → [GPU1:NN-Layers 1-8] → [GPU2:NN-Layers 9-16] → [GPU3:NN-Layers 17-24] → Response
             ↓                     ↓                      ↓
          [Memory]              [Memory]               [Memory]
          
时间线：请求按顺序流经 GPU
</code></pre><p>但流水线并行在现代 LLM 应用中也面临一些限制：</p>
<ul>
<li><strong>“流水线气泡”（pipeline bubble）效率低下</strong>：某些 GPU 在等待上游阶段的数据时处于空闲状态。</li>
<li><strong>通信开销高</strong>：阶段间数据传输成为瓶颈。</li>
<li><strong>延迟敏感</strong>：每个阶段都会增加延迟，对“第一个 token 的时间”（time-to-first-token）有负面影响。</li>
<li><strong>对 MoE（Mixture of Experts，混合专家模型）不友好</strong>：MoE 模型中只激活某些专家（非密集执行），这样无法很好地映射到按层划分的流水线结构中。</li>
</ul>
<p>因为这些限制，很多生产环境更倾向于将张量并行（Tensor Parallelism）用于节点内部扩展，将数据并行（Data Parallelism）用于跨节点扩展。尽管如此，在内存受限或与其他并行策略组合使用的场景中，流水线并行仍然有价值。</p>
<h3 id="张量并行tensor-parallelism-tp切分模型权重">张量并行（Tensor Parallelism, TP）：切分模型权重</h3>
<p>当模型太大，单个加速器无法容纳其所有权重时，就使用张量并行来将模型权重拆分到多个 GPU 上：</p>
<ul>
<li><strong>水平层拆分</strong>：每次矩阵乘法操作被分配到多个 GPU，按部分计算。</li>
<li><strong>同步计算</strong>：GPU 之间通过高速互联（如 NVLink、Infinity Fabric 等）进行同步和数据交换。</li>
<li><strong>内存效率</strong>：可使得模型可服务的规模比单个 GPU 容量大出约 4～8 倍。</li>
<li><strong>低延迟</strong>：如果硬件条件合适，通信开销低的话，张量并行还能保持较低的延迟。</li>
</ul>
<pre tabindex="0"><code class="language-code" data-lang="code">Original Matrix Operation:
[Large Weight Matrix] × [Input] = [Output]

With Tensor Parallelism:
[Weight Part 1] → GPU1 ↘
[Weight Part 2] → GPU2 → [Combine] → [Output]
[Weight Part 3] → GPU3 ↗

关键：单矩阵运算跨 GPU 拆分，需要高速互连（NVLink）
</code></pre><p>vLLM 的张量并行实现是硬件无关的，支持多种互联技术和不同类型的加速器。</p>
<h3 id="专家并行expert-parallelism-epmoe-模型中的专家分布策略">专家并行（Expert Parallelism, EP）：MoE 模型中的专家分布策略</h3>
<p>对于<strong>混合专家模型（MoE）</strong>，专家并行把不同的专家（experts）分配给多个 GPU 或多个节点，而不是让每个 GPU 都保存所有专家，由一个路由层（router layer）动态地将 token 分发给需要的专家：</p>
<ul>
<li><strong>分布式专家分片</strong>：专家（experts）被分片（shard）分布在不同的 GPU／节点，使拥有上百个专家的模型能扩展到远超过单设备的内存容量。</li>
<li><strong>动态 token 路由</strong>：每个 token 只被发送到它应使用的一个或多个专家，以减少计算开销。</li>
<li><strong>专家并行负载平衡（Expert Parallel Load Balancing, EPLB）</strong>：防止某些热门专家／专家组被频繁调用导致不均匀负载，通过动态复制或分布专家，以分散负载。</li>
<li><strong>分层调度（Hierarchical Scheduling）</strong>：在多节点集群中，路由与复制先在节点间协调，再在节点内部的 GPU 间协调，确保整体利用率均衡且减少跨节点通信。</li>
<li><strong>性能收益</strong>：对大型的 MoE 模型，这种专家并行在具有高速互联（NVLink、InfiniBand 等）的环境中可以实现接近线性扩展的吞吐效率。</li>
</ul>
<pre tabindex="0"><code class="language-code" data-lang="code">               [Router Layer]
                      |
        ---------------------------------
        |          |          |         |
      GPU1        GPU2       GPU3      GPU4
    [Exp 1,2]   [Exp 3,4]  [Exp 5,6]  [Exp 7,8]
    
令牌流：路由器 → 选定专家 → 输出
</code></pre><h3 id="vllm-的统一策略">vLLM 的统一策略</h3>
<p>vLLM 的区别与优势在于它能够无缝结合这些并行策略，为分布式推理提供高度灵活性，使组织能够：</p>
<ol>
<li><strong>混合使用策略</strong>：例如，在节点内部用张量并行，在节点间用流水线并行。</li>
<li><strong>根据硬件特性调整</strong>：基于可用的互联速度、GPU 内存、延迟敏感性等因素做最优规划。</li>
<li><strong>动态扩展</strong>：可以从单节点部署起步，随着需求增长扩展到多节点／多 GPU。</li>
<li><strong>保持 API 的一致性</strong>：无论使用哪种并行策略，道线路径、调用接口等对使用者尽量透明，不需要因为并行方式不同而改很多逻辑。</li>
</ol>
<p>这种灵活性在混合云环境中尤其关键，因为不同环境（本地、云端、不同厂商硬件）之间的配置可能大不相同。</p>
<pre tabindex="0"><code class="language-code" data-lang="code">Hybrid TP+PP+EP+DP Deployment (MoE Model):

Pipeline Stage 1:               Pipeline Stage 2:              Pipeline Stage 3:
Node 1 (Attention Layers)       Node 2 (MoE FFN Layers)        Node 3 (Output Layers)
[Attn Part A] ←→ [Attn Part B]  [Router + Experts Subset]      [Out Part A] ←→ [Out Part B]
    GPU1           GPU2          GPU3: Experts 1-4                  GPU5            GPU6
         ↕ NVLink ↕              GPU4: Experts 5-8                       ↕ NVLink ↕
                                     ↕ NVLink ↕

Expert Distribution Detail (Node 2):
            [Router]
         GPU3  |  GPU4
        -------|-------
        Exp1   |  Exp5
        Exp2   |  Exp6  
        Exp3   |  Exp7
        Exp4   |  Exp8

Request Flow: → [Attention] → [MoE Layer/Router] → [Output] → Response
                              ↓
                    [Route to specific experts]

Parallelization Breakdown:
- Tensor Parallel (TP): Attention and Output layers split within nodes.
- Pipeline Parallel (PP): Different model stages across nodes .
- Expert Parallel (EP): MoE experts distributed across GPUs in Node 2.
- Data Parallel (DP): Entire pipeline can be replicated for more throughput.
</code></pre><hr>
<h2 id="更好的内存管理kv-cachekey-value-缓存">更好的内存管理：KV-Cache（Key-Value 缓存）</h2>
<h3 id="在-llm-推理中理解-kv-cache">在 LLM 推理中理解 KV-Cache</h3>
<p>KV-Cache（键-值缓存）是 LLM 推理优化中最关键的特性之一。在注意力计算期间，模型必须访问先前 token 的表示 —— 随着序列长度增长，这个过程变得非常消耗内存。</p>
<p>高效的 KV-Cache 管理能决定同一硬件上能同时服务 10 个并发用户或 100 个并发用户，因为缓存复用将计算换成内存利用率。</p>
<pre tabindex="0"><code class="language-code" data-lang="code">(Q * K^T) * V computation process with caching

Step 1 (Prefill Phase)
                    Keys Transpose
                          ↓
    Queries              Keys              Values            Results
       |                  |                  |                  |
    [  Q  ]      ×     [  K  ]      →    [Scores]     ×    [  V  ]    →    [Output]
       |                  |                  |                  |
      64                 64                                    64              64
                          ↓                                     ↓
                    [Storing K]                           [Storing V]
                          ↓                                     ↓
                    ←── Cache memory (stores both K and V) ──→

Step N (Decode Phase)
                    Keys Transpose
                          ↓
    Query              Cached K            Cached V          Results
       |                  |                  |                  |
    [  q  ]      ×   [K₁...Kₙ]      →    [Scores]     ×   [V₁...Vₙ]   →    [output]
    (new)             (from cache)                         (from cache)       (new)
       |                  |                  |                  |
       1                 64                                    64               1
                          ↑                                     ↑
                    ←── Reading from cache (both K and V) ──→

Key Points:
- Prefill: Computes K and V for all input tokens, stores both in cache
- Decode: For each new token, reads ALL previous K and V values from cache
- Both K and V matrices must be cached (not just V)
- Cache size grows with sequence length
</code></pre><h3 id="prefill-阶段-vs-decode-阶段两个截然不同的阶段">Prefill 阶段 vs Decode 阶段：两个截然不同的阶段</h3>
<p>LLM 推理包含两个本质不同的阶段：</p>
<h4 id="prefill-阶段prompt-处理阶段">Prefill 阶段（Prompt 处理阶段）</h4>
<ul>
<li>并行处理所有输入 token。</li>
<li>计算密集型，GPU 利用率高。</li>
<li>为 prompt 中的所有 token 生成初始的 KV-Cache 条目。</li>
<li>延迟与 prompt 长度成正比。</li>
<li>大批量（larger batch sizes）带来好处。</li>
</ul>
<h4 id="decode-阶段token-生成阶段">Decode 阶段（Token 生成阶段）</h4>
<ul>
<li>一个 token 一个 token 顺序生成。</li>
<li>此阶段受限于内存带宽（memory-bandwidth bound）。</li>
<li>每新增一个 token，都要读取整个 KV-Cache 来自缓存的所有先前的 K 和 V。</li>
<li>延迟与输出 token 数量成正比。</li>
<li>依赖高效的缓存管理。</li>
</ul>
<h3 id="pagedattentionvllm-的内存革命">PagedAttention：vLLM 的内存革命</h3>
<p>vLLM 引入 PagedAttention，这是一种在 KV-Cache 管理方面的突破性设计，它将 GPU 内存视为类似操作系统中的虚拟内存（virtual memory）来处理，其关键设计包括：</p>
<ul>
<li><strong>非连续存储（Non-contiguous Storage）</strong>：KV-Cache 块可以存储在 GPU 内存的任意地方，不必是连续的。</li>
<li><strong>动态分配（Dynamic Allocation）</strong>：随着序列长度增长时才分配内存。</li>
<li><strong>内存共享（Memory Sharing）</strong>：完全相同的 prompt 前缀（prompt prefixes）可以共享 KV-Cache 块。</li>
<li><strong>几乎零浪费（Near-Zero Waste）</strong>：消除静态分配中常见的内部碎片问题。</li>
</ul>
<p>这种设计让 vLLM 可以维持更大的批量大小、更高的并发性、以及比那些依赖静态、大型 KV-Cache 缓冲区的系统更好的 GPU 利用率。</p>
<h3 id="连续批处理continuous-batching最大化-gpu-利用率">连续批处理（Continuous Batching）：最大化 GPU 利用率</h3>
<p>vLLM 的连续批处理机制带来了几个举措：</p>
<ul>
<li><strong>动态请求加入</strong>：新的请求可以在 decode 步骤之间加入正在运行的 batch。</li>
<li><strong>提前完成处理</strong>：已经完成的序列立即释放资源。</li>
<li><strong>GPU 使用最优化</strong>：通过混合处理 prefill 与 decode 操作以保持高利用率。</li>
<li><strong>支持抢占（Preemption）</strong>：可以暂停低优先级的请求以优先处理紧急请求。</li>
</ul>
<h3 id="在部署中的实际意义">在部署中的实际意义</h3>
<p>这些内存管理上的创新在实际部署中带来了具体的效益：</p>
<ol>
<li><strong>更高的并发性</strong>：在相同硬件上服务更多用户。</li>
<li><strong>更佳的成本效率</strong>：大幅减少基础设施需求。</li>
<li><strong>改善延迟</strong>：通过高效调度缩短 time-to-first-token。</li>
<li><strong>灵活性</strong>：可以处理变长的序列长度，而无需重新配置系统。</li>
</ol>
<p>KV-Cache 优化在即将推出的 llm-d 分布式架构中变得尤为关键，因为高效的内存使用使得过去因内存约束而无法实现的新部署模式成为可能。</p>
<hr>
<h2 id="使用-llm-d-扩展kubernetes-原生的分布式推理">使用 llm-d 扩展：Kubernetes 原生的分布式推理</h2>
<h3 id="超越单服务器部署">超越单服务器部署</h3>
<p>虽然 vLLM 自身是高性能推理引擎，但在大规模生产环境中，还需要复杂的编排和智能请求调度。2025 年 5 月，红帽、Google Cloud、IBM 研究院、NVIDIA 和 CoreWeave 联手推出 llm-d，构建在 vLLM 之上的 Kubernetes 原生分布式推理栈。</p>
<p>llm-d 并不是 vLLM 的内置功能，而是一个补充的编排层。可以把它比作 Linux 与 Kubernetes 的关系：vLLM 负责推理引擎，llm-d 负责跨实例的调度与编排。它结合了三项开源技术：vLLM、Inference Gateway（AI 路由层）和 Kubernetes。</p>
<p>KServe 也在集成 llm-d，通过新的 <a href="https://docs.google.com/document/d/11ZQJ2VhTc42S9K4yau2dMs3Q3f4jqWJL_7Sq14C3hzY/edit?tab=t.0">LLMInference CRD</a>，实现统一的服务接口，简化生成式 AI 的企业上手路径。</p>
<p><img alt="Kubernetes 中的 AI 推理" loading="lazy" src="/zh/blog/2025/the-best-ai-inference-vllm/3-ai-inference-k8s.png"></p>
<p>llm-d 将三大基础开源技术集成到一个统一的服务栈中：</p>
<ul>
<li><strong>vLLM</strong> - 执行模型推理的高性能推理引擎。</li>
<li><strong>推理网关（IGW）</strong> - 一个官方 Kubernetes 项目，通过 AI 感知路由扩展了 Gateway API。</li>
<li><strong>Kubernetes</strong> - 用于部署和扩展的行业标准编排平台。</li>
</ul>
<p>通过整合这些技术，llm-d 使企业能够在混合云环境中大规模部署 LLM 推理，并实现最快的价值实现时间和极具竞争力的性价比。</p>
<h3 id="三项关键创新">三项关键创新</h3>
<p>传统的负载均衡采用简单的轮询（round-robin）路由，对所有服务器一视同仁。llm-d 的 <strong>vLLM 感知调度程序</strong>能够做出智能决策，将请求路由到具有匹配缓存前缀的实例，根据实例是处理计算密集型预填充操作还是内存密集型解码操作来分配负载，并使用来自 vLLM 的实时可观测数据来避免实例过载，同时优先处理低延迟路径。这种智能路由可将基础设施成本降低 30% 到 50%，同时保持延迟 SLO。</p>
<h4 id="解耦式服务disaggregated-serving">解耦式服务（Disaggregated Serving）</h4>
<p>llm-d 在生产规模上协调 vLLM 的本机分解服务（通过 KVConnector API），将预填充和解码分离到专门的工作节点中：</p>
<ul>
<li>
<p><strong>预填充工作节点</strong>：负责计算密集型的提示处理，使用高性能 GPU（如 H100、MI300X），并可根据需求独立扩展。</p>
</li>
<li>
<p><strong>解码工作节点</strong>：专注于受内存带宽限制的 token 生成任务，使用具成本效益的 GPU（如 A100、L40S），并根据并发会话数进行弹性扩缩。</p>
</li>
<li>
<p><strong>KV 缓存传输</strong>：使用 NVIDIA NIXL 通过 UCX 提供高效的缓存移动，支持卸载到存储后端（未来交付）以及跨集群的全局缓存感知。</p>
</li>
</ul>
<p>这允许适当规模的基础设施：昂贵的 GPU 仅用于预填充，成本优化的硬件可为数千个并发用户提供服务。</p>
<h4 id="分布式前缀缓存distributed-prefix-caching">分布式前缀缓存（Distributed Prefix Caching）</h4>
<p>llm-d 将 vLLM 的前缀缓存扩展到多个实例之间，通过两种方式实现：</p>
<ul>
<li>
<p><strong>本地缓存</strong>：在每个实例上将缓存卸载（offload）到内存或磁盘，几乎没有运维成本。</p>
</li>
<li>
<p><strong>共享缓存（计划中）</strong>：通过实例之间的 KV 传输实现共享，并使用全局索引实现集群范围的缓存感知。</p>
</li>
</ul>
<hr>
<h4 id="部署模式deployment-patterns">部署模式（Deployment Patterns）</h4>
<p>llm-d 支持多种先进的企业部署模式：</p>
<ul>
<li>
<p><strong>异构硬件</strong>：根据工作负载混合 GPU 供应商和代数——用于预填充的高端 GPU、用于解码的成本优化 GPU 或用于低频请求的 CPU 集群。</p>
</li>
<li>
<p><strong>动态扩缩</strong>：在高峰时段独立调整预填充容量，同时保持活动会话的稳定解码容量，并具有自动资源分配和故障转移功能。</p>
</li>
<li>
<p><strong>地理分布（规划中）</strong>：在主数据中心部署集中式预填充工作者，并在用户附近部署边缘解码工作者，以实现低延迟响应。</p>
</li>
</ul>
<hr>
<h2 id="多加速器与混合云支持">多加速器与混合云支持</h2>
<h3 id="摆脱硬件锁定">摆脱硬件锁定</h3>
<p>AI 加速器快速演进，使市场变得多样化。专优化 NVIDIA 的方案如 TensorRT-LLM 虽然性能优秀，但容易导致锁定。vLLM 的硬件中立设计则允许用户自由选择最适合的加速器。</p>
<h3 id="广泛硬件支持">广泛硬件支持</h3>
<p>vLLM 支持 NVIDIA GPU（针对 H100 进行一流的优化，支持 V100 及更新版本的所有 NVIDIA GPU）、AMD GPU（MI200、MI300 和 Radeon RX 7900 系列）、Google TPU（v4、v5p、v5e 和最新的 v6e）、AWS Inferentia 和 Trainium（trn1/inf2 实例）、Intel Gaudi（HPU）和 GPU（XPU）以及支持 x86、ARM 和 PowerPC <a href="https://blog.vllm.ai/2025/01/10/vllm-2024-wrapped-2025-vision.html">vLLM 2024 Retrospective and 2025 Vision | vLLM 博客（英文版）</a>。</p>
<p>这种广泛支持带来以下战略优势：</p>
<h4 id="成本优化">成本优化</h4>
<ul>
<li>选择 AMD MI300X，在特定工作负载下实现高性价比。</li>
<li>使用 AWS Inferentia，在 AWS 上进行经济高效的推理。</li>
<li>在低吞吐量用例中，可部署在现有 CPU 基础架构上。</li>
</ul>
<h4 id="供应链弹性">供应链弹性</h4>
<ul>
<li>避免依赖单一 GPU 供应商的可用性。</li>
<li>通过多种选择协商更优惠的价格。</li>
<li>根据区域硬件可用性进行调整。</li>
</ul>
<h4 id="工作负载匹配">工作负载匹配</h4>
<ul>
<li>NVIDIA H100 可实现最佳性能。</li>
<li>AMD GPU 适用于开源部署。</li>
<li>TPU 适用于 Google Cloud 部署。</li>
<li>Intel Gaudi 适用于特定企业协议。</li>
</ul>
<h3 id="混合云部署模式">混合云部署模式</h3>
<p>在企业级产品及解决方案中，vLLM 支持真正的混合云：</p>
<h4 id="本地核心">本地核心</h4>
<ul>
<li>在本地基础架构上处理敏感数据。</li>
<li>满足合规性要求的工作负载。</li>
<li>可预测的基线负载容量。</li>
</ul>
<h4 id="云爆发式扩展">云爆发式扩展</h4>
<ul>
<li>利用云资源处理峰值负载。</li>
<li>试用新硬件（H100s、TPU v6e）。</li>
<li>无需基础设施投资即可实现地域扩展。</li>
</ul>
<h4 id="边缘推理">边缘推理</h4>
<ul>
<li>部署在适合边缘计算的硬件上。</li>
<li>CPU 或更小的 GPU 推理。</li>
<li>与集中管理集成。</li>
</ul>
<hr>
<h2 id="统一运维跨环境">统一运维跨环境</h2>
<p>借助企业级产品的相关功能，用户可从单一控制平面管理全部部署（公有云 + 私有云），主要从一下几个方面考虑。</p>
<ul>
<li><strong>单一控制平面</strong>：通过统一界面管理所有部署。</li>
<li><strong>一致的 API</strong>：跨环境实现相同的应用程序集成。</li>
<li><strong>统一监控</strong>：跨混合部署的聚合指标。</li>
<li><strong>策略执行</strong>：一致的安全和合规策略。</li>
</ul>
<hr>
<h2 id="模型生态与兼容性">模型生态与兼容性</h2>
<h3 id="支持广泛的开源模型体系">支持广泛的开源模型体系</h3>
<p>随着人工智能“淘金热”步伐的加快，vLLM 已发展到支持<a href="https://docs.vllm.ai/en/stable/models/supported_models.html#text-generation">超过 100 种模型架构</a>的高性能推理：涵盖几乎所有著名的开源大型语言模型（LLM）、多模态模型（图像、音频、视频）、编码器-解码器模型、推测解码模型、分类模型、嵌入模型和奖励模型。<a href="https://blog.vllm.ai/2025/01/10/vllm-2024-wrapped-2025-vision.html">vLLM 2024 Retrospective and 2025 Vision | vLLM 博客（英文版）</a>。与专注于有限模型系列的专业解决方案相比，这种全面的支持具有根本性的优势。</p>
<h3 id="不只是传统-llm">不只是传统 LLM</h3>
<p>vLLM 的架构支持更多样的模型类型：</p>
<h4 id="语言模型">语言模型</h4>
<ul>
<li>Llama 系列。</li>
<li>Mistral 和 Mixtral 多模态模型。</li>
<li>Google 的 Gemma 模型。</li>
<li>IBM 的 Granite 系列。</li>
<li>阿里巴巴的 Qwen 模型。</li>
</ul>
<h4 id="多模态模型">多模态模型</h4>
<ul>
<li>视觉-语言模型（LLaVA, Qwen-VL）。</li>
<li>文档理解模型。</li>
<li>音频-语言模型。</li>
<li>视频理解能力。</li>
</ul>
<h4 id="专用架构">专用架构</h4>
<ul>
<li>状态空间语言模型的生产支持，探索非 Transformer 语言模型的未来。<a href="https://blog.vllm.ai/2025/01/10/vllm-2024-wrapped-2025-vision.html">vLLM 2024 Retrospective and 2025 Vision | vLLM 博客（英文版）</a>。</li>
<li>混合专家（MoE）模型。</li>
<li>编码器-解码器架构。</li>
<li>嵌入和重排序模型。</li>
</ul>
<hr>
<h2 id="模型集成简易流程">模型集成简易流程</h2>
<p>将新模型加入 vLLM 通常包括以下步骤：</p>
<ol>
<li><strong>模型架构定义</strong>：使用熟悉的 PyTorch 模式实现。</li>
<li><strong>Attention 后端集成</strong>：利用现有的优化内核。</li>
<li><strong>Tokenizer 支持</strong>：兼容 Direct Hugging Face。</li>
<li><strong>配置映射</strong>：基于标准 YAML 的配置。</li>
</ol>
<p>这样的标准化流程意味着组织能更快将新模型投入生产。例如，在 2025 年 8 月 GPT-OSS 发布后不久，vLLM 的 <a href="https://github.com/vllm-project/vllm/releases/tag/v0.11.0">v0.11.0 版本</a>就加入了对其生产部署的支持。</p>
<hr>
<h2 id="与-hugging-face-生态整合">与 Hugging Face 生态整合</h2>
<p>vLLM 与 Hugging Face 的原生兼容带来了便捷性：</p>
<h3 id="直接模型加载">直接模型加载</h3>
<ul>
<li>直接从 Hugging Face Hub 和/或兼容 S3 的对象存储后端（例如 MinIO）加载模型。</li>
<li>支持私有模型库。</li>
<li>自动权重转换处理。</li>
</ul>
<h3 id="分词器兼容性">分词器兼容性</h3>
<ul>
<li>使用现有的分词器实现。</li>
<li>支持自定义分词器。</li>
<li>快速分词器优化</li>
</ul>
<h3 id="配置保存">配置保存</h3>
<ul>
<li>尊重特定于模型的配置。</li>
<li>支持自定义模型参数。</li>
<li>兼容经过微调的变体。</li>
</ul>
<hr>
<h2 id="生产级模型管理">生产级模型管理</h2>
<p>在一些企业级产品和方案中增加了模型生命周期的企业功能：</p>
<h3 id="模型注册集成">模型注册集成</h3>
<ul>
<li>已部署模型的版本控制。</li>
<li>A/B 测试功能。</li>
<li>回滚机制。</li>
</ul>
<h3 id="模型监控">模型监控</h3>
<ul>
<li>每个模型的性能跟踪。</li>
<li>使用情况分析和成本归因。</li>
<li>偏差检测功能。</li>
</ul>
<hr>
<h2 id="面向未来的模型支持">面向未来的模型支持</h2>
<p>模型创新速度极快，推理平台必须具备适应能力：</p>
<h3 id="社区贡献">社区贡献</h3>
<ul>
<li>活跃的社区不断添加新模型。</li>
<li>供应商中立的开发流程。</li>
<li>快速集成突破性架构。</li>
</ul>
<h3 id="灵活的架构">灵活的架构</h3>
<ul>
<li>模块化设计支持新的模型范式。</li>
<li>不受特定模型假设的约束。</li>
<li>为后转型架构做好准备。</li>
</ul>
<h3 id="企业验证">企业验证</h3>
<ul>
<li>企业的测试和认证流程。</li>
<li>模型工件的安全扫描。</li>
<li>跨硬件性能验证。</li>
</ul>
<p>这种全面的模型支持确保组织能够在新模型出现时立即采用它们，而无需进行平台迁移或架构更改，这是人工智能领域持续快速发展的一项关键能力。</p>
<hr>
<h2 id="使用企业级产品进行企业部署">使用企业级产品进行企业部署</h2>
<h3 id="从第一天起就是生产级">从第一天起就是生产级</h3>
<p>大多数企业级产品提供了一个灵活、可扩展的 MLOps 平台，提供构建、部署和管理 AI 应用的工具。它采用开源技术构建，为团队提供值得信赖且操作一致的功能，用于实验、模型服务和交付创新应用。了解更多关于企业级产品如何应对这一挑战的信息。</p>
<h3 id="与-kserve-的整合智能模型服务">与 KServe 的整合：智能模型服务</h3>
<p>在许多产品和方案中对 vLLM 与 KServe 的集成提供了企业级服务功能：</p>
<h4 id="genai-功能">GenAI 功能</h4>
<ul>
<li>使用 vLLM 服务运行时进行多节点/多 GPU 推理。</li>
<li>通过 vLLM + LMCache 集成卸载键值缓存。</li>
<li>通过模型缓存高效重用模型。</li>
<li>集成 KEDA，允许基于外部指标自动扩缩。</li>
<li>通过与 Envoy AI Gateway 集成实现速率限制和请求路由。</li>
<li>通过 LLMInferenceService CRD 访问 llm-d 功能。</li>
</ul>
<h4 id="高级自动扩缩">高级自动扩缩</h4>
<ul>
<li>基于请求的扩缩，实现资源利用率优化。</li>
<li>缩减​​至零功能，实现成本优化。</li>
<li>基于流量模式的预测性扩缩。</li>
<li>多指标扩缩（GPU 利用率、队列深度、延迟）。</li>
</ul>
<h4 id="流量管理">流量管理</h4>
<ul>
<li>金丝雀部署，确保模型更新安全。</li>
<li>蓝绿部署，实现即时回滚。</li>
<li>A/B 测试，用于模型比较。</li>
<li>影子流量，用于验证。</li>
</ul>
<h4 id="服务网格集成">服务网格集成</h4>
<ul>
<li>使用 Istio 进行端到端加密。</li>
<li>高级路由和负载均衡。</li>
<li>熔断和重试逻辑。</li>
<li>用于调试的分布式跟踪。</li>
</ul>
<h4 id="自动化运维">自动化运维</h4>
<ul>
<li>健康检查和自动恢复。</li>
<li>资源优化建议。</li>
<li>自动化证书管理。</li>
<li>日志聚合和分析。</li>
</ul>
<h3 id="安全与合规">安全与合规</h3>
<p>在企业部署中，必须重视安全：</p>
<h4 id="访问控制">访问控制</h4>
<ul>
<li>RBAC 与企业身份提供商集成。</li>
<li>模型级访问权限。</li>
<li>API 密钥管理。</li>
<li>所有操作的审计日志记录。</li>
</ul>
<h4 id="数据保护">数据保护</h4>
<ul>
<li>静态和传输中加密。</li>
<li>私有端点选项。</li>
<li>网络策略实施。</li>
<li>合规性报告工具。</li>
</ul>
<h4 id="供应链安全">供应链安全</h4>
<ul>
<li>签名容器镜像。</li>
<li>SBOM（软件物料清单）生成。</li>
<li>漏洞扫描。</li>
<li>基于策略的部署控制。</li>
</ul>
<h3 id="mlperf-验证的性能">MLPerf 验证的性能</h3>
<p>一些企业级解决方案和产品与众多知名服务器原始设备制造商（OEM）合作，使用搭载 NVIDIA GPU 和 vLLM 推理运行时的产品发布了令人印象深刻的 MLPerf 推理结果，在应对这一挑战方面取得了重大进展。加速生成式 AI 的采用，这些结果验证了：</p>
<ul>
<li>规模化生产级性能。</li>
<li>高效的资源利用率。</li>
<li>负载下一致的延迟。</li>
<li>多实例协调能力。</li>
</ul>
<h3 id="集成可观测性">集成可观测性</h3>
<p>无需额外工具即可进行全面监控：</p>
<h4 id="指标和仪表板">指标和仪表板</h4>
<ul>
<li>预建 Grafana 仪表板，用于 vLLM 指标。</li>
<li>预建 Grafana 仪表板，用于驱动路由决策的请求调度程序指标。</li>
<li>令牌生成率和延迟。</li>
<li>GPU 利用率和内存使用率。</li>
<li>队列深度和拒绝率。</li>
</ul>
<h4 id="警报和响应">警报和响应</h4>
<ul>
<li>SLA 违规自动警报。</li>
<li>与企业监控系统集成。</li>
<li>Runbook 自动化功能。</li>
<li>容量规划洞察。</li>
</ul>
<h3 id="成本管理与优化未来交付">成本管理与优化（未来交付）</h3>
<p>专为企业成本控制设计的功能：</p>
<ul>
<li><strong>计费/显示</strong>：按团队或项目跟踪使用情况。</li>
<li><strong>资源配额</strong>：防止成本失控。</li>
<li><strong>竞价型实例支持</strong>：降低批量工作负载的成本。</li>
<li><strong>空闲检测</strong>：自动缩减未使用的资源。</li>
</ul>
<p>这个企业级平台将 vLLM 从高性能推理引擎转变为完整的生产解决方案，可用于关键任务部署。</p>
<hr>
<h2 id="特性对比vllm-vs-tgi-vs-tensorrt-llm">特性对比：vLLM vs TGI vs TensorRT-LLM</h2>
<p>✓ = 全面支持，◐ = 部分/有限支持，✗ = 不支持</p>
<p><img alt="vLLM vs TGI vs TensorRT-LLM" loading="lazy" src="/zh/blog/2025/the-best-ai-inference-vllm/4-vllm-tgi-tensorrt-llm.png"></p>
<hr>
<h2 id="企业级产品与开源-vllm-的主要区别">企业级产品与开源 vLLM 的主要区别</h2>
<ul>
<li>硬件灵活性：最广泛的加速器支持，包括 AMD、Intel、Google TPU 和 CPU。</li>
<li>模型生态系统：支持超过 100 种模型架构，而其他替代方案仅有 25-40 种。</li>
<li>分布式架构：即将推出的 llm-d 支持分解式预填充/解码和系统级 kv-cache 路由，以实现分布式最优扩展。</li>
<li>企业集成：企业级产品集成 KServe 自动扩展。</li>
<li>内存效率：先进的 PagedAttention 和 KV-Cache 管理。</li>
<li>开放开发：PyTorch 基金会项目，社区创新迅速。</li>
</ul>
<hr>
<h2 id="如何作出正确选择">如何作出正确选择</h2>
<p>文中给出一个简单的决策框架：对每个判断点打 “Yes”：</p>
<ul>
<li><strong>0–2 个 “Yes”</strong>：可考虑专用方案（若其满足你的特定需求）</li>
<li><strong>3–5 个 “Yes”</strong>：vLLM 在你的场景中将提供显著优势</li>
<li><strong>6+ 个 “Yes”</strong>：基于 vLLM 的企业级产品是战略性选择</li>
</ul>
<p>每个决策点都涉及基本的架构约束：</p>
<ul>
<li><strong>灵活性要求</strong>决定您是否需要与硬件无关的解决方案。</li>
<li><strong>运营复杂性</strong>评估简化的运营是否值得采用开源技术。</li>
<li><strong>模型与创新</strong>评估快速发展是否需要一个适应性强的平台。</li>
<li><strong>长期可持续性</strong>考虑总体拥有成本和战略风险。</li>
</ul>
<hr>
<h2 id="战略推荐">战略推荐</h2>
<p>如果你对多个维度都倾向 “Yes”，那 vLLM + 企业级产品将提供：</p>
<ul>
<li><strong>最大的灵活性</strong>：可在任何受支持的硬件上部署。</li>
<li><strong>优秀的运维体验</strong>：企业级平台，复杂性极低。</li>
<li><strong>面向未来的能力</strong>：支支持新兴模型和架构。</li>
<li><strong>成本优化</strong>：为每种工作负载选择最佳硬件。</li>
<li><strong>风险控制</strong>：开源基础，提供企业级支持。</li>
</ul>
<p>这些因素的融合使得 vLLM 成为构建可持续人工智能基础设施的组织的战略选择。</p>
<hr>
<h2 id="采纳步骤建议">采纳步骤建议</h2>
<h3 id="立即阶段">立即阶段</h3>
<ul>
<li>在开发环境部署 vLLM + 企业级产品</li>
<li>用自己的模型和工作负载进行测试</li>
<li>验证硬件灵活性与性能</li>
</ul>
<h3 id="短期阶段">短期阶段</h3>
<ul>
<li>实施 KServe 的自动扩缩能力</li>
<li>建立监控与可观察性体系</li>
<li>培训团队操作流程</li>
</ul>
<h3 id="中期阶段">中期阶段</h3>
<ul>
<li>设计生产部署架构</li>
<li>若需要，实施混合云模式</li>
<li>为 llm-d 分布式架构做准备</li>
</ul>
<h3 id="长期阶段">长期阶段</h3>
<ul>
<li>优化成本（选硬件、资源调度）</li>
<li>引入更高级部署模式</li>
<li>将自己的改进贡献给社区</li>
</ul>
<hr>
<h2 id="总结">总结</h2>
<p>选择 LLM 推理平台代表着一项战略承诺，它将影响您组织未来几年的人工智能能力。</p>
<p>我们的分析表明，企业级产品上的 vLLM 独特地满足了企业 LLM 部署的三个关键要求：</p>
<ol>
<li><strong>灵活性</strong>：可在任意硬件与混合云环境部署</li>
<li><strong>可扩展性</strong>：先进内存管理与 llm-d 架构使资源利用效率提升 10–100 倍</li>
<li><strong>可持续性</strong>：开源基础 + 企业支持，避免陷入锁定</li>
</ol>

<blockquote>
  <p>虽然 TensorRT-LLM 提供了 NVIDIA 专属优化，TGI 也提供了 Hugging Face 集成，但“只有 vLLM 能够提供快速发展的 AI 领域所需的架构灵活性”。
凭借对 100 多种模型架构的支持、与硬件无关的设计以及 PyTorch 和 Linux 基金会的支持，-&gt;“搭载 vLLM 的企业级产品为长期成功奠定了最坚实的基础”。</p>

</blockquote>
]]></content:encoded></item><item><title>玩转大语言模型：基于 vLLM 框架的大模型推理优化实现参数 / 数据（P/D）分离</title><link>https://wilsonwu.me/zh/blog/2025/vllm-pd-separation/</link><pubDate>Mon, 29 Sep 2025 00:00:00 -0400</pubDate><guid>https://wilsonwu.me/zh/blog/2025/vllm-pd-separation/</guid><description>随着大语言模型规模的不断增长，推理部署面临显存紧张与并发受限的挑战。本文介绍如何借助 vLLM 框架，通过 参数（Parameter）/ 数据（Data）分离（P/D Separation）优化推理性能。我们将从原理、架构思路到配置与代码实例逐步展开，展示如何让参数长期驻留在专用 GPU，而输入序列与 KV Cache 等动态数据独立管理，从而提升吞吐率、降低成本并增强系统扩展性。</description><content:encoded><![CDATA[<p>大模型在推理部署时，往往存在<strong>显存瓶颈</strong>：</p>
<ul>
<li>模型参数（Parameters, P）动辄上百 GB，需要长期驻留显存。</li>
<li>输入/输出数据（Data, D）则随请求动态变化，但往往和参数耦合在同一设备上，导致显存占用不均衡，扩展性受限。</li>
</ul>
<p>为了解决这一问题，可以借助 <strong>vLLM 框架</strong>实现<strong>参数 / 数据（P/D）分离</strong>，提升推理系统的灵活性和吞吐。</p>
<h2 id="大模型推理的资源瓶颈">大模型推理的资源瓶颈</h2>
<p>以一个 70B 规模的 Transformer 模型为例：</p>
<ul>
<li>参数权重（FP16 存储）约需 <strong>140GB 显存</strong>；</li>
<li>每次请求输入的序列数据、KV Cache 会消耗额外显存，并随 batch size 增长而急剧膨胀。</li>
</ul>
<p>如果不加区分地将 P 与 D 放在同一块 GPU：</p>
<ol>
<li>参数长期驻留，挤压了用于动态数据的显存；</li>
<li>多实例并发时，数据显存不足，限制了吞吐。</li>
</ol>
<p>因此，在分布式推理系统中，业界逐渐采用 <strong>参数与数据分离（P/D Separation）</strong> 的架构思路。</p>
<h2 id="vllm-简介">vLLM 简介</h2>
<p><a href="https://vllm.ai/">vLLM</a> 是一个高性能的大模型推理引擎，核心优势包括：</p>
<ul>
<li><strong>PagedAttention</strong>：高效管理 KV Cache，支持大批量并发；</li>
<li><strong>高吞吐率</strong>：相较于 Hugging Face Transformers 推理，吞吐提升数倍；</li>
<li><strong>灵活的分布式支持</strong>：可结合 DeepSpeed、Megatron 等方案，支持参数/数据分布式存储与调度。</li>
</ul>
<p>vLLM 的模块化架构，使其天然适合实现 <strong>P/D 分离</strong>。</p>
<h2 id="pd-分离的实现思路">P/D 分离的实现思路</h2>
<p>在 vLLM 中，推理流程大致分为两个部分：</p>
<ol>
<li>
<p><strong>参数侧（P）</strong></p>
<ul>
<li>模型权重加载与存放；</li>
<li>可通过 <strong>ZeRO-3 / Tensor Parallel</strong> 等策略将参数分布在多 GPU 节点上；</li>
<li>参数在整个推理生命周期中保持常驻，不随请求波动。</li>
</ul>
</li>
<li>
<p><strong>数据侧（D）</strong></p>
<ul>
<li>动态输入序列、KV Cache、采样状态等；</li>
<li>可使用 <strong>PagedAttention</strong> 管理显存分页；</li>
<li>支持把部分 KV Cache 放到 CPU/Host 内存，再动态迁移到 GPU。</li>
</ul>
</li>
</ol>
<h2 id="核心机制">核心机制</h2>
<p>其核心机制是显存资源隔离：</p>
<ul>
<li><strong>权重（P）</strong> 固定驻留在专门的 GPU（参数节点）；</li>
<li><strong>数据（D）</strong> 可以按需分配到其他 GPU（数据节点），甚至利用 CPU 内存 / NVMe。</li>
</ul>
<p>这样：</p>
<ul>
<li>参数显存不与动态数据抢占空间；</li>
<li>数据可以根据请求动态扩展，提升并发能力。</li>
</ul>
<h2 id="在-vllm-中的实现路径">在 vLLM 中的实现路径</h2>
<p>实现 P/D 分离的常见方法：</p>
<ol>
<li>
<p><strong>参数分片（Parameter Sharding）</strong></p>
<ul>
<li>借助 vLLM 对 Megatron-LM / DeepSpeed 的支持，将模型参数按张量维度切分到多 GPU；</li>
<li>仅在推理计算时聚合，不需要在每个设备上完整存放参数。</li>
</ul>
</li>
<li>
<p><strong>KV Cache 分离（Data Sharding）</strong></p>
<ul>
<li>通过 vLLM 的 <strong>PagedAttention</strong>，可以把 KV Cache 存在独立的 GPU 或 Host 内存；</li>
<li>在推理过程中按需调页，类似操作系统的虚拟内存机制。</li>
</ul>
</li>
<li>
<p><strong>Pipeline 并行化</strong></p>
<ul>
<li>将模型计算划分为不同阶段，前几层专门占用参数节点，后几层在数据节点完成；</li>
<li>在流水线中，数据逐层传递，而参数保持分片驻留。</li>
</ul>
</li>
</ol>
<h2 id="基于-vllm-的-pd-分离实战">基于 vLLM 的 P/D 分离实战</h2>
<p>下面给出两部分内容：</p>
<ul>
<li><strong>配置示例</strong>：如何在多 GPU 环境下指定参数和数据分布；</li>
<li><strong>代码示例</strong>：如何加载模型并运行推理，展示参数常驻、数据动态分配。</li>
</ul>
<h2 id="配置示例">配置示例</h2>
<p>假设我们有 4 张 GPU：</p>
<ul>
<li><strong>GPU 0,1</strong>：专门存放模型参数（P）；</li>
<li><strong>GPU 2,3</strong>：主要承载 KV Cache 等动态数据（D）。</li>
</ul>
<p>我们可以在启动 vLLM 时设置：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>CUDA_VISIBLE_DEVICES<span style="color:#f92672">=</span>0,1,2,3 <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>python -m vllm.entrypoints.api_server <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>    --model /path/to/llama-2-70b <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>    --tensor-parallel-size <span style="color:#ae81ff">2</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>    --gpu-memory-utilization 0.85 <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>    --enable-chunked-prefill <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>    --enforce-eager <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>    --kv-cache-dtype fp16 <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>    --max-num-batched-tokens <span style="color:#ae81ff">4096</span>
</span></span></code></pre></div><p>这里的关键点：</p>
<ul>
<li><code>--tensor-parallel-size 2</code>：只在 GPU 0,1 上做参数分片存放；</li>
<li><code>--gpu-memory-utilization</code>：控制参数占用的比例，留出余量给数据；</li>
<li><code>--kv-cache-dtype fp16</code>：降低 KV Cache 精度，减少数据显存占用；</li>
<li><strong>vLLM 内部的 PagedAttention</strong> 会自动把 KV Cache 分配到 GPU 2,3，如果溢出则回退到 CPU 内存。</li>
</ul>
<h2 id="代码示例">代码示例</h2>
<p>下面是一个 Python 调用示例：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> vllm <span style="color:#f92672">import</span> LLM, SamplingParams
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># -------- 参数（P）分离 --------</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># tensor_parallel_size=2 表示参数分布在前两张 GPU（0,1）</span>
</span></span><span style="display:flex;"><span>llm <span style="color:#f92672">=</span> LLM(
</span></span><span style="display:flex;"><span>    model<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/path/to/llama-2-70b&#34;</span>,
</span></span><span style="display:flex;"><span>    tensor_parallel_size<span style="color:#f92672">=</span><span style="color:#ae81ff">2</span>,
</span></span><span style="display:flex;"><span>    gpu_memory_utilization<span style="color:#f92672">=</span><span style="color:#ae81ff">0.85</span>,
</span></span><span style="display:flex;"><span>    enforce_eager<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>,       <span style="color:#75715e"># 避免显存碎片</span>
</span></span><span style="display:flex;"><span>    enable_chunked_prefill<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>,
</span></span><span style="display:flex;"><span>    kv_cache_dtype<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;fp16&#34;</span>     <span style="color:#75715e"># 数据（D）使用更轻量的缓存精度</span>
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># -------- 数据（D）分离 --------</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># PagedAttention 会自动管理 KV Cache 的存放位置（GPU2, 3, 甚至 CPU 内存）</span>
</span></span><span style="display:flex;"><span>sampling_params <span style="color:#f92672">=</span> SamplingParams(
</span></span><span style="display:flex;"><span>    temperature<span style="color:#f92672">=</span><span style="color:#ae81ff">0.8</span>,
</span></span><span style="display:flex;"><span>    top_p<span style="color:#f92672">=</span><span style="color:#ae81ff">0.95</span>,
</span></span><span style="display:flex;"><span>    max_tokens<span style="color:#f92672">=</span><span style="color:#ae81ff">256</span>
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>prompt <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;解释一下通过 vLLM 实现 P/D 分离的好处。&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 运行推理</span>
</span></span><span style="display:flex;"><span>outputs <span style="color:#f92672">=</span> llm<span style="color:#f92672">.</span>generate([prompt], sampling_params)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;模型输出：&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> output <span style="color:#f92672">in</span> outputs:
</span></span><span style="display:flex;"><span>    print(output<span style="color:#f92672">.</span>outputs[<span style="color:#ae81ff">0</span>]<span style="color:#f92672">.</span>text)
</span></span></code></pre></div><h2 id="验证方式">验证方式</h2>
<p>运行时可以用 <code>nvidia-smi</code> 观察：</p>
<ul>
<li>GPU 0,1 显存几乎恒定，主要承载参数；</li>
<li>GPU 2,3 的显存随请求数量/序列长度波动，主要承载 KV Cache；</li>
<li>如果输入过大，KV Cache 会溢出到 CPU 内存，但仍可继续推理。</li>
</ul>
<h2 id="实际效果与收益">实际效果与收益</h2>
<p>通过 P/D 分离，可以得到以下好处：</p>
<ul>
<li><strong>提升 GPU 利用率</strong>：参数和数据分工明确，避免显存冲突；</li>
<li><strong>支持更大 batch size</strong>：数据显存可扩展，吞吐率提升显著；</li>
<li><strong>降低成本</strong>：参数可驻留在高端 GPU，而数据可放到中低端 GPU 或 CPU 内存，形成分层存储；</li>
<li><strong>灵活性</strong>：适配多种硬件资源组合（A100 + H100, GPU + CPU, GPU + NVMe）。</li>
</ul>
<p>在实践中，结合 vLLM 的 PagedAttention，P/D 分离的效果尤为明显，可让大模型推理在同样硬件下实现 <strong>数倍并发提升</strong>。</p>
<h2 id="总结">总结</h2>
<p>vLLM 框架凭借其高效的 KV Cache 管理和分布式能力，为 <strong>大模型推理的 P/D 分离</strong> 提供了坚实基础。
通过将 <strong>参数（P）</strong> 和 <strong>数据（D）</strong> 解耦，可以更好地利用硬件资源，提升推理性能与扩展性。</p>
<p>未来，随着 <strong>混合精度存储、分层缓存（GPU+CPU+NVMe）</strong> 的发展，P/D 分离架构将逐渐成为大模型推理的主流范式。</p>
]]></content:encoded></item><item><title>玩转大语言模型：使用 SGLang 框架实现大语言模型推理入门教程</title><link>https://wilsonwu.me/zh/blog/2025/getting-started-with-sglang/</link><pubDate>Thu, 10 Jul 2025 00:00:00 -0400</pubDate><guid>https://wilsonwu.me/zh/blog/2025/getting-started-with-sglang/</guid><description>这篇文章带你从零开始，快速上手 SGLang：了解它是什么、为什么快、如何安装与启动、如何用 OpenAI 兼容接口调用，并通过一个完整的 Demo（含流式输出与并发调用）一步步跑通。文章面向刚接触 SGLang 的同学，几分钟内即可看到本地模型在线响应。</description><content:encoded><![CDATA[<p>随着大语言模型热度的升级，企业和个人使用者的研究重心逐步从训练转移至推理（说白了是由造轮子转变为务实的使用）。而在模型推理领域，最炙手可热的两大框架无疑是 vLLM 和 SGLang，而作为后起之秀的 SGLang，其表现也值得大家关注，今天就基于 SGLang 为大家带来一篇入门教程文章，希望能帮助更多希望了解大语言模型及 SGLang 框架的朋友。</p>
<h2 id="sglang-简介">SGLang 简介</h2>
<p>SGLang 是一款面向大语言模型（LLM）和视觉语言模型（VLM）的高性能推理框架，通过精心设计的后端运行时与前端语言协同工作，使模型交互更加高效且可控。其核心优势包括：</p>
<ul>
<li><strong>高效后端运行时</strong>：采用创新的 RadixAttention 技术实现前缀缓存，支持跳跃式受限解码、零开销 CPU 调度、连续批处理、令牌注意力（分页注意力）、张量并行、FlashInfer 内核、分块预填充以及多种量化技术（FP8/INT4/AWQ/GPTQ），显著提升推理效率。</li>
<li><strong>灵活前端语言</strong>：提供直观且强大的 LLM 编程接口，支持链式生成调用、高级提示工程、复杂控制流、多模态输入、并行处理及外部系统交互。</li>
<li><strong>广泛模型兼容性</strong>：支持多种主流生成式模型（Llama、Gemma、Mistral、QWen、DeepSeek、LLaVA 等）、嵌入模型（e5-mistral、gte）及奖励模型（Skywork），并提供简便的新模型扩展机制。</li>
<li><strong>活跃开源生态</strong>：拥有蓬勃发展的社区支持，已获得广泛业界认可（截至 2025 年 3 月 17 日，GitHub 累计星标超过 12,000）。</li>
</ul>
<p>其技术架构如下：</p>
<p><img alt="SGLang 架构" loading="lazy" src="/zh/blog/2025/getting-started-with-sglang/1-sglang-architecture.png"></p>
<p>除此之外，对于初学者，需要了解其以下特性：</p>
<ul>
<li><strong>OpenAI 兼容 API</strong>：直接用 openai Python SDK 或 cURL 调用，不用改你的上层业务代码。</li>
<li><strong>高吞吐与低延迟</strong>：结合连续批处理与前缀缓存等技巧，让相同前缀的请求复用计算。</li>
<li><strong>生产友好</strong>：支持多并发、流式输出、可与 Hugging Face 模型库直接对接。</li>
</ul>
<h2 id="环境准备">环境准备</h2>
<p>工欲善其事必先利其器，要完成本文的新手实验，需准备如下环境：</p>
<ul>
<li>操作系统：建议 Linux（常用为 Ubuntu 20.04+）。WSL2 也可尝试。</li>
<li>Python：建议 3.10 或 3.11。</li>
<li>GPU：建议 NVIDIA 显卡，24GB 显存可跑 7B/8B 级（如 Llama 3.1 8B）。没有 GPU 也能跑小模型或量化模型，但性能有限。</li>
<li>模型来源：Hugging Face（如 meta-llama/Llama-3.1-8B-Instruct）或本地路径。</li>
</ul>
<h2 id="安装-sglang">安装 SGLang</h2>
<p>环境就绪后，使用 pip 安装 SGLang（确保已安装 pip、可选创建虚拟环境）。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>pip install sglang openai huggingface<span style="color:#f92672">-</span>hub
</span></span></code></pre></div><p>如果你需要从 Hugging Face 自动下载私有或受限模型，请先登录或设置 Token：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>huggingface-cli login
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 或</span>
</span></span><span style="display:flex;"><span>export HF_TOKEN<span style="color:#f92672">=</span>您的Token
</span></span></code></pre></div><h2 id="启动-sglang-服务">启动 SGLang 服务</h2>
<p>可以通过以下两种启动方式进行 SGLang 服务的启动。不同版本的 SGLang 命令行参数可能略有差异，如果出现参数名称不匹配，先执行 &ndash;help 查看本机版本支持的参数。</p>
<h3 id="通过-launcher-启动">通过 launcher 启动</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>python -m sglang.launcher <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --model meta-llama/Llama-3.1-8B-Instruct <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --host 0.0.0.0 <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --port <span style="color:#ae81ff">30000</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --tp <span style="color:#ae81ff">1</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --max-model-len <span style="color:#ae81ff">8192</span>
</span></span></code></pre></div><p>其中常用参数说明如下：</p>
<ul>
<li>&ndash;model：Hugging Face 模型名称或本地模型权重路径</li>
<li>&ndash;host/&ndash;port：服务监听地址与端口</li>
<li>&ndash;tp：Tensor Parallel 并行度（单卡设为 1；多卡可根据需要设为 2、4 等）</li>
<li>&ndash;max-model-len：上下文最大长度</li>
</ul>
<p>另外需要注意以下两点：</p>
<ul>
<li>如果使用的是 Hugging Face 模型，首次运行会下载模型权重，请确保网络通畅。</li>
<li>如果显存吃紧，可优先尝试更小模型，或减少 &ndash;max-model-len。</li>
</ul>
<h3 id="通过-sglang-命令启动">通过 sglang 命令启动</h3>
<p>如果您使用的版本提供 sglang serve 命令，也可使用如下命令进行启动：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sglang serve -m meta-llama/Llama-3.1-8B-Instruct --host 0.0.0.0 --port <span style="color:#ae81ff">30000</span>
</span></span></code></pre></div><h2 id="快速验证">快速验证</h2>
<p>服务启动后，OpenAI 兼容接口即可使用：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>curl http://127.0.0.1:30000/v1/chat/completions <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -H <span style="color:#e6db74">&#34;Content-Type: application/json&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -H <span style="color:#e6db74">&#34;Authorization: Bearer EMPTY&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -d <span style="color:#e6db74">&#39;{
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;model&#34;: &#34;meta-llama/Llama-3.1-8B-Instruct&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;messages&#34;: [
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">      {&#34;role&#34;: &#34;system&#34;, &#34;content&#34;: &#34;You are a helpful assistant.&#34;},
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">      {&#34;role&#34;: &#34;user&#34;, &#34;content&#34;: &#34;用两句话介绍一下你自己。&#34;}
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    ],
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;max_tokens&#34;: 128,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;temperature&#34;: 0.2
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">  }&#39;</span>
</span></span></code></pre></div><p>如果运行正常，将返回标准的 ChatCompletion JSON 响应。</p>
<h2 id="使用-python-openai-sdk-进行调用">使用 Python OpenAI SDK 进行调用</h2>
<p>非流式调用（最简单的问答）：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> openai <span style="color:#f92672">import</span> OpenAI
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>client <span style="color:#f92672">=</span> OpenAI(
</span></span><span style="display:flex;"><span>    base_url<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;http://127.0.0.1:30000/v1&#34;</span>,
</span></span><span style="display:flex;"><span>    api_key<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;EMPTY&#34;</span>  <span style="color:#75715e"># 本地服务通常不校验</span>
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>messages <span style="color:#f92672">=</span> [
</span></span><span style="display:flex;"><span>    {<span style="color:#e6db74">&#34;role&#34;</span>: <span style="color:#e6db74">&#34;system&#34;</span>, <span style="color:#e6db74">&#34;content&#34;</span>: <span style="color:#e6db74">&#34;You are a helpful assistant who answers in Chinese.&#34;</span>},
</span></span><span style="display:flex;"><span>    {<span style="color:#e6db74">&#34;role&#34;</span>: <span style="color:#e6db74">&#34;user&#34;</span>, <span style="color:#e6db74">&#34;content&#34;</span>: <span style="color:#e6db74">&#34;请用三句话介绍帕累托最优。&#34;</span>}
</span></span><span style="display:flex;"><span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>resp <span style="color:#f92672">=</span> client<span style="color:#f92672">.</span>chat<span style="color:#f92672">.</span>completions<span style="color:#f92672">.</span>create(
</span></span><span style="display:flex;"><span>    model<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;meta-llama/Llama-3.1-8B-Instruct&#34;</span>,
</span></span><span style="display:flex;"><span>    messages<span style="color:#f92672">=</span>messages,
</span></span><span style="display:flex;"><span>    temperature<span style="color:#f92672">=</span><span style="color:#ae81ff">0.2</span>,
</span></span><span style="display:flex;"><span>    max_tokens<span style="color:#f92672">=</span><span style="color:#ae81ff">256</span>
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(resp<span style="color:#f92672">.</span>choices[<span style="color:#ae81ff">0</span>]<span style="color:#f92672">.</span>message<span style="color:#f92672">.</span>content)
</span></span></code></pre></div><p>流式输出（边生成边打印）：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> openai <span style="color:#f92672">import</span> OpenAI
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>client <span style="color:#f92672">=</span> OpenAI(base_url<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;http://127.0.0.1:30000/v1&#34;</span>, api_key<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;EMPTY&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>messages <span style="color:#f92672">=</span> [
</span></span><span style="display:flex;"><span>    {<span style="color:#e6db74">&#34;role&#34;</span>: <span style="color:#e6db74">&#34;system&#34;</span>, <span style="color:#e6db74">&#34;content&#34;</span>: <span style="color:#e6db74">&#34;You are a helpful assistant that speaks Chinese.&#34;</span>},
</span></span><span style="display:flex;"><span>    {<span style="color:#e6db74">&#34;role&#34;</span>: <span style="color:#e6db74">&#34;user&#34;</span>, <span style="color:#e6db74">&#34;content&#34;</span>: <span style="color:#e6db74">&#34;简述 Transformer 的核心思想，并给出一个现实类比。&#34;</span>}
</span></span><span style="display:flex;"><span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>stream <span style="color:#f92672">=</span> client<span style="color:#f92672">.</span>chat<span style="color:#f92672">.</span>completions<span style="color:#f92672">.</span>create(
</span></span><span style="display:flex;"><span>    model<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;meta-llama/Llama-3.1-8B-Instruct&#34;</span>,
</span></span><span style="display:flex;"><span>    messages<span style="color:#f92672">=</span>messages,
</span></span><span style="display:flex;"><span>    temperature<span style="color:#f92672">=</span><span style="color:#ae81ff">0.2</span>,
</span></span><span style="display:flex;"><span>    max_tokens<span style="color:#f92672">=</span><span style="color:#ae81ff">300</span>,
</span></span><span style="display:flex;"><span>    stream<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> chunk <span style="color:#f92672">in</span> stream:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> chunk<span style="color:#f92672">.</span>choices <span style="color:#f92672">and</span> chunk<span style="color:#f92672">.</span>choices[<span style="color:#ae81ff">0</span>]<span style="color:#f92672">.</span>delta:
</span></span><span style="display:flex;"><span>        delta <span style="color:#f92672">=</span> chunk<span style="color:#f92672">.</span>choices[<span style="color:#ae81ff">0</span>]<span style="color:#f92672">.</span>delta<span style="color:#f92672">.</span>content
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> delta:
</span></span><span style="display:flex;"><span>            print(delta, end<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;&#34;</span>, flush<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">[Done]&#34;</span>)
</span></span></code></pre></div><p>通过以上两种方式，我们可以构建自己的推理服务应用，也可以通过市面上开源的软件来接入您部署的推理服务，如 Open-WebUI 等。</p>
<h2 id="常见问题与排错">常见问题与排错</h2>
<ul>
<li>启动时报显存不足（CUDA OOM）
<ul>
<li>尝试更小的模型（如 7B/8B）、减小 <code>--max-model-len</code>、或降低并发。</li>
<li>如果有多卡，增加 &ndash;tp 并用多卡分摊显存。</li>
</ul>
</li>
<li>拉取模型失败或速度慢
<ul>
<li>先执行 <code>huggingface-cli login</code>；或提前手动把模型权重下载到本地路径，并在 <code>--model</code> 里填本地路径。</li>
</ul>
</li>
<li>API 报 <code>Unknown argument</code>
<ul>
<li>不同版本的命令行参数可能有差异。请运行：<code>python -m sglang.launcher --help</code></li>
<li>根据你安装的版本调整参数名，如 <code>--model</code> / <code>--model-path</code>、<code>--tp</code> / <code>--tensor-parallel-size</code> 等。</li>
</ul>
</li>
<li>Python 客户端 <code>401/Key</code> 错误
<ul>
<li>本地服务通常不校验 Key，只要带上一个占位即可（如 <code>EMPTY</code>）。</li>
</ul>
</li>
<li>流式输出不打印
<ul>
<li>确认传了 <code>stream=True</code>；迭代 chunk 时取 <code>choices[0].delta.content</code>。</li>
</ul>
</li>
<li>并发性能不达预期
<ul>
<li>尝试用 Async 客户端并发请求；避免在单线程里串行等待。</li>
<li>检查 GPU 利用率；确认没有 CPU/GPU 数据传输瓶颈。</li>
</ul>
</li>
</ul>
<h2 id="总结">总结</h2>
<p>至此，你已经完成了：</p>
<ul>
<li>安装与启动 SGLang 服务</li>
<li>用 OpenAI 兼容接口进行非流式与流式推理</li>
</ul>
<p>祝你上手顺利，玩得开心！如果遇到命令行参数或 API 的小差异，参考本地版本的 &ndash;help 与官方文档进行快速适配即可。</p>
]]></content:encoded></item></channel></rss>