chaos 2017-11-09
GPU计算已成为数据科学领域的重要组成部分。计算需求的不断增长,使得GPU计算逐渐流行起来。此外,现在每个主要云计算提供商都提供了GPU服务,比如阿里云,因此现在访问高性能硬件是非常简单的一件事。但是,自行构建GPU软件是相当吓人。幸运的是,Anaconda Distribution可以很容易地启动GPU计算,并且可以从我们的软件包库中直接安装几个支持GPU的软件包。在这篇博客文章中,我们将向你介绍如何在Anaconda发行版中开始使用GPU。
在本文中我将介绍NVIDIA GPU制造的GPU,因为它们在Anaconda Distribution中有内置支持,但是AMD的Radeon Open Compute计划也在迅速改善AMD GPU计算生态系统,以保证能够适应现在的软件。
1.什么时候选择GPU?
GPU并不是通用计算设备。它们是专门的协处理器,对于一些任务来说是非常好的(一般可以提升10倍的性能)。GPU最成功的应用是在设备的大并行浮点吞吐量和高内存带宽的问题领域中。一些例子包括:
1.线性代数。
2.信号和图像处理(FFT)。
3.神经网络和深度学习。
4.其他机器学习算法,包括广义线性模型,梯度增强等。
5.蒙特卡罗模拟和粒子运输。
6.流体模拟。
7.内存数据库。
...
所有这些成功用例的共同点是什么?广义而言,准备用于GPU加速的应用程序具有以下特征:
1.1:高“算术强度”
如果数学运算与内存运算的比例较高,要求运算算法速度快,GPU加速是一个很好的选择。这些算法利用了GPU的高数学吞吐量,以及在同时对其他数据进行数学运算的同时,在后台对内存访问进行排队的能力。GPU可以在请求和接收存储在GPU内存中的一个编号的时间内轻松地执行许多数学指令。
什么算得上高算术强度?GPU的一个法则是,对于你输入的每一个数字,你至少需要十个基本的数学运算(加法,减法,乘法,除法等)或至少一个特殊的数学函数调用,如exp()或者cos()。
1.2:高度的平行性
GPU是处理阵列的最佳选择,大阵列的元素可以并行计算。如果计算只能分成少量的独立任务,则多核CPU可能更适合。请注意,找到并行的方法是要用不同的算法替换当前的串行算法,以高度并行的方式解决相同的问题。一个快速的网络搜索是否有价值,看它是否有“明显不能并行化”的东西。
1.3:工作数据集可以放入GPU内存
16 GB(甚至24 GB)的GPU现在已经可以买到,但也比在高端服务器上安装的系统内存的数量要少一个数量级。一些算法可以将数据在同一台计算机上的多个GPU之间进行分割,而且有时可以在不同计算机的GPU之间分割数据。也可以将系统RAM中的数据传输到GPU中,但连接GPU和CPU的PCI-E总线的带宽或将成为一个限制因素,除非计算和内存传输仔细重叠。
1.4:I / O不是瓶颈
很多数据科学任务主要受I / O速度限制。例如,在一个磁盘上过滤500 GB记录以找到与简单搜索模式匹配的子集的应用程序将花费大部分时间等待数据从磁盘加载。如果这个数据过滤之后将要进行6个小时的深度学习的训练,那么使用GPU将是非常有益的(仅对于模型训练阶段)。在开始性能优化工作之前,分析你的Python应用程序以测量实际耗用的时间是一个好主意。
2.先决条件
在开始使用GPU之前,你需要做一些事情:
2.1:使用NVIDIA®(英伟达™)GPU(图形处理器)的系统:更便宜的GeForce显卡非常适合实验,更昂贵的Tesla显卡通常具有更好的双精度性能和更多内存。移动NVIDIA GPU也可以工作,但性能非常有限。
2.2:支持CUDA的驱动程序:尽管Mac,Windows和Linux支持CUDA,但我们发现Linux上是最好的CUDA体验。Mac在2014年停止获得NVIDIA GPU,而在Windows上,图形驱动程序系统的局限性损害了运行CUDA的GeForce卡的性能。Linux上最新的NVIDIA驱动程序(不是Nouveau)对于支持GPU的Anaconda软件包来说已经足够了。除非你想从头编译自己的GPU软件,否则不需要安装完整的CUDA工具包。
2.3:Anaconda:安装本文描述的软件包最简单的方法是使用Anaconda Distribution中的conda命令行工具。如果你是Anaconda Distribution的新手,最近发布的版本5.0是一个很好的开始,但旧版本的Anaconda Distribution也可以安装下面描述的软件包。
3.GPU项目检查
深度学习:Keras,TensorFlow,PyTorch
训练神经网络(通常称为“深度学习”,指的是常用的大量网络层)已经成为GPU计算的一个非常成功的应用。神经网络已经证明了它们在图像字幕,语言翻译,语音生成和许多其他应用中的实用性。但是,他们需要大量的数据集和计算能力来训练,并且能够轻松地进行不同模型的实验。一旦训练完毕,模型可以在CPU和移动设备上运行。
对于深度学习来说,我非常喜欢Keras。Keras是一个Python库,用于构建,训练和评估支持多种高性能后端库(包括TensorFlow,Theano和Microsoft的Cognitive Toolkit)的神经网络模型。Keras也可以不用GPU,但是对于许多项目来说,如果你有一个GPU的话,训练速度可以提高10倍。
Keras和支持GPU的TensorFlow版本可以使用以下命令安装在Anaconda中:
conda install keras-gpu
我也喜欢在Jupyter上记录我的Keras实验,所以你可能也想运行:
conda install notebook
jupyter notebook
一些很好的起点是练习Github上的CIFAR10和MNIST卷积神经网络实例。
值得一提的是像TensorFlow和PyTorch这样的库可以直接用于各种计算和机器学习任务,而不仅仅是深度学习。因为它们使CPU和GPU之间的计算变得非常容易,所以它们可以成为数据科学工具箱中最强大的工具。
4.GPU加速数学库:pyculib
NVIDIA还通过GPU加速实现了标准的数学算法。pyculib项目提供了许多这些算法的Python包,包括:
1.线性代数。
2.快速傅立叶变换。
3.稀疏矩阵。
4.随机数生成。
5.排序。
这些Python包采用标准的NumPy数组,并为你处理来自GPU的所有副本。请注意,由于复制开销,你可能会发现这些函数没有比NumPy更快的小阵列。性能也很大程度上取决于你使用的GPU类型和数组数据类型。使用GeForce显卡时,float32类型比float64(NumPy默认)要快得多。
5.GPU内核编程:Numba
对于想要深入研究GPU编程细节的人来说,Numba是一个不错的选择。Numba是开放源代码Python编译器,其中包括适用于CPU和GPU目标的即时编译工具。它不仅编译用于在CPU上执行的Python函数,还包括一个完全的Python本机API,用于通过CUDA驱动程序对NVIDIA GPU进行编程。在GPU上运行的代码也是用Python编写的,并且内置了支持将NumPy数组发送到GPU并使用熟悉的Python语法访问它们的支持。
Numba的GPU支持是可选的,所以要启用它,你需要安装Numba和CUDA工具包conda软件包:
conda install numba cudatoolkit
CUDA编程模型基于两级数据并行性概念。在GPU上启动“内核函数”,同时执行相同的函数的“网格”(通常是数千个)线程。网格由许多相同的线程块组成,块内的线程能够比不同块中的线程更容易地同步和共享数据。这种编程风格与传统的CPU上的多线程编程有很大不同,它针对“数据并行”算法进行了优化,每个线程同时运行相同的指令,但具有不同的输入数据元素。CUDA编程指南的前几章对如何使用CUDA给予了很好的讨论。一旦熟悉了CUDA编程模型,下一步应该是2017 GPU技术大会上我们教程中的Jupyter笔记本。笔记本涵盖了使用Python编程GPU的基本语法,还包括更多高级主题,如ufunc创建,内存管理和调试技术。
6.GPU数据框:PyGDF
GPU Dataframe(简称“GDF”)概念是Anaconda与GPU Open Analytics Initiative的其他成员共同开发的。GDF是Apache Arrow格式的数据帧,存储在GPU内存中。由于在CUDA驱动程序中支持在进程之间传输GPU内存部分,所以通过对GPU加速数据库(如MapD)的查询创建的GDF可以直接发送到Python解释器,在该解释器中可以执行该数据帧的操作,然后可以将数据移动到像H2O这样的机器学习库中,所有这些都不需要从GPU上取下数据。
对Python Dataframe的Python支持由PyGDF项目提供,我们从2017年3月开始一直致力于PyGDF项目。它提供了用于在GPU数据帧上运行的Pandas API的子集,使用GPU的并行计算能力(以及Numba JIT )用于排序,柱状数学,缩减,过滤器,连接和按操作分组。
结论:
我只介绍了关于GPU的冰山一角,但是希望上面提到的能激励你深入了解。下面
下载Anaconda发行版:https://www.anaconda.com/download/
Keras教程:https://github.com/fchollet/keras-resources
Pyculib文档:http://pyculib.readthedocs.io/
从GTC 2017 Numba GPU教程:https://github.com/ContinuumIO/gtc2017-numba
Parallel Forall博客中有关Numba的七件事:
https://devblogs.nvidia.com/parallelforall/seven-things-numba/
GPU Open Analytics Initiative主页:http://gpuopenanalytics.com/
Stanley selbert, Stan领导着Anaconda的社区创新团队,他的工作重点是高性能GPU计算和设计数据分析
本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。
文章原标题《Getting started with GPU Computing in Anaconda》
作者:Stanley selbert译者:虎说八道,审阅: