使用NVIDIA NIM在阿里云ACK中加速LLM推理

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
可观测监控 Prometheus 版,每月50GB免费额度
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 介绍在阿里云ACK集群上结合AI套件能力快速部署NVIDIA NIM模型推理服务,同时提供全面的监控指标和实现弹性伸缩。

【阅读原文】戳:使用NVIDIA NIM在阿里云ACK中加速LLM推理

大语言模型(LLM)是近年来发展迅猛并且激动人心的热点话题,引入了许多新场景,满足了各行各业的需求。随着开源模型能力的不断增强,越来越多的企业开始尝试在生产环境中部署开源模型,将AI模型接入到现有的基础设施,优化系统延迟和吞吐量,完善监控和安全等方面。然而要在生产环境中部署这一套模型推理服务过程复杂且耗时。为了简化流程,帮助企业客户加速部署生成式AI模型,本文结合NVIDIA NIM[1](一套专为安全、可靠地部署高性能AI模型推理而设计的微服务,是一套易于使用的预构建容器化工具)和阿里云容器服务ACK[2]等产品,提供了一套开箱即用,可以快速构建一个高性能、可观测、灵活弹性的LLM模型推理服务的操作指南。

 

 

 

阿里云容器服务(ACK)云原生AI套件

 

 

阿里云容器服务Kubernetes版ACK(Container Service for Kubernetes)是全球首批通过Kubernetes一致性认证的服务平台,提供高性能的容器应用管理服务,支持企业级Kubernetes容器化应用的生命周期管理,让您轻松高效地在云端运行Kubernetes容器化应用。

云原生AI套件[3]是阿里云容器服务ACK提供的云原生AI技术和产品方案。使用云原生AI套件,您可以充分利用云原生架构和技术,在 Kubernetes 容器平台上快速定制化构建AI生产系统,并为AI/ML应用和系统提供全栈优化。云原生AI套件支持使用Kubeflow社区开源的命令行工具Arena[4],对深度学习核心生产环节(包括数据管理、模型训练、模型评估、推理服务部署等)任务进行简单抽象和高效管理,同时降低Kubernetes复杂概念带来的使用复杂度。Arena可以实现分布式训练任务的快速提交,并进行任务的生命周期管理。此外,云原生AI套件还提供针对分布式场景优化的调度策略,例如Binpack算法分配策略,提升GPU卡利用率,还支持自定义的任务优先级管理和租户弹性资源配额控制,在确保用户资源分配的基础上,通过资源共享的方式来提升集群的整体资源利用率。

 

 

 

方案介绍

 

 

本文将介绍如何在阿里云ACK集群上,使用云原生AI套件集成开源推理服务框架KServe[5],快速部署NVIDIA NIM。同时,结合阿里云的Prometheus和Grafana服务,快速搭建监控大盘,实时观测推理服务状态。利用NVIDIA NIM提供丰富的监控指标,如num_requests_waiting,配置推理服务弹性扩缩容策略。当有突发流量导致推理服务处理请求排队时,能自动扩容新的实例来应对高峰流量。整体解决方案架构如下所示:

 

 

 

NVIDIA NIM on ACK

 

在本文中,我们将介绍在ACK集群上部署NVIDIA NIM的步骤,总体步骤如下:


1. 创建ACK集群并安装云原生AI套件,ack-kserve等组件。

2. 使用Arena提交KServe推理服务,使用NIVDIA NIM容器,部署llama3 8B模型。

3. 为推理服务配置监控,实时观测推理服务状态。

4. 基于排队中请求数指标配置弹性扩缩容策略,自动灵活地调整模型服务实例的规模。

 

 

 

部署流程

 

 

首先需要创建包含GPU的Kubernetes集群[6],并部署云原生AI套件[7]。为了在集群中使用KServe管理推理服务,还需要安装ack-kserve️[8]。集群环境准备好后,就可以参考下列步骤开始部署服务了。

 

重要:您应自觉遵守第三方模型的用户协议、使用规范和相关法律法规,并就使用第三方模型的合法性、合规性自行承担相关责任。

 


