Day 36 - 使用 Container 建立 Amazon SageMaker 端点

Day 36 - 使用 Container 建立 Amazon SageMaker 端点

今天的任务是将 Day 16 - 进行影像辨识训练 所训练好的 YOLO 权重,转为 SageMaker 的节点,可以使用 Lambda 来进行调用,需要用到的 AWS 资源为:

  • Amazon EC2
  • Amazon Simple Storage Service (S3)
  • Amazon Elastic Container Registry (ECR)
  • AWS Lambda
  • Amazon SageMaker
  • Identity and Access Management (IAM)

彼此之间的关系如下图所示,使用者透过 API Gateway 上传 (PUT) 图片到 S3,这个事件会驱动 AWS Lambda ,而在 AWS Lambda 中会呼叫 Amazon SageMaker 的端点 (endpoint) 来使用事先训练好的 YOLO 模型,而这个 YOLO 模型是在 EC2 中被制作好的容器映像档 (Container Image),并上传到 Amazon Elastic Container Registry 中储存。

https://ithelp.ithome.com.tw/upload/images/20211108/20129510hVGECXbxVv.png
图 1、S3 驱动 Lambda 函数进行 YOLO 辨识架构图

建立 Amazon SageMaker 端点的步骤为:

  1. 在 EC2 中建立容器映像档,上传容器映像档到 ECR。
  2. 在 Amazon SageMaker 笔记本中建立 Amazon SageMaker 端点。
  3. 在 AWS Lambda 中进行 Amazon SageMaker 端点呼叫。

步骤 1.在 EC2 中建立容器映像档

这个专案 yolov4-SageMaker 已经有建立好的容器设定,只要将这个专案下载到 EC2 上,就可以建立一个 YOLOv4 的推论容器映像档。首先登录到事先建立好的 EC2 个体上 (g4dn.2xlarge),可以参考 Day 02 - 选择具有 GPU 的 EC2 并完成配置 这篇文章,并将事先训练好的权重档复制到指定目录即可,可以参考 Day 15 - 说明 YOLO 相关设定,相关指令可以参考以下操作。

# 下载 yolov4-SageMaker 专案
git https://github.com/jackie930/yolov4-SageMaker.git 
cd yolov4-SageMaker
# 用来存放事先设定好的参数档以及训练好的权重档的目录
mkdir source/yolov4_endpoint/pretrained_model

# 事先设定好的参数档以及训练好的权重档
cp ./darknet/cfg/yolov3.cfg ./source/yolov4_endpoint/pretrained_model/
cp ./darknet/cfg/obj.names ./source/yolov4_endpoint/pretrained_model/
cp ./darknet/weights/yolov3.backup  ./source/yolov4_endpoint/pretrained_model/

确认 yolov4-SageMaker 目录结构,如下图所示。

https://ithelp.ithome.com.tw/upload/images/20211108/20129510fZSHhCkM4N.png
图 2、yolov4-SageMaker 目录结构

修改推论程序 predictor.py ,这个是容器内主要用来进行图片辨识的程序,需要把预设的参数修改成自定义的参数,需要修改的在 94 - 96 行。

source/yolov4_endpoint/predictor.py

# 原先的设定
weight = './yolov4.weights'
names = './coco.names'
cfg = './yolov4.cfg'
# 自定的设定
weight = './yolov3.backup'
names = './obj.names'
cfg = './yolov3.cfg'

https://ithelp.ithome.com.tw/upload/images/20211108/20129510D2it46cjqQ.png
图 3、修改为自行定义的图片辨识的程序

接下来把建立容器映像档的组态改成以 GPU 为基础的,这样等一下在建立映像档的时候就会是编辑成可以使用 GPU 的版本,只是建立过程会十分缓慢,大概要数个小时。因为会建立一个 Docker Image,并将这个 image 放到 ECR 中,所以需要进行 AWS CLI 的认证,这一部分可以参考 Amazon Elastic Container Registry (ECR) - Day21 这一篇文章。

# 将 Docker 的建立设定改成针对 GPU 的
cd source/yolov4_endpoint/
mv Dockerfile Dockerfile.cpu
mv Dockerfile.gpu Dockerfile
# AWS CLI 的认证
aws configure
# 建立一个 docker image 并上传到 ECR ,名称为 yolov4-gpu
sh build_and_push.sh yolov4-gpu

https://ithelp.ithome.com.tw/upload/images/20211108/20129510JTliemrszh.png
图 4、建立 YOLOv4 容器所需要的档案

建立成功後可以在 Amazon Elastic Container Registry (ECR) 中,看到建立好的容器映像档,如下图所示。

https://ithelp.ithome.com.tw/upload/images/20211108/201295105O0v6hmfUh.png
图 5、建立好的容器映像档

步骤 2. 建立 Amazon SageMaker 端点

在专案中有一个 create_endpoint.py 的档案,就是用来建立 Amazon SageMaker 端点的代码,将这些代码利用 Amazon SageMaker 笔记本来运行,并观察运行结果,首先修改 get_arguments() 这个方法,指定端点名称、目前的容器映像档、以及指定端点运行的机型等,代码如下图所示。

