TensorFlowクラウド

TensorFlow.orgで表示 GoogleColabで実行 GitHubで表示ノートブックをダウンロードするKaggleのロゴKaggleで実行

TensorFlow Cloudは、GoogleCloudでKerasモデルのトレーニングとハイパーパラメーター調整を簡単に行えるようにするライブラリです。

TensorFlow Cloudのrun APIを使用すると、モデルコードをGoogle Cloudアカウントに直接送信し、ログインしてCloud UIを操作しなくても(コンソールでプロジェクトを設定した後)、GoogleCloudコンピューティングリソースを使用できます。

これは、Pythonノートブック(このようなノートブック)の内部から直接GoogleCloudコンピューティングリソースを使用できることを意味します。プレーンな.pyスクリプトからモデルを.py送信することもできます。

簡単な例

これは、 TensorFlowCloudGoogleCloudを使用してモデルをリモートでトレーニングする方法を示す簡単な紹介例です。

これを読んで、これがどのように機能するかを理解するか、GoogleColabでノートブックを実行することができます。ノートブックを実行するには、Google Cloudアカウントに接続し、クレデンシャルとプロジェクトIDを入力する必要があります。アカウントをまだお持ちでない場合、またはコンソールでプロジェクトを設定する方法がわからない場合は、 GoogleCloudアカウントの設定と接続をご覧ください。

必要なモジュールをインポートする

import tensorflow as tf
tf.version.VERSION
'2.6.0'
! pip install -q tensorflow-cloud
import tensorflow_cloud as tfc
print(tfc.__version__)
import sys

プロジェクト構成

プロジェクトパラメータを設定します。 GCP_PROJECT_IDまたはGCS_BUCKETどうあるべきかわからない場合は、「 GCS_BUCKETアカウントの設定と接続」を参照してください。

JOB_NAMEはオプションであり、任意の文字列に設定できます。大規模なプロジェクトの一部として(たとえば)複数のトレーニング実験を行う場合は、それぞれに一意のJOB_NAMEます。

# Set Google Cloud Specific parameters

# TODO: Please set GCP_PROJECT_ID to your own Google Cloud project ID.
GCP_PROJECT_ID = 'YOUR_PROJECT_ID'

# TODO: set GCS_BUCKET to your own Google Cloud Storage (GCS) bucket.
GCS_BUCKET = 'YOUR_GCS_BUCKET_NAME'

# DO NOT CHANGE: Currently only the 'us-central1' region is supported.
REGION = 'us-central1'

# OPTIONAL: You can change the job name to any string.
JOB_NAME = 'mnist'

# Setting location were training logs and checkpoints will be stored
GCS_BASE_PATH = f'gs://{GCS_BUCKET}/{JOB_NAME}'
TENSORBOARD_LOGS_DIR = os.path.join(GCS_BASE_PATH,"logs")
MODEL_CHECKPOINT_DIR = os.path.join(GCS_BASE_PATH,"checkpoints")
SAVED_MODEL_DIR = os.path.join(GCS_BASE_PATH,"saved_model")

GoogleCloudプロジェクトを使用するためのノートブックの認証

このコードはノートブックを認証し、有効なGoogleCloudのクレデンシャルとIDを確認します。これは、ノートブックでのみ実行され、ノートブックコードがGoogle Cloudに送信されるときに実行されないようにするために、 if not tfc.remote()ブロック内にあります。

# Using tfc.remote() to ensure this code only runs in notebook
if not tfc.remote():

    # Authentication for Kaggle Notebooks
    if "kaggle_secrets" in sys.modules:
        from kaggle_secrets import UserSecretsClient
        UserSecretsClient().set_gcloud_credentials(project=GCP_PROJECT_ID)

    # Authentication for Colab Notebooks
    if "google.colab" in sys.modules:
        from google.colab import auth
        auth.authenticate_user()
        os.environ["GOOGLE_CLOUD_PROJECT"] = GCP_PROJECT_ID

モデルとデータの設定

ここからは、MNISTデータセットで分類を実行するための単純なKerasモデルを設定するための基本的な手順に従います。

データのロードと分割

生データを読み取り、分割してデータセットをトレーニングおよびテストします。

(x_train, y_train), (_, _) = tf.keras.datasets.mnist.load_data()

x_train = x_train.reshape((60000, 28 * 28))
x_train = x_train.astype('float32') / 255

モデルを作成し、トレーニングの準備をします

単純なモデルを作成し、そのモデルに対していくつかのコールバックを設定します。

from tensorflow.keras import layers

