Amazon Web Services ブログ

TensorFlow コンテナと Amazon SageMaker での「独自のアルゴリズムの導入」を活用する、カスタムラベルの転移学習

データ科学者および開発者は、Amazon SageMaker の完全マネージド型機械学習サービスを使用して機械学習 (ML) モデルを構築およびトレーニングし、実稼働対応可能なレベルでホストされている環境に直接デプロイすることができます。

このブログ記事では、Amazon SageMaker を使用して、トレーニングと推論のための独自のコードで TensorFlow コンテナによる転移学習を行う方法を説明します。

転移学習は、追加のカスタムラベルのために AlexNet や ResNet[1] などの既にトレーニングされたニューラルネットワークを再トレーニングするためにコンピュータビジョンの問題で使用されるよく知られているテクニックです。また、Amazon SageMaker は、組み込みの画像分類アルゴリズムによる画像分類のための転移学習もサポートしており、独自のラベル付き画像データを使用して ResNet[1] ネットワークを再トレーニングすることもできます。Amazon SageMaker についての詳細は、この画像分類のドキュメントを参照してください。転移学習および関連するガイドラインをいつ使用するかを理解するには、こちらをご覧ください。

Amazon SageMaker の組み込みの画像分類アルゴリズムは幅広い種類の用途に適していますが、事前にトレーニングされたネットワークとそれがトレーニングされた画像データの異なる組み合わせが必要となる場合があります。たとえば、念頭に置いておくべき基準のいくつかは、元のデータセットと新しいデータセットの類似性、新しいデータセットのサイズ、必要なラベルの数、モデルの精度、トレーニングしたモデルのサイズ、そして再トレーニングに必要なコンピューティング能力の量などです。仮に、トレーニングしたモデルをハンドヘルドデバイスにデプロイしようとしているなら、MobileNet などのフットプリントが小さいモデルを採用する方が良いかもしれません。あるいは、コンピューティング効率がより良いモデルが欲しいなら、Xception のほ方が VGG16 や Inception よりも優れています。

このブログ記事では、ImageNet データセットで事前にトレーニングした inception v3 ネットワークを採用し、Caltech-256 データセット (Griffin、G. Holub、AD. Perona、P. The Caltech 256. Caltech Technical Report) を使用して再トレーニングします。Amazon SageMaker を使用すると、独自のコンテナをバンドルして Amazon Elastic Container Registry (Amazon ECR) にインポートするのが非常に簡単になります。あるいは、Amazon SageMaker が提供するコンテナを使用することができます: https://github.com/aws/sagemaker-tensorflow-containers。Amazon SageMaker TensorFlow コンテナを、TensorFlow フレームワークで独自の転移学習コードによってカスタマイズします。次に、このコンテナを Amazon ECR にインポートし、モデルのトレーニングと推論に使用します。

これが十分な背景を与えてくれることを願っています。それでは、始めましょう。

環境の起動と準備

Amazon SageMaker が提供する Jupyter ノートブックインスタンスを活用して、提供される TensorFlow コンテナをカスタマイズします。Amazon ECR に登録する前に、このノートブック環境にコンテナをインポートします。トレーニングと推論の両方に同じコンテナが使用されます。ここで、独自のコンテナのインポートの基本について説明する前のブログ記事に基づいて構築することに注意してください。違いは、このブログ記事では TensorFlow コンテナをカスタマイズしていることです。

Amazon SageMaker ノートブックインスタンスの起動

AWS マネジメントコンソールにログインし、Amazon SageMaker コンソールに移動します。ノートブックインスタンスには、カスタムコンテナと Docker コンテナイメージを構築するためのすべての構築ブロックがあります。

Amazon SageMaker ダッシュボードを起動します。[Create notebook instance] を選択します。

このブログ記事の目的のために、以下のことを行います。

  • ノートブックインスタンスを、インターネットにアクセスできる、VPC 内のサブネットに配置します。
  • 任意のインスタンスオプションをドロップダウンリストから選択することができますが、最低でも ml.m4.xlarge を選択することをお勧めします。
  • 新しい IAM ロールを作成するか、既存の IAM ロールをアタッチします。この IAM ロールが、Amazon ECR へのフルアクセスと S3 バケットへのアクセスを許可していることを確認します。このアクセスは、Amazon SageMaker の新しい IAM ロールを作成するときに取得するデフォルトのアクセスに追加されるものです。このブログ記事では、これらのアクセス許可で開始するには十分なはずですが、アクセス許可の範囲をさらに狭め、リソースに制限したい場合は、ドキュメントに記載されている Amazon SageMaker のロールを参照してください。
  • また、この VPC で、少なくともポート 80 と 8888 が開いているセキュリティグループを作成します。
  • このノートブックのインターネットアクセスを有効にします。このブログ記事では、これで十分なはずですが、ノートブックインスタンスのセキュリティについてさらに検討したい場合は、ドキュメントに記載されているノートブックインスタンスのセキュリティをご確認ください。
  • 残りのオプションはデフォルト設定のままにしておきます。

