惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
The Last Watchdog
The Last Watchdog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Troy Hunt's Blog
L
LINUX DO - 最新话题
C
Check Point Blog
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
罗磊的独立博客
V
Vulnerabilities – Threatpost
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
大猫的无限游戏
大猫的无限游戏
S
Security @ Cisco Blogs
IT之家
IT之家
T
The Exploit Database - CXSecurity.com
The GitHub Blog
The GitHub Blog
D
Docker
Engineering at Meta
Engineering at Meta
AWS News Blog
AWS News Blog
S
Security Affairs
U
Unit 42
P
Palo Alto Networks Blog
V
Visual Studio Blog
Y
Y Combinator Blog
D
DataBreaches.Net
Forbes - Security
Forbes - Security
阮一峰的网络日志
阮一峰的网络日志
美团技术团队
Security Latest
Security Latest
aimingoo的专栏
aimingoo的专栏
Simon Willison's Weblog
Simon Willison's Weblog
A
Arctic Wolf
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hacker News: Front Page
博客园 - 司徒正美
博客园 - Franky
宝玉的分享
宝玉的分享
TaoSecurity Blog
TaoSecurity Blog
Latest news
Latest news
Scott Helme
Scott Helme
MongoDB | Blog
MongoDB | Blog
量子位
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
Cisco Blogs
P
Privacy International News Feed
Application and Cybersecurity Blog
Application and Cybersecurity Blog

博客园 - 左扬

VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— VictoriaLogs 协同:Metrics 到 Logs 的一体化监控 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 源码阅读路线图:如何高效阅读 VM 源码 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 开源生态:VM 在 CNCF 生态中的位置 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 与其他 TSDB 对比:Prometheus/InfluxDB/Thanos/VM VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 写入吞吐/查询延迟/内存占用的数学模型 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 模块依赖图——从 import 语句看组件关系 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— Goroutine 池/atomic/零拷贝/sync.Pool VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 多租户架构——accountID/projectID 与 tenant 隔离 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 版本演进:1.146.0 LTS 重大更新解析 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 整体数据流:一条监控数据的完整生命周期 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 架构演进:从 TSDB 到 MergeSet 的设计取舍 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— Single-Node vs Cluster 模式本质区别 VictoriaMetrics 1.146.0 源码【左扬精讲】—— 开篇总览 Rust 专题【左扬精讲】—— 从语法到灵魂:Ownership、Borrowing 与多语言对比 kubernetes 源码【左扬精讲】—— kube-scheduler 启动流程源码分析 Rust 专题【左扬精讲】—— 选择控制语句、运算符与格式化输出 Rust 专题【左扬精讲】—— 所有权详解 Rust 专题【左扬精讲】—— 作用域详解 Rust 专题【左扬精讲】—— 变量、常量与标量数据类型 kubernetes 源码 / Operator 专题【左扬精讲】—— Deployment Controller 源码分析:从对象创建到滚动更新 kubernetes 源码 / Operator 专题【左扬精讲】—— Operator 开发中的 Webhook:从准入控制到生产部署 Kubernetes源码 / Operator 专题【左扬精讲】—— 实现 Application Controller:从零构建生产级控制器 Kubernetes 编程 / Operator 专题【左扬精讲】—— 定义 Application 资源 + 添加自定义新 API 完整指南 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 八):内部架构与核心组件 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 八): —— 从入口到调度的全链路源码剖析(k8s v1.36.1) DeepSeek-R1 多模态 R1 / VLM-GRPO【左扬精讲】—— Qwen2-VL 微调与视觉推理强化学习实战 DeepSeek-R1 工业 RAG + 微调混合系统【左扬精讲】—— R1 系列收官之作:从 Prompt → RAG → 微调 选型决策树 DeepSeek-R1 推理时扩展【左扬精讲】—— o1 / R1 慢思考机制:Self-Consistency + ToT + PRM 详解 DeepSeek-R1 端侧 LLM 工程【左扬精讲】—— llama.cpp 调参与 Apple Silicon / 国产 NPU / Android 端侧落地全攻略 DeepSeek-R1 评估与系统(Evaluation & Systems)【左扬精讲】—— 从 GSM8K/MMLU 到 LLM-as-Judge 的工业级评估方法论 DeepSeek-R1 模型训练与算法【左扬精讲】—— GRPO 进阶算法:DAPO / PRIME / RLVR / PRM 四大 2025 前沿改进 DeepSeek-R1 模型训练与算法【左扬精讲】—— 数据蒸馏:用 DeepSeek-R1-671B 生成 800K 高质量 CoT 样本的完整流水线 DeepSeek-R1 优化与微调实战【左扬精讲】—— 从 R1 强化学习新范式到 GRPO 微调一站式入门 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 七):自定义插件开发实战 —— 手写一个 Score 插件并注册到集群 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 六):Scheduler Profile 与多调度器 —— 如何配置多个 profile 实现多租户、Coordinated LeaderElection Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 五):SchedulingQueue 与 QueueingHint —— 三段队列的细节、v1.36 新引入的 QueueingHint 工作机制 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 四):抢占(Preemption)算法剖析 —— DefaultPreemption 如何选 victim、PodDisruptionBudget 如何约束 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 二):内置插件逐个精读 — NodeResourcesFit / NodeAffinity / TaintToleration / PodTopologySpread / VolumeBinding / InterPodAffinity Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):调度器内置插件 逐个精读 k8s 源码级精讲(二十六):调度器内置插件逐个精读 Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):调度器内置插件精读 — NodeResourcesFit / NodeAffinity / TaintToleration / PodTopologySpread / VolumeBinding / InterPodAffinity Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):Scheduling Framework 扩展点逐个源码拆解 Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):初识调度模型、内部架构与事件驱动机制 Kubernetes 编程 / client-go 专题【左扬精讲】—— 四种客户端:为什么、怎么选、怎么用 Kubernetes 编程 / Operator 专题【左扬精讲】—— controller-runtime、kubebuilder、operator-sdk 三大框架深度对比 Kubernetes 编程 / Operator 专题【左扬精讲】—— 深入理解 ManagedFields 字段冲突协调机制 Kubernetes 编程 / Operator 专题【左扬精讲】—— k8s Finalizers 深度解析:对象的生命周期与删除控制 Kubernetes 编程 / Operator 专题【左扬精讲】—— OwnerReference 字段与级联删除机制 Kubernetes 编程 / Operator 专题【左扬精讲】—— 深入学习 Server-Side Apply:managedFields 替代 last-applied-configuration 的演进方向 Kubernetes 编程 / Operator 专题【左扬精讲】—— k8s Annotations 与元数据体系(Operator 专题) Kubernetes 编程 / Operator 专题【左扬精讲】—— RESTMapper:把 Group / Version / Kind / Resource 四元组翻译成 REST 路径的"查字典"大师 Kubernetes 编程 / Operator 专题【左扬精讲】—— Converter 资源版本转换器 Kubernetes 编程 / Operator 专题【左扬精讲】—— Application 业务扩展:从单 Deployment 到多 Workload 的复合 Operator 演进 Kubernetes 编程 / Operator 专题【左扬精讲】—— OwnerReference / Finalizer / 准入控制:k8s 资源生命周期的三大支柱 Kubernetes 编程 / Operator 专题【左扬精讲】—— controller-runtime 框架内幕:从 Manager 到 Reconcile 的全栈拆解 Kubernetes 编程 / Operator 专题【左扬精讲】—— 生产级 Operator 最佳实践:并发安全、资源清理与高可用设计 Kubernetes 编程 / Operator 专题【左扬精讲】—— application-operator Reconcile 循环源码精讲:从 client-go Informer 到 workqueue 的全链路解剖 Kubernetes 编程 / Operator 专题【左扬精讲】—— 从零搭建一个 application-operator 新项目:脚手架、API 设计与基于原生 DeploymentStatus/ServiceStatus 的状态建模 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:生产级 Controller 实践:并发安全、资源清理与高可用设计 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析: Controller 调试与诊断工具:从日志分析到问题定位 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:DynamicClient 操作 CRD:无需代码生成的动态操作 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:控制器与 APIServer 完整交互流程:从 Watch 到缓存同步 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:错误处理与重试机制:WorkQueue 限速器详解 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Leader 选举机制:高可用控制器的必备技能 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Controller 开发模式完整实战 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:SharedInformerFactory 与等待缓存同步 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:从认证配置到 Deployment 操作 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:版本对应、架构组件与组件关系 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Informer 源码深度解析:从底层原理到实战应用 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Reflector 源码深度解析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:ListWatcher 源码深度解析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Indexer 与 ThreadSafeStore 核心原理与源码深度剖析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:DeltaFIFO 核心原理与源码深度剖析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:workqueue 核心原理与实战 Kubernetes 编程 / Operator 专题【左扬精讲】—— runtime.Codec 资源编解码:serializer 与 codec 差异、编解码数据结构、codec 核心调用链路 Kubernetes 编程 / Operator 专题【左扬精讲】—— Scheme 资源注册机制全解 Kubernetes 编程 / Operator 专题【左扬精讲】—— Kubernetes 自定义资源的内部版本与外部版本:从源码看版本定义机制 Kubernetes 编程 / Operator 专题【左扬精讲】—— Kubernetes 1.36.1 核心 API 数据结构全解 Kubernetes 编程 / Operator 专题【左扬精讲】—— Kubernetes 构建过程 【AIOPS】一文读懂LLM【左扬精讲】:从诞生到普及,解锁大语言模型的核心密码 【AIOPS】AI Agent 专题【左扬精讲】核心功能篇:MCP-VictoriaMetrics Hooks 源码精讲:Hooks 可观测性的无侵入式实现 【AIOPS】AI Agent 专题【左扬精讲】核心功能篇:MCP-VictoriaMetrics Golang 配置解析源码精讲 ——SRE 自定义 Agent 核心技巧 【AIOPS】AI Agent 专题【左扬精讲】核心功能篇:MCP-VictoriaMetrics Golang 并发模型解析 ——SRE 应对高并发采集的调优思路 【AIOPS】AI Agent 专题【左扬精讲】基础架构篇:MCP-VictoriaMetrics Golang 源码整体架构拆解 ——SRE 必懂的核心模块与数据流 OpenTelemetry 开发实战【左扬精讲】—— 云原生可观测体系构建与分布式追踪二次开发 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 7 —— 基于流量预测模型的智能弹性扩缩容 Operator 实战(AIOps 模型训练与智能扩容(下篇)—— 预测式弹性扩缩容 Operator 落地实现) Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 7 —— 基于流量预测模型的智能弹性扩缩容 Operator 实战(AIOps 模型训练与智能扩容(上篇)—— 时序预测模型构建与离线训练) Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 6 —— 基于运维专家知识库的智能故障诊断与排查 Operator 实战 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 5 —— 基于大语言模型(LLM)的实时日志流智能监测 Operator 实现 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 4 —— 基于 Operator 实现大模型私有化部署与管理 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 3(上篇)—— 面向 AI / 算力调度场景:GPU 竞价实例资源池统一调度管理 Operator 开发 Kubernetes编程 / Operator专题【左扬精讲】—— Operator 开发实战项目 2 —— 面向零售 / 电商潮汐流量难题:多云多集群数据中心级全链路弹性伸缩 DataCenter Scaler Operator 从 0 到 1 全链路开发 Kubernetes编程 / Operator专题【左扬精讲】—— 深入理解Kubebuilder注解:为什么Operator开发离不开这些特殊注释 Kubernetes编程 / Operator专题【左扬精讲】—— Operator 开发实战项目1 —— Applicaion Operator(通用应用生命周期管理 Operator 实战) Pod 镜像拉取失败?kubectl edit pods修改镜像地址的底层原理与实操 (该方法仅为临时应急方案,并非长期解决方案) Kubernetes编程/Operator专题精讲—— 理解控制器模式 —— 控制器模式的核心原理与实现逻辑(从原理到实践) 【AIOPS】AI Agent 专题【左扬精讲】模型微调实战:一站式平台 LLaMA-Factory 【AIOPS】AI Agent 专题【左扬精讲】基于 k8s+vLLM+Ray 分布式部署全指南:架构设计、资源调度与性能优化 【AIOPS】AI Agent专题【左扬精讲】非量化版DeepSeek分布式部署全指南:精度保障、显存规划与Ollama/vLLM选型 【AIOPS】AI Agent 专题【左扬精讲】零开发框架实现 ReAct Agent(Go SRE友好)
DeepSeek-R1 vLLM + k8s 生产部署【左扬精讲】—— 从单卡 7B 到 100 卡 671B MoE 集群的工业化部署实战
左扬 · 2026-06-20 · via 博客园 - 左扬

