人工智能 (AI) 将改变全球生产力、工作模式和生活方式,并创造巨大的财富。研究公司 Gartner 预计,到2022 年,全球人工智能经济将从去年的约 1.2 万亿美元增加到约3.9 万亿美元。在许多方面,这种转变的核心是强大的机器学习 (ML) 工具和技术。
现在已经确定,现代 AI/ML 系统的成功在很大程度上取决于它们使用任务优化硬件以并行方式处理大量原始数据的能力。因此,图形处理单元 (GPU) 等专用硬件的使用在这一早期成功中发挥了重要作用。从那时起,人们非常重视构建高度优化的软件工具和定制的数学处理引擎(硬件和软件),以利用 GPU 和并行计算的能力和架构。
虽然在学术界和商业界广泛讨论使用 GPU 和分布式计算来处理核心 AI/ML 任务(例如运行 100 层深度神经网络进行图像分类或十亿参数 BERT 语音合成模型),但他们发现覆盖率较低当谈到它们在常规数据科学和数据工程任务中的效用时。这些与数据相关的任务是 AI 管道中任何 ML 工作负载的重要先导,它们通常占数据科学家甚至 ML 工程师花费的时间和智力工作的大部分。
事实上,最近,著名的人工智能先驱 Andrew Ng 谈到了从以模型为中心到以数据为中心的人工智能工具开发方法。这意味着在实际的 AI 工作负载在您的管道上执行之前,需要花费更多时间处理原始数据并对其进行预处理。
我们是否也可以将 GPU 和分布式计算的强大功能用于常规数据处理工作?
答案并非微不足道,需要一些特殊的考虑和知识共享。在本文中,我们将尝试展示一些可用于此目的的工具和平台。
RAPIDS:利用 GPU 进行数据科学
该RAPIDS的开源软件库和API套件给你完全在GPU的终端到终端的数据科学和分析管道的能力。NVIDIA 孵化了这个项目并构建了工具来利用 CUDA 原语进行低级计算优化。它特别专注于通过所有数据科学家和分析专业人士流行的友好 Python 语言来展示 GPU 并行性和高带宽内存速度特性。
常见的数据准备和整理任务在 RAPIDS 生态系统中受到高度重视,因为它们在典型的数据科学管道中占用了大量时间。已经开发了一个熟悉的数据框架,如 API,内置了大量优化和健壮性。它还被定制为与各种 ML 算法集成,以实现端到端管道加速,并产生序列化成本。
RAPIDS 还包括对多节点、多 GPU 部署和分布式处理的大量内部支持。它与其他库集成,使内存不足(即数据集大小大于个人计算机 RAM)数据处理对于个人数据科学家来说变得容易和访问。
以下是 RAPIDS 生态系统中最突出的库。
CuPy
一个 CUDA 驱动的数组库,外观和感觉都像 Numpy,是所有数值计算和 Python 机器学习的基础。它使用CUDA相关库,包括cuBLAS、cuDNN、cuRand、cuSolver、cuSPARSE、cuFFT和NCCL,充分利用GPU架构,目标是用Python提供GPU加速计算。
CuPy 的界面与 NumPy 的界面高度相似,可以用作大多数用例的简单替代品。下面是 CuPy 和 NumPy 之间 API 兼容性的模块级详细列表。
查看CuPy 比较表。
根据数据类型和用例,NumPy 的加速可能令人难以置信。这是 CuPy 和 NumPy 之间针对两种不同数组大小和各种常见数值运算(FFT、切片、求和和标准差、矩阵乘法、SVD)之间的加速比较,这些运算几乎被所有 ML 算法广泛使用。
cuDF
cuDF基于Apache Arrow列式内存格式构建,是一个 GPU DataFrame 库,用于加载、连接、聚合、过滤和以其他方式操作数据。它提供了几乎所有数据工程师和数据科学家都熟悉的类似 Pandas 的 API,因此他们可以使用它来使用强大的 GPU 轻松加速他们的工作流程,而无需深入了解 CUDA 编程的细节。
目前,cuDF 仅在 Linux 和 Python 3.7 及更高版本上受支持。其他要求是,
CUDA 11.0+
NVIDIA 驱动程序 450.80.02+
Pascal 架构或更好(计算能力 >=6.0)
在CuDF的API 文档中查看有关此强大库的更多信息。
最后,数据科学家和分析师(即那些不一定在他们的任何日常任务中使用深度学习的人)可以欣喜若狂并使用如下强大的 AI 工作站来提高他们的生产力。
cuML
cuML 使数据科学家、分析师和研究人员能够在 GPU 上使用(主要是)表格数据集运行传统/经典 ML 算法任务,而无需深入了解 CUDA 编程的细节。在大多数情况下,cuML 的 Python API 与流行的 Python 库 Scikit-learn 的 API 相匹配,可以快速轻松地过渡到 GPU 硬件。
查看CuML文档的GitHub 存储库以了解更多信息。
CuML 还尽可能与Dask集成,为利用此类分布式处理的不断增加的算法集提供多 GPU 和多节点 GPU 支持。
CuGraph
CuGraph是GPU加速图算法的集合,用于处理GPU DataFrames中的数据。cuGraph 的愿景是让图分析无处不在,让用户只从分析的角度思考,而不是技术或框架。
熟悉 Python 的数据科学家将很快了解 cuGraph 如何与 cuDF 的类似 Pandas 的 API 集成。同样,熟悉 NetworkX 的用户将很快识别出 cuGraph 中提供的类似 NetworkX 的 API,其目标是允许以最少的努力将现有代码移植到 RAPIDS 中。
目前,它支持各种图形分析算法,包括:
中心性
社区
链接分析
链接预测
遍历
许多科学和商业分析任务涉及在大型数据集上使用广泛的图形算法。像 cuGraph 这样的库为那些投资于 GPU 驱动的工作站的工程师提供了更高的生产力保证。
GPU 数据科学的整体管道
RAPIDS 为 GPU 驱动的数据科学任务流设想了一个完整的管道,如下所示。请注意,传统上一直是基于 GPU 的计算的主要焦点的深度学习只是该系统的一个子组件。
Dask:使用 Python 进行分布式分析
正如我们所观察到的,现代数据处理管道通常可以从大数据块的分布式处理中受益。这与单个 GPU 中数千个内核提供的并行性略有不同。这更多地是关于如何将普通数据处理(可能在数据集准备好用于 ML 算法之前发生)拆分为块并使用多个计算节点进行处理。
这些计算节点可以是 GPU 核心,也可以是简单的 CPU 逻辑/虚拟核心。
根据设计,Pandas、Numpy 和 Scikit-learn 等最广泛流行的数据科学库无法轻松利用真正的分布式处理。Dask 试图通过将智能任务调度和大数据块处理的特性引入常规 Python 代码来解决这个问题。
当然,它由两部分组成:
为计算优化的动态任务调度。这类似于 Airflow、Luigi、Celery 或 Make,但针对交互式计算工作负载进行了优化。
“大数据”集合,如并行数组、数据帧和列表,将通用接口(如 NumPy、Pandas 或 Python 迭代器)扩展到大于内存或分布式环境。这些并行集合运行在上述动态任务调度程序之上。
这是典型的 Dask 任务流程的说明图:
易于转换现有代码库
熟悉是 Dask 设计的核心,因此典型的数据科学家可以选择他/她现有的基于 Pandas/Numpy 的代码库,并按照最小的学习曲线将其转换为 Dask 代码。以下是他们官方文档中的一些规范示例。
Dask-ML 应对可扩展性挑战
ML 工程师面临着不同类型的可扩展性挑战。下图说明了它们。机器学习库 Dask-ML 为这些场景中的每一个提供了一些东西。因此,可以根据独特的业务或研究需求,专注于以模型为中心的探索或以数据为中心的开发。
最重要的是,在这里再次强调熟悉度,DASK-ML API 旨在模仿广受欢迎的 Scikit-learn API。
多核 CPU 系统的 Dask 优势
需要注意的是,Dask 的主要吸引力来自它作为高级、高效的任务调度程序的角色,它可以与任何 Python 代码或数据结构一起工作。因此,它不依赖于 GPU 来通过分布式处理来提升现有的数据科学工作负载。
如果编写代码专注于 Dask,即使是多核 CPU 系统也可以充分利用 Dask。不需要对代码进行重大更改。
您可以使用 Dask 在笔记本电脑的多个内核之间分配凸优化例程或超参数搜索。或者,您可以使用完整的多核并行处理基于某些过滤标准的简单 DataFrame 的不同部分。这开辟了提高所有数据科学家和分析师生产力的可能性,他们不需要为他们的机器购买昂贵的图形卡,而只需投资于具有 16 或 24 个 CPU 内核的工作站。
GPU 驱动的分布式数据科学总结
在本文中,我们讨论了 Python 数据科学生态系统中一些令人兴奋的新发展,这些发展使普通数据科学家、分析师、科学研究人员、学者能够使用 GPU 驱动的硬件系统来执行更广泛的数据相关任务,而不仅仅是涉及图像分类和自然语言处理。
这肯定会扩大此类硬件系统对这些大部分用户的吸引力,并使数据科学用户群更加民主化。我们还探讨了使用 Dask 库进行分布式分析的可能性,该库可以利用多核 CPU 工作站。
希望这种强大的硬件和现代软件堆栈的融合将为高效的数据科学工作流程开辟无限的可能性。