arrow_back

Vertex AI: ハイパーパラメータの調整

ログイン 参加
700 以上のラボとコースにアクセス

Vertex AI: ハイパーパラメータの調整

ラボ 2時間 30分 universal_currency_alt クレジット: 5 show_chart 上級
info このラボでは、学習をサポートする AI ツールが組み込まれている場合があります。
700 以上のラボとコースにアクセス

概要

このラボでは、Vertex AI を使用して TensorFlow モデル用のハイパーパラメータ調整ジョブを実行する方法を学びます。このラボではモデルコードに TensorFlow を使用しますが、これは別のフレームワークに簡単に置き換えることができます。

学習目標

  • Workbench インスタンス ノートブックを作成する
  • トレーニング アプリケーションのコードをハイパーパラメータのチューニング用に変更する
  • Vertex AI UI からハイパーパラメータ調整ジョブを起動する

Vertex AI の概要

このラボでは、Google Cloud で利用できる最新の AI プロダクトを使用します。Vertex AI は Google Cloud 全体の ML サービスを統合してシームレスな開発エクスペリエンスを提供します。以前は、AutoML でトレーニングしたモデルやカスタムモデルには、個別のサービスを介してアクセスする必要がありました。Vertex AI は、これらの個別のサービスを他の新しいプロダクトとともに 1 つの API へと結合します。既存のプロジェクトを Vertex AI に移行することもできます。ご意見やご質問がありましたら、サポートページからお寄せください。

Vertex AI には、エンドツーエンドの ML ワークフローをサポートするさまざまなプロダクトが含まれています。このラボでは、以下でハイライト表示されたプロダクト(トレーニング、ハイパーパラメータ調整、Notebooks)を取り上げます。

Vertex AI のワークフローとプロダクトの図

Vertex AI には、Workbench と Colab Enterprise の 2 つのノートブック ソリューションがあります。

Colab

Workbench

Vertex AI Workbench は、制御性とカスタマイズ性が重視されるプロジェクトに適した選択肢です。依存関係が複雑な、複数のファイルにわたる複雑なプロジェクトに特に適しています。また、ワークステーションやノートパソコンからクラウドへの移行を行っているデータ サイエンティストにも適した選択肢です。

Vertex AI Workbench のインスタンスには、ディープ ラーニング パッケージのスイート(TensorFlow と PyTorch のフレームワークのサポートを含む)がプリインストールされています。

workbench1

設定と要件

各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。

  1. Qwiklabs にシークレット ウィンドウでログインします。

  2. ラボのアクセス時間(例: 1:15:00)に注意し、時間内に完了できるようにしてください。
    一時停止機能はありません。必要な場合はやり直せますが、最初からになります。

  3. 準備ができたら、[ラボを開始] をクリックします。

  4. ラボの認証情報(ユーザー名パスワード)をメモしておきます。この情報は、Google Cloud Console にログインする際に使用します。

  5. [Google Console を開く] をクリックします。

  6. [別のアカウントを使用] をクリックし、このラボの認証情報をコピーしてプロンプトに貼り付けます。
    他の認証情報を使用すると、エラーが発生したり、料金の請求が発生したりします。

  7. 利用規約に同意し、再設定用のリソースページをスキップします。

Compute Engine API を有効にする

  1. Cloud コンソールで [ナビゲーション メニュー] > [API とサービス] > [ライブラリ] をクリックします。

  2. [Compute Engine API] を探し、まだ有効になっていない場合は [有効にする] をクリックします。これはノートブック インスタンスを作成するために必要です。

Container Registry API を有効にする

  1. Cloud コンソールで [ナビゲーション メニュー] > [API とサービス] > [ライブラリ] をクリックします。

  2. [Google Container Registry API] を探し、まだ有効になっていない場合は [有効にする] を選択します。これは、カスタム トレーニング ジョブのコンテナを作成するために使用します。

タスク 1. Vertex AI Workbench のインスタンスを起動する

  1. Google Cloud コンソールのナビゲーション メニューナビゲーション メニュー)で [Vertex AI] を選択します。

  2. [すべての推奨 API を有効化] をクリックします。

  3. ナビゲーション メニューで [ワークベンチ] をクリックします。

    [ワークベンチ] ページの上部で、[インスタンス] ビューになっていることを確認します。

  4. [ボックスを追加する新規作成] をクリックします。

  5. インスタンスの構成:

    • 名前: lab-workbench
    • リージョン: リージョンを に設定します
    • ゾーン: ゾーンを に設定します
    • 詳細オプション(任意): 必要に応じて [詳細オプション] をクリックして、より詳細なカスタマイズを行います(マシンタイプ、ディスクサイズなど)。

