存储评论网

高效处理长上下文推理:将键值缓存卸载到闪存

AI  ◇  企业版

企业级人工智能基础设施已从优化训练模型转向服务于这些模型,这改变了其经济模式。训练是一项有终点的资本项目。推理则是一项生产性工作负载,只要服务在线就会运行,其产出以代币(token)衡量。这就是人工智能运营商目前面临的代币经济学问题:一旦GPU安装完毕,电力预算设定完成,业务就取决于硬件产生的代币数量。

在长时间、多轮的工作负载中,随着对话次数的增加,相同的上下文会反复经过模型。GPU 已经为处理这些令牌付费一次,但当键值缓存被清空时,系统必须再次预填充该上下文。这会导致系统重复计算。无论规模大小,这都不是可以忽略不计的误差。这实际上是以电力、GPU 时间、队列增长或额外硬件的形式返还给用户的额外成本。

kv缓存卸载戴尔xe7740

最直接的解决方法是购买更多机架上最昂贵的资源:更多的GPU,更多的DRAM。但重计算已经产生了一些可重用的东西。键值缓存只是数据;它可以低成本地存储和检索,只需付出少量的重新加载成本,就能避免昂贵的预填充计算。因此,问题不在于是否保留缓存,而在于将其放在哪里,这既是一个成本问题,也是一个性能问题。显存(VRAM)是速度最快的层级,也是最稀缺的;一旦饱和,推理服务器就会开始淘汰缓存。DRAM可以提供额外的性能空间,但价格高昂且快速上涨。闪存则可能带来不同的结果:速度肯定比DRAM慢,但每TB的价格要低得多,而且容量足够大,可以保存速度更快的层级被迫丢弃的上下文信息,这决定了是重新处理整个对话还是简单地将其读回。

为了衡量其影响,我们在一台戴尔 PowerEdge XE7740 服务器上构建了一个多轮代理测试工作负载,并保持模型、GPU 和服务堆栈不变。对于任何需要进行系统规模调整的人来说,真正重要的是内存层填满之后的情况。超过这个点后,闪存每秒可处理约 30,000 个总令牌,而 DRAM 则为 17,000 个,闪存保持了自身峰值容量的 94%,而 DRAM 层则下降到 42%。两个卸载层在峰值时都大幅超越了仅使用 VRAM 的基准(DRAM 为 2.9 倍,闪存为 2.2 倍),但峰值恰好是 DRAM 层即将耗尽的临界点。最昂贵的内存用于应对峰值;而闪存则在上下文不断增长的情况下保持性能。

在深入探讨结果之前,有必要明确 KV 缓存是什么,为什么它会被填满,以及为什么当系统没有更便宜的地方来保存它时,推理性能会开始崩溃。

关键精华

  • 闪存能够承载DRAM无法承载的内容: 三种配置在内存压力迫使内存驱逐之前性能完全相同。显存首先饱和,512GB DRAM 层在运行约 45 分钟后填满并开始驱逐。此后,闪存每秒可维持约 30,000 个令牌,而 DRAM 为 17,000 个,闪存仍能保持其峰值容量的 94%,而 DRAM 则降至 42%。
  • 卸载操作可以恢复因重新计算而损失的吞吐量: 在峰值情况下,KV缓存卸载使DRAM层的总服务吞吐量比仅使用VRAM的基准提高了2.9倍,闪存层提高了2.2倍。性能提升源于跳过了重新预填充,因为GPU已计算的上下文信息直接从卸载层读取,而无需重新构建。
  • 老用户感受到的变化最大: 在仅使用显存的基准测试中,恢复会话时最坏情况下的首令牌延迟为 13.9 秒,而使用闪存的基准测试中该延迟仅为 3.2 秒。卸载机制使得延迟时间控制在交互式用户可接受的范围内。
  • 代理流量使驱逐成本高昂: 一周的 Claude Code 流量检测结果显示,98.16% 为缓存读取,只有 0.02% 为真正的冷输入。
  • KV卸载是一种写入密集型工作负载,需要高耐久性硬盘: 该模型生成的每个令牌都会写入一个键值对 (KV) 条目,TTL 的频繁更新会持续不断地重写该层级。在我们持续的写入速率下,我们测试的镜像 RAID10 阵列每块硬盘每天大约需要写入 3.2 次,而条带化为 RAID0 时则降至每天大约 1.6 次写入,与 D7-PS1030 的 3 次写入额定值相近。闪存层级的决定性限制因素是耐用性,而非容量或速度,而且由于缓存是可消耗的,因此对一块以写入为主的硬盘进行如此高强度的使用是可以接受的。

