TT Lab
博客

한국어 English 日本語 中文

开始
博客

博客

ML·AI 基础设施与 Kubernetes 工程师实用知识图谱:附亲自测量的数字

状态:草案(2026-10-07),知识图谱文章。 本文没有进行新的测量,而是将同一系列其他文章中 作者亲自测量的值与 文档确认的内容编纂为一张图。数字旁标注了出自哪篇文章及测量时的条件。由于所有测量均在一两个小模型、单张 GPU(8GB 级别)、一次性单节点集群上进行,因此请重点关注 形态与原理,而非绝对数值。基于文档或未经测量的内容标记为“基于文档”、“未实测”。 编写规则:以实测数据为基础,未能测量的内容标记为“未实测”。

目录

1. 如何阅读本文

ML·AI 基础设施不是单一领域,而是 多层叠加的领域。不了解 GPU 内存带宽,就无法解释推理数字;不了解 Kubernetes 调度器,就不知道 GPU 任务为什么会卡住;不了解可观测性,就无法修复这两者。本文总结了每一层的“核心必知内容”,并串联了深度阅读文章。

阅读顺序分为两种:

2. 一张图总览:八个分层

分层 核心问题 代表工具与概念 深度阅读文章
1. GPU 与硬件 是什么决定了速度上限 内存带宽、计算吞吐量、VRAM 配置 第 21 篇、第 11 篇
2. Kubernetes 的 GPU 栈 GPU 是如何触达 Pod 的 驱动、Toolkit、Device Plugin、GPU Operator、直通(Passthrough) 第 3 篇、第 13 篇
3. 调度与多租户 多个团队和任务如何共享 GPU Kueue、Volcano、协同调度(Gang Scheduling)、配额、抢占 第 10 篇、第 9 篇
4. LLM 推理引擎 是什么决定了吞吐量与延迟 连续批处理、KV 缓存、前缀缓存、Chunked Prefill、量化、LoRA 第 4 篇、第 5 篇、第 14 篇、第 15 篇
5. 网络 服务扩展与 GPU 间通信 CNI、kube-proxy 对比 Cilium、服务网格、RDMA、NCCL 第 2 篇、第 7 篇
6. 存储与模型部署 权重和 KV 放在哪里 模型缓存、冷启动、KV 卸载、权重保护 第 8 篇、第 16 篇
7. 可观测性与故障诊断 观察什么以及何时发出警报 DCGM、XID、TTFT·ITL 分位数、服务器指标 第 17 篇、第 18 篇、第 11 篇、 第 25 篇
8. 控制器与部署自动化 如何维持声明式状态 CRD、Operator、GitOps 第 9 篇

3. 第 1 层:GPU 与硬件,速度上限来自何处

应当了解的内容

  1. Token 生成的速度上限由内存带宽决定。 每生成一个 Token,都要完整读取一次各层的权重,因此 초당 토큰 수 ≤ 메모리 대역폭 ÷ 가중치 바이트是访存密集型任务。
  2. 输入(提示词)处理的速度上限由计算能力决定。 当同时计算大量 Token 时,多个 Token 会复用相同的权重。
  3. VRAM 由权重、KV 缓存、激活值和 CUDA 图(CUDA Graph)共同分摊占用。 在推理服务中,决定吞吐量的通常是 KV 缓存所剩余的份额。
  4. 消费级 GPU 与数据中心 GPU 的诊断功能有所不同。 可能缺少 ECC、行重映射(Row Remapping)或性能剖析指标。
  5. 容器的 CUDA 版本不能超过宿主机驱动决定的上限。 如果上传镜像后启动失败,首先应检查驱动版本。

亲自测量的数字 (第 21 篇、第 11 篇)

确认项目 结果
四个大小、精度各异的模型的生成速度 × 权重大小 达到测得带宽(250GB/s)的 86%~98%
将精度减半(从 bf16 到 fp8) 权重缩小了 1.7 倍,但速度只提升了 1.54 倍(随着 Token 固定的开销占比增加,收益有所下降)
输入处理(1,024 个 Token 以上) 约为测得矩阵乘法吞吐量的 75%~80%,比同一模型的生成速度快 65~127 倍
三种消费级 GPU 的 ECC 与页面退役(Page Retirement) 全为 N/A
行重映射 三种中仅有一种返回了数值(需要区分 0 与 N/A)

常见陷阱

4. 第 2 层:Kubernetes 的 GPU 栈