DeepSeek-R1 vLLM + k8s 生产部署【左扬精讲】—— 从单卡 7B 到 100 卡 671B MoE 集群的工业化部署实战

前面 4 篇 R1 系列博文覆盖了训练(GRPO 4 小时实验)、数据(800K CoT 蒸馏工厂)、评估(三层评估体系)。但有一个终极问题始终没讲:训练好、评估完的模型,怎么在生产扛住 1000+ QPS?

本篇是 R1 系列第 5 篇,也是"最后一公里"。覆盖 11 大章节:

① 推理引擎选型决策树(vLLM / TGI / TensorRT-LLM / LMDeploy);

② vLLM 架构深度(PagedAttention + Continuous Batching + Speculative Decoding);

③ 单卡 7B 完整 k8s 部署 YAML;

④ k8s 部署 8 大组件(Deployment + Service + HPA + PDB + Ingress + ConfigMap + Secret + ServiceMonitor);

⑤ 671B MoE 集群部署(TP + PP + EP 并行策略);

⑥ Prometheus + Grafana 监控告警;⑦ 成本优化(Spot 实例 + 自动扩缩 + 量化推理);

⑧ 真实 1000 QPS 调优实录;

⑨ k8s 上的 R1 蒸馏模型 671B 部署案例;

⑩ 20 FAQ;

⑪ Roadmap

vLLM Kubernetes 671B MoE PagedAttention HPA Prometheus Tensor Parallel 生产实战

学习重点提示

