深度神经网络 (DNN) 处于机器学习领域的前沿。这些算法在 20 世纪 90 年代后期得到了行业的广泛采用,最初应用于诸如银行支票手写识别等任务。深度神经网络在这一任务领域已得到广泛运用,达到甚至超过了人类能力。如今,DNN 已用于图像识别、视频和自然语言处理以及解决复杂的视觉理解问题,如自主驾驶等。DNN 在计算资源及其必须处理的数据量方面要求非常苛刻。就这一点而言,现代图像识别拓扑 AlexNet 需要几天的时间在现代计算系统中进行训练,并使用超过 1,400 万张图像。消除这种复杂性需要使用经过良好优化的构建模块来缩短训练时间,以满足工业应用的需求。
英特尔® 数学核心函数库(英特尔® MKL)2017 引入了 DNN 域,它包含加速最常用的图像识别拓扑(包括 AlexNet、VGG、GoogleNet 和 ResNet)所需的功能。
这些 DNN 拓扑依靠大量的标准构建模块或基元,这些构建模块或基元以称为张量的多维集的形式对数据进行预算。这些基元包括卷积、归一化、激活和内积函数,以及处理张量所需的函数。在英特尔架构上高效执行计算需要通过向量化利用 SIMD 指令并通过线程利用多个计算内核。向量化非常重要,因为现代处理器在最多 512 位长(16 个单精度数字)的数据向量上进行运算,并且每个周期最多可执行两个乘法和加法(融合乘加或 FMA)运算。利用矢量化需要将数据连续定位在内存中。由于张量的尺寸通常较小,所以更改数据布局会带来巨大的开销;我们设法在拓扑中执行所有运算,同时不更改不同基元的数据布局。
英特尔 MKL 为使用最广泛的运算(针对适用于矢量化的数据布局实施)提供了基元:
- 直接批量卷积
- 内积
- 池化:最大值、最小值、平均值
- 标准化:跨渠道的本地响应标准化 (LRN)、批次规标准化
- 激活:修正线性单元 (ReLU)
- 数据操作:多维转置(转换)、拆分、合并、求和和缩放。
编程模式
神经网络拓扑的执行流程包括两个阶段:设置和执行。在设置阶段,应用会为实施评分、训练或其他应用特定计算所需的所有 DNN 运算创建描述。为将数据从一个 DNN 运算传递到下一个运算,一些应用会创建中间转换,并在适当的输出和输入数据布局不匹配时分配临时数组。这个阶段在典型应用中执行一次,然后进行执行实际计算的多个执行阶段。
在执行步骤期间,数据在 BCWH(批处理、通道、宽度、高度)这样的平面布局中馈送到网络中,并转换为适用于 SIMD 的布局。当数据在层之间传播时,数据布局被保留,并在需要执行现有实施不支持的运算时进行转换。
英特尔 MKL DNN 基元实施了一个简单的 C 应用编程接口 (API),可用于现有 C/C++ DNN 框架。调用英特尔 MKL DNN 函数的应用应包括以下阶段:
设置阶段: 对于特定 DNN 拓扑,应用会为实施评分、训练或其他应用特定计算所需的所有 DNN 运算创建描述。为将数据从一个 DNN 运算传递到下一个运算,一些应用会创建中间转换,并在适当的输出和输入数据布局不匹配时分配临时数组。
执行阶段:在这一阶段,应用会调用将 DNN 运算(包括必要的转换)应用于输入、输出和临时数组的 DNN 基元。
针对训练和评分计算的适当示例可以在 MKL 包目录中找到:<mklroot>\examples\dnnc\source
性能
Caffe 是一种由 Berkeley Vision and Learning Center (BVLC) 开发的深度学习框架,是最热门的图像识别社区框架之一。连同 AlexNet(用于图像识别的神经网络拓扑)和 ImageNet(标记图像数据库),Caffe 通常作为基准使用。下图展示了原始 Caffe 实施和 英特尔优化版的性能对比,后者利用英特尔® 至强® 处理器 E5-2699 v4(代码为 Broadwell)和英特尔® 至强融核处理器™ processor 7250(代码为 Knights Landing)上优化的矩阵与矩阵乘法和新的英特尔 MKL 2017 DNN 基元。
总结
英特尔 MKL 2017 中的 DNN 基元可用于加速英特尔架构上的深度学习工作负载。如欲了解详细信息,请参阅 MKL 开发人员参考手册和示例。