方案:基于英特尔® 至强融核™ 处理器 x 200 的面向深度学习优化的 Caffe*

概述

计算机学习代码 Caffe* 针对英特尔® 至强融核™ 处理器进行了优化。 本文详细介绍了如何编译和运行面向英特尔® 架构优化的 Caffe*,以实现英特尔至强融核处理器的最高性能。

简介

Caffe 是伯克利愿景和学习中心 (BVLC) 与社区贡献者共同开发的常用开源深度学习框架。 Caffe 通常作为图像分类域的性能指标评测,与 AlexNet(一种图像识别神经网络拓扑)和 ImageNet(一种标签图像数据库)一起使用。 BVLC Caffe 的英特尔版本,以下统称为 面向英特尔架构优化的 Caffe,用来优化英特尔架构的框架性能。 广大深度学习用户群体可以在 Github 获取此类优化。

英特尔至强融核处理器 x200 是英特尔® 集成众核架构(英特尔® MIC 架构)家族的最新一代。 延续了前代英特尔® 至强® 和英特尔® 至强® 融核™产品家族的性能优势,英特尔至强融核处理器 x200 着眼于高性能计算应用,以及新兴的机器学习和深度学习应用。 英特尔至强融核处理器 x200 具备一流的特性 - 包含 2 个 512 位的向量处理单元 (VPU) 的计算内核,每时钟周期每内核能运行 2 个融合乘加 (FMA);片上多通道 DRAM (MCDRAM) 内存,带宽明显高于 DDR4 内存。

准备步骤

如欲下载面向英特尔® 架构优化的最新版 Caffe,请复制以下目录:

git clone https://github.com/intelcaffe/caffe

Caffe 依赖于几个外部库,可以在 Linux* 分发版的存储库安装。 必需的先决条件已经详细介绍,为了方便您的使用,特在此发布。

  1. RHEL*、CentOS* 和 Fedora* 系统:

    sudo yum install protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5-devel gflags-devel glog-devel lmdb-devel

  2. Ubuntu* 系统:
    1. sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler libgflags-dev libgoogle-glog-dev liblmdb-dev
    2. sudo apt-get install --no-install-recommends libboost-all-dev

除了上述的关联组件,面向英特尔架构优化的 Caffe 需要英特尔® 数学核心函数库(英特尔® MKL)2017 Beta 更新 1(或更高版本)和 OpenMP* 运行时库,以达到英特尔至强融核处理器 x200 的最佳性能。 如欲在英特尔® Parallel Studio XE 2017 Beta 版软件套件中下载这些库,请先填写注册表。

注册、下载完毕之后,按照软件包的说明,安装英特尔® C++ 编译器 17.0 预发布版 (Beta) 更新 1 和面向 C/C++ 的英特尔数学核心函数库 2017 预发布版 (Beta) 更新 1。

构建基于英特尔至强融核处理器的面向英特尔架构优化的 Caffe

获取相应的 shell 脚本(假设安装目录是 /opt/intel/),然后利用英特尔 C/C++ 编译器和英特尔 MKL 设置 shell 环境,如下所示:

对于 sh/bash: source /opt/intel/bin/compilervars.sh intel64

对于 c/tcsh: source /opt/intel/bin/compilervars.csh intel64

更改目录位置,把文件放在面向英特尔架构存储库优化的 Caffe 的复制版本所在的位置,然后构建框架,启动面向深度神经网络的英特尔® 数学核心函数库(英特尔® MKL-DNN)的 API,为英特尔至强融核处理器 x200 提供卷积、池化、标准化及其它关键 DNN 操作的优化实施。 以下命令将产生可执行二进制文件,命名为 caffe,位置在 /opt/caffe/build/tools/(假设存储库复制到 /opt/caffe):

cd /opt/caffe; mkdir build; cd build;
cmake -DCPU_ONLY=on -DBLAS=mkl -DUSE_MKL2017_AS_DEFAULT_ENGINE=on  /opt/caffe/
make –j 68 all

我们将利用针对图像分类的 AlexNet 网络拓扑结构,对基于英特尔至强融核处理器 x200 的面向英特尔架构优化的 Caffe 进行性能指标测评。 面向英特尔架构优化的 Caffe 生成 AlexNet 拓扑文件,位置在 /opt/caffe/models/mkl2017_alexnet/。针对神经网络的不同层级(直接批量卷积、最大池化、跨通道局部响应归一化 (LRN)、修正线性单元 (ReLU)),把 “engine” 参数设置为 “MKL2017”,与英特尔 MKL-DNN API 运行时的使用相一致。 AlexNet 输入文件使用的图像数据存储在极速内存映射数据库 (lmdb) 的格式文件 (data.mdb、lock.mdb) 中,性能指标测评需要 AlexNet 输入文件。 如欲获取 ImageNet 数据集文件,请点击 此处

在英特尔至强融核处理器上运行面向英特尔架构优化的 Caffe

英特尔至强融核处理器 x200 支持不同的内存模式,为了实现面向英特尔架构优化的 Caffe 的最佳性能,建议在“扁平”模式中耗尽 MCDRAM 内存。 Linux 标准实用程序 - “numactl” 在 MCDRAM 中分配内存缓冲区。 在 MCDRAM 扁平模式中,DDR 和 MCDRAM 内存显示为单独的可寻 NUMA 节点(numactl -H 显示此信息)。 如欲了解关于 MCDRAM 和 Flat,Cache 和 Hybrid 模式的更多信息,请点击 此处

运行可执行文件之前,设置 OpenMP 的环境变量(线程数和锁定至处理器物理内核上的线程数):

export OMP_NUM_THREADS=<number_of_cores which implies 64 or 68  depending on Intel Xeon Phi x200 SKU>
export KMP_AFFINITY=granularity=fine,compact,1,0

性能指标测评的目的是测量性能,而不是训练端到端的图像分类模型。因此,我们将利用 Caffe “time” 模式,默认为 50 次迭代,包括前向和后向分支:

numactl –m 1 /opt/caffe/build/tools/caffe time --model=/opt/caffe/models/mkl2017_alexnet/train_val.prototxt

上述步骤中产生的计时数据(毫秒)显示了批量处理图像时,50 次迭代的前向 (FW) 和后向 (BW) 分支所花费的平均时间。 目前,models/mkl2017_alexnet/ 目录提供的输入文件设置为 256 个图像,为了实现理想的性能,建议采用此批处理尺寸(图像数量如果发生改变,请参照 /opt/caffe/models/mkl2017_alexnet/train_val.prototxt 文件)。 FW 和 BW 分支花费的时间用来计算训练率,如下所示:

了解更多详情

如欲了解有关 Caffe 框架下各种配置和运行参数的信息,请参阅这篇深度文章

关于作者

Vamsi Sripathi 于 2010 年成为英特尔公司的一名软件工程师。 他获得了美国北卡罗来纳州立大学计算机科学专业的硕士学位。 在英特尔任职期间,他从事英特尔数学核心函数库 (MKL) 中的基本线性代数子程序 (BLAS) 的性能优化工作,跨越多代英特尔至强和英特尔至强融核架构。 目前,他从事面向英特尔架构的深度学习算法和框架的优化工作。

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