三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

从零开始:用 vLLM 搭建你的第一个 AI 推理服务——给 AI、微服务和 SRE 小白的实战指南

从零开始:用 vLLM 搭建你的第一个 AI 推理服务——给 AI、微服务和 SRE 小白的实战指南

从零开始:用 vLLM 搭建你的第一个 AI 推理服务

——给 AI、微服务和 SRE 小白的实战指南


如果你刚接触大模型(AI),想把它跑起来对外提供服务(微服务),又希望这个服务稳定、可监控、能扩容(SRE/DevOps)——那么这篇文章就是为你写的。我们会用一个真实的开源项目vLLM,带你走完从"模型文件"到"生产级服务"的完整旅程。


一、先搞清楚:vLLM 到底是什么?

想象你开了一家智能问答餐厅

  • 顾客= 用户发来的问题(比如"请写一首关于夏天的诗")

  • 厨师= GPU,负责计算答案

  • 菜谱记忆= 模型参数(几十亿到几千亿个数字)

  • 正在做的菜= KV Cache(模型推理时产生的中间记忆)

传统做法里,每位顾客点完菜,厨师都要独占一张大桌子(显存)来放食材。顾客少的时候没问题,但人一多,桌子不够用了,很多位置空着却没法给别人用——显存浪费严重

vLLM 的核心创新PagedAttention,就像是给餐厅引入了一套"智能拼桌系统"

  • 不再给每位顾客预留整张大桌

  • 而是把桌子切成很多小格子(pages/block)

  • 谁来谁领格子,走人就回收

  • 多个顾客可以灵活共享空间

结果:同样的 GPU 显存,能同时服务的顾客数量提升了好几倍。


二、AI 小白篇:5 分钟跑通第一个大模型

2.1 安装(不需要懂深度学习)

vLLM 的安装简单得不像一个 AI 项目:

bash

# 推荐用 uv(比 pip 快) uv pip install vllm # 或者传统方式 pip install vllm

2.2 启动你的第一个 AI 服务

假设你有一块 8GB 以上的 NVIDIA 显卡:

bash

vllm serve Qwen/Qwen2.5-7B-Instruct \ --dtype half \ --max-model-len 4096

看到Application startup complete就说明服务起来了!

2.3 测试一下

打开另一个终端:

bash

curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "Qwen/Qwen2.5-7B-Instruct", "messages": [{"role": "user", "content": "你好,请介绍一下自己"}] }'

如果返回了一段通顺的中文回答,恭喜你——你已经部署了一个真正的 LLM 推理服务!

💡AI 知识点Qwen2.5-7B是一个 70 亿参数的开源中文大模型。参数越多模型越"聪明",但也越吃显存。7B 是性价比很高的入门选择。


三、微服务小白篇:把 vLLM 包装成正式服务

单机跑起来只是第一步。在真实的公司里,AI 模型通常以微服务的形式存在——独立部署、通过 API 通信、可以被多个业务系统调用。

3.1 为什么需要微服务化?

想象你的公司有三个产品:

  • 客服机器人

  • 文档摘要工具

  • 代码助手

它们都用同一个大模型。如果每个产品自己加载一份模型,显存直接爆炸。微服务的思路是:模型只加载一次,通过 API 供所有人调用

3.2 Docker 化部署(微服务的标准姿势)

创建一个Dockerfile

dockerfile

FROM vllm/vllm-openai:latest # 暴露 vLLM 默认端口 EXPOSE 8000 # 启动命令 CMD ["--model", "Qwen/Qwen2.5-7B-Instruct", \ "--dtype", "half", \ "--max-model-len", "4096"]

构建并运行:

bash

docker build -t my-vllm-service . docker run --gpus all -p 8000:8000 my-vllm-service

现在你的 AI 服务已经容器化了!可以轻松地:

  • 在任何有 Docker 的机器上运行

  • 用 Kubernetes 管理多实例

  • 通过负载均衡分发请求

3.3 docker-compose:一键启动完整环境

创建docker-compose.yml

yaml

version: '3.8' services: vllm: image: vllm/vllm-openai:latest ports: - "8000:8000" environment: - CUDA_VISIBLE_DEVICES=0 command: > --model Qwen/Qwen2.5-7B-Instruct --dtype half --max-model-len 4096 deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu]

启动:

bash

docker-compose up -d

💡微服务知识点docker-compose让你用一份配置文件定义整个服务栈。后续还可以加上 Nginx(反向代理)、Redis(缓存)、Prometheus(监控)等组件。


四、SRE / DevOps 小白篇:让服务"稳如老狗"

服务跑起来只是 20% 的工作。作为 SRE(站点可靠性工程师),你需要回答三个问题:

  1. 服务现在健康吗?

  2. 性能够不够用?

  3. 出问题怎么知道?

4.1 监控:给服务装上"仪表盘"

vLLM 内置了 Prometheus 指标暴露。添加监控只需要在启动时加上参数:

bash

vllm serve Qwen/Qwen2.5-7B-Instruct \ --dtype half \ --prometheus-port 8001