model = tf.keras.Sequential([
  tf.keras.layers.Dense(512, activation='relu', input_shape=(28 * 28,)),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(loss='sparse_categorical_crossentropy',
              optimizer=tf.keras.optimizers.Adam(),
              metrics=['accuracy'])

クイック検証トレーニング

すべてが正しく設定されていることを確認するために、モデルを1つのエポックでトレーニングしif notそのトレーニングコマンドをtfc.remoteif notはラップして、ここで実行するランタイム環境でのみ発生するようにします。これを読んでいるのは、GoogleCloudに送信されたときではありません。

if not tfc.remote():
    # Run the training for 1 epoch and a small subset of the data to validate setup
    model.fit(x=x_train[:100], y=y_train[:100], validation_split=0.2, epochs=1)

リモートトレーニングの準備

以下のコードは、ノートブックコードがGoogle Cloudに送信されたときにのみ実行され、これを読んでいるランタイム内では実行されません。

まず、次のようなコールバックを設定します。

  • TensorBoardのログを作成します。
  • チェックポイントを作成し、上記で指定したチェックポイントディレクトリに保存します。
  • 損失が十分に改善されていない場合は、モデルのトレーニングを停止します。

次に、 model.fitmodel.saveを呼び出します。これらは(このコードがGoogle Cloudで実行されている場合)実際に完全なトレーニング(100エポック)を実行し、トレーニングされたモデルを上記で定義されたGCSバケットとディレクトリに保存します。

if tfc.remote():
    # Configure Tensorboard logs
    callbacks=[
        tf.keras.callbacks.TensorBoard(log_dir=TENSORBOARD_LOGS_DIR),
        tf.keras.callbacks.ModelCheckpoint(
            MODEL_CHECKPOINT_DIR,
            save_best_only=True),
        tf.keras.callbacks.EarlyStopping(
            monitor='loss',
            min_delta =0.001,
            patience=3)]

    model.fit(x=x_train, y=y_train, epochs=100,
              validation_split=0.2, callbacks=callbacks)

    model.save(SAVED_MODEL_DIR)

リモートトレーニングを開始します

TensorFlow Cloudは、ローカルの実行環境(このノートブック)からすべてのコードを取得してラップし、実行のためにGoogleCloudに送信します。 (そのため、 tfc.remoteラッパーが重要であるifif not ifあります。)

この手順では、このノートブックからコードをリモート実行用に準備してから、Google CloudPlatformでリモートトレーニングジョブを開始してモデルをトレーニングします。

まず、 tensorflow-cloud Pythonパッケージをrequirements.txtファイルに追加します。このファイルは、このノートブックのコードと一緒に送信されます。必要に応じて、ここに他のパッケージを追加できます。

次に、GPUとCPUイメージが指定されます。どちらか一方を指定するだけです。次のコードではGPUが使用されています。

最後に、TensorFlow雲の中心部:への呼び出しtfc.run 。これがこのノートブック内で実行されると、このノートブックのすべてのコードとこのディレクトリ内の残りのファイルがパッケージ化され、実行のためにGoogleCloudに送信されます。 runメソッドのパラメーターは、GPUCPUイメージの詳細を指定します。どちらか一方を指定するだけです。次のコードではGPUが使用されています。

最後に、TensorFlow雲の中心部:への呼び出しtfc.run 。これをこのノートブック内で実行すると、このノートブックのすべてのコードとこのディレクトリ内の残りのファイルがパッケージ化され、実行のためにGoogleCloudに送信されます。 runメソッドのパラメーターは、GPUの詳細を指定し、CPUイメージが指定されます。どちらか一方を指定するだけです。次のコードではGPUが使用されています。

最後に、TensorFlow雲の中心部:への呼び出しtfc.run 。これがこのノートブック内で実行されると、このノートブックのすべてのコードとこのディレクトリ内の残りのファイルがパッケージ化され、実行のためにGoogleCloudに送信されます。 runメソッドのパラメーターは、実行環境の詳細と、使用する配布戦略(存在する場合)を指定します。

ジョブが送信されたら、次のステップに進んでTensorboardを介してジョブの進行状況を監視できます。

# If you are using a custom image you can install modules via requirements
# txt file.
with open('requirements.txt','w') as f:
    f.write('tensorflow-cloud\n')

# Optional: Some recommended base images. If you provide none the system
# will choose one for you.
TF_GPU_IMAGE= "tensorflow/tensorflow:latest-gpu"
TF_CPU_IMAGE= "tensorflow/tensorflow:latest"

# Submit a single node training job using GPU.
tfc.run(
    distribution_strategy='auto',
    requirements_txt='requirements.txt',
    docker_config=tfc.DockerConfig(
        parent_image=TF_GPU_IMAGE,
        image_build_bucket=GCS_BUCKET
        ),
    chief_config=tfc.COMMON_MACHINE_CONFIGS['K80_1X'],
    job_labels={'job': JOB_NAME}
)

トレーニング結果

Colabインスタンスを再接続します

ほとんどのリモートトレーニングジョブは長時間実行されています。 Colabを使用している場合、トレーニング結果が利用可能になる前にタイムアウトになる可能性があります。

その場合は、トレーニング結果にアクセスするようにColabインスタンスを再接続して構成するため、次のセクションを再実行してください。

  1. 必要なモジュールをインポートする
  2. プロジェクト構成
  3. GoogleCloudプロジェクトを使用するためのノートブックの認証

残りのコードは再実行しないでください

テンソルボードをロード

トレーニングの進行中に、Tensorboardを使用して結果を表示できます。結果は、トレーニングが開始された後にのみ表示されることに注意してください。これには数分かかる場合があります。

%load_ext tensorboard
%tensorboard --logdir $TENSORBOARD_LOGS_DIR

トレーニング済みモデルをロードします

トレーニングが完了すると、上記で指定したGCSバケットからモデルを取得できます。

trained_model = tf.keras.models.load_model(SAVED_MODEL_DIR)
trained_model.summary()