Amazon Web Services ブログ

新機能 – Amazon SageMaker Neo – トレーニングしたモデルをどこでも実行

機械学習(Machine Learning: ML)は、トレーニングと推論という2つの異なるフェーズに分かれています。 トレーニングは、モデルを構築すること、すなわち、意味のあるパターンを識別するためにデータセット上で ML アルゴリズムを実行することを扱います。これには大量のストレージとコンピューティングパワーが必要なことが多く、クラウドは Amazon SageMakerAWS Deep Learning AMI などのサービスで ML ジョブをトレーニングするためのうってつけな場所になります。

推論は、モデルの使用、すなわちモデルが一度も見たことがないデータサンプルの結果を予測することを扱います。ここでは、要件が異なります。開発者は通常、待ち時間(1回の予測でどれくらい時間がかかるか)とスループット(並列で実行できる予測の数)を最適化することに関心があります。 もちろん、リソースが制約されているデバイスを扱う場合は、予測環境のハードウェアアーキテクチャがこのようなメトリックに非常に大きな影響を与えます。Raspberry Pi の愛好家として、私はしばしば、若い仲間が私の推論コードをスピードアップするためにもう少し誘導して欲しいと思っています。

特定のハードウェアアーキテクチャーのモデルをチューニングすることは可能ですが、ツールの欠如が原因でエラーが発生しやすく時間がかかります。ML フレームワークやモデル自体にマイナーな変更を加えると、通常、ユーザーは再び最初からやり直す必要があります。残念なことに、ほとんどの ML 開発者は、基礎となるハードウェアにかかわらずどこでも同じモデルを展開する必要があり、パフォーマンスは大幅に向上しません。

さぁ、もう悩むのはやめましょう。本日(2018/11/29)、私は Amazon SageMaker Neo を発表できて非常にうれしく思います。Amazon SageMaker の新しい機能により、機械学習モデルを一度トレーニングし、クラウド内のどこでも、エッジでも最適なパフォーマンスで実行することができます。

Amazon SageMaker Neo の紹介

Amazon SageMaker Neo は、人手をかけずに、Amazon EC2 インスタンスや Amazon SageMaker エンドポイントや AWS Greengrass で管理されるデバイスに展開されたモデルを最適化します。

サポートされている構成は次のとおりです。

  • フレームワークとアルゴリズム:TensorFlow、Apache MXNet、PyTorch、ONNX、XGBoost
  • ハードウェアアーキテクチャ:ARM、Intel、NVIDIA は今日から、Cadence、Qualcomm、および Xilinx はもうすぐサポートされます。さらに、Amazon SageMaker Neo は、Apache Software License の下でオープンソースコードとしてリリースされ、ハードウェアベンダーはプロセッサーやデバイス用にカスタマイズすることができます。

Amazon SageMaker Neo コンパイラーは、モデルを効率的な共通フォーマットに変換します。これは、一般的なフレームワークが伝統的に消費するリソースの 100 分の 1 以下を使用するコンパクトなランタイムによってデバイス上で実行されます。 Amazon SageMaker Neo ランタイムは、ML 推論のスピードアップに役立つ特定の命令セットを使用して、基盤となるハードウェアに最適化されています。

これには主に3つの利点があります。

  • 変換されたモデルは、精度を損なうことなく最大 2 倍の速度で動作します。
  • 洗練されたモデルは、自動運転車両のような革新的なユースケースの自動化、ビデオセキュリティの自動化、製造上の異常検出を可能にする、など事実上すべてのリソースが制限されたデバイスで実行できるようになりました。
  • 開発者は、フレームワークに依存することなく、対象のハードウェア上でモデルを実行できます。

実際のところを見てみましょう

ほとんどの機械学習フレームワークは、モデルを計算グラフとして表します。頂点はデータ配列(tensors)に対する演算を表し、エッジは演算間のデータ依存性を表します。 Amazon SageMaker Neo コンパイラーは、計算グラフのパターンを利用して複数の小規模な操作を融合させた演算子融合を含む高度な最適化を適用します。グラフの一部を静的に事前計算して実行コストを節約する定数フォールディング。各中間 tensor を保持するためにメモリを事前に割り当てる静的メモリ計画パス。内部データレイアウトをハードウェアに適した形式に変換するデータレイアウト変換などがあります。コンパイラーは、各演算子に対して効率的なコードを生成します。

