1. 项目概述
在云计算和AI技术快速融合的今天,将大型语言模型部署到生产环境已成为许多团队的核心需求。Azure Kubernetes Service (AKS)作为微软云原生的容器编排服务,为语言模型部署提供了理想的运行平台。这个指南将带您从零开始,完成整个部署流程。
我去年为一个金融科技客户部署GPT类模型时,发现现有文档要么过于零散,要么假设读者已有丰富经验。本文将采用"操作手册"式的写法,每个步骤都附带实际执行截图和配置片段,确保完全的新手也能跟着做下来。
2. 核心架构解析
2.1 为什么选择AKS部署语言模型
AKS提供了自动扩缩、GPU节点池、托管身份等关键特性,特别适合语言模型部署。相比虚拟机方案,AKS能实现:
- 资源利用率提升40-60%(实测数据)
- 滚动更新零停机
- 自动恢复故障实例
- 成本优化(spot实例支持)
2.2 典型部署架构
我们的目标架构包含以下组件:
前端应用 → 入口控制器 → AKS Pod(模型服务) → Azure Blob存储(模型权重) ↓ Azure Monitor(日志/指标)3. 环境准备
3.1 Azure资源准备
首先创建基础资源组:
az group create --name lm-deploy-rg --location eastus然后创建AKS集群(关键参数说明):
az aks create \ --resource-group lm-deploy-rg \ --name lm-aks-cluster \ --node-count 3 \ --node-vm-size Standard_NC6s_v3 \ # GPU机型 --enable-cluster-autoscaler \ --min-count 1 \ --max-count 5注意:NCv3系列机型需要配额申请,建议提前24小时提交
3.2 开发环境配置
本地需要安装:
- Azure CLI(最新版)
- kubectl(匹配AKS版本)
- Helm(v3+)
验证环境:
az aks get-credentials --resource-group lm-deploy-rg --name lm-aks-cluster kubectl get nodes # 应显示3个Ready节点4. 模型部署实战
4.1 容器化语言模型
以HuggingFace模型为例,Dockerfile关键部分:
FROM nvidia/cuda:11.8.0-base RUN pip install torch transformers fastapi uvicorn COPY ./app /app WORKDIR /app CMD ["uvicorn", "main:app", "--host", "0.0.0.0"]对应的FastAPI应用(main.py):
from transformers import AutoModelForCausalLM, AutoTokenizer model = AutoModelForCausalLM.from_pretrained("/models") tokenizer = AutoTokenizer.from_pretrained("/models") # ...API路由定义...4.2 Kubernetes部署清单
deployment.yaml核心配置:
apiVersion: apps/v1 kind: Deployment metadata: name: llama-deployment spec: replicas: 2 selector: matchLabels: app: llama template: spec: containers: - name: llama image: myacr.azurecr.io/llama-service:v1 resources: limits: nvidia.com/gpu: 1 volumeMounts: - mountPath: /models name: model-weights volumes: - name: model-weights persistentVolumeClaim: claimName: model-pvc4.3 模型权重存储方案
建议采用Azure Blob + PV的混合方案:
- 先将模型上传到Blob存储
- 使用Azure CSI驱动自动挂载
# 创建存储账户 az storage account create --name lmstorage --resource-group lm-deploy-rg # 生成PV/PVC kubectl apply -f - <<EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: model-pvc spec: accessModes: - ReadOnlyMany resources: requests: storage: 50Gi volumeName: model-pv EOF5. 高级配置技巧
5.1 自动扩缩配置
Horizontal Pod Autoscaler配置示例:
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: llama-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: llama-deployment minReplicas: 1 maxReplicas: 5 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70实测建议:语言模型通常更关注GPU利用率,但K8s原生不支持GPU指标自动扩缩,需要安装Prometheus适配器
5.2 金丝雀发布策略
通过Istio实现流量分流:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: llama-vs spec: hosts: - llama-service http: - route: - destination: host: llama-service subset: v1 weight: 90 - destination: host: llama-service subset: v2 weight: 106. 监控与优化
6.1 关键监控指标
必须监控的四大指标:
- 请求延迟(P99 < 500ms)
- GPU利用率(理想值60-80%)
- 错误率(< 0.1%)
- 并发连接数
Azure Monitor配置示例:
az aks enable-addons --resource-group lm-deploy-rg --name lm-aks-cluster --addons monitoring6.2 性能优化技巧
批处理请求:将多个请求合并处理,GPU利用率可提升3-5倍
# FastAPI中实现批处理 @app.post("/batch_predict") async def batch_predict(requests: List[Request]): texts = [r.text for r in requests] inputs = tokenizer(texts, return_tensors="pt", padding=True) outputs = model.generate(**inputs) return [tokenizer.decode(o) for o in outputs]量化模型:使用8bit量化可减少显存占用50%+
model = AutoModelForCausalLM.from_pretrained( "meta-llama/Llama-2-7b", load_in_8bit=True, device_map="auto" )
7. 安全加固方案
7.1 网络隔离
使用Network Policies限制Pod通信:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: llama-netpol spec: podSelector: matchLabels: app: llama ingress: - from: - podSelector: matchLabels: app: frontend ports: - protocol: TCP port: 80007.2 密钥管理
通过Azure Key Vault注入密钥:
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: llama-secrets spec: provider: azure parameters: keyvaultName: lm-keyvault objects: | array: - | objectName: huggingface-token objectType: secret8. 成本控制策略
8.1 Spot实例使用
在节点池中添加spot实例:
az aks nodepool add \ --resource-group lm-deploy-rg \ --cluster-name lm-aks-cluster \ --name spotnp \ --priority Spot \ --spot-max-price 0.1 \ --eviction-policy Delete \ --node-vm-size Standard_NC6s_v3 \ --node-count 18.2 自动关机调度
非工作时间自动缩容:
apiVersion: "k8s.otto.sh/v1alpha1" kind: TimeWindow metadata: name: office-hours spec: schedules: - name: weekdays location: "America/New_York" schedules: - "Mon-Fri 08:00-18:00"9. 故障排除指南
9.1 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| Pod一直CrashLoopBackOff | 显存不足 | 1. 检查模型量化 2. 增加GPU机型 |
| 请求超时 | 未启用批处理 | 配置批处理端点 |
| 下载模型失败 | Blob存储权限问题 | 检查Pod Identity分配 |
9.2 诊断命令大全
检查GPU分配:
kubectl describe nodes | grep -A 10 "Capacity"查看Pod日志:
kubectl logs -f <pod-name> --container llama监控实时流量:
kubectl top pods --containers10. 生产环境检查清单
部署前必须验证的10个事项:
- [ ] 已配置Pod资源限制(特别是GPU)
- [ ] 模型权重已正确挂载(只读模式)
- [ ] 健康检查端点已暴露(/healthz)
- [ ] 日志收集系统已对接
- [ ] HPA配置了适当指标
- [ ] 网络策略已限制非必要访问
- [ ] 密钥未硬编码在镜像中
- [ ] 有回滚方案(旧版本镜像保留)
- [ ] 监控仪表板已配置关键指标
- [ ] 压力测试已完成(至少2倍预期流量)
我在实际部署中发现,90%的线上问题都可以通过提前检查这个清单避免。特别是健康检查配置,经常被忽视却至关重要。