AI Platform Training を使用して TensorFlow、scikit-learn、XGBoost のトレーニング アプリケーションをクラウドで実行します。AI Platform Training は、これらのホスト型フレームワークをランタイム バージョンで使用して、機械学習モデルをトレーニングするために必要な依存関係を提供します。さらに、カスタム コンテナを使用して、他の機械学習フレームワークでトレーニング ジョブを実行することもできます。このページでは、AI Platform トレーニングの主なコンセプトについて説明します。今すぐトレーニング プロセスを開始したい場合は、トレーニング ジョブの開始をご覧ください。
トレーニングの仕組み
AI Platform Training は、クラウド内のコンピューティング リソース上でトレーニング ジョブを行います。トレーニング アプリケーションを作成しなくても、データセットに対して組み込みアルゴリズム(ベータ版)をトレーニングできます。組み込みアルゴリズムが実際のユースケースに適していない場合は、AI Platform Training 上で実行するトレーニング アプリケーションを作成できます。
トレーニング アプリケーションの使用手順の概要は次のとおりです。
- モデルをトレーニングする Python アプリケーションを作成します。このアプリケーションは、開発環境でローカルに実行するときと同じようにビルドします。
- トレーニングと検証のデータを取得して、AI Platform Training がアクセスできるソースを作成します。格納先は通常、Cloud Storage、Bigtable、または AI Platform Training で使用しているのと同じ Google Cloud プロジェクトに関連付けられている、別の Google Cloud ストレージ サービスです。
- アプリケーションを実行する準備ができたら、アプリケーションをパッケージングし、プロジェクトからアクセスできる Cloud Storage バケットに転送する必要があります。Google Cloud CLI を使用してトレーニング ジョブを実行する場合、これは自動的に行われます。
- AI Platform Training トレーニング サービスにより、ジョブのリソースが設定されます。さらに、ジョブの構成に基づいて 1 つ以上の仮想マシン(「トレーニング インスタンス」と呼ばれます)が割り当てられます。各トレーニング インスタンスは次のようにして設定されます。
- ジョブで使用される AI Platform Training のバージョンに応じた標準マシンイメージを適用する。
- アプリケーション パッケージを読み込み、
pip
を使用してインストールする。 - 依存関係として指定されたその他の追加パッケージをインストールする。
- トレーニング サービスでアプリケーションを実行します。このとき、トレーニング ジョブの作成時に指定したコマンドライン引数が渡されます。
- 実行中のジョブに関する情報を取得するには、次の方法があります。
- Cloud Logging を使用する。
- ジョブの詳細をリクエストするか、
gcloud
コマンドライン ツールを使用してログのストリーミングを実行する。 - トレーニング サービスへのステータス リクエストをプログラムで実行する。
- トレーニング ジョブが正常に終了するか、回復不能なエラーが発生すると、AI Platform Training はすべてのジョブプロセスを停止してリソースをクリーンアップします。
一般的な機械学習アプリケーション
AI Platform Training トレーニング サービスは、ユーザーが作成するアプリケーションにできる限り影響を与えないように設計されています。これは、モデルコードに専念できることを意味します。
ほとんどの機械学習アプリケーションでは、以下を行います。
- トレーニング データと評価データを取得する方法を提供する。
- データ インスタンスを処理する。
- 評価データを使用してモデルの精度(正しい値を予測する頻度)をテストする。
- (TensorFlow トレーニング アプリケーションの場合)プロセス中に一定間隔でチェックポイントを出力し、モデルの進行状況のスナップショットをとる方法を提供する。
- アプリケーションが終了したときにトレーニング済みモデルをエクスポートする方法を提供する。
分散トレーニング構造
AI Platform Training で分散 TensorFlow ジョブを実行する場合は、トレーニング クラスタで複数のマシン(ノード)を指定します。トレーニング サービスにより、指定したマシンタイプに応じてリソースが割り当てられます。特定のノード上で実行中のジョブは「レプリカ」と呼ばれます。分散 TensorFlow モデルに従って、トレーニング クラスタ内の各レプリカには分散トレーニングにおけるロールまたはタスクが 1 つ割り当てられます。
マスター: 1 つのレプリカのみが「マスター ワーカー」として指定されます。このタスクは他のレプリカを管理し、ジョブ全体のステータスを報告します。トレーニング サービスは、ジョブが成功するか回復不能なエラーが発生するまで続きます。分散トレーニングでは、マスター レプリカのステータスによって全体的なジョブ ステータスが示されます。
シングル プロセス ジョブを実行する場合は、その唯一のレプリカがジョブのマスターとなります。
ワーカー: 1 つ以上のレプリカが「ワーカー」として指定されます。これらのレプリカに担当させる作業は、ジョブ構成で指定します。
パラメータ サーバー: 1 つ以上のレプリカが「パラメータ サーバー」として指定されます。これらのレプリカは、ワーカー間で共有されるモデルの状態を調整します。
分散トレーニング戦略
複数のノードを持つモデルをトレーニングするための基本的な戦略は 3 つあります。
- 同期更新によるデータの並列トレーニング。
- 非同期更新によるデータの並列トレーニング。
- モデルの並行トレーニング。
モデル構造に関係なく、データの並列化戦略を使用できるため、カスタムモデルに分散型トレーニング メソッドを適用するのは良い出発点です。データ並列トレーニングでは、モデル全体がすべてのワーカーノードで共有されます。各ノードで、ミニバッチ処理と同様にトレーニング データセットの一部とは独立して勾配ベクトルを計算します。計算された勾配ベクトルはパラメータ サーバーノードに集められ、モデル パラメータは勾配ベクトルの総和で更新されます。10 個のワーカーノードに 10,000 個のバッチを分散すると、各ノードは約 1,000 個のバッチで動作します。
データの並列トレーニングは、同期更新または非同期更新のいずれかで行うことができます。非同期更新を使用する場合、パラメータ サーバーは次の図に示すように各勾配ベクトルをワーカーノードの 1 つから受信した直後に、個別に適用します。
データの並列分散トレーニングを行う方法については、TensorFlow の MultiWorkerMirroredStrategy
と ParameterServerStrategy
をお読みください。その後、AI Platform のトレーニングの分散トレーニングの構成方法を学習してください。
モデルの並行トレーニングの詳細については、Mesh TensorFlow をご覧ください。
アプリケーションのパッケージング
AI Platform でトレーニング アプリケーションを実行する前に、アプリケーションとその依存関係をパッケージ化する必要があります。次に、Google Cloud プロジェクトがアクセスできる Cloud Storage バケットにこのパッケージをアップロードする必要があります。
Google Cloud CLI を使用すると、このプロセスの大部分を自動化できます。たとえば、gcloud ai-platform jobs submit training
を使用すると、アプリケーション パッケージをアップロードしてトレーニング ジョブを送信できます。
トレーニング アプリケーションのパッケージングに関する詳細な手順をご覧ください。
トレーニング ジョブの送信
AI Platform Training は、モデル トレーニングを非同期(バッチ)サービスとして提供します。トレーニング ジョブを送信するには、コマンドラインから gcloud ai-platform jobs submit training
を実行するか、projects.jobs.create の API にリクエストを送信します。
トレーニング ジョブの開始に関する詳細な手順をご覧ください。
ジョブ ID
トレーニング ジョブの名前は次のルールに従う必要があります。
- Google Cloud プロジェクト内で一意にすること。
- 使用できるのは英大文字と小文字、数字、アンダースコアのみ。
- 先頭は文字にすること。
- 長さは 128 文字以下にすること。
ジョブ名の付け方は自由です。実行するジョブの数があまり多くない場合は、名前の付け方が重要になることはそれほどありません。多数のジョブを実行する場合は、後で長いリストからジョブ ID を見つける必要があるため、ジョブを区別しやすいようにジョブ ID を付けることをおすすめします。
一般的な方法は、同じモデルに関連付けられているすべてのジョブに同じ基本名を付けて、それに日付と時刻の文字列を付加する方法です。このような規則にすると、同じモデルのすべてのジョブがまとめて昇順で表示されるため、ジョブのリストを名前で簡単に並べ替えることができます。
スケール階層
AI Platform Training でトレーニング ジョブを実行する場合は、必要なマシン数とマシンタイプを指定する必要があります。このプロセスを簡単にするために、「スケール階層」と呼ばれるクラスタ仕様があらかじめいくつか定義されており、その中から選択できるようになっています。また、カスタム階層を選択して、マシンタイプを自分で指定することもできます。
スケール階層を指定するには、ジョブ構成の TrainingInput オブジェクトに追加します。トレーニング ジョブを送信するために gcloud
コマンドを使用する場合は、同じ識別子を使用できます。
スケール階層とマシンタイプの詳細な定義をご覧ください。
ハイパーパラメータ調整
ハイパーパラメータ調整を使用する場合は、トレーニング ジョブを作成するときに構成の詳細を含める必要があります。ハイパーパラメータ調整のコンセプト ガイドとハイパーパラメータ調整の使用方法をご覧ください。
リージョンとゾーン
Google Cloud では、ゾーンに分割されたリージョンを使用して、物理的なコンピューティング リソースの地理的なロケーションを定義します。AI Platform Training でトレーニング ジョブを実行するときに、どのリージョンで実行するかを指定します。
トレーニング データセットを Cloud Storage に保存する場合は、トレーニング データ用に使用している Cloud Storage バケットと同じリージョンでトレーニング ジョブを実行する必要があります。データバケットとは異なるリージョンでジョブを実行する必要がある場合は、ジョブの実行に時間がかかることがあります。
モデル トレーニングやオンライン / バッチ予測など、AI Platform Training サービスの利用可能なリージョンを確認するには、リージョン ガイドをお読みください。
job-dir を共通の出力ディレクトリとして使用
ジョブの出力ディレクトリを指定するには、ジョブの構成時にジョブ ディレクトリを設定します。ジョブを送信すると、AI Platform Training によって以下が実行されます。
- ジョブの実行前に問題を修正できるように、ディレクトリを検証する。
- ディレクトリ パスをコマンドライン引数
--job-dir
としてアプリケーションに渡す。
アプリケーションは、--job-dir
引数を考慮した設計にする必要があります。他のパラメータを解析するときにこの引数の値を取得し、アプリケーションの出力を保存するときに使用します。トレーニング ジョブの開始のガイドをご覧ください。
ランタイム バージョン
AI Platform Training のホスト型機械学習フレームワークでトレーニングするには、トレーニング ジョブに使用する AI Platform Training のランタイム バージョンを指定します。ランタイム バージョンを指定すると、割り当てられたトレーニング インスタンスにインストールされる TensorFlow、scikit-learn、XGBoost やその他の Python パッケージのバージョンが決まります。必要な機能を提供するバージョンを指定します。トレーニング ジョブをローカルとクラウドで実行する場合は、ローカルジョブとクラウドジョブで同じランタイム バージョンが使用されるようにしてください。
入力データ
トレーニング ジョブで使用するデータは、AI Platform Training で実行できるように次のルールに従う必要があります。
- 読み取り可能でトレーニング コードに渡せるデータ形式であること。
- コードからアクセスできる場所にあること。データの格納先には、Google Cloud ストレージやビッグデータ サービスを使用するのが一般的です。
出力データ
一般的に、アプリケーションでは、トレーニング中のチェックポイントやトレーニング完了時に保存されるモデルなどのデータが出力されます。必要であれば、他のデータをアプリケーションで出力することもできます。トレーニング ジョブと同じ Google Cloud プロジェクトの Cloud Storage バケットに出力ファイルを保存するのが最も簡単です。
VM の再起動に対して復元性のあるトレーニング ジョブの構築
Google Cloud VM は再起動されることがあります。こうした再起動があってもトレーニング ジョブを復元できるように、モデル チェックポイントを定期的に保存し、最新のチェックポイントから復元するようにジョブを構成します。
通常、モデル チェックポイントの保存先は、gcloud ai-platform jobs submit
training
コマンドの --job-dir
引数で指定した Cloud Storage パスです。
TensorFlow Estimator API がチェックポイント機能を実装します。モデルが Estimator にラップされている場合は、VM の再起動イベントについて心配する必要はありません。
TensorFlow Estimator にモデルをラップできない場合は、チェックポイントを保存して復元する機能をトレーニング コードに記述します。TensorFlow は、tf.train モジュールで次の有用なリソースを提供します。
GPU を使用するトレーニング
AI Platform Training でトレーニング ジョブを実行するときに、GPU(グラフィック プロセッシング ユニット)を使用できます。GPU は、大量の数学的演算を高速に実行するように設計されています。テンソルデータに対して実行する演算の種類によっては、CPU コアを持つマシンを追加するよりも GPU を使用するほうが効果的です。
AI Platform Training トレーニング サービスには、GPU を使用するための特別なインターフェースが用意されていません。GPU 対応のマシンを指定してジョブを実行すると、自動的に GPU が割り当てられます。たとえば、TensorFlow トレーニング ジョブでは、コード内の GPU に TensorFlow Ops を割り当てることができます。GPU にアクセス可能なマシンタイプを特定のタスクタイプ用に指定すると、そのタスクタイプに割り当てられた各インスタンスは同じように構成されます(これは通常の動作です)。コードの単一レプリカが各マシン上で実行されます。
カスタム コンテナを使用して別の機械学習フレームワークをトレーニングする場合、GPU の操作に別のインターフェースを提供することもできます。
モデルによっては、GPU で実行するメリットがないこともあります。GPU をおすすめするのは、大規模で複雑なモデルで多数の数学的演算を行う場合です。この場合も、GPU の効果があるかどうかをテストするために、少数のサンプルデータでトレーニングを実行してください。
トレーニング ジョブに GPU を使用する方法をご覧ください。
TPU を使用するトレーニング
AI Platform Training では、Cloud TPU を使用してトレーニング ジョブを実行できます。
トレーニング ジョブに TPU を使用する方法をご覧ください。