<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GPU显存 &#8211; mylogs.cn</title>
	<atom:link href="https://mylogs.cn/tag/gpu%e6%98%be%e5%ad%98/feed/" rel="self" type="application/rss+xml" />
	<link>https://mylogs.cn</link>
	<description>发现、记录、分享</description>
	<lastBuildDate>Fri, 07 Aug 2026 03:11:39 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>显存不够用？vLLM 把 KV 缓存拆成了 16 个词一页</title>
		<link>https://mylogs.cn/vllm-paged-attention-kv-cache-continuous-batching-deep-dive/</link>
					<comments>https://mylogs.cn/vllm-paged-attention-kv-cache-continuous-batching-deep-dive/#respond</comments>
		
		<dc:creator><![CDATA[steve, zhang]]></dc:creator>
		<pubDate>Fri, 07 Aug 2026 03:11:23 +0000</pubDate>
				<category><![CDATA[科技]]></category>
		<category><![CDATA[AI基础设施]]></category>
		<category><![CDATA[GPU显存]]></category>
		<category><![CDATA[KV缓存]]></category>
		<category><![CDATA[PagedAttention]]></category>
		<category><![CDATA[vLLM]]></category>
		<category><![CDATA[大模型推理]]></category>
		<category><![CDATA[开源项目]]></category>
		<guid isPermaLink="false">https://mylogs.cn/vllm-paged-attention-kv-cache-continuous-batching-deep-dive/</guid>

					<description><![CDATA[同样一张显卡，同样一个模型，换个推理引擎，能同时服务的用户数可以差出好几倍。差距不在模型，而在显存怎么管、请求 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">同样一张显卡，同样一个模型，换个推理引擎，能同时服务的用户数可以差出好几倍。差距不在模型，而在显存怎么管、请求怎么排。开发者 Aleksa Gordić 近日发布了一篇 vLLM 源码级拆解长文，以 2025 年 8 月 9 日的 42172ad 提交为准，完整梳理了这套高吞吐推理引擎的内部结构。</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a756e0569ad1&quot;}" data-wp-interactive="core/image" data-wp-key="6a756e0569ad1" class="wp-block-image size-large aligncenter wp-lightbox-container"><img fetchpriority="high" decoding="async" width="1200" height="600" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://mylogs.cn/wp-content/uploads/2026/08/443dd0f2bebc45554645be58e62e6eb3_header.webp" alt="显存不够用？vLLM 把 KV 缓存拆成了 16 个词一页" class="wp-image-3913" style="max-width:100%;height:auto;" srcset="https://mylogs.cn/wp-content/uploads/2026/08/443dd0f2bebc45554645be58e62e6eb3_header.webp 1200w, https://mylogs.cn/wp-content/uploads/2026/08/443dd0f2bebc45554645be58e62e6eb3_header-300x150.webp 300w, https://mylogs.cn/wp-content/uploads/2026/08/443dd0f2bebc45554645be58e62e6eb3_header-1024x512.webp 1024w, https://mylogs.cn/wp-content/uploads/2026/08/443dd0f2bebc45554645be58e62e6eb3_header-768x384.webp 768w" sizes="(max-width: 1200px) 100vw, 1200px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">图片来源：GitHub / vLLM 项目页</figcaption></figure>





<p class="wp-block-paragraph">vLLM 由加州大学伯克利分校团队于 2023 年开源，采用 Apache 2.0 协议，目前已是开源大模型私有化部署事实上的主流选择，被大量云平台和推理服务商集成。它的核心思路，是把操作系统管内存的老办法搬到了 GPU 上。</p>



<h2 class="wp-block-heading">把显存当成分页内存来管</h2>



<p class="wp-block-paragraph">传统推理框架给每个请求预留一整段连续显存，按最大可能长度分配。一个请求只生成了 100 个词，却按 4096 个词的规格占着位置，浪费极其可观。</p>



<p class="wp-block-paragraph">vLLM 的做法是分页。KV 缓存（模型生成时缓存的键值向量，避免重复计算）被切成固定大小的块，默认每块存 16 个 token。每个请求维护一张块表，把逻辑上连续的缓存映射到物理上零散的显存页。单块占用的字节数按「2（键和值）× 块大小 × KV 注意力头数 × 头维度 × 数据类型字节数」计算，块池规模常常达到数十万块。</p>



<p class="wp-block-paragraph">调度器的核心数据结构就是这个空闲块队列。每来一批新词，<code>allocate_slots</code> 先算需要几块——比如预填充阶段有 17 个新词，就是向上取整 17÷16 等于 2 块；池子不够时，引擎会抢占低优先级请求，把它们已占用的块归还池中。</p>



<h2 class="wp-block-heading">预填充和解码，是两种完全不同的活</h2>



<p class="wp-block-paragraph">引擎面对的负载分两类：预填充是对整段提示词做一次前向计算，属于计算密集型；解码只处理最新一个词，但仍要把整个模型权重和缓存读一遍，属于显存带宽密集型。</p>



<p class="wp-block-paragraph">老版本 V0 引擎一个步骤内只能二选一，新版 V1 调度器可以把两类请求混在同一步里跑。调度顺序上，已在运行队列中的解码请求优先，剩余的词预算再分给等待队列里的预填充请求。调度策略支持先来先服务和按优先级两种。</p>



<p class="wp-block-paragraph">前向计算时，所有序列被拍平拼接成一条「超级序列」，靠位置索引和注意力掩码保证各自只看自己的内容。这样就不需要右侧补齐，也就天然支持连续批处理——完成一个请求立刻释放资源补进新请求，GPU 不必等最慢的那条跑完。</p>



<h2 class="wp-block-heading">四个让长请求不拖后腿的设计</h2>



<p class="wp-block-paragraph"><strong>分块预填充</strong>：把超长提示词的预填充切成小段，避免一个长请求独占一个引擎步骤，把其他请求的延迟全部拉高。参数上表现为给 <code>long_prefill_token_threshold</code> 设一个正整数。</p>



<p class="wp-block-paragraph"><strong>前缀缓存</strong>：多轮对话中系统提示词和历史消息是重复的，相同前缀的缓存块可以在请求之间共享，不必重算。</p>



<p class="wp-block-paragraph"><strong>引导解码</strong>：用语法约束的有限状态机限制采样范围，让输出严格符合指定格式。</p>



<p class="wp-block-paragraph"><strong>投机解码与 PD 分离</strong>：前者用小模型先猜若干个词再由大模型批量验证，后者把预填充和解码拆到不同资源上执行。</p>



<h2 class="wp-block-heading">启动时那几秒都在干什么</h2>



<p class="wp-block-paragraph">引擎构造阶段，工作进程会依次完成三件事：分配 CUDA 设备并按 <code>gpu_memory_utilization</code>（例如设为 0.8 即占用八成显存）核对余量、加载模型权重并切换到推理模式、初始化 KV 缓存。</p>



<p class="wp-block-paragraph">最后一步会先跑一次空转前向计算，对显存拍个快照，据此反推能塞下多少个缓存块。除非显式指定 <code>--enforce-eager</code>，引擎还会针对若干预热批量大小捕获 CUDA Graph，把整串 GPU 操作录成一张有向无环图，后续直接回放，省下逐个启动内核的开销。</p>



<p class="wp-block-paragraph">这些机制叠加起来，才是「同一张卡多扛几倍请求」的真正来源。对于正在做私有化部署、纠结要不要加卡的团队，先把引擎参数调明白，往往比直接采购更划算。</p>



<p class="has-small-font-size wp-block-paragraph">来源：Aleksa Gordić 技术博客《Inside vLLM: Anatomy of a High-Throughput LLM Inference System》、vLLM 开源项目</p>

]]></content:encoded>
					
					<wfw:commentRss>https://mylogs.cn/vllm-paged-attention-kv-cache-continuous-batching-deep-dive/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
