Compute Engine での分散 TensorFlow の実行

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

TensorFlow は、Google が機械学習用に提供しているオープンソース ライブラリで、Google の研究機関である Machine Intelligence 部門の研究者とエンジニアが開発しました。TensorFlow は、複数のコンピュータで稼働し、トレーニング ワークロードを分散するように設計されています。このチュートリアルでは、TensorFlow を複数の Compute Engine 仮想マシン インスタンスで実行してモデルをトレーニングします。Cloud Machine Learning Engine を代わりに使用することもできます。Cloud Machine Learning Engine はリソース割り当てタスクを自動的に行い、トレーニングされたモデルをホスティングすることができます。特別な理由がない限り、Cloud ML Engine を使用することを推奨します。詳細については、このチュートリアルの Cloud ML Engine と Cloud Datalab を使用するバージョンをご覧ください。

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

画像

このチュートリアルでは、このアーキテクチャを設定して使用する方法と概念について解説します。

目標

  • 仮想マシン(VM)のクラスタを作成して TensorFlow を実行するように Compute Engine を設定する。
  • 分散 TensorFlow のサンプルコードを Compute Engine クラスタで実行し、モデルを学習する方法について理解する。このサンプルコードでは、最新の TensorFlow ライブラリとパターンを使用しています。独自の学習用コードを作成するときに参考として使用できます。
  • 学習したモデルを Cloud ML Engine にデプロイして、予測用のカスタム API を作成し、Cloud Datalab ノートブックを使用して予測を実行する。

料金

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

始める前に

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

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

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

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

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

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

  4. Compute Engine と Cloud Machine Learning API(複数)を有効にする。

    Enable the APIs

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

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

  1. Cloud Shell に移動します。

    Cloud Shell を開く

  2. デフォルトの Compute Engine ゾーンとデフォルトのプロジェクトを設定します。

    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. Cloud Shell インスタンスで実行されている 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 コードを実行する

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

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]/

バケットパスの場所をコピーします。この情報は後の手順で使用します。

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

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

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

この作業の一部で Cloud ML Engine を利用します。Cloud ML Engine は、Cloud Platform で実行される TensorFlow のフルマネージド バージョンです。Cloud ML Engine を利用すると、追加のインフラストラクチャをセットアップしたり、ソフトウェアをインストールしたりすることなく、TensorFlow の機能を実行できます。数千の CPU または GPU を利用できるように、分散学習のスケーリングが自動的に行われます。また、利用分にのみ料金が発生します。

Cloud ML Engine はバックグラウンドで TensorFlow を実行するため、作業はすべてポータブルになります。専用のツールは必要ありません。

チュートリアル分散 TensorFlow と Cloud Datalab の使用では、Cloud ML Engine を使用するサンプルコードを実行して、モデルの学習を行うことができます。

予測に使用するモデルをホスティングするように Cloud ML Engine を設定することもできます。次の手順に沿って、Cloud ML Engine にモデルを公開します。モデルをホスティングすると、Google のマネージド サービスが提供するセキュリティと信頼性を維持しながらモデルを迅速にテストし、適応できます。

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

  1. 生成されたモデルを格納する Cloud Storage バケットのパスを確認します。次のフォーマットになります。[JOB_ID] はジョブ ID です。このパスは次のステップでも使用します。

    MODEL_BUCKET: gs://${MNIST_BUCKET}/job_[TIMESTAMP]/export/Servo/[JOB_ID]

  2. モデルの新しい v1 バージョンを定義します。gcloud コマンドライン ツールを使用して、バケット内のモデルファイルを指定します。次のコマンドは、完了までに数分かかる場合があります。[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

これで、モデルが Cloud ML で実行され、予測を処理できる状態になりました。次のセクションでは、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 アプリケーションで、右上にある [+Notebook] アイコンをクリックし、新しいノートブックを作成します。

  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. 予測の出力は 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 を含む仮想マシンを削除します。

    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

次のステップ

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

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