TensorFlow Cloud是一種Python軟件包,提供的API可用于將本地環(huán)境中的TensorFlow代碼調(diào)試和訓(xùn)練無縫轉(zhuǎn)移到Google Cloud中的分布式訓(xùn)練。它將云端的模型訓(xùn)練過程簡化為單一的簡單函數(shù)調(diào)用,只需要最少的設(shè)置,并且?guī)缀醪恍枰獙?duì)模型進(jìn)行任何更改。TensorFlow Cloud可以處理云端特定的任務(wù),例如自動(dòng)為您的模型創(chuàng)建VM實(shí)例和分布策略。本文演示了TensorFlow Cloud的常見用例和幾點(diǎn)最佳做法。
TensorFlow Cloud
https://github.com/tensorflow/cloud
我們將對(duì)stanford_dogs數(shù)據(jù)集提供的犬種圖像進(jìn)行分類。為簡化此工作,我們將對(duì)基于ImageNet權(quán)重訓(xùn)練的ResNet50使用遷移學(xué)習(xí)。您可以在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
設(shè)置
使用pip install tensorflow_cloud安裝TensorFlow Cloud。我們先添加必要的導(dǎo)入,為分類任務(wù)啟動(dòng)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使用后臺(tái)的AI Platform服務(wù)在Google Cloud上運(yùn)行訓(xùn)練作業(yè)(Training Job)。
AI Platform
https://cloud.google.com/ai-platform
Google Cloud
https://cloud.google.com/
如果您是GCP的新用戶,請(qǐng)按照本部分的設(shè)置步驟創(chuàng)建并配置第一個(gè)Google Cloud項(xiàng)目。如果您是Cloud的新用戶,首次設(shè)置和配置將需要一點(diǎn)學(xué)習(xí)和操作。好消息是,設(shè)置后不需要對(duì)TensorFlow代碼進(jìn)行任何更改,可以直接在云端運(yùn)行!
·創(chuàng)建GCP項(xiàng)目
·啟用AI Platform服務(wù)
·創(chuàng)建服務(wù)帳號(hào)
·下載授權(quán)密鑰
·創(chuàng)建Google Cloud Storage存儲(chǔ)分區(qū)
GCP項(xiàng)目
Google Cloud項(xiàng)目集合了許多云資源,例如用戶集、API集、結(jié)算、身份驗(yàn)證和監(jiān)控。要?jiǎng)?chuàng)建項(xiàng)目,請(qǐng)遵循本指南。在終端上運(yùn)行本部分中的命令。
export PROJECT_ID=<your-project-id>
gcloud config set project$PROJECT_ID
本指南
https://cloud.google.com/resource-manager/docs/creating-managing-projects
AI Platform服務(wù)
請(qǐng)?jiān)诖讼吕藛沃休斎肽捻?xiàng)目ID,確保為您的GCP項(xiàng)目啟用AI Platform服務(wù)。
此
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
服務(wù)帳號(hào)和密鑰
為您的新GCP項(xiàng)目創(chuàng)建一個(gè)服務(wù)帳號(hào)。服務(wù)帳號(hào)是應(yīng)用或虛擬機(jī)實(shí)例使用的帳號(hào),Cloud應(yīng)用使用它來發(fā)起授權(quán)的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'
服務(wù)帳號(hào)
https://cloud.google.com/iam/docs/creating-managing-service-accountsv
虛擬機(jī)實(shí)例
https://cloud.google.com/compute/docs/instances
接下來,我們需要服務(wù)帳號(hào)的身份驗(yàn)證密鑰。此身份驗(yàn)證密鑰用于確保只有被授權(quán)處理您的項(xiàng)目的人才能使用您的GCP資源。創(chuàng)建身份驗(yàn)證密鑰,如下所示:
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存儲(chǔ)分區(qū)
如果您具有指定的存儲(chǔ)分區(qū),請(qǐng)輸入存儲(chǔ)分區(qū)名稱,如下所示。或者,按照本指南創(chuàng)建Google Cloud Storage(GCS)存儲(chǔ)分區(qū)。TensorFlow Cloud使用Google Cloud Build來構(gòu)建和發(fā)布Docker鏡像,以及存儲(chǔ)模型檢查點(diǎn)和訓(xùn)練日志等輔助數(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)建工作流與在本地構(gòu)建和訓(xùn)練TF Keras模型相同。
資源
我們首先加載stanford_dogs數(shù)據(jù)集,對(duì)犬種進(jìn)行分類。此數(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)
訓(xùn)練樣本數(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")
預(yù)處理
我們將調(diào)整數(shù)據(jù)大小并進(jìn)行批處理。
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
配置輸入流水線來提高性能
接下來,我們將配置輸入流水線來提高性能。請(qǐng)注意,我們使用并行調(diào)用和預(yù)提取,這樣當(dāng)您的模型在訓(xùn)練時(shí)I/O不會(huì)成為瓶頸。本指南詳細(xì)介紹了如何配置輸入流水線來提高性能。
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
構(gòu)建模型
我們將加載包含在ImageNet上訓(xùn)練的權(quán)重的ResNet50,同時(shí)使用include_top=False來重構(gòu)我們?nèi)蝿?wù)的模型。
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
我們將基本模型中的所有層凍結(jié)于其當(dāng)前權(quán)重,這樣可以訓(xùn)練我們添加的其他層。
base_model.trainable=False
只要存儲(chǔ)目標(biāo)在您的Cloud Storage存儲(chǔ)分區(qū)內(nèi),Keras回調(diào)便可輕松用于TensorFlow Cloud。在本例中,我們?cè)谟?xùn)練的各個(gè)階段使用ModelCheckpoint回調(diào)來保存模型,使用Tensorboard回調(diào)來可視化模型及其進(jìn)度,使用Early Stopping回調(diào)來自動(dòng)確定訓(xùn)練的最佳周期數(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ì)先在本地環(huán)境中訓(xùn)練模型,確保代碼能正常運(yùn)行后再將作業(yè)發(fā)送到GCP。我們將使用tfc.remote()確定代碼應(yīng)該在本地執(zhí)行還是在云端執(zhí)行。選擇比完整訓(xùn)練作業(yè)預(yù)定數(shù)量少的周期,不僅有助于驗(yàn)證模型能否正常運(yùn)行,還不會(huì)使本地計(jì)算機(jī)超載。
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上的模型訓(xùn)練
要在GCP上訓(xùn)練,請(qǐng)使用GCP項(xiàng)目設(shè)置填充示例代碼,然后只需在代碼中調(diào)用tfc.run()。API很簡便,所有參數(shù)都有智能默認(rèn)設(shè)置。此外,我們不需要擔(dān)心云端特定任務(wù),例如使用TensorFlow Cloud時(shí)創(chuàng)建VM實(shí)例和分布策略。API將按順序執(zhí)行以下操作:
·準(zhǔn)備好Python腳本/筆記本云和分布。
·將其轉(zhuǎn)換為包含必要依賴項(xiàng)的Docker鏡像。
·在GCP集群上運(yùn)行訓(xùn)練作業(yè)。
·流式傳輸相關(guān)日志并存儲(chǔ)檢查點(diǎn)。
run()API的使用非常靈活,例如可讓用戶指定自定義集群配置、自定義Docker鏡像。有關(guān)可用于調(diào)用run()的參數(shù)的完整列表,請(qǐng)參閱TensorFlow Cloud自述文件。
自述文件
https://github.com/tensorflow/cloud#usage-guide
使用您的模型所依賴的Python軟件包列表創(chuàng)建requirements.txt文件。默認(rèn)情況下,TensorFlow Cloud會(huì)將TensorFlow及其依賴項(xiàng)作為默認(rèn)Docker鏡像的一部分,因此無需包括它們。請(qǐng)?jiān)赑ython文件的同一目錄中創(chuàng)建requirements.txt。此示例的requirements.txt內(nèi)容為:
tensorflow-datasets
matplotlib
默認(rèn)情況下,run API會(huì)根據(jù)您提供的集群配置將模型代碼封裝在TensorFlow分布策略中。在本示例中,我們使用單節(jié)點(diǎn)多GPU配置。因此,您的模型代碼會(huì)自動(dòng)封裝在TensorFlow MirroredStrategy實(shí)例中。
調(diào)用run()以開始云端訓(xùn)練。當(dāng)您的作業(yè)提交后,系統(tǒng)會(huì)為您提供云作業(yè)的鏈接。要監(jiān)控訓(xùn)練日志,請(qǐng)點(diǎn)擊該鏈接,并選擇“View logs”以查看訓(xùn)練進(jìn)度信息。
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存儲(chǔ)分區(qū)加載Tensorboard日志來評(píng)估模型性能和歷史記錄。
tensorboard dev upload--logdir"gs://your-bucket-name/logs"--name"ResNet Dogs"
評(píng)估模型
在訓(xùn)練后,我們可以加載存儲(chǔ)在GCS存儲(chǔ)分區(qū)中的模型,并評(píng)估其性能。
if tfc.remote():
model=tf.keras.models.load_model(SAVE_PATH)
model.evaluate(test_data)
后續(xù)步驟
本文介紹了TensorFlow Cloud,這是一個(gè)Python軟件包,可將多個(gè)GPU/TPU并入一個(gè)函數(shù),簡化云端的訓(xùn)練過程,不需要對(duì)模型的代碼進(jìn)行任何更改。您可以在這里找到本文中的完整代碼。下一步,您可以在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