Vertex AI Workbench インスタンスを作成する

  1. [作成] をクリックします。

インスタンスが作成されるまで数分かかります。作成が完了するとインスタンスの名前の横に緑色のチェックマークが付きます。

  1. インスタンスの名前の横に表示されている [JupyterLab を開く] をクリックして JupyterLab インターフェースを起動します。ブラウザで新しいタブが開きます。

デプロイされた Workbench インスタンス

注: このラボでトレーニングやチューニングを行うモデルは、TensorFlow データセットにある馬と人間のデータセットによってトレーニングされた画像分類モデルです。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Vertex AI Workbench のインスタンスを起動する

タスク 2. トレーニング アプリケーション コードをコンテナ化する

このハイパーパラメータ調整ジョブを Vertex に送信するには、トレーニング アプリケーションのコードを Docker コンテナに配置してこのコンテナを Google Container Registry に push します。この方法により、任意のフレームワークで構築されたモデルのハイパーパラメータを調整できます。

  1. JupyterLab の [ランチャー] メニューから、[ターミナル] ウィンドウをノートブック インスタンス内で開きます。

ターミナル ウィンドウを開く

  1. horses_or_humans という新しいディレクトリを作成し、このディレクトリに移動します。
mkdir horses_or_humans cd horses_or_humans

Dockerfile を作成する

コードをコンテナ化する最初のステップは、Dockerfile の作成です。Dockerfile には、イメージの実行に必要なすべてのコマンドを含めます。このファイルにより、CloudML Hypertune ライブラリなど、必要なライブラリがすべてインストールされ、トレーニング コードのエントリ ポイントが設定されます。

  1. ターミナルで、空の Dockerfile を作成します。
touch Dockerfile
  1. 左側のメニューでこの Dockerfile を開き、以下の内容をコピーして貼り付けます。
FROM gcr.io/deeplearning-platform-release/tf2-gpu.2-9 WORKDIR / # Hypertune ライブラリをインストール RUN pip install cloudml-hypertune # トレーナー コードを Docker イメージにコピー COPY trainer /trainer # トレーナーを呼び出すエントリ ポイントを設定 ENTRYPOINT ["python", "-m", "trainer.task"]
  1. Ctrl+S キーを押してファイルを保存します。

この Dockerfile は Deep Learning Container TensorFlow Enterprise 2.9 GPU Docker イメージを使用します。Google Cloud の Deep Learning Containers には、ML およびデータ サイエンスの一般的なフレームワークが数多くプリインストールされています。

該当するイメージのダウンロード後、この Dockerfile はトレーニング コードのエントリポイントを設定します。これらのファイルはまだ作成していません。次のステップで、モデルのトレーニングおよび調整用のコードを追加します。

モデルのトレーニング コードを追加する

  1. ターミナルで、次のように実行してトレーニング コード用のディレクトリと、コードを追加する Python ファイルを作成します。
mkdir trainer touch trainer/task.py

この時点で、horses_or_humans/ ディレクトリ内は次のようになっているはずです。

+ Dockerfile + trainer/ + task.py
  1. 次に、先ほど作成した task.py ファイルを開き、以下のコードをコピーして貼り付けます。
