Compute Engine での分散 TensorFlow の実行

このチュートリアルでは、複数の Compute Engine インスタンスで TensorFlow の分散構成を使用し、MNIST データセット畳み込みニューラル ネットワーク モデルをトレーニングする方法について説明します。MNIST データセットは、手書き数字の認識に対応しているため、画像認識のトレーニング セットとして機械学習で広く利用されています。

TensorFlow は、機械学習向けに開発されたエンドツーエンドのオープンソース プラットフォームです。TensorFlow には、ツール、ライブラリ、コミュニティ リソースを含む幅広い柔軟なエコシステムがあります。それにより、研究者は ML の最先端技術を発展させ、開発者は ML を利用したアプリケーションを構築してデプロイすることが可能です。TensorFlow は、複数のパソコンで実行してトレーニング ワークロードを分散できるように設計されています。このチュートリアルでは、複数の Compute Engine 仮想マシン(VM)インスタンスで TensorFlow を実行してモデルをトレーニングします。その代わりに、AI Platform を使用して、リソース割り当てタスクを管理し、トレーニング済みモデルをホストすることもできます。特別な理由がない限り、AI Platform を使用することをおすすめします。詳細については、このチュートリアルの AI Platform と Cloud Datalab を使用するバージョンをご覧ください。

次の図は、Compute Engine 上で TensorFlow の分散構成を実行し、AI Platform と Cloud Datalab を使用してトレーニング済みモデルで予測を行うためのアーキテクチャを示しています。

Compute Engine での Tensorflow の実行を示す図

このチュートリアルでは、このアーキテクチャを設定して使用する方法を示し、その過程でいくつかのコンセプトについて説明します。

目標

  • Compute Engine を設定して、TensorFlow を実行する VM のクラスタを作成する。
  • Compute Engine クラスタで分散 TensorFlow のサンプルコードを実行してモデルをトレーニングする方法を習得する。サンプルコードは最新の TensorFlow のライブラリとパターンを使用しているので、自分のトレーニング コードを設計する際の参考になります。
  • トレーニング済みモデルを AI Platform にデプロイして予測用のカスタム API を作成し、Cloud Datalab ノートブックを使用して予測を行う。

料金

料金計算ツールでこのチュートリアルで発生する費用を計算すると、すべてのリソースを 1 日中使用した場合の費用はおおよそ $1.20 になります。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Google Cloud Platform プロジェクトを選択または作成します。

    [リソースの管理] ページに移動

  3. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする方法について

  4. Compute Engine API と AI Platform Training and Prediction API API を有効にします。

    APIを有効にする

テンプレート インスタンスを作成する

このチュートリアルでは、Google Cloud Platform Console で完全に機能する Linux シェルである Cloud Shell を使用します。

  1. Cloud Shell に移動します。

    Cloud Shell を開く

  2. デフォルトの Compute Engine ゾーンとデフォルトのプロジェクトを設定します。[YOUR_PROJECT_ID] は、Google Cloud Platform(GCP)プロジェクト ID に置き換えてください。

    gcloud config set compute/zone us-east1-c
    gcloud config set project [YOUR_PROJECT_ID]
  3. GitHub リポジトリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/cloudml-dist-mnist-example
    cd cloudml-dist-mnist-example
  4. Ubuntu Wily イメージから VM の初期インスタンスを作成します。

    gcloud compute instances create template-instance \
    --image-project ubuntu-os-cloud \
    --image-family ubuntu-1604-lts \
    --boot-disk-size 10GB \
    --machine-type n1-standard-1
  5. ssh で VM に接続します。

    gcloud compute ssh template-instance
  6. pip をインストールします。

    sudo apt-get update
    sudo apt-get -y upgrade \
    && sudo apt-get install -y python-pip python-dev
  7. TensorFlow をインストールします。

    sudo pip install tensorflow
    
  8. (省略可)インストールを確認するの手順に沿って、インストールを確認します。

  9. exit と入力して Cloud Shell に戻ります。

  10. Compute Engine インスタンスで実行されている TensorFlow のバージョンを確認します。

    sudo python -c 'import tensorflow as tf; print(tf.__version__)'
  11. 1.2.1 よりも前のバージョンの場合には、pip を使用してアップグレードします。

    sudo pip install --upgrade tensorflow

Cloud Storage バケットの作成

