英特尔® MKL-DNN:第一部分 – 库的概述和安装

简介

目前,在大型数据集、高度并行化的处理能力和增强设备智能性的需求的推动下,深度学习成为了计算机科学领域最受关注的热点话题之一。根据维基百科的描述,深度学习是机器学习 (ML) 的一个子集,由模拟高级别数据抽象的算法构成。如图 1 所示,机器学习是人工智能 (AI) 的一个子集,人工智能的研究范围非常广泛,其目标是开发模拟人类智能的计算机系统。


图 1.深度学习和人工智能的关系。

英特尔积极致力于深度学习领域的研究,为了充分利用英特尔® 架构 (IA) 而优化了常用的框架(如 Caffe* 和 Theano*),创建了高级别工具(如面向数据科学家的英特尔® 深度学习 SDK),还为开发人员社区提供了强大的软件库,如英特尔® 数据分析加速库(英特尔® DAAL)面向深度神经网络的英特尔® 数学核心函数库(英特尔® MKL-DNN)

英特尔 MKL-DNN 是一个开源的性能增强库,能够提高在英特尔架构上运行的深度学习框架的速度。对深度学习感兴趣的软件开发人员可能听说过英特尔 MKL-DNN,但是有可能未曾使用过它。

英特尔 MKL-DNN 教程系列的开发人员简介从开发人员的角度介绍了英特尔 MKL-DNN。第一部分提供了丰富的资源,详细介绍了如何安装和构建库组件。教程系列的第二部分介绍了如何配置 Eclipse* 集成开发环境,以创建 C++ 代码示例,还提供了源代码演示。

英特尔® MKL-DNN 概述

如图 2 所示,英特尔 MKL-DNN 专为在英特尔架构上加快深度学习框架的速度而设计,包含了高度矢量化和线程化的构建模块,支持利用 C 和 C++ 接口实施卷积神经网络。


图 2.英特尔架构上的深度学习框架。

英特尔 MKL-DNN 主要在以下对象上运行:基元、引擎和流。库文档对这些对象的定义如下所示:

  • 基元 - 任何操作,包括卷积、数据格式重新排序和内存。基元可以以其他基元为输入,但是智能输出内存基元。
  • 引擎 - 一种执行设备,如 CPU。每个基元都映射为特定的引擎。
  • - 一种执行环境,将基元提交至流后等待完成。提交至流的基元可能有不同的引擎。流对象也可以跟踪基元间的相关性。

典型的工作流程创建一系列基元,将基元传输至流进行处理,并等待处理的完成。如欲获取关于编程模式的更多信息,请查看英特尔 MKL-DNN 文档

资源

您可以通过互联网获取关于英特尔 MKL-DNN 的实用资源,了解英特尔 MKL-DNN 的功能和限制以及将它集成至深度学习项目所带来的预期效果。

GitHub 存储库

英特尔 MKL-DNN 是一款面向深度学习应用的开源性能库,库中包含一些构建模块,用于实施带 C 和 C++ 接口的卷积神经网络 (CNN),可以在 GitHub* 上免费下载。

关于 GitHub 网站需要注意的是,尽管英特尔 MKL-DNN 和英特尔® 数学核心函数库(英特尔® MKL)2017 的功能相似,但是前者不兼容 API。在撰写本文时,英特尔 MKL-DNN 发布了技术预览版,添加了加快图像识别拓扑(如 AlexNet* 和 VGG*)速度所需的功能。

英特尔开源技术中心

MKL-DNN|01.org 项目微型网站是英特尔开源技术中心的成员,该技术中心的名称为 01.org,参加过各种开源项目的英特尔工程师都参与到该社区当中来。该网站包含英特尔 MKL-DNN 项目概述,如何参加项目与实施项目的信息,还提供一篇内容丰富的博文“面向神经网络的英特尔® 数学核心函数库(英特尔® MKL-DNN)简介”(作者:Kent Moffat)。

安装英特尔 MKL-DNN

本章节详细介绍了安装和构建英特尔 MKL-DNN 库组件的逐步说明,进一步解释了 GitHub 存储库网站上提供的安装信息。您的电脑必须配备支持英特尔® 高级矢量扩展指令集 2(英特尔® AVX2)的英特尔® 处理器。英特尔 MKL-DNN 专门面向英特尔® 至强® 处理器和英特尔® 至强融核™ 处理器优化。

GitHub 指出软件在 RedHat* Enterprise Linux* 7 上验证,但是本教程提供的信息是关于在运行 Ubuntu* 16.04 的系统上进行开发。

安装关联组件

