YOLOv8模型部署至AWS SageMaker

在本教程中,将学习如何将YOLOv8目标检测模型部署到AWS SageMaker端点,使用ONNXRuntime和OpenVINO作为执行提供者。通过此教程,将深入了解如何利用AWS SageMaker部署ONNX模型。

设置AWS SageMaker Studio

在开始笔记本教程之前,请确保已完成以下步骤:

  1. 设置SageMaker Studio域和用户配置文件
    1. 域概览
    2. 域快速设置
    3. 添加/移除域用户配置文件
    4. 启动Amazon SageMaker Studio
  2. 启动SageMaker Studio

    首先,转到用户配置文件并点击启动按钮以打开Studio。然后,按照的文档上传此笔记本。接下来,选择一个SageMaker内核作为配置,如下所述:

    • 镜像:Base Python 3.0
    • 内核:Python 3
    • 实例类型:ml.t3.medium
    • 启动脚本:无脚本

YOLOv8模型转换和上传至AWS S3

接下来,将准备模型以在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文件已存在。请在删除后重新运行该单元格。")

构建AWS弹性容器注册表上的Docker镜像

接下来,需要创建一个自定义服务脚本、容器入口点脚本和一个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仓库。做到了🎉

YOLOv8模型部署到Sagemaker

现在将模型部署到一个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)

SageMaker端点

现在已经准备好运行模型了!在下面的脚本中,展示了如何在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

下面的基准测试结果展示了"OpenVINO执行提供者"与"默认CPU(MLAS)执行提供者"的成本节省比较。这些结果可能有助于决定哪种ONNXRuntime最适合应用程序。

在本指南中,构建了一个YOLOv8目标检测模型,并将其部署到AWS SageMaker端点,使用ONNXRuntime和OpenVino作为执行提供者。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485