如何加快非NVIDIA设置的深度学习?

时间:2017-03-31 14:20:01

标签: tensorflow deep-learning theano caffe torch

由于我只有AMD A10-7850 APU,而且没有足够的资金用于购买价值800美元至1200美元的NVIDIA显卡,我正试图利用我拥有的资源来加速深度学习tensorflow / keras。

最初,我使用了Tensorflow的预编译版本。 InceptionV3需要大约1000-1200秒来计算1个纪元。它一直很缓慢。

为了加快计算速度,我首先使用优化器(使用AVX和SSE4指令)自行编译Tensorflow。这导致计算时间减少约40%。上面执行的相同计算现在只需要大约600秒来计算。它几乎可以忍受 - 有点像你可以看油漆干燥。

我正在寻找进一步缩短计算时间的方法。我只有一个集成的AMD显卡,它是APU的一部分。 (如何)(C / c)我利用这个资源来进一步加速计算?

更一般地说,让我们说有其他人有类似的货币限制和英特尔设置。没有分立的NVIDIA显卡的人如何利用他们的集成显卡芯片或其他非NVIDIA设置来实现比仅CPU性能更快的速度?那可能吗?为什么/为什么不呢?要实现这一目标需要做些什么?或者这可能在不久的将来(2-6个月)?怎么样?

2 个答案:

答案 0 :(得分:17)

在研究了这个主题几个月后,我可以看到前进的3.5条路径:

1。)上述评论中提到的Tensorflow + OpenCl:

这个领域似乎有一些动静。在Codeplay上,Lukasz Iwanski刚刚发布了一个关于如何在这里使用opencl运行tensorflow的全面答案(我将只提供上述链接,因为信息可能会在那里发生变化):https://www.codeplay.com/portal/03-30-17-setting-up-tensorflow-with-opencl-using-sycl

使用集成显卡的潜力很诱人。同样值得探索这种与APU的组合的使用。但我不确定这是否会有效,因为OpenCl支持仍处于早期开发阶段,硬件支持非常有限。此外,OpenCl与手工优化代码库不同。 (更新2017-04-24:在遇到一些问题here后,我已经得到了编译代码!)不幸的是,希望提高速度 ON MY SETUP(iGPU)没有实现。

