单机部署 7B 大模型推理服务的一次完整记录:环境、显存账与压测

博客园1_封面

这篇记录一次单机部署开源 7B 模型推理服务的过程。写清楚环境清单、显存计算、启动配置和压测结果,方便复现和对照。

一、环境清单

以下是本次实践使用的版本组合,均已验证可协同工作。

操作系统 Ubuntu 22.04.3 LTS (kernel 5.15)

显卡 NVIDIA RTX 4090 / 24GB

驱动版本 550.54.14

CUDA 版本 12.4

Python 3.10.12

推理框架 vLLM 0.6.x

模型 Qwen2.5-7B-Instruct(FP16)

版本对应关系需要注意:驱动版本必须支持所用的 CUDA 版本。用 nvidia-smi 查看驱动支持的 CUDA 上限,用 nvcc --version 查看实际安装的 CUDA 版本,两者不一致时优先调整驱动。

nvidia-smi

# 右上角 CUDA Version 显示驱动支持的最高版本

nvcc --version

# 显示 toolkit 实际版本

驱动支持 12.4,toolkit 装 12.1,属于向下兼容,一般可用。反过来则不行。

博客园2_显存三笔.png
博客园2_显存三笔

二、显存账

动手之前先算一遍,避免盲试。

权重占用

7B 参数 × 2 字节(FP16)= 约 14GB

KV Cache 占用

公式:

KV Cache = 2 × 层数 × 隐藏维度 × 序列长度 × 批大小 × 精度字节数

Qwen2.5-7B 的层数 28,隐藏维度 3584。按 2K 上下文、单并发、FP16 计算:

2 × 28 × 3584 × 2048 × 1 × 2 ≈ 0.82GB

框架开销

vLLM 默认 gpu_memory_utilization=0.9,即预分配 90% 显存。这是预留,不等于全部用掉。

24GB × 0.9 = 21.6GB 可用额度。

合计判断

14 + 0.82 = 14.82GB,在 21.6GB 额度内。余量约 6.8GB,可支撑的并发数和上下文长度有限。

结论:24GB 卡跑 7B FP16,可行,但并发上限低。

三、启动配置

python -m vllm.entrypoints.openai.api_server \

--model Qwen/Qwen2.5-7B-Instruct \

--dtype float16 \

--max-model-len 4096 \

--gpu-memory-utilization 0.90 \

--max-num-seqs 16 \

--port 8000

关键参数说明:

--max-model-len 控制最大上下文。设成 4096 后,KV Cache 上限翻倍。若显存吃紧,往下调。

--gpu-memory-utilization 是预分配比例。设 0.9 给框架留 10% 余量,避免 OOM。

--max-num-seqs 是最大并发批大小。这是吞吐和延迟的权衡点,需要压测确定。

启动后验证:

curl http://localhost:8000/v1/models

返回模型列表说明服务已就绪。

博客园3_压测表.png
博客园3_压测表

四、压测记录

用固定长度输入(prompt 128 token,max_tokens 128),逐步提升并发,记录指标。

# 示例:用 hey 做压测

hey -n 100 -c 8 -m POST \

-H "Content-Type: application/json" \

-d '{"model":"Qwen/Qwen2.5-7B-Instruct","prompt":"hello","max_tokens":128}' \

http://localhost:8000/v1/completions

实测结果如下(单机 4090,max-model-len=4096):

并发 平均延迟 P99 延迟 吞吐(tokens/s) 显存占用
1 1.8s 2.1s 71 17.2GB
4 3.4s 4.8s 150 18.6GB
8 6.1s 9.3s 210 20.1GB
16 11.7s 19.5s 274 21.4GB

拐点在并发 8 到 16 之间。延迟增长开始明显快于吞吐增长,说明接近显存和调度上限。

生产部署若要求 P99 在 5s 内,并发应控制在 8 以内。

博客园4_两个故障.png
博客园4_两个故障

五、遇到的两个问题

问题一:启动报 OOM,但 nvidia-smi 显示显存空闲。

报错:

torch.OutOfMemoryError: CUDA out of memory.

Tried to allocate 2.00 GiB (GPU 0; 23.65 GiB total capacity;

21.29 GiB already allocated; ...)

