iT邦幫忙

2021 iThome 鐵人賽

1
AI & Data

觀賞魚辨識的YOLO全餐系列 第 36

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 托管

參考資料


上一篇
Day 35 - Amazon SageMaker 簡介
下一篇
Day 37 - 在 AWS Lambda 建立 OpenCV Layer
系列文
觀賞魚辨識的YOLO全餐38

尚未有邦友留言

立即登入留言