1.参考NVIDIA NIM文档[9],生成NVIDIA NGC[10] API key,并申请需要部署的模型镜像访问权限,比如本文中使用的Llama3-8b-instruct[11]。请阅读并承诺遵守Llama模型的自定义可商用开源协议[12]

 


2.创建imagePullSecret,用于从NGC私有仓库拉取NIM镜像。

 

export NGC_API_KEY=<your-ngc-api-key>
kubectl create secret docker-registry ngc-secret \
 --docker-server=nvcr.io\
 --docker-username='$oauthtoken'\
 --docker-password=${NGC_API_KEY}

 


3.创建nvidia-nim-secret,用于在容器内访问NGC私有仓库,参考nim-deploy部署文档[13]

 

kubectl apply -f-<<EOF
apiVersion: v1
kind: Secret
metadata:
  name: nvidia-nim-secrets
stringData:
  NGC_API_KEY: <your-ngc-api-key>
EOF

 


4.为目标集群配置存储卷PV和存储声明PVC,后续模型文件将会下载到创建的共享存储中。具体操作,请参见使用NAS静态存储卷[14]

 

以下为示例PV的配置信息:

 

配置项
说明
存储卷类型
NAS
名称 nim-model
访问模式
ReadWriteMany
挂载点域名
您可以通过选择挂载点或者自定义的方式定义集群载NAS文件系统中挂载点的挂载地址。关于如何查看挂载点地址,请参见查看挂载点地址[15]
挂载路径 指定模型所在的路径,如/nim-model

 

以下为示例PVC的配置信息:

 

配置项
说明
存储声明类型 NAS
名称
nim-model
分配模式
选择已有存储卷
已有存储卷
单击选择已有存储卷链接,选择已创建的存储卷PV。

 


5.执行下列命令,部署一个KServe推理服务,使用NVIDIA NIM提供的镜像,指定使用一个NVIDIA GPU,将PVC挂载到容器内的/mnt/models目录用于保存模型文件,配置autoscalerClass=external指定使用自定义HPA策略,同时还开启Prometheus采集推理服务监控指标,用于后续在Grafana中搭建监控大盘。等待容器启动后,即可使用Llama3-8b-instruct模型提供推理服务。

 

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

 

预期输出:

 

INFO[0004] The Job llama3-8b-instruct has been submitted successfully
INFO[0004] You can run `arena serve get llama3-8b-instruct --type kserve -n default` to check the job status

 

输出结果表明推理服务已部署成功。

 


6.推理服务部署完成后,可通过执行以下命令,查看KServe推理服务的部署情况。

 

arena serve get llama3-8b-instruct

 

预期输出:

 

Name:       llama3-8b-instruct
Namespace:  default
Type:       KServe
Version:    1
Desired:    1
Available:  1
Age:        24m
Address:    http://llama3-8b-instruct-default.example.com
Port:       :80
GPU:        1
Instances:
  NAME                                           STATUS   AGE  READY  RESTARTS  GPU  NODE
  ----                                           ------   ---  -----  --------  ---  ----
  llama3-8b-instruct-predictor-545445b4bc-97qc5  Running  24m
    1/1    0         1    ap-southeast-1.172.16.xx.xxx

 

输出结果表明,KServe推理服务部署成功,模型访问地址为:

 

http://llama3-8b-instruct-default.example.com

 


7.接下来就可以访问推理服务了,可通过使用获取到的Nginx Ingress网关地址访问推理服务。

 

# Obtain the IP address of the Nginx ingress.
NGINX_INGRESS_IP=$(kubectl -n kube-system get svc nginx-ingress-lb -ojsonpath='{.status.loadBalancer.ingress[0].ip}')
# Obtain the Hostname of the Inference Service.
SERVICE_HOSTNAME=$(kubectl get inferenceservice llama3-8b-instruct -o jsonpath='{.status.url}' | cut -d "/" -f 3)
# Send a request to access the inference service.
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}'

 

预期输出:

 

