微信扫码
与创始人交个朋友
我要投稿
大语言模型(LLM)是近年来发展迅猛并且激动人心的热点话题,引入了许多新场景,满足了各行各业的需求。随着开源模型能力的不断增强,越来越多的企业开始尝试在生产环境中部署开源模型,将 AI 模型接入到现有的基础设施,优化系统延迟和吞吐量,完善监控和安全等方面。然而要在生产环境中部署这一套模型推理服务过程复杂且耗时。为了简化流程,帮助企业客户加速部署生成式 AI 模型,本文结合 NVIDIA NIM(一套专为安全、可靠地部署高性能 AI 模型推理而设计的微服务,是一套易于使用的预构建容器化工具) 和阿里云容器服务 ACK 等产品,提供了一套开箱即用,可以快速构建一个高性能、可观测、灵活弹性的 LLM 模型推理服务的操作指南。
阿里云容器服务(ACK)云原生 AI 套件
Cloud Native
阿里云容器服务 Kubernetes 版 ACK(Container Service for Kubernetes)是全球首批通过 Kubernetes 一致性认证的服务平台,提供高性能的容器应用管理服务,支持企业级 Kubernetes 容器化应用的生命周期管理,让您轻松高效地在云端运行 Kubernetes 容器化应用。
云原生 AI 套件是阿里云容器服务 ACK 提供的云原生 AI 技术和产品方案。使用云原生 AI 套件,您可以充分利用云原生架构和技术,在 Kubernetes 容器平台上快速定制化构建 AI 生产系统,并为 AI/ML 应用和系统提供全栈优化。云原生 AI 套件支持使用 Kubeflow 社区开源的命令行工具 Arena,对深度学习核心生产环节(包括数据管理、模型训练、模型评估、推理服务部署等)任务进行简单抽象和高效管理,同时降低 Kubernetes 复杂概念带来的使用复杂度。Arena 可以实现分布式训练任务的快速提交,并进行任务的生命周期管理。此外,云原生 AI 套件还提供针对分布式场景优化的调度策略,例如 Binpack 算法分配策略,提升 GPU 卡利用率,还支持自定义的任务优先级管理和租户弹性资源配额控制,在确保用户资源分配的基础上,通过资源共享的方式来提升集群的整体资源利用率。
方案介绍
Cloud Native
本文将介绍如何在阿里云 ACK 集群上,使用云原生 AI 套件集成开源推理服务框架 KServe,快速部署 NVIDIA NIM。同时,结合阿里云的 Prometheus 和 Grafana 服务,快速搭建监控大盘,实时观测推理服务状态。利用 NVIDIA NIM 提供丰富的监控指标,如 num_requests_waiting,配置推理服务弹性扩缩容策略。当有突发流量导致推理服务处理请求排队时,能自动扩容新的实例来应对高峰流量。整体解决方案架构如下所示:
部署流程
Cloud Native
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 部署文档[6]。
kubectl apply -f-<<EOFapiVersion: v1kind: Secretmetadata:name: nvidia-nim-secretsstringData:NGC_API_KEY: <your-ngc-api-key>EOF
以下为示例 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 successfullyINFO[0004] You can run `arena serve get llama3-8b-instruct --type kserve -n default` to check the job status
输出结果表明推理服务已部署成功。
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 AGEREADYRESTARTSGPUNODE
------ -----------------------
Running24m1/10 1ap-southeast-1.172.16.xx.xxx
输出结果表明,KServe 推理服务部署成功,模型访问地址为:
http://llama3-8b-instruct-default.example.com
# 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}}
监控
Cloud Native
NVIDIA NIM 提供了丰富的 Prometheus 监控指标,比如首 token 时延、当前正在运行的请求数、请求 token 数、生成 token 数等指标。结合阿里云 Prometheus 和 Grafana 服务,可以快速在 Grafana 中搭建监控大盘,实时观测推理服务状态。
1. 已开启阿里云 Prometheus 监控组件。具体操作,请参见开启阿里云 Prometheus 监控[9]。
2. 创建 grafana 工作区,登录 Grafana 的 Dashboards 页面。
弹性伸缩
Cloud Native
在部署与管理 KServe 模型服务过程中,需应对模型推理服务面临的高度动态负载波动。KServe 通过集成 Kubernetes 原生的 HPA(Horizontal Pod Autoscaler)技术及扩缩容控制器,实现了根据 CPU 利用率、内存占用情况、GPU 利用率以及自定义性能指标,自动灵活地调整模型服务 Pod 的规模,以确保服务效能与稳定性。
以下示例演示如何基于 NVIDIA NIM 提供的 num_requests_waiting 指标配置扩缩容策略。
1. 已部署阿里云 Prometheus 和 ack-alibaba-cloud-metrics-adapter,请参见基于阿里云 Prometheus 指标的容器水平伸缩[11]。
- seriesQuery: num_requests_waiting{namespace!="",pod!=""}resources:overrides:namespace: {resource: "namespace"}pod: {resource: "pod"}metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata:name: llama3-8b-instruct-hpanamespace: defaultspec:# HPA的最小Pod数量和最大Pod数量。minReplicas: 1maxReplicas: 3# 监控的指标数组,支持多种类型的指标共存。metrics:- pods:metric:name: num_requests_waitingtarget:averageValue: 10type: AverageValuetype: Pods# HPA的伸缩对象描述,HPA会动态修改该对象的Pod数量。scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: llama3-8b-instruct-predictor
执行以下命令,创建 HPA 应用。
kubectl apply -f hpa.yaml
执行以下命令,创建 HPA 应用。
kubectl get hpa llama3-8b-instruct-hpa
预期输出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGEllama3-8b-instruct-hpa Deployment/llama3-8b-instruct-predictor 0/101 3 134s
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:TypeReason Age From Message---------- -------- -------NormalSuccessfulRescale52s horizontal-pod-autoscalerNew size: 3; reason: pods metric num_requests_waiting above target
总结
Cloud Native
本文通过在阿里云容器服务 ACK 上部署 NVIDIA NIM,结合阿里云 Prometheus 和 Grafana 服务,快速在 Grafana 中搭建监控大盘,实时观测推理服务状态。为应对模型推理服务面临的动态负载波动,基于排队中的请求数配置自定义指标的弹性扩缩容策略,使模型推理服务实例根据等待中的请求数动态扩缩容。通过以上方式,可以快速构建一个高性能、可观测、极致弹性的模型推理服务。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-07-11
2024-07-11
2024-07-09
2024-09-18
2024-06-11
2024-07-23
2024-07-20
2024-07-12
2024-07-26
2024-07-23
2024-11-18
2024-11-16
2024-11-16
2024-10-31
2024-10-31
2024-10-27
2024-10-26
2024-10-25