Amazon Web Services ブログ

TensorFlow と Apache MXNet を使用して、Amazon SageMaker で Keras モデルをトレーニングおよびデプロイする

Keras は適切に文書化された定評のある深層学習用オープンソースライブラリで、一方 Amazon SageMaker は機械学習モデルをトレーニングし最適化するための使いやすいツールです。両者を使用するにはこれまで、カスタムコンテナを構築する必要がありましたが、Keras は TensorFlow と Apache MXNet 用のビルトイン TensorFlow 環境の一部になりました。この結果、開発プロセスが簡素化しただけでなく、スクリプトモード自動モデル調整などの Amazon SageMaker の標準機能を使用することもできるようになりました。

Keras の優れたドキュメント、多数の事例、さらに活発なコミュニティにより、初心者にも経験豊富な専門家にも最適な選択肢となっています。このライブラリはあらゆる種類の深層学習アーキテクチャを簡単に構築できるようにするハイレベルな API を提供し、さらにトレーニングと予測に異なるバックエンドを使用するオプション (TensorFlowApache MXNet、および Theano) もあります。

この記事では TensorFlow と Apache MXNet 用ビルトイン TensorFlow 環境を使用して、Amazon SageMaker で Keras 2.x モデルをトレーニングおよびデプロイする方法を説明します。その過程で、次のことも学びます。

  • スクリプトモードを使用して、ローカルマシンで実行しているのと同じ Keras コードを Amazon SageMaker で実行する。
  • 自動モデル調整を起動して、ハイパーパラメータを最適化する。
  • Amazon Elastic Inference を使用してモデルをデプロイする。

Keras の例

この例では、Fashion MNIST データセットで簡単な畳み込みニューラルネットワークをトレーニングする方法を示します。このデータセットは、よく知られている MNIST データセットに置き換えられるものです。同数のクラス (10 個)、サンプル (トレーニング用に 60,000 個、検証用に 10,000 個)、画像プロパティ (28×28 ピクセル、白黒) があります。学ぶよりもはるかに難しいのですが、より興味深い挑戦でもあります。

まず Keras バックエンドとして TensorFlow を設定します (後で Apache MXNet に切り替えます)。詳しくは、mnist_keras_tf_local.py スクリプトをご参照ください。

このプロセスは複雑なものではありません。

  • コマンドラインからオプションのパラメータを取得するか、見つからない場合はデフォルト値を使用する。
  • データセットをダウンロードして、/data ディレクトリに保存する。
  • ピクセル値を正規化して、ラベルを one hot でエンコードする。
  • 畳み込みニューラルネットワークを構築する。
  • モデルをトレーニングする。
  • デプロイ用にモデルを TensorFlow Serving 形式で保存する。

画像チャンネルの配置は、少々難しい場合があります。白黒画像には単一のチャンネル (黒) があり、カラー画像には 3 つのチャンネル (赤、緑、青) があります。ライブラリはモデルのトレーニング時では、バッチサイズ、画像の高さと幅、チャンネル数がきちんと定義された形式のデータを想定します。TensorFlow は特に (バッチサイズ、幅、高さ、チャンネル) の入力形式を必要とし、ここではチャンネルが最後です。その一方で、MXNet は (バッチサイズ、チャンネル、幅、高さ) を期待します。チャンネルが最初です。間違った形式を使用してトレーニングを作成してしまわないように、アクティブな設定を識別するコードを数行追加し、データセットを調整します。

Amazon SageMaker を使用せずに、このコードをローカルマシンで実行し、動作を確認します。

$ python mnist_keras_tf_vanilla.py
Using TensorFlow backend.
channels_last
x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
<output removed>
Validation loss    : 0.2472819224089384
Validation accuracy: 0.9126

Keras モデルのトレーニングとデプロイ

最小限の変更をいくつか行う必要があるものの、スクリプトモードではほとんどの作業が自動的に行われます。TensorFlow 環境内でコードを呼び出す前に、Amazon SageMaker は 4 つの環境変数を設定します。

  • SM_NUM_GPUS – インスタンスに存在する GPU の数。
  • SM_MODEL_DIR – モデルの出力場所。
  • SM_CHANNEL_TRAINING – トレーニングデータセットの場所。
  • SM_CHANNEL_VALIDATION – 検証データセットの場所。

簡単な修正を行えば、自分のトレーニングコードでこれらの値を使うことができます。

parser.add_argument('--gpu-count', type=int, default=os.environ['SM_NUM_GPUS'])
parser.add_argument('--model-dir', type=str, default=os.environ['SM_MODEL_DIR'])
parser.add_argument('--training', type=str, default=os.environ['SM_CHANNEL_TRAINING'])
parser.add_argument('--validation', type=str, default=os.environ['SM_CHANNEL_VALIDATION'])

ハイパーパラメータはどうしましょう? 何もする必要はありません。Amazon SageMaker はハイパーパラメータを、コマンドライン引数でコードに渡します。

詳しくは、更新したスクリプト mnist_keras_tf.py をご参照ください。

Amazon SageMaker でのトレーニング

Keras モデルをデプロイしたら、Amazon SageMaker でトレーニングを開始できます。詳しくは、Fashion MNIST-SageMaker.ipynb ノートブックをご参照ください。

