Intel® MKL-DNN:第一部分 – 库概述和安装。
“Intel MKL-DNN 开发人员入门”系列教程将从开发人员的视角审视 Intel MKL-DNN。第一部分将介绍相关信息资源,并提供有关如何安装和构建库组件的详细说明。
引言
如今,深度学习已成为计算机科学领域最热门的主题之一,这得益于海量数据集、强大的并行处理能力以及构建日益智能的设备的驱动力。Wikipedia 将深度学习描述为机器学习 (ML) 的一个子集,它由模拟数据中高级抽象的算法组成。如图 1 所示,ML 本身又是人工智能 (AI) 的一个子集,AI 是一个广泛的研究领域,致力于开发旨在模仿人类智能的计算机系统。
英特尔一直积极投身于深度学习领域,通过优化 Caffe* 和 Theano* 等流行框架来充分利用英特尔®架构 (IA) 的优势,创建面向数据科学家的 Intel® Deep Learning SDK 等高级工具,并向开发者社区提供 Intel® Data Analytics Acceleration Library (Intel® DAAL) 和 Intel® Math Kernel Library for Deep Neural Networks (Intel® MKL-DNN) 等软件库。
Intel MKL-DNN 是一个开源的、性能增强型库,用于在 IA 上加速深度学习框架。对深度学习主题感兴趣的软件开发者可能听说过 Intel MKL-DNN,但也许还没有机会亲身体验。
“Intel MKL-DNN 开发人员入门”系列教程将从开发人员的视角审视 Intel MKL-DNN。第一部分将介绍相关信息资源,并提供有关如何安装和构建库组件的详细说明。本教程系列的第二部分将介绍如何配置 Eclipse* 集成开发环境来构建 C++ 代码示例,并包含源代码的讲解。
Intel® MKL-DNN 概述
如图 2 所示,Intel MKL-DNN 旨在加速 IA 上的深度学习框架。它包含高度矢量化和多线程的构建块,用于实现带 C 和 C++ 接口的卷积神经网络。
Intel MKL-DNN 操作以下主要对象类型:primitive、engine 和 stream。这些对象在库的文档中定义如下:
- Primitive - 任何操作,包括卷积、数据格式重排和内存。Primitive 可以以其他 Primitive 作为输入,但只能以内存 Primitive 作为输出。
- Engine - 执行设备,例如 *CPU*。每个 Primitive 都映射到一个特定的 Engine。
- Stream - 执行上下文;您将 Primitive 提交到 Stream 并等待其完成。提交到 Stream 的 Primitive 可以具有不同的 Engine。Stream 对象还会跟踪 Primitive 之间的依赖关系。
典型的流程是创建一个 Primitive 集合,将它们推送到 Stream 进行处理,然后等待完成。有关编程模型的更多信息,请参阅 Intel MKL-DNN 文档。
资源
网上有很多信息资源,介绍了 Intel MKL-DNN 是什么、不是什么,以及开发者将其集成到自己的深度学习项目中可以实现的目标。
GitHub 存储库
Intel MKL-DNN 是一个开源库,可在 GitHub* 上免费下载,其中将其描述为一个用于 DL 应用程序的性能库,包含带 C 和 C++ 接口的卷积神经网络 (CNN) 的实现构建块。
GitHub 网站上的一个重要提示是,尽管 Intel MKL-DNN 库包含与 Intel® Math Kernel Library (Intel® MKL) 2017 类似的功能,但**它不兼容 API**。在撰写本文时,Intel MKL-DNN 发布版是一个技术预览版,实现了加速 AlexNet* 和 VGG* 等图像识别拓扑所需的全部功能。
Intel 开源技术中心
MKL-DNN|01.org 项目微型网站是 Intel 开源技术中心(称为 01.org)的一个成员。01.org 是一个由英特尔工程师支持的社区,他们参与各种开源项目。您可以在这里找到 Intel MKL-DNN 项目的概述、如何参与和贡献其发展的相关信息,以及 Kent Moffat 撰写的题为“Intel® Math Kernel Library for Deep Neural Networks (Intel® MKL-DNN) 介绍”的介绍性博客。
安装 Intel MKL-DNN
本节将通过提供安装和构建 Intel MKL-DNN 库组件的详细分步说明,来阐述 GitHub 存储库网站上提供的安装信息。您使用的计算机需要一个支持 Intel® Advanced Vector Extensions 2 (Intel® AVX2) 的 Intel® 处理器。具体来说,Intel MKL-DNN 针对 Intel® Xeon® 处理器和 Intel® Xeon Phi™ 处理器进行了优化。
GitHub 指出该软件已在 RedHat* Enterprise Linux* 7 上得到验证;然而,本教程中的信息是在运行 Ubuntu* 16.04 的系统上开发的。
安装依赖项
Intel MKL-DNN 具有以下依赖项:
如果您的计算机上尚未安装这些软件工具,可以通过键入以下命令来安装:
sudo apt install cmake
sudo apt install doxygen
下载并构建源代码
通过打开终端并键入以下命令,从 GitHub 存储库克隆 Intel MKL-DNN 库:
git clone https://github.com/01org/mkl-dnn.git
注意:如果您的计算机上尚未安装 Git*,可以通过键入以下命令来安装:
sudo apt install git
安装完成后,您将在主目录中找到一个名为 *mkl-dnn* 的目录。通过键入以下命令导航到此目录:
cd mkl-dnn
正如 GitHub 存储库网站上所述,Intel MKL-DNN 使用 Intel MKL 中的优化通用矩阵到矩阵乘法 (GEMM) 函数。支持此函数的库也包含在存储库中,可以通过运行位于 *scripts* 目录下的 *prepare_mkl.sh* 脚本来下载:
cd scripts && ./prepare_mkl.sh && cd ..
此脚本会创建一个名为 *external* 的目录,然后将库文件下载并解压到名为 *mkl-dnn/external/mklml_lnx** 的目录中。
下一个命令从 *mkl-dnn* 目录执行;它创建一个名为 *build* 的子目录,然后运行 *CMake* 和 *Make* 来生成构建系统:
mkdir -p build && cd build && cmake .. && make
验证构建
要验证您的构建,请从 *mkl-dnn/build* 目录执行以下命令:
make test
此步骤将执行一系列单元测试以验证构建。所有这些测试都应显示“Passed”(通过),并显示如图 3 所示的处理时间。
库文档
Intel MKL-DNN 的文档可在线上获取。也可以通过从 *mkl-dnn/build* 目录执行以下命令在本地系统上生成文档:
make doc
完成安装
通过从 *mkl-dnn/build* 目录执行以下命令来完成 Intel MKL-DNN 的安装:
sudo make install
下一步将在 */usr/local* 目录下安装开发 Intel 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*)
- Intel 许可和版权声明
- 构成 HTML 文档的各种文件(位于 */reference/html* 下)
在命令行构建代码示例
GitHub 存储库包含 C 和 C++ 代码示例,演示了如何构建一个由卷积、整流线性单元、局部响应归一化和池化组成的神经网络拓扑块。下一节将介绍如何在 Linux 命令行中构建这些代码示例。本教程系列的第二部分将演示如何配置 Eclipse 集成开发环境来构建 C++ 代码示例。
C++ 示例命令行构建 (G++)
要构建 Intel MKL-DNN 存储库中包含的 C++ 示例程序 (*simple_net.cpp*),请先转到 *examples* 目录:
cd ~/mkl-dnn/examples
接下来,为可执行文件创建一个目标目录:
mkdir –p bin
通过链接共享 Intel MKL-DNN 库并指定输出目录,如下所示构建 simple_net.cpp 示例:
g++ -std=c++11 simple_net.cpp –lmkldnn –o bin/simple_net_cpp
转到 *bin* 目录并运行可执行文件:
cd bin
./simple_net_cpp
使用 GCC 进行 C 命令行构建
要构建 Intel MKL-DNN 存储库中包含的 C 示例应用程序 (simple_net.c),请先转到 *examples* 目录:
cd ~/mkl-dnn/examples
接下来,为可执行文件创建一个目标目录:
mkdir –p bin
通过链接 Intel MKL-DNN 共享库并指定输出目录,如下所示构建 simple_net.c 示例:
gcc –Wall –o bin/simple_net_c simple_net.c -lmkldnn
转到 *bin* 目录并运行可执行文件:
cd bin
./simple_net_c
完成后,C 应用程序将在终端打印“passed”或“failed”。
后续步骤
至此,您应该已成功安装 Intel MKL-DNN 库,执行了单元测试,并构建了存储库中提供的示例程序。在“Intel MKL-DNN 开发人员入门”的第二部分中,您将学习如何配置 Eclipse 集成开发环境来构建 C++ 代码示例,并对其进行讲解。