当前位置:首页 > 留学 > 正文

ittf(乒乓球拍ittf什么意思)

机器初心,作者:思远。

最近机器之心发现谷歌的 Colab 已经支持使用免费的 TPU,这是继免费 GPU 之后又一重要的计算资源。我们发现目前很少有博客或 Reddit 论坛讨论这一点,而且谷歌也没有通过博客或其它方式做宣传。因此我们尝试使用该 TPU 训练简单的卷积神经 *** ,并对比它的运行速度。

我们在互联网上只找到相对较少的信息和资源。之一次介绍Colab free TPU是Google开发者Sam Wittevee最近的演讲PPT。因此,本文的测试和探索都是基于官方文献和实例,还有很多TPU特色没有考虑到。感兴趣的读者可以参考本文末尾的参考资料,了解更多关于Colab free TPU的特性。

本文所有测试代码和结果均可访问:https://colab.research.google.com/drive/1dpucbM58frugnrtql _ dis vbt 90 spdzgm。

测试Colab自由TPU

首先,我们需要确保Colab notebook中的运行时类型是TPU,并且分配了TPU资源。因此,通过选择菜单栏中的“运行时”和“更改运行时类型”,将弹出以下对话框:

为了确保Colab已经为我们分配了TPU计算资源,我们可以运行下面的测试代码。如果输出了错误项,则意味着当前运行时没有调整到TPU。如果输出了TPU地址和TPU设备列表,就意味着Colab已经为我们分配了TPU计算资源。

如果看下面测试代码的正常输出,Colab会为TPU运行时分配CPU和TPU,其中分配的TPU工作站有八个内核,所以后面配置的TPU策略会选择八个并行分片。

import OSI import pprint import tensor flow as tfif ' COLAB _ TPU _ ADDR '不在os.environ: print('错误:未连接到TPU运行时')else:TPU _ address = ' grpc://'+OS . environ[' COLAB _ TPU _ ADDR ']print(' TPU地址为',TPU _ address)with TF . session(TPU _ address)as session:devices = session . list _ devices()print(' TPU devices:')pprint . pprint(devices)目前,COLAB支持三种但我们对深度模型中的GPU和TPU在Colab中的表现了解不多。当然,我们稍后会用具体的任务来测试它们,但现在我们可以先用相同的操作来尝试它们的效果。所以我们首先尝试用简单的卷积运算来测试它们的迭代时间。

当测试不同的硬件时,你需要切换到不同的运行时。首先定义128个随机生成的256×256图像,然后定义256个5×5卷积核进行卷积运算,其中神奇的函数%timeit会自动执行多次,以产生更准确的平均执行时间。

import tensorflow as tf import numpy as npimport timeittf.reset_default_graph()img = np.random.randn(128, 256, 256, 3).astype(np.float32)w = np.random.randn(5, 5, 3, 256).astype(np.float32)conv = tf.nn.conv2d(img, w, [1,2,2,1], padding='SAME')with tf.Session() as sess: # with tf.device("/gpu:0") as dev: %timeit sess.run(conv)

然而,是我们想当然了,使用 TPU 执行运算似乎需要特定的函数与运算,它不像 CPU 和 GPU 那样可以共用相同的代码。分别选择 CPU、GPU 和 TPU 作为运行时状态,运行上面的代码并迭代一次所需要的时间分别为:2.44 s、280 ms、2.47 s。从这里看来,仅修改运行时状态,并不会真正调用 TPU 资源,真正实现运算的还是 CPU。随后我们发现 TF 存在一个神奇的类 tf.contrib.tpu,似乎真正调用 TPU 资源必须使用它改写模型。import tensor flow as TF import numpy as NP import time ittf . reset _ default _ graph()img = NP . random . randn(128,256,256,3)。astype(NP . float 32)w = NP . random . randn(5,5,3,256)。astype(NP . float 32)conv = TF . nn . conv2d(img,w,[1,2,2,1],Padding =' same '),tf.session()为sess: # with tf.device ("/GPU: 0 ")为dev:% time it sess。润(conv)然而,我们认为这是理所当然的。使用TPU执行操作似乎需要特定的功能和操作。它与CPU和GPU不共享相同的代码。选择CPU、GPU和TPU作为运行时状态,运行上述代码并迭代一次所需时间分别为2.44 s、280 ms和2.47 s。从这个角度来看,只修改运行时状态并不会真正调用TPU资源,但是CPU会真正实现操作。然后我们发现TF有一个神奇的类tf.contrib.tpu,好像是在我们真正调用tpu资源的时候用来重写模型的。

因此,根据文档和调用示例,我们将上面的卷积测试代码更改为以下形式,并成功使用了TPU。另外,因为每次都需要重新连接不同的运行时,所以这里的代码保持了库的导入。虽然代码不一样,但是直观来看,它的计算量应该和上面的代码一样,所以我们可以大致判断一下Colab提供的GPU和TPU的速度对比。

import tensorflow as tf import numpy as npimport timeitimport ostpu_address = 'grpc://' + os.environ['COLAB_TPU_ADDR']tf.reset_default_graph()def conv_op(): img = np.random.randn(128, 256, 256, 3).astype(np.float32) conv_w = np.random.randn(5, 5, 3, 256).astype(np.float32) conv = tf.nn.conv2d(img, conv_w, [1,2,2,1], padding='SAME')tpu_ops = tf.contrib.tpu.batch_parallel(conv_op, [], num_shards=8)with tf.Session(tpu_address) as sess: sess.run(tf.contrib.tpu.initialize_system()) sess.run(tpu_ops) %timeit sess.run(tpu_ops) sess.run(tf.contrib.tpu.shutdown_system())

运行后出现了非常意外的结果,这样的卷积运算每一次迭代只需要 1.22 ms。如下图所示,很可能存在变量缓存等其它因素造成了一定程度的缓慢,但 TPU 的速度无可置疑地快。因此如果在 Colab 上测试模型,我们就更希望使用免费的 TPU,不过使用 TPU 需要改模型代码,这又比较麻烦。import tensor flow as TF import numpy as NP import time it import ost pu _ address = ' grpc://'+OS . environ[' COLAB _ TPU _ ADDR ']TF . reset _ default _ graph()def conv _ op():img = NP . random . randn(128,256,256,3)。astype(NP . float 32)conv _ w = NP . random . randn(5,5,3,256)。astype(NP . float 32)conv = tf . nn . conv2d(img,conv_w,[1,2,2,1],padding = ' SAME ')TPU _ ops = TF . contrib . TPU . batch _ parallel(conv _ op,[],num_shards=8)带TF。Session(tpu地址)as SESS:SESS . run(TF . contrib . TPU . initialize _ system())SESS . run(TPU _ ops)% time it SESS . run(TPU _ ops)SESS。RUN(TF . contrib . TPU . shut down _ system())运行后有一个非常意外的结果。这样的卷积运算每次迭代只需要1.22毫秒。如下图所示,很可能是变量缓存等其他因素造成了一定程度的缓慢,但TPU的速度不可否认地很快。所以如果在Colab上测试模型,我们更倾向于使用免费的TPU,但是使用TPU需要更改模型代码,比较麻烦。



虽然简单卷积TPU比K80快得多,但它只能给我们一个粗略的猜测,所以我们需要测试完整的模型。注意,在tf.contrib.tpu类中,还提供了两种使用tpu的简单 *** ,即直接使用Keras接口和使用TPUEstimator构建模型。

在tf.contrib.tpu的文档中,我们发现 *** TF . contrib . TPU . Keras _ to _ TPU _ model可以直接将keras模型和对应的权重复制到TPU,返回TPU模型。在多个TPU核上输入Keras模型和训练策略后,该 *** 可以输出一个Keras TPU模型的例子,可以赋值给TPU进行运算。

此外,另一种调用tpu计算资源的 *** 是tf.contrib.tpu.TPUEstimator,这可能是一种更方便的 *** 来修改我们原来的TensorFlow模型以适合TPU。根据文档,TPUEstimator类继承自Estimator类,因此它不仅支持TPU上的操作,还支持CPU和GPU操作。TPUEstimator隐藏了TPU上训练的许多细节,例如为多个TPU核心复制多个输入和模型。

调用TPU文件的地址:https://www.tensorflow.org/api_docs/python/tf/contrib/tpu


比较TPU和GPU的计算速度

为简单起见,这里仅使用时尚-MNIST数据集和简单的5层卷积神经 *** 来测试不同的芯片性能。这个模型是基于Keras的,因为除了模型转换和编译之外,Keras模型在TPU和GPU的训练代码是一样的,用Keras模型展示也非常简洁。

前几天,Google Colab团队发了一个用Keras调用TPU的教程,所以我们用它来测试TPU的训练速度。对于GPU测试,我们可以修改模型的编译和拟合部分,调用GPU进行训练。所以整个训练的数据采集、模型结构、超参数都是一样的,只有硬件不同。

教程地址:https://colab . research . Google . com/github/tensor flow/TPU/blob/master/tools/colab/fashion _ mnist . ipynb


以下是整个测试的通用部分,包括训练数据的获取和模型架构。Keras的模型代码非常容易理解。下面的之一卷积层首先采用批量归一化,然后用64个5×5卷积核实现卷积运算。注意,这里使用的激活函数都是指数线性单位(ELU)。然后,将卷积结果汇集到更大值2×2,并添加一个随机丢弃率为0.25的丢弃层。最终结果是之一个卷积层的输出。

import tensor flow as TF import numpy as NP import time it(x _ train,y_train),(x_test,y _ test)= TF . keras . datasets . fashion _ mnist . load _ data()# add empty color dimension x _ train = NP . expand _ dims(x _ train,-1)x _ test = NP . expand _ dims(x _ test,-1)model = TF . keras . models . sequential()#以下是之一个卷积层model . add(TF . keras . layers . batch归一化如下图所示,Keras_to_tpu_model *** 需要在tpu上输入正常的Keras模型及其分布式策略,可视为“TPU版”模型。模型转换完成后,只需要像一般的Keras模型一样进行数据的编译和拟合即可。

注意,两个模型的超参数,如学习率、批量和历元数都设置为相同的值,损失函数和优化器采用相同的 *** 。

导入ost pu _ model = TF . contrib . TPU . keras _ to _ TPU _ model(model,strategy = TF . contrib . TPU . tpudistributionstrategy(TF . contrib . cluster _ resolver。TPUClusterResolver(TPU = ' grpc://'+OS . environ['科拉布_ TPU _ ADDR ']))TPU _ model . compile(optimizer = TF . train . adamoptimizer(learning _ rate = 1e-3,),loss = TF . keras . loss . sparse _ category _ cross entropy,metrics =[' sparse _ category _ accuracy '])def train _ gen(batch _ size):while True:offset = NP . random . randint(0,x _ train . shape[0]-batch _ size)yield x培训结果如下所示。Colab提供的TPU比GPU快3倍左右。一般TPU训练5 Epoch只需要40多秒,而GPU需要2分多钟。

关于Colab与自由TPU的训练的信息摘要。




Colab免费GPU培训信息汇总。

最后,Colab确实提供了非常强大的免费TPU,使用Keras或TPUEstimator可以很容易地重建或转换现有的TensorFlow模型。机器之心只是简单的尝试了一下Colab free TPU,还有很多功能有待读者测试,比如支持TPU的PyTorch 1.0或者TPU上循环神经 *** 的性能。

0