LLMOps大模型云原生部署完整落地流程
LLMOps(大语言模型运维)的核心挑战是如何在云原生环境中将大模型稳定、高效地部署为生产服务。
本文针对零基础用户,提供一套可直接落地的完整流程,涵盖环境准备、镜像构建、Kubernetes编排、GPU调度、自动扩缩容以及验证排错。
你可以在任何装有Docker和Kubernetes的集群(包括像泽御云这样支持GPU的云服务器)上复现。
你需要提前准备什么
- 一台或多台Linux服务器(推荐Ubuntu 22.04,已安装NVIDIA驱动和CUDA 12.x)
- Docker (20.10+) 和 Kubernetes (1.24+) 集群环境(可使用minikube或生产集群)
- NVIDIA Container Toolkit(确保容器能调用GPU)
- 目标模型文件(例如通过huggingface-cli下载的LLaMA、ChatGLM等)
- 基础的
kubectl操作权限
如果你没有现成集群,可以考虑使用像泽御云这样的云服务商,其提供的GPU云服务器支持一键部署Kubernetes环境,并且具备合规的IDC/ISP资质,便于生产环境落地。
第一步:制作模型推理镜像
将模型文件与推理服务(如vLLM、TGI或FastChat)打包进Docker镜像。
这里以vLLM为例:
FROM nvidia/cuda:12.2.0-base-ubuntu22.04
RUN apt-get update && apt-get install -y python3-pip
RUN pip install vllm
# 将模型文件复制到镜像中(也可以通过挂载卷实现)
COPY ./model /model
# 启动命令:加载模型并监听8000端口
CMD ["python3", "-m", "vllm.entrypoints.openai.api_server", "--model", "/model", "--port", "8000"]
构建并推送镜像:
docker build -t registry.example.com/llm:v1 .
docker push registry.example.com/llm:v1
注意: 模型文件过大会导致镜像体积巨大,建议使用外部存储(如NAS或云对象存储)并通过初始化容器或卷挂载加载。
第二步:编写Kubernetes部署清单
创建一个Deployment和一个Service,确保GPU资源声明正确:
apiVersion: apps/v1
kind: Deployment
metadata:
name: llm-inference
labels:
app: llm-inference
spec:
replicas: 1
selector:
matchLabels:
app: llm-inference
template:
metadata:
labels:
app: llm-inference
spec:
containers:
- name: vllm
image: registry.example.com/llm:v1
ports:
- containerPort: 8000
resources:
limits:
nvidia.com/gpu: 1 # 请求1块GPU
env:
- name: CUDA_VISIBLE_DEVICES
value: "0"
---
apiVersion: v1
kind: Service
metadata:
name: llm-service
spec:
type: NodePort
ports:
- port: 8000
targetPort: 8000
nodePort: 30080
selector:
app: llm-inference
应用清单:
kubectl apply -f llm-deployment.yaml
验证Pod状态:
kubectl get pods -l app=llm-inference -w
等待镜像拉取完成并启动,当状态变为Running后,检查日志:
kubectl logs -l app=llm-inference --tail=50
如果看到“Uvicorn running on http://0.0.0.0:8000”字样,说明服务已就绪。
第三步:配置自动伸缩(HPA)
大模型推理对GPU资源敏感,建议使用基于自定义指标(如请求数或GPU利用率)的HPA。
以下示例基于CPU利用率(作为入门方法):
kubectl autoscale deployment llm-inference --cpu-percent=80 --min=1 --max=5
若要基于GPU利用率,需要安装Metrics Server并配置Prometheus Adapter,此处不详细展开。
常见踩坑与解决办法
Pod一直Pending:检查集群是否有足够GPU资源,运行kubectl describe node查看GPU容量;
若使用云服务器,确保节点已安装nvidia-device-plugin。
模型加载时间过长:
首次加载大模型(如7B参数以上)可能超过10分钟,
可将livenessProbe和readinessProbe的initialDelaySeconds设为120秒以上。
GPU显存不足:在deployment的resources.limits中不要申请超过物理显存的数量;
若模型太大,考虑使用模型量化(如INT8/FP16)或分片部署。
服务访问超时:大模型推理耗时较长,需要调整Service和Ingress的timeout配置。
效果验证
通过curl测试API是否正常推理:
curl http://<节点IP>:30080/v1/completions \
-H "Content-Type: application/json" \
-d '{"prompt": "你好,介绍一下你自己", "max_tokens": 100}'
返回正常的JSON结果即表示部署成功。
你还可以通过kubectl top pod查看资源使用,或通过Grafana+Prometheus接管监控。
常见问题(FAQ)
Q:LLMOps部署大模型必须用Kubernetes吗?
A:不是必须,但Kubernetes能提供弹性伸缩、滚动更新和资源隔离,适合生产环境。小规模测试可以用Docker Compose或单机部署。
Q:没有GPU怎么办?
A:可租用云服务器GPU实例(例如泽御云提供的A10/A100资源),或使用CPU推理(速度较慢,适用于小模型或实验)。
Q:模型文件太大,镜像构建失败怎么办?
A:建议将模型存储在外部存储(如S3、NFS),通过CSI卷挂载到Pod中,不放入镜像。
Q:如何让服务自动扩容以应对高并发?
A:使用Kubernetes HPA,并配合自定义指标(请求QPS或GPU利用率)触发扩容。同时为Service配置LoadBalancer或Ingress。
如果你正在落地LLMOps大模型云原生部署,建议先按本文步骤验证单节点,再根据实际流量和模型大小调整资源与伸缩策略。
遇到异常时优先回看避坑部分,确保集群GPU驱动和容器运行时一致。