4.3 生产部署前的环境与安全检查清单 4.1 和 4.2 讲的是「怎么把单机和集群跑起来」,但「能跑」和「能上生产」之间隔着一整道检查清单。我见过太多团队调通了 demo 就急着上线,结果生产第一天就出事:驱动版本不够导致偶发 NaN、API 端口裸奔被人扫到、模型权重权限没收紧被越权读取、日志没接监控事故后查无此案。这些坑每一个都不是技术难题,但每一个都足以让一次「成功部署」变成「线上事故」。 这一节我把生产部署前必须过的检查项整理成一份可执行的清单。它不只是「环境依赖基线」的扩写,而是覆盖硬件、软件、网络、安全、监控、可观测性、容量六个维度的完整 production-readiness 检查表。每一项我都会说清楚「为什么必须查」「怎么查」「不查会怎样」,而不是干巴巴列条目。
4.1 和 4.2 讲的是「怎么把单机和集群跑起来」,但「能跑」和「能上生产」之间隔着一整道检查清单。我见过太多团队调通了 demo 就急着上线,结果生产第一天就出事:驱动版本不够导致偶发 NaN、API 端口裸奔被人扫到、模型权重权限没收紧被越权读取、日志没接监控事故后查无此案。这些坑每一个都不是技术难题,但每一个都足以让一次「成功部署」变成「线上事故」。
这一节我把生产部署前必须过的检查项整理成一份可执行的清单。它不只是「环境依赖基线」的扩写,而是覆盖硬件、软件、网络、安全、监控、可观测性、容量六个维度的完整 production-readiness 检查表。每一项我都会说清楚「为什么必须查」「怎么查」「不查会怎样」,而不是干巴巴列条目。这份清单我在团队里用了两年,每次新服务上线都过一遍,拦下来的潜在事故不少于两位数。
在展开具体条目之前,先说清楚这份清单怎么用:
第一,它不是上线当天才跑的。它应该在压测通过、准备切流之前的一周就开始走,因为有些项(比如驱动升级、网络策略审批)需要时间窗口,临时发现根本来不及改。
第二,每一项都要有「责任人 + 验证证据」。光勾「已检查」没用,要能拿出证据(截图、日志、命令输出)。我在团队里用一张共享表格,每项要求附验证证据链接,否则视为未完成。
第三,分级处理。清单里标 [Block] 的是阻断项——任何一项不过都不允许切流;标 [Warn] 的是警告项——可以带病上线但必须有缓解措施和修复计划。
下面六个维度,逐项展开。
这是最底层的一层,错了上面全是空中楼阁。
nvidia-smi 看 Driver Version 字段。坑:驱动版本和 CUDA Runtime 是两个东西,驱动 535 跑 CUDA 12.1 没问题,但驱动 525 跑 CUDA 12.1 会偶发诡异错误。nvcc --version 和 python -c "import torch; print(torch.version.cuda)"。坑:PyTorch 自带的 CUDA Runtime 和系统 CUDA 是分开的,两者版本要协调,否则编译扩展时炸。python -c "import torch; print(torch.cuda.get_device_capability())"。nvidia-smi -q | grep -A5 "ECC" 看 ECC 错误计数,nvidia-smi -q | grep "GPU Current Temp" 看温度(持续 >85°C 说明散热有问题)。坑:二手卡、矿卡 ECC 错误率高,采购时必须查。nvidia-smi nvlink -s 看 NVLink 状态,nvidia-smi topo -m 看拓扑图(理想是 NV#,最差是 SYS 跨 NUMA)。# 一行命令快速核对硬件基线 nvidia-smi --query-gpu=driver_version,name,memory.total,temperature.gpu,clocks_event_reasons.active --format=csv nvidia-smi topo -m python -c "import torch; print('CUDA:', torch.version.cuda, 'cap:', torch.cuda.get_device_capability())"
python --version。坑:用 conda 环境时基础 Python 版本和实际跑的 Python 可能不一致,要用 which python 确认。torch.compile,低版本不支持。验证:python -c "import torch; print(torch.__version__)"。python -c "import vllm; print(vllm.__version__)",且这个版本要在团队的「已验证版本」清单里。flash_attn,确认实际用的是哪个版本。pip freeze 的输出必须有版本管理(requirements.txt 锁定 + 镜像固化),不能在线装最新版。坑:今天装的 transformers==4.44 下周可能是 4.44.1 引入了 breaking change,必须锁死。# 启动前自检三连 nvidia-smi python -c "import torch; print('cuda avail:', torch.cuda.is_available(), 'cap:', torch.cuda.get_device_capability())" python -c "import vllm, transformers, flash_attn; print('vllm:', vllm.__version__, 'transformers:', transformers.__version__)"
这三条命令全绿,才算环境基线通过。任何一条异常,先解决再继续——这是避免后续「玄学报错」的最低成本手段。
生产服务的网络暴露面是安全事故的主要来源,这一维度必须严查。
0.0.0.0:8000,如果机器有公网 IP,等于裸奔——任何人都能调你的模型,烧你的 GPU。必须通过反向代理(Nginx/Envoy)或 API 网关暴露,且网关层做鉴权。验证:curl http://公网IP:8000/v1/models 应该 timeout 或 403,不是 200。--host 127.0.0.1,只允许本机访问;需要跨节点则绑内网网卡 IP,绝不绑 0.0.0.0 暴露所有接口。nmap 扫描,确认只有必要端口开放。nccl-test 工具测节点间带宽,应接近 NVLink 域外的网络上限。模型权重是核心资产,权限不收紧会被越权读取甚至外泄。
750,owner 为跑 vLLM 的专用账户,禁止其他用户读。坑:默认 644 意味着同机任何用户都能拷走权重——一次权限疏忽就是一次资产外泄。vllm),仅赋予读权重、用 GPU 的最小权限。curl 不带 token 应返回 401。坑:很多人 demo 阶段图省事关掉鉴权,上线时忘了开——这是最常见的安全事故。没有监控的服务等于盲飞,事故发生了你都不知道。
/metrics 端点接 Prometheus。vLLM 暴露了丰富的 Prometheus 格式指标,必须接抓取。关键指标至少监控这几个:| 指标 | 含义 | 告警阈值建议 |
|---|---|---|
vllm:num_requests_running |
在跑请求数 | 持续 = max-num-seqs 说明满载 |
vllm:num_requests_waiting |
排队请求数 | 持续 >0 说明过载 |
vllm:gpu_cache_usage_perc |
KV 池占用率 | >0.9 说明池将满 |
vllm:time_to_first_token_seconds |
TTFT 分布 | P99 > 业务阈值告警 |
vllm:e2e_request_latency_seconds |
端到端延迟 | P99 监控 |
vllm:preemption_count |
抢占次数 | 累计上涨说明池不够 |
nvidia-smi 的 gpu_util、memory_used、temperature、power_draw 必须接监控(DCGM exporter)。坑:很多人只监控 vLLM 指标不监控 GPU 层,结果 GPU 故障(降频、过热)发现不了。这一维度不是阻断项,但决定服务能不能扛住峰值和故障。
把六个维度压缩成上线前最后 5 分钟的核对(虽然前面都做过了,临门一脚再确认):
[ ] 驱动/CUDA/GPU 健康(nvidia-smi + ECC 检查) [ ] 监控大盘有数据,告警规则已生效 [ ] API 鉴权打开,匿名访问被拒(curl 不带 token = 401) [ ] 端口不暴露公网(外部 nmap 扫描确认) [ ] 权重文件权限 750,owner 正确 [ ] 日志在集中系统可查 [ ] 回滚命令准备好且可一键执行 [ ] Oncall 已知晓本次上线时间和影响面
这 8 条全绿,才可以切流。任何一条黄/红,停下来修——切流多花一天,事故回滚可能要多花一周。
最后说一句不算技术、但更重要的话:检查清单的价值不在条目本身,在于「强制暂停」的纪律。
人在临上线时会有强烈的「赶紧上」冲动——前面调试已经累了,再多查一遍显得多余。这份清单的作用,就是用一个外部约束把你拉回「再确认一次」的状态。我团队里有一条不成文的规矩:上线前检查清单必须由「非本次部署的人」复核签字,因为部署者自己会下意识跳过自己认为没问题的项。多一双眼睛,多一道防线。
这份清单的每一项背后,都站着一次真实事故。把它们固化成清单、强制执行,是为了不让同一个坑被踩第二次。上线前多花一小时过清单,胜过事故后通宵救火。