{"id":"cmpl-70af7fa8c5ba4fe7b903835e326325ce","object":"chat.completion","created":1721557865,"model":"meta/llama3-8b-instruct","choices":[{"index":0,"message":{"role":"assistant","content":"It sounds like you're about to tell a story! I'd love to hear it. Please go ahead and continue with \"Once upon a time...\""},"logprobs":null,"finish_reason":"stop","stop_reason":128009}],"usage":{"prompt_tokens":14,"total_tokens":45,"completion_tokens":31}}

 

输出结果表明,已经能够通过Nginx Ingress网关地址访问推理服务,并成功返回推理结果。

 

 

 

 

监控

 

 

 

NVIDIA NIM提供了丰富的Prometheus监控指标,比如首token时延、当前正在运行的请求数、请求token数、生成token数等指标。结合阿里云Prometheus和Grafana服务,可以快速在Grafana中搭建监控大盘,实时观测推理服务状态。

 

1.已开启阿里云Prometheus监控组件。具体操作,请参见开启阿里云Prometheus监控[16]

 

2.创建grafana工作区,登录Grafana的Dashboards页面。

 

3.导入NVIDIA NIM提供的dashboard样例[17]

 

 

4.成功导入后,dashboard示例如下:

 

 

 

 

弹性伸缩

 

 

 

在部署与管理KServe模型服务过程中,需应对模型推理服务面临的高度动态负载波动。KServe通过集成Kubernetes原生的HPA(Horizontal Pod Autoscaler)技术及扩缩容控制器,实现了根据CPU利用率、内存占用情况、GPU利用率以及自定义性能指标,自动灵活地调整模型服务Pod的规模,以确保服务效能与稳定性。

 

基于排队请求数配置自定义指标的弹性扩缩容策略

 

自定义指标的扩缩容依赖ACK提供的ack-alibaba-cloud-metrics-adapter组件与Kubernetes HPA机制实现。详细信息,请参见基于阿里云Prometheus指标的容器水平伸缩[18]

 

以下示例演示如何基于NVIDIA NIM提供的num_requests_waiting指标配置扩缩容策略。

 


1.已部署阿里云Prometheus和ack-alibaba-cloud-metrics-adapter,请参见基于阿里云Prometheus指标的容器水平伸缩

 


2.在Helm列表的操作列,单击ack-alibaba-cloud-metrics-adapter对应的更新。在custom字段下添加如下rules。

 

- seriesQuery: num_requests_waiting{namespace!="",pod!=""}
  resources:
    overrides:
      namespace: {resource: "namespace"}
      pod: {resource: "pod"}
  metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)

 


3.通过Custom Metrics进行容器伸缩,示例配置了当等待中的请求数超过10则进行扩容。

 

使用以下内容,创建hpa.yaml文件。

 

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: llama3-8b-instruct-hpa
  namespace: default
spec:
  # HPA的最小Pod数量和最大Pod数量。
  minReplicas: 1
  maxReplicas: 3
  # 监控的指标数组,支持多种类型的指标共存。
  metrics:
  - pods:
      metric:
        name: num_requests_waiting
      target:
        averageValue: 10
        type: AverageValue
    type: Pods
  # HPA的伸缩对象描述,HPA会动态修改该对象的Pod数量。
  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

 

预期输出:

 

NAME                     REFERENCE                                 TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
llama3-8b-instruct-hpa   Deployment/llama3-8b-instruct-predictor   0/10      1         3         1          34s

 


4.执行以下命令,对服务进行压测。

 

说明Hey压测工具的详细介绍,请参见Hey[19]

 

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

 


5.在压测期间,重新打开一个终端,执行以下命令查看服务的扩缩容情况。

 

kubectl describe hpa llama3-8b-instruct-hpa

 

预期输出包含如下内容:

 

Events:
  Type    Reason             Age   From                       Message
  ----    ------             ----  ----                       -------
  Normal  SuccessfulRescale  52s   horizontal-pod-autoscaler  New size: 3; reason: pods metric num_requests_waiting above target

 