推理是如何运作的

大型语言模型是自回归的:每个输出词元都以其之前的每个词元为条件。注意力机制通过计算序列中每个词元的查询向量 (Q) 来实现这种条件化,该查询向量与之前每个词元的键向量 (K) 和值向量 (V) 进行匹配。注意力机制的输出是这些值的加权组合,权重来自 QK 点积。

当请求到达时,只有当请求中的每个词元都存在 K 和 V 张量时,才能响应该提示。第一步是预填充:引擎通过模型单次并行处理该提示,并将生成的 K 和 V 张量写入内存。因此,预填充受计算资源限制,其延迟随提示长度的增加而增加。

预填充完成后,引擎会逐个输出响应词元。每个新词元都会读取之前所有词元的 K 和 V 值,计算自身的注意力输出,并将自身的 K 和 V 值写入内存以供下一步使用。第二阶段是解码阶段。由于生成每个词元都需要从内存中加载之前所有词元的缓存 K 和 V 张量,并基于这些张量计算注意力,然后才能将新词元的 K 和 V 张量写入内存以供后续步骤使用,因此该阶段是顺序执行且受限于内存带宽的。

两个阶段的 K 和 V 张量构成了 KV 缓存。如果没有它们,生成第 n+1 个 token 时,每一步都需要重新计算之前所有 n 个 token 的键和值,计算复杂度为二次方级。有了缓存,每个新 token 只需计算自身的 K 和 V,其余信息从内存读取,因此每个 token 的计算成本保持线性。

代理流量是什么样子的

人们通常将推理描述为受限于内存带宽,因为解码占据了响应中用户可见的部分。这两个阶段之间的实际平衡取决于工作负载。一个要求撰写长篇论文的简短提示会消耗大量解码资源;一个要求进行少量 JSON 编辑的冗长提示则会消耗大量预填充资源。哪一方占主导地位决定了缓存管理不善时哪些部分会承受压力。

重新计算问题的形状取决于这种平衡,“代理”涵盖了广泛的使用模式。代理编码是目前最流行的模式之一,在OpenRouter 排行榜上,它占用了相当大比例的令牌。为了量化一个典型案例,我们使用 OpenTelemetry (OTEL) 日志记录功能对 Claude Code 进行了插桩,并将一周的跟踪数据导出到 Grafana。以下显示了按类型划分的令牌流量。注意:此 Claude Code 使用情况基于 Claude Opus 4.8 模型,上下文长度为 1M,同时处理多个编码项目。

缓存读取占所有令牌流量的 98.16%。缓存创建(由于条目过期而重新预填充先前已存在的前缀)占 1.52%。输出令牌占 0.30%。真正的冷输入令牌占 0.02%。

在98%流量为​​缓存读取的工作负载中,如果不进行卸载就进行驱逐,意味着系统需要重新预填充大部分原本要执行的工作。瓶颈从解码带宽(通常是优化的阶段)转移到了预填充计算,而GPU已经在之前的轮次中完成了这些计算。事实上,出于同样的原因,在规模化部署中,分离式服务架构运行的预填充工作进程数量多于解码工作进程的情况非常普遍:预填充是关键的门控阶段。

98% 这个数字代表的是一位用户的流量构成。短回合聊天的工作负载会显示出更多冷流量。如果系统采用检索增强技术,每次对话都重新注入不同的文档,也会出现这种情况。只要对话时间较长、前缀稳定且用户不断返回到相同的上下文,这种总体趋势就成立。

藏宝点在哪里,以及装满后会发生什么

这个缓存实际存放在哪里?空间不足时会发生什么?模型权重加载完毕后,剩余的显存 (VRAM) 会变成键值缓存空间,并被划分成固定大小的块。引擎启动时会告知你它能容纳多少个令牌。在没有键值卸载 (KV Offloading) 的标准配置中,这个缓存池是缓存唯一可以存放的地方。