import tensorflow as tf import tensorflow_datasets as tfds import argparse import hypertune NUM_EPOCHS = 10 def get_args(): '''引数を解析する。調整するすべてのパラメータを含める必要がある'''parser = argparse.ArgumentParser() parser.add_argument( '--learning_rate', required=True, type=float, help='learning rate') parser.add_argument( '--momentum', required=True, type=float, help='SGD momentum value') parser.add_argument( '--num_neurons', required=True, type=int, help='number of units in last hidden layer') args = parser.parse_args() return args def preprocess_data(image, label): '''イメージのサイズ変更とスケーリングを行う''' image = tf.image.resize(image, (150,150)) return tf.cast(image, tf.float32) / 255., label def create_dataset(): '''馬と人間のデータセットを読み込んでデータの前処理を行う''' data, info = tfds.load(name='horses_or_humans', as_supervised=True, with_info=True) # トレーニング用データセットを作成 train_data = data['train'].map(preprocess_data) train_data = train_data.shuffle(1000) train_data = train_data.batch(64) # 検証用データセットを作成 validation_data = data['test'].map(preprocess_data) validation_data = validation_data.batch(64) return train_data, validation_data def create_model(num_neurons, learning_rate, momentum): '''モデルを定義してコンパイルする''' inputs = tf.keras.Input(shape=(150, 150, 3)) x = tf.keras.layers.Conv2D(16, (3, 3), activation='relu')(inputs) x = tf.keras.layers.MaxPooling2D((2, 2))(x) x = tf.keras.layers.Conv2D(32, (3, 3), activation='relu')(x) x = tf.keras.layers.MaxPooling2D((2, 2))(x) x = tf.keras.layers.Conv2D(64, (3, 3), activation='relu')(x) x = tf.keras.layers.MaxPooling2D((2, 2))(x) x = tf.keras.layers.Flatten()(x) x = tf.keras.layers.Dense(num_neurons, activation='relu')(x) outputs = tf.keras.layers.Dense(1, activation='sigmoid')(x) model = tf.keras.Model(inputs, outputs) model.compile( loss='binary_crossentropy', optimizer=tf.keras.optimizers.SGD(learning_rate=learning_rate, momentum=momentum), metrics=['accuracy']) return model def main(): args = get_args() train_data, validation_data = create_dataset() model = create_model(args.num_neurons, args.learning_rate, args.momentum) history = model.fit(train_data, epochs=NUM_EPOCHS, validation_data=validation_data) # DEFINE METRIC hp_metric = history.history['val_accuracy'][-1] hpt = hypertune.HyperTune() hpt.report_hyperparameter_tuning_metric( hyperparameter_metric_tag='accuracy', metric_value=hp_metric, global_step=NUM_EPOCHS) if __name__ == "__main__": main()
  1. Ctrl+S キーを押してファイルを保存します。

コンテナをビルドする前に、コードを詳しく見ておきましょう。ハイパーパラメータ調整サービスを使用するための専用コンポーネントがいくつかあります。

  • スクリプトは hypertune ライブラリをインポートします。ステップ 1 の Dockerfile には、このライブラリの pip install を行う手順が含まれていました。

  • 関数 get_args() は、調整したい各ハイパーパラメータのコマンドライン引数を定義します。この例で調整するハイパーパラメータは、学習率、オプティマイザーのモメンタム値、モデルの最終隠れ層のニューロン数ですが、その他のパラメータの調整も自由に試してください。これらの引数に渡された値はその後、コード内で対応するハイパーパラメータを設定するために使用されます。

  • main() 関数の最後で、hypertune ライブラリは最適化したい指標を定義するために使用されています。TensorFlow では、keras model.fit メソッドは History オブジェクトを返します。History.history 属性は、連続したエポックにおけるトレーニングの損失値と指標値の記録です。検証データを model.fit に渡した場合、History.history 属性には検証損失値と指標値も含まれます。 たとえば、検証データを用いて 3 回のエポックでモデルをトレーニングし、指標として accuracy を提供した場合、History.history 属性は以下の辞書のようになります。