[Create notebook instance] を選択すると、インスタンスの起動が表示されます。([Pending ] ステータスになります。) –

ステータスが [Pending] から [InService] に変わるまで待ちます。

ノートブックインスタンスが稼動したら、[Open] を選択します。これで、さまざまな環境が事前に設定され、事前に構築された Jupyter ノートブックが完全に動作しています。

次のような画面が表示されます。

右上隅の [New] を選択すると、事前設定されたすべての環境が表示されます。

[Terminal] を選択して、ターミナルを起動します。

ここでの作業の大半で、このターミナル画面を使用します。

Amazon SageMaker に TensorFlow コンテナを提供する

TensorFlow、MXNet、Chainer のコンテナが提供されています。ここでは、TensorFlow コンテナを、独自のトレーニングと推論のコードでカスタマイズします。まず、AWS から TensorFlow コンテナ Git リポジトリをクローンします。

ターミナルウィンドウで、以下のコマンドを実行します。

sh$ git clone https://github.com/aws/sagemaker-tensorflow-containers.git

これで、リポジトリがクローンされるはずです。次のスクリーンショットを参照してください。

これで、環境はコンテナをカスタマイズする準備が整っています。

TensorFlow コンテナを転移学習用にカスタマイズする

それでは、TensorFlow Docker に必要なソースコードをクローンしましょう。サンプルの Dockerfile があるディレクトリに移動します。

sh$ cd sagemaker-tensorflow-containers/docker/1.6.0/base

以下を実行して、転移学習と推論のための TensorFlow コードをクローンします。

sh$  wget https://s3.amazonaws.com/aws-machine-learning-blog/artifacts/tensorflow-byom-blog/tfblog-master.zip; unzip tfblog-master.zip; mv tfblog-master tfblog; rm -f tfblog-master.zip

コピーした後、次のような構造が表示されます。

ヘルパースクリプトと実際のコードは、Git リポジトリからダウンロードされた tfblog というフォルダにあります。このフォルダには Dockerfile_blog.cpu というファイルがあります。これは TensorFlow コンテナリポジトリで提供された Dockerfile.cpu のカスタマイズバージョンです。主な変更点は次のとおりです。

  1. コンテナの実行時に、トレーニングと推論のコードをその相対パスから利用できるように、WORKDIR を /opt/program に変更しました。
  2. STDOUT および STDERR メッセージが Amazon CloudWatch Logs に簡単にストリーム配信されるように、いくつかの環境変数を変更しました。
  3. 転移学習、推論のための TensorFlow コード、ウェブアクセスのヘルパーコードがコンテナにコピーされます。

これらの変更は別として、残りの Dockerfile は、ここにある Amazon SageMaker リポジトリで利用できるものと同じです。

これで、トレーニングと推論に必要な環境とコードが完成したので、次はコンテナを構築します。

Amazon SageMaker 提供 TensorFlow コンテナの構築

それでは、Docker コンテナを構築して、コンテナレジストリにプッシュします。

/home/ec2-user/sagemaker-tensorflow-containers/docker/1.6.0/base/tfblog/

sh# cp Dockerfile_blog.cpu Dockerfile.cpu

tfblog / tensorflow_code にあるファイルを確認します。モデルのトレーニング中に使用される「train」などの重要なファイルを探します。Amazon SageMaker は、トレーニングプロセス中にこのスクリプトが呼び出されるように Docker コンテナを呼び出します。同様に、トレーニングしたモデルパラメータを読み込み、ラッパー機能を通じて予測クエリを待機する predictor.py というスクリプトがあります。これは、入力データ (image/ text/ csv) を解析し、モデル関数を呼び出します。その後、予測がユーザーに返信されます。train および predictor.py のコードは、コードの画像の再トレーニング部分と画像のラベル付け部分から取得されていることに注意してください。主な変更は、推論コードが Flask アプリケーションインスタンスとして実行され、ping および Amazon SageMaker からの呼び出し要求に応答することです。このサンプルのノートブックは、Docker コンテナとそれが Amazon SageMaker で動作するために必要なフォルダ構造をパッケージ化する方法を説明します。

