Amazon Web Services ブログ

Apache MXNet を Amazon SageMaker および AWS Greengrass ML Inference と共に使用する脳組織のセグメント化 – パート 2



このブログ記事のパート 1 では、Amazon SageMaker を使用した簡単で合理的な方法によって、MRI スキャンから脳組織を自動的にセグメント化するためにニューラルネットワークをトレーニングおよびデプロイする方法を説明しました。パート 1 では、「Bring Your Own Script」というパラダイムを使用して、Amazon SageMaker で畳み込みニューラルネットワーク (CNN) をトレーニングするために Apache MXNet を使い、U-Net と効率的で低レイテンシーの ENet の 2 つのネットワークをトレーニングしました。パート 2 では、AWS Greengrass ML Inference を使用して、接続性が低い、または接続のない環境で、オフライン推論用のポータブルエッジデバイスに ENet をデプロイする方法を説明していきます。

このユースケースでは、医療画像を保護医療情報 (PHI) ではなく未処理画像として取り扱っていますが、以下の点に注意してください。

AWS Greengrass は、この記事の執筆時点では AWS HIPAA 準拠サービスではありません。AWS Business Associate Addendum (BAA) に従って、AWS Greengrass は、米国の医療保険の携行と責任に関する法律 (HIPAA) における保護医療情報 (PHI) の作成、受信、維持、送信に使用してはなりません。HIPAA の対象であるかどうかを判断する責任はお客様にあります。対象である場合は、HIPAA とその実施規則をどのように遵守するのが最適であるかを判断する必要があります。HIPAA 準拠サービスを使用して PHI を作成、受信、維持、送信するアカウントは、BAA での必要性に応じて PHI を暗号化する必要があります。HIPAA 準拠サービスの最新のリスト、および一般的な詳細については、AWS HIPAA コンプライアンスのページを参照してください。

ユースケース

パート 1 でお話ししたように、モデルのエッジデプロイメントは様々なユースケースにとって極めて興味深いものです。エッジでオフラインの推論を実行することは、医療画像のアノテーションに大きな影響を与える可能性があります。インターネットの接続が限られているか、接続がない世界各地では医療専門家が不足しているため、アノテーションをローカルで自動化できるポータブルな低電力ソリューションには多くの利点があります。この記事では、AWS Greengrass を使用して Amazon SageMaker でトレーニングしたモデルをエッジにデプロイする方法を紹介します。このサービスは、接続されたデバイスに対して、ローカルコンピューティング、メッセージング、データキャッシング、同期化、および ML 推論機能を安全に実行することを可能にします。

エッジへのデプロイメント

前回、脳組織をセグメント化するために Amazon SageMaker で U-Net と ENet の 2 つのモデルをトレーニングし、推論のためにクラウド内の Amazon SageMaker エンドポイントに両方のモデルをデプロイする方法を説明して、それぞれの精度とレイテンシーを比較しました。今回は、AWS Greengrass ML Inference を使用し、Raspberry Pi 3 (RPi) をオフラインエンドポイントとして、そこに ENet をデプロイする方法を紹介します。

MXNet 0.11 での Amazon SageMaker モデルのトレーニング

まず、現在バージョン 0.11である (バージョン 1.2.1 が間もなく利用可能になります) AWS Greengrass が提供する、事前にコンパイルされた MXNet ライブラリとの互換性があるモデルが必要です。バージョン 0.11 は、Amazon SageMaker MXNetEstimator オブジェクトではデフォルトではサポートされないため、イメージ ID を MXNet 0.11 があるものに手動で設定してからトレーニングする必要があります。

enet_eleven_job = 'DEMO-enet-eleven-job-' + \
    time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())

enet_eleven_estimator = MXNet(entry_point='brain_segmentation.py',
                              base_job_name=enet_eleven_job,
                              source_dir='source_dir',
                              role=role,
                              train_instance_count=1,
                              train_instance_type='ml.p3.2xlarge',
                              hyperparameters={
                                  'learning_rate': 1E-3,
                                  'class_weights': [[1.35, 17.18,  8.29, 12.42]],
                                  'network': 'enet',
                                  'batch_size': 32,
                              })