应当了解的内容

  1. GPU 是一种扩展资源(Extended Resource)。 只能以整数请求,请求值与限制值必须相等,且不支持超分(Overcommit)与共享。
  2. 软件栈是自下而上构建的。 宿主机内核模块(驱动)、容器运行时工具包、Device Plugin(资源宣告)、节点标签(GFD)、监控(DCGM exporter)。GPU Operator 会将这些一次性全部安装好。
  3. 不同的共享方式,其隔离级别也不同。 时间分片(Time-slicing)不隔离内存,MIG 仅在支持的 GPU 上通过硬件划分,而软件方式(如 HAMi 等)会拦截 CUDA 调用(基于文档,第 3 篇与第 10 篇)。
  4. 也可以将 GPU 整体直通给虚拟机。 此时宿主机无法使用该 GPU,因此需要以节点为单位将 GPU 划分为容器专用或虚拟机专用(第 13 篇)。
  5. 明确驱动、Toolkit 和 Operator 的职责分工,可以加快故障排查速度。 失败在哪一层,会根据症状(nvidia-smi 失败、Pod 处于 Pending、容器启动失败)而有所不同。

常见陷阱

5. 第 3 层:调度与多租户

应当了解的内容

  1. 默认调度器是以单个 Pod 为单位进行决策的。 需要多个 Pod 同时启动才有意义的工作负载(分布式训练、多节点推理),会导致部分 Pod 获取资源后互相等待。
  2. 协同调度(Gang Scheduling)有两种方式。 Kueue 按工作负载单位检查配额,在获得批准前不创建 Pod;而 Volcano 则通过独立调度器在 Pod 组能够满足最小数量时才统一分配资源。
  3. 配额、借用、归还与抢占是设计问题。 通过策略来规定谁可以借用剩余资源,以及当拥有者返回时谁会被驱逐。
  4. LeaderWorkerSet 提供了组级别的恢复机制。 在多节点推理中,如果其中一个 Rank 消失,其余 Rank 将失去意义,因此默认做法是重建整个组。

亲自测量的数字 (第 10 篇、第 9 篇)

确认项目 结果
两个各需 4 个 Pod 的任务争夺 8 个资源(默认调度器) 在 60 秒内各自占有 2 个并陷入停滞(死锁)
相同情况下的 Kueue、Volcano 仅接受一个任务并在约 2~4 秒内运行 4 个 Pod,不存在仅部分运行的状态
删除已被接受的任务后,等待任务启动的时间 Kueue 3.0~3.6 秒,Volcano 3.6~4.2 秒
在 LeaderWorkerSet 中删除一个 Worker 时 同组的 3 个 Pod 全部重新创建,其他组保持不变(约 2 秒)
仅使用 LeaderWorkerSet 且资源不足时 仅 Leader 处于 Running 状态,Worker 处于 Pending,且无协同调度

常见陷阱

6. 第 4 层:LLM 推理引擎,用数字去理解

这是被询问最多、测量最多的分层。我们在 8GB 级单张 GPU 上使用 1.7B 模型对 vLLM 和 SGLang 进行了测量(第 5 篇、第 14 篇、第 15 篇)。

应当了解的内容

  1. 连续批处理(Continuous Batching)让并发请求分摊了权重读取成本。 因此,提高并发度会使总吞吐量几乎成正比增长,直到在 KV 缓存容量处拐弯下降。
  2. 每个 Token 的 KV 大小可以通过公式计算。 2 × 층 × KV 헤드 × head_dim × 바이트. 并发上限可以估算为 KV 용량 ÷ 요청당 토큰。
  3. 前缀缓存(Prefix Caching)可跳过公共前缀的输入处理。 对于在前方固定了系统提示词和文档的服务而言,这是性价比最高的优化。
  4. Chunked Prefill 决定了长输入中断其他用户 Token 的时间。
  5. 量化分为两种。 权重量化改变速度(读取字节数),KV 量化改变容量(容纳的 Token 数量)。
  6. LoRA 在单一基座模型上加载小型适配器进行推理。 同时使用的适配器数量与槽位(Slot)数量的关系决定了性能。

亲自测量的数字

