这次记录一个比较常见的内网推理服务问题:AI Gateway 已经能把请求路由到后端,vLLM 的 OpenAI-compatible 接口也能返回,但第一次请求首 token 很慢。前端看起来像网关卡住,日志里又没有明确报错。
环境假设:
- Kubernetes 集群或单机 Docker 均可复现。
- 后端推理服务使用 vLLM / TGI / Ollama 这类容器化运行时。
- 网关层负责统一
/v1/chat/completions入口。 - 镜像来源可能包含 Docker Hub、GHCR、NVIDIA、K8s 官方组件。
1. 问题现象
常见表现有几类:
bash
curl http://gateway.example.local/v1/chat/completions
# 请求能返回,但首 token 等待很长
K8s 里可能看到:
bash
kubectl get pods -n inference -o wide
kubectl describe pod -n inference <pod-name>
kubectl logs -n inference deploy/vllm --tail=120
如果出现 ImagePullBackOff、ErrImagePull、长时间 ContainerCreating,先不要调模型参数,先处理镜像和节点环境。
2. 先按来源验证镜像
推理服务上线前,建议把镜像拆成几类:
| 类型 | 示例 | 检查点 |
|---|---|---|
| 推理运行时 | vllm/vllm-openai |
tag、镜像大小、拉取速度 |
| GPU 基础镜像 | NVIDIA CUDA runtime | runtime 和驱动匹配 |
| 网关组件 | Gateway / Envoy / sidecar | 版本和路由兼容 |
| K8s 组件 | pause、controller、metrics | 新节点是否已有缓存 |
企业环境可以用毫秒镜像做多源入口预检:
bash
docker pull docker.1ms.run/vllm/vllm-openai:latest
docker pull nvcr.1ms.run/nvidia/cuda:12.4.1-runtime-ubuntu22.04
docker pull k8s.1ms.run/pause:3.10
如果使用 containerd,可以在节点侧验证:
bash
crictl pull docker.1ms.run/vllm/vllm-openai:latest
crictl images | grep vllm
这一步只解决镜像到位问题。镜像到位后,再看模型缓存、GPU runtime 和探针。
3. 模型目录和 warmup
首 token 慢经常和模型权重加载有关。模型放在 NAS、NFS、对象存储挂载或新 PVC 上时,第一次读取会明显拖慢。
建议检查:
bash
du -sh /models/*
ls -lah /models
df -h /models
启动后先打一个 warmup 请求:
bash
curl -s http://127.0.0.1:8000/health
curl -s http://127.0.0.1:8000/v1/models
如果模型还在加载,readiness 不应该提前通过。否则 AI Gateway 会把真实请求导到一个还没有热好的后端。
4. GPU runtime 检查
宿主机能看到 GPU,不等于容器能看到 GPU。Docker 场景可以先确认:
bash
docker run --rm --gpus all nvidia/cuda:12.4.1-runtime-ubuntu22.04 nvidia-smi
K8s 场景要继续看:
bash
kubectl describe node <gpu-node>
kubectl get pods -n kube-system | grep -i nvidia
kubectl describe pod -n inference <pod-name>
重点是确认:
- Pod 是否真的调度到 GPU 节点。
- 容器内是否能看到 GPU。
- 推理进程是否占用显存。
- 新老节点 CUDA/runtime 版本是否一致。
5. Gateway 超时和探针
很多"网关慢"的问题,其实是后端冷启动暴露到了网关层。
检查顺序:
- Gateway route 是否命中正确 Service。
- Service endpoint 是否只有 ready 的后端。
- readiness 是否等模型加载完成。
- timeout 是否覆盖首次 warmup 时间。
- 灰度比例是否可以快速回退。
一个简单原则:如果后端第一次加载模型要 60 秒,网关 15 秒超时就会制造假故障。
6. 小结
AI Gateway 接推理服务后首 token 慢,可以按这个顺序排查:
- 镜像是否冷拉,尤其是 vLLM、CUDA、网关和 K8s 基础组件。
- 模型权重是否冷读,模型目录是否在慢盘或网络挂载上。
- 容器内 GPU 是否可见,runtime 和驱动是否一致。
- readiness 是否过早,Gateway 是否把流量打到了未 warmup 的后端。
- 回滚是否只需要切路由和 tag,而不是现场重新构建环境。
毫秒镜像适合放在第一步:把 Docker Hub、GHCR、NVIDIA、K8s 等多源镜像入口提前验证。后面的缓存、GPU、探针和网关策略,仍然需要按实际环境逐层检查。