您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
 
     
   
 订阅
  捐助
异构计算基础及机器学习领域涌现的异构加速技术
 
作者:顾钧
   次浏览      
 2020-4-17  
 
编辑推荐:
本文整体性的介绍了异构计算的定义,场景与局限性。将深入不同的 AI 应用场景进一步解释异构计算的优势.
本文来自于infoq.,由火龙果软件Anna编辑、推荐。

详诞生伊始,计算机处理能力就处于高速发展中。及至最近十年,随着大数据、区块链、AI 等新技术的持续火爆,人们为提升计算处理速度更是发展了多种不同的技术思路。大数据受惠于分布式集群技术,区块链带来了专用处理器(Application-Specific IC, ASIC)的春天,AI 则让大众听到了“异构计算”这个计算机界的学术名词。

“异构计算”(Heterogeneous computing),是指在系统中使用不同体系结构的处理器的联合计算方式。在 AI 领域,常见的处理器包括:CPU(X86,Arm,RISC-V 等),GPU,FPGA 和 ASIC。(按照通用性从高到低排序)

AI 是一门较为复杂、综合的学科。在只有 CPU 平台的情况下,AI 开发者要学习的算法、模型、框架、编程语言已经不少。如果再考虑多个不同处理器平台,情况会变得更为复杂。在展开讨论不同的应用场景之前,我们先了解一下什么是“异构计算”。

异构计算

首先需要明确的是,计算机体系结构≠硬件架构。体系结构不单包括硬件层面的实现,也包括软件层面的考量。当 IBM 在 S/360 服务器中提出体系结构这个概念之前,每一代 IBM 服务器的硬件实现都会有所不同(其实今日的处理器硬件亦是如此)。由此带来了各不相同的指令,以至于开发者编写的软件无法在不同的 IBM 服务器上运行。

因此,经典的体系结构概念与软硬件的界面——指令集有比较大的关系。通常来讲,如果两个处理器都能支持同一套指令集,那么可以认为它们有相同的体系结构。好比 AMD 的 CPU 和 Intel 的 CPU 都属于 X86 CPU。

虽然异构计算能带来潜在的算力提升,但也会造成额外的开发成本。在进行异构计算开发之前,开发者需要进行几个方面的评估。

第一,权衡代码通用性与代码性能。

今天的 AI 开发者恐怕只在较少的情况下可能会直接使用指令集进行编程(例如,X86 CPU 的 AVX2 指令等),绝大多数情况下,我们用到的主要是些程序库。然而程序库在不同平台上的实现依旧需要调用底层的指令集。在 AI 这样需要高性能编程的领域,常用的 BLAS (Basic Linear Algebra Subprograms) 程序库就有多种选择:

即便只使用 CPU 进行计算,依然会面临诸如 OpenBLAS 和 Intel MKL 之间的选择。开发者需要根据具体需求谨慎评估通用性与性能之间的优先级。AI 这些年虽然很火,但是 AI 应用收益与开发成本的矛盾也一直较为突出。

第二,考虑开发环境的成熟度。

虽然 AI 开发者可用的计算硬件有 CPU,GPU,FPGA,ASIC 等,目前开发环境比较成熟的是 CPU,GPU 和 FPGA。ASIC 在开发成熟度上目前较为尴尬,因为应用专有芯片的开发依赖于所瞄准的应用是否已经达到了一个比较成熟的阶段。而 AI 领域中,即便是最成熟的机器视觉(CV)也依然还在持续发展中。因此,ASIC 厂商要打造一个较为稳定的开发环境面临一定的挑战。

这也无怪乎年初知名的“矿业”公司爆出了 AI 芯片团队大规模裁员的消息。

第三,考虑技术普及程度。

越普及的技术硬件成本越低,人才储备也更为充足。这一点上, FPGA 就比较占劣势,毕竟一般人很少机会接触 FPGA 硬件。

因此,目前异构计算开发仍然以 CPU 结合 GPU 为主。

寻找异构计算场景

要真正发挥异构计算的优势,必须得寻找合适的场景。否则 GPU 等协处理器并不总是能带来性能的提升。我们先来回想一下 GPU 最典型、最擅长的应用场景——大型 3D 游戏是怎么样的:

把游戏数据载入显存

在用户游戏的过程中,显卡始终在进行高速运算

以上看起来好像是一段废话,但要理解 GPU 等协处理器的特点,这段废话值得反复回味。GPU 的优势场景在于:

一定量的数据。如果数据量太小,那么 GPU 可能会比 CPU 慢。如何判断这个临界点也很简单,可以利用 Python 的 Pandas dataframe 和 RAPIDS 的 cuDF 进行一个对比测试。

数据量不能太大,显存一定要装得下。一旦发生显存对外的 I/O(哪怕是内存和显存之间的),处理速度依然会受到很大影响。

