0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何利用Google Colab的云TPU加速Keras模型训练

zhKF_jqr_AI 来源:未知 作者:李倩 2018-11-16 09:10 次阅读

编者按:AI软件开发者Chengwei Zhang介绍了如何利用Google Colab的云TPU加速Keras模型训练。

我以前都在单张GTX 1070显卡(8.18 TFlops)上训练自己的模型,而且还挺满足的。后来Google的Colab开放了免费的Tesla K80显卡(12GB 显存,8.73 TFlops),最近又提供了免费的TPU(180 TFlops)。这篇教程将简要介绍如何将现有的Keras模型转换为TPU模型,然后在Colab上训练。和在我的GTX1070上训练相比,免费的TPU能够加速20倍。

我们将创建一个容易理解但训练起来足够复杂的Keras模型,让TPU热乎热乎。训练一个LSTM模型,进行IMDB情感分类任务,可能是一个很不错的例子,因为相比密集层和卷积层,训练LSTM对算力要求更高。

工作流概览:

创建Keras模型,输入采用固定的batch_size

转换Keras模型为TPU模型

以batch_size * 8训练TPU模型,并保存权重至文件

创建一个结构相同但输入batch大小可变的Keras模型,用于推理

加载模型权重

基于推理模型进行预测

在阅读本文的同时,你可以上手试验相应的Colab Jupyter notebook:https://colab.research.google.com/drive/1QZf1WeX3EQqBLeFeT4utFKBqq-ogG1FN

闲话少叙,让我们开始吧。

首先在Colab运行时激活TPU:

固定输入batch尺寸

大多数情况下,CPUGPU上对输入形状没有限制,但XLA/TPU环境下强制使用固定的形状和batch尺寸。

云TPU包含8个TPU核,每个核都作为独立的处理单元运作。如果没有用上全部8个核心,那就没有充分利用TPU。为了充分加速训练,相比在单GPU上训练的同样的模型,我们可以选择较大的batch尺寸。总batch尺寸定为1024(每个核心128)一般是一个不错的起点。

万一你要训练一个较大的模型,batch尺寸太大了,那就慢慢降低batch尺寸,直到TPU的内存放得下为止。只需确保总batch尺寸是64的倍数(每核心的batch尺寸应该是8的倍数)。

值得一提的是,当batch尺寸较大时,一般来说增加优化算法的学习率以更快收敛的做法是安全的。详情参见Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour这篇论文( arXiv:1706.02677)。

Keras允许通过参数batch_size设定输入层的batch尺寸。注意我们将模型定义为一个接受batch_size参数的函数,这样我们之后可以很方便地创建在CPU或GPU上运行的模型,这些模型接受可变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而不是标准的Keras优化器,因为TPU对Keras优化器的支持还处于实验阶段。

转换Keras模型至TPU模型

tf.contrib.tpu.keras_to_tpu_model函数可以转换tf.keras模型至等价的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)))

然后我们训练模型,保存权重,并评估模型。注意batch_size设定为模型输入batch_size的8倍,因为输入样本在8个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电脑上本地运行)上和Colab的TPU上的训练速度,结果如下。

GPU和TPU的输入batch尺寸均为128.

GPU:179秒每epoch。20个epoch后达到了76.9%的验证精确度,共计3600秒。

TPU:5秒每epoch,第一个epoch除外(49秒)。20个epoch后达到了95.2%的验证精确度,共计150秒。

20个epoch后TPU的验证精确度高于在GPU上的表现,可能是因为TPU上同时训练8个batch的样本(每个batch大小为128)。

译者注:在Tesla K80上训练20个epoch后的验证精确度为86.3%(耗时6004秒)。使用TPU单核心训练(tf.contrib.tpu.TPUDistributionStrategy函数加上using_single_core=True参数)20个epoch后达到了99.8%的验证精确度。将模型的batch尺寸改为16(128/8)后,TPU上训练20个epoch后达到了99.8%的验证精确度(因为batch尺寸改变,训练时间延长了,约377秒)。这样看起来TensorFlow在TPU上的实现可能有些问题。

在CPU上推理

得到模型权重后,我们可以像平时一样加载权重,然后在其他设备(比如CPU或GPU)上做出预测。我们同时想要推理模型接受可变的输入batch尺寸,如前所述,只需给make_model()函数指定一个参数即可。

inferencing_model = make_model(batch_size=None)

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

inferencing_model.summary()

summary()方法的输出表明推理模型现在可以接受可变输入样本数目:

_________________________________________________________________

Layer (type) OutputShapeParam#

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

Input (InputLayer) (None, 500) 0

_________________________________________________________________

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

_________________________________________________________________

LSTM (LSTM) (None, 32) 20608

_________________________________________________________________

Output (Dense) (None, 1) 33

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

接下来我们就可以在推理模型上调用标准的fit()、evaluate()函数。

inferencing_model.evaluate(x_test, y_test)

我们的模型在测试集上的精确度为82.4%

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

[0.6060782189846039, 0.824]

译者注:相比测试损失和测试精确度,验证损失和验证精确度太高了。其他两个在TPU上训练的模型(单核训练和不同batch大小)也出现了类似的现象,进一步加大了TensorFlow在TPU上的实现有问题的嫌疑。