GPU 服务器成本高昂,而令牌是其产品,因此目标是确保服务器全天候运行。这意味着要让 GPU 始终保持负载,并维护一个小型请求队列,以避免计算资源闲置,同时还要平衡队列,使响应延迟保持在服务级别目标 (SLO) 范围内。并非每个请求都会占用其完整的上下文窗口,因此许多已完成的键值对 (KV) 会自行缓存在显存 (VRAM) 中。但在持续高负载下,缓存会逐渐填满,一旦填满,较旧的条目就会被清除以腾出空间。

理想情况下,每个答案只需一次就能完成。但目前的模型还不够完善,所以我们运行代理循环,在用户之间或代理之间来回交互。当下一轮对话到来时,如果其键值尚未缓存,引擎会重新处理之前的所有对话内容,包括新的词元。每个先前对话的上下文都会再次输入模型,GPU 之前对这些词元进行的计算会在每个后续对话中重复进行。这部分计算纯粹是浪费。

KV缓存卸载有哪些变化

卸载机制并非在显存填满时立即驱逐缓存,而是逐步向下层级地溢出缓存:从显存到系统内存再到固态硬盘。热工作集保留在显存中;不再适合的条目被推送到系统内存,如果系统内存也满了,则会再次推送到固态硬盘或网络存储层。真正的缓存驱逐变得很少发生,而是由用户设置的生存时间(TTL)驱动,而不是由内存压力驱动。

当下一回合开始时,我们不再重新计算数万个上下文标记,而是从内存或闪存中恢复键值对 (KV)。从系统内存重新加载会带来少量延迟,但比重新预填充要便宜得多,速度也快得多。从 NVMe 重新加载比从 DRAM 读取稍慢,但仍然比它所替代的重新计算快得多。存储容量相对便宜;GPU 计算则不然,因此,在回合开始时牺牲一点重新加载的延迟来避免数秒的重新计算是完全值得的。

我们如何测试

我们在实验室对此进行了测试。系统配置如下:

  • 服务器:戴尔 PowerEdge XE7740
  • GPU:4块NVIDIA RTX PRO 6000 Blackwell Server Edition(96GB)
  • 系统内存:1TB DDR5(16 x 64GB 5200MT/s DDR5)
  • 存储:8块Solidigm PS1030 12.8TB E3.S硬盘(RAID10)
  • 服务堆栈:vLLM 0.22.0,LMCache 0.5.0
  • 型号:MiniMax-M2.7

测试平台完美契合此工作负载。戴尔 PowerEdge XE7740 专为企业级 AI 推理而设计,采用 PCIe Gen5 机箱,最多可支持 8 个双宽 GPU。我们运行的四 GPU 配置是目前最畅销的配置之一。它为各种推理部署提供了足够的加速容量,同时在同一机箱内预留了扩展空间,可随着需求增长扩展至八个 GPU。每块 NVIDIA RTX PRO 6000 Blackwell 服务器版显卡均配备 96GB GDDR7 显存,因此四块显卡在 GPU 缓存离开之前即可提供充足的显存。底层卸载层采用八块 12.8TB Solidigm D7-PS1030 固态硬盘组成 RAID 10 阵列,Gen5 高耐久性闪存非常适合 KV 缓存层产生的持续写入操作。最后,我们选择的 MiniMax-M2.7 型号在测试时是符合我们四 GPU 配置要求的顶级开源型号之一。

kv缓存卸载solidigm 1030固态硬盘

我们测试了三种配置:

  1. VRAM 基准,标准 vLLM,无卸载,其中任何能放入 VRAM 的内容都会被缓存,其余内容都会被驱逐。
  2. 将 LMCache 卸载到系统内存,分配 512GB 用于卸载。
  3. 将 LMCache 卸载到闪存,以本地 RAID10 NVMe 阵列作为卸载层,前端配备 64GB RAM 暂存缓冲区。

我们基于真实的智能体编码流量而非固定的合成前缀扫描来模拟工作负载。这种流量预填充量大而解码量小,并且前缀重用率很高。会话以泊松过程到达,速率为每分钟 λ = 2.5 个会话。每个会话运行多个回合。在每个回合中,模型接收一个简短的追加数据,通常是 250 到 600 个词元的工具或命令结果,偶尔会读取一个 1,500 到 3,500 个词元的文件。它回复一个简短的响应,通常是 40 到 200 个词元的工具调用或简要推理,偶尔会返回一个 400 到 900 个词元的代码块。回合长度的抖动为 ±100 个词元。会话单调增长,最终达到 64k 个词元的上下文上限,这使其进入深度上下文状态,此时工作集会超出显存容量。所有三个层级都使用相同的初始负载,每个层级都有 3 分钟的缓存预热时间。

