Google Cloud實(shí)操!TensorFlow Cloud 助力模型訓(xùn)練無縫 “上云”

來源: TensorFlow
作者:TensorFlow
時(shí)間:2021-01-10
16901
本文演示了TensorFlow Cloud的常見用例和幾點(diǎn)最佳做法。

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

wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1.jpg

我們將對(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")

wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1(1).jpg

預(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"

wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1(2).jpg

評(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

立即登錄,閱讀全文
版權(quán)說明:
本文內(nèi)容來自于TensorFlow,本站不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。文章內(nèi)容系作者個(gè)人觀點(diǎn),不代表快出海對(duì)觀點(diǎn)贊同或支持。如有侵權(quán),請(qǐng)聯(lián)系管理員(zzx@kchuhai.com)刪除!
優(yōu)質(zhì)服務(wù)商推薦
更多
掃碼登錄
打開掃一掃, 關(guān)注公眾號(hào)后即可登錄/注冊(cè)
加載中
二維碼已失效 請(qǐng)重試
刷新
賬號(hào)登錄/注冊(cè)
個(gè)人VIP
小程序
快出海小程序
公眾號(hào)
快出海公眾號(hào)
商務(wù)合作
商務(wù)合作
投稿采訪
投稿采訪
出海管家
出海管家