[Amazon SageMaker] 組み込みアルゴリズム(物体検出)モデルをMXNetで利用できるようにする環境をSageMaker Studio Notebooksで作ってみました

2020.12.29

1 はじめに

CX事業本部の平内(SIN)です。

Amazon SageMaker(以下、SageMaker)の組み込みアルゴリズム(物体検出)で作成されたモデルは、MXNetの環境で利用するために変換(損失層の削除とNMS層を追加)が必要です。

また、同モデルをSageMaker Neo(以下、Neo)でコンパイルする際も、この変換が必要です。

この変換作業は、https://github.com/zhreshold/mxnet-ssddeploy.pyで可能なことを以前紹介しましたが、この時点では、Python2.xの環境が必要でした。
[Amazon SageMaker] 組み込みアルゴリズムのオブジェクト検出(ResNet-50)をMac上のMXNetで利用してみました

今回、同じ作業を確認すると、Python3でも可能になっていたので、改めて、纏めておくことにしました。 Amazon SageMaker Studio(以下、SageMaker Studio)では、Python3による各種環境が用意されているので、こちらで作業を進めています。

2 環境

DemoNotebooksの下に、作業環境としてConvertMXNetを作成し、convert_mxnet.ipynbというノートブックを配置しました。

Kernelは、Python 3 (MXNet 1.8 Python 3.7 CPU Optimized、インスタンスは、ml.t3.mediumを利用しています。

3 Notebook

ノートブックで作業している内容は、以下のとおりです。

(1) mxnetのインストール

最初に、mxnetをインストールしています。pipでインストールすると、バージョンは、1.7となっていました。

!pip3 install mxnet
import mxnet
print("MXNet Version {}".format(mxnet.__version__))

(2) ライブラリ・パス

必要なライブラリのimportと、パスの指定です。

import os
import shutil
import boto3
import glob

# 作業フォルダ
TMP_FOLDER='./tmp'
# モデル名
MODEL_NAME='model.tar.gz'

(3) 作業フォルダ

フォルダの初期化では、存在する場合は、一旦削除して再作成しています。

if os.path.exists(TMP_FOLDER):
    shutil.rmtree(TMP_FOLDER)
os.mkdir(TMP_FOLDER)

(4) 変換元モデル

変換元となる物体検出モデルをS3バケットからダウンロードします。手元にmodel.tar.gzがある場合は直接作業フォルダにアップロードしても構いません。

InputBucket = 'sagemaker-working-bucket-xxx'
InputKey = 'smart-cooler-500/output/' + MODEL_NAME

s3 = boto3.resource('s3')
bucket = s3.Bucket(InputBucket)
bucket.download_file(InputKey, TMP_FOLDER + '/' + MODEL_NAME)

また、作業フォルダ内で展開しています。

!tar xvfz $TMP_FOLDER/$MODEL_NAME -C $TMP_FOLDER

(5) ツールのダウンロード

Githubからツールをダウンロードして、ヘルプ表示で動作確認しています。

os.environ['PYTHONPATH'] = os.getcwd() + '/mxnet-ssd/symbol/'
print("export PYTHONPATH={}".format(os.environ.get('PYTHONPATH')))

!git clone https://github.com/zhreshold/mxnet-ssd.git
!python mxnet-ssd/deploy.py -h

実は、そのまま実行すると、下記のようにエラーとなってしまいます。

ImportError: cannot import name 'multi_layer_feature' from 'common' (/home/sagemaker-user/.local/lib/python3.7/site-packages/common/__init__.py)

これは、 mxnet-ssd/symbol/commonが読み込めないのが原因なので、最初にPYTHONPATHにパスを追加しています。

参考:https://github.com/zhreshold/mxnet-ssd/issues/229

実行環境に問題がなければ、下記のようにヘルプが表示されます。

(6) ハイパーパラメータ確認

元モデルのhyperparams.jsonから、ハイパーパラメータを確認しています。これは、変換時に指定する必要があるパラメーター(クラス数など)を確認するためです。

!cat $TMP_FOLDER/hyperparams.json

(7) 変換

ツール(deploy.py)による変換の前に、一部コードを修正しています。

mxnet-ssd/symbol/symbol_factory.pyには、Python3で廃止となった、xrangeが使用されているため、このままでは実行できないので、rangeに置き換えています。

# mxnet-ssd/symbol/symbol_factory.pyの「xrange」を「range」に修正
file_name = os.getcwd() + '/mxnet-ssd/symbol/symbol_factory.py'

with open(file_name) as f:
    data_lines = f.read()

data_lines = data_lines.replace("xrange", "range")

with open(file_name, mode="w") as f:
    f.write(data_lines)

以下が、変換です。ベースネットワークやクラス数などのパラメータ指定が必要です。

!python mxnet-ssd/deploy.py --network resnet50 --num-class 6 --nms .45 --data-shape 512 --prefix $TMP_FOLDER/model_algo_1

(8) 出力

出力されたファイルです。

!ls -la $TMP_FOLDER/deploy*

Neoでのコンパイルする際の元となるモデルとしては、この2つのファイルをtar.gzに圧縮して、S3に配置することで利用可能です。

4 最後に

今回は、SageMakerの組み込みアルゴリズム(物体検出)で作成されたモデルをMXNetで利用可能なように変換するNotebookをSageMaker Studioで作成してました。

1つこの環境を用意しておけば、軽易に変換の作業ができそうです。