英特尔 MKL-DNN 包含以下关联组件:

  • CMake* – 一款用于创建、测试和打包软件的跨平台工具。
  • Doxygen* – 一款从自动源代码中生成文档的工具。

如果您的电脑没有安装这些软件工具,可以输入以下命令进行安装:

sudo apt install cmake

sudo apt install doxygen

下载并创建源代码

打开终端并输入以下命令,便可从 GitHub 存储库复制英特尔 MKL-DNN 库:

git clone https://github.com/01org/mkl-dnn.git

注:如果您的电脑没有安装 Git*,可以输入以下命令进行安装:

sudo apt install git

安装完成后,您会在 Home 目录下发现一个 mkl-dnn 目录。输入以下命令转至目录:

cd mkl-dnn

GitHub 存储库网站是这样说明的:英特尔 MKL-DNN 使用了英特尔 MKL 中的经过优化的一般矩阵乘法 (GEMM) 函数。存储库还包含支持这个功能的库,运行 scripts 目录中的 prepare_mkl.sh 脚本进行下载:

cd scripts && ./prepare_mkl.sh && cd ..

这个脚本创建了一个名为 external 的目录,然后下载并提取库文件至 mkl-dnn/external/mklml_lnx* 目录。

mkl-dnn 目录中执行下一条命令,通过命令创建了一个 build 子目录,并运行 CMakeMake,以生成构建系统:

mkdir -p build && cd build && cmake ..&& make

验证构建

为了验证构建,从 mkl-dnn/build 目录中执行以下命令:

make test

这个步骤执行了一系列验证构建的单元测试。全部测试均应显示通过 (Passed),处理时间如图 3 所示。


图 3.测试结果。

库文档

可以在线获取英特尔 MKL-DNN 文档。从 mkl-dnn/build 目录中执行以下命令,也可以在系统中本地生成这个文档:

make doc

完成安装

执行 mkl-dnn/build 目录中的以下命令,完成英特尔 MKL-DNN 的安装:

sudo make install

以下命令将在 /usr/local 目录中安装库和其他组件,这些组件是开发面向英特尔 MKL-DNN 的应用所必需的:

共享库 (/usr/local/lib):

  • libiomp5.so
  • libmkldnn.so
  • libmklml_intel.so

标头文件 (/usr/local/include):

  • mkldnn.h
  • mkldnn.hpp
  • mkldnn_types.h

文档 (/usr/local/share/doc/mkldnn):

  • 英特尔许可和版权声明
  • 构成 HTML 文档的各种文件(在 /reference/html 之下)

在命令行上创建代码示例

GitHub 存储库包含 C 和 C++ 代码示例,展示了如何创建包含卷积、修正线性单元、本地响应标准化和池化的神经网络拓扑模块。以下章节介绍了如何在 Linux 中利用命令行创建代码示例。教程系列的第二部分展示了如何面向创建和扩展 C++ 代码示例而配置 Eclipse 集成开发环境。

C++ 示例命令行构建 (G++)

为了创建包含在英特尔 MKL-DNN 存储库中的 C++ 示例程序 (simple_net.cpp),首先转至 examples 目录:

cd ~/mkl-dnn/examples

然后,为可执行代码创建一个目标目录:

mkdir –p bin

通过连接英特尔 MKL-DNN 共享库和指定以下输出目录,创建 simple_net.cpp 示例:

g++ -std=c++11 simple_net.cpp –lmkldnn –o bin/simple_net_cpp


图 4.使用 G++ 的 C++ 命令行构建。

转至 bin 目录并运行可执行代码:

cd bin

./simple_net_cpp

使用 GCC 的 C 示例命令行构建

为了创建包含在英特尔 MKL-DNN 存储库中的 C 示例应用 (simple_net.c),首先转至 examples 目录:

cd ~/mkl-dnn/examples

然后,为可执行代码创建一个目标目录:

mkdir –p bin

通过连接英特尔 MKL-DNN 共享库和指定以下输出目录,创建 simple_net.c 示例:

gcc –Wall –o bin/simple_net_c simple_net.c -lmkldnn


图 5.利用 GCC 的 C 命令行构建。

转至 bin 目录并运行可执行代码:

cd bin

./simple_net_c

完成后,C 应用将向终端输出通过 (passed) 或失败 (failed)。

后续步骤

此时您已经成功安装了英特尔 MKL-DNN 库,执行了单元测试,并且创建了存储库所提供的示例程序。英特尔 MKL-DNN 开发人员简介的第二部分介绍了如何配置 Eclipse 集成开发环境,以创建 C++ 代码示例,还提供了代码演示。

有关编译器优化的更完整信息,请参阅优化通知