Amazon Web Services ブログ

オンプレミス環境から Amazon SageMaker を利用する

Amazon SageMaker は、機械学習におけるデータ準備・開発・学習・モデル変換・デプロイ、これら全体のパイプラインをサポートするマネージドサービスです。SageMaker の利用を検討する際に、これらの全てを SageMaker に移行しなければならないのかというと、そうではありません。例えば、開発のみを SageMaker の Jupyter Notebook で行うことや、学習・デプロイのみを SageMaker で行うことも可能です。この特性を活かせば、オンプレミスに機械学習環境を保有しているユーザが、既存のオンプレミス環境をなるべく活用し、追加のリソースが必要な部分に SageMaker を利用することができます。

本投稿では、機械学習モデルの学習やデプロイを行う環境として、オンプレミスの機械学習環境と SageMaker をシームレスに切り替える方法を紹介します。オープンソースである SageMaker Python SDK は、オンプレミスならびに SageMaker の両方において、学習と推論の実行を可能にするインタフェースを提供しています。本投稿で実現する内容を以下の図で示します。

学習とデプロイのコードは、Python がインストールされたオンプレミスで開発されており、学習データもオンプレミスに保存されているものとします。SageMaker Python SDK で、これらのコードや学習データをローカル環境で利用したり、あるいは S3 にアップロードして SageMaker で利用したりします。

実行に必要な情報

本投稿の内容を実行するためには以下の情報が必要です。

  • AmazonSageMakerFullAccess 権限をもった IAM ユーザの Credential
    ユーザが SageMaker にアクセスする際、SageMaker はそのユーザがどの IAM ユーザなのかを確認します (認証)。そして、その IAM ユーザに SageMaker へのアクセス権限が付与されていれば、SageMaker へのアクセスを許可します (認可)。認証のために、オンプレミスの環境には IAM ユーザの Credential (認証情報) が必要です。Credential は、IAM ユーザのアクセスキーやシークレットアクセキーで構成されます。Credential に関する詳細はこちらをご覧ください。また、IAM ユーザが SageMaker の利用を認可されるためには、 SageMaker の実行に必要な権限をまとめた、AmazonSageMakerFullAccess のポリシーが IAM ユーザに付与されている必要があります。
  • AmazonSageMakerFullAccess の IAM ロール
    Credential をオンプレミス環境にインストールすると、オンプレミス環境から SageMaker を利用することが可能です。しかし、SageMaker は Amazon S3 や Amazon ECR といった AWS サービスとも連携が必要です。この権限を SageMaker に付与するために IAM ロールを作成します。IAM ロールについてはこちらをご覧ください。

オンプレミス環境の設定

Credential と IAM ロールを準備できたら、次にオンプレミス環境の設定を行います。以下では設定の手順と代表的なコマンドを示しますが、環境によって異なる場合もありますので、詳細のリンクもご確認ください。

  1. Credential の設定を行うために AWS CLI をインストールする (詳細)
    $ pip install awscli --upgrade --user
  2. Credential を設定する (詳細)
    (以下は入力の一例です。利用者の Credential を入力してください。)

    $ aws configure
    AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
    AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
    Default region name [None]: us-west-2
    Default output format [None]: json
  3. SageMaker Python SDK をインストールする (詳細)
    $ pip install sagemaker
  4. オンプレミス環境で実行するために Docker をインストールする (詳細)
    プラットフォームごとのインストール手順が詳細にありますのでご覧ください。インストールが完了したら、学習、推論の実行のために、オンプレミス環境で Docker を実行してください。

学習と推論のコードの準備

次に学習や推論のコードを作成します。ここでは、AWS の公式サンプルコードとして公開されている、TensorFlow による手書き数字の分類を少し修正して、オンプレミス環境から実行できるようにします。修正する際には、オンプレミス環境で普段使い慣れているテキストエディタを利用することも可能です。

  1. サンプルコードのダウンロード
    まずはオンプレミス環境にサンプルコードをダウンロードしましょう。以下のいずれかの方法でダウンロードすることができます。

    • レポジトリをクローンする
      git がインストールされている環境であれば、以下のコマンドを実行することで、全てのサンプルコードを現在のディレクトリにダウンロードすることができます。

      $ git clone https://github.com/awslabs/amazon-sagemaker-examples.git
    • zip 形式でファイルをダウンロードする
      以下の URL からサンプルコードを全てダウンロードすることができます。
      https://github.com/awslabs/amazon-sagemaker-examples/archive/master.zip

    ダウンロードが完了したら、手書き数字の分類を実行するコードのディレクトリ ./sagemaker-python-sdk/tensorflow_distributed_mnist/ に移動します。今回利用するコードは以下の2つです。

    • tensorflow_distributed_mnist.ipynb
      機械学習に利用する手書き数字のデータを準備して、SageMaker の学習・推論のAPIを実行するノートブックファイルです。SageMaker のノートブックインスタンス上での実行を想定しているため、オンプレミス環境用に修正をします。
    • mnist.py
      手書き数字の分類を行うための学習・推論用の Python コードです。SageMaker のAPI 経由で呼び出され、TensorFlowが設定された AWS のコンテナイメージで実行されるため、SageMaker でもオンプレミス環境でも同じものを利用することができます。従って、このコードの修正は不要です。
  2. サンプルコードの修正
    すでに説明したとおり、修正するコードは tensorflow_distributed_mnist.ipynb です。このノートブックのファイルでは role = get_execution_role() を利用して SageMaker のノートブックインスタンスのロールを取得し、学習用や推論用のインスタンスに付与しています。オンプレミス環境では、SageMaker のノートブックインスタンスを利用しないため、ロールの取得ができずエラーが発生します。従って、実行に必要な情報として作成した IAM ロールを以下のように文字列で与えるよう変更します。

    role = 'arn:aws:iam::(12桁のAWSアカウントID):role/(ロール名)'

    API を実行するノートブックファイル (.ipynb) は、API を実行するコードを含んでいれば Python ファイル (.pyファイル) に置き換えることも可能です。Python ファイルとすることで、高機能なテキストエディタによる編集も可能になります。以下のスクリーンショットは、tensorflow_distributed_mnist.ipynb のコードを抽出して Python ファイル (train.py) を作成し、エディタ上で編集しているものです。

  3. 必要なライブラリのインストール
    オンプレミス環境で実行する tensorflow_distributed_mnist.ipynb は、TensorFlow 等の各種 Python ライブラリを必要としますのでインストールします。