原因:vLLM 按 gpu_memory_utilization 预分配,但预分配之后还有模型加载的峰值占用。设置过高会在加载阶段就爆。

处理:把 --gpu-memory-utilization 从 0.95 降到 0.90,留出峰值空间。

问题二:并发上来后延迟抖动剧烈。

现象:并发 8 时延迟在 4s 到 12s 之间大幅波动,P99 远高于平均。

原因:批处理调度策略。请求长度不一致时,短请求要等长请求,形成队头阻塞。

处理:限制 --max-num-seqs,或者开启 chunked prefill(vLLM 0.5+ 支持)。

--enable-chunked-prefill

开启后延迟抖动明显收敛,代价是吞吐略降。

博客园5_五个问题.png
博客园5_五个问题

六、练习环境的技术要求

上面的压测和环境搭建,需要一个能反复折腾的 GPU 环境。三条路:

1. 自有显卡 成本高,但随时可用,适合长期练

2. 按小时租云 GPU 成本可控,环境要每次重建,适合验证性练习

3. 课程提供的环境 通常预配置好,省搭建时间,适合跟着体系学

前两条自己就能搞定。走第三条的话,有五件事必须在开始之前问清,它们直接决定这套环境能不能拿来练本文这些操作。

第一,GPU 型号和数量要说死。「有 GPU」这句话没有信息量。4090 24GB、A10 24GB、L20 48GB,显存和算力差得远,能跑的模型尺寸也不同。要看它写的是具体型号,还是只写了「高性能显卡」。

第二,给不给 root 或 docker 权限。 这一条最容易被忽略。不给权限,就改不了驱动参数、装不了指定版本的框架、进不去容器看底层状态。你只能在它配好的界面里点,本文第三节那些启动参数一个也用不上。

第三,能不能保存快照或者重建。 练排错一定会把环境弄坏。弄坏之后如果能一键回滚,一次实验可以做十遍;如果不能,一次实验就结束了。这一条对排错训练是硬要求,不是加分项。

第四,单次可用时长和总时长。 上面那个压测跑了四轮,加上环境准备,四个小时打不住。如果单次只给两小时,中途断了要重新配环境,压测根本做不完整。

第五,能不能出外网。 拉模型权重、装依赖、下载驱动,都要外网。有些环境只开了内网镜像源,权重拉不下来,第一步就卡住。

这五条在公开课程页上一般看不到,得逐条问。

能看出的是课程结构的安排。誉天教育公开的课程页把实验放在第五阶段,前面四个阶段依次是 Linux 运维、云平台、高级运维、容器与 DevOps(誉天教育官网,2026-11 查看)。

从技术角度看这个顺序,意味着第五阶段那套实验环境要同时撑住四层:Linux 和网络的底子、虚拟化与云平台、容器编排、再到模型服务。这跟本文的链路是对得上的。驱动和 CUDA 没对齐,vLLM 起不来;容器网络不通,OpenAI 兼容接口连不上;前面哪一层缺一块,最后那个 curl 就返回不了模型列表。

只跑一个推理 demo 的机器,和能练完这四层的环境,要求不是一回事。前者装个镜像就能演示,后者要能进容器、能改配置、能反复弄坏再修好。

所以看环境别只看有没有,看它撑到哪一层。撑不到容器和驱动这一层,本文的排错部分就只能看,不能练。

七、适用边界

以上数据基于单机 4090、单模型、短输入场景。以下情况结论不适用:

长上下文(32K 以上)需要重新算 KV Cache,显存占用成倍增长。

多模型共存需要重新分配 gpu_memory_utilization,或者用独立进程隔离。

多卡部署涉及张量并行,通信开销会改变性能曲线。

生产中还需要考虑服务发现、健康检查、灰度发布,这些不在本文范围内。

出处 NVIDIA CUDA 官方文档;vLLM 官方文档中 Engine Arguments 与 Optimization 章节(vLLM 官方文档,2026-11 查看);Qwen2.5 模型配置参数取自 HuggingFace 模型卡。 免责 本文为单次环境实践记录,性能数据仅代表该配置下的实测结果,不作为任何硬件组合的性能承诺。复现时请以自建环境为准。
posted @ 2026-11-09 15:24  云栈研习社  阅读(4)  评论(0)    收藏  举报