OpenLake多节点RDMA部署全攻略:跨GPU集群共享KV池的3种后端怎么选
【免费下载链接】openlakeOpenLake is a high performance storage engine for efficient LLM inference and GPU Training项目地址: https://gitcode.com/gh_mirrors/ope/openlake
在 LLM 推理的多节点部署中,如何跨 GPU 机器共享 KV Cache 并通过 RDMA 低延迟访问,是降低首字延迟(TTFT)、节省 GPU 显存的核心问题。OpenLake 是一个为 LLM 推理与 GPU 训练打造的高性能存储引擎,支持把各节点的 KV 池聚合成一个跨机共享的缓存池。本文带你用 Helm 完成一次多节点 RDMA 部署,并针对 H2、UCX、DCT 三种传输后端给出一份可直接落地的选择指南。
为什么GPU集群需要一个跨节点的共享KV池
在多机推理(尤其是 PD 分离、前缀复用场景)下,如果每个节点各自维护 KV Cache:
- 重复计算浪费 GPU 秒数:相同的 system prompt / 长上下文在不同节点反复 prefill;
- 首字延迟(TTFT)被放大:命中不了本地缓存时只能重算;
- 显存利用率上不去:热点 KV 无法在集群内流动复用。
OpenLake 把 KV 元数据集中管理,把 KV 数据放在 RDMA 可注册的内存 slab 中,各推理节点通过统一的 Reserve / Commit / Lookup / Release 生命周期操作共享池,架构细节可参考 docs/developer/kv_offload.rst。启用跨节点 KV 共享后,效果如下两图所示:
OpenLake的3种KV传输后端速览
OpenLake 的 KV 服务有三种传输形态,对应不同的硬件前提和使用场景:
| 后端 | 传输方式 | 硬件要求 | 适用场景 |
|---|---|---|---|
| H2 | HTTP/2 + 本机 POSIX 共享内存 | 无 RDMA 要求 | 单节点开发、Helm 渲染验证、CPU 冒烟测试 |
| UCX | UCX 框架跑在 IB/RoCE RDMA 之上 | IB/RoCE 网卡 + UCX 运行时 | 多节点 P2P 生产部署,配置门槛最低 |
| DCT | Direct Verbs + DCT(Mellanox) | 支持 DCT 的 Mellanox 网卡(如mlx5_0) | 超低延迟、高扇入(高 maxClients)的大规模集群 |
⚠️ 关键区别:H2 客户端只能打开本机共享内存,无法把 KV 数据搬运到另一台机器。多节点 H2 示例因此禁用了 connector 输出;它只是"无 RDMA 环境也能验证部署流程"的入门选项,真正的跨机共享必须走 UCX 或 DCT。
三个后端在 charts/openlake/values.yaml 中由kv.transport(h2/rdma)和kv.rdma.backend(ucx/dct)两个开关决定,官方示例配置分别位于:
- H2:charts/openlake/examples/kv-h2-values.yaml
- UCX:charts/openlake/examples/kv-ucx-values.yaml
- DCT:charts/openlake/examples/kv-dct-values.yaml
裸机部署时对应的服务端配置可参考 crates/openlake_server/configs/kv_rdma.toml(DCT 后端)与 crates/openlake_server/configs/kv_ucx.toml(UCX 后端),RDMA 传输实现位于 crates/openlake_io/src/rdma/。
Helm部署步骤:多节点RDMA KV池如何一键拉起
第1步:核对节点与RDMA设备
在每台目标节点上确认名字、IP 和数据面设备(IP 可以是专用于 RDMA 的地址,不要求等于 Kubernetes InternalIP):
kubectl get nodes -o wide ibv_devices && ibv_devinfo rdma link ucx_info -d # UCX 后端时检查第2步:选择示例 values 并替换关键项
以 DCT 为例,复制kv-dct-values.yaml,替换镜像仓库、targets(节点名 + IP 的有序列表,顺序即节点 ID,切勿随意重排)、rdma.devName(如mlx5_0)和dcKey。UCX 后端把backend改为ucx即可,并可通过kv.rdma.env传入已在节点上验证过的变量,例如UCX_NET_DEVICES、UCX_TLS。
第3步:渲染并安装
helm lint charts/openlake -f charts/openlake/examples/kv-dct-values.yaml helm template openlake charts/openlake -f charts/openlake/examples/kv-dct-values.yaml helm upgrade --install openlake charts/openlake \ --namespace openlake --create-namespace \ -f charts/openlake/examples/kv-dct-values.yamlChart 会为每个目标节点创建一个 host 网络 StatefulSet 副本,并生成:
- 一份 ConfigMap:包含有序
target-ips、节点身份映射、OpenLake TOML 模板和 vLLM connector JSON; - 一个 headless Service,用于 RPC(9400)与遥测(9401)发现;
- 每个 Pod 按实际调度到的节点推导
self_id,不假设 StatefulSet 序号与机器的对应关系。
完整部署契约见 charts/openlake/README.md。
vLLM对接:让推理引擎挂上共享KV池
安装后,每个 vLLM 实例需要拿到同一份渲染出的 connector JSON(顺序必须与 Helm 生成的一致):
kubectl --namespace openlake get configmap openlake-openlake-kv-config \ --output jsonpath='{.data.vllm-kv-transfer-config\.json}'输出形如:
{ "kv_connector": "OpenLakeConnector", "kv_role": "kv_both", "kv_connector_extra_config": { "openlake_nodes": ["10.0.0.11:9400", "10.0.0.12:9400"], "openlake_device": "ucx" } }把它传给vllm serve --kv-transfer-config或挂载给 vLLM Deployment 即可。openlake_device留空时自动选择:UCX 后端用ucx,DCT 后端用rdma.devName。Python 侧实现可看 external/connectors/vllm/openlake_connector.py 与指标模块 external/connectors/vllm/openlake_metrics.py。
💡 提示:新增、删除或重排targets会改变 peer ID 与缓存落位,需要与所有 vLLM 部署同步并重启,KV slab 应视为易失缓存。
部署验证与常见故障排查
✅ 健康检查三板斧:
kubectl --namespace openlake rollout status statefulset/openlake-openlake kubectl --namespace openlake logs statefulset/openlake-openlake kubectl --namespace openlake port-forward pod/openlake-openlake-0 9401:9401 curl http://127.0.0.1:9401/v1/telemetry/openlake常见故障速查(详见 charts/openlake/README.md 的 "Updates and failure modes"):
| 现象 | 常见原因 |
|---|---|
Pod 长期Pending | nodeName写错 / 节点不可调度 / 主机端口被占用 / 内存申请超出可分配量 |
| RDMA Pod 起不来 | 无法打开/dev/infiniband、设备插件或 UCX/OFED 未就绪、镜像缺少rdmafeature |
| 端口通但 KV 拉取失败 | kv_agents中的 IP 不可达(渲染不会替你校验地址) |
| 升级后节点身份变化 | targets顺序变了,peer ID 与缓存落位全部漂移 |
3种KV后端怎么选:一页速查
- 没有 IB/RoCE,只想先把流程跑通→ H2(
transport: h2),用它验证 Helm 渲染、调度与健康检查;单节点 + vLLM 冒烟测试可直接启用vllmSmokeTest(示例见 charts/openlake/examples/kv-vllm-smoke-values.yaml)。 - 有 IB/RoCE、想最快上生产→ UCX(
backend: ucx),无需 DCT 支持,可透传集群验证过的UCX_NET_DEVICES等环境,对 GPU Direct 友好。 - Mellanox ConnectX 集群、追求极致延迟与高并发扇入→ DCT(
backend: dct),显式指定devName、dcKey、srqDepth、maxClients等 verbs 参数,参数模板见 crates/openlake_server/configs/kv_rdma.toml。
🔍 一句话总结:H2 用于"先跑通",UCX 用于"好落地",DCT 用于"压极限"。
参考资料
- 部署总览与 values 说明:charts/openlake/README.md
- KV 卸载架构(本地 / 跨节点):docs/developer/kv_offload.rst
- 集群操作与排障:docs/cluster_operations.rst
- KV 客户端传输层(Protocol trait:attach/put/get/reset):crates/openlake_kv_client/src/transport.rs
- RDMA 后端实现(DCT、bootstrap、内存注册):crates/openlake_io/src/rdma_backend.rs
- vLLM 连接器与测试:external/connectors/vllm/
【免费下载链接】openlakeOpenLake is a high performance storage engine for efficient LLM inference and GPU Training项目地址: https://gitcode.com/gh_mirrors/ope/openlake
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考