关于内存配置的简要说明:出厂的 XE7740 配备了 2TB 的 DDR5 内存,这是一款顶级配置,旨在满足各种项目的需求。当时的定价是在 2026 年内存价格上涨之前,因此 2026 年之后,如此大容量的 DRAM 内存将成为一项非常昂贵的单品。相对于如今企业订购四块 GPU 的配置而言,原有的配置过于高端。为了使其更贴近实际需求,我们移除了 1TB 的内存,每个通道保留一根 DIMM 内存条,以保持最大的内存吞吐量。

关于闪存层的一项方法论说明:运行中使用了 LMCache 的本地磁盘后端,并在阵列前端配备了所需的 64GB RAM 暂存缓冲区。在运行过程中,闪存上保留的键值对占用空间远远超过了主机的总 DRAM 容量,因此持续的结果反映的是驱动器服务而非主机内存的使用情况。

性能

负载下的吞吐量

随着 KV 工作集增长超过每一层所能容纳的范围,运行期间的总服务吞吐量会发生变化:


在缓存仍在填充的前 10 分钟,所有层级的性能同步提升,基本没有差别。之后,随着内存层级逐渐填满,它们开始各自独立运行。仅使用显存的基准测试首先出现瓶颈:一旦显存饱和,其性能便稳定在每秒 12,000 个令牌左右。每个新会话都会取代一个旧会话,被取代的缓存必须在会话返回时从头开始重建,因此每秒更多的时间用于重新预填充,而用于解码的时间则相应减少。

DRAM 和 SSD 层级的性能持续攀升,远远超过瓶颈期,因为在缓存填满之前,它们几乎直接从内存或磁盘提供每个前缀,而无需重新计算。基线层级用于重新预填充的时间则用于生成新的令牌。

在峰值时,卸载功能在 DRAM 层实现了基准总服务吞吐量的 2.9 倍(+188%),在闪存层实现了 2.2 倍(+122%)。在工作集超出 VRAM 容量之前,三种配置的性能差距都在百分之一以内。由于没有内存被驱逐,因此卸载功能无需进行任何恢复操作。只有当内存压力迫使内存被驱逐时,卸载功能才能发挥作用,并且其优势会随着服务器负载的增加而增强。

当DRAM缓存填满时,更大容量的缓存层就显得尤为重要。在这种负载下,512GB的RAM缓存大约在运行45分钟后达到饱和,之后便开始进行缓存驱逐。返回的前缀数据会丢失并被重新预填充,而这正是缓存原本旨在避免的重复计算。SSD层拥有TB级的容量,因此不会遇到这种瓶颈。超过这个临界点后,闪存每秒可处理约30,000个令牌,而DRAM则约为17,000个,这意味着在RAM耗尽后,SSD的吞吐量优势高达75%。换句话说,在达到饱和后,DRAM层仅能提供其峰值吞吐量的42%,而SSD层则能提供其峰值吞吐量的94%。整个过程都遵循这样的容量阶梯:VRAM 首先耗尽,512 GB DRAM 层稍后耗尽,而以 TB 而不是 GB 衡量的存储层实际上永远不会耗尽,因此即使在速度更快的存储层不得不开始丢弃数据之后,它仍然可以继续提供上下文信息。

解读总吞吐量数据时需要注意一点:它报告的每秒数万个令牌并非GPU计算令牌的速率;很大程度上,这是卸载层的处理速率。总吞吐量统计的是每个请求携带的每个输入预填充令牌和每个输出解码令牌。但由于缓存的存在,命中时会从DRAM或闪存中重新加载前缀的键值,而不是在GPU上重新预填充。

将计数范围限定为输出令牌(即用户实际等待的吞吐量部分),可以更清晰地反映情况:

在输出令牌时,三个层级在缓存填充期间再次保持同步,然后在交叉点处开始分离。DRAM 层级的峰值接近每秒 300 个令牌,比基线提高了 75%,之后随着缓存开始被驱逐而回落;闪存层级在剩余的运行时间内保持在每秒 250 个令牌左右,比基线提高了 46%。RAM 和 SSD 层级的峰值保持在彼此 10% 左右的范围内,直到 DRAM 达到饱和;之后,两者之间的差距开始扩大。