このプロセスは複雑なものではありません。

  • データセットをダウンロードする。
  • トレーニングチャンネルと検証チャンネルを定義する。
  • TensorFlow Estimator を設定して、スクリプトモードを有効にし、ハイパーパラメータをいくつか渡す。
  • トレーニング、デプロイ、および予測を行う。

トレーニングログで、Amazon SageMaker の環境変数の設定方法、Estimator で定義された 3 つのハイパーパラメータを使用して Amazon SageMaker がスクリプトを起動する方法を確認できます。

/usr/bin/python mnist_keras_tf.py --batch-size 256 --epochs 20 --learning-rate 0.01 --model_dir s3://sagemaker-eu-west-1-123456789012/sagemaker-tensorflow-scriptmode-2019-05-16-14-11-19-743/model

モデルを TensorFlow Serving 形式で保存したので、Amazon SageMaker は他の TensorFlow モデルと同様に、Estimator で deploy() API を呼び出し、モデルをデプロイできます。最後に、データセットから無作為に画像をいくつか取得し、デプロイしたばかりのモデルを使ってそれらを予測できます。

スクリプトモードを使用すると、既存の TensorFlow コードを簡単にトレーニングし、Amazon SageMaker にデプロイできます。これらの環境変数を取得し、ハイパーパラメータ用のコマンドライン引数を追加し、適切な場所にモデルを保存すると、完成です!

Apache MXNet バックエンドへの切り替え

前述のように、Keras はバックエンドとして MXNet もサポートしています。MXNet は TensorFlow より迅速にトレーニングできると感じるお客様が多いようですので、ぜひ一度試してみてください。

上記で説明したことがすべて応用できます (スクリプトモードなど)。2 点だけ変更を加えてください。

  • Channels_first を使用する。
  • モデルを MXNet 形式で保存し、予測用モデルを読み込むために必要な追加ファイル (model-shapes.json) を作成する。

詳しくは、MXNet の mnist_keras_mxnet.py トレーニングコードをご参照ください。

ノートブックに Amazon SageMaker の手順が載っています。Apache MXNet は MXNet Estimator を利用することを除けば、これまで紹介してきたものと実質的に同じプロセスを使用します。

Keras での自動モデルチューニング

自動モデルチューニングは、トレーニング作業に最適なハイパーパラメータ、つまり検証精度を最大化するハイパーパラメータを見つけるのに役立つ手法です。

TensorFlow と MXNet はビルトイン Estimator を使用しているので、デフォルトでこの機能にアクセスできます。簡略化のため、Keras-TensorFlow でこれを使用する方法だけを紹介しますが、プロセスは Keras-MXNet でも同じです。

まず、チューニングしたいハイパーパラメータとその範囲を定義します。どれでもチューニングできるのでしょうか? スクリプトモードがあるおかげで、パラメータはコマンドライン引数で渡されるので、何でもチューニングできます。

hyperparameter_ranges = {
    'epochs':        IntegerParameter(20, 100),
    'learning-rate': ContinuousParameter(0.001, 0.1, scaling_type='Logarithmic'),
    'batch-size':    IntegerParameter(32, 1024),
    'dense-layer':   IntegerParameter(128, 1024),
    'dropout':       ContinuousParameter(0.2, 0.6)
}

自動モデルチューニングを構成するときに、最適化するメトリクスを定義します。Amazon SageMaker は、ビルトインアルゴリズム (XGBoost など) やフレームワーク (TensorFlow、MXNet など) のトレーニングログから自動的に読み取ることができる定義済みメトリクスをサポートしています。Keras はこれをサポートしていません。代わりに、簡単な正規表現を使用してログからメトリクスを取得する方法を、Amazon SageMaker に指示する必要があります。

objective_metric_name = 'val_acc'
objective_type = 'Maximize'
metric_definitions = [{'Name': 'val_acc', 'Regex': 'val_acc: ([0-9\\.]+)'}]

次に、チューニングジョブを定義して実行し、最適なモデルをデプロイします。これらの方法に、差はありません。

上級ユーザーだとオーバーフィットを避けるために早期停止の使用を主張するかもしれません。確かにそうでしょう。ビルトインのコールバック (keras.callbacks.EarlyStopping) を使って、Keras にこのモデルを実装することができます。しかしながら、この方法は自動モデルチューニングをややこしくさせる原因にもなります。

最後のエポックではなくベストエポックのメトリクスを取得するには、Amazon SageMaker が必要です。この問題を克服するには、カスタムコールバックを定義し、最高の検証精度を記録します。Amazon SageMaker がトレーニングログでこれらを見つけることができるように、適切な方法で正規表現を修正します。

詳しくは、02-fashion-mnist ノートブックをご参照ください。

結論

この記事では、たくさんの分野を取り上げました。以下のことを学びました。

  • TensorFlow と Apache MXNet の両方のビルトイン環境を使用して、Amazon SageMaker で Keras モデルをトレーニングおよびデプロイする。
  • 最小限の変更で既存の Keras コードを使用するには、スクリプトモードを使う。
  • Keras メトリクスに対して自動モデルチューニングを実行する。

最後まで読んでいただき、ありがとうございました。この記事がお役に立てると嬉しいです。こちらまたは直接 Twitterにて、いつでもコメントやフィードバックをお待ちしています。


著者について

Julien はEMEA の人工知能と機械学習のエバンジェリストです。開発者と企業のアイデアを実生活に結びつけることに注力しています。余暇には、J.R.R. トールキンの文学作品を繰り返し読んでいます。