学習の実行

コードの修正が終わったら学習を実行することが可能です。冒頭の全体像で説明したように、SageMaker Python SDK を利用して、学習を SageMaker のインスタンスで実行するか、オンプレミス環境で実行するかを選択します。これらの選択は、SageMaker の Estimator の引数 train_instance_type を変更するだけで行うことができます。これによって、2つの学習ジョブを実行する際に、まずはオンプレミス環境を利用して、次に SageMaker のインスタンスを利用する、といった利用も可能です。

  • SageMaker のインスタンスを利用する場合は、以下のようにインスタンスタイプを指定します。
    train_instance_type = 'ml.m4.xlarge'
  • オンプレミス環境で学習する場合は 'local' と指定します。これをローカルモードと呼びます。train_instance_count は 1 に指定してください。詳細は SageMaker Python SDK – Local mode をご覧ください。
    train_instance_type = 'local'

学習は fit(inputs) 関数によって実行することができます。 inputs には学習データへのパスを指定します。このパスとして、S3に保存された学習データへのパスを与えることが標準ですが、ローカルモードにおいてのみ file:///xxx/yyy/ というような形式で、ローカルに保存された学習データへのパスを与えることも可能です。

以下のスクリーンショットは、オンプレミス環境で SageMaker の学習ジョブを実行したときのものです。上の図からは、Docker のプロセスが学習に CPU を使用していることを確認できます。下の図からは、TensorFlow による学習が進んで、ロスが変化していることを確認できます。

モデルのデプロイと推論の実行

学習と同様に、モデルのデプロイ5においても、SageMaker のインスタンスとオンプレミス環境の両方を利用することができます。これらを切り替えるためには、 deploy 関数において引数 instance_type の値を以下のように変更します。

  • SageMaker のインスタンスにデプロイする場合は、以下のようにインスタンスタイプを指定します。
    instance_type = 'ml.m4.xlarge'
  • オンプレミス環境にデプロイする場合は 'local' と指定します。
    train_instance_type = 'local'

最後に、オンプレミス環境にデプロイして推論を実行したときのスクリーンショットを以下に示します。元の tensorflow_distributed_mnist.ipynb を参考に、ラベル 7 の画像をオンプレミス環境のエンドポイントに送信しました。オレンジ色の枠で囲んだ箇所が、エンドポイントからのレスポンスです。'int64Val': ['7'] が予測値を表しており、正しい推論が行われていることを確認できました。

 

エンドポイントの削除

不要になったエンドポイントは、delete_endopoint() で削除することができます。SageMaker 上のエンドポイントの場合、エンドポイントに利用されているインスタンスを停止します。ローカルモードで作成したエンドポイントの場合、推論用のコンテナを停止します。

mnist_estimator.delete_endpoint()

まとめ

オンプレミス環境で機械学習を行っているデータサイエンティストや ML エンジニアに向けて、オンプレミス環境を活かしつつ、必要に応じて SageMaker を利用する方法を説明しました。SageMaker Python SDK では、オンプレミス環境と SageMaker をシームレスに切り替えるためのインタフェースを提供しており、ローカルモードを利用することで、オンプレミス環境での学習も行うことができます。
SageMaker Python SDK はオープンソースで、ユーザとコミュニティを形成しながら、速いスピードで開発が進められています。多くの機能を解説するために、SageMaker Python SDK の公式ドキュメントも改訂を続けていますので、ぜひご確認ください。

著者について

samejim

鮫島 正樹 (Masaki Samejima, Ph.D.) は AWS の機械学習スペシャリスト ソリューション アーキテクトで、コンピュータビジョンや時系列解析などを得意にしています。

 

 

 

hariby

針原 佳貴 (Yoshitaka Haribara, Ph.D.) は AWS のソリューション アーキテクトです。趣味はドラムで休日は友達とバンドをして過ごしています。好きなバンドは Red Hot Chili Peppers、好きな AWS のサービスは Amazon SageMaker です。