首令牌延迟:用户等待的是什么

吞吐量衡量的是代币的总体产量。首代币获取时间衡量的是单个用户所感受到的等待时间:从点击发送按钮到收到第一个代币所需的时间。我们绘制了运行期间的中位数,并随着工作集的增长和每个层级的填充而进行分析。

在缓存保持稳定期间,三个层级都能在大约半秒内返回第一个令牌。之后,它们的性能开始出现差异,其差异顺序与吞吐量的变化顺序相同。基准层率先出现问题:在运行初期,其延迟就超过了 10 秒,而 DRAM 层则在更长时间内保持 TTFT 低于 1 秒,直到其 512 GB 的容量在大约 45 分钟时被填满。随后,随着 DRAM 层开始驱逐缓存并重新计算,其延迟急剧下降。SSD 层的延迟下降最为平缓,并在运行的后半段始终保持最低值。


这种转变就是分层存储论点的缩影。DRAM 在工作集位于该层级时是延迟方面的优势者;一旦工作集不再位于该层级,闪存就成为延迟方面的优势者,因为它仍然保存着 DRAM 层级已经开始丢弃的上下文信息。

回访用户问题

上述延迟数据涵盖了连续会话中的回合。用户返回的情况则有所不同:会话在对话过程中暂停,闲置约 15 分钟后,再从中断处继续。我们用一个用户群体来模拟这种情况,该群体在大约 20 回合后进入休眠状态,并在 15 分钟后被唤醒,这段时间足以让繁忙的服务器在其缓存中循环处理其他流量。在每个层级的测量窗口内,都发生了 11 次这样的唤醒。由于各层级的工作负载完全相同,因此每次运行中唤醒的都是相同的 11 个会话,从而可以对恢复回合进行直接比较。下图绘制了每个层级在正常回合中首次令牌时间的中位数与恢复回合的中位数,须线标记了样本中最差的恢复回合。

中位数的数据证实了机制的预测,各层级的顺序也符合预期。DRAM 性能领先:休眠会话恢复仅需 0.6 秒,略高于正常会话恢复所需的 0.5 秒。SSD 位居第二,耗时 0.8 秒;我们知道 NVMe 读取速度比 DRAM 读取速度慢,这也是性能差异的原因之一。仅使用 VRAM 的基准测试速度最慢,耗时 1.4 秒;由于没有可供卸载的数据,空闲会话的前缀信息被从 GPU 内存中移除,用于处理实时流量,因此第一次恢复会话时需要重新计算该前缀信息。最佳情况下,所有性能之间的差异也仅约为一秒。

最佳情况并非做出选择的情况。每个层级中 11 次重启的最差情况分别为:DRAM 上 0.8 秒,SSD 上 3.2 秒,基准层级 13.9 秒。等待第一个令牌 14 秒是否可以接受,或者是否构成严重的 SLO 违规,取决于具体服务。但对于任何交互式服务而言,答案都是后者,只有卸载层级才能将延迟控制在用户可接受的范围内。此外,随着上下文的扩展,情况也会发生变化,因为重新计算的成本会随着返回用户积累的历史数据而增加:在吞吐量测试的更深层次上下文中,基准层级的延迟会远远超过 14 秒,而 DRAM 和 SSD 的重新加载时间仍然在可控范围内。

选择和调整 KV 缓存的大小

两种卸载方案的性能都远超仅使用显存的基准方案,而且两者的性能差距很小。差距之所以小,是因为吞吐量的提升仅仅来自于释放显存,而无论被驱逐的缓存最终位于DRAM还是SSD上,释放的显存量都相同。吞吐量并不关心缓存来自哪个层级。延迟则取决于此,因为DRAM读取速度比NVMe读取速度更快,但与从头开始重新计算相同的键值相比,这两种方法的成本都很低。

这两种方案的选择需要在服务速度优化 (SLO) 和成本之间进行权衡,具体取决于运营商的优化目标。将所有卸载的缓存都放在 RAM 中可以获得最佳延迟,但相比闪存,延迟提升相对较小,而资本支出却很高。分层存储则是一种折衷方案:较小的 RAM 层用于吸收对延迟要求较高的流量,而其后方的存储层则用于存放那些无需在几百毫秒内返回的较长尾缓存。

