2、大模型部署基础:常见部署方式(本地、云、容器)、推理服务端口与协议、API网关需求
大模型从训练完成到对外提供服务,中间隔着一条“最后一公里”的工程鸿沟。模型权重文件本身只是静态资产,真正让用户能够通过 HTTP 请求获得智能回复的,是一整套推理服务运行时、网络暴露策略和流量治理机制。本章聚焦于大模型部署的三大基础命题:部署形态选型、推理服务端口与协议规范、API 网关的引入必要性。理解这三者,是后续配置 Nginx 反向代理、实现负载均衡与安全隔离的前提。
上图展示了大模型从部署形态到对外暴露的完整链路。部署方式决定了资源边界和运维模式,推理服务端口与协议决定了 Nginx 如何转发流量,而 API 网关则是在推理服务之上叠加的一层治理能力。三者环环相扣,任何一层的设计失误都会在后续的并发压测或线上故障中暴露无遗。
2.1 常见部署方式:本地、云与容器的选型逻辑
核心原理:三种部署形态的本质差异
大模型的部署形态并非简单的“放哪里跑”的问题,而是涉及资源管理粒度、扩展性、故障隔离和成本模型的综合决策。本地部署(裸机或工作站)将 GPU 资源直接暴露给操作系统,性能损耗最小,但扩展性受限于物理硬件;云服务器(ECS/GPU 云实例)通过虚拟化层提供弹性资源,但存在轻微的虚拟化开销;容器化部署则在操作系统层面进行资源隔离,通过镜像打包环境依赖,实现“一次构建、处处运行”。
从资源利用率角度看,本地部署适合单机多卡场景,例如 8×A100 的研发工作站;云服务器适合需要公网访问、弹性扩缩的生产环境;容器化则是最推荐的部署形态,因为它天然适配 Kubernetes 的调度能力,可以按 GPU 显存大小进行资源配额管理。值得注意的是,容器化并不排斥本地或云——你完全可以在本地物理机上跑 Docker,也可以在云服务器上跑 Kubernetes。
判断方法:根据业务阶段选择部署形态
| 评估维度 | 本地裸机 | 云服务器 | 容器化(Docker/K8s) |
|---|---|---|---|
| GPU 利用率 | 最高(无虚拟化层) | 较高(有轻微损耗) | 高(共享宿主机内核) |
| 扩展性 | 差(需采购硬件) | 中(手动创建实例) | 优(自动扩缩容) |
| 环境一致性 | 差(依赖人工配置) | 中(镜像模板) | 优(Dockerfile 固化) |
| 运维成本 | 高(硬件故障自管) | 中(云厂商兜底硬件) | 中(需管理编排系统) |
| 适用场景 | 研发调试、数据合规 | 中小规模生产 | 大规模生产、微服务 |
判断的核心标准是“是否需要弹性”。如果业务流量平稳、GPU 资源固定,本地部署或云服务器即可;如果存在明显的波峰波谷(例如白天办公时段高并发、夜间低负载),容器化配合 K8s 的 HPA(Horizontal Pod Autoscaler)可以显著降低成本。另一个判断维度是团队运维能力——容器化引入了镜像构建、编排配置、存储卷等额外复杂度,小团队需要权衡学习成本。
实战场景:从本地调试迁移到容器化生产
某金融科技公司需要部署一个 70B 参数的对话模型,最初在 4×A100 的本地工作站上调试,使用 vLLM 作为推理引擎。调试阶段一切正常,但进入联调测试后,业务方要求提供公网 API 接口,且需要支持每秒 50 个并发请求。本地工作站无法满足公网访问需求,团队决定迁移到云容器环境。
具体操作流程如下:
- 将模型权重和推理代码打包为 Docker 镜像,基础镜像选用
nvidia/cuda:12.1-runtime-ubuntu22.04,安装 vLLM 0.4.2 及 Python 依赖。 - 在云厂商的 Kubernetes 集群中创建 Deployment,声明 GPU 资源请求为
nvidia.com/gpu: 4,并配置 Service 暴露 8000 端口。 - 使用 Nginx Ingress Controller 将外部 HTTPS 流量转发到 Service,并配置 60 秒的 proxy_read_timeout 以支持长文本生成。
- 压测结果显示,容器化部署的吞吐量达到本地部署的 92%,延迟增加约 8ms(主要来自网络开销),完全满足业务指标。
复盘经验:容器化迁移的最大风险在于 GPU 驱动版本与 CUDA 运行时的兼容性。团队在迁移过程中遇到一次 CUDA error: no kernel image is available 的报错,原因是宿主机 NVIDIA 驱动版本低于容器内 CUDA 要求。解决方案是统一使用云厂商提供的 GPU 优化型节点池,确保驱动版本一致。
2.2 推理服务端口与协议:Nginx 转发的关键参数
核心原理:端口是服务的“门牌号”,协议是“对话语言”
大模型推理服务本质上是一个常驻内存的 HTTP/gRPC 服务进程。vLLM 默认监听 8000 端口,TGI(Text Generation Inference)默认监听 80 端口,SGLang 默认监听 30000 端口。这些端口号并非标准规定,而是各框架的默认约定。Nginx 反向代理的核心职责之一,就是将外部请求从 443/80 端口转发到这些内部端口。
协议层面,主流推理服务支持三种通信方式:HTTP REST(最通用,OpenAI 兼容格式)、gRPC(高性能,适合内部服务间调用)、WebSocket(支持双向流式通信,适合实时对话)。Nginx 对 HTTP 和 WebSocket 有原生支持,但对 gRPC 需要特殊配置(grpc_pass 指令)。
判断方法:如何确定正确的端口与协议配置
在配置 Nginx 之前,必须确认以下三个信息:
- 推理服务实际监听端口:通过
netstat -tlnp | grep python或查看服务启动日志确认。 - API 路径前缀:vLLM 的 OpenAI 兼容接口路径为
/v1/chat/completions,TGI 的接口路径为/generate或/v1/chat/completions。 - 是否启用流式输出:如果业务需要打字机效果(Token 逐个返回),必须配置 Nginx 关闭缓冲(
proxy_buffering off)并设置合适的超时时间。
# 典型的 vLLM 服务启动命令
python -m vllm.entrypoints.openai.api_server \
--model /data/models/Qwen2.5-72B-Instruct \
--tensor-parallel-size 4 \
--host 0.0.0.0 \
--port 8000 \
--max-model-len 32768 \
--enable-auto-tool-choice
上述命令启动后,服务监听所有网卡的 8000 端口。此时 Nginx 配置中的 proxy_pass http://127.0.0.1:8000; 即可完成转发。但需要注意,如果推理服务部署在 Docker 容器内,Nginx 不能直接使用 127.0.0.1,而应使用容器 IP 或 Docker 网络别名。
实战场景:流式输出场景下的 Nginx 超时配置
一个典型的流式对话场景中,用户发送问题后,模型需要 10-30 秒才能完整生成回复。如果 Nginx 默认的 proxy_read_timeout 60s 不够用,长文本生成(如 8K 上下文)可能超过 60 秒,导致连接被中断。此时需要调整以下参数:
location /v1/chat/completions {
proxy_pass http://vllm-service:8000;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffering off; # 关闭缓冲,让流式数据实时转发
proxy_cache off; # 禁用缓存,避免污染动态响应
proxy_read_timeout 300s; # 5分钟超时,适配长文本生成
proxy_send_timeout 300s;
chunked_transfer_encoding on; # 启用分块传输
}
这里的关键是 proxy_buffering off。如果保持默认开启,Nginx 会等上游响应完全结束后才一次性转发给客户端,流式效果将完全失效。此外,proxy_http_version 1.1 和 Connection "" 是为了支持 keepalive 连接池,避免频繁重建 TCP 连接。
/v1/ 走 HTTP 转发,/grpc. 走 grpc_pass。不要试图用 HTTP 配置处理 gRPC 流量,否则会出现 upstream prematurely closed connection 错误。
2.3 API 网关需求:为什么 Nginx 不只是“转发器”
核心原理:网关是推理服务的“前置防火墙”与“流量调度中心”
裸奔的推理服务直接暴露公网是极其危险的。大模型推理服务通常没有内置的用户认证、速率限制和请求审计功能。API 网关在推理服务之前增加了一层统一治理:路由转发(将不同模型版本分发到不同后端)、认证鉴权(校验 API Key 或 JWT)、限流熔断(防止恶意请求打爆 GPU)、日志监控(记录每次调用的 Token 消耗和延迟)。
Nginx 作为 API 网关的优势在于轻量、高性能、配置灵活。相比 Kong 或 APISIX,Nginx 不依赖数据库,配置即代码,适合中小规模团队。但 Nginx 的限流能力相对基础(基于 limit_req 模块),如果需要复杂的按用户维度限流或动态路由,可能需要引入 Lua 脚本或选择更重的 API 网关。
判断方法:什么情况下必须引入 API 网关
| 业务需求 | 无网关(直连推理服务) | 有 Nginx 网关 |
|---|---|---|
| 多模型共存 | 需手动管理多个端口 | 按 URL 路径路由到不同后端 |
| 用户认证 | 推理服务内自研 | 网关统一校验 API Key |
| 突发流量控制 | 无法限制,GPU 可能 OOM | 网关层限流,保护后端 |
| 灰度发布 | 不支持 | 按权重分流到新旧版本 |
| 访问日志 | 格式不统一 | 统一 JSON 格式日志 |
判断标准很简单:只要推理服务需要被多个客户端或团队共享,就必须引入 API 网关。即使只有一个模型,网关也能提供 TLS 终止、请求大小限制、IP 黑白名单等基础安全能力。
实战场景:多模型路由与限流配置
某 AI 创业公司同时部署了三个模型:Qwen2.5-72B(通用对话)、Llama-3.1-8B(轻量分类)、Embedding 模型(向量检索)。三个模型分别运行在三组不同的 GPU 实例上。通过 Nginx 网关实现统一入口:
upstream qwen_backend {
server 10.0.1.10:8000;
server 10.0.1.11:8000;
keepalive 32;
}
upstream llama_backend {
server 10.0.2.10:8000;
}
server {
listen 443 ssl;
server_name api.example.com;
# 统一认证
auth_request /auth;
location = /auth {
internal;
proxy_pass http://auth-service:8080/validate;
proxy_pass_request_body off;
}
# 路由到 Qwen 模型
location /v1/qwen/ {
proxy_pass http://qwen_backend/v1/;
limit_req zone=qwen_limit burst=20 nodelay;
}
# 路由到 Llama 模型
location /v1/llama/ {
proxy_pass http://llama_backend/v1/;
limit_req zone=llama_limit burst=50 nodelay;
}
}
该配置实现了三个关键能力:auth_request 在转发前调用认证服务校验用户身份;limit_req 对 Qwen 模型限制为每秒 10 个请求(burst 20),对 Llama 模型限制为每秒 50 个请求;URL 路径前缀实现模型路由。上线后,网关成功拦截了多次未授权访问,并将 Qwen 服务的 GPU 利用率稳定在 85% 以下,避免了 OOM 风险。
--max-num-seqs 参数控制最大并发序列数,Nginx 限流只是第一道防线。如果网关限流值设置得比后端并发上限高,突发流量仍然可能打满 GPU 显存。建议网关限流值设置为后端并发上限的 80%。
2.4 常见误区与总结复盘
误区一:端口号随意指定,导致 Nginx 转发失败
很多初学者在启动推理服务时使用 --port 8080,但 Nginx 配置中仍然写 proxy_pass http://127.0.0.1:8000;,导致 502 Bad Gateway。排查方法:先在本机用 curl http://127.0.0.1:8080/v1/models 验证服务是否可访问,再检查 Nginx 配置中的端口是否一致。
误区二:忽略 WebSocket 升级头
如果推理服务支持流式输出且客户端使用 WebSocket 连接,Nginx 必须配置:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
缺少这两行配置,WebSocket 握手会失败,客户端报 Unexpected server response: 400。
误区三:网关层不做超时控制
推理服务的响应时间波动极大——简单问答可能 1 秒返回,长文档摘要可能 60 秒。如果 Nginx 的 proxy_read_timeout 设置过短,长任务会被误杀。建议根据模型最大输出 Token 数估算最坏情况耗时,并在此基础上增加 30% 余量。
总结:部署基础配置清单
- 部署形态:优先容器化,确保 GPU 驱动与 CUDA 版本兼容。
- 端口确认:启动服务后立即验证端口监听状态,记录实际端口号。
- 协议匹配:HTTP 请求用
proxy_pass,gRPC 用grpc_pass,WebSocket 需配置 Upgrade 头。 - 网关策略:至少配置认证、限流、超时三项基础能力。
- 日志监控:在 Nginx 层记录
$request_time和$upstream_response_time,用于识别慢请求。