在本教程中,将学习如何将YOLOv8目标检测模型部署到AWS SageMaker端点,使用ONNXRuntime和OpenVINO作为执行提供者。通过此教程,将深入了解如何利用AWS SageMaker部署ONNX模型。
在开始笔记本教程之前,请确保已完成以下步骤:
首先,转到用户配置文件并点击启动按钮以打开Studio。然后,按照的文档上传此笔记本。接下来,选择一个SageMaker内核作为配置,如下所述:
接下来,将准备模型以在SageMaker Studio Labs中进行推理。在下面的代码中,从Roboflow的GitHub仓库下载yolov8 Pytorch模型,并使用ultralytics YOLO CLI导出ONNX权重。然后,将模型打包为.tar.gz文件,以便上传到S3,这是将在SageMaker Studio Labs中与权重交互的Amazon存储产品。模型随后被上传到S3以供在SageMaker Studio Labs中使用。
!mkdir -p model
%cd model
!wget https://github.com/roboflow/sagemaker-yolov8/tree/main/yolov8-weights/runs/detect/train -O yolov8n.pt
# 将YOLOV8模型文件从Pytorch版本转换为onnx格式
if not os.path.isfile('/home/ec2-user/SageMaker/model/yolov8n.onnx'):
!yolo mode=export model=yolov8n.pt format=onnx dynamic=True # 若要获得静态模型,将dynamic标志更改为False
else:
print("ONNX文件已存在。请在删除后重新运行该单元格。")
接下来,需要创建一个自定义服务脚本、容器入口点脚本和一个Docker文件,以将ONNX模型部署到SageMaker推理端点。运行此中的单元格12、13和14,以将Docker文件写入名为"docker-inference"的目录,这将创建一个DockerFile、dockerd-entrypoint.py和model-script.py。
# 创建一个ECR URI以构建Docker镜像进行推理
ecr_repository = 'yolov8-deployment'
tag = ':latest'
uri_suffix = 'amazonaws.com'
inference_repository_uri = '{}.dkr.ecr.{}.{}/{}'.format(account_id, region, ecr_repository + tag)
%cd ..
!mkdir -p docker-inference
这一步需要在AWS EC2实例中手动执行。要构建镜像,请从"文件浏览器"部分下载"docker-inference"文件夹,并按照以下命令将Docker镜像推送到AWS弹性容器注册表(ECR)。
使用ecr_repository和tag构建镜像。
sudo docker build -t <ecr_repository> docker-inference/
使用inference_repository_uri名称重新标记镜像。
sudo docker tag <ecr_repository> <inference_repository_uri>
创建AWS ECR并登录以推送镜像。
A. aws ecr get-login-password --region <region> | sudo docker login --username AWS --password-stdin <account_id>.dkr.ecr.<region>.amazonaws.com
B. aws ecr create-repository --repository-name <ecr_repository>
C. sudo docker push <inference_repository_uri>
Docker已推送到远程ECR仓库。做到了🎉
现在将模型部署到一个SageMaker端点。用于部署的实例大小是ml.c6i.xlarge。在尝试这部分之前,请确保镜像已构建并推送到ECR。
import sagemaker
from sagemaker import Model
ENDPOINT_NAME = "YOLO-V8-DEPLOYMENT"
yolo_model = Model(
model_data=model_location,
role=role,
image_uri=inference_repository_uri,
name='YOLO-V8-deployment-1')
yolo_model.deploy(initial_instance_count=1, instance_type='ml.c6i.2xlarge', endpoint_name=ENDPOINT_NAME)
现在已经准备好运行模型了!在下面的脚本中,展示了如何在YOLOv8模型上运行推理。首先,提供一个想要运行推理的图像的URL。然后,添加一个逗号,然后指定应该在哪种设备类型上运行推理。支持的图像类型有'jpg'、'jpeg'、'png',设备类型有'cpu'和'CPU_FP32'。
payload2 = "https://github.com/roboflow/sagemaker-yolov8/blob/main/yolov8-weights/runs/detect/predict/dog.jpeg,CPU_FP32"
# 预热步骤
for _ in range(warmup_steps):
predictor.predict(payload2)
!sleep 10
total_latency = 0
for _ in range(num_iter_steps):
response2 = predictor.predict(payload2)
total_latency += float(response2.decode().split('\n')[0].split(':')[1][:-1].strip())
print("(OpenVINO EP) Avg Latency In Seconds: ", total_latency/num_iter_steps)
print("\nSingle Inference Details:\n",response2.decode())
下面的基准测试结果展示了"OpenVINO执行提供者"与"默认CPU(MLAS)执行提供者"的成本节省比较。这些结果可能有助于决定哪种ONNXRuntime最适合应用程序。
在本指南中,构建了一个YOLOv8目标检测模型,并将其部署到AWS SageMaker端点,使用ONNXRuntime和OpenVino作为执行提供者。