TensorFlow Cloud是一種Python軟件包,提供的API可用于將本地環(huán)境中的TensorFlow代碼調(diào)試和訓練無縫轉移到Google Cloud中的分布式訓練。它將云端的模型訓練過程簡化為單一的簡單函數(shù)調(diào)用,只需要最少的設置,并且?guī)缀醪恍枰獙δP瓦M行任何更改。TensorFlow Cloud可以處理云端特定的任務,例如自動為您的模型創(chuàng)建VM實例和分布策略。本文演示了TensorFlow Cloud的常見用例和幾點最佳做法。
TensorFlow Cloud
https://github.com/tensorflow/cloud
我們將對stanford_dogs數(shù)據(jù)集提供的犬種圖像進行分類。為簡化此工作,我們將對基于ImageNet權重訓練的ResNet50使用遷移學習。您可以在TensorFlow Cloud代碼庫的此處找到本文中的代碼。
stanford_dogs
https://tensorflow.google.cn/datasets/catalog/stanford_dogs
此處
https://github.com/tensorflow/cloud/blob/master/src/python/tensorflow_cloud/core/tests/examples/call_run_within_script_with_keras_fit.py
設置
使用pip install tensorflow_cloud安裝TensorFlow Cloud。我們先添加必要的導入,為分類任務啟動Python腳本。
import datetime
import os
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
import tensorflow_cloud as tfc
import tensorflow_datasets as tfds
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Model
Google Cloud配置
TensorFlow Cloud使用后臺的AI Platform服務在Google Cloud上運行訓練作業(yè)(Training Job)。
AI Platform
https://cloud.google.com/ai-platform
Google Cloud
https://cloud.google.com/
如果您是GCP的新用戶,請按照本部分的設置步驟創(chuàng)建并配置第一個Google Cloud項目。如果您是Cloud的新用戶,首次設置和配置將需要一點學習和操作。好消息是,設置后不需要對TensorFlow代碼進行任何更改,可以直接在云端運行!
·創(chuàng)建GCP項目
·啟用AI Platform服務
·創(chuàng)建服務帳號
·下載授權密鑰
·創(chuàng)建Google Cloud Storage存儲分區(qū)
GCP項目
Google Cloud項目集合了許多云資源,例如用戶集、API集、結算、身份驗證和監(jiān)控。要創(chuàng)建項目,請遵循本指南。在終端上運行本部分中的命令。
export PROJECT_ID=<your-project-id>
gcloud config set project$PROJECT_ID
本指南
https://cloud.google.com/resource-manager/docs/creating-managing-projects
AI Platform服務
請在此下拉菜單中輸入您的項目ID,確保為您的GCP項目啟用AI Platform服務。
此
https://console.cloud.google.com/flows/enableapi?apiid=ml.googleapis.com,compute_component&_ga=2.195250852.968184668.1595960596-2024863071.1593638259&_gac=1.152369355.1595642474.Cj0KCQjwjer4BRCZARIsABK4QeUwdi5usz8wVZVqzlLM-jdvG6KF8zqhHPT1XQ0ga1M11bNkUO41VtsaAuc2EALw_wcB
服務帳號和密鑰
為您的新GCP項目創(chuàng)建一個服務帳號。服務帳號是應用或虛擬機實例使用的帳號,Cloud應用使用它來發(fā)起授權的API調(diào)用。
export SA_NAME=<your-sa-name&rt;
gcloud iam service-accounts create$SA_NAME
gcloud projects add-iam-policy-binding$PROJECT_ID
--member serviceAccount:$SA_NAME $PROJECT_ID.iam.gserviceaccount.com
--role'roles/editor'
服務帳號
https://cloud.google.com/iam/docs/creating-managing-service-accountsv
虛擬機實例
https://cloud.google.com/compute/docs/instances
接下來,我們需要服務帳號的身份驗證密鑰。此身份驗證密鑰用于確保只有被授權處理您的項目的人才能使用您的GCP資源。創(chuàng)建身份驗證密鑰,如下所示:
gcloud iam service-accounts keys create~/key.json--iam-account$SA_NAME $PROJECT_ID.iam.gserviceaccount.com
創(chuàng)建GOOGLE_APPLICATION_CREDENTIALS環(huán)境變量。
export GOOGLE_APPLICATION_CREDENTIALS=~/key.json
Cloud Storage存儲分區(qū)
如果您具有指定的存儲分區(qū),請輸入存儲分區(qū)名稱,如下所示?;蛘?,按照本指南創(chuàng)建Google Cloud Storage(GCS)存儲分區(qū)。TensorFlow Cloud使用Google Cloud Build來構建和發(fā)布Docker鏡像,以及存儲模型檢查點和訓練日志等輔助數(shù)據(jù)。
GCP_BUCKET="your-bucket-name"
本指南
https://cloud.google.com/storage/docs/creating-buckets
Google Cloud Build
https://cloud.google.com/cloud-build
Keras模型創(chuàng)建
TensorFlow Cloud的模型創(chuàng)建工作流與在本地構建和訓練TF Keras模型相同。
資源
我們首先加載stanford_dogs數(shù)據(jù)集,對犬種進行分類。此數(shù)據(jù)集作為tensorflow-datasets軟件包的一部分提供。如果數(shù)據(jù)集較大,建議將其托管在GCS上,以提高性能。
(ds_train,ds_test),metadata=tfds.load(
"stanford_dogs",
split=["train","test"],
shuffle_files=True,
with_info=True,
as_supervised=True,
)
NUM_CLASSES=metadata.features["label"].num_classes
tensorflow-datasets
https://tensorflow.google.cn/datasets/catalog/overview
我們來可視化數(shù)據(jù)集:
print("Number of training samples:%d"%tf.data.experimental.cardinality(ds_train))
print("Number of test samples:%d"%tf.data.experimental.cardinality(ds_test))
print("Number of classes:%d"%NUM_CLASSES)
訓練樣本數(shù):12000;測試樣本數(shù):8580;類數(shù):120
plt.figure(figsize=(10,10))
for i,(image,label)in enumerate(ds_train.take(9)):
ax=plt.subplot(3,3,i+1)
plt.imshow(image)
plt.title(int(label))
plt.axis("off")
預處理
我們將調(diào)整數(shù)據(jù)大小并進行批處理。
IMG_SIZE=224
BATCH_SIZE=64
BUFFER_SIZE=2
size=(IMG_SIZE,IMG_SIZE)
ds_train=ds_train.map(lambda image,label:(tf.image.resize(image,size),label))
ds_test=ds_test.map(lambda image,label:(tf.image.resize(image,size),label))
def input_preprocess(image,label):
image=tf.keras.applications.resnet50.preprocess_input(image)
return image,label
配置輸入流水線來提高性能
接下來,我們將配置輸入流水線來提高性能。請注意,我們使用并行調(diào)用和預提取,這樣當您的模型在訓練時I/O不會成為瓶頸。本指南詳細介紹了如何配置輸入流水線來提高性能。
ds_train=ds_train.map(
input_preprocess,num_parallel_calls=tf.data.experimental.AUTOTUNE
)
ds_train=ds_train.batch(batch_size=BATCH_SIZE,drop_remainder=True)
ds_train=ds_train.prefetch(tf.data.experimental.AUTOTUNE)
ds_test=ds_test.map(input_preprocess)
ds_test=ds_test.batch(batch_size=BATCH_SIZE,drop_remainder=True)
指南
https://tensorflow.google.cn/guide/data_performance
構建模型
我們將加載包含在ImageNet上訓練的權重的ResNet50,同時使用include_top=False來重構我們?nèi)蝿盏哪P汀?/span>
inputs=tf.keras.layers.Input(shape=(IMG_SIZE,IMG_SIZE,3))
base_model=tf.keras.applications.ResNet50(
weights="imagenet",include_top=False,input_tensor=inputs
)
x=tf.keras.layers.GlobalAveragePooling2D()(base_model.output)
x=tf.keras.layers.Dropout(0.5)(x)
outputs=tf.keras.layers.Dense(NUM_CLASSES)(x)
model=tf.keras.Model(inputs,outputs)
ImageNet
http://www.image-net.org/
ResNet50v
https://tensorflow.google.cn/api_docs/python/tf/keras/applications/ResNet50?version=nightly
我們將基本模型中的所有層凍結于其當前權重,這樣可以訓練我們添加的其他層。
base_model.trainable=False
只要存儲目標在您的Cloud Storage存儲分區(qū)內(nèi),Keras回調(diào)便可輕松用于TensorFlow Cloud。在本例中,我們在訓練的各個階段使用ModelCheckpoint回調(diào)來保存模型,使用Tensorboard回調(diào)來可視化模型及其進度,使用Early Stopping回調(diào)來自動確定訓練的最佳周期數(shù)。
MODEL_PATH="resnet-dogs"
checkpoint_path=os.path.join("gs://",GCP_BUCKET,MODEL_PATH,"save_at_{epoch}")
tensorboard_path=os.path.join(
"gs://",GCP_BUCKET,"logs",datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
)
callbacks=[
tf.keras.callbacks.ModelCheckpoint(checkpoint_path),
tf.keras.callbacks.TensorBoard(log_dir=tensorboard_path,histogram_freq=1),
tf.keras.callbacks.EarlyStopping(monitor="val_loss",patience=3),
]
ModelCheckpoint
https://tensorflow.google.cn/api_docs/python/tf/keras/callbacks/ModelCheckpoint
Tensorboard
https://tensorflow.google.cn/api_docs/python/tf/keras/callbacks/TensorBoard
Early Stopping
https://tensorflow.google.cn/api_docs/python/tf/keras/callbacks/EarlyStopping
編譯模型
optimizer=tf.keras.optimizers.Adam(learning_rate=1e-2)
model.compile(
optimizer=optimizer,
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=["accuracy"],
)
本地調(diào)試模型
我們會先在本地環(huán)境中訓練模型,確保代碼能正常運行后再將作業(yè)發(fā)送到GCP。我們將使用tfc.remote()確定代碼應該在本地執(zhí)行還是在云端執(zhí)行。選擇比完整訓練作業(yè)預定數(shù)量少的周期,不僅有助于驗證模型能否正常運行,還不會使本地計算機超載。
if tfc.remote():
epochs=500
train_data=ds_train
test_data=ds_test
else:
epochs=1
train_data=ds_train.take(5)
test_data=ds_test.take(5)
callbacks=None
model.fit(
train_data,epochs=epochs,callbacks=callbacks,validation_data=test_data,verbose=2
)
if tfc.remote():
SAVE_PATH=os.path.join("gs://",GCP_BUCKET,MODEL_PATH)
model.save(SAVE_PATH)
Google Cloud上的模型訓練
要在GCP上訓練,請使用GCP項目設置填充示例代碼,然后只需在代碼中調(diào)用tfc.run()。API很簡便,所有參數(shù)都有智能默認設置。此外,我們不需要擔心云端特定任務,例如使用TensorFlow Cloud時創(chuàng)建VM實例和分布策略。API將按順序執(zhí)行以下操作:
·準備好Python腳本/筆記本云和分布。
·將其轉換為包含必要依賴項的Docker鏡像。
·在GCP集群上運行訓練作業(yè)。
·流式傳輸相關日志并存儲檢查點。
run()API的使用非常靈活,例如可讓用戶指定自定義集群配置、自定義Docker鏡像。有關可用于調(diào)用run()的參數(shù)的完整列表,請參閱TensorFlow Cloud自述文件。
自述文件
https://github.com/tensorflow/cloud#usage-guide
使用您的模型所依賴的Python軟件包列表創(chuàng)建requirements.txt文件。默認情況下,TensorFlow Cloud會將TensorFlow及其依賴項作為默認Docker鏡像的一部分,因此無需包括它們。請在Python文件的同一目錄中創(chuàng)建requirements.txt。此示例的requirements.txt內(nèi)容為:
tensorflow-datasets
matplotlib
默認情況下,run API會根據(jù)您提供的集群配置將模型代碼封裝在TensorFlow分布策略中。在本示例中,我們使用單節(jié)點多GPU配置。因此,您的模型代碼會自動封裝在TensorFlow MirroredStrategy實例中。
調(diào)用run()以開始云端訓練。當您的作業(yè)提交后,系統(tǒng)會為您提供云作業(yè)的鏈接。要監(jiān)控訓練日志,請點擊該鏈接,并選擇“View logs”以查看訓練進度信息。
tfc.run(
requirements_txt="requirements.txt",
distribution_strategy="auto",
chief_config=tfc.MachineConfig(
cpu_cores=8,
memory=30,
accelerator_type=tfc.AcceleratorType.NVIDIA_TESLA_T4,
accelerator_count=2,
),
docker_image_bucket_name=GCP_BUCKET,
)
使用TensorBoard可視化模型
在這里,我們從GCS存儲分區(qū)加載Tensorboard日志來評估模型性能和歷史記錄。
tensorboard dev upload--logdir"gs://your-bucket-name/logs"--name"ResNet Dogs"
評估模型
在訓練后,我們可以加載存儲在GCS存儲分區(qū)中的模型,并評估其性能。
if tfc.remote():
model=tf.keras.models.load_model(SAVE_PATH)
model.evaluate(test_data)
后續(xù)步驟
本文介紹了TensorFlow Cloud,這是一個Python軟件包,可將多個GPU/TPU并入一個函數(shù),簡化云端的訓練過程,不需要對模型的代碼進行任何更改。您可以在這里找到本文中的完整代碼。下一步,您可以在TensorFlow Cloud代碼庫上查找此代碼示例及許多其他示例。
TensorFlow Cloud
https://github.com/tensorflow/cloud
這里
https://github.com/tensorflow/cloud/blob/master/src/python/tensorflow_cloud/core/tests/examples/call_run_within_script_with_keras_fit.py
TensorFlow Cloud代碼庫
https://github.com/tensorflow/cloud/tree/master/src/python/tensorflow_cloud/core/tests/examples