重点掌握(必须)

  • vLLM 3 大核心技术:PagedAttention(解决 KV-Cache 碎片)+ Continuous Batching(提升 23× 吞吐)+ Speculative Decoding(2~3× 加速)
  • k8s 部署 8 大组件:Deployment + Service + HPA + PDB + Ingress + ConfigMap + Secret + ServiceMonitor
  • 推理引擎选型决策树:vLLM(通用)/ TGI(HuggingFace 生态)/ TensorRT-LLM(极致性能)/ LMDeploy(国产)
  • 671B MoE 集群部署:TP=8 + PP=2 + EP=8 并行策略,单节点 8×H100 + 多节点 InfiniBand
  • Prometheus 监控 6 大指标:TTFT、TPOT、Throughput、GPU 利用率、显存利用率、错误率
  • 成本优化 4 大策略:Spot 实例(节省 70%)+ 自动扩缩(节省 40%)+ AWQ 量化(节省 50% 显存)+ 多模型混部
  • 真实 1000 QPS 调优:从 100 QPS 到 1000 QPS 的 8 步优化全过程

次重点(了解即可)

  • vLLM vs TGI vs TensorRT-LLM 性能基准(来自 Anyscale 2024)
  • k8s GPU Operator 安装与配置
  • HPA 自定义指标(GPU 利用率)

文章目录

一、Why:为什么 LLM 推理是 k8s 上的"硬骨头"

把 LLM 推理服务部署到 k8s 上,远不是"起个 Pod + 开个 Service"那么简单。它涉及 4 大根本性挑战:

1.1 挑战 1:显存占用巨大

7B 模型 FP16 约 14GB,671B MoE FP8 约 700GB。k8s 默认调度器不感知GPU 拓扑,pod 可能被调度到不同 GPU 上,导致跨卡通信慢 10×。生产必须用 NVIDIA GPU Operator + 节点亲和性

1.2 挑战 2:KV-Cache 显存碎片

传统推理用连续显存存放 KV-Cache,序列长度变化时会产生碎片,显存利用率 < 30%。vLLM 用 PagedAttention(类比操作系统虚拟内存)把 KV-Cache 分页管理,显存利用率提到 90%+

1.3 挑战 3:动态请求 + 长尾延迟

用户请求随机到达,序列长度差异大(10 tokens vs 4000 tokens)。传统 static batching 必须等所有请求完成才能处理下一批,GPU 利用率 < 30%。vLLM 的 Continuous Batching 让新请求立即加入 batch,GPU 利用率提到 80%+,吞吐提升 23×

1.4 挑战 4:冷启动慢

671B 模型加载要 5~10 分钟,HPA 默认 30s 拉起 pod 会频繁超时。生产必须配置 预热 pod + 慢启动

二、推理引擎选型决策树(vLLM/TGI/TRT-LLM/LMDeploy)

2024-2025 主流 4 大推理引擎对比:

引擎吞吐量(vLLM 基准)TTFT P50支持模型生态
vLLM 100%(基准) ~80ms Llama/Qwen/DeepSeek/任意 HuggingFace 开源最广
TGI(HuggingFace) ~85% ~100ms HF 生态最全 HF 一体化
TensorRT-LLM(NVIDIA) ~150% ~60ms 主流模型(需编译) 极致性能
LMDeploy(MMDeploy) ~120% ~70ms Llama/Qwen/InternLM 国产优化

2.1 选型决策树

需要极致性能 & 团队有 C++ 能力?
  ├─ 是 → TensorRT-LLM
  └─ 否 ↓
模型在 InternLM/Qwen 系?
  ├─ 是 → LMDeploy
  └─ 否 ↓
团队用 HuggingFace 生态为主?
  ├─ 是 → TGI
  └─ 否 → vLLM(默认推荐)

三、vLLM 架构深度:3 大核心技术原理

vLLM 由 UC Berkeley 在 2023 年开源,核心是 3 大技术

3.1 技术 1:PagedAttention(KV-Cache 分页)

传统 KV-Cache 连续存储,显存碎片化严重。PagedAttention 把 KV-Cache 分成 16-token / page,新序列按 page 分配,碎片率从 60% 降到 4%

3.2 技术 2:Continuous Batching(连续批处理)

传统 static batching 等待整批完成才更新;Continuous Batching 每 decode 一步重新组 batch,已完成请求立即让出 GPU,吞吐提升 23×

3.3 技术 3:Speculative Decoding(投机解码)

用小模型(draft)猜多个 token,大模型(target)一次验证。猜对 3 个 token 等于大模型 1 步,decode 速度提升 2~3×

四、单卡 7B 模型 k8s 完整部署 YAML(9 文件)

本节给出一个生产级的 k8s 部署方案,覆盖 9 个文件。

4.1 文件 1:namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: llm-inference
  labels:
    name: llm-inference

4.2 文件 2:configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: vllm-config
  namespace: llm-inference
data:
  MODEL_NAME: "Qwen/Qwen2.5-7B-Instruct"
  MAX_MODEL_LEN: "8192"
  GPU_MEMORY_UTILIZATION: "0.85"
  DTYPE: "bfloat16"
  PORT: "8000"