需要有持续的工作流发送给 GPU 处理。计算核心更多的 GPU 启动代价比 CPU 高得多。

看似矛盾的第一点和第二点说明,要找到异构计算的优势场景并不容易。事实上,一个计算任务的处理时间包括计算与 I/O(CPU 访问内存也算在内)两部分。高算力的 AI 处理器可以帮你加速计算的部分,但碍于服务器架构,异构计算也会带来一些额外的 I/O 开销。因此,问题的关键在于一个程序的处理时间究竟是花在计算上更多,还是花在 I/O 上更多。

在 Linux 系统下,我们可以通过 perf 工具(Linux kernel profiling)来了解一个处理任务执行时的 CPU 计算繁忙程度。

(引用自: https://perf.wiki.kernel.org/index.php/Tutorial )

在上面的示例中,IPC(Instructions Per Second)仅为 0.679,要知道现代的 CPU 单核 IPC 理论峰值可以达到 10 。一般认为,运行时 IPC 如果低于 1,说明正在运行的工作流在 I/O(CPU 读取内存)上花的时间更多。在这种情况下,异构计算带来的提升就不太可能像硬件厂商宣传的那样达到 10 倍,甚至 100 倍。

前面提到“异构计算也会带来一些额外的 I/O 开销”。这主要受限于以 CPU 为核心的系统架构,其他协处理器只能通过 PCI/E 连接到系统。当需要把数据从硬盘载入到显存的时候:(假设使用 PCI/E 硬盘)

数据从硬盘经过 PCI/E 复制到内存

数据从内存经过 PCI/E 复制到显存

在这种情况下,数据从硬盘载入显存的速度只有 PCI/E 传输速度的一半。为了解决这个问题,GPU 厂商开发了 GPUDirect Storage 技术,这样可以直接把数据从硬盘加载到显存。

(引用自: https://devblogs.nvidia.com/gpudirect-storage/ )

一般企业级计算显卡的显存大小为 16GB 或 32GB,而一般企业级 CPU 的内存上限可以达到 768GB 或 1TB。在海量数据的场景下,如何利用异构算力需要仔细的设计,不然异构计算产生的 I/O 开销可能会适得其反。

异构计算在 AI 中的应用

异构计算的优势与局限都非常突出。在 AI 的全流程中,开发者逐渐在以下阶段中找到了异构计算的场景。

数据准备阶段

不同于传统大数据应用,AI 应用的数据不但包括一般的结构化数据,也包含了大量非结构化数据(如图片、视频、声音、文本等)。针对海量结构化数据的处理,因为通常 I/O 占比远高于计算占比,因此这部分数据的处理依旧以 CPU 为主。不过,今天的 CPU 也提供了 AVX2 向量指令集进行 SIMD 计算(单指令多数据)。

但在非结构数据,尤其是图片、视频等的转解码处理上,异构芯片的优势还是比较明显。

模型训练、调优阶段

目前的深度学习模型主要是基于张量(tensor based)模型,很多 AI 处理器会着重加强自己的乘累加(MACC,基础的矩阵计算操作)处理能力。模型训练是整个 AI 流程中异构计算最为有优势的部分。GPU,TPU 和其他一些 ASIC 都能在这里发挥作用。

回想一下前文中讨论过的游戏场景,模型训练是不是和它很像呢?

运行时阶段

运行时的任务主要包括模型推理,向量相似度搜索等。

模型推理本身并不需要像模型训练那样进行大规模计算,但模型推理往往涉及多种不同类型的硬件部署平台。因此,模型推理中的异构计算首要任务不是融合算力,而是考虑代码的跨平台通用性以降低开发成本。业界已经有一些开源模型推理框架来解决代码的跨平台通用性问题,比如 Linux 基金会旗下的 Adlik 和 微软的 ONNX RT。

向量相似度搜索,是图片、视频搜索、推荐系统、问答系统中的常用技术。由于要搜索的特征向量规模往往会达到上亿甚至十亿级,搜索时的 I/O 比重很高,异构计算在搜索时的帮助会比较有限。但是在建立向量相似度索引时却是一个典型的计算密集型任务,异构计算能大幅提升索引创建速度。供开发者参考的开源项目有 Facebook Faiss、Spotify Annoy、NMSLIB 以及 Linux 基金会旗下的 Milvus 等。

机器学习与异构计算

在机器学习领域,异构计算技术的应用是近年来备受产业界和学术界关注的话题。在数据高速增长的背景下,异构计算技术是提升机器学习应用开发流程中“人”与 “机”的效率的重要途经。本文将结合机器学习应用的开发闭环对近期涌现的相关异构加速技术进行介绍。

如上图所示,机器学习应用的开发闭环包括数据整合、特征提取、模型的设计、训练和验证等多个环节。首先需要对原始数据进行汇聚整理,然后进行数据分析并提取数据特征作为模型输入。在模型设计环节,需要对模型类型、优化算法和配置参数进行选择。在模型训练完成后,需要数据科学家根据模型验证的结果对上游的各环节进行调整,例如补充新的数据源、扩展数据特征、调整模型的选择和参数设计,然后重新训练和验证模型,直到多次迭代之后得到令人满意的结果。

先谈谈上述流程中的“人”。“有多少人工就有多少智能”这个现象在生产应用中较为普遍。上述流程中存在大量的人工决策环节,需要数据科学家根据专业知识和经验进行合理决策。由于应用场景的多样性,通用的设计通常无法满足各种场景下对机器学习系统的特定需求。数据科学家需要结合实际问题,通过大量的观察分析以及多次的尝试和调优之后才能获得真正合适的设计。随着机器学习理论方法和应用场景的日益丰富,数据科学家正面临着前所未有的决策数量和难度。随着工作难度的增加,人力对机器学习系统开发效率的影响也将逐渐增大,甚至成为整个流程的瓶颈。

再谈谈“机”。从机器效率角度上看,上述迭代过程中涉及到了大量的数据处理和计算操作。例如,在数据整合环节,涉及到多个数据源不同维度大量数据的关联分析和清洗操作。特征提取环节中原始数据的统计特征分析以及特征数据的构造和编码均需要进行大量的浮点运算和矩阵运算。而在模型训练和验证环节会涉及到机器学习模型的训练和推理计算,包含了大量的数值计算、矩阵运算和浮点运算操作。数据的飞速增长使得机器学习应用对计算机系统数据处理的性能要求日益严苛,上述环节的计算效率将直接影响到人工参与效率以及机器学习系统的整体迭代效率。

异构加速技术对“人”与“机”的效率带来了巨大的提升空间。当前的异构加速算法覆盖了数据整合、特征提取、模型训练等环节。与传统的基于 CPU 的算法相比,异构并行算法可获得一到两个数量级的加速,显著提升了机器的运算效率。另一方面,异构加速技术帮助数据科学家更快的获得运算结果,并可有效加速 AutoML 的解空间搜索过程,提高设计与调优效率。

下文将聚焦数据整合、特征提取、模型设计调优、模型训练四个环节,对其中涌现的新兴异构计算技术进行介绍。

数据整合

数据整合处于机器学习开发流程的上游,包括数据源整合,数据提取与数据清洗等工作。由于各应用场景差异较大,数据源与数据类型纷繁复杂,数据整合阶段所涉及的方法与工具相当丰富。其中数据库、数据处理引擎、数据分析程序库扮演了重要角色,分别应对数据汇聚、对接、通用数据处理、定制化数据处理等任务。

数据库方面,ZILLIZ 面向 PostgreSQL 生态推出了 GPU 分析引擎 MegaWise [1][2],阿里巴巴在 AnalyticDB [3] 中提供了 GPU 加速能力,BlazingSQL [4] 基于 RAPIDS [5] 构建了 GPU 加速的 SQL 分析引擎。近期在数据库领域涌现的异构加速技术集中于 AP 方面,这些新型分析引擎对于数据加载、变换、过滤、聚合、连接等特定负载获得了十倍至百倍的加速效果。

数据处理引擎方面,Spark3.0 将引入对 GPU 的调度支持 [6]。此外,在预览版中,也看到 SparkR 以及 SparkSQL 引入了列式处理模式。异构计算资源调度与列式处理这两项内容为 Spark 核心组件的异构加速工作奠定了良好的基础。此外,也为有定制需求的高级用户提供了异构加速 UDF 的条件。

数据分析程序库方面,英伟达推出 cuDF [7]。自 0.10 版本以来,开启了一轮大规模重构,在持续提升底层库性能的同时,对 Python 层的 API 也进行了扩展。截止目前 0.13 版本,逐步完成了一套类 Pandas API。目前接口成熟度可支撑 Pandas 与 cuDF 的协同数据处理。

特定数据类型处理方面,OpenCL 提供了图像处理的 GPU 加速能力 [8],英伟达在 cuStrings [9] 项目中提供了面向字符串的 GPU 加速处理函数库,ZILLIZ 在其即将开源的 Arctern 项目中将推出面向地理信息数据处理的 GPU 加速引擎 [10]。

特征提取

特征提取过程对原始数据中的关键信息进行提取并编码成结构化数据,其结果将作为模型的输入数据参与模型的训练和验证过程。特征提取过程涉及的计算操作主要包含数据的特征分析、变换和选取,例如均值、方差、协方差、相关系数等统计特征的计算,归一化、白化等数据变换操作,以及 PCA、SVD 等特征选取操作。上述操作普遍涉及到对大量数据进行相同或相似的处理过程,适合采用异构加速技术提升计算效率。

数据统计特征分析方面,cuDF [11] 提供了对最值、期望、方差、峰度、偏度等常用统计量的计算接口。此外,cuDF 还支持 UDF,通过 JIT 技术将 UDF 编译成 cuda kernel 在 GPU 中执行,从而实现用户自定义的数据特征分析。当前该功能相比 pandas UDF 能力较弱,仅支持数值型及布尔型计算。

数据变换方面,英伟达面向高维数据运算发布了 cuPy 项目。该项目使用 ndarray 结构对高维数据进行组织,并在此基础之上提供了大量的异构加速数据运算功能,其中包括傅里叶变换以及线性代数矩阵变换等常用数据变换功能。

特征选取方面,英伟达推出的 cuML 项目提供了一套异构加速的机器学习基础算法库。该项目自 2018 年发布以来持续地扩展对常用的机器学习算法的异构加速支持,当前包含了 SVD、PCA、UMAP、TSNE、Random Projection 等特征成分分析功能。

模型设计与调优

在提取特征之后,数据科学家们需要根据实际的机器学习问题以及训练数据的特征对机器学习模型经行设计和调优。模型设计包括对机器学习模型的类型、模型训练中求解优化问题的算法以及模型参数进行选择。在模型训练完成之后,还需要验证模型的结果准确度,并相应的对模型设计进行迭代调优。在传统的机器学习系统中,该环节完全由人进行决策,其效率严重依赖于数据科学家和算法工程师的专业知识和经验。

为了减少机器学习过程中对人力和专业知识的依赖,近年来学术界和产业界对 AutoML 相关技术投入了大量的关注和尝试。AutoML 致力于自动化完成模型设计,并根据模型验证结果对模型的设计空间进行自动搜索,从而达到近似最优的模型选择和配置。AutoML 减少了机器学习过程中的人工参与,从而有望提高机器学习迭代过程的效率。

当前尚未出现针对 AutoML 的异构加速项目或者算法库。然而,不论是人工还是自动化的模型设计都需要对模型的训练和验证过程进行大量迭代,在这方面异构计算技术已经被普遍用于计算过程的加速。

模型训练

机器学习的模型训练部分存在大量的运算密集型任务,其运算负载不仅取决于算法逻辑,也取决于训练集、数据集的量。随着数据的爆炸式增长,模型训练的任务负载也显著提升,传统的基于 CPU 的方案在性能、设备成本、能耗等几个方面迎来较大挑战。因此,异构加速技术成为解决上述挑战的重要途径,更高的模型训练速度也将直接提高模型迭代中人工环节的参与效率。

数据集处理方面,cuML 提供了 train_test_split,与 sklearn 中的接口行为类似,用于划分训练集和测试集。

算法方面,cuML 提供了一套 GPU 加速的 ML 算法包。在当前 0.13 版本中,常用算法如 linear regression, SGD, random forest, SVM, k-means 等都有涵盖,另外还提供了对时间序列预测分析的支持,包括 HoltWinters, kalman filter, ARIMA 三个模型。在早期版本中,受制于显存容量,cuML 对于大模型或大训练集的支持不尽人意。cuML 自 0.9 版本提供多节点 / 多卡方案(MNMG),当前已有的 MNMG 算法包括:K-means, SVD, PCA,KNN,random forest。

基于树的算法方面,XGBoost 早在 16 年底就开始了算法的 GPU 加速工作,并于 17 年支持多卡。cuML 在近期的版本中也对基于树的算法进行了性能优化 [12],自 0.10 版本提供与 XGBoost GPU 加速算法的对接支持 [13]。

总结与展望

异构计算在机器学习应用的开发闭环中对于提高“人”与“机”的效率展现出巨大潜力,部分库、系统与产品已经应用于生产环境。但异构计算技术在人工智能领域仍处于快速发展期,进一步丰富工具链以及完善与已有生态的整合是异构计算技术加速落地的重要挑战。当前异构计算技术的主要推动力是英伟达等技术巨头,也涌现出一批如 ZILLIZ、Kinetica、OmniSci 等新兴技术团队,主流的计算框架如 Spark 等也逐步提高对异构计算的原生支持。可以预见,异构计算将成为人工智能应用领域的重要技术趋势,在提高产品演进效率、降低设备与人工成本方面发挥至关重要的作用。

   
次浏览       
相关文章

基于图卷积网络的图深度学习
自动驾驶中的3D目标检测
工业机器人控制系统架构介绍
项目实战:如何构建知识图谱
 
相关文档

5G人工智能物联网的典型应用
深度学习在自动驾驶中的应用
图神经网络在交叉学科领域的应用研究
无人机系统原理
相关课程

人工智能、机器学习&TensorFlow
机器人软件开发技术
人工智能,机器学习和深度学习
图像处理算法方法与实践