region = sagemaker_session.boto_session.region_name
enet_eleven_estimator.train_image = lambda: '780728360657.dkr.ecr.{}.amazonaws.com/sagemaker-mxnet-py2-gpu:1.0'.format(
    region)

enet_eleven_estimator.fit({'train': train_s3, 'test': validation_s3})

この後のステップでは、ここで ML リソースとしてトレーニングしたモデルが使われることに留意してください。

AWS Greengrass Core の RPi へのインストール

AWS Greengrass 開発者ガイドにある「モジュール 1: Greengrass の環境設定」と「モジュール 2: Greengrass Core ソフトウェアをインストールする」の手順に従います。

ML 推論の設定

以下の注意点を念頭に置いて、「AWS マネジメントコンソール を使用して Machine Learning Inference を設定する方法」の手順に従います。

  • Raspberry Pi カメラは使用しないため、それに関する要件は無視してください。
  • ステップ 3 は省略します。モデルパッケージは Amazon SageMaker から直接取得するからです。
  • ステップ 4 は、MXNet のインストールを通じてすでに提供されているデプロイメントパッケージを参照していますが、ここでは、greengrassBrainSegmentation.zip と呼ばれる異なるデプロイメントパッケージを使用します。

使用するデプロイメントパッケージは、私たちのモデルを使って推論を提供する RPi に Flask アプリケーションをデプロイします。

import greengrasssdk
import io
from processing import *
from load_model import load_model
import json
from flask import Flask, request, send_file

client = greengrasssdk.client('iot-data')

app = Flask(__name__)

@app.route('/', methods=['POST'])
def transform():
    client.publish(topic='inference/brain_segmentation', payload='Image received.')
    try:
        img = decode_request(request)
        batch = prep_batch(img)
        net.forward(batch)
        raw_output = net.get_outputs()[0].asnumpy()
        postprocess(raw_output)
        client.publish(topic='inference/brain_segmentation', payload='Image processed.')
        with open('/tmp/mask.png', 'rb') as img:
            return send_file(io.BytesIO(img.read()),
                             attachment_filename='/tmp/mask.png',
                             mimetype='image/png')
    except Exception as e:
    client.publish(topic='inference/brain_segmentation', payload='Error: %s.' % (str(e)))

model_path = '/greengrass-machine-learning/mxnet/segmentation-net/'
net = load_model(model_path, 'model', 0)
client.publish(topic='inference/brain_segmentation', payload='Model loaded.')
client.publish(topic='inference/brain_segmentation', payload='App starting.')

app.run(debug=True, host='0.0.0.0')

def function_handler(event, context):
    return

これは、ローカル AWS Lambda 関数のハンドラーとして機能します。セットアップ命令にある greengrassObjectClassification.function_handlergreengrassBrainSegmentationApp.lambda_handler に置き換えて、命名規則を置き換えるようにしてください。

このデプロイメントパッケージには、必須の AWS Greengrass ライブラリと MXNet ライブラリの他にも、極めて軽量な PNG エンコーディングのために、PyPNG モジュールからのヘルパーモジュール、load_model.pyprocessing.py、および png.py が含まれています。

ステップ 6 では、カメラを使用しないため、videoCore リソースを省略してください。ML リソースを追加する手順に従います。モデルソースには、Locate or upload a model in Amazon S3 ではなく Use an existing Amazon SageMaker model を選択し、ENet in MXNet 0.11 用のトレーニングジョブの名前を選択します。同様に、ローカルパスにも以下を入力します。

/greengrass-machine-learning/mxnet/segmentation-net/

ここが、ハンドラー関数がモデルを検索する箇所です。

デプロイメント後、ステップ 8 で終了します。

エッジエンドポイントのテスト