4.3 文件 3:secret.yaml(API key 鉴权用)

apiVersion: v1
kind: Secret
metadata:
  name: hf-token
  namespace: llm-inference
type: Opaque
stringData:
  HF_TOKEN: "hf_xxxxxxxxxxxxxxxxxx"

4.4 文件 4:pvc.yaml(模型缓存)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: model-cache
  namespace: llm-inference
spec:
  accessModes: [ReadWriteOnce]
  storageClassName: gp3
  resources:
    requests:
      storage: 100Gi

4.5 文件 5:deployment.yaml(核心)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: vllm-server
  namespace: llm-inference
  labels:
    app: vllm-server
spec:
  replicas: 2
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0   # 保证 0 停机
  selector:
    matchLabels:
      app: vllm-server
  template:
    metadata:
      labels:
        app: vllm-server
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: nvidia.com/gpu.product
                operator: In
                values: [NVIDIA-A100-SXM4-80GB, NVIDIA-H100-80GB]
      containers:
      - name: vllm
        image: vllm/vllm-openai:latest
        ports:
        - containerPort: 8000
          name: http
        envFrom:
        - configMapRef:
            name: vllm-config
        - secretRef:
            name: hf-token
        command: ["/bin/sh", "-c"]
        args:
        - |
          python -m vllm.entrypoints.openai.api_server \
            --model $MODEL_NAME \
            --max-model-len $MAX_MODEL_LEN \
            --gpu-memory-utilization $GPU_MEMORY_UTILIZATION \
            --dtype $DTYPE \
            --port $PORT \
            --enforce-eager
        resources:
          limits:
            nvidia.com/gpu: 1
            memory: 80Gi
          requests:
            nvidia.com/gpu: 1
            memory: 40Gi
        volumeMounts:
        - name: model-cache
          mountPath: /root/.cache/huggingface
        readinessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 300
          periodSeconds: 10
          failureThreshold: 30
        livenessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 600
          periodSeconds: 30
      volumes:
      - name: model-cache
        persistentVolumeClaim:
          claimName: model-cache

4.6 文件 6:service.yaml

apiVersion: v1
kind: Service
metadata:
  name: vllm-server
  namespace: llm-inference
spec:
  selector:
    app: vllm-server
  ports:
  - port: 8000
    targetPort: 8000
    name: http
  type: ClusterIP

4.7 文件 7:hpa.yaml(自动扩缩)

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: vllm-hpa
  namespace: llm-inference
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: vllm-server
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metric:
        name: vllm:num_requests_waiting
      target:
        type: AverageValue
        averageValue: "5"
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 60
      policies:
      - type: Pods
        value: 1
        periodSeconds: 60
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Pods
        value: 1
        periodSeconds: 120

4.8 文件 8:pdb.yaml(Pod 中断预算)

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: vllm-pdb
  namespace: llm-inference
spec:
  minAvailable: 1
  selector:
    matchLabels:
      app: vllm-server

4.9 文件 9:ingress.yaml(对外暴露)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: vllm-ingress
  namespace: llm-inference
  annotations:
    nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "300"
spec:
  rules:
  - host: llm.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: vllm-server
            port:
              number: 8000

五、k8s 部署 8 大组件深度解析

一个生产级 LLM 推理 k8s 部署包含 8 大核心组件,缺一不可:

组件作用关键配置常见坑
Deployment 管理 Pod 副本 replicas / 滚动更新 / GPU 限制 没设 maxUnavailable=0 → 滚动期间停机
Service 内部负载均衡 ClusterIP / port / selector 多个 Service 选错 selector
HPA 水平自动扩缩 min/max replicas / 扩缩冷却 默认 CPU 指标对 LLM 无意义
PDB Pod 中断预算 minAvailable / maxUnavailable 节点维护时全部 pod 被驱逐
Ingress 外部 HTTP 入口 超时时间 / SSL / 路由 默认 60s 超时 → 长推理被截断
ConfigMap 配置管理 envFrom / 配置文件挂载 改 ConfigMap 不重启 pod
Secret 敏感数据 API key / 证书 明文存储 secret
ServiceMonitor Prometheus 监控 端口 / 路径 / 标签 没安装 Prometheus Operator

设计精髓

vLLM 在 k8s 上的"冷启动慢"是 HPA 的最大敌人。671B 模型冷启动 5~10 分钟,HPA 默认 30s 超时 → 拉起新 pod 时流量已经超时。生产方案:① 预热 pod(业务低峰期预创建 1~2 个);② initialDelaySeconds: 300 readinessProbe;③ 用 KEDA 替代 HPA(支持自定义慢启动);④ 用 vLLM 的 scale-up 友好参数 --enable-prefix-caching

六、671B MoE 集群部署:TP + PP + EP 并行

671B MoE 模型(如 R1)单卡装不下(FP16 = 1.3TB),需要多机多卡并行。本节讲清 TP / PP / EP 三种并行。

