使用 NVIDIA NIM 在阿里云 ACK 中加速 LLM 推理
大语言模型(LLM)的热度已经不用再多说了——从对话机器人到代码生成,从内容创作到行业智能化,几乎每个领域都在探索如何用好它。但把模型真正部署到生产环境,却往往是另一回事:延迟、吞吐量、安全性、监控……每一步都不简单。尤其是当开源模型越来越强,越来越多的企业开始尝试把它们接入现有基础设施时,推理服务的部署成了一道绕不过去的坎。
好消息是,现在有了NVIDIA NIM和阿里云容器服务ACK这套组合拳。NVIDIA NIM是一套专为安全、可靠地部署高性能AI模型推理而设计的微服务,本质上就是预构建的容器化工具。结合ACK的云原生能力,可以快速搭起一套开箱即用、高性能、可观测、灵活弹性的LLM推理服务。下面,我们就把整个操作过程掰开了揉碎了讲清楚。

阿里云容器服务(ACK)云原生AI套件
阿里云容器服务Kubernetes版ACK是全球首批通过Kubernetes一致性认证的服务平台,提供高性能的容器应用管理,让企业轻松在云端运行Kubernetes容器化应用。
云原生AI套件则是ACK上专门为AI/ML场景打造的产品方案。它充分利用云原生架构,在Kubernetes上快速构建AI生产系统,并全栈优化。尤其值得一提的是,它支持Kubeflow社区开源的命令行工具Arena,能把深度学习核心环节(数据管理、模型训练、评估、推理部署等)抽象成简单命令,大幅降低Kubernetes的复杂度。Arena支持分布式训练任务的快速提交和生命周期管理。此外,云原生AI套件还提供针对分布式优化的调度策略(比如Binpack算法提升GPU利用率),以及自定义的任务优先级和租户弹性配额控制,在保障资源分配的同时,通过共享提升整体利用率。
方案介绍
整体思路是:在ACK集群上,用云原生AI套件集成开源推理服务框架KServe,快速部署NVIDIA NIM。同时接入阿里云的Prometheus和Grafana服务,搭建监控大盘实时观测推理服务状态。利用NVIDIA NIM提供的丰富指标(如num_requests_waiting),配置基于排队请求数的弹性扩缩容策略——一旦突发流量导致请求排队,自动扩容实例应对高峰。架构图如下所示(图片已保留)。
部署流程
首先,需要创建一个包含GPU的Kubernetes集群[1],并部署云原生AI套件[2]。为了在集群中使用KServe管理推理服务,还要安装ack-kserve组件[3]。环境准备好后,按以下步骤操作。
重要提示:
- 参考NVIDIA NIM文档[4],生成NGC API Key,并确认要部署的模型镜像(本文用Llama3-8b-instruct)。请阅读并遵守Llama模型的自定义可商用开源协议[5]。
- 创建imagePullSecret,用于从NGC私有仓库拉取NIM镜像:
export NGC_API_KEY=
kubectl create secret docker-registry ngc-secret \
--docker-server=nvcr.io --docker-username='$oauthtoken' --docker-password=${NGC_API_KEY}
- 创建nvidia-nim-secret,用于容器内访问NGC仓库,参考nim-deploy文档[6]:
kubectl apply -f - <
EOF
- 为目标集群配置存储卷PV和存储声明PVC,模型文件会下载到共享存储中。具体操作请参见使用NAS静态存储卷[7]。示例PV配置如下:
| 配置项 | 说明 |
|---|---|
| 存储卷类型 | NAS |
| 名称 | nim-model |
| 访问模式 | ReadWriteMany |
| 挂载点域名 | 可通过选择挂载点或自定义方式指定,详情参见查看挂载点地址[8] |
| 挂载路径 | 如 /nim-model |
示例PVC配置:
| 配置项 | 说明 |
|---|---|
| 存储声明类型 | NAS |
| 名称 | nim-model |
| 分配模式 | 选择已有存储卷 |
| 已有存储卷 | 选择已创建的PV |
- 执行以下命令,部署KServe推理服务,使用NVIDIA NIM镜像,指定一个NVIDIA GPU,将PVC挂载到容器内/mnt/models目录保存模型,设置autoscalerClass=external使用自定义HPA策略,并开启Prometheus采集监控指标:
arena serve kserve --name=llama3-8b-instruct \
--image=nvcr.io/nim/meta/llama3-8b-instruct:1.0.0 \
--image-pull-secret=ngc-secret --gpus=1 --cpu=8 --memory=32Gi \
--share-memory=32Gi --port=8000 --security-context runAsUser=0 \
--annotation=serving.kserve.io/autoscalerClass=external \
--env NIM_CACHE_PATH=/mnt/models \
--env-from-secret NGC_API_KEY=nvidia-nim-secrets \
--enable-prometheus=true --metrics-port=8000 \
--data=nim-model:/mnt/models
预期输出显示Job提交成功。
- 查看推理服务部署情况:
arena serve get llama3-8b-instruct
预期输出表明服务部署成功,模型访问地址为:http://llama3-8b-instruct-default.example.com
- 通过Nginx Ingress网关地址访问推理服务:
# 获取Nginx Ingress IP
NGINX_INGRESS_IP=$(kubectl -n kube-system get svc nginx-ingress-lb -ojsonpath='{.status.loadBalancer.ingress[0].ip}')
# 获取推理服务Hostname
SERVICE_HOSTNAME=$(kubectl get inferenceservice llama3-8b-instruct -o jsonpath='{.status.url}' | cut -d "/" -f 3)
# 发送请求
curl -H "Host: $SERVICE_HOSTNAME" \
-H "Content-Type: application/json" \
http://$NGINX_INGRESS_IP:80/v1/chat/completions \
-d '{"model": "meta/llama3-8b-instruct", "messages": [{"role": "user", "content": "Once upon a time"}], "max_tokens": 64, "temperature": 0.7, "top_p": 0.9, "seed": 10}'
预期返回推理结果,表明服务正常。
监控
NVIDIA NIM提供了丰富的Prometheus监控指标,比如首token时延、当前运行请求数、请求token数、生成token数等。结合阿里云Prometheus和Grafana,可以快速搭建监控大盘。
- 开启阿里云Prometheus监控组件[9]。
- 创建Grafana工作区,登录Dashboards页面。
- 导入NVIDIA NIM提供的dashboard样例[10]。
- 导入后,即可看到类似下面的监控面板(图片已保留)。
弹性伸缩
模型推理服务的负载波动是家常便饭。KServe通过集成Kubernetes原生的HPA和扩缩容控制器,可以根据CPU、内存、GPU利用率以及自定义指标自动调整Pod数量,确保服务稳定。
基于排队请求数的自定义指标扩缩容
自定义指标扩缩容依赖ACK的ack-alibaba-cloud-metrics-adapter组件与HPA机制。详细步骤参见基于阿里云Prometheus指标的容器水平伸缩[11]。下面演示如何基于NIM的num_requests_waiting指标配置策略。
- 确保已部署阿里云Prometheus和ack-alibaba-cloud-metrics-adapter[11]。
- 在ack-alibaba-cloud-metrics-adapter的Helm更新中,添加以下rules:
- seriesQuery: num_requests_waiting{namespace!="",pod!=""}
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
- 创建HPA配置hpa.yaml,当等待请求数超过10时扩容:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: llama3-8b-instruct-hpa
namespace: default
spec:
minReplicas: 1
maxReplicas: 3
metrics:
- pods:
metric:
name: num_requests_waiting
target:
a verageValue: 10
type: A verageValue
type: Pods
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: llama3-8b-instruct-predictor
应用HPA:
kubectl apply -f hpa.yaml
查看HPA:
kubectl get hpa llama3-8b-instruct-hpa
预期输出显示目标为0/10。
- 使用hey工具对服务进行压测(5分钟,并发400):
hey -z 5m -c 400 -m POST -host $SERVICE_HOSTNAME \
-H "Content-Type: application/json" \
-d '{"model": "meta/llama3-8b-instruct", "messages": [{"role": "user", "content": "Once upon a time"}], "max_tokens": 64}' \
http://$NGINX_INGRESS_IP:80/v1/chat/completions
- 在压测期间查看HPA事件:
kubectl describe hpa llama3-8b-instruct-hpa
预期会看到类似“New size: 3; reason: pods metric num_requests_waiting above target”的事件。压测结束后,约5分钟后Pod自动缩容到1。这就是基于自定义指标自动扩缩容的效果。
总结
本文演示了如何在阿里云容器服务ACK上部署NVIDIA NIM,结合Prometheus和Grafana快速搭建监控大盘,并基于排队请求数配置弹性扩缩容策略。通过这一套方案,企业可以快速构建一个高性能、可观测、极致弹性的模型推理服务,从而把精力更多放在业务本身,而非基础设施的反复折腾上。
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名