另一种理解键值缓存的方式是根据其大小。存储层的大小取决于系统能够维持的最大令牌吞吐量。系统需要保留的键值缓存空间等于吞吐量乘以缓存条目的生存时间 (TTL)。每个生成的令牌都会写入一个键值缓存条目,因此计算方法就是令牌到达速率乘以它们的保留时间。生产环境中的两个默认 TTL 值分别为 5 分钟和 1 小时。

让我们计算一下本文测试的 FP8 模式下 MiniMax-M2.7 的 KV 缓存大小。假设每个 KV 元素占用一个字节,则每个 token 的 KV 缓存大小为 2 × 62 × 8 × 128 字节,约合 124 KiB。这适用于任何分组查询注意力转换器:每个 token 的 KV 缓存大小为层数 × KV 头数 × 头维度 × 2(K 和 V 均为 2)× 数据类型字节数,因此层数或 KV 头数越多,每个 token 的写入量就越大。在本文测试的中等运行点(RAM 层每秒处理约 4,200 个 token),一小时的缓存保留时间大约会产生 1500 万个 token,按每个 token 124 KiB 计算,大约需要 1.8 TB。这需要大量的 DRAM,从而增加构建成本。

考虑到这一点,SLO 要求和预算决定了缓存层级的选择。如果 SLO 足够宽松,使得 SSD 层级的重载延迟在其范围内,那么第二层 KV 缓存就可以完全部署在存储设备上,前面只需连接所需的少量 RAM 暂存缓冲区即可。存储成本并不高:在我们所有的测试中,KV 缓存的峰值写入速度在中等工作点下为 4.1 GB/s,读取速度为 1.1 GB/s,而 fio 测得的峰值速度约为 114 GB/s。我们使用的 RAID10 阵列的带宽还有大约 28 倍的余量,因此即使 XE7740 扩展到全部八个 GPU 并承担更多并发负载,闪存也不会成为瓶颈。正是这种带宽余量使得运营商可以根据容量而非速度来配置缓存层级。每增加 1 TB 的 D7-PS1030 都会延长 TTL 和系统驻留的工作集,更大的驻留缓存意味着可以避免更多的重新计算,并提供更多的令牌。

耐久性是定义此层级的限制因素。KV卸载缓存的写入密集度非常高:模型生成的每个令牌都会写入一个KV条目,TTL的频繁更新会持续不断地重写该层级,因此硬盘实际上从未停止过写入操作。在我们测试的八盘阵列中,持续写入速度为1.9GB/s。在我们测试的RAID10布局下,镜像操作使介质的写入量翻倍,这意味着每块12.8TB硬盘每天大约需要写入3.2次,略高于D7-PS1030的3 DWPD持续写入速率。对于主存储而言,这样的写入速率是不合格的,但在此情况下是可以接受的。缓存本身就是一次性的,磨损硬盘的故障模式是重新计算,而不是数据丢失。对于某些用户来说,RAID0或许更适合此层级,它将数据条带化分布在所有八块硬盘上,从而避免重复写入,并将介质写入速率降低到约1.6 DWPD,完全符合额定值。无论如何,结论是:这种工作负载消耗的耐久性比机箱中的任何其他工作负载都快,专用高耐久性硬盘的容量只有该级别所需容量的一小部分,正是这种组合使得像 PS1030 这样的以写入为中心的大容量硬盘成为正确的选择。

每美元代币

性能部分表明,闪存能够保持大部分吞吐量,并且能够维持DRAM在工作集超出内存容量后无法达到的首令牌延迟。而真正具有商业意义的是存储层的成本。解决重复计算问题的简单方法是在系统中增加昂贵的DRAM;只有当存储层的单位容量成本显著降低时,卸载策略才有效。

最明显的差距在于容量,而非价格。512GB DRAM 卸载层已经填满并开始进行数据驱逐;而以 TB 为单位衡量的闪存层则没有。任何实际的 DRAM 预算都无法在 GPU 旁边部署数十 TB 的 KV 缓存,因此,超过一定上下文长度后,选择不再是高速 DRAM 与闪存之间的权衡,而是闪存与丢弃上下文之间的权衡——而丢弃上下文正是导致吞吐量和延迟损失的根本原因。