确认项目 结果 文章
服务器日志中的 KV 容量 ÷ Token 数量 每个 Token 约 114,900 字节,在公式计算值 114,688 字节的 0.2%~0.3% 以内 第 14 篇
并发请求从 1 增至 16 总吞吐量提升 14~15 倍,单请求速度下降 8%~14% 第 21 篇
并发从 32 增至 64(输入 512) 初次测得服务器吞吐量从 831 降至 787 tok/s,首字延迟(TTFT)从 666ms 增至 5.7 秒,达 8.6 倍。重启服务器三次后,根据 KV 容量(从 22,048 到 26,560 tokens),时间分散在 2.1 到 5.7 秒之间 第 14 篇
KV 8 位量化 相同内存下承载 1.9 倍的 token,长输入(2,048 tokens)并发 16 时 TTFT 从 4.0 秒降至 0.94 秒 第 14 篇
前缀缓存(公共 3,000 tokens) 首字延迟从 394ms 降至 28ms,关闭时为 393ms 第 14 篇
当长输入(3,500 tokens)插入时的最大 token 间隔 512 tokens 分块时为 69ms,2,048 tokens 约 227ms,8,192 tokens 为 445ms 第 14 篇
同类测试中的 SGLang 默认行为 即使将分块减小到 512,仍为 472ms(处理整个输入的时间),开启混合分块后才能达到 69ms 第 5 篇
两个引擎的纯吞吐量 并发 1~64 时在 ±5% 范围内(受带宽限制的小模型) 第 5 篇
使用 LoRA 适配器请求的吞吐量 以 48 个请求为基准,减少约 10%(单个适配器)到 12.5%(混合两个)(5 次重复的中位数,单次测得的 17.9% 混入了预热值),保持开启 LoRA 本身是没有开销的 第 15 篇
用 2 个槽位服务 3 个适配器 吞吐量降至 4 个槽位时的 56% 第 15 篇
服务器重启 35~55 秒(权重加载 4~6 秒),首次启动由于编译需要 71 秒 第 14 篇

实战准则

7. 第 5 层:网络

需要了解的内容

  1. 随着服务数量增加,iptables 规则也会增加。 Cilium 的 eBPF 使用映射(map)查询代替规则来实现服务负载均衡。
  2. 服务网格会为每个请求增加代理跳数。 在 LLM 服务中,首字延迟需要几百毫秒,因此这个开销很小,但在按 token 流式传输响应或短调用中可能会显现出来。
  3. GPU 间的通信是单独的一层。 NCCL 负责集合通信,而在节点之间,RDMA(InfiniBand 或 RoCE)会绕过 CPU。
  4. RDMA 常见故障在于配置。 锁定内存限制(memlock)、MTU 不匹配、GID 选择、PFC·ECN。

实测数据 (第 2 篇、第 7 篇)

验证项目 结果
Istio Sidecar(mTLS) 每个请求增加约 2.2ms。加密约占 8%,其余为代理开销,其中 HTTP 解析约占 39%(即使改用无解析的 L4 仍会残留 +1.35ms)。gRPC 为 +3.4ms,100MiB 响应导致吞吐量下降 3.5~4.5 倍,流式事件间隔(20ms)不受影响
超出 conntrack 限制的 4,000 个并发连接 在限制 2,048 下有 1,913 个成功(= 限制 - 现有条目),其余未被拒绝而直接被默默丢弃
在刚创建 1 万个服务后连接新服务 kube-proxy 侧需 45 秒(两次中一次),Cilium 侧 0.25 秒
iptables 规则达到 11 万行 同一节点内新连接的平均延迟仅增加约 0.05ms(小于通常认知)
软件 RDMA(rxe) 同一台机器的 TCP 比 RDMA 写入快约 8 倍(用于概念验证),以太网 MTU 为 1500 时 active_mtu 1024
普通用户的锁定内存限制为 64·1,024KiB 1MiB 内存注册以 Failed to create MR 失败,从 8,192KiB 开始成功

常见陷阱

8. 第 6 层:存储与模型部署

需要了解的内容

  1. 权重文件大小约为 파라미터 수 × 바이트。 如果是 70B bf16 则为 140GB,因此需要共享缓存或镜像策略,避免每个节点都下载一遍。
  2. 冷启动是拉取镜像、下载模型、加载、编译和预热的总和。 在自动扩缩容设计中,这个总和就是新 Pod 接收流量所需的时间。
  3. 将 KV 卸载到 GPU 之外(CPU、磁盘、远程)可以更长时间地重用前缀。 但前提是加载时间必须比重新计算短才划算。
  4. 权重加密可以防止存储泄露和篡改,但无法保护运行时的内存。

实测数据 (第 8 篇、第 16 篇、第 14 篇)

