数据中心/云端

如何使用 NVIDIA Dynamo 减少 KV 缓存瓶颈

随着 AI 模型变得更大、更复杂,推理,即模型生成响应的过程,正成为一项重大挑战。像 GPT-OSS 和 DeepSeek-R1 这样的大语言模型(LLM)严重依赖注意力数据(KV 缓存)来理解输入提示并进行上下文化,但高效管理这些数据正变得愈发困难。

本文将探讨如何在推理过程中将 KV 缓存卸载至成本效益更高的存储中,从而降低推理成本并提升用户体验。同时,本文还将阐述 NVIDIA Dynamo 的最新优化如何实现这一目标。

什么是 KV 缓存?

KV 缓存是在推理初始阶段创建的 LLM 注意力机制的核心数据结构,该阶段称为预填充。KV 缓存用于存储中间注意力数据,有助于模型在生成或响应阶段聚焦于输入中最为相关的部分。

然而,KV 缓存会随着提示长度呈线性增长,并且在生成过程中必须驻留在 GPU 显存中以实现快速访问。随着模型上下文窗口的不断扩展,有时甚至达到数百万个 token,KV 缓存便成为了一个严重的瓶颈。

为什么 KV 缓存是 LLM 推理的瓶颈?

GPU 显存有限且成本高昂。随着提示长度的增加,KV 缓存也会不断增大,在生成过程中需要占用更多内存。在多轮对话、深入研究和代码生成等应用场景中,KV 缓存必须在内存中长时间保留。当接近或达到 GPU 显存限制时,推理系统将面临权衡。他们可以:

  • 删除 KV 缓存的部分内容,这会导致昂贵的重新计算
  • 限制提示词长度或上下文窗口,降低模型性能
  • 增加更多 GPU,增加运营成本

在 GPU 显存中长时间保留大量 KV cache 是不可扩展的,这迫使提供商在成本、延迟和功能之间进行权衡。

Dynamo 如何帮助减少 KV 缓存瓶颈?

Dynamo 的最新版本支持 KV Cache 卸载功能,可将原本存储在有限 GPU 显存中的 KV Cache 实时传输至成本更低、容量更大的存储介质。该技术能够将 KV 缓存直接从 GPU 显存卸载到更具扩展性且经济高效的存储系统中,例如 CPU 内存、本地 SSD 或远程网络存储。借助 NVIDIA NIXL 这一低延迟传输库,Dynamo 能够在 GPU 显存与外部存储之间高效移动 KV 缓存块,整个过程无需中断模型推理,从而提升整体推理效率与资源利用率。

The image illustrates a system architecture involving a GPU at the center, which connects to multiple key-value (KV) caches.
图 1。KV 缓存卸载支持将 KV 缓存从有限的 GPU 显存即时传输到更经济高效的存储

KV 缓存卸载有哪些好处?

借助 KV 缓存卸载,推理服务提供商能够在不牺牲提示长度的前提下支持具有更长上下文窗口的模型。通过卸载 KV 缓存,可显著降低 GPU 显存占用,使集群能够同时处理更多用户请求,从而提升整体并发能力。这种方式减少了对额外 GPU 的需求,有助于降低基础设施成本。对于包含缓存输入 token 的提示,节省的成本可转化为折扣,惠及最终用户。

KV 缓存卸载还能避免昂贵的 KV 缓存重新计算,从而缩短响应时间并提升用户体验。最终,服务提供商将受益于更高的吞吐量和更低的单位 token 成本,进而增强推理服务的可扩展性与效率。

何时卸载 KV 缓存以重复使用