それではコンテナを作成し、「blog_img_5」や好きな名前などの名前を付けてください。このイメージは、ECR に登録されます。

sh#  bash build_and_push.sh blog_img_5 (または、blog_img_5 の代わりにイメージに好きな名前を付けます)

スクリプトを実行すると、次のような画面が表示されるはずです。

コンテナが構築され、ECR で登録されています。これを確認することができます。

トレーニングと推論のためにコンテナをローカルでテストする

これで、Dockerfile にトレーニングと予測のコードが用意されたので、Amazon SageMaker に公開する前にサンプルデータをアップロードしてモデルをローカルでテストします。このフォルダパスがコンテナによって参照されるため、トレーニングデータがこのパスに配置されていることを確認します。ローカルトレーニングを開始するためのヘルパースクリプトは、このパスをコンテナインスタンスにマウントします (https://github.com/amitkshgit/tfblog/blob/master/local_test/train_local.sh を参照してください)。

sh# cd local_test/test_dir/input/data/train/

前述のように、Caltech-256 データセットを使用することができます。

フォルダ構造に、自分のフォルダにグループ化したラベルに属するすべてのイメージが含まれていることを確認します。

それでは、SageMaker ノートブックインスタンス内からトレーニングをローカルでテストしましょう。Amazon SageMaker に公開する前に予測を構築、デプロイ、実行するユーティリティがある、local_test というフォルダに移動します。

これは、テストやデバッグの目的で非常に便利です。ヘルパースクリプト train_local.sh と、それがコンテナを起動し、トレーニングデータパスをマウントし、エントリポイントとして「train」を渡す方法に注意してください。

少量のデータをコピーして、トレーニングの正確さではなく機能をテストします (たとえば、「train」と「predict」が呼び出されるかどうか)。

ローカルでトレーニングを開始するには:

sh# bash train_local.sh blog_img_5

トレーニングの進捗状況が表示されるはずです。TensorFlow は、ImageNet で既にトレーニングされている InceptionV3 モデルを最初にダウンロードし、サンプルテストデータから新しいラベルのトレーニングを開始します。

Amazon SageMaker コンソールによるコンテナの使用

これで、コンテナの機能をローカルでテストして検証したので、そのイメージはすでに ECR に登録されているため、Amazon SageMaker コンソールから使用することができます。Amazon SageMaker では、データをローカルにコピーする代わりに、Amazon S3 のデータを使用することができます。さらに、Amazon CloudWatch でログを表示し、トレーニングの進捗状況を追跡することができます。最も重要なことは、予測エンドポイントを作成し、推論で使用できることです。

トレーニングジョブとモデルのエンドポイントの作成で必要となるため、ECR リポジトリ名をメモしておきます。Amazon ECS コンソールを開いて、リポジトリを選択すると、リポジトリの URL が表示されます。URI 全体をメモしておきます。

Amazon SageMaker でトレーニングを実行する

それでは、Amazon SageMaker コンソールからトレーニングジョブを作成します。[Training Jobs] を選択してから、[Create Training Job] を選択します。下のようなページが表示されるはずですので、以下を確認します。

  • ノートブックインスタンスの起動時に使用された IAM ロールが提供されている。
  • インポートした独自のコンテナを使用しているため、[Algorithm] が「Custom」に設定されている。
  • TensorFlow コンテナにインポートされた Docker イメージの適切な ECR イメージの URI が提供されている。
  • このブログ記事の目的のためには、ここで説明した設定で十分です。本稼働の目的で、VPC を使用してトレーニングジョブを保護する方法の詳細について知りたい場合は、ドキュメントの 「Amazon Virtual Private Cloud を使用してトレーニングジョブを保護する」をお読みください。

[Resource configuration] については、[Instance type] では「ml.m4.4xlarge」を選択し、[Additional volume per instance (GB)] (ストレージ) を「20」に増やします。

このシナリオでは、ハイパーパラメータは変更しません。

次に、トレーニングデータを読み込み、Amazon S3 で正しいパスを指定します。データがラベル付きフォルダのファイルとして整理され、Amazon S3 のパスで使用できることを確認します。このパスを、次のスクリーンショットで示される S3 の場所へ指定します –

[Create training job] を選択します。トレーニングコンテナを起動し、すべてのデータをコピーするには数分かかります。コンテナが起動して実行され、データが読み込まれるまで、トレーニングは開始されません。ジョブの送信が成功すると、次のようになります。

ジョブ名を選択し、CloudWatch コンソールに移動して、ストリーミングされているメトリクスを確認します。CloudWatch Logs に出力されるすべての stdout メッセージを確認する必要があります。

ジョブのステータスが [Completed] に変わると、そのジョブが Amazon S3 にモデルをアップロードしたことを意味します。このモデルアーティファクトを使用して、予測のエンドポイントを作成します。

トレーニングしたモデルを、Amazon S3 から Amazon SageMaker にデプロイする

ここで、モデルをデプロイして、予測のために呼び出します。トレーニングジョブが完了したら、それを選択すると、[Create Model] のオプションが表示されます。

次のスクリーンショットに示すように、このモデルの残りの詳細をページに入力します。

残りのオプションはデフォルトのままにしておきます。コンソールが、トレーニングしたモデルのパラメータである適切なコンテナイメージとモデルアーティファクトを自動的に選択したことに注意してください。 このブログ記事の目的のためには、これらの設定で十分ですが、VPC を使用してモデルを保護する方法の詳細について知りたい場合は、ドキュメントの「Amazon Virtual Private Cloud を使用してモデルを保護する」をお読みください。

モデルをデプロイしたら、エンドポイント構成を作成します。エンドポイント構成では、デプロイするモデル、相対的なトラフィックの重み付け、ハードウェア要件を指定します。

デプロイしたモデルを選択すると、[Endpoint configurations] のオプションが表示されます。

エンドポイント構成を作成します。次に、[Endpoints] を選択して、このエンドポイント構成を使用するエンドポイントを作成します。このエンドポイントに名前を付けて、既存のエンドポイント構成を選択します。

最後のステップで作成したエンドポイント構成を選択します。作成した後、このエンドポイントの作成の進行状況を表示するには、このエンドポイントを選択します。

エンドポイントの作成にはしばらく時間がかかります。ただし、作成した後、ノートブックから呼び出すことができます。作成後、ステータスは [InService] に変わります。

Amazon SageMaker エンドポイントを呼び出して予測を実行する

conda_python2 環境を開きます。

以下のコードをセルに貼り付けます。

# Code start
import boto3
runtime = boto3.Session().client(service_name='runtime.sagemaker')
url = ' https://images.unsplash.com/photo-1519046947096-f43d6481532b'
response = runtime.invoke_endpoint(EndpointName='blog-ep-new,
                                   ContentType='text/plain',
                                   Body=url)
result = response['Body'].read()
result
# Code end 

モデルが適切にトレーニングされ、デプロイされている場合は、次のような応答が返されます。

{"aerobatics": "0.0019493427", "bmx": "0.007112476", "rugby union": "0.0011374813", "fencing": "0.0015482939", "beach volleyball": "0.98825246"}

リソースのクリーンアップと削除

このシナリオを実行した後のコストを回避できるように、プロビジョニングしたリソースをクリーンアップすることを忘れないでください。

エンドポイントの削除

エンドポイントを削除するには、作成したエンドポイントを強調表示し、[Delete] を選択します。

エンドポイント構成の削除

同様に、該当するエンドポイント構成を選択して、[Delete] を選択してエンドポイント構成を削除します。

モデルの削除

次に、モデルを削除します。

ノートブックインスタンスの削除

最後に、ノートブックインスタンスを削除します。

まとめ

結論として、このブログ記事が、既存のコードをフレームワークに取り入れて、Amazon SageMaker が提供するコンテナにバンドルし、Amazon SageMaker に移植するためのアイデアを提供できることを望んでいます。このサービスが提供するコンテナ化のアプローチにより、開発者やデータ科学者は中心的な強みに集中することが非常に簡単になります。あらゆるフレームワークを選択して使用することができますが、Amazon S3、CloudWatch、Amazon ECR、IAM などの幅広い AWS サービスを活用して、インフラストラクチャの拡張と運用を行うことができます。


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

Amit Sharma は、分析と機械学習サービスを専門とする AWS ソリューションアーキテクトです。彼は、関連するプロジェクトに対する技術指導を通じて、さまざまな AWS の顧客やパートナーがビジネス上のメリットのためにサービスを活用できるようにサポートしています。