系统设计 Lab
实时 model serving 是一道 throughput 对 tail latency 的权衡题:batching 和 GPU 买来容量,但每一分收益都要从你的 p99 预算里掏。
调节请求速率、单请求的 model latency、batch window、host 多少 replica 和多少 model,以及你的 p99 目标。开关 dynamic batching 和 GPU acceleration。架构会从单个 model endpoint,演进到 dynamic batching、GPU 加持的 autoscaling replica、带 canary rollout 的 model registry,最终到高 throughput 下的多 model packing。
分步讲解
一步一步把它想清楚
要点
常规演进场景
从左到右点击,就是预设的演示路径。每张卡片都会改变 workload 输入。
推荐形态
瓶颈
为什么会变
决策权衡
有出处支撑的规则
这些是模型背后那些经得起时间考验的 system design 论断。而 slider 的具体阈值,则被刻意标注为教学用的假设。
Dynamic batching 用 latency 换 accelerator throughput
Triton 在一个可配置的延迟内把单个 inference 请求合并成一个 batch,让 GPU 每次 kernel launch 处理很多请求,以增加排队延迟为代价换来更高 throughput。
NVIDIA Triton Inference Serverserving 系统应该给 model 做版本管理,并在一个稳定的名字背后对外服务
TF Serving 从 registry/model store 加载带版本的 model artifact,能同时服务一个 model 的多个版本,于是流量可以在版本间迁移而不必重新部署 server。
TensorFlow ServingKServe 为 inference 提供 canary rollout 和 autoscaling
KServe 暴露一个 model-serving 控制面,带 traffic splitting 做 canary rollout,以及请求驱动的 autoscaling(可缩到 0 也可从 0 拉起),让 replica 跟随负载。
KServe决定交互式 serving SLA 的是 tail latency,不是均值
在 fan-out 和高 throughput 的系统里,第 99 百分位的响应时间主导了用户可感知的延迟,所以容量和 batching 要按 p99 来定规模,而不是平均延迟。
The Tail at Scale (Dean & Barroso)教学用假设
- 单 replica 容量是教学近似:CPU 维持一个小的固定 ops/s,一个 GPU replica 清理掉数倍的工作量,而 batching 只有在流量并发到足以填满一个 batch 时才会成倍提升 throughput。batch 增益随 window 和 model latency 一起上升,因为更重的 model 每次 batch 调用能 amortize 掉更多 kernel-launch 和内存传输开销。
- p99 被建模为 model 计算时间 + batch window + 一个随 utilization 逼近饱和而增长的排队惩罚;惩罚再除以一个关于 replica 数的平方根人力配置因子,用 M/M/c 而非 M/M/1 来近似,于是把同样的负载摊到更多 replica 上真的能压低 tail。真实的 tail 还取决于 GC、padding 和 cold start。
- host 很多 model 被处理为:一旦 distinct model 超出单个 replica 能无抖动 hot-load 的数量,就需要更多 replica 或 model packing。