Amazon Web Services ブログ

Apache MXNet (Incubating) が Keras 2 のサポートを追加

Keras および Apache MXNet (Incubating) のオープンソースプロジェクトへの参画者のおかげで、Keras-MXNet 深層学習のバックエンドが現在利用可能です。Keras は Python で書かれた高水準なニューラルネットワーク API です。CNN および RNN のプロトタイピングを素早く簡単に作成することで知られています。

Keras の開発者は、現在、畳み込みニューラルネットワーク (CNN) のトレーニングおよび再帰型ニューラルネットワーク (RNN) の分散トレーニング向けのハイパフォーマンスな MXNet 深層学習エンジンを使用することができます。コードを数行更新すると、Keras の開発者は、MXNet のマルチ GPU の分散トレーニング機能を使用して、トレーニングスピードを速めることができます。MXNet モデルを保存できることは、このリリースのもう一つの注目すべき機能です。Keras での設計、Keras-MXNet によるトレーニング、本番環境のインターフェイスの実行が大規模な MXNet で可能です。

Keras 2 および MXNet の分散トレーニング

この記事では、Keras-MXNet のインストール方法と CNN および RNN のトレーニング方法の説明をします。以前、他の深層学習エンジンで分散トレーニングを実施したことがある場合は、退屈で難しいかもしれません。それでは、Keras-MXNet について内容を見ていきましょう。

インストールは数ステップだけです。

  1. AWS 深層学習 AMI のデプロイ
  2. Keras-MXNet のインストール
  3. Keras-MXNet の設定

1. AWS 深層学習 AMI のデプロイ

AWS 深層学習 AMI (DLAMI) をデプロイするには、この短いチュートリアルに従ってください。マルチ GPU トレーニングのサンプルを利用するために、p3.8xlarge または同等のマルチ GPU インスタンスタイプを起動します。

CUDA、Keras、MXNet、および TensorFlow のような他のフレームワークを実行するための依存関係をご自身でインストールしたいですか?その場合は、Keras-MXNet インストールガイドに従ってください。

2. Keras-MXNet のインストール

Keras-MXnet およびその依存関係を DLAMI で MXNet Conda 環境にインストールします。Keras のバージョンが既に 1.0 の場合は、まずアンインストールをする必要があります。  DLAMI にログインし、以下を実行します。

# Activate the MXNet Python 3 environment on the DLAMI
$ source activate mxnet_p36

# Install a dependency needed for Keras datasets
$ pip install h5py

# Uninstall older versions Keras-MXNet
$ pip uninstall keras-mxnet

# Install Keras-MXNet v2.1.6 
$ pip install keras-mxnet

Keras-MXnet およびその依存関係が DLAMI で MXNet Conda 環境にインストールされました。

3. Keras-MXNet のインストールの検証

Keras が MXNet バックエンドを実行していることを以下で検証します。

$ python
>>>import keras as k
   Using MXNet backend

CNN サポート

CIFAR-10 データセットで ResNet モデルをトレーニングしましょう。10 クラスを特定します: Airplane、automobile、bird、cat、deer、dog、frog、horse、ship、truck。Keras-MXNet レポジトリのサンプルセクションから Keras 2 のサンプルスクリプトを使用できます。Keras のバックエンドとして MXNet を使用するには、ご自身のスクリプトの更新が少し必要です。

まず、Keras-MXNet レポジトリフォルダからサンプルスクリプトをダウンロードします。

$ wget https://raw.githubusercontent.com/awslabs/keras-apache-mxnet/master/examples/cifar10_resnet_multi_gpu.py

そのスクリプトは、multi_gpu_model API を呼び出し、使用する GPU の数を渡します。

次に、ターミナルウィンドウの nvidia-smi を実行し、DLAMI で利用可能な GPU の数を決定します。その次のステップで、4 つの GPU がある場合は、そのままスクリプトを実行し、ない場合は、編集するために以下のコマンドを実行し、スクリプトを開きます。

$ vi cifar10_resnet_multi_gpu.py

スクリプトに GPU の数を定義する以下の行があります。必要に応じて更新します。

model = multi_gpu_model(model, gpus=4)

それでは、トレーニングを実行しましょう。

$ python cifar10_resnet_multi_gpu.py

(オプション) GPU 使用率およびメモリ使用率を nvidia-smi コマンドでトレーニングを実行しながら確認します。これには、もう一つターミナルセッションを開きます。

RNN サポート

