SuperAPI AI 工具集

llm-inference-scaling

部署与运维

查看项目

更新于 10-15 14:41

技能介绍

用途

该技能用于在 Kubernetes 上对 LLM 推理服务进行水平扩缩容,结合 GPU 感知的自动扩缩、请求排队与成本优化的 Spot 实例策略。当 LLM API 流量不可预测、需要自动扩缩,或需要管理一批 vLLM / TGI 推理 Pod、用 Spot/可抢占 GPU 实例降低推理成本、为批处理推理任务实现基于队列的扩缩、构建共享 GPU 资源的多模型服务平台时适用。

前置条件

  • 带 GPU 节点的 Kubernetes 集群(已安装 NVIDIA operator)
  • 已安装 KEDA(Kubernetes Event-Driven Autoscaler)
  • 带 GPU 指标的 Prometheus(dcgm-exporter 或 gpu-operator)
  • Helm 3+ 用于部署 chart

主要能力

GPU 节点准备

通过 Helm 安装 NVIDIA GPU Operator,处理驱动、容器工具包与 DCGM:

helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update

helm install gpu-operator nvidia/gpu-operator \
  --namespace gpu-operator \
  --create-namespace \
  --set driver.enabled=true \
  --set dcgm.enabled=true \
  --set devicePlugin.enabled=true

kubectl get nodes -l nvidia.com/gpu.present=true
kubectl describe node <gpu-node> | grep nvidia

vLLM 部署(带 GPU 资源)

提供 Deployment 示例,包含 nodeSelector、tolerations、GPU 资源请求与限制、readinessProbe 以及 Hugging Face token 环境变量。示例镜像为 vllm/vllm-openai:latest,模型为 meta-llama/Llama-3.1-8B-Instruct,参数包括 --tensor-parallel-size 1、--gpu-memory-utilization 0.90、--max-num-seqs 128。

基于 Prometheus 指标的 KEDA 扩缩

提供 ScaledObject 示例,设置 minReplicaCount: 1、maxReplicaCount: 8、cooldownPeriod: 300、pollingInterval: 15。触发器使用 Prometheus 指标:

  • vllm_num_requests_waiting,阈值 10(等待请求超过 10 时扩容)
  • vllm_gpu_cache_usage,阈值 0.8(KV cache 超过 80% 时扩容)

基于队列的扩缩(Redis + KEDA)

提供 ScaledJob 示例用于异步批处理推理,minReplicaCount: 0、maxReplicaCount: 20、pollingInterval: 5,触发器为 Redis 列表 inference-jobs,listLength: 5(每 5 个排队任务启动 1 个 worker)。

Spot 实例策略

提供混合节点池配置:通过 ConfigMap 设置 cluster-autoscaler 优先级(spot 优先级 10,on-demand 优先级 50),并通过 nodeAffinity 的 preferredDuringSchedulingIgnoredDuringExecution 为 spot 设置权重 80、on-demand 权重 20。

GPU 节点的集群自动扩缩器

提供 AWS EKS 上安装 cluster-autoscaler 的 Helm 命令,包含 autoDiscovery.clusterName、awsRegion、RBAC 注解、skip-nodes-with-local-storage=false、expander=least-waste,以及为 GPU 节点组添加 cluster-autoscaler.kubernetes.io/safe-to-evict="false" 注解。

扩缩监控指标

提供 Prometheus 查询:

  • 按模型统计 vLLM 队列等待请求:sum(vllm:num_requests_waiting) by (model)
  • 按 Pod 统计 GPU KV cache 利用率(>80% 为瓶颈):avg(vllm:gpu_cache_usage_perc) by (pod)
  • 按模型统计每秒 token 吞吐:sum(rate(vllm:generation_tokens_total[5m])) by (model)
  • P99 首 token 时间:histogram_quantile(0.99, rate(vllm:time_to_first_token_seconds_bucket[5m]))

常见问题

  • Pod 卡在 Pending:无可用 GPU 节点,检查 cluster autoscaler 日志并确认节点组上限。
  • 扩容过慢:cluster autoscaler 延迟加模型加载时间,可预热副本或提高 minReplicaCount。
  • GPU 碎片化:大 GPU 上跑多个小模型,可使用 MIG 分区或合并模型规格。
  • Spot 驱逐导致错误:Spot 实例回收,可添加 PodDisruptionBudget 并使用优雅关闭。
  • KEDA 不扩缩:Prometheus 查询无数据,先在 Prometheus UI 中测试查询。

最佳实践

  • 设置 minReplicaCount: 1 避免冷启动;仅批处理任务可缩到 0。
  • 使用 PodDisruptionBudget 且 minAvailable: 1 以承受 Spot 驱逐。
  • 将模型权重预拉到共享 PVC,可将 Pod 启动速度提升 5–10 倍。
  • 按模型族划分节点池(7B 用 A10G,70B 用 A100)。
  • 使用 Kubernetes VPA 调整 CPU/内存,配合 KEDA 调整副本数。

相关技能

  • vllm-server:vLLM 配置与调优
  • gpu-server-management:GPU 节点设置
  • model-serving-kubernetes:KServe
  • kubernetes-ops:核心 Kubernetes
  • llm-cost-optimization:成本策略