Part 8 · 生产部署与系统设计¶
从一个能跑的引擎,到一个生产服务——再到答好系统设计面试。
本 Part 覆盖¶
- HTTP 服务化:OpenAI 兼容 server、压测找并发 knee、以及跨多实例的路由 / 自动扩缩 / KV 感知路由
- 可观测性与 profiling 及 SLO 调优;框架取舍——TensorRT-LLM / TGI / SGLang / LMDeploy——在选型题上有观点
- 容量规划:给定模型 + 硬件估 VRAM / 吞吐
- 系统设计演练:「为 X QPS、Y 延迟设计推理服务」
Capstone 会把这里的一切在单张 4090 上串起来。
课程¶
- 用 HTTP 服务化 vLLM:OpenAI 兼容 server ——
vllm serve把引擎核心包进一层薄 FastAPI 前端、说 OpenAI API,任何 OpenAI client 改一行base_url就能重定向。讲 endpoints(/v1/chat/completions套 chat template、/v1/completions纯文本、/v1/models列服务 id + LoRA adapter、/health是存活性 200/503、/metrics是 Prometheus 数据源)、鉴权(--api-key/VLLM_API_KEY,可重复以轮换)、流式(SSE),以及为何接口旋钮(--port/--served-model-name)与设天花板的容量旋钮(--max-num-seqs/--gpu-memory-utilization)相互独立——均在 vLLM 0.26.0 上核实。 - 压测找并发拐点(knee) —— knee 是单实例 batch 填满、
vllm:num_requests_waiting离开零往上爬之处;由 Little 定律(\(L=\lambda W\)),把到达率推过最大完成率会让队列与延迟失控。你靠把vllm bench serve --request-rate往上扫(开环 Poisson 到达——不是--request-rate inf、不是闭环--max-concurrency)找到它,按 SLO 读 p99 TTFT/E2EL 与 goodput,把最后一个仍通过的档作为实例诚实容量报告。 - 路由、自动扩缩与 KV 感知路由(多实例) —— 过了一个实例的 knee,你扩到 N 个独立副本、挂在一个 router 后;让它变好的两个决定是 KV 感知(前缀感知)路由(缓存是每实例的,所以 round-robin 会重 prefill 共享 prompt)与按队列自动扩缩(
vllm:num_requests_waiting,不是 GPU 利用率),并处理好冷启动滞后与「缩容前排空」。vLLM 把它作为 production stack 发布(Helm:前缀感知 + 模型感知 router、引擎 pod、LMCache KV offload);SkyPilot 按target_qps_per_replica自动扩缩。 - 可观测性与 profiling:指标、trace 与 kernel 时间线 —— 生产调试的三个缩放层级:指标(Prometheus
/metrics——num_requests_waiting、gpu_cache_usage_perc、TTFT / prefill-time / decode-time 直方图、request_success_total{finished_reason};自带 Grafana 仪表盘)来检测;OpenTelemetry trace(span 经 OTLP 到 Jaeger)来定位某一段;以及 PyTorch profiler(--profiler-config+/start_profile//stop_profile)或 Nsight Systems(nsys … --capture-range=cudaProfilerApi)来在 kernel 层解释它——先便宜层,profiling 是按需手术刀。 - SLO 驱动调优:从指标到调优闭环 —— 锚在 SLO 上的调优:以 goodput(满足 SLO 的吞吐)给每个配置打分,从
/metrics读绑定约束(队列 → 加副本;prefill →--max-num-batched-tokens/ prefix caching;decode →--max-num-seqs/ 量化 / 投机解码;KV →--gpu-memory-utilization/--max-model-len),拧那一个对症旋钮、重测、走平就停——一次一个旋钮、对着类生产 workload。 - 服务生态:vLLM vs TensorRT-LLM / TGI / SGLang / LMDeploy —— 没有全局第一:一个共享基线(continuous batching、paged KV、prefix caching、OpenAI 兼容 API)与少数分歧轴——vLLM 主打广度/速度/硬件灵活(默认),TensorRT-LLM 靠提前编译引擎主打 NVIDIA 峰值延迟,TGI 主打 HuggingFace 原生生产,SGLang 主打共享前缀/结构化/agentic(RadixAttention),LMDeploy 主打 TurboMind + weight-only 量化。把选型答成 「默认 X,当约束 Z 时切到 Y」,并靠在你自己 workload 上、你 SLO 下 OpenAI 兼容地压测来定夺。
- 容量规划:从一张卡的吞吐到一个集群 —— 每道系统设计面试开场的草稿纸算术:单实例容量是
min(装得下, 跑得快)——显存闸(并发)与速度闸(decode 由带宽决定的 TPOT 地板与它测出的 knee 吞吐)。把 knee 换成 req/s(\(r_{\text{inst}} = T_{\text{out}}/\bar{o}\)),再定集群 \(N_{\text{inst}}=\lceil \lambda_{\text{peak}}/(\rho\,r_{\text{inst}})\rceil\)、\(N_{\text{GPU}}=N_{\text{inst}}\times\text{TP}\)——按峰值 + 余量定,且先由「SLO 是否越过 TPOT 地板」把关。通往系统设计长题的桥。
Part 8 完成
七节课全部就位——OpenAI 兼容 server、压测找 knee、路由 / 自动扩缩;可观测性与 profiling、SLO 驱动调优、服务生态对比;以及容量规划 + 系统设计——各自与其面试题双向链接,最后一节还连到一组系统设计长题。所有 vLLM flag/API 均经 Context7 核实(ADR-0004);基线是 vLLM 0.26.0,一切性能数字均为示例 / 量级参考。下一站:Capstone。见 术语表 与 面试题库。