モデルをコンパイルすると、Amazon SageMaker Neo ランタイムで実行できます。このランタイムは、一般的なディープラーニングライブラリーで必要とされる 500MB-1GB と比較して、約 1MB のディスク・スペースを必要とします。アプリケーションは、最初にランタイムをロードしてモデルを呼び出し、モデル定義、モデルパラメーター、およびプリコンパイルされた操作をロードします。

私はこれを Raspberry Pi で試すのを待ちきれません。仕事に取り掛かりましょう。

事前にトレーニングされたモデルをダウンロード

Apache MXNetGluon CV、または TensorFlow モデルでは、あらかじめ訓練されたモデルが豊富に用意されています。ここでは、ImageNet データセットで Apache MXNet を事前にトレーニングした ResNet アーキテクチャに基づいた 50 層モデルを使用しています。

最初に、私は 227MB のモデルとその異なるレイヤーを定義する JSON ファイルをダウンロードしています。このファイルは特に重要です。入力シンボルは ‘data’ と呼ばれ、その形状は [1、3、224、224]、つまり 1 画像、3 チャンネル(赤、緑、青)、224×224 ピクセルです。モデルに渡された画像がこのような形をしていることを確認する必要があります。出力形状は[1,1000]、すなわち ImageNet データセットに存在する 1,000 個のクラスのそれぞれの確率を含むベクトルです。

パフォーマンスのベースラインを定義するために、私はこのモデルと Apache MXNet 1.2 の vanilla に最適化されていないバージョンを使用していくつかの画像を予測します。平均で推論には約6.5秒かかり、約 306MB の RAM が必要です。

これはかなり遅いです。モデルをコンパイルし、これがどれほど速くなるかを見てみましょう。

Raspberry Pi のモデルをコンパイルする

まず、両方のモデルファイルを圧縮された TAR アーカイブに保存して、Amazon S3 バケットにアップロードしましょう。

$ tar cvfz model.tar.gz resnet50_v1-symbol.json resnet50_v1-0000.params
a resnet50_v1-symbol.json
a resnet50_v1-0000.paramsresnet50_v1-0000.params
$ aws s3 cp model.tar.gz s3://jsimon-neo/
upload: ./model.tar.gz to s3://jsimon-neo/model.tar.gz

次に、コンパイルジョブのための単純な構成ファイルを作成します。他のフレームワークやハードウェアのターゲットについて興味がある人は、‘aws sagemaker create-compilation-job help’ を使用すると正確な構文を得ることができます。

{
    "CompilationJobName": "resnet50-mxnet-raspberrypi",
    "RoleArn": $SAGEMAKER_ROLE_ARN,
    "InputConfig": {
        "S3Uri": "s3://jsimon-neo/model.tar.gz",
        "DataInputConfig": "{\"data\": [1, 3, 224, 224]}",
        "Framework": "MXNET"
    },
    "OutputConfig": {
        "S3OutputLocation": "s3://jsimon-neo/",
        "TargetDevice": "rasp3b"
    },
    "StoppingCondition": {
        "MaxRuntimeInSeconds": 300
    }
}

コンパイルプロセスを起動すると、1つのコマンドが実行されます。

$ aws sagemaker create-compilation-job --cli-input-json file://job.json

コンパイルは数秒で完了です。コンパイルされたアーティファクトの名前を調べて、Amazon S3 から取得してローカルで取り出してみましょう。

$ aws sagemaker describe-compilation-job \
--compilation-job-name resnet50-mxnet-raspberrypi \
--query "ModelArtifacts"
{
"S3ModelArtifacts": "s3://jsimon-neo/model-rasp3b.tar.gz"
}
$ aws s3 cp s3://jsimon-neo/model-rasp3b.tar.gz .
$ tar xvfz model-rasp3b.tar.gz
x compiled.params
x compiled_model.json
x compiled.so