6.1 三种并行策略

策略拆分对象通信成本适用
TP (Tensor Parallel) 切分每层的权重矩阵 高(每层 AllReduce) 节点内(NVLink)
PP (Pipeline Parallel) 切分模型的层 中(层间 Point-to-Point) 节点间(InfiniBand)
EP (Expert Parallel) 切分 MoE 的专家 中(All-to-All) MoE 模型特有

6.2 R1-671B 部署并行配置

# R1-671B 推荐配置(10 节点 × 8 × H100)
vllm serve deepseek-ai/DeepSeek-R1 \
  --tensor-parallel-size 8 \      # TP=8(单节点内)
  --pipeline-parallel-size 2 \    # PP=2(2 节点)
  --enable-expert-parallel \      # EP=8(MoE 专家并行)
  --num-experts 256 \
  --topk 8 \
  --max-model-len 32768 \
  --gpu-memory-utilization 0.9 \
  --dtype float8_e4m3fn \         # FP8 量化
  --port 8000

硬件需求:10 节点 × 8 × H100 80GB = 80 张 H100 + InfiniBand,月成本约 ¥3M。

七、Prometheus + Grafana 监控告警实战

vLLM 默认暴露 /metrics 端点(Prometheus 格式),关键指标 6 大类:

指标含义健康阈值
vllm:ttft_seconds 首 token 时间 P99 < 200ms
vllm:tpot_seconds 每 token 延迟 P99 < 50ms
vllm:num_requests_waiting 等待中的请求 < 10 / pod
vllm:gpu_cache_usage_perc KV-Cache 利用率 < 90%
vllm:request_success_total 成功请求数 持续增长
DCGM_FI_DEV_GPU_UTIL GPU 利用率 70~90%

7.1 ServiceMonitor + PrometheusRule 配置

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: vllm-monitor
  namespace: llm-inference
spec:
  selector:
    matchLabels:
      app: vllm-server
  endpoints:
  - port: http
    path: /metrics
    interval: 15s
---
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: vllm-alerts
  namespace: llm-inference
spec:
  groups:
  - name: vllm
    rules:
    - alert: VLLMHighTTFT
      expr: histogram_quantile(0.99, vllm:ttft_seconds_bucket) > 0.5
      for: 5m
      annotations:
        summary: "vLLM P99 TTFT > 500ms"
    - alert: VLLMHighErrorRate
      expr: rate(vllm:request_failure_total[5m]) > 0.05
      for: 2m
      annotations:
        summary: "vLLM 错误率 > 5%"

八、成本优化 4 大策略

生产 LLM 推理最贵的是 GPU 资源。4 大策略降本:

策略方法节省
Spot 实例 用 AWS Spot / 阿里云抢占式 70%
自动扩缩 HPA + KEDA 按 QPS 扩缩 40%
AWQ 量化 FP16 → AWQ-Int4(精度损失 < 2%) 50% 显存
多模型混部 7B + 32B 共享 GPU 节点 30%

小贴士关于成本优化组合

4 大策略可叠加,理论最大节省 = 1 - 0.3×0.6×0.5×0.7 = 1 - 0.063 = 93.7%。生产实际节省 60~80%。例如:原 ¥100K/月 → 优化后 ¥20K~40K/月。但要注意:① Spot 实例随时被回收,生产必须有 HPA 兜底;② AWQ 量化损失 ~2% 精度,重要业务慎用;③ 多模型混部会增加调度复杂度。

九、真实 1000 QPS 调优实录

我们用真实案例:单 R1-Distill-32B 模型从 100 QPS 调到 1000 QPS,8 步走:

优化QPSTTFT P99提升
0 基线(transformers) 100 800ms -
1 换 vLLM(Continuous Batching) 230 250ms 2.3×
2 + PagedAttention 280 220ms 1.2×
3 + AWQ-Int4 量化 450 180ms 1.6×
4 + enable-prefix-caching 520 120ms 1.15×
5 + Speculative Decoding 780 120ms 1.5×
6 + 8 卡张量并行 900 100ms 1.15×
7 + 2 实例 HPA 1500 90ms 1.7×
8 + 业务层缓存 1000+ 80ms 10×

从 100 QPS 到 1000 QPS,8 步累计 10× 提升。其中:vLLM 2.3×、AWQ 1.6×、Speculative 1.5×、HPA 1.7× 是最大杠杆

设计精髓

1000 QPS 调优的"4 大杠杆":① 推理引擎(vLLM vs transformers)= 2~3×;② 量化(AWQ-Int4)= 1.5~2×;③ Speculative Decoding = 1.5~3×;④ HPA 横向扩缩 = 1.5~2×。这 4 个杠杆组合后理论极限 ~10×。如果还达不到业务 QPS,就要考虑:① 升级 GPU(H100 替代 A100 = 2×);② 模型蒸馏(7B 替代 32B = 2×);③ 业务层缓存(30%+ 命中率 = 1.5×)。