次に、MNIST ファイルを格納する Cloud Storage バケットを作成します。手順は次のとおりです。

  1. ワーカー インスタンスの間で共有される MNIST データファイルを保存するため、Cloud Storage のリージョン バケットを作成します。

    MNIST_BUCKET="mnist-$RANDOM"
    gsutil mb -c regional -l us-east1 gs://${MNIST_BUCKET}
  2. 次のスクリプトを使用して MNIST データファイルをダウンロードし、バケットにコピーします。

    sudo ./scripts/create_records.py
    gsutil cp /tmp/data/train.tfrecords gs://${MNIST_BUCKET}/data/
    gsutil cp /tmp/data/test.tfrecords gs://${MNIST_BUCKET}/data/

テンプレート イメージと学習インスタンスを作成する

ワーカー、マスター、パラメータ サーバー インスタンスを作成するには、テンプレート インスタンスをイメージに変換し、そのイメージを使用してそれぞれの新しいインスタンスを作成します。

  1. template-instance VM の自動削除をオフに、VM を削除してもディスクが保持されるようにします。

    gcloud compute instances set-disk-auto-delete template-instance \
    --disk template-instance --no-auto-delete
  2. template-instance を削除します。

    gcloud compute instances delete template-instance
  3. template-instance ディスクからイメージ template-image を作成します。

    gcloud compute images create template-image \
    --source-disk template-instance
  4. 追加のインスタンスを作成します。このチュートリアルでは、master-0worker-0worker-1ps-0 という 4 つのインスタンスを作成します。storage-rw スコープにより、インスタンスが Cloud Storage バケットにアクセスできるようにします。インスタンス名は、次のようにスペースで区切ってください。

    gcloud compute instances create \
    master-0 worker-0 worker-1 ps-0 \
    --image template-image \
    --machine-type n1-standard-4 \
    --scopes=default,storage-rw

これで、クラスタで分散 TensorFlow を実行する準備が整いました。

分散 TensorFlow コードを実行する

このセクションでは、すべての VM インスタンスに対し、TensorFlow コードを実行してモデルをトレーニングするように指示するスクリプトを実行します。

  1. Cloud Shell で、cloudml-dist-mnist-example ディレクトリから次のコマンドを実行します。

    ./scripts/start-training.sh gs://${MNIST_BUCKET}

    start-training.sh というスクリプトが各 VM にコードを push して必要なパラメータを送信し、分散クラスタを作成する TensorFlow プロセスを各マシンで開始します。Cloud Shell の出力ストリームに、テスト データセットの損失率と精度の値が表示されます。

    ターミナルの精度値

    トレーニングが完了すると、新たに生成されたモデルファイルの場所が出力されます。

    Trained model is stored in gs://${MNIST_BUCKET}/job_[TIMESTAMP]/export/Servo/[JOB_ID]/
  2. バケットパスの場所をコピーします。この情報は後の手順で使用します。

予測に使用するモデルを公開する

予測に使用する新しいモデルが正常に作成されました。より洗練されたモデルを学習するには、より複雑な TensorFlow コードが必要になりますが、コンピューティング リソースとストレージ リソースの構成は類似しています。

モデルの学習は全体のプロセスの半分にすぎません。アプリケーションにモデルを組み込んだり、認証用の API サービスをラッピングしたりする必要があります。また、最終的にはスケーリングを行う必要があります。実用的なモデルができるまでには、まだ多くのエンジニアリング作業が必要です。

AI Platform はこの作業の過程で役立ちます。AI Platform は、Google Cloud Platform 上で稼働するフルマネージド バージョンの TensorFlow を提供します。また、TensorFlow のすべての強力な機能に対応しているため、追加のインフラストラクチャの設定やソフトウェアのインストールは必要ありません。分散トレーニングを自動的にスケーリングして、CPU または GPU を必要なだけ使用できます。使用した分のみが課金対象になります。

AI Platform は TensorFlow をバックグラウンドで実行するため、すべての作業が移植可能であり、専用のツールの使用を求められることはありません。

AI Platform を使用して同じサンプルコードでモデルをトレーニングするには、Cloud Datalab での分散 TensorFlow の使用チュートリアルをご覧ください。

AI Platform にモデルをデプロイして予測を行うこともできます。AI Platform にモデルをデプロイするには、以下の手順を実施します。モデルをデプロイすると、Google が管理するサービスで期待できるすべてのセキュリティと信頼性の機能を利用しつつ、モデルを短時間で大量にテストして適用できます。