验证项目 结果
以相同顺序重新读取 10 个无法完全放入 GPU 的文档(约 5 万个 tokens) 使用 LMCache(CPU 卸载)使 TTFT 从 576ms 降至 48.6ms,首次读取时的存储开销约为 4%
如果 LMCache 的 CPU 容量小于工作集(约 1.49GB) 则收益为 0(在 0.5GB、1.0GB 时命中率为 0),1.5GB 时将 600ms 降至 39ms(命中率 98%)。上下文越长收益越大,6,414 tokens 时约有 19 倍提升
盈亏平衡命中率 约 4%(根据该测试的值计算)
使用 AES-256-GCM 加密权重文件 文件大小增加约 0.00005%,解密速度 0.78~0.95 GB/s(纯计算 1.8~2.2 GB/s)
密文篡改 1 字节,分块顺序调换 两者均被拒绝解密(InvalidTag)。如果没有 AAD,将无法检测到调换、裁剪以及跨文件的分块调换
关闭 AES 硬件加速时 解密慢 4~7 倍(从 2.0 降至 0.47、0.29 GB/s)。线程数停留在 2 个,但进程可扩展至 8 个
将解密后的权重放在内存卷中并启动服务器(0.6B 模型) 约 2.3 秒的解密时间叠加在服务器准备就绪(约 28 秒)之前。被篡改的文件在服务器启动前就会被拒绝
在运行时加载 LoRA 适配器(6.4MB) 无需重启服务器,耗时在 0.2 秒以内(文档警告生产环境慎用)

9. 第 7 层:可观测性与故障诊断

需要了解的内容

  1. GPU 指标分为三个层级。 硬件层(DCGM:利用率、功耗、温度、时钟限制原因、XID)、服务器层(队列、KV 利用率、抢占数)、服务层(TTFT、ITL、错误率)。
  2. 只看利用率会被欺骗。 受内存带宽限制的服务器,即使利用率很高也可能几乎没有进行有效计算。
  3. XID 是 GPU 驱动程序留在内核日志中的错误编号。 普通账户可能无法访问 dmesg ,因此通常使用 journalctl -k 。
  4. Cilium 和 DCGM 的指标非常多,基数(cardinality)就是成本。 标签组合决定了时间序列的数量(第 17 篇、第 18 篇)。
  5. 告警应将症状(TTFT 尾部延迟)与根因(VRAM 趋势、时钟限制)分开。
  6. 追踪(Trace)是贯穿单个请求的信号。 vLLM 会为每个请求在单个 Span 中记录等待、预填充(prefill)和解码时间的属性,仅凭这一点就能区分慢请求是因为等待还是计算。开启的开销在误差范围内,而要捕获慢请求,需要的不是概率采样,而是尾部采样(Tail Sampling)(第 25 篇)。

常见陷阱

10. 第 8 层:控制器与部署自动化(Kubernetes 工程师的工具)

需要了解的内容

  1. 基于级别的调节(Level-triggered)。 读取当前状态而非事件,将其与期望状态进行比较并进行调整。即使漏掉事件,下一次调节也会将其修正。
  2. 幂等性。 如果状态已经匹配,则不应写入任何内容。
  3. 所有权引用(Owner Reference)与 Finalizer。 子资源会在所有者被删除时一同清理,而 Finalizer 则在清理完成后才允许删除。
  4. CRD 的核心在于架构与验证设计。 简单规则使用 CEL,复杂规则使用 Webhook。
  5. 如果在 GitOps 中由其他控制器修改了 Git 中编写的字段,将会发生冲突。 HPA 与 replicas, ignoreDifferences(第 9 篇)。

实测数据 (第 9 篇)

验证项目 结果
CEL 验证 空字符串模型名称在创建阶段被 model must not be empty 拒绝
LWS 滚动更新 从序号较大的组开始,每次更新一组(maxUnavailable 1 为默认值)

运营商的实际运行行为(删除子资源时的恢复时间、幂等性、Finalizer、重复执行、重试)将结合第 9 篇中实际测试的结果进行后续更新。

11. 测量方法:贯穿所有层的技术

整个系列中最宝贵的不是数字,而是 质疑数字的瞬间。

遇到的问题 教训
输入处理速度达到 GPU 计算极限的 20 倍 与硬件极限进行对比。 原因是通过重复相同句子导致前缀缓存命中了
“并发 1, 16”实际上是 3 倍,48 个请求 确认工具参数的具体作用。 使表述与实际请求数保持一致
数值重复出现的表格 对测量工具的分辨率保持怀疑
30 秒的终止宽限期混入了抢占时间 检查是否混入了非预期测量目标的时间段
只保留表头的 grep 导致看不到结果 不使用会掩盖结果的过滤器
以 root 身份进行的测试未能复现故障 使用要复现的条件(普通用户)进行测试
两个引擎同名选项的默认值不同 在比较前通过日志对齐设置

