0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何利用Google Colab的云TPU加速Keras模型訓(xùn)練

zhKF_jqr_AI ? 來源:未知 ? 作者:李倩 ? 2018-11-16 09:10 ? 次閱讀

編者按:AI軟件開發(fā)者Chengwei Zhang介紹了如何利用Google Colab的云TPU加速Keras模型訓(xùn)練。

我以前都在單張GTX 1070顯卡(8.18 TFlops)上訓(xùn)練自己的模型,而且還挺滿足的。后來Google的Colab開放了免費(fèi)的Tesla K80顯卡(12GB 顯存,8.73 TFlops),最近又提供了免費(fèi)的TPU(180 TFlops)。這篇教程將簡要介紹如何將現(xiàn)有的Keras模型轉(zhuǎn)換為TPU模型,然后在Colab上訓(xùn)練。和在我的GTX1070上訓(xùn)練相比,免費(fèi)的TPU能夠加速20倍。

我們將創(chuàng)建一個(gè)容易理解但訓(xùn)練起來足夠復(fù)雜的Keras模型,讓TPU熱乎熱乎。訓(xùn)練一個(gè)LSTM模型,進(jìn)行IMDB情感分類任務(wù),可能是一個(gè)很不錯(cuò)的例子,因?yàn)橄啾让芗瘜雍途矸e層,訓(xùn)練LSTM對(duì)算力要求更高。

工作流概覽:

創(chuàng)建Keras模型,輸入采用固定的batch_size

轉(zhuǎn)換Keras模型為TPU模型

以batch_size * 8訓(xùn)練TPU模型,并保存權(quán)重至文件

創(chuàng)建一個(gè)結(jié)構(gòu)相同但輸入batch大小可變的Keras模型,用于推理

加載模型權(quán)重

基于推理模型進(jìn)行預(yù)測(cè)

在閱讀本文的同時(shí),你可以上手試驗(yàn)相應(yīng)的Colab Jupyter notebook:https://colab.research.google.com/drive/1QZf1WeX3EQqBLeFeT4utFKBqq-ogG1FN

閑話少敘,讓我們開始吧。

首先在Colab運(yùn)行時(shí)激活TPU:

固定輸入batch尺寸

大多數(shù)情況下,CPUGPU上對(duì)輸入形狀沒有限制,但XLA/TPU環(huán)境下強(qiáng)制使用固定的形狀和batch尺寸。

云TPU包含8個(gè)TPU核,每個(gè)核都作為獨(dú)立的處理單元運(yùn)作。如果沒有用上全部8個(gè)核心,那就沒有充分利用TPU。為了充分加速訓(xùn)練,相比在單GPU上訓(xùn)練的同樣的模型,我們可以選擇較大的batch尺寸。總batch尺寸定為1024(每個(gè)核心128)一般是一個(gè)不錯(cuò)的起點(diǎn)。

萬一你要訓(xùn)練一個(gè)較大的模型,batch尺寸太大了,那就慢慢降低batch尺寸,直到TPU的內(nèi)存放得下為止。只需確??俠atch尺寸是64的倍數(shù)(每核心的batch尺寸應(yīng)該是8的倍數(shù))。

值得一提的是,當(dāng)batch尺寸較大時(shí),一般來說增加優(yōu)化算法的學(xué)習(xí)率以更快收斂的做法是安全的。詳情參見Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour這篇論文( arXiv:1706.02677)。

Keras允許通過參數(shù)batch_size設(shè)定輸入層的batch尺寸。注意我們將模型定義為一個(gè)接受batch_size參數(shù)的函數(shù),這樣我們之后可以很方便地創(chuàng)建在CPU或GPU上運(yùn)行的模型,這些模型接受可變batch尺寸的輸入。

import tensorflow as tf

from tensorflow.python.keras.layers importInput, LSTM, Bidirectional, Dense, Embedding

def make_model(batch_size=None):

source = Input(shape=(maxlen,), batch_size=batch_size,

dtype=tf.int32, name='Input')

embedding = Embedding(input_dim=max_features,

output_dim=128, name='Embedding')(source)

lstm = LSTM(32, name='LSTM')(embedding)