https://ithelp.ithome.com.tw/upload/images/20211108/20129510VdpzC8M9Di.png
图 6、建立 Amazon SageMaker 端点 yolov4-gpu

步骤 3. AWS Lambda 中进行 Amazon SageMaker 端点呼叫

需要建立一个角色需要由 Lambda 函数来执行,且具有执行 Amazon SageMaker 端点的许可授权。进入 IAM 管理控制台,选择新增角色,接下来如下图所示,选择 Lambda 的使用案例後点击 下一个:许可 按钮。在 Attach 许可政策 中输入 sagemaker 接着选 AmazonSageMakerFullAccess 这个政策,以确保这个角色可以透过 AWS Lambda 来执行 Amazon SageMaker 端点。

https://ithelp.ithome.com.tw/upload/images/20211108/201295109fDBMU7qOo.png
图 7、建立一个角色选择 Lambda 的使用案例

进入 AWS Lambda 管理控制台,选择建立 Lambda 函数,设定内容如下图所示。输入函数名称,执行时间选择 Python 3.8,最重要的是执行角色,务必选择上一个画面中的角色。

https://ithelp.ithome.com.tw/upload/images/20211108/20129510Y22WPh3rrK.png
图 8、建立 Lambda 函数设定画面

接着输入程序码如下所示,bucket 跟 image_uri 这两个变数需要改成自己环境中的对应值:

import json
from boto3.session import Session
import time

def lambda_handler(event, context):
    bucket = 'S3-BUCKET' # 存放辨识图片的 S3 存储桶
    image_uri = '00-frame-608x608-0007-new.jpg' # 待辨识图片
    test_data = {
        'bucket' : bucket,
        'image_uri' : image_uri,
        'content_type': "application/json",
    }
    payload = json.dumps(test_data)


    session = Session()

    runtime = session.client("runtime.sagemaker")
    prev_time = time.time()
    response = runtime.invoke_endpoint(
        EndpointName='yolov4-gpu',
        ContentType="application/json",
        Body=payload)
    print('internal predicting time: ' , (time.time() - prev_time))
    result = json.loads(response["Body"].read())
    print (result)
    return {
        'statusCode': 200,
        'body': json.dumps(result)
    }

测试结果如下图所示,使用与 Day 34 - 实作 S3 驱动 Lambda 函数进行 Yolo 物件辨识 相同的图片,得到的结果一样,而辨识结果为 0.8 秒。

https://ithelp.ithome.com.tw/upload/images/20211108/20129510PGcvUfKDms.png
图 9、建立 Lambda 函数设定画面

这样的结果似乎就是我们想要的,但事实上,Amazon SageMaker 端点一样是要建立在实体之上,而这个实体也是一样要计费的,而且比 EC2 相同规格的还要贵,以下是 g4dn.xlarge 实体类型每小时端点跟 EC2 的计价。

  • $1.0304 for Endpoint ml.g4dn.xlarge
  • $0.736 per On Demand Linux g4dn.xlarge

务必记得关闭 Amazon SageMaker 端点,如下图所示,同时也要关闭 Amazon SageMaker 笔记本,因为这也是在实体上运行。

https://ithelp.ithome.com.tw/upload/images/20211108/201295105jLN9ZjLbG.png
图 10、关闭 Amazon SageMaker 端点

以下是这三个方案的比较表,成本与推论时间都是可以明确从实验中得知,而系统还在乎的是可用性,因为 EC2 内的服务都是开发者自行建置,所以比较会有维运上的问题,或是系统无法负荷导致无法服务的问题。

表 1、 使用 EC2/Lambda/SageMaker 进行 YOLO 辨识比较

  使用 EC2 使用 Lambda 使用 SageMaker
成本(USD) 0.736 0 1.0304
时间(秒) ~ 0.1 秒 > 60 秒 1秒 左右
可用性 较差 AWS 托管 AWS 托管

参考资料


<<:  VMware 3V0-21.21 Dumps - Best Exam Preparation Method

>>:  Python 演算法 Day 10 - Feature Selection

找LeetCode上简单的题目来撑过30天啦(DAY23)

题号:43 标题:Multiply Strings 难度:Medium Given two non-...

D-4.Line_pay_api 串接(一)

Line pay API 算是金流类API比较好串接的,尤其是V2,对单一商品或服务开启(课金,抖内...

[Day12] CH08:积沙成塔——Array & ArrayList(中)

还记得我们前两天学的方法吗?结合昨天学的阵列,阵列也可以用在方法里传递吗? 当然可以罗!我们就先来看...

django新手村1

尝试写文件,希望可以帮助新手,自己也没学习很久,如有错误请告知 相信大家在一开始学习任何框架时,总是...

[30天 Vue学好学满 DAY15] prop & emit-2

emit 监听子组件 父组件: 透过v-on监听子组件事件 子组件: 透过$emit传递事件名称 直...