并将以下三点养成习惯: 每个请求使用不同的输入, 进行重复与分布测试(不对单次测量结果下定论), 在数值旁记录环境与方法.

12. 4 周学习路径

如果是自学,建议遵循此顺序。每周的产出应当是 一张亲手测得的表格。

周 主题 实践内容 产出物
1 GPU 与服务引擎 用 vLLM 部署一个小模型(1~2B),将不同大小和精度下的生成速度乘以权重字节数,并与带宽进行对比 “速度 × 权重与带宽对比”表
2 负载与缓存 将并发从 1 提升至 64,测量吞吐量、TTFT p95、ITL p99,验证 KV 容量公式与拐点,测试开启和关闭前缀缓存 并发曲线与 KV 计算
3 Kubernetes GPU 与调度 在临时集群中使用假扩展资源制造资源死锁,并用 Kueue 和 Volcano 解决;亲手编写控制器(如 kopf)来测量子资源删除恢复时间 死锁复现与解决、恢复时间
4 可观测性、故障与安全 读取 DCGM 指标并构建能区分 N/A 与 0 的仪表盘、设置 XID 告警规则、测量权重加解密速度 指标列表与告警规则草案

仅在临时环境(虚拟机中的 k3s、临时 Pod)中进行,测试结束后销毁。切勿在生产服务集群中首次尝试。

13. 现场与面试高频问题

  1. 如何估算 LLM token 生成速度的上限? 内存带宽 ÷ 权重字节数。在四个模型上测得的带宽达到了 86%~98%。
  2. 服务器的并发请求上限是多少? KV 缓存 Token 数 ÷ 每个请求的 Token 数。超过该值后吞吐量不会增加,且 TTFT 会激增 8 倍。
  3. 前缀缓存什么时候效果显著? 公共前缀较长的服务。在 3,000 个 Token 的情况下,首 Token 延迟从 394ms 降至 28ms。
  4. 如何减少长输入打断其他请求的情况? 减少分块预填充(Chunked Prefill)的块大小,并确认引擎的默认行为(是否采用混合分块)。
  5. GPU 任务停止了,但 GPU 却处于闲置状态。为什么? 没有进行联合调度(Gang Scheduling),导致部分 Pod 获取了资源(死锁),或者通用资源(内存)不足导致处于 Pending 状态。
  6. 如何实现联合调度? Kueue 通过工作负载单位进行批准,Volcano 通过 Pod 组的最小数量进行控制。
  7. GPU 共享方式有哪些? 时间分片(无内存隔离)、MIG(硬件分片,需受支持的 GPU)、软件方式(拦截调用)。
  8. 容器无法启动。CUDA 镜像和驱动怎么处理? 容器中的 CUDA 版本不能超过宿主机驱动的上限。
  9. 服务网格的延迟开销是多少? 在此环境中,每个请求约有 2.2ms 的开销,其中加密约占 8%。
  10. 在服务多个 LoRA 适配器时需要注意什么? 同时使用的适配器数量与槽位数量。如果槽位不足,吞吐量将减半。
  11. 对权重进行加密可以保护什么? 存储泄露和篡改。无法防止运行时的内存泄露。
  12. 如果在 Operator 中漏掉了事件会发生什么? 基于状态电平(Level-triggered)的调谐会重新读取当前状态进行匹配(由定时器或重新同步机制恢复)。
  13. 性能测试结果异常时首要做的事情是什么? 与硬件极限进行对比。

14. 本指南未涵盖的内容

参考:本指南所依据的文章

第 2 篇(混合 GPU 集群与网络)、第 3 篇(GPU Operator)、第 4 篇(LLM 推理与 vLLM)、第 5 篇(vLLM 与 SGLang)、第 6 篇(分布式推理)、第 7 篇(RDMA)、第 8 篇(存储与 KV 卸载)、第 9 篇(CRD 与 Operator)、第 10 篇(多租户调度)、第 11 篇(GPU 故障诊断)、第 13 篇(GPU 直通)、第 14 篇(vLLM 负载与 KV 缓存)、第 15 篇(LoRA 服务)、第 16 篇(权重保护)、第 17 篇(DCGM 指标)、第 18 篇(Cilium 指标)、第 21 篇(速度原理)。

确认日期

截至 2026-10-07。数据遵循各文章中的“确认的版本与日期”(vLLM 0.31.0、SGLang 0.5.21、Kueue 0.20.0、Volcano 1.15.3、LeaderWorkerSet 0.11.1 等)。

登录后即可点赞

评论

还没有评论。

登录后即可发表评论