NVIDIA NIM微服务在Kubernetes中的自动扩缩容实践
1. 项目概述
在2025年3月18日之后,NVIDIA Triton推理服务器已正式成为NVIDIA Dynamo平台的一部分,并更名为NVIDIA Dynamo Triton。NVIDIA NIM微服务作为模型推理容器,可以在Kubernetes集群中部署运行。在生产环境中,理解这些微服务的计算和内存特性对于建立有效的自动扩缩容方案至关重要。
本文将详细介绍如何为基于NVIDIA NIM的LLM模型设置Kubernetes水平Pod自动扩缩容(HPA),通过特定的自定义指标实现微服务的自动扩缩容。这个方案特别适合需要处理动态负载变化的大语言模型推理场景,比如在线聊天机器人、内容生成服务等。
2. 环境准备与组件部署
2.1 系统要求
在开始之前,需要确保满足以下先决条件:
- 有效的NVIDIA AI Enterprise许可证(NVIDIA NIM for LLMs需要此许可证才能自托管部署)
- Kubernetes集群版本1.29或更高(推荐使用DGX Cloud集群)
- 对Kubernetes集群的管理员访问权限
- 已安装kubectl和HELM CLI工具
重要提示:部署NIM for LLMs需要生成NGC API KEY,以便Kubernetes集群能够下载容器镜像。
2.2 关键组件安装
2.2.1 Kubernetes Metrics Server
Metrics Server负责从Kubelets收集资源指标,并通过Metrics API将它们暴露给Kubernetes API Server。这是Horizontal Pod Autoscaler和kubectl top命令的基础。
安装命令:
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/ helm upgrade --install metrics-server metrics-server/metrics-server2.2.2 Prometheus和Grafana
Prometheus和Grafana是常用的指标收集和可视化工具。我们使用kube-prometheus-stack Helm chart来安装整套监控方案:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update helm install [RELEASE_NAME] prometheus-community/kube-prometheus-stack2.2.3 Prometheus Adapter
Prometheus适配器将Prometheus收集的指标通过Metrics API暴露给Kubernetes apiserver,使HPA能够基于Pod的自定义指标进行扩缩容决策。
安装命令:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update helm install <name> prometheus-community/prometheus-adapter -n <namespace>安装后需要确认适配器正确指向Prometheus服务端点。可以通过以下命令编辑部署配置:
kubectl edit deployment prom-adapter-prometheus-adapter -n prometheus在配置中确保prometheus-url参数正确指向Prometheus服务,例如:
spec: affinity: {} containers: - args: - /adapter - --secure-port=6443 - --cert-dir=/tmp/cert - --prometheus-url=http://prometheus-prometheus.prometheus.svc:9090 - --metrics-relist-interval=1m - --v=4 - --config=/etc/adapter/config.yaml image: registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.12.03. NIM微服务部署与指标收集
3.1 部署NIM微服务
本教程使用meta/llama-3.1-8b-instruct模型的NIM for LLMs微服务作为扩缩容示例。部署方式有两种选择:
- 使用Helm直接部署
- 使用NIM Operator进行部署
部署完成后,需要记录NIM for LLMs微服务的服务名称和命名空间,这些信息将在后续命令中频繁使用。
3.2 指标暴露与监控
NIM for LLMs已经内置暴露了Prometheus端点,包含多个有价值的指标。可以通过以下命令访问指标端点:
kubectl -n <namespace> port-forward svc/<service-name> 8080在浏览器中访问localhost:8080/metrics,查找名为gpu_cache_usage_perc的特定指标。这个指标显示了KV缓存的利用率百分比,由vLLM栈报告,将作为我们自动扩缩容的基础指标。
为了更直观地观察这些指标,可以使用NIM for LLMs的Grafana仪表板。下载JSON仪表板文件并上传到Grafana实例中。
4. 负载生成与指标观察
4.1 负载生成工具设置
我们将使用genai-perf工具生成负载。首先创建一个包含NVIDIA Triton的Pod:
kubectl run <pod-name> --image=nvcr.io/nvidia/tritonserver:24.10-py3-sdk -n <namespace> --command -- sleep 100000进入Pod并安装必要的工具:
kubectl exec --stdin --tty <pod-name> -- /bin/bash pip install --upgrade huggingface_hub[cli] export HF_TOKEN=<hf-token> huggingface-cli login --token $HF_TOKEN4.2 负载生成与指标观察
设置环境变量并生成负载:
export INPUT_SEQUENCE_LENGTH=200 export INPUT_SEQUENCE_STD=10 export OUTPUT_SEQUENCE_LENGTH=200 export CONCURRENCY=10 export MODEL=meta/llama-3.1-8b-instruct genai-perf profile \ -m $MODEL \ --endpoint-type chat \ --service-kind openai \ --streaming -u meta-llama3-8b:8080 \ --synthetic-input-tokens-mean $INPUT_SEQUENCE_LENGTH \ --synthetic-input-tokens-stddev $INPUT_SEQUENCE_STD \ --concurrency $CONCURRENCY \ --output-tokens-mean $OUTPUT_SEQUENCE_LENGTH \ --extra-inputs max_tokens:$OUTPUT_SEQUENCE_LENGTH \ --extra-inputs min_tokens:$OUTPUT_SEQUENCE_LENGTH \ --extra-inputs ignore_eos:true \ --tokenizer meta-llama/Meta-Llama-3-8B-Instruct -- -v --max-threads=256通过改变并发数(100、200、300、400)生成不同负载,在Grafana仪表板中可以观察到KV缓存利用率百分比的变化。例如,并发数为100时利用率可能为9.40%,而并发数400时可能达到40.9%。
5. HPA配置与自动扩缩容
5.1 创建HPA资源
基于gpu_cache_usage_perc指标创建HPA资源:
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: gpu-hpa-cache spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: meta-llama3-8b minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metric: name: gpu_cache_usage_perc target: type: AverageValue averageValue: 100m应用配置:
kubectl create -f hpa-gpu-cache.yaml -n <namespace>5.2 扩缩容观察
使用不同并发数(10、100、200)运行genai-perf,观察HPA指标变化:
kubectl get hpa -n <namespace> -w当指标超过阈值时,HPA会自动增加Pod数量。例如:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE gpu-hpa-cache Deployment/meta-llama3-8b 208m/100m 1 10 3 7m1s缩容过程由--horizontal-pod-autoscaler-downscale-stabilization参数控制,默认等待5分钟后开始逐步缩容。
6. 高级配置与优化建议
6.1 多指标扩缩容
除了KV缓存利用率外,还可以考虑以下指标进行扩缩容:
- 请求延迟
- 请求吞吐量
- GPU计算利用率
可以在一个HPA资源中配置多个指标,实现更全面的扩缩容策略。
6.2 自定义PromQL指标
通过Prometheus查询语言(PromQL)可以创建新的自定义指标,并将其添加到Prometheus适配器的configmap中,供HPA使用。
6.3 性能调优建议
- 根据实际负载特点调整扩缩容阈值,避免过于敏感或迟钝的反应
- 考虑设置适当的Pod资源请求和限制,确保每个Pod有足够的计算资源
- 监控扩缩容事件和性能指标,持续优化配置参数
- 在非高峰期测试系统行为,确保扩缩容策略符合预期
在实际部署中,我发现将KV缓存利用率阈值设置在70-80%之间能够在响应时间和资源利用率之间取得良好平衡。同时,建议设置适当的Pod销毁策略,确保正在处理的请求能够正常完成。
