最后更新于 2026 年 8 月 16 日,环境要求与部署建议核实自 vLLM Kimi K3 官方 Recipe 及 vLLM 官方发布说明。
官方 Recipe 当前列出 CUDA 13 构建、R580 及以上 NVIDIA 驱动,以及至少 8 张 GB300 的 NVIDIA 路径;AMD 路径则要求至少 8 张 MI355X 或 MI350X。这组门槛直接决定排障顺序:如果 OOM 发生在权重加载和引擎初始化阶段,先查环境与拓扑,不能指望降低并发解决;只有模型初始化完成、请求运行时才 OOM,才适合从上下文、并发和缓存策略入手。
症状:Kimi K3 vLLM OOM。
最快解法:加载期先核对官方环境,运行期再用同一请求集调上下文、并发和缓存;生产负载仍无余量,就迁移或扩容。
这篇文章适合三类人:
- 个人研究者或 POC 团队:判断现有资源是否只够接口和工具调用验证。
- 小型 Agent 团队:在上下文长度、并发量与
prefix caching之间找到稳定边界。 - 平台与生产交付团队:决定继续优化集群,还是启用多节点、迁移环境或临时扩展算力。
先按 OOM 发生阶段分流,而不是先改参数
先看日志位置和服务状态:
| 观察证据 | 更可能的故障阶段 | 先做什么 | 不要先做什么 |
|---|---|---|---|
| 权重尚未完成加载,Engine 仍在初始化,首个请求无法发送 | 加载期 OOM 或环境不兼容 | 核对镜像、CUDA 13、R580+、并行拓扑和节点互联 | 不要只降低并发 |
| 模型初始化完成,端口已监听,短请求能返回 | 运行期显存不足 | 缩短上下文、降低并发,检查缓存保留策略 | 不要把一次短请求成功当成生产结论 |
| 单轮请求成功,多轮 Agent 或长提示失败 | KV、KDA 状态或缓存增长触发 | 使用真实前缀复用请求集复测 | 不要直接关闭所有缓存 |
| 多节点启动失败,日志出现 NCCL、RDMA 或 all-to-all 错误 | 拓扑或通信层问题 | 匹配 NVLink、RDMA 与对应 backend | 不要按 GPU 数量线性外推容量 |
如果权重尚未加载完成,降低 max_num_seqs 或请求并发通常不会改变模型权重、通信缓冲区和初始化阶段的基本占用。你应该先确认是否使用官方 CUDA 13 镜像、宿主机是否达到 R580+,以及当前硬件是否落在官方支持路径内。
如果模型没有完成初始化,连续尝试零散显存参数只会增加排查噪声。停止条件应当是:在官方支持拓扑之外仍无法完成初始化时,停止把问题归咎于 vLLM 参数,转向合规环境验证。
个人研究者:先证明链路可运行,再谈容量
个人研究或 POC 的目标通常是验证 API、工具调用、视觉输入和基础推理链路,不是提前模拟生产吞吐。你可以把请求缩短到能覆盖工具定义、系统提示和一次完整 Agent 回合的范围,再把并发限制为单请求,目的是判断服务能否稳定返回,而不是测出最终容量。
推荐按这个顺序操作:
- 固定官方 Kimi K3 Docker 镜像和启动命令,不同时更换镜像、后端和硬件。
- 记录启动日志中权重加载完成、Engine ready 和端口监听的时间点。
- 使用一个短文本请求验证首个响应,再加入工具定义或图像输入。
- 只改变一个变量,例如上下文上限或并发限制。
- 连续重复同一请求,确认不是偶然成功。
- 保存启动参数、镜像摘要、驱动版本、错误日志和峰值显存。
官方发布说明给出的快速启动命令显式加入了 --tensor-parallel-size 8、--enable-prefix-caching 和工具调用解析器等参数;同时,官方说明当前 Kimi K3 的 Docker 镜像依赖预发布组件,因此不能把任意本地 vLLM 安装结果与官方 Recipe 等价看待。(vllm.ai)
POC 阶段可以接受的降载包括:
- 缩短测试上下文,只保留能复现功能的提示;
- 限制并发,避免把调度压力误判成模型无法加载;
- 暂时关闭非必要的视觉、工具和 speculative decoding 实验变量;
- 不把某个未经官方文档确认的参数值写成所有环境都适用的答案。
权重加载阶段的 OOM,调参数还有意义吗?
只有在确认模型已经完成初始化、错误发生于请求运行阶段时,参数调整才有明确意义。若权重仍未加载完成,优先检查镜像、驱动、硬件和并行拓扑;在官方支持拓扑之外无法初始化时,应转向合规环境,而不是无限压缩上下文或并发。
小型 Agent 团队:保留真实前缀,再压缩并发
小型 Agent 服务比单轮问答更容易遇到隐性显存压力。固定系统提示、工具定义、历史消息和工具结果会反复进入上下文;多轮请求既影响上下文占用,也决定 prefix caching 是否真正有收益。
Kimi K3 的缓存不是普通 Transformer 的单一 KV 缓存。vLLM 同时管理全注意力层的 KV block 与 KDA 层的循环状态;官方资料确认 Kimi K3 支持覆盖两类状态的 prefix caching,但默认未启用,需要显式传入 --enable-prefix-caching。(vllm.ai)
| 调整方案 | 适合解决的问题 | 代价 | 你必须观察的证据 |
|---|---|---|---|
| 降低并发 | 多会话同时进入 prefill 或 decode,峰值突然抬高 | 排队时间增加 | 峰值显存、队列长度、首 token 延迟 |
| 缩短上下文 | 单请求输入过长,prefill 阶段触顶 | 长期记忆或工具历史被截断 | 输入 token 分布、失败请求位置 |
| 保留 prefix caching,调整保留策略 | 固定系统提示和工具定义重复出现 | 缓存空间与重算时间需要取舍 | 命中率、缓存占用、重算比例 |
| 直接关闭缓存 | 前缀高度随机,缓存成本大于收益 | 每次都重复计算共享前缀 | 总延迟、显存峰值、吞吐变化 |
打开 prefix caching 后显存仍然不足,应该怎样处理?
先不要直接关闭缓存。你应当把“缓存命中带来的重算减少”和“缓存保留带来的显存占用”放在同一组请求里比较。官方发布说明介绍了按间隔保存 KDA 状态,以及在前缀第二次命中后再选择性保留等思路;其中,VLLM_PREFIX_CACHE_RETENTION_INTERVAL=0 可用于只保留提示结尾状态的场景,但是否适合你的版本和负载,仍应以对应版本复测为准。(vllm.ai)
不要用一次短提示证明问题已经解决。至少准备一组包含以下内容的请求:
- 相同系统提示、相同工具定义;
- 不同用户问题;
- 连续多轮 Agent 调用;
- 工具返回较长结果的请求;
- 一次超过日常输入长度的压力请求。
每次只改变一个变量,然后记录显存峰值、缓存命中情况、请求失败位置和响应稳定性。若降低并发后稳定,但上下文一恢复就 OOM,结论不是“修复完成”,而是服务受上下文容量约束。
平台团队:先确认你能控制哪一层
已有 GPU 集群的平台团队,最容易陷入“重新安装一遍”的循环。真正要先确认的是:你能否升级宿主机驱动,能否使用官方镜像,能否调整节点互联,能否改变 TP、EP 或多节点布局。
当前官方 Recipe 确认了 CUDA 13-only 镜像和 R580+ 主机驱动要求;如果主机仍是 CUDA 12.9 与 R575 驱动,方向是升级驱动,或自行从 K3 分支构建对应环境。后者属于自维护路径,不应与官方镜像支持混为一谈。(recipes.vllm.ai)
平台团队可以用这张表做分流:
| 现有条件 | 判断 | 推荐动作 |
|---|---|---|
| 可升级宿主机驱动,也能使用官方 Docker | 环境可控 | 先复刻官方 Recipe,再做负载复测 |
| 只能改容器,不能改宿主机驱动 | 环境边界受限 | 评估自构建维护成本,不要把一次启动成功当长期支持 |
| 节点有 NVLink | 通信路径与 RDMA 不同 | 按官方建议选择 flashinfer_nvlink_one_sided |
| 节点通过 RDMA 互联 | 需要检查 UCX、NCCL 和 all-to-all | 使用与 RDMA 匹配的 backend,并验证 KV 传输 |
| 只能单节点,目标却是生产多会话 | 容量和拓扑都可能不足 | 先迁移到合规多节点环境做对照 |
官方建议在 NVLink 环境使用 flashinfer_nvlink_one_sided,RDMA 环境使用 deepep_v2;对于 DEP 部署,Recipe 推荐 deep_gemm_mega_moe。这意味着多节点不是简单增加 GPU 数量,通信路径本身会改变可用的并行方案。(recipes.vllm.ai)
现有集群不满足 Kimi K3 要求时,自构建是否值得?
如果你拥有宿主机、驱动、内核、网络和镜像发布的完整控制权,自构建可以作为研发路径;如果你只能修改容器,却无法改变驱动和节点互联,继续自构建往往会把一次性 OOM 变成持续维护成本。尤其是当前镜像依赖预发布组件,版本更新后需要重新验证。
生产交付团队:目标负载稳定不了,就从调参转向扩容
生产判断不能只问“模型能不能启动”。你需要把预期上下文、并发会话、Agent 前缀复用、工具调用失败重试和节点故障恢复一起纳入容量结论。
如果模型已经完成初始化,且 OOM 只在并发上升或长上下文请求出现,先降低并发并缩短上下文,目的是测出当前环境的稳定边界;如果在合理降载后仍没有稳定余量,或者目标流量恢复后持续触顶,就应该增加符合官方拓扑的算力,而不是继续牺牲业务参数。
官方资料给出的 Kimi K3 上限上下文为 1M tokens,但这不是建议你直接以该上限承载生产请求。vLLM 发布说明还给出过特定测试拓扑下的吞吐数据:在 16 张 NVIDIA GB300 NVL72 GPU 上,单用户 decode 从 118 tokens/s 提升到 370 tokens/s,使用了 DSpark;这些数字只适用于官方描述的测试条件,不能外推到你的集群。(vllm.ai)
生产复测至少分成三档:
- 基线档: 日常上下文、日常并发、真实工具定义。
- 峰值档: 高于日常的并发会话与长输入。
- 恢复档: 节点重启、请求重试、缓存重新升温后的连续请求。
每档都记录:
- 权重加载是否完成;
- Engine 是否持续在线;
- 峰值显存和显存余量;
- 首 token 延迟与完整响应延迟;
- prefix caching 命中和重算情况;
- 工具调用解析失败与重试次数;
- 多节点通信错误和请求恢复时间。
如果只在峰值档 OOM,但基线档有稳定余量,可以进入限流、队列和持续监控阶段;如果基线档也没有余量,继续优化参数通常不能替代扩容。官方资料将多节点、专家并行以及 prefill/decode 分离列为大规模服务路径,这些方案必须匹配真实互联条件,不能按 GPU 数量简单相加。(vllm.ai)
Agent 服务什么时候已经到了必须扩容的程度?
当基线请求在目标上下文和日常并发下持续出现显存尖峰,或合理降载后仍无法覆盖目标流量,就应进入扩容评估。若只有极端峰值失败,可以先使用限流和排队;若每次缓存升温、工具重试或节点恢复都会再次触顶,则应优先考虑更大拓扑,而不是继续关闭业务能力。
用复测证据决定调参、迁移还是扩容
在做高风险变更前,你可以按下面的可勾选清单收集证据:
- [ ] 已确认 OOM 发生在权重加载、Engine 初始化还是请求运行阶段。
- [ ] 已记录镜像版本、vLLM 版本、CUDA 版本和宿主机驱动版本。
- [ ] 已确认当前硬件与官方 Kimi K3 支持拓扑一致,或明确标记为自定义验证。
- [ ] 已使用同一组真实请求,分别测试不同上下文和并发设置。
- [ ] 已显式确认是否启用
--enable-prefix-caching。 - [ ] 已记录缓存命中、峰值显存、失败请求和响应稳定性。
- [ ] 已分别测试基线、峰值和恢复场景。
- [ ] 已保存启动参数、请求样本和资源曲线,便于 vLLM 更新后复测。
- [ ] 已确认节点互联与 all-to-all backend 相匹配。
- [ ] 已计算降载后是否仍满足目标流量,而不是只看服务是否存活。
最终结论可以压缩成三种:
- 低负载验证通过: 保留最小环境,用于接口、工具和推理链路验证。
- 合理降载后稳定: 进入监控和容量积累阶段,明确并发、上下文与缓存上限。
- 权重无法加载或生产余量不足: 停止继续牺牲业务参数,迁移到官方支持拓扑或扩展多节点算力。
如果你需要先做环境对照,可以把同一份镜像、启动参数和请求集放到按周期交付的临时算力环境中,再与现有集群比较。这样做的价值不是“绕过 OOM”,而是把环境不兼容、通信问题和真实容量不足分开。你可以先查看 MacHTML 的帮助页面 了解交付与使用边界,再根据测试周期参考 MacHTML 的算力方案。
如果当前集群只能靠不断缩短上下文、压低并发和关闭缓存才能勉强运行,那么它更像验证环境,而不是生产环境。对 Kimi K3 这类依赖 CUDA 13、R580+ 驱动以及特定多节点通信路径的服务,临时租用合规算力做同请求集对照,通常比在受限集群上反复自构建更容易得到可审计的升级、迁移或长期扩容结论。
别让 OOM 拖慢你的部署,立即启用 MacHTML 云端工作站
按你的验证、团队协作或生产交付周期灵活租用 MacHTML M4 专属物理实例,减少反复调参等待。 独享物理性能与 16GB 统一内存,配合可选 1TB 或 2TB 高速存储,为模型部署和数据处理留出更充足空间。 支持日本、新加坡、韩国、香港和美国节点,选择更近的区域,降低远程操作与服务访问延迟。 无需长期合约,按日、周、月或季度订阅,支付后最快 5 分钟开通,并可通过控制台与远程桌面直接使用。