デバイスに Lambda 関数をデプロイしたところで、関数をテストします。RPi と同じネットワークに接続されていることを確認してください。Flask アプリケーションは、デフォルトでポート 5000 をリッスンします。

import requests

files = {'Body': open('test_input.png','rb')}
response = requests.post("http://<YOUR.RPi.IP.ADD>:5000", files=files)

次に、ディスクにレスポンスコンテンツを記述します。

with open(‘test_prediction.png', 'wb') as f:
    f.write(response.content)

イメージを開いて結果を確認してください!

ブート時における AWS Greengrass の起動

それでは、ブート時に AWS Greengrass が確実に実行されるようにしましょう。そうすることで、電源を入れるたびにセキュアシェル (SSH) で接続してデーモンを再起動する必要がなくなります。これを行うには、次のコマンドを使って rc.local を編集します。

sudo nano /etc/rc.local

Rc.local に以下の行を追加します。

cd /greengrass/ggc/core/
sudo ./greengrassd start

以上です! これで、脳組織のセグメント化のために ENet で推論を提供するポータブルのオフラインエンドポイントができました。

まとめ

この記事では、ML リソースのエッジデプロイメントをたやすく実現するために、AWS Greengrass がどのように Amazon SageMaker とシームレスに統合されるかについて説明しました。今回は、Amazon SageMaker で脳組織のセグメント化のためにトレーニングした効率的なニューラルネットワーク (ENet) を、AWS Greengrass ML Inference を使用してポータブルオフラインエンドポイントとした Raspberry Pi 3 にデプロイしました。

これで、気軽に Amazon SageMaker を使って独自のモデルをトレーニングし、AWS Greengrass を使ってそれらをエッジデバイスにデプロイしていただけるようになればと思っています。このアプローチを医療画像だけに留めておく必要はありません。応用方法は無限にあり、可能性は測り知れません。あなたも一歩踏み出して構築してみませんか。

謝辞

この作業は、CC BY 4.0 で使用されている「Open Access Series of Imaging Studies (OASIS), OASIS-1, by Marcus et al., 2007」によって提供されたデータで可能になりました。

データは OASIS によって提供されたものです。

  • OASIS-3: 主任研究者: T. Benzinger, D. Marcus, J. Morris; NIH P50AG00561, P30NS09857781, P01AG026276, P01AG003991, R01AG043434, UL1TR000448, R01EB009352.AV-45 薬は、Eli Lilly の完全所有子会社である Avid Radiopharmaceuticals によって提供されました。
  • OASIS: 断面: 主任研究者: D. Marcus, R, Buckner, J, Csernansky J. Morris; P50 AG05681, P01 AG03991, P01 AG026276, R01 AG021910, P20 MH071616, U24 RR021382.
  • OASIS: 縦方向: 主任研究者: D. Marcus, R, Buckner, J. Csernansky, J. Morris; P50 AG05681, P01 AG03991, P01 AG026276, R01 AG021910, P20 MH071616, U24 RR021382.

出版物:

  • Open Access Series of Imaging Studies (OASIS): Cross-Sectional MRI Data in Young, Middle Aged, Nondemented, and Demented Older Adults. Marcus, DS, Wang, TH, Parker, J, Csernansky, JG, Morris, JC, Buckner, RL.Journal of Cognitive Neuroscience (認知神経科学ジャーナル)、19, 1498-1507. doi: 10.1162/jocn.2007.19.9.1498

 


今回のブログ投稿者について

Brad Kenstler は、Amazon Machine Learning ソリューションラボチームのデータサイエンティストです。ML ソリューションラボの一員として、彼は AWS の顧客が自社ビジネスのユースケースやプロセスのために組織内で機械学習や AI を活用するのを手助けしています。彼の主な関心分野は、コンピュータビジョンと深層学習が交わる領域です。仕事以外では、ヘビーメタルを聴くこと、新しいバーボンを飲むこと、サンフランシスコ 49ers の試合観戦などを楽しんでいます。
.