当 KV 缓存超出 GPU 显存,且缓存重用带来的收益超过数据传输开销时,将 KV 缓存卸载至 CPU 或外部存储将显著提升效率。这一策略在处理长上下文、高并发或资源受限的推理场景中尤为重要,例如:

  • 长会话和多回合对话: 卸载可保留较大的提示词前缀,避免重新计算,并提高首个令牌延迟和吞吐量。
  • 高并发性: 空闲或部分对话可以移出 GPU 显存,允许活动请求在不达到内存限制的情况下继续进行。
  • 共享或重复内容: 跨用户或会话 (例如系统提示和模板) 重复使用会增加缓存点击率,尤其是在远程或跨实例共享时。
  • 受内存或成本限制的部署: 卸载到 RAM 或 SSD 可减少 GPU 需求,从而在不添加硬件的情况下允许更长的提示词或更多的用户。
  • I/ O 优化平台: 具有高主机设备带宽 (例如 NVLINK C2C) 或 GPU Direct Storage 的环境受益更多,因为传输延迟更低,并且可能与计算重叠。

Dynamo 中的 KV 缓存卸载工作原理是什么?

Dynamo KV 块管理器 (KVBM) 是一个为缓存卸载和内存协调提供支持的系统,由三个主要层级构成:

  • 模型集成层:将 NVIDIA TensorRT-LLM 和 vLLM 等热门 AI 推理引擎 (即将支持 SGLang) 连接到 KVBM 系统。这消除了对特定模型集成的需求,并实现了跨不同引擎的一致功能。
  • 内存管理层:处理内存的分配、组织和重用方式。它可以跟踪数据的所在位置,并使开发者能够在不影响整个系统的情况下自定义 KV 缓存卸载策略。
  • 使用 NIXL 的存储和数据传输层:将 KVBM 连接到各种类型的存储,包括 CPU、SSD、文件系统和云平台。NIXL 支持跨机器的快速数据传输,并通过基于插件的系统简化了第三方存储提供商的集成。
High-level architecture of Dynamo KV Block manager and how it interfaces with different components of LLM inference ecosystem.
图 2。Dynamo KV 区块管理器与 LLM 推理生态系统的不同组件交互

通过将内存管理与特定模型引擎分离,并标准化存储访问,KVBM 简化了集成与可扩展性。存储提供商不再需要为不同的推理引擎定制系统,因为 KVBM 负责处理翻译工作。该架构有助于提升性能、简化开发流程,并支持存储与计算的独立演进。

Dynamo 如何与 LMCache 集成?

Dynamo 的核心设计原则是开放性,允许用户在内置功能与第三方集成之间自由选择。为此,Dynamo 集成了 LMCache,一个开源系统,用于在 CPU、本地及远程存储中缓存和重用 token。

LMCache 为 vLLM 等推理引擎提供 KV 缓存层。它能够将频繁使用的数据(例如对话历史记录或提示)从 GPU 卸载至成本更低的存储中,并针对大规模或重复性工作负载提供智能的驱逐与检索策略。对于使用 vLLM 的团队,LMCache 提供了一个强大的 KV 缓存管理解决方案,与 Dynamo 开放架构保持一致。

存储提供商如何利用 KV 缓存卸载?

Vast 测试了 NVIDIA Dynamo 与 Vast AI OS 之间的高性能集成,以实现 GPU 和存储之间持久性 KV 缓存的高效移动。通过在 Dynamo 中启用 GPU Direct Storage (GDS) 插件,Vast 在单个 NVIDIA H100 GPU 上实现了 35 GB/秒的吞吐量,充分表明 GPU 资源得到充分利用,同时验证了存储系统不会成为性能瓶颈。

在另一项测试中,Vast 验证了在 NVIDIA DGX H100 系统上使用 vLLM 和 LMCache 复用持久性 KV 缓存的效果。运行 Qwen3-32B 模型处理 130K token 提示时,系统从 Vast 存储中加载了预先计算的 KV 缓存,而非重新计算,从而显著缩短了首个 token 的生成时间(TTFT)。