CIFAR 10数据集:

  1. Tensorflow(通过pip ak未经优化):1700秒/纪元,390%CPU 利用。
  2. Tensorflow(SSE4,AVX):在390%CPU下1100秒/纪元 利用。
  3. Tensorflow(opencl + iGPU):150%CPU时5800sec / epoch 和100%的GPU利用率。
  4. 您的里程可能会有很大差异。所以我想知道其他人在你的设置上有什么相对的说法(未优化vs优化vs opencl)?

    应该注意:opencl实现意味着所有繁重的计算都应该在GPU上完成。 (2017/4/29更新)但实际情况并非如此,因为有些功能尚未实施。这导致unnecessary copying back and forth of data between CPU and GPU ram。同样,imminent changes应改善这种情况。此外,对于那些有兴趣帮助的人和那些想要加快速度的人,我们可以做一些对openclflow的性能产生可测量影响的事情。

    但它现在代表:1 iGPU<< 4 CPUS与SSE + AVX。或许具有更大RAM和/或opencl 2.0实现的更强大的GPU可能会产生更大的差异。

    此时,我应该补充说,至少Caffe和/或Theano + OpenCl正在进行类似的努力。所有情况下的限制步骤似乎都是将CUDA / cuDNN功能手动移植到openCl范例。

    2。)RocM + MIOpen

    RocM代表Radeon Open Compute,似乎是一个大杂烩的举措,可以在非NVIDIA(主要是Radeon设备)上进行深度学习。它包括3个主要组成部分:

    • HIP:一种将CUDA代码转换为可供AMD GPU使用的代码的工具。
    • ROCk:用于AMD CPU + GPU设备的64位Linux内核驱动程序。
    • HCC:一种C / C ++编译器,用于将代码编译为异构系统架构环境(HSA)的代码。

    显然,RocM旨在发挥AMD拥有CPU和GPU技术的优势。他们加速深度学习的方法利用了这两个组成部分。作为APU的所有者,我对这种可能性特别感兴趣。但作为警示:Kaveri APU支持有限(仅支持集成图形)。未来的APU尚未发布。而且看来,这里仍有很多工作要做,以使这个项目进入成熟状态。鉴于AMD宣布他们的Radeon Instinct卡将于今年(2017年)发布,许多工作有望在一年内使这种方法可行。

    这里的问题是RocM正在提供构建深度学习库的工具。他们自己并不代表深度学习图书馆。作为一个不专注于工具开发的数据科学家,我只想要一些有用的东西。并不一定有兴趣建立我想要的东西然后做学习。一天中没有足够的时间在我所在的公司做得很好。

    NVIDIA当然有CUDA和cuDNN,它们是为NVIDIA GPU优化的手工编译汇编代码库。所有主要的深度学习框架都建立在这些专有库之上。 AMD目前根本没有这样的东西。

    我不确定AMD将在多大程度上成功实现NVIDIA在这方面的优势。但是卡洛斯佩雷斯在2017年4月3日here发表的一篇文章中,有些人对AMD的意图有所了解。最近的一篇lecture at Stanford也就Ryzen,Vega和深度学习融合在一起。从本质上讲,文章指出MIOpen将代表这个手工制作的AMD设备优化深度学习功能库。该库将于2017年上半年发布。我不确定这些库将在多长时间内纳入主要的深度学习框架,以及此时功能实现的范围。

    但显然,AMD has already worked with the developers of Caffe to "hippify" the code basis。基本上,CUDA代码通过HIP自动转换为C代码。自动化处理绝大多数代码基础,只留下不到0.5%的代码需要更改并需要手动注意。将其与手动转换为openCl代码进行比较,人们开始觉得这种方法可能更具可持续性。我不清楚的是低级汇编语言优化的用武之地。

    (更新2017-05-19)但随着即将发布的AMD Vega卡(专业的Frontier Edition卡不是面向消费者的将是第一张),有一些提示major deep learning frameworks will be supported through the MIOpen framework。今天发布的Forbes article显示了MiOpen在过去几个月中在性能方面取得的进展:它看起来很重要。 (更新2017-08-25)MiOpen已正式发布。我们不再在这里假设。现在我们只需要尝试一下这个框架的运作情况。

    3。)霓虹灯

    Neon是Nervana(现在被英特尔收购)的开源深度学习框架。我提到这个框架的原因是它似乎相当简单易用。语法与Keras一样简单直观。更重要的是,由于对这些计算进行了一些手工制作的汇编语言优化,这个框架的速度比some benchmarks上的Tensorflow快2倍。潜在地,将计算时间从500秒/纪元减少到300秒/纪元是没有什么可以打喷嚏的。 300秒= 5分钟。所以人们可以在一小时内获得15个时代。约3.5小时约50个时代!但理想情况下,我想在一小时内完成这些计算。为了达到这些水平,我需要使用GPU,此时,只有NVIDIA在这方面提供全面支持:当GPU可用时,Neon还使用CUDA和cuDNN(当然,它必须是NVIDIA GPU )。如果您可以访问其他英特尔硬件,这当然是一种有效的方法。毕竟,Neon的开发动机是为了让事情在非NVIDIA设置上得到最佳工作(如Nervana的自定义CPU,现在是Intel FPGA或Xeon Phis)。

    3.5。)英特尔Movidius

    2017-08-25更新:我遇到this article。英特尔发布了基于USB3.0-stick的深度学习技术#34;加速器。显然,它与Cafe合作,允许用户执行常见的基于咖啡馆的网络和推理微调。这是一个重要的压力:如果你想从头开始训练你自己的网络,这里的措辞非常模糊。因此,我将假设,除了对网络进行微调之外,还应该对具有更多并行计算的东西进行自我训练。真正的问题是:当我检查定价时,这根棒只需79美元。与平均NVIDIA 1070-80(ti)卡的成本相比,这没什么。如果您只想使用已经可用于某些相关任务的常见网络拓扑解决某些视觉问题,您可以使用此棒将其微调到您自己的使用,然后编译代码并将其放入此棒以快速进行推理。这个棒可以覆盖很多用例,而79美元也值得。这是英特尔,他们建议全力以赴英特尔。他们的模型是使用云(即Nervana Cloud)进行训练。然后,使用此芯片进行原型推断或推断,其中能耗很重要。这是否是正确的方法留待读者回答。

    此时,看起来没有NVIDIA的深度学习仍然难以实现。一些有限的速度增加是困难的,但可能通过使用opencl。其他举措听起来很有希望,但需要时间来理清这些举措将产生的实际影响。

答案 1 :(得分:2)

如果您的平台支持opencl,您可以使用tensorflow来查看它。在this github repository的Linux上有一些实验性的支持。一些初步说明在the documentation section of of this github repository