最后,你可以下载模型权重到本地,以便以后在其他地方使用。

from google.colab import files

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

结语和进一步阅读

这篇教程简要介绍了如何利用Google Colab的免费云TPU资源,加速Keras模型的训练。

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

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

云TPU排错指南:https://cloud.google.com/tpu/docs/troubleshooting

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gpu
    gpu
    +关注

    关注

    28

    文章

    4729

    浏览量

    128890
  • 模型
    +关注

    关注

    1

    文章

    3226

    浏览量

    48807
  • keras
    +关注

    关注

    2

    文章

    20

    浏览量

    6082

原文标题:使用TPU免费加速Keras模型训练

文章出处:【微信号:jqr_AI,微信公众号:论智】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    从CPU、GPU再到TPUGoogle的AI芯片是如何一步步进化过来的?

    趋势了,我认为这也是Google生产Tensor processing unit的一个重要出发点。至此,TPU便登上历史舞台。随着机器学习算法越来越多的应用在各个领域并表现出优越的性能,例如街景、邮件
    发表于 03-15 11:40

    基于Keras利用cv2建立训练存储CNN模型(2+1)调用摄像头实现实时人脸识别

    CV之CNN:基于Keras利用cv2建立训练存储CNN模型(2+1)并调用摄像头进行实时人脸识别
    发表于 12-26 11:09

    基于Keras的mini_XCEPTION训练情感分类模型hdf5并保存到指定文件夹下

    CV:基于Keras利用CNN主流架构之mini_XCEPTION训练情感分类模型hdf5并保存到指定文件夹下
    发表于 12-26 11:08

    基于Keras利用训练好的hdf5模型进行目标检测实现输出模型中的表情或性别gradcam

    CV:基于Keras利用训练好的hdf5模型进行目标检测实现输出模型中的脸部表情或性别的gradcam(可视化)
    发表于 12-27 16:48

    好奇~!谷歌的 Edge TPU 专用 ASIC 旨在将机器学习推理能力引入边缘设备

    单片的 MIPI-CSI 连接器中。摄像头的焦距为 2.5 毫米,定焦范围从 10 厘米到无限远,视野为 84 度。相关软件开发单片与 USB 加速棒皆以谷歌 TPU 软件堆栈为基础。各模型的开发环境为
    发表于 03-05 21:20

    为什么无法加载keras模型

    你好, 我创建了自己的模型并将其保存为 .h5。 但是,当我分析时,出现以下错误。 E010(InvalidModelError):无法加载 Keras 模型 D:motion.h5,E010
    发表于 12-27 09:04

    keras顺序模型与函数式模型

    keras提供两种搭建模型的方式: 1. 顺序模型(也可看做是函数式模型的一种特殊情况) 2. 函数式模型 两种方式优点缺点顺序
    发表于 08-18 06:01

    keras可视化介绍

    keras可视化可以帮助我们直观的查看所搭建的模型拓扑结构,以及模型训练的过程,方便我们优化模型
    发表于 08-18 07:53

    Google发布人工智能芯片TPU 3

    TechCrunch 报导,Google CEO Sundar Pichai 8 日在 2018 年 Google I/O 大会发布第三代 TPU(Tensor Processor Unit
    的头像 发表于 05-14 10:37 2831次阅读

    Google发布新API,支持训练更小更快的AI模型

    Google发布了 Quantification Aware Training(QAT)API,使开发人员可以利用量化的优势来训练和部署模型AI模型
    的头像 发表于 04-09 21:55 1922次阅读
    <b class='flag-5'>Google</b>发布新API,支持<b class='flag-5'>训练</b>更小更快的AI<b class='flag-5'>模型</b>

    PyTorch教程23.4之使用Google Colab

    电子发烧友网站提供《PyTorch教程23.4之使用Google Colab.pdf》资料免费下载
    发表于 06-06 09:16 0次下载
    PyTorch教程23.4之使用<b class='flag-5'>Google</b> <b class='flag-5'>Colab</b>

    TPU和NPU的区别

    和NPU之间的区别。 什么是TPUTPU,即Tensor Processing Unit,是由Google公司开发的專用於深度学习的加速器。它被设计成一个ASIC(应用特定集成电路
    的头像 发表于 08-27 17:08 8092次阅读

    GoogleTPU芯片的发展历史和硬件架构

    Google在高性能处理器与AI芯片主要有两个系列:1)针对服务器端AI模型训练和推理的TPU系列,主要用于Goggle计算和数据中心;2
    发表于 10-18 10:02 3084次阅读
    <b class='flag-5'>Google</b>的<b class='flag-5'>TPU</b>芯片的发展历史和硬件架构

    keras的模块结构介绍

    Keras是一个高级深度学习库,它提供了一个易于使用的接口来构建和训练深度学习模型Keras是基于TensorFlow、Theano或CNTK等底层计算库构建的。以下是
    的头像 发表于 07-05 09:35 357次阅读

    keras模型转tensorflow session

    训练深度学习模型Keras是基于TensorFlow、Theano或CNTK等底层计算框架构建的。TensorFlow是一个开源的机器学习框架,由Google Brain团队开发。
    的头像 发表于 07-05 09:36 510次阅读