预期输出表明在压测期间Pod数会扩容到2,而当压测结束后,经过一段时间(约为5分钟),Pod缩容到1。即可以实现自定义指标的扩缩容。

 

 

 

 

总结

 

 

 

本文通过在阿里云容器服务ACK上部署NVIDIA NIM,结合阿里云Prometheus和 Grafana服务,快速在Grafana中搭建监控大盘,实时观测推理服务状态。为应对模型推理服务面临的动态负载波动,基于排队中的请求数配置自定义指标的弹性扩缩容策略,使模型推理服务实例根据等待中的请求数动态扩缩容。通过以上方式,可以快速构建一个高性能、可观测、极致弹性的模型推理服务。

 


相关链接:

 

[1]NVIDIA NIM:

https://www.nvidia.com/en-us/ai/#referrer=ai-subdomain

 

[2]阿里云容器服务ACK:

https://help.aliyun.com/zh/ack/

 

[3]云原生AI套件

https://help.aliyun.com/zh/ack/cloud-native-ai-suite/

 

[4]Arena

https://github.com/kubeflow/arena

 

[5]KServe

https://github.com/kserve/kserve

 

[6]创建包含GPU的Kubernetes集群:

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/create-an-ack-managed-cluster-with-gpu-accelerated-nodes?spm=a2c4g.171073.0.0.4c78f95a00Mb5P

 

[7]部署云原生AI套件:

https://help.aliyun.com/zh/ack/cloud-native-ai-suite/user-guide/deploy-the-cloud-native-ai-suite#section-2al-4w3-dpd

 

[8]安装ack-kserve️:

https://help.aliyun.com/zh/ack/cloud-native-ai-suite/user-guide/installation-ack-kserve

 

[9]NVIDIA NIM文档:

https://docs.nvidia.com/nim/large-language-models/latest/getting-started.html#generate-an-api-key

 

[10]NVIDIA NGC

https://catalog.ngc.nvidia.com/?filters=&orderBy=weightPopularDESC&query=&page=&pageSize=

 

[11]Llama3-8b-instruct

https://build.nvidia.com/meta/llama3-8b

 

[12]自定义可商用开源协议:

https://ai.meta.com/resources/models-and-libraries/llama-downloads/nim-deploy

 

[13]nim-deploy部署文档:

https://github.com/NVIDIA/nim-deploy/blob/main/kserve/README.md

 

[14]使用NAS静态存储卷:

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/mount-statically-provisioned-nas-volumes

 

[15]查看挂载点地址:

https://help.aliyun.com/zh/nas/user-guide/manage-mount-targets#section-sjv-ozt-711

 

[16]开启阿里云Prometheus监控:

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/use-alibaba-cloud-prometheus-service-to-monitor-an-ack-cluster?spm=a2c4g.11186623.0.0.612b63c5QDfm5F#section-o0u-mkk-58y

 

[17]dashboard样例:

https://docscontent.nvidia.com/sphinx/0000018f-7ee8-d345-a7bf-ffeadf9c0000/0000018f-7ee7-db2d-a1ff-7ef744750000/nim/large-language-models/latest/_downloads/66e67782ce543dcccec574b1483f0ea0/nim-dashboard-example.json

 

[18]基于阿里云Prometheus指标的容器水平伸缩:

https://help.aliyun.com/zh/ack/serverless-kubernetes/user-guide/horizontal-pod-scaling-based-on-prometheus-service-metrics-1

 

[19]Hey:

https://github.com/rakyll/hey


我们是阿里巴巴云计算和大数据技术幕后的核心技术输出者。

欢迎关注 “阿里云基础设施”同名微信微博知乎