ご覧のように、アーティファクトには次のものが含まれます:

  • 元のモデルとシンボルファイル。
  • モデルによって使用される、ハードウェアに最適化されコンパイルされた演算子を格納する共有オブジェクトファイル。

便宜上、それらの名前を ‘model.params’、 ‘model.json’、 ‘model.so’ に変更し、 Raspberry pi の ‘resnet50’ ディレクトリにコピーしてみましょう。

$ mkdir resnet50
$ mv compiled.params resnet50/model.params
$ mv compiled_model.json resnet50/model.json
$ mv compiled.so resnet50/model.so
$ scp -r resnet50 pi@raspberrypi.local:~

Raspberry Pi の推論環境のセットアップ

モデルで画像を予測する前に、私は自分の Raspberry Pi に適切なランタイムをインストールする必要があります。あらかじめ構築されたパッケージが利用できます。‘armv7l’ アーキテクチャ用のものをダウンロードし、提供されたスクリプトで Raspberry Pi にインストールするだけです。追加の深層学習フレームワーク(この場合は Apache MXNet )をインストールする必要はなく、最大1GBの永続ストレージを節約できます。

$ scp -r dlr-1.0-py2.py3-armv7l pi@raspberrypi.local:~
<ssh to the Pi>
$ cd dlr-1.0-py2.py3-armv7l
$ sh ./install-py3.sh

準備が整いました。イメージを推論する時間です!

Amazon SageMaker Neo ランタイムの使用

Pi では、ランタイムは Python パッケージ ‘dlr’(deep learning runtime)として利用できます。イメージを予測するためにそれを使用することは、予想通りです。

  • モデルをロードして、入力シンボルと出力シンボルを定義します。
  • イメージをロードします。
  • 推論!

対応する Python コードは次のとおりです。

import os
import numpy as np
from dlr import DLRModel

# Load the compiled model
input_shape = {'data': [1, 3, 224, 224]} # A single RGB 224x224 image
output_shape = [1, 1000]                 # The probability for each one of the 1,000 classes
device = 'cpu'                           # Go, Raspberry Pi, go!
model = DLRModel('resnet50', input_shape, output_shape, device)

# Load names for ImageNet classes
synset_path = os.path.join(model_path, 'synset.txt')
with open(synset_path, 'r') as f:
    synset = eval(f.read())

# Load an image stored as a numpy array
image = np.load('dog.npy').astype(np.float32)
print(image.shape)
input_data = {'data': image}

# Predict 
out = model.run(input_data)
top1 = np.argmax(out[0])
prob = np.max(out)
print("Class: %s, probability: %f" % (synset[top1], prob))

このイメージを試してみましょう。Raspberry Pi はチワワと推論していませんか?

(1, 3, 224, 224)
Class: Chihuahua, probability: 0.901803

予測は正しいのですが、スピードとメモリ消費はどうでしょう?この予測には約 0.85 秒かかり、必要な RAM は約 260MB です。Amazon SageMaker Neo では、vanilla モデルに比べて 5 倍高速で RAM 効率が 15% 向上しました。

この素晴らしいパフォーマンスの向上は、複雑で時間のかかる作業を必要とせず、モデルをコンパイルするだけでした。もちろん、モデルやハードウェアアーキテクチャーによって異なる場合がありますが、C5 Family や P3 Family などの Amazon EC2 インスタンスでは、大幅な改善が見込まれます。

今すぐ利用可能

私はこの記事が参考になったことを願っています。 Amazon SageMaker Neo でモデルをコンパイルするのは無料です。モデルを使用して、基盤となるリソース(Amazon EC2 インスタンス、Amazon SageMaker インスタンス、AWS Greengrass で管理されているデバイス)に対してのみ料金を支払うことになります。

このサービスは現在、米国東部(北バージニア)、米国西部(オレゴン)、欧州(アイルランド)で利用可能です。研究を開始し、ご意見をお聞かせください。私たちはあなたが何を構築するのかを楽しみにしています!

– Julien;

Julien Simon

Julien Simon

ジュリアンは EMEA の人工知能と機械学習エバンジェリストとして、開発者や企業が自分のアイデアを形にするお手伝いをしています。

この記事の翻訳は SA 桶谷が担当しました。原文はこちら