异构计算系列文章(一):定义、场景及局限性

做者 | 顾钧php

2020 开年,ZILLIZ 与 InfoQ 筹备了以异构计算为专题的一系列文章。此篇文章做为异构计算专题的开篇,总体性的介绍了异构计算的定义、场景与局限性。在后续的专题文章中,咱们将深刻不一样的 AI 应用场景进一步解释异构计算的优点。

诞生伊始,计算机处理能力就处于高速发展中。及至最近十年,随着大数据、区块链、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 游戏是怎么样的:

  1. 把游戏数据载入显存
  2. 在用户游戏的过程当中,显卡始终在进行高速运算

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

  1. 必定量的数据。若是数据量过小,那么 GPU 可能会比 CPU 慢。如何判断这个临界点也很简单,能够利用 Python 的 Pandas dataframe 和 RAPIDS 的 cuDF 进行一个对比测试。
  2. 数据量不能太大,显存必定要装得下。一旦发生显存对外的 I/O(哪怕是内存和显存之间的),处理速度依然会受到很大影响。
  3. 须要有持续的工做流发送给 GPU 处理。计算核心更多的 GPU 启动代价比 CPU 高得多。

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

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

(引用自:https://perf.wiki.kernel.org/...

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

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

  1. 数据从硬盘通过 PCI/E 复制到内存
  2. 数据从内存通过 PCI/E 复制到显存

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

(引用自:https://devblogs.nvidia.com/g...

通常企业级计算显卡的显存大小为 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 等。

做者简介:

顾钧,毕业于北京大学,在数据库相关领域有 15 年经验。目前任职于 ZILLIZ,负责 Milvus 开源向量搜索引擎的社区建设与推广。

本专题为ZILLIZ 与infoQ 的合做专题 ,文章出处请见:

异构计算系列文章(一):定义、场景及局限性-InfoQ​www.infoq.cn

相关文章
相关标签/搜索