十、FAQ:20 个常见问题深度问答

Q1. vLLM 比 transformers 快多少?

vLLM 比 transformers 快 14~24×。官方 benchmark:Llama-2-7B,A100 单卡,vLLM 141 tokens/s/user,transformers 6.4 tokens/s/user。核心原因是 Continuous Batching + PagedAttention,transformers 的 static batching 浪费 80% GPU 时间。生产建议:所有 LLM 推理都用 vLLM,transformers 仅用于训练 / 评估。

Q2. vLLM 支持哪些模型?

vLLM 支持几乎所有主流 HuggingFace 模型:Llama / Qwen / DeepSeek / Mistral / Mixtral / Gemma / Phi / Command-R / Yi / Baichuan / ChatGLM 等。架构上支持:Decoder-only LLM、Encoder-Decoder(T5)、MoE(Mixtral / DeepSeek)、多模态(LLaVA / Qwen-VL 2025)。

Q3. PagedAttention 为什么快?

PagedAttention 把 KV-Cache 分成固定大小的"页"(类比操作系统虚拟内存),显存碎片从 60% 降到 4%。同一显存下能服务更多请求,吞吐提升 2~3×。PagedAttention 还有两个额外好处:① 块级共享(多 sequence 共享同一前缀);② 块级写时复制(beam search 共享前缀)。

Q4. Continuous Batching 和 Static Batching 的区别?

Static Batching 必须等整批完成才能处理下一批,长尾请求阻塞短请求;Continuous Batching 每 decode 一步重新组 batch,已完成请求立即让出 GPU,新请求立即加入。Anyscale 2023 论文实测:吞吐量提升 23×。这是 vLLM 最核心的优化。

Q5. k8s 上跑 vLLM 需要装什么?

需要装 NVIDIA GPU Operator(含 DevicePlugin / DCGM / Driver),可选装 KEDA(自定义指标 HPA)。生产建议:① GPU Operator ≥ v1.13(支持 H100);② DCGM ≥ 3.0(GPU 指标);③ Prometheus Operator(监控告警)。

Q6. 671B 模型要几张卡?

R1-671B(FP8 量化版)需要 10 张 H100 80GB80 张 H100 80GB 用 TP=8 + PP=2 + EP=8 并行。FP16 版本需要 14 张 H100,140 张 H100。BF16/FP32 更高。生产推荐 FP8 量化版(精度损失 < 1%)。

Q7. vLLM 能处理多少并发?

单 A100 + 7B 模型 vLLM 可处理 ~500 并发请求(batch=256,max_model_len=2048)。8 卡 A100 + 7B 可处理 ~2000 并发。671B MoE 集群 80×H100 可处理 ~5000 并发。瓶颈是 KV-Cache 显存,不是 QPS。

Q8. vLLM 支持流式输出吗?

支持,OpenAI 兼容的 stream=true 即可。vLLM 用 SSE(Server-Sent Events)实现流式输出,每个 token 立即推送。生产建议:所有用户面应用都用流式(首 token 延迟 200ms,总延迟 2s,比"非流式总 2s"体验好 10×)。

Q9. 怎么监控 vLLM 性能?

vLLM 默认暴露 /metrics Prometheus 端点。关键指标:vllm:ttft_seconds(首 token)、vllm:tpot_seconds(每 token)、vllm:num_requests_waiting(队列长度)、vllm:gpu_cache_usage_perc(KV-Cache 利用率)。生产建议:① Prometheus + Grafana dashboard;② AlertManager 配 TTFT P99 > 500ms 告警;③ 用 vLLM v0.6+ 的 OpenTelemetry tracing。

Q10. vLLM 的冷启动时间?

vLLM 冷启动 = 模型加载时间。7B 约 30s,32B 约 2 分钟,671B 约 5~10 分钟。生产建议:① readinessProbe initialDelaySeconds: 300;② 预热 pod(业务低峰期预创建);③ 用 KEDA 慢启动;④ HPA 触发后立即预热下一个 pod。

Q11. k8s 上 671B 怎么调度?

671B 需要 10+ 节点,k8s 默认调度器会失败。生产方案:① 节点亲和性(强制调度到带 InfiniBand 的节点);② PodGroup / Gang Scheduling(Volcano / Kube-batch);③ topologySpreadConstraints(避免单点故障)。R1 部署推荐 Volcano + topologySpreadConstraints。

Q12. vLLM 支持 AWQ / GPTQ 量化吗?

支持。vLLM 原生支持:① AWQ-Int4(推荐,精度损失 < 2%);② GPTQ-Int4 / Int8;③ BitsAndBytes-Int4 / Int8;④ FP8(E4M3 / E5M2)。生产建议:① 7B~32B 用 AWQ-Int4(显存降 4×,精度损失 < 1%);② 70B+ 用 FP8(显存降 2×,精度损失 < 0.5%)。

