一、项目全景与架构设计:vLLM推理服务在K8s上的整体架构、组件介绍、技术选型分析
说实话,我第一次在K8s上部署大模型推理服务时,踩了不少坑。那时候vLLM还没这么火,我用的是Triton Inference Server,配置起来那叫一个复杂。后来vLLM出来了,我第一时间就试了——嗯,真香。今天咱们就来聊聊,怎么把vLLM推理服务稳稳地跑在K8s上。
1.1 整体架构:一张图看懂
先别急着看代码,咱们先把架构理清楚。我个人习惯,做任何项目前先画架构图。下面这张图,就是我总结的vLLM推理服务在K8s上的标准架构。
你看,整个架构分四层。用户层负责接收请求,入口层做负载均衡,服务层管理Pod的生命周期,计算层才是真正跑模型的地方。说白了,这就是一个标准的微服务架构,只不过计算层换成了GPU推理。
1.2 核心组件介绍
咱们一个一个来看这些组件。我挑几个重点讲,其他的你查文档就行。
1.2.1 vLLM推理引擎
vLLM的核心优势是什么?PagedAttention。这玩意儿解决了大模型推理时显存碎片化的问题。我在项目中遇到过,用普通的HuggingFace Transformers跑LLaMA-13B,显存占用直接飙到40GB+,但换成vLLM后,同样的模型只用了28GB。你想想看,这省下来的显存能多跑多少个并发请求?
vLLM关键特性:
- PagedAttention 显存管理:动态分配KV Cache,显存利用率提升4倍
- 连续批处理:同一个GPU上同时处理多个请求,吞吐量翻倍
- 支持多种量化:GPTQ、AWQ、SqueezeLLM,显存不够时用4bit量化
- 兼容OpenAI API格式:客户端迁移成本几乎为零
1.2.2 Kubernetes核心组件
在K8s上跑vLLM,有几个组件是绕不开的:
| 组件 | 作用 | 我的建议 |
|---|---|---|
| Deployment | 管理Pod副本,保证服务高可用 | 别用StatefulSet,vLLM是无状态的 |
| Service | 提供稳定的网络入口 | 用ClusterIP就行,外面套一层Ingress |
| HPA | 根据CPU/GPU利用率自动扩缩容 | 建议用自定义指标,比如请求排队长度 |
| PVC | 持久化存储模型文件 | 模型文件大,用ReadWriteMany的NFS或Ceph |
| GPU Operator | 管理GPU资源分配 | NVIDIA的,别用社区的,坑多 |
⚠️ 注意:我曾经在生产环境吃过亏——HPA只配了CPU指标,结果GPU都跑满了CPU才30%,HPA死活不扩容。后来加了GPU利用率指标才解决。所以,GPU推理服务的HPA一定要配GPU相关指标。
1.3 技术选型分析
选型这事儿,说白了就是权衡。我给你列个对比表,你就明白了。
1.3.1 推理引擎选型
| 特性 | vLLM | Triton Inference Server | Text Generation Inference (TGI) |
|---|---|---|---|
| 显存效率 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 吞吐量 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 部署复杂度 | ⭐⭐(简单) | ⭐⭐⭐⭐(复杂) | ⭐⭐⭐(中等) |
| 模型支持 | LLaMA、Mistral、Qwen等主流模型 | 几乎所有框架 | HuggingFace生态 |
| 社区活跃度 | 极高(UC Berkeley) | 高(NVIDIA) | 高(HuggingFace) |
我个人习惯,新项目直接上vLLM。为什么?因为它简单、快、省显存。Triton虽然功能强大,但配置起来太折腾了。我记得有一次配Triton的模型仓库,搞了整整两天才跑通——后来换成vLLM,半小时搞定。
1.3.2 GPU资源管理选型
GPU在K8s上的管理,目前主流就两种方案:
- NVIDIA GPU Operator:自动管理GPU驱动、容器运行时、设备插件。我推荐这个,省心。
- 手动部署:自己装驱动、配nvidia-docker、部署device plugin。适合对K8s很熟的老手。
💡 小技巧:如果你用的是A100或H100,记得开启MIG(多实例GPU)。一块A100可以切成7个1g.10gb的实例,跑小模型时性价比超高。我有个项目就是这么干的,GPU利用率从30%提到了85%。
1.3.3 存储选型
模型文件动不动就几十GB,存储选型很重要:
- 本地存储:速度快,但Pod漂移后模型得重新下载。适合测试环境。
- NFS:共享存储,所有节点都能访问。我生产环境用的就是NFS,配合模型预热脚本,效果不错。
- 对象存储(S3/MinIO):适合大规模集群,但延迟比NFS高一些。
嗯,这里要注意:模型文件下载很慢。我曾经在AWS上从S3拉一个70GB的模型,等了快20分钟。后来我用了initContainers做模型预热,Pod启动前先把模型拉到本地,启动时间从20分钟降到了2分钟。
1.4 架构设计要点总结
说了这么多,我总结几个关键点:
- 分层设计:用户层、入口层、服务层、计算层,各层职责清晰,方便独立扩缩容。
- 无状态设计:vLLM Pod本身不保存状态,所有状态都在模型文件和KV Cache里。这样HPA扩缩容时不用担心数据丢失。
- GPU资源隔离:每个Pod独占GPU,避免资源争抢。别想着多个Pod共享一块GPU,vLLM不支持。
- 监控先行:Prometheus + Grafana 必须配好。我见过太多人服务上线了才发现没有监控,出了故障两眼一抹黑。
核心架构决策:
- 推理引擎:vLLM(首选)
- GPU管理:NVIDIA GPU Operator
- 存储方案:NFS + initContainers预热
- 扩缩容:HPA + 自定义GPU指标
- 监控:Prometheus + Grafana + Loki
好了,架构设计这块就聊到这儿。下一章咱们会动手搭建环境,把vLLM真正跑起来。到时候我会带着你一步步操作,包括那些我踩过的坑,都会一一告诉你。