3

机器学习所需要的硬件支持

 2 years ago
source link: https://yaoyaowd.medium.com/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E6%89%80%E9%9C%80%E8%A6%81%E7%9A%84%E7%A1%AC%E4%BB%B6%E6%94%AF%E6%8C%81-6f3918d09b4
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

机器学习所需要的硬件支持

Coral

很久不见,上篇博客是一个月前了,果真工作忙起来什么都忘了.今天和大家分享一篇四月份读到的博客,What machine learning needs from hardware,文章从一个机器学习系统工程师的角度谈谈机器学习所需要的硬件支持.作者是Pete Warden,现在是Google的Staff Research Engineer,负责TensorFlow Mobile的开发.

在深度学习兴起之前,人们对现有硬件的需求了解的比较好,所以硬件设计模式比较单一化,主要是对现在已有的想法进行迭代.随着深度学习的兴起,芯片设计变得更加有趣,因为设计需求在不断地改变.接下来我们从机器学习的软件方面谈论一下对硬件的需求,我们不讨论解决方案,因为我也不是专业的硬件设计师,但我会从数百个合作的团队中提炼常见需求.

更强大的计算能力

首先,最重要的就是计算能力,我们还有很多应用由于没有足够的计算能力,没有办法应用在生活当中.如果我们可以运行更大的模型,很多产品将得到改进.我们的团队不管是在cloud,mobile device,还是embedding system上都有想要尝试但没有办法尝试的模型.

举一个实际的例子,我们可以看一个看起来成熟的领域: 语音识别.经过很多努力,Google的一个团队最近能够将一个服务器级别的模型压缩到Pixel手机上.该模型本身也相对较小,仅为80MB.这个模型的计算量现在属于移动设备处理器可以处理的上限,这意味着如果我们能够提高芯片的处理能力,降低能耗,降低价格,这种语音识别就有可能推广到任何一个手机中去.如果你对将模型拓展到不同的手机上不感兴趣,更大的计算能力也能支持更复杂的模型,提高在嘈杂环境下的识别效果.

这只是一个应用领域.我合作的很多产品都有类似的情况,提高运行速度,降低延时和电量消耗能够直接提升用户体验.如果你对模型进行profile,可以发现大部分时间都花在了加法,乘法等基础操作上,改进硬件可以直接的提高模型运行效率.

加速模型推理

我的经验可能是有偏见的,因为我的工作主要专注于运行已经训练好的模型,所以我也相信未来几年最大的需求是推理硬件,而不是训练硬件.因为模型的训练量研究人员成比例,推理规模应用规模用户数成比例.一个研究员训练模型需要大量的计算,但是训练次数以及模型规模增长受到研究员的能力限制.相比之下,流行的应用程序有数亿用户,复杂的无人车模型要规模化也要部署到数百万,数千万智能体上,因此推理的规模接下来会有更大量的增长.

另外,在互联网公司很多团队都能训练很大规模的模型,在云计算平台上的花费也和计算,推理的资源消耗息息相关.出于这个原因,我希望能看到更多关注机器学习推理优化的加速器硬件诞生.

支持低精度

现在人们普遍认为,8位计算足以支持Convolutional Neural Networks的推理.这一观点在训练阶段可能不成立,因为训练需要更高的精度进行增量处理,达到需要的准确率,但是使用32位的完整精度不是必须的.根据我的经验,如果你设计一个好的8位精度推理硬件,他就可以覆盖大部分应用.关于8位精度到底会对计算产生什么样的影响,我希望TensorFlow团队能够给根据他们的经验做一些指导,详细说明什么时候8位精度是最佳的实践.

也有一些研究表明推理所需的精度可能可以低于8位,但这种情况很少.感兴趣的朋友可以关注一下Raghu的研究.

广泛的兼容性

一般的加速器设计过程是这样的,设计师查看现在机器学习过程中每一个操作的工作量,挑选一些占用时间较大的操作,设计一个加速器来加速他们,降低关键路径复杂度.

原则上听起来不错,但是我们把这样的加速器集成到一个完整的系统中时,它往往无法发挥其潜力。问题在于,即使模型的大部分计算都集中在几个少数常见操作上,仍有数百个其他常见的操作出现。几乎我看到的每个模型都有类似的情况,哪怕他们的神经网络设计不同.一个很好的例子是Mobile SSD和类似的对象检测模型中的non-max suppression,我们需要一些非常具体的自定义的操作来将模型输出的许多边框进行合并,最后产生几个预测值。这不需要非常多的基础计算,但需要很多逻辑处理,除了通用的C++代码之外很难表达。类似的情况在音频处理中也有,这一类操作一般不是计算密集型的,且专业加速器不支持它们。

硬件团队有两个常见的解决办法。一种是回退到CPU来实现这些自定义操作。如果加速器和CPU跨越总线,则可能带来大量延迟,这种延迟可以抵消加速器带来的任何速度优势。另一种是硬件团队教育用户去使用可以在加速器上运行的模型,避免任何棘手的自定义操作。这可以适用于某些情况,但和我工作过的大多数产品团队都在努力训练他们的模型以满足他们应用的特性,因此他们通常使用自定义方法来实现。这使得要求他们切换到一个新的模型,并且进行优化变得更难.

为了体现这一问题的严重性,我对TensorFlow中用到的操作进行了一个简单的估计.

grep -Ir 'REGISTER_OP("' tensorflow/core | grep -vE '(test)|(contrib)' | wc -l

给出的估计是1202个操作.其中一些是用于实验和调试的内部操作,但根据我的经验,一般的研究员都会在训练时接触数百种不同的操作。另一方面,研究人也在不断创造和改进操作,所以利用加速器去支持这么多操作是很困难的事情.

我希望未来的加速器能提供某种通用计算能力,以便可以轻松地移植和运行任意C++自定义操作。我们在TensorFlow Lite中做的一些工作最初是针对micro controllers和embedding systems,但我希望它最终也能帮助把操作移植到加速器等设备上去。

相对较好的一件事情是我们现在处于一个很好的位置,在系统上面进行的改进可以很快转化为用户体验.我们正在做的工作有可能对人们生活产生很大的影响,我们有适当的工具来进行快速迭代.而这一切都离不开硬件和软件社区的大量合作,快速迭代和需求共享,因为这是一个新领域,所以我期待继续分享我的经验,并听取硬件专家的意见,一起来寻求共同前进的方向。

资源:
What machine learning needs from hardware?
https://petewarden.com/2019/04/14/what-machine-learning-needs-from-hardware/
Raghu关于模型INT8化的研究
https://arxiv.org/pdf/1806.08342.pdf


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK