每个人的主题方案单位


很多人都在用TensorFlow这几天。我们中的一些人正在计算能力的入门级进行实验,而另一些人则危险地徘徊在前沿。最近,我写了一篇关于英特尔如何加快Python科学库的速度,以便为非常小的项目提供更好的性能(以及随着它们在云中成长而显著的增量加速)的文章。对于处于边缘的人来说,有一些非常有趣的新玩具值得兴奋。现在,(几天前)你可以在Google Cloud Platform(GCP)大约每小时6.5美元.每秒计费!

谷歌一直在用专门的硬件进行研发,以加速和扩大一些对TensorFlow至关重要的特定数学运算。进入张量处理单元(TPU)。TPU是一块硬件,大约是智能手机大小的电路板,使用定制的Application Specific Integrated Circuits(ASIC),旨在执行TensorFlow架构围绕的一些核心和高度重复的计算任务。

TPU正在沿着类似的演变道路发展到GPU,GPU的根源是20世纪80年代SGI图形工作站中的一个单独的处理板。在此之前,所有渲染阴影三维图像的计算工作都是在CPU中完成的。正如你可以想象的那样,这很快就成为了一个瓶颈。因此,SGI的解决方案是卸载计算最密集和最重复的单一功能:根据定义的颜色、虚拟入射光源和查看角度计算各个三角面的RGB像素值。三角形是表示3D对象曲面的三维网格的各个面。即使早在20世纪80年代,在高质量的3-D渲染中也有数以万计的面片,这并不少见。新加坡政府投资公司决定让撞击承担用他们称之为“几何引擎”的硬件渲染3-D图像的苦差事。这些最初的“几何引擎”的唯一目的是计算颜色的阴影,以便在一个小三角形的每个像素上“绘制”颜色。它们类似于非常小的CPU,可以在少量孤立的数据(三角形三个顶点的向量,入射光的向量,视角的向量,灯光的颜色向量)上进行点和叉积。

事实上,这些早期面向图形的电路板的计算核心通常被称为“着色器”。而且只有十几个被认为是一件非常重要的事情。从那时起,我们肯定已经取得了很大的进步。今天的GPGPU有数千个内核以1千兆赫兹的速率运行,并具有千兆字节的板载存储。今天,看起来机器学习本身即将获得巨大的硬件提升。

进入TPU:机器学习依赖于对相对较小的本地化数据集(当然是大量输入数据语料库的子集)的大量简单操作。谷歌并没有没有认识到TensorFlow方法论的这种分而治之的本质,他们的方法,正如你可能预料的那样,是对这一计算瓶颈(机会?)采取了一种强大的模块化方法。诚然,这一瓶颈目前由GPGPU解决,而且它们做得相当好。但是,GPGPU是先进的和改进的,可以做各种图形事情。谷歌决定重新关注这个问题,以制造具有“机器学习功能”的硬件。为了提高速度,他们决定将“通用图形”从通用图形处理单元中移除。虽然GPU与CPU非常相似,只是体积更小、高度并行,但TPU的创建是为了更直接地解决问题。通过使用将硬件编程内置到硅中的ASIC来设计TPU以降低可编程性是有意义的。在这一新计算范例的第一个化身中,基本TPU模块基于四个定制ASIC,这四个ASIC在中等大小(适合您的手)的电路板上使用高达64 GB的高带宽RAM,共同实现180 TFLOPS的浮点数学运算。

谷歌TPU挡路示意图:

我在这里没有空间来描述热塑性聚氨酯的内部工作原理,但是谷歌已经提供了一个非常可读性的解释,上面的挡路图表中发生了什么。花10到20分钟思考这个设备是非常值得的。读一读吧here

记住,这只是一个测试版。但是,有很多文档,包括教程和快速入门指南!而且使用起来并不太复杂。例如,可以通过设置环境变量来完成简单的乘法和加法:

  export TPU_NAME="demo-tpu"

并创建一个简短的Python脚本:

import os
import tensorflow as tf
from tensorflow.contrib import tpu
from tensorflow.contrib.cluster_resolver import TPUClusterResolver

def axy_computation(a, x, y):
  return a * x + y

inputs = [
    3.0,
    tf.ones([3, 3], tf.float32),
    tf.ones([3, 3], tf.float32),
]

tpu_computation = tpu.rewrite(axy_computation, inputs)

tpu_grpc_url = TPUClusterResolver(
    tpu_names=[os.environ['TPU_NAME']]).get_master()

with tf.Session(tpu_grpc_url) as sess:
  sess.run(tpu.initialize_system())
  sess.run(tf.global_variables_initializer())
  output = sess.run(tpu_computation)
  print(output)
  sess.run(tpu.shutdown_system())

print('Done!')

我认为,这看起来是对未来一两年机器学习方向的坚实押注。对于一杯像样的咖啡的价格,想想你可以用180 TFLOPS做什么,一小时!你现在就可以注册。