predicted_var = Dense(1, activation='sigmoid', name='Output')(lstm)

model = tf.keras.Model(inputs=[source], outputs=[predicted_var])

model.compile(

optimizer=tf.train.RMSPropOptimizer(learning_rate=0.01),

loss='binary_crossentropy',

metrics=['acc'])

return model

training_model = make_model(batch_size=128)

另外,我們這里用了tf.train.Optimizer而不是標(biāo)準(zhǔn)的Keras優(yōu)化器,因?yàn)門PU對(duì)Keras優(yōu)化器的支持還處于實(shí)驗(yàn)階段。

轉(zhuǎn)換Keras模型至TPU模型

tf.contrib.tpu.keras_to_tpu_model函數(shù)可以轉(zhuǎn)換tf.keras模型至等價(jià)的TPU版本。

import os

import tensorflow as tf

TPU_WORKER = 'grpc://' + os.environ['COLAB_TPU_ADDR']

tf.logging.set_verbosity(tf.logging.INFO)

tpu_model = tf.contrib.tpu.keras_to_tpu_model(

training_model,

strategy=tf.contrib.tpu.TPUDistributionStrategy(

tf.contrib.cluster_resolver.TPUClusterResolver(TPU_WORKER)))

然后我們訓(xùn)練模型,保存權(quán)重,并評(píng)估模型。注意batch_size設(shè)定為模型輸入batch_size的8倍,因?yàn)檩斎霕颖驹?個(gè)TPU核心上均勻分布。

history = tpu_model.fit(x_train, y_train,

epochs=20,

batch_size=128 * 8,

validation_split=0.2)

tpu_model.save_weights('./tpu_model.h5', overwrite=True)

tpu_model.evaluate(x_test, y_test, batch_size=128 * 8)

我比較了單GTX1070顯卡(在我的Windows電腦上本地運(yùn)行)上和Colab的TPU上的訓(xùn)練速度,結(jié)果如下。

GPU和TPU的輸入batch尺寸均為128.

GPU:179秒每epoch。20個(gè)epoch后達(dá)到了76.9%的驗(yàn)證精確度,共計(jì)3600秒。

TPU:5秒每epoch,第一個(gè)epoch除外(49秒)。20個(gè)epoch后達(dá)到了95.2%的驗(yàn)證精確度,共計(jì)150秒。

20個(gè)epoch后TPU的驗(yàn)證精確度高于在GPU上的表現(xiàn),可能是因?yàn)門PU上同時(shí)訓(xùn)練8個(gè)batch的樣本(每個(gè)batch大小為128)。

譯者注:在Tesla K80上訓(xùn)練20個(gè)epoch后的驗(yàn)證精確度為86.3%(耗時(shí)6004秒)。使用TPU單核心訓(xùn)練(tf.contrib.tpu.TPUDistributionStrategy函數(shù)加上using_single_core=True參數(shù))20個(gè)epoch后達(dá)到了99.8%的驗(yàn)證精確度。將模型的batch尺寸改為16(128/8)后,TPU上訓(xùn)練20個(gè)epoch后達(dá)到了99.8%的驗(yàn)證精確度(因?yàn)閎atch尺寸改變,訓(xùn)練時(shí)間延長了,約377秒)。這樣看起來TensorFlow在TPU上的實(shí)現(xiàn)可能有些問題。

在CPU上推理

得到模型權(quán)重后,我們可以像平時(shí)一樣加載權(quán)重,然后在其他設(shè)備(比如CPU或GPU)上做出預(yù)測(cè)。我們同時(shí)想要推理模型接受可變的輸入batch尺寸,如前所述,只需給make_model()函數(shù)指定一個(gè)參數(shù)即可。

inferencing_model = make_model(batch_size=None)

inferencing_model.load_weights('./tpu_model.h5')

inferencing_model.summary()

summary()方法的輸出表明推理模型現(xiàn)在可以接受可變輸入樣本數(shù)目:

_________________________________________________________________

Layer (type) OutputShapeParam#

=================================================================

Input (InputLayer) (None, 500) 0

_________________________________________________________________

Embedding (Embedding) (None, 500, 128) 1280000

