用 Knative 给 AI 服务器做 Serverless 推理配置
AI 服务器上做 Serverless 配置,目标不是把整台机器变成无服务器,而是让推理服务按请求启动、空闲时缩容到零,减少显卡空转。
适合请求波动大、模型可以接受冷启动延迟的场景,比如图片分类、文本摘要。
如果你要求毫秒级响应,Serverless 不一定合适。
先确认服务器和集群前提
以下步骤假设你有一台已装好 NVIDIA 驱动和 Docker 的 Linux 服务器,并且能正常执行 nvidia-smi。
推荐用单节点 Kubernetes 加 Knative 做最小验证,生产环境再考虑多节点。
检查驱动和容器运行时:
nvidia-smi
docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi
第二条命令能输出显卡信息,说明 Docker 已经能调用 GPU。
如果报错 could not select device driver,先安装并配置 nvidia-container-toolkit,再重启 Docker。
安装 Knative 并启用 GPU 支持
Knative Serving 负责按请求伸缩,底层用 Kubernetes 调度容器。
单节点环境可以用 k3s 快速起步:
curl -sfL https://get.k3s.io | sh -
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl get nodes
节点状态为 Ready 后,安装 Knative Serving 和 Kourier 网络层。
版本号请以官方发布页为准,不要直接照搬旧版本:
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.12.0/serving-core.yaml
kubectl apply -f https://github.com/knative/net-kourier/releases/download/knative-v1.12.0/kourier.yaml
kubectl patch configmap/config-network -n knative-serving --type merge -p '{"data":{"ingress-class":"kourier.ingress.networking.knative.dev"}}'
安装完成后用 kubectl get pods -n knative-serving 检查,所有 Pod 应为 Running。
部署一个会缩容到零的 GPU 推理服务
准备一个简单的推理镜像,启动后监听 8080 端口。
Knative Service 的配置重点在 autoscaling.knative.dev/min-scale: "0" 和 GPU 资源声明:
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: gpu-infer
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/min-scale: "0"
autoscaling.knative.dev/target: "1"
spec:
containers:
- image: your-registry/infer:latest
ports:
- containerPort: 8080
resources:
limits:
nvidia.com/gpu: "1"
保存为 gpu-infer.yaml 后执行 kubectl apply -f gpu-infer.yaml。
用 kubectl get ksvc gpu-infer 查看状态,等到 READY 为 True 再测试。
验证缩容和常见报错
先发一次请求确认服务可用,再等待约 90 秒观察 Pod 数量:
curl -H "Host: gpu-infer.default.example.com" http://<节点IP>:31896/
kubectl get pods -l serving.knative.dev/service=gpu-infer
请求成功后,Pod 数量先变为 1,空闲后应降为 0 或不再显示。
如果一直没有缩容,检查 min-scale 是否被其他配置覆盖,以及是否有持续健康检查流量。
常见报错中,Insufficient nvidia.com/gpu 说明集群没有识别到 GPU 资源,
需要安装 NVIDIA device plugin;RevisionMissing 通常是镜像拉取失败或端口不一致,
用 kubectl describe ksvc gpu-infer 查看事件。
避坑提醒
- 缩容到零意味着冷启动,首次请求会包含拉镜像和加载模型的时间,大模型可能超过 30 秒,建议设置
min-scale: "1"保底。 - GPU 资源必须写
limits,只写requests不会真正占用显卡。 - 单节点测试时 Kourier 默认使用 NodePort,注意防火墙放行对应端口。
- 不要在生产环境直接套用示例镜像标签
latest,固定版本便于回滚。
按以上步骤完成 AI服务器Serverless配置 后,你可以用 kubectl get pods 和请求日志确认服务是否按预期伸缩。
如果请求量长期稳定,Serverless 的缩容收益有限,保留常驻实例可能更简单。