{ "accuracy": [ 0.7795261740684509, 0.9471358060836792, 0.9870933294296265 ], "loss": [ 0.6340447664260864, 0.16712145507335663, 0.04546636343002319 ], "val_accuracy": [ 0.3795261740684509, 0.4471358060836792, 0.4870933294296265 ], "val_loss": [ 2.044623374938965, 4.100203514099121, 3.0728273391723633 ]

ハイパーパラメータ調整サービスでモデルの検証精度を最大化する値を見つけたい場合は、その指標を val_accuracy リストの最後のエントリ(またはNUM_EPOCS - 1)として定義します。その後、この指標を HyperTune のインスタンスに渡します。hyperparameter_metric_tag には任意の文字列を選択できますが、ハイパーパラメータ チューニング ジョブを開始する際には、その文字列を再び使用する必要があります。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Dockerfile を作成し、モデルのトレーニング コードを追加する

コンテナをビルドする

  1. ターミナルで以下のように実行して、プロジェクトの環境変数を定義します。その際、your-cloud-project の部分は使用しているプロジェクト ID で置き換えてください。
注: プロジェクト ID を取得するには、ターミナルで gcloud config list --format 'value(core.project)' を実行します。 PROJECT_ID='your-cloud-project'
  1. Google Container Registry 内のコンテナ イメージの URI を示す変数を定義します。
IMAGE_URI="gcr.io/$PROJECT_ID/horse-human:hypertune"
  1. 続いて、horses_or_humans ディレクトリのルートで次のように実行してコンテナをビルドします。
docker build ./ -t $IMAGE_URI
  1. 最後に、これを Google Container Registry に push します。
docker push $IMAGE_URI

コンテナを Container Registry に push したら、カスタムモデルのハイパーパラメータ チューニング ジョブをいつでも開始できます。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 コンテナをビルドする

タスク 3. Vertex AI でハイパーパラメータ調整ジョブを実行する

このラボでは、Google Container Registry のカスタム コンテナによるカスタム トレーニングを使用します。ハイパーパラメータ調整ジョブは、ビルド済みコンテナを使って実行することもできます。

  • クラウド コンソールで、Vertex AI の [トレーニング] セクションに移動します。
  • Vertex AI API について、[有効にする] を選択し、[閉じる] をクリックします。

トレーニング ジョブを構成

  1. [新しいモデルのトレーニング] をクリックして、ハイパーパラメータ チューニング ジョブのパラメータを入力します。

    • [データセット] で [マネージド データセットなし] を選択します。
    • トレーニング方法として [カスタム トレーニング(上級者向け)] を選択し、[続行] をクリックします。
    • [モデル名] には「horses-humans-hyptertune」(または任意のモデル名)を入力します。
    • [続行] をクリックします。
  2. [トレーニング コンテナ] のステップで、[カスタム コンテナ] を選択します。

    • [カスタム コンテナ設定] で、[コンテナ イメージ] に前のセクションにあった IMAGE_URI の値を入力します。gcr.io/<your-cloud-project>/horse-human:hypertune(<your-cloud-project> は使用しているプロジェクト名で置き換える)のようになります。その他のフィールドは空白のままにして、[続行] をクリックします。

ハイパーパラメータ調整ジョブを構成する

  • [Enable hyperparameter tuning] を選択します。

ハイパーパラメータを構成する

次に、トレーニング アプリケーションのコードで、コマンドライン引数として設定するハイパーパラメータを追加する必要があります。ハイパーパラメータを追加するには、まずその名前を指定する必要があります。この名前は argparse に渡した引数名と一致している必要があります。

  1. パラメータ名learning_rate を入力します。

  2. [] には [Double] を選択します。

  3. [Min] には「0.01」を、[Max] には「1」を入力します。

  4. [スケーリング] で [Log] を選択します。

  5. [完了] をクリックします。

  6. learning_rate ハイパーパラメータを追加したら、momentum および num_neurons の各パラメータを追加します。

  • momentum の場合:

    • [ハイパーパラメータの追加] をクリックします。
    • [パラメータ名] に「momentum」と入力します。
    • [] には [Double] を選択します。
    • [Min] には「0」を、[Max] には「1」を入力します。
    • [スケーリング] で [線形] を選択します。
    • [完了] をクリックします。
  • num_neurons の場合:

    • [ハイパーパラメータの追加] をクリックします。
    • [パラメータ名] に「num_neurons」と入力します。
    • [] として [Discrete] を選択します。
    • [] に「64,128,512」と入力します。
    • [スケーリング] で [スケーリングなし] を選択します。
    • [完了] をクリックします。

指標を構成する

ハイパーパラメータを追加した後、最適化する指標と目標を指定します。この指標は、トレーニング アプリケーションで設定した hyperparameter_metric_tag と同じものにしてください。

  1. [最適化する指標] の [精度] を入力します。
  2. [目標] として [最大化] を選択します。

Vertex AI ハイパーパラメータ調整サービスは、これまでの手順で構成した値を用いてトレーニング アプリケーションのトライアルを複数回にわたって実行します。サービスが実行するトライアルの数に上限を設ける必要があります。

トライアルの回数を増やすと通常は結果が改善されますが、収穫逓減のポイントがあり、それ以降はトライアルの回数を増やしても最適化しようとしている指標にほとんど影響がなくなります。少ないトライアル回数から始めて、選択したハイパーパラメータの影響力を把握してから、十分なトライアル回数までスケールアップするのがベスト プラクティスです。

並列トライアルの数に上限を設定する必要もあります。並列トライアルの回数を増やすと、ハイパーパラメータ調整ジョブの実行時間が短縮されますが、ジョブ全体の効果が低下する可能性がありますこれは、デフォルトの調整戦略では、過去のトライアルの結果を後続のトライアルでの値の割り当てに使用するためです。あまりに多くのトライアルを並列に実行した場合、まだ実行中のトライアルの結果を活用できないまま開始されるトライアルが出てきます。

  1. デモを目的とする場合は、[最大試行数] を 15 に、[並列試行の最大数] を 3 に設定するとよいでしょう。さまざまな数値を試すことができますが、そうすると調整にかかる時間が長くなり、費用がかさみます。

  2. [アルゴリズム] では [デフォルト] を選択します。この設定では、Google Vizier を使用してハイパーパラメータ調整のベイズ最適化が実行されます。このアルゴリズムの詳細については、ベイズ最適化を使用した Cloud Machine Learning Engine のハイパーパラメータ調整について解説したこちらのブログ記事をご覧ください。

  3. [続行] をクリックします。

コンピューティングを構成する

[コンピューティングと料金] ページで選択されているリージョンはそのままにしておき、[コンピューティング設定] で [新しいワーカープールにデプロイ] を選択します。

次のようにワーカープール 0 を構成します。

  1. [マシンタイプ] で [標準] > [n1-standard-4] を選択します。
  2. [ディスクタイプ] で [SSD] を選択します。
  3. [ディスクサイズ(GB)] に「100」と入力します。
  4. ハイパーパラメータ調整ジョブを開始するには、[トレーニングの開始] をクリックします。コンソールの [トレーニング] セクションにある [ハイパーパラメータ調整ジョブ] タブに次のように表示されます。

ハイパーパラメータ調整ジョブを表示する [トレーニング] ページ

注: このハイパーパラメータ調整ジョブが完了するまでに 55~60 分ほどかかります。

終了すると、ジョブ名をクリックして調整のトライアル結果を見ることができます。

ハイパーパラメータの出力

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Vertex AI でハイパーパラメータ チューニング ジョブを実行する

タスク 4. クリーンアップ

  1. このラボで作成したノートブックを引き続き使用する場合は、未使用時にオフにすることをおすすめします。Cloud コンソールの Notebooks UI で、ノートブックを選択して [停止] をクリックします。

    ノートブックを完全に削除する場合は、右上にある [削除] ボタンをクリックします。

  2. Storage バケットを削除するには、ナビゲーション メニューの [Cloud Storage]、該当するバケットの順に選択し、[削除] をクリックします。

お疲れさまでした

Vertex AI を使って次のことを行う方法を学びました。

カスタム コンテナに用意されているトレーニング コード用のハイパーパラメータ調整ジョブの起動: ここでは例として TensorFlow モデルを使用しましたが、カスタム コンテナまたは組み込みコンテナを使って任意のフレームワークで構築されたモデルをトレーニングすることもできます。 Vertex AI のさまざまな部分の詳細については、Vertex AI のドキュメントをご覧ください。

ラボを終了する

ラボでの学習が完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Qwiklabs から削除され、アカウントの情報も消去されます。

ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。

星の数は、それぞれ次の評価を表します。

  • 星 1 つ = 非常に不満
  • 星 2 つ = 不満
  • 星 3 つ = どちらともいえない
  • 星 4 つ = 満足
  • 星 5 つ = 非常に満足

フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。

フィードバック、ご提案、修正が必要な箇所については、[サポート] タブからお知らせください。

Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。

始める前に

  1. ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
  2. ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
  3. 画面左上の [ラボを開始] をクリックして開始します

シークレット ブラウジングを使用する

  1. ラボで使用するユーザー名パスワードをコピーします
  2. プライベート モードで [コンソールを開く] をクリックします

コンソールにログインする

    ラボの認証情報を使用して
  1. ログインします。他の認証情報を使用すると、エラーが発生したり、料金が発生したりする可能性があります。
  2. 利用規約に同意し、再設定用のリソースページをスキップします
  3. ラボを終了する場合や最初からやり直す場合を除き、[ラボを終了] はクリックしないでください。クリックすると、作業内容がクリアされ、プロジェクトが削除されます

このコンテンツは現在ご利用いただけません

利用可能になりましたら、メールでお知らせいたします

ありがとうございます。

利用可能になりましたら、メールでご連絡いたします

1 回に 1 つのラボ

既存のラボをすべて終了して、このラボを開始することを確認してください

シークレット ブラウジングを使用してラボを実行する

このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウントの競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。