然后在docker-compose.yml里加上监控栈:

yaml

services: vllm: image: vllm/vllm-openai:latest ports: - "8000:8000" # API 端口 - "8001:8001" # 监控指标端口 command: > --model Qwen/Qwen2.5-7B-Instruct --dtype half --prometheus-port 8001 prometheus: image: prom/prometheus volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml ports: - "9090:9090" grafana: image: grafana/grafana ports: - "3000:3000"

关键监控指标

表格

指标名含义SRE 关注点
vllm:num_requests_running正在处理的请求数是否接近并发上限
vllm:gpu_cache_usage_percGPU KV Cache 使用率接近 100% 说明显存不够了
vllm:time_to_first_token首 token 延迟用户感知的"响应速度"
vllm:time_per_output_token每个输出 token 的耗时生成速度是否达标

4.2 日志:出问题时有迹可循

在容器环境里,日志管理很重要。建议:

bash

# 查看实时日志 docker logs -f <container_id> # 或者配置日志驱动,直接发到 ELK/Loki docker run --log-driver fluentd ...

vLLM 的日志会显示:

  • 模型加载进度

  • 每次请求的输入/输出 token 数

  • 错误信息(如 OOM、模型下载失败)

4.3 高可用:单点故障怎么办?

对于小白来说,先理解这些概念:

表格

策略说明vLLM 支持情况
多实例负载均衡同时跑 2-3 个 vLLM 实例,前面加 Nginx✅ 完全支持
健康检查自动剔除不健康的实例✅ 通过/health端点
自动扩缩容请求多了自动加 GPU,少了自动减⚠️ 需配合 K8s + GPU 调度
模型热更新不重启服务切换模型版本❌ 目前需重启

一个简单的 Nginx 负载均衡配置:

nginx

upstream vllm_backend { server vllm-1:8000; server vllm-2:8000; } server { listen 80; location /v1/ { proxy_pass http://vllm_backend; } }

4.4 性能调优:SRE 的必修课

作为 SRE,你需要了解几个调参旋钮:

bash

vllm serve Qwen/Qwen2.5-7B-Instruct \ --dtype half \ # 精度:half 省显存,float 更准 --max-model-len 4096 \ # 最大上下文长度 --gpu-memory-utilization 0.9 \ # GPU 显存使用上限(留 10% 余量) --max-num-seqs 256 \ # 最大并发请求数 --enable-prefix-caching \ # 开启前缀缓存(重复 prompt 加速) --quantization awq # 如果显存不够,启用 4bit 量化

💡SRE 知识点gpu-memory-utilization是防止 OOM(显存溢出)的关键。不要设 1.0,留一些 buffer 给 CUDA 运行时和突发请求。


五、完整实战:从 0 到 1 的 checklist

如果你是跟着文章一步步做的,现在你应该已经拥有:

  • [ ] 本地跑通了 vLLM,能和 AI 对话

  • [ ] 用 Docker 把服务容器化了

  • [ ] 用 docker-compose 定义了可复现的部署

  • [ ] 接入了 Prometheus + Grafana 监控

  • [ ] 理解了 PagedAttention、KV Cache、量化等核心概念


六、给不同阶段读者的学习路径

🌱 如果你偏向 AI 方向

  1. 精读 vLLM 的 PagedAttention 论文

  2. 学习 CUDA 编程,理解 kernel 优化

  3. 尝试修改 vLLM 源码,实现自定义调度策略

🐳 如果你偏向微服务/DevOps 方向

  1. 学习 Kubernetes,尝试用 K8s 部署 vLLM

  2. 研究 vLLM 的分布式推理(Tensor Parallelism + Pipeline Parallelism)

  3. 搭建完整的 LLM 服务网关(鉴权、限流、计费)

🚨 如果你偏向 SRE 方向

  1. 建立 LLM 服务的 SLI/SLO(如:P99 延迟 < 500ms,可用性 > 99.9%)

  2. 设计告警规则(GPU 利用率、请求错误率、队列堆积)

  3. 实现自动化运维(自动扩缩容、模型版本灰度发布)


七、写在最后

vLLM 是一个绝佳的"交叉学科"项目

  • AI 学习者,它是理解 LLM 推理优化的最佳入口

  • 后端/微服务开发者,它是把 AI 能力产品化的标准工具

  • SRE/DevOps,它是挑战 GPU 集群运维的真实战场

你不需要一开始就把所有东西都搞懂。先跑起来,再慢慢深入。记住:

"先让服务工作,再让它工作得好,最后让它工作得可靠。"

有任何问题,欢迎在 vLLM 的 GitHub Discussions 或社区论坛提问。祝你部署顺利!


参考链接

  • vLLM GitHub: GitHub - vllm-project/vllm: A high-throughput and memory-efficient inference and serving engine for LLMs · GitHub

  • 官方文档: https://docs.vllm.ai

  • PagedAttention 论文: [2309.06180] Efficient Memory Management for Large Language Model Serving with PagedAttention

← 返回列表