WEKA 在实验室测试中,结合使用 NVIDIA Dynamo 以及由 WEKA 开发并开源的自定义 NIXL 插件,对 GPU 与存储之间的高性能 KV 缓存传输进行了评估。测试结果表明,WEKA 的增强内存网格能够以接近显存的速度将 KV 缓存从 token 仓库流式传输至 GPU,从而缩短首次 token 生成时间(TTFT),并提升推理工作负载的整体 token 吞吐量。

测试使用配备 8 个 H100 GPU 的 DGX 系统执行。该设置在 8 个 GPU 上实现了高达 270 GB/秒的读取吞吐量,证明 WEKA 基于 RDMA 的零拷贝数据路径能够满足分解推理对 token 传输的需求,而不会成为瓶颈。

这些测试结果凸显了将 KV 缓存卸载到存储的潜力,可支持分布式环境中大上下文、高吞吐量的生成式 AI 工作负载。

如何使用 Dynamo KVBM 管理 KV 缓存 

To use KVBM for managing KV cache and performing KV offloading in vLLM, follow the steps below:

# start up etcd for KVBM leader/worker registration and discovery
docker compose -f deploy/docker-compose.yml up -d

# build a container containing vllm and kvbm
./container/build.sh --framework vllm --enable-kvbm

# launch the container
./container/run.sh --framework vllm -it --mount-workspace --use-nixl-gds

# enable kv offloading to CPU memory
# 4 means 4GB of CPU memory would be used
export DYN_KVBM_CPU_CACHE_GB=4

# enable kv offloading to disk
# 8 means 8GB of disk would be used
export DYN_KVBM_DISK_CACHE_GB=8

# serve an example LLM model
vllm serve --kv-transfer-config 
'{"kv_connector":"DynamoConnector","kv_role":"kv_both", 
"kv_connector_module_path": "dynamo.llm.vllm_integration.connector"}' 
deepseek-ai/DeepSeek-R1-Distill-Llama-8B

# make a call to LLM
curl localhost:8000/v1/chat/completions   -H "Content-Type: application/json"   -d '{
    "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-8B",
    "messages": [
    {
        "role": "user",
        "content": "In the heart of Eldoria, an ancient land of boundless magic and mysterious creatures, 
lies the long-forgotten city of Aeloria. Once a beacon of knowledge and power, Aeloria was buried 
beneath the shifting sands of time, lost to the world for centuries. You are an intrepid explorer, known 
for your unparalleled curiosity and courage, who has stumbled upon an ancient map hinting that Aeloria 
holds a secret so profound that it has the potential to reshape the very fabric of reality. Your journey 
will take you through treacherous deserts, enchanted forests, and across perilous mountain ranges. 
Your Task: Character Background: Develop a detailed background for your character. Describe their 
motivations for seeking out Aeloria, their skills and weaknesses, and any personal connections to the 
ancient city or its legends. Are they driven by a quest for knowledge, or a search for lost family? A clue is hidden."
    }
    ],
    "stream":false,
    "max_tokens": 30
  }'

启用和查看 KVBM 指标

要通过 Grafana 控制面板启用指标收集和查看,请按照以下步骤操作:

# Start the basic services (etcd & natsd), along with Prometheus and Grafana
docker compose -f deploy/docker-compose.yml --profile metrics up -d

# start vllm with DYN_SYSTEM_ENABLED set to true and DYN_SYSTEM_PORT port to 6880.
# NOTE: Make sure port 6880 (for KVBM worker metrics) and port 6881 
(for KVBM leader metrics) are available.
DYN_SYSTEM_ENABLED=true DYN_SYSTEM_PORT=6880 vllm serve --kv-transfer-config
'{"kv_connector":"DynamoConnector","kv_role":"kv_both", 
"kv_connector_module_path": 
"dynamo.llm.vllm_integration.connector"}' 
deepseek-ai/DeepSeek-R1-Distill-Llama-8B

# optional if firewall blocks KVBM metrics ports to send prometheus metrics
sudo ufw allow 6880/tcp
sudo ufw allow 6881/tcp