以下の手順では、前に start-training.sh というスクリプトで出力したモデルバケットのパスを使用します。

  1. 生成されたモデルを格納する Cloud Storage バケットのパスを確認します。パスの形式は次のとおりです。[JOB_ID] はジョブ ID です。このパスは、この次のステップで使用します。

    MODEL_BUCKET: gs://${MNIST_BUCKET}/job_[TIMESTAMP]/export/Servo/[JOB_ID]
  2. gcloud コマンドライン ツールでモデルの新しい v1 バージョンを定義し、バケット内のモデルファイルを指すようにします。次のコマンドは、完了するまで数分かかることがあります。[YOUR_BUCKET_PATH] は、前のステップで確認した出力パスに置き換えてください。パスは gs:// で始まります。

    MODEL="MNIST"
    MODEL_BUCKET=[YOUR_BUCKET_PATH]
    gcloud ml-engine models create ${MODEL} --regions us-east1
    gcloud ml-engine versions create \
     --origin=${MODEL_BUCKET} --model=${MODEL} v1
  3. モデルのデフォルト バージョンを v1 に設定します。

    gcloud ml-engine versions set-default --model=${MODEL} v1

これでモデルは AI Platform で実行されるようになり、予測の処理が可能になりました。次のセクションでは、Cloud Datalab で予測を行って可視化します。

Cloud Datalab で予測を行う

予測をテストするには、インタラクティブな Jupyter ノートブックを使用してコードを実行する Cloud Datalab インスタンスを作成します。

  1. Cloud Shell で次のコマンドを入力し、Cloud Datalab インスタンスを作成します。

    datalab create mnist-datalab
    
  2. Cloud Shell から [ウェブでプレビュー](右上の四角形のアイコン)をクリックして、Cloud Datalab ノートブックの一覧ページを開きます。

  3. [ポートを変更] をクリックしてポート 8081 を選択し、ブラウザで新しいタブを開きます。

  4. Cloud Datalab アプリケーションで、右上の [+ ノートブック] をクリックして新しいノートブックを作成します。

  5. 新しいノートブックの最初のセルに次のテキストを貼り付けます。

    %%bash
    wget https://raw.githubusercontent.com/GoogleCloudPlatform/cloudml-dist-mnist-example/master/notebooks/Online%20prediction%20example.ipynb
    cat Online\ prediction\ example.ipynb > Untitled\ Notebook.ipynb
  6. ページの先頭にある [Run] をクリックして、Online prediction example.ipynb ノートブックをダウンロードします。スクリプトにより、リモート ノートブックの内容が現在のノートブックにコピーされます。

  7. ブラウザページを再読み込みして、新しいノートブックの内容を読み込みます。JavaScript コードを含む最初のセルを選択し、[Run] をクリックしてコードを実行します。

  8. ページを下にスクロールして番号手書きパネルを表示し、カーソルで番号を手書きします。

    カーソルで描画した数字の 3

  9. 次のセルをクリックして有効にします。先頭の [Run] ボタンの横にある下矢印をクリックして、[Run from this Cell] を選択します。

    予測の出力は 10 個の要素から成る配列です。配列の各要素(インデックス 0~9)に、インデックスの番号に対応する数字が入ります。値が 1 に近いほど、入力した数字とインデックスが一致する可能性が高くなります。以下のリストで強調されている項目(インデックスは 3)は最も 1 に近いため、この数字に一致する可能性が最も高くなります。

    PROBABILITIES
    [4.181503356903704e-07,
    7.12400151314796e-07,
    0.00017898145597428083,
    0.9955494403839111,
    5.323939553103507e-11,
    0.004269002005457878,
    7.927398321116996e-11,
    1.2688398953741853e-07,
    1.0825967819982907e-06,
    2.2037748692582682e-07]

ノートブックの最後のセルには、数値の予測結果を表す棒グラフが表示されます(この場合は 3)。

棒グラフで数字 3 が選択されている

クリーンアップ

このチュートリアルで使用するリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

  1. モデルのバージョンを削除します。

    gcloud ml-engine versions delete v1 --model=MNIST
  2. モデルを削除します。

    gcloud ml-engine models delete MNIST
  3. Cloud Storage バケットを削除します。

    gsutil rm -r gs://${MNIST_BUCKET}
  4. Cloud Datalab を含む VM を削除します。

    gcloud compute instances delete master-0 worker-0 worker-1 ps-0 mnist-datalab
  5. VM テンプレート イメージを削除します。

    gcloud compute images delete template-image
  6. Cloud Datalab 永続ディスクを削除します。

    gcloud compute disks delete mnist-datalab-pd --zone us-east1-c

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...