在价格方面,企业级闪存的每TB价格长期以来都远低于DRAM,这种结构性差距源于NAND的多层3D堆叠单元与DRAM的单晶体管单电容设计之间的差异。2026年的内存短缺危机导致两者价格均大幅上涨,而且NAND合约价格的上涨速度至少与DRAM一样快,因此并非闪存价格下降而DRAM价格飙升的情况。即便在当前高企的价格水平下,每TB的差距依然存在,闪存仍然是唯一能够以符合服务预算的价格提供TB级缓存容量的存储介质。

吞吐量和成本的平衡点相同。在闪存性能超越DRAM的临界点,其每秒可处理的令牌数量超过了DRAM层,而非更少。因此,闪存并非以吞吐量换取容量,而是以更低的每TB成本在存储介质上实现了更高的吞吐量。从每秒每美元的令牌数量来看,闪存的优势非常显著,而且随着需要保留的上下文时间的延长,这种优势会进一步扩大,因为DRAM的容量上限正是闪存的上限。

只要工作集适合,DRAM 仍然是合适的存储层,连接器所需的薄 RAM 暂存缓冲区仍然位于闪存之前。但是,增加 GPU 或更多 DRAM 会增加每 TB 的成本,以购买工作负载所需的峰值性能,直到缓存填满为止。将数据卸载或分层存储到闪存可以保留大部分性能,同时无限期地保持上下文信息,并且每 TB 的成本也更经济实惠。然而,最终的决定取决于运营商正在优化的工作负载的 SLO 要求。

结语

对于推理工作负载而言,令牌经济模型是关键所在。令牌是产品,而重新计算则是一种浪费:GPU 已经生成过一次上下文,现在却要重新构建。代理服务面临的风险最大,因为我们对 Claude Code 流量进行了一周的监控,结果显示 98.16% 的令牌都是缓存读取,而 GPU 已经计算过这些上下文,否则每次驱逐都会重新构建。键值缓存卸载将原本用于重建历史记录的预填充计算转化为新的令牌。在 XE7740 上,在模型、GPU 和引擎配置保持不变的情况下,重负载下总服务吞吐量最高可达仅使用 VRAM 基准的 2.9 倍。当 DRAM 层被填满并回退时,闪存以 DRAM 无法比拟的容量保持了吞吐量。

但这并不意味着DRAM就完全没用了。对于短时、突发性工作负载,例如会话打开、短暂运行并在缓存超出内存容量之前关闭,DRAM是合适的存储层,而键值缓存卸载带来的性能提升微乎其微。工作集大小合适,延迟也达到了最佳水平,而且无需进行任何缓存驱逐操作。

但我们认为这种场景属于例外,在这种情况下,仅需一层 DRAM 内存就足够了。如今,大多数生产环境中的推理任务运行时间长且持续不断:多轮代理、大型上下文、稳定的并发性以及用户返回同一会话。在这种情况下,工作集会超出运营商能够配置的任何内存层,缓存会被清除,GPU 会被重新启用,用于重建之前生成的上下文。这是一种代价高昂的故障模式,而且很常见。

对于这些工作负载而言,将键值缓存卸载到闪存上可以从两方面获益。首先,它能让GPU持续生成新令牌,而不是重复计算旧令牌(这正是本次评估所衡量的令牌经济效率);其次,它将实现这一目标所需的容量部署在系统中最具成本效益的持久层级上。在配置清单上,最重要的影响在于它节省了多少资源:采用闪存作为缓存的服务器可以大幅减少DRAM的配置,而考虑到2026年内存的价格,这将是报价中最大的节省之一。令牌是最终产品,对于目前主导服务器服务的长上下文工作负载而言,令牌高效的路径就是避免重复生成相同令牌的路径,而这条路径正是通过闪存实现的。

Solidigm 人工智能固态硬盘存储

本报告由 Solidigm 赞助。 本报告中表达的所有观点和意见均基于我们对所考虑产品的公正看法。

参与 StorageReview

电子报| YouTube | 播客iTunes / Spotify | Instagram | Twitter | TikTok | RSS订阅

迪维扬什·贾恩

机器学习工程师,家庭实验室爱好者和技术发烧友。在 StorageReview,我负责人工智能和新兴工作负载的测试,提供洞察分析和性能分析。