Keras-MXNet は現在試験的に RNN をサポートしています。MXNet バックエンドで RNN を使用する場合、いくつか制限があります。詳細については、Keras-MXNet ドキュメントを参照してください。ここの例には、LSTM レイヤーを使用して、IMDB データセットをトレーニングするために必要な回避策が含まれています。回避策にもかかわらず、マルチ GPU AMI でこの RNN をトレーニングしたほうが、使用していたものよりも比較的容易で速くなります。

imdb_lstm サンプルスクリプトを使用します。  埋め込みレイヤーでインプット長を渡し、 unroll=True を以下の通り設定します。

まず、DLAMI のターミナルセッションで、Keras-MXNet レポジトリフォルダからサンプルスクリプトをダウンロードします。

$ wget https://raw.githubusercontent.com/awslabs/keras-apache-mxnet/master/examples/imdb_lstm.py

次に、スクリプトを開き、以下の行に移動し確認します。

model.add(Embedding(max_features, 128, input_length=maxlen))
model.add(LSTM(128, unroll=True))

最後に、サンプルスクリプトは既に修正されており、MXNet バックエンドと互換性があるので実行できます。

$ python imdb_lstm.py

(オプション) GPU 使用率およびメモリ使用率を nvidia-smi コマンドでトレーニングを実行しながら確認します。これには、もう一つターミナルセッションを開きます。

ベンチマーク

異なる Keras バックエンドの実績を評価するために、ベンチマークモジュールを Keras-MXNet に追加しました。この表で説明した通り、CPU、シングル GPU、マルチ GPU の各マシンでさまざまなモデルやデータセットを使用することによって、Keras-MXNet の CNN トレーニングスピードが速まり、複数の GPU にまたがって効率的にスケーリングすることを確認できます。これをトレーニングスピードの棒グラフで示します。ベンチマークスクリプトの実行方法および詳細なベンチマーク結果の生成方法の情報については、Keras ベンチマーク の readme を参照してください。

ベンチマーク設定

  • Keras バージョン 2.1.6
  • MXNet バージョン 1.2.0
  • イメージデータのフォーマット : Channel first

CIFAR10 データセットのトレーニングは、データセットのイメージの性質が小さいため、線の下にスケーリングします。データセットは、32×32 ピクセルサイズの 50,000 イメージで構成されています。これらの小さいイメージを送信するための通信オーバーヘッドは、4 つから 8 つに大幅に増えた GPU の計算能力よりも高いです。ImageNet および人工データのデータセットは、Keras-MXNet の可能なパフォーマンス改善を説明するのに最適です。表下のグラフでこれを確認できます。

インスタンス GPU 使用率

CIFAR-10

(イメージ/秒)

ImageNet (イメージ/秒) 人工データ
p3.8xlarge 1 831 135 194
p3.8xlarge 4 1783 536 764
p3.16xlarge 8 1680 722 1068

Keras-MXNet に関するイメージ処理のスピード比較

次のステップ?

Keras-MXNet チュートリアルをもう少し進めるか、リリースノートの詳細をお読みください。

詳細情報

引用

  1. CIFAR: “Learning Multiple Layers of Features from Tiny Images, Alex Krizhevsky, 2009.”
  2. IMDB: “Information courtesy of IMDb, (http://www.imdb.com), Used with permission.”

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

Sandeep Krishnamurthy は AWS 深層学習のソフトウェアエンジニアです。彼には、すべての開発者が利用できる、AI 技術を利用するためのソフトウェアを構築し、日々の生活の中で AI の使用を促進させるというミッションがあります。余暇は、生まれたばかりの娘とありふれた楽しい生活をおくるのに多忙です。

Kalyanee Chendke は AWS 深層学習のソフトウェアエンジニアです。彼女は、深層学習の技術の導入増加に対応するためのツールを構築することに重点を置いています。仕事以外では、バドミントンや写生を楽しみ、友達や家族と時間を過ごしています。

Lai Wei は AWS 深層学習のソフトウェアエンジニアです。彼は、データサイエンティストやエンジニアリング用に、使用が容易で、ハイパフォーマンスかつスケーラブルな深層学習フレームワークを構築することに重点を置いています。仕事以外では、スキーやスキューバーダイビングを楽しんでいます。

Aaron Markham は MXNet および AWS 深層学習 AMI のプログラマーです。彼は、ワイン醸造の学位を持っており、またライティングやティーチングで、新しい技術を共有することに情熱を持っています。深層学習の技術以外の話では、サンタクルーズのホームレスにコンピュータースキルを、サン・クエンティン州立刑務所の受刑者にはウェブプログラミングを教えています。仕事や教育以外では、スノーボードで斜面を下っているときやハイキングで彼を見かけることができます。