获取关于我们的更多信息~


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
8天前
|
人工智能 Prometheus 监控
使用 NVIDIA NIM 在阿里云容器服务(ACK)中加速 LLM 推理
本文介绍了在阿里云容器服务 ACK 上部署 NVIDIA NIM,结合云原生 AI 套件和 KServe 快速构建高性能模型推理服务的方法。通过阿里云 Prometheus 和 Grafana 实现实时监控,并基于排队请求数配置弹性扩缩容策略,提升服务稳定性和效率。文章提供了详细的部署步骤和示例,帮助读者快速搭建和优化模型推理服务。
58 7
使用 NVIDIA NIM 在阿里云容器服务(ACK)中加速 LLM 推理
|
13天前
|
Kubernetes 网络虚拟化 Docker
K8S镜像下载报错解决方案(使用阿里云镜像去下载kubeadm需要的镜像文件)
文章提供了一个解决方案,用于在无法直接访问Google镜像仓库的情况下,通过使用阿里云镜像来下载kubeadm所需的Kubernetes镜像。
33 3
K8S镜像下载报错解决方案(使用阿里云镜像去下载kubeadm需要的镜像文件)
|
13天前
|
Cloud Native 关系型数据库 Serverless
基于阿里云函数计算(FC)x 云原生 API 网关构建生产级别 LLM Chat 应用方案最佳实践
本文带大家了解一下如何使用阿里云Serverless计算产品函数计算构建生产级别的LLM Chat应用。该最佳实践会指导大家基于开源WebChat组件LobeChat和阿里云函数计算(FC)构建企业生产级别LLM Chat应用。实现同一个WebChat中既可以支持自定义的Agent,也支持基于Ollama部署的开源模型场景。
106 11
|
14天前
|
编解码 定位技术 计算机视觉
多模态LLM视觉推理能力堪忧,浙大领衔用GPT-4合成数据构建多模态基准
【9月更文挑战第2天】浙江大学领衔的研究团队针对多模态大型模型(MLLM)在抽象图像理解和视觉推理上的不足,提出了一种利用GPT-4合成数据构建多模态基准的方法。该研究通过合成数据提高了MLLM处理图表、文档等复杂图像的能力,并构建了一个包含11,193条指令的基准,涵盖8种视觉场景。实验表明,这种方法能显著提升模型性能,但依赖闭源模型和高计算成本是其局限。论文详细内容见:https://arxiv.org/pdf/2407.07053
45 10
|
21天前
|
存储 Kubernetes Go
【Azure K8S | AKS】在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例
【Azure K8S | AKS】在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例
|
12天前
|
存储 Kubernetes 负载均衡
CentOS 7.9二进制部署K8S 1.28.3+集群实战
本文详细介绍了在CentOS 7.9上通过二进制方式部署Kubernetes 1.28.3+集群的全过程,包括环境准备、组件安装、证书生成、高可用配置以及网络插件部署等关键步骤。
92 3
CentOS 7.9二进制部署K8S 1.28.3+集群实战
|
12天前
|
Kubernetes 负载均衡 前端开发
二进制部署Kubernetes 1.23.15版本高可用集群实战
使用二进制文件部署Kubernetes 1.23.15版本高可用集群的详细教程,涵盖了从环境准备到网络插件部署的完整流程。
29 2
二进制部署Kubernetes 1.23.15版本高可用集群实战
|
12天前
|
存储 Kubernetes 测试技术
k8s使用pvc,pv,sc关联ceph集群
文章介绍了如何在Kubernetes中使用PersistentVolumeClaim (PVC)、PersistentVolume (PV) 和StorageClass (SC) 来关联Ceph集群,包括创建Ceph镜像、配置访问密钥、删除默认存储类、编写和应用资源清单、创建资源以及进行访问测试的步骤。同时,还提供了如何使用RBD动态存储类来关联Ceph集群的指南。
27 7
|
12天前
|
存储 Kubernetes 数据安全/隐私保护
k8s对接ceph集群的分布式文件系统CephFS
文章介绍了如何在Kubernetes集群中使用CephFS作为持久化存储,包括通过secretFile和secretRef两种方式进行认证和配置。
21 5
|
12天前
|
Kubernetes 负载均衡 应用服务中间件
kubeadm快速构建K8S1.28.1高可用集群
关于如何使用kubeadm快速构建Kubernetes 1.28.1高可用集群的详细教程。
29 2