通过 http://localhost:3001 查看 Grafana 指标(默认登录名:dynamo/dynamo),并查找 KVBM 控制面板。

基准 KVBM

当 vLLM 服务器准备就绪后,请按照以下步骤使用 LMBenchmark 对 KVBM 性能进行基准测试:

git clone https://github.com/LMCache/LMBenchmark.git

# show case of running the synthetic multi-turn chat dataset.
# we are passing model, endpoint, output file prefix and qps to the sh script.
cd LMBenchmark/synthetic-multi-round-qa
./long_input_short_output_run.sh \
    "deepseek-ai/DeepSeek-R1-Distill-Llama-8B" \
    "http://localhost:8000" \
    "benchmark_kvbm" \
    1

# Average TTFT and other perf numbers would be in the output from above cmd

如需详细了解 LMBenchmark 的使用方法,请访问 LMCache/LMBenchmark GitHub 库。

请注意,如果如上一部分所述启用了指标,您可以在 Grafana 控制面板中观察 KV 卸载和 KV 载入情况。

为便于比较,您可以运行 vllm serve deepseek-ai/DeepSeek-R1-Distill-Llama-8B 来关闭 KVBM,以此作为基准。

如何使用 LMCache 和 vLLM 开始使用 Dynamo

通过设置 IG7Q 环境变量来启用 LMCache:

  • export ENABLE_LMCACHE=1

您可以通过环境变量来自定义 LMCache 的其他配置。

  • LMCACHE_CHUNK_SIZE=256 – 缓存粒度的令牌块大小(默认值:256)
  • LMCACHE_LOCAL_CPU=True – 启用基于 CPU 内存的后端进行卸载
  • LMCACHE_MAX_LOCAL_CPU_SIZE=20 – CPU 显存限制(以 GB 为单位)(用户可根据可用内存将其设置为固定值)

对于高级配置,LMCache 支持多种存储后端:

  • CPU RAM:快速本地内存卸载
  • 本地存储:基于磁盘的持久性
  • Redis:分布式缓存共享
  • GDS 后端:用于高吞吐量的 GPU Direct Storage
  • InfiniStore/ Mooncake:云原生存储解决方案

要开始使用 LMCache 和 vLLM 配合 Dynamo,请执行以下步骤:

# start up etcd for KVBM leader/worker registration and discovery
docker compose -f deploy/docker-compose.yml up -d

# build a container containing vllm and kvbm
./container/build.sh --framework vllm

# launch the container
./container/run.sh --framework vllm -it --mount-workspace

# run vllm with lmcache in aggregated inference
./components/backends/vllm/launch/agg_lmcache.sh

# run vllm with lmcache in disaggregated inference
./components/backends/vllm/launch/disagg_lmcache.sh

请注意,必要的环境变量已包含在 .sh 脚本中,便于快速配置。请根据需要进行更新。

总结

随着大语言模型(LLM)的不断扩展,由于 GPU 显存有限且成本高昂,推理过程中管理 KV 缓存已成为一项重大挑战。 NVIDIA Dynamo 通过支持将 KV 缓存卸载至 CPU 内存、SSD 和网络存储等更具可扩展性的存储选项,有效应对这一难题,该功能由低延迟的 NIXL 传输库提供支持。

Dynamo 与 vLLM 等热门推理引擎以及 LMCache 等开源工具无缝集成,可实现高效的缓存重用、减少重复计算,并更好地支持长上下文和高并发工作负载。Vast 和 WEKA 等存储提供商已成功集成 Dynamo,展示了高吞吐量存储系统如何在不成为瓶颈的前提下,高效地卸载和流式传输 KV 缓存。

这些功能使 KV Cache 卸载成为一种实用且可扩展的解决方案,能够降低推理成本、提升响应速度,并支持大规模生成式 AI 应用的更广泛部署。了解详情并 开始使用 Dynamo

 

标签