经过几个月的研究这个主题,我可以看到 3.5 条可能的前进路径:
1.)Tensorflow + OpenCl,如上面评论中提到的:
这个领域似乎正在发生一些变化。在 Codeplay 上,Lukasz Iwanski 刚刚在这里发布了关于如何让张量流与 opencl 一起运行的全面答案(我只会提供如上所述的链接,因为那里的信息可能会发生变化):https://www.codeplay.com/portal/03-30-17-setting-up-tensorflow-with-opencl-using-sycl https://www.codeplay.com/portal/03-30-17-setting-up-tensorflow-with-opencl-using-sycl
使用集成显卡的潜力是诱人的。这种与 APU 的组合的使用也值得探索。但我不确定这效果如何,因为 OpenCl 支持仍处于开发早期,并且硬件支持非常有限。此外,OpenCl 与手工制作的优化代码库不同。 (更新2017-04-24:我在遇到一些问题后得到了编译代码here https://github.com/benoitsteiner/tensorflow-opencl/issues/65!)不幸的是,希望提高速度在我的设置中 (iGPU)没有实现。
CIFAR 10 数据集:
- Tensorflow(通过 pip ak 未优化):1700 秒/纪元,390% CPU
利用率。
- Tensorflow(SSE4、AVX):1100 秒/epoch(390% CPU)
利用率。
- Tensorflow (opencl + iGPU):150% CPU 时为 5800 秒/纪元
以及 100% GPU 利用率。
您的里程可能会有很大差异。所以我想知道其他人在你的设置上相对而言(未优化、优化、opencl)得到了什么?
需要注意的是:opencl 实现意味着所有繁重的计算都应该在 GPU 上完成。 (2017/4/29更新)但实际上还不是这样,因为有些功能还没有实现。这导致在 CPU 和 GPU RAM 之间不必要地来回复制数据 https://github.com/lukeiwanski/tensorflow/issues/7。再次,即将发生的变化 https://github.com/tensorflow/tensorflow/pull/9117应该改善这种情况。此外,对于那些有兴趣提供帮助和想要加快速度的人,我们可以做一些对 opencl 的 TensorFlow 性能产生重大影响的事情。
但目前的情况是:1 iGPU
在这一点上,我应该补充一点,至少 Caffe 和/或 Theano + OpenCl 已经在进行类似的努力。所有情况下的限制步骤似乎是将 CUDA/cuDNN 功能手动移植到 openCl 范例。
2023 年 6 月 29 日更新:请参阅下面第 5 节及以后的部分,了解最新更新。保留这些部分只是因为概念仍然相关,但性能数字不再相关。
2.) RocM + MIOpen
RocM https://github.com/RadeonOpenCompute/ROCm代表 Radeon 开放计算,似乎是一系列计划的大杂烩,这些计划正在/将使非 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 提供了构建深度学习库的工具。它们本身并不代表深度学习库。作为一名不专注于工具开发的数据科学家,我只想要一些有用的东西。并且不一定对构建我想要的东西然后进行学习感兴趣。在我所在的公司,一天中没有足够的时间来做好这两件事。
2023 年 6 月 29 日更新:请参阅下面第 5 节及以后的部分,了解最新更新。保留这些部分只是因为概念仍然相关,但性能数字不再相关。
NVIDIA 当然有 CUDA 和 cuDNN,它们是针对 NVIDIA GPU 优化的手工汇编代码库。所有主要的深度学习框架都构建在这些专有库之上。 AMD 目前根本没有类似的东西。
我不确定 AMD 在这方面能否成功达到 NVIDIA 的水平。但 Carlos Perez 在 2017 年 4 月 3 日发表的一篇文章中透露了 AMD 的意图here http://instinct.radeon.com/en-us/the-potential-disruptiveness-of-amds-open-source-deep-learning-strategy/。最近斯坦福大学讲座 https://www.youtube.com/watch?v=2LksDHe43rU还笼统地谈论了 Ryzen、Vega 和深度学习的结合。本质上,文章指出 MIOpen 将代表这个为 AMD 设备手工制作的优化深度学习函数库。这个库预计在2017年上半年发布。我不确定这些库要多久才能被纳入主要的深度学习框架中,以及此时功能实现的范围是什么。
但显然,AMD 已经与 Caffe 的开发人员合作,对代码基础进行“嬉皮化” https://www.slideshare.net/insideHPC/hip-and-caffe-porting-and-profiling-with-amds-rocm。基本上,CUDA 代码通过 HIP 自动转换为 C 代码。自动化处理了绝大多数代码基础,只有不到 0.5% 的代码需要更改并需要手动处理。与手动翻译成 openCl 代码相比,人们开始感觉到这种方法可能更可持续。我不清楚的是低级汇编语言优化在哪里。
(更新2017-05-19)但随着AMD Vega卡的即将发布(首先是不面向消费者的专业Frontier版卡),有迹象表明,主要深度学习框架will通过 MIOpen 框架支持 https://www.reddit.com/r/Amd/comments/6bklro/we_are_radeon_technologies_group_at_amd_and_were/dhqoalj/. A 福布斯文章 https://www.forbes.com/sites/moorinsights/2017/05/16/amd-targets-machine-learning-with-new-radeon-vega-frontier-optimized-software/#b6a9a1b3e5bb今天发布的内容显示了 MiOpen 在性能方面比过去几个月取得的进步:看起来意义重大。
(更新2017-08-25) MiOpen已正式发布。我们在这里不再谈论假设。现在我们只需要尝试一下这个框架的工作效果如何。
3.) Neon
Neon https://github.com/NervanaSystems/neon是 Nervana(现已被 Intel 收购)的开源深度学习框架。我提到这个框架的原因是它似乎使用起来相当简单。其语法与 Keras 一样简单直观。更重要的是,该框架的速度比 Tensorflow 快 2 倍一些基准 https://github.com/soumith/convnet-benchmarks由于对这些计算进行了一些手工制作的汇编语言优化。将计算时间从 500 秒/时期减少到 300 秒/时期是不容小觑的。 300 秒 = 5 分钟。所以一小时内可以得到 15 个 epoch。大约 3.5 小时内进行了大约 50 个 epoch!但理想情况下,我想在一小时内完成这些类型的计算。为了达到这些级别,我需要使用 GPU,而目前只有 NVIDIA 在这方面提供全面支持:当 GPU 可用时,Neon 也会使用 CUDA 和 cuDNN(当然,它必须是 NVIDIA GPU) )。如果您可以访问其他英特尔硬件,这当然是一种有效的方法。毕竟,开发 Neon 的动机是让事情在非 NVIDIA 设置(例如 Nervana 的定制 CPU,以及现在的 Intel FPGA 或 Xeon Phis)上也能达到最佳状态。
3.5.) 英特尔 Movidius
2017-08-25 更新:我遇到了本文 https://newsroom.intel.com/news/intel-democratizes-deep-learning-application-development-launch-movidius-neural-compute-stick/。英特尔发布了一款基于USB3.0棒的“深度学习”加速器。显然,它与 Cafe 配合使用,允许用户对网络和推理进行常见的基于 Cafe 的微调。强调这一点很重要:如果您想从头开始训练自己的网络,那么这里的措辞非常模糊。因此,我假设,除了微调网络之外,训练本身仍然应该在具有更多并行计算的东西上完成。但真正令人兴奋的是:当我检查定价时,这根棍子的价格仅为 79 美元。与普通 NVIDIA 1070-80(ti) 卡的成本相比,这根本不算什么。如果你只是想使用已经可用于某些相关任务的常见网络拓扑来解决一些视觉问题,你可以使用这个棒来微调它以适应你自己的用途,然后编译代码并将其放入这个棒中以快速进行推理。这根棍子可以覆盖许多用例,而且 79 美元还是值得的。这就是英特尔,他们提议全力以赴。他们的模型是使用云(即 Nervana Cloud)进行训练。然后,使用该芯片进行原型推理或能耗重要的推理。这是否是正确的方法,留给读者来回答。
2023年6月29日更新:
目前,看起来主要的 ML 库现在都在一定程度上支持 AMD。
4.) TensorFlow-DirectML
2023 年重新审视这个话题,似乎这个领域已经取得了很多进展。借助 TensorFlow-DirectML,可以在具有 AMD 显卡的 Tensforflow 中工作。
Source: https://community.amd.com/t5/radeon-pro-graphics/amd-gpus-support-gpu-accelerated-machine-learning-with-release/ba-p/488595 https://community.amd.com/t5/radeon-pro-graphics/amd-gpus-support-gpu-accelerated-machine-learning-with-release/ba-p/488595
5.) PyTorch 2.0
看来 Pytorch 2.0 现在也支持在 AMD GPU 上进行训练和推理。但并非所有 GPU 都受支持。因此,用户在购买之前必须仔细检查是否支持给定的 GPU。
Source: https://pytorch.org/blog/experience-power-pytorch-2.0/ https://pytorch.org/blog/experience-power-pytorch-2.0/
鉴于 Pytorch 和 Tensorflow 都具有某种形式的 AMD GPU 支持,到 2023 年,AMD GPU 上的训练和推理似乎终于成为可能。
但有一些警告:除了不支持所有 GPU(例如:较旧的 iGPU)之外,同一层的不同 GPU 之间的性能也是未知的。当我找到比较 AMD GPU 训练和推理性能的基准时,我会将它们列在这里。
此外,即使库或库分支支持 AMD GPU 上的机器学习,这些库的更新频率似乎也较低,因为社区较小。从这个角度来看,支撑力度还是有差距的。
Tim Dettmers 发表了一篇非常有见地的文章,有关使用 AMD GPU 进行 ML 训练的部分 https://timdettmers.com/2023/01/30/which-gpu-for-deep-learning/#Will_AMD_GPUs_ROCm_ever_catch_up_with_NVIDIA_GPUs_CUDA。简而言之:在 AMD 将张量核心引入其 GPU 中(这可能会在下一次迭代中实现),并围绕其使用开发出更大的社区之前,NVIDIA 仍将在这些领域占据优势。至少在未来 1-2 年。
目前看来,尽管主要障碍已经被消除,并且已经取得了重大进展,但没有 NVIDIA 的深度学习的实现仍然稍微困难一些。