_________________________________________________________________

LSTM (LSTM) (None, 32) 20608

_________________________________________________________________

Output (Dense) (None, 1) 33

=================================================================

接下來我們就可以在推理模型上調(diào)用標(biāo)準(zhǔn)的fit()、evaluate()函數(shù)。

inferencing_model.evaluate(x_test, y_test)

我們的模型在測(cè)試集上的精確度為82.4%

25000/25000 [==============================] - 83s3ms/step

[0.6060782189846039, 0.824]

譯者注:相比測(cè)試損失和測(cè)試精確度,驗(yàn)證損失和驗(yàn)證精確度太高了。其他兩個(gè)在TPU上訓(xùn)練的模型(單核訓(xùn)練和不同batch大?。┮渤霈F(xiàn)了類似的現(xiàn)象,進(jìn)一步加大了TensorFlow在TPU上的實(shí)現(xiàn)有問題的嫌疑。

最后,你可以下載模型權(quán)重到本地,以便以后在其他地方使用。

from google.colab import files

files.download('./tpu_model.h5')

結(jié)語和進(jìn)一步閱讀

這篇教程簡要介紹了如何利用Google Colab的免費(fèi)云TPU資源,加速Keras模型的訓(xùn)練。

云TPU文檔:https://cloud.google.com/tpu/docs/

云TPU性能指南:https://cloud.google.com/tpu/docs/performance-guide

云TPU排錯(cuò)指南:https://cloud.google.com/tpu/docs/troubleshooting

XLA概覽:https://www.tensorflow.org/performance/xla/

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    27

    文章

    4639

    瀏覽量

    128467
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3073

    瀏覽量

    48582
  • keras
    +關(guān)注

    關(guān)注

    2

    文章

    20

    瀏覽量

    6074

原文標(biāo)題:使用TPU免費(fèi)加速Keras模型訓(xùn)練

文章出處:【微信號(hào):jqr_AI,微信公眾號(hào):論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    從CPU、GPU再到TPU,Google的AI芯片是如何一步步進(jìn)化過來的?

    趨勢(shì)了,我認(rèn)為這也是Google生產(chǎn)Tensor processing unit的一個(gè)重要出發(fā)點(diǎn)。至此,TPU便登上歷史舞臺(tái)。隨著機(jī)器學(xué)習(xí)算法越來越多的應(yīng)用在各個(gè)領(lǐng)域并表現(xiàn)出優(yōu)越的性能,例如街景、郵件
    發(fā)表于 03-15 11:40

    基于Keras利用cv2建立訓(xùn)練存儲(chǔ)CNN模型(2+1)調(diào)用攝像頭實(shí)現(xiàn)實(shí)時(shí)人臉識(shí)別

    CV之CNN:基于Keras利用cv2建立訓(xùn)練存儲(chǔ)CNN模型(2+1)并調(diào)用攝像頭進(jìn)行實(shí)時(shí)人臉識(shí)別
    發(fā)表于 12-26 11:09

    基于Keras的mini_XCEPTION訓(xùn)練情感分類模型hdf5并保存到指定文件夾下

    CV:基于Keras利用CNN主流架構(gòu)之mini_XCEPTION訓(xùn)練情感分類模型hdf5并保存到指定文件夾下
    發(fā)表于 12-26 11:08

    基于Keras利用訓(xùn)練好的hdf5模型進(jìn)行目標(biāo)檢測(cè)實(shí)現(xiàn)輸出模型中的表情或性別gradcam

    CV:基于Keras利用訓(xùn)練好的hdf5模型進(jìn)行目標(biāo)檢測(cè)實(shí)現(xiàn)輸出模型中的臉部表情或性別的gradcam(可視化)
    發(fā)表于 12-27 16:48

    好奇~!谷歌的 Edge TPU 專用 ASIC 旨在將機(jī)器學(xué)習(xí)推理能力引入邊緣設(shè)備

    單片的 MIPI-CSI 連接器中。攝像頭的焦距為 2.5 毫米,定焦范圍從 10 厘米到無限遠(yuǎn),視野為 84 度。相關(guān)軟件開發(fā)單片與 USB 加速棒皆以谷歌 TPU 軟件堆棧為基礎(chǔ)。各模型的開發(fā)環(huán)境為
    發(fā)表于 03-05 21:20

    為什么無法加載keras模型?

    你好, 我創(chuàng)建了自己的模型并將其保存為 .h5。 但是,當(dāng)我分析時(shí),出現(xiàn)以下錯(cuò)誤。 E010(InvalidModelError):無法加載 Keras 模型 D:motion.h5,E010
    發(fā)表于 12-27 09:04

    keras順序模型與函數(shù)式模型

    keras提供兩種搭建模型的方式: 1. 順序模型(也可看做是函數(shù)式模型的一種特殊情況) 2. 函數(shù)式模型 兩種方式優(yōu)點(diǎn)缺點(diǎn)順序
    發(fā)表于 08-18 06:01

    keras可視化介紹

    keras可視化可以幫助我們直觀的查看所搭建的模型拓?fù)浣Y(jié)構(gòu),以及模型訓(xùn)練的過程,方便我們優(yōu)化模型。
    發(fā)表于 08-18 07:53

    Google發(fā)布人工智能芯片TPU 3

    TechCrunch 報(bào)導(dǎo),Google CEO Sundar Pichai 8 日在 2018 年 Google I/O 大會(huì)發(fā)布第三代 TPU(Tensor Processor Unit
    的頭像 發(fā)表于 05-14 10:37 ?2780次閱讀

    Google發(fā)布新API,支持訓(xùn)練更小更快的AI模型

    Google發(fā)布了 Quantification Aware Training(QAT)API,使開發(fā)人員可以利用量化的優(yōu)勢(shì)來訓(xùn)練和部署模型AI模型
    的頭像 發(fā)表于 04-09 21:55 ?1890次閱讀
    <b class='flag-5'>Google</b>發(fā)布新API,支持<b class='flag-5'>訓(xùn)練</b>更小更快的AI<b class='flag-5'>模型</b>

    PyTorch教程23.4之使用Google Colab

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程23.4之使用Google Colab.pdf》資料免費(fèi)下載
    發(fā)表于 06-06 09:16 ?0次下載
    PyTorch教程23.4之使用<b class='flag-5'>Google</b> <b class='flag-5'>Colab</b>

    TPU和NPU的區(qū)別

    和NPU之間的區(qū)別。 什么是TPU? TPU,即Tensor Processing Unit,是由Google公司開發(fā)的專用於深度學(xué)習(xí)的加速器。它被設(shè)計(jì)成一個(gè)ASIC(應(yīng)用特定集成電路
    的頭像 發(fā)表于 08-27 17:08 ?7212次閱讀

    GoogleTPU芯片的發(fā)展歷史和硬件架構(gòu)

    Google在高性能處理器與AI芯片主要有兩個(gè)系列:1)針對(duì)服務(wù)器端AI模型訓(xùn)練和推理的TPU系列,主要用于Goggle計(jì)算和數(shù)據(jù)中心;2
    發(fā)表于 10-18 10:02 ?2867次閱讀
    <b class='flag-5'>Google</b>的<b class='flag-5'>TPU</b>芯片的發(fā)展歷史和硬件架構(gòu)

    keras的模塊結(jié)構(gòu)介紹

    Keras是一個(gè)高級(jí)深度學(xué)習(xí)庫,它提供了一個(gè)易于使用的接口來構(gòu)建和訓(xùn)練深度學(xué)習(xí)模型Keras是基于TensorFlow、Theano或CNTK等底層計(jì)算庫構(gòu)建的。以下是
    的頭像 發(fā)表于 07-05 09:35 ?265次閱讀

    keras模型轉(zhuǎn)tensorflow session

    訓(xùn)練深度學(xué)習(xí)模型。Keras是基于TensorFlow、Theano或CNTK等底層計(jì)算框架構(gòu)建的。TensorFlow是一個(gè)開源的機(jī)器學(xué)習(xí)框架,由Google Brain團(tuán)隊(duì)開發(fā)。
    的頭像 發(fā)表于 07-05 09:36 ?395次閱讀