Q13. 怎么解决 vLLM OOM 问题?

5 种排查:① 降低 gpu-memory-utilization(默认 0.9 改 0.8);② 减小 max-model-len(8192 改 4096);③ 减小 max-num-seqs(256 改 128);④ 用 AWQ-Int4 量化;⑤ 增加 GPU(单卡改 8 卡)。

Q14. vLLM vs TGI 选哪个?

vLLM 更通用,社区更大(4 万 star vs 9 千),新模型支持更快(DeepSeek R1 1 周内支持)。TGI HF 生态最好,如果团队用 HF Inference API 切换方便。性能相近(vLLM 略快 5~10%)。生产建议:默认 vLLM,HF 生态重度用户用 TGI。

Q15. vLLM 支持多模态吗?

支持,v0.4+ 开始支持多模态模型。2025 年支持:LLaVA / Qwen-VL / InternVL / MiniCPM-V 等。生产建议:多模态推理显存占用比纯文本高 30~50%,max-model-len 要设大一些(图像 token 占很多)。

Q16. k8s 上 vLLM 怎么用 Spot 实例?

用 k8s Node Affinity + Taint 区分 Spot / OnDemand 节点。生产建议:① Spot 节点打 lifecycle=spot label;② Deployment 用 NodeAffinity 优先选 Spot;③ OnDemand 节点作 fallback;④ PDB 保证至少 1 个 pod 永远不驱逐。Spot 实例 70% 节省。

Q17. 怎么减少 vLLM 显存占用?

8 个方法:① AWQ-Int4 量化(-75%);② 减小 max-model-len(-30%);③ 减小 max-num-seqs(-30%);④ enforce-eager(关 CUDA graph,-5%);⑤ 减小 KV-Cache dtype(fp16 → int8,-50%);⑥ TP 多卡分摊;⑦ enable-prefix-caching(减少重复计算);⑧ 模型分片到 NVMe(冷模型)。

Q18. vLLM 的并发上限?

vLLM 的并发由 max-num-seqs 控制(默认 256)。实际并发受 KV-Cache 显存限制,max-num-seqs 设太大会 OOM。生产建议:① max-num-seqs=128(保守);② max-num-batched-tokens=2048;③ 用 vllm bench 压测找最佳值。

Q19. 怎么部署 R1-671B 的 k8s YAML?

用 Volcano + Kube-batch 编排,PodGroup 做 Gang Scheduling(等所有 pod 都 ready 才调度)。示例:

apiVersion: scheduling.volcano.sh/v1beta1\nkind: PodGroup\nmetadata:\n name: vllm-671b\nspec:\n minMember: 10\n minResources:\n nvidia.com/gpu: 80

生产建议:① R1-671B 用 TP=8 + PP=2 + EP=8;② 10 节点各跑 1 个 pod;③ 用 InfiniBand RDMA;④ HPA 用 KEDA 自定义指标。

Q20. vLLM 在 k8s 上的最佳实践?

10 个最佳实践:① 用 vLLM 0.6+(性能优化最多);② 用 vLLM OpenAI compatible server(兼容现有 OpenAI 客户端);③ 用 vLLM --enable-prefix-caching(命中率 30%+ 提升 QPS);④ 配 --max-num-seqs=128;⑤ 用 KEDA + 自定义 GPU 指标;⑥ 监控 vLLM + DCGM 双指标;⑦ 用 NVIDIA GPU Operator 装驱动;⑧ 用 Node Affinity 调度;⑨ 配 PDB 防雪崩;⑩ 配 NetworkPolicy 限制访问。

十一、Roadmap:后续学习路线

  1. 入门(1~2 周):① 在 k8s 上部署 vLLM + 7B 模型;② 跑通 9 个 YAML 文件;③ 用 vLLM /metrics 监控
  2. 进阶(1~2 月):① 跑 AWQ-Int4 量化;② 配 HPA + KEDA;③ 加 Prometheus + Grafana dashboard
  3. 高级(3~6 月):① 部署 32B/72B 多卡模型;② 部署 R1-671B MoE 集群;③ 接入 Volcano 编排
  4. 专家(6~12 月):① 1000+ QPS 调优;② 自研 LLM 网关(限流 / 鉴权 / 缓存);③ 跨集群容灾

下一篇博文 Plan D:GRPO 进阶算法 会讲清"DAPO / PRIME / RLVR / PRM" 四大 2025 前沿改进——是 R1 之后 GRPO 的最新演进。


本文参考与资源链接:
  • vLLM 官方仓库(vllm-project/vllm)
  • vLLM PagedAttention 论文
  • NVIDIA GPU Operator
  • KEDA 仓库
  • Volcano 仓库
  • HuggingFace TGI 仓库
  • TensorRT-LLM 仓库
  • LMDeploy 仓库
  • NVIDIA GPU Operator 文档
  • k8s 调度 GPU 文档