英特尔® 优化的 MXNet* 入门向导

签署人: Ying Hu Zhuowei SiIDZSupport KS

已发布:11/11/2019   最后更新时间:07/16/2019

英特尔 与Apache* MXNet* (孵化) 社区进行长期合作,以加速神经网络在 CPU 后端的运行。 自 MXNet v1.2.0开始,英特尔 和 MXNet 社区宣布 MXNet 已正式通过面向深度神经网络(英特尔® MKL-DNN) 的英特尔® 数学核心函数库(英特尔® MKL-DNN)进行了优化。 最终用户可以直接利用英特尔 硬件的优势 ,包括最新的英特尔® 至强® 可扩展处理器(代号为 Cascade Lake)和英特尔® 深度学习加速(英特尔® DL Boost)技术。

如欲了解关于近期性能提升的更多详情,请参见 文章 “英特尔® 至强® 可扩展处理器提供出色推理性能”  和 “英特尔® DL Boost 助力提升 Apache* MXNet* v1.5.0 性能”

安装

开发人员可以根据其安装指南轻松安装 MXNet。

如以下屏幕截图所示,提供了当前版本和预览版本。开发人员还可以选择从 Anaconda、PIP 安装二进制文件,或者通过 CPU 源代码来构建。支持的语言包括 Python、Java 和 C++,具体取决于您的操作系统: Linux*、MacOS* 和 Windows*。

面向深度神经网络的英特尔® 数学核心函数库(英特尔® MKL-DNN)旨在加速神经网络计算。它针对支持英特尔® AVX-512、英特尔® AVX-2 和英特尔® SIMD 流指令扩展 4.2(英特尔® SSE4.2)指令的英特尔处理器进行了优化,可针对 CPU 中的深度学习应用提供最大性能。英特尔 和 MXNet  社区进行了密切合作,可确保 MXNet 默认情况下在 CPU上启用英特尔® MKL-DNN 加速1 , 因此用户无需执行额外的安装步骤即可在英特尔平台上获得性能优势。

MXNet 为 PyPI 软件包提供多个选项的英特尔® MKL-DNN 优化功能。在英特尔 CPU 上运行时,带 mkl 后缀的版本运行速度更快。查看下表了解更多详情。 

注:带 mkl 后缀的所有 MXNet* 版本(支持或不支持 CUDA*)均启用了英特尔® MKL-DNN 加速。

用户可以使用以下命令在英特尔® CPU 的 python 环境中安装 mxnet-mkl

 > pip install mxnet-mkl

MXNet 软件包将安装到您的 python 路径。例如,Windows* 下的目录为:

C:\Users\xxx\AppData\Local\Programs\Python\Python36\Lib\site-packages

Anaconda3 环境的 Linux* 下的目录为:

~/anaconda3/lib/python3.6/site-packages/mxnet

如果用户想提前试用新功能,则可以通过以下命令从 master 安装每日构建:

> pip install mxnet-mkl --pre

对于其他选项(包括 PIP、Docker 和 Build from source,请查看 Ubuntu 安装指南、 CentOS 安装指南 和其他 MXNet pip 软件包,并请 验证您的 MXNet 安装

完整性检查

安装英特尔 优化MXNet 后,为确保 英特尔® MKL-DNN优化 处于启用状态,运行以下命令,屏幕应显示"True”。

Python 3.6.2 |Continuum Analytics, Inc.| (default, Jul 20 2017, 13:51:32)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import mxnet.runtime
>>> fs=MXNet.runtime.Features()
>>> fs.is_enabled('MKLDNN')
True

入门

为了在多个操作系统的英特尔® CPU(带 英特尔® MKL-DNN 的 MXNet)上实现更出色的训练和推理性能。用户安装 mxnet-mkl 后,便可以使用一个卷积层启动一个简单的 MXNet python 代码,并验证 MKL-DNN 后端是否运行正常。

import mxnet as mx
import numpy as np

num_filter = 32
kernel = (3, 3)
pad = (1, 1)
shape = (32, 32, 256, 256)

x = mx.sym.Variable('x')
w = mx.sym.Variable('w')
y = mx.sym.Convolution(data=x, weight=w, num_filter=num_filter, kernel=kernel, no_bias=True, pad=pad)
exe = y.simple_bind(mx.cpu(), x=shape)

exe.arg_arrays[0][:]= np.random.normal(size=exe.arg_arrays[0].shape)
exe.arg_arrays[1][:]= np.random.normal(size=exe.arg_arrays[1].shape)

exe.forward(is_train=False)
o = exe.outputs[0]
t = o.asnumpy()

可以通过设置环境变量 MKLDNN_VERBOSE 记录有关调试和分析的更多详细信息:

export MKLDNN_VERBOSE=1

例如,运行上面的代码片段将输出以下调试日志,它将提供有关英特尔® MKL-DNN 基元卷积和重新排序的更多洞察。这包括:内存布局、推理形状和基元执行的时间成本。

mkldnn_verbose,exec,reorder,jit:uni,undef,<a></a>in:f32_nchw out:f32_nChw16c,num:1,32x32x256x256,6.47681 mkldnn_verbose,exec,reorder,jit:uni,undef,in:f32_oihw out:f32_OIhw16i16o,num:1,32x32x3x3,0.0429688 mkldnn_verbose,exec,convolution,jit:avx512_common,forward_inference,fsrc:nChw16c fwei:OIhw16i16o fbia:undef fdst:nChw16c,alg:convolution_direct,mb32_g1ic32oc32_ih256oh256kh3sh1dh0ph1_iw256ow256kw3sw1dw0pw1,9.98193 mkldnn_verbose,exec,reorder,jit:uni,undef,in:f32_oihw out:f32_OIhw16i16o,num:1,32x32x3x3,0.0510254 mkldnn_verbose,exec,reorder,jit:uni,undef,in:f32_nChw16c out:f32_nchw,num:1,32x32x256x256,20.4819

MXNet 提供一系列示例,可帮助用户使用 MXNet 进行 CNN 图像分类、文本分类、语义分割、R-CNN、SSD、RNN、推荐系统和强化学习等。请访问 GitHub*示例

另外请访问 此网站 获取优秀的 MXNet 教程。

运行性能指标评测

用户可以通过英特尔 优化的 MXNet 运行常用的性能指标评测。例如运行 

example/image-classification/benchmark_score.py

在英特尔® 至强® 处理器 (带英特尔® MKL-DNN 的 MXNet )上收集的详细性能数据可在此处找到。这些数字显示了 MXNet-1.5.0 的性能。它测量不同 AWS EC2 设备上的推理性能,我们将不断更新。

性能考虑因素

出于在英特尔® CPU 上运行 MXNet 的性能考虑,请参见本文的 “提升 MXNet 性能的一些技巧” 、 或 “关于数据布局、影响性能的非统一内存访问 (NUMA) 控件和英特尔® MKL-DNN 技术性能考虑因素的讨论” 部分 。

英特尔® MKL-DNN 与 CPU 上的 MXNet 紧密集成,MXNet 在默认情况下提供良好的多线程 控制。为了在英特尔® CPU 上实现更出色的性能,请使用下面的环境变量设置。

export KMP_AFFINITY=granularity=fine, noduplicates,compact,1,0
export OMP_NUM_THREADS=56 [physical core number]
export MXNET_SUBGRAPH_BACKEND=MKLDNN
$ cd example/image_classification
$ python benchmark_score.py

我们还发现,设置以下环境变量可以帮助提高性能:

变量

描述

OMP_NUM_THREADS

建议值: vCPUs / 2 其中 vCPUs 是虚拟 CPU 的数量。如欲了解更多信息,请参见 “使用 OpenMP* 环境变量设置线程数”指南

KMP_AFFINITY

建议值: granularity=fine,compact,1,0.如欲了解更多信息,请参见 线程关联接口(Linux 和 Windows)指南

MXNET*_SUBGRAPH_BACKEND

设为 MKLDNN,启用 子图功能 ,以实现更出色的性能。如欲了解更多信息,请参见 Build/使用 MKL-DNN 安装 MXNet 

注: MXNet 将一台电脑的所有 CPU 视为一台设备。因此,无论您指定 cpu(0) 或 cpu(), MXNet 都将使用机器上的所有 CPU 内核。

启用英特尔® MKL

为优化性能考虑因素,MXNet 还支持用户通过从源代码构建 MXNet 启用英特尔 MKL。 请查看如何 使用英特尔® MKL-DNN 构建/安装 MXNet

或者通过 conda 直接安装

conda install mxnet

启用图形优化

MXNet主分支中提供按子图功能进行图形优化的功能。您可以从源代码构建,然后使用以下命令启用此功能,以获得更好的性能:

export MXNET_SUBGRAPH_BACKEND=MKLDNN

请查看下列详细信息 

使用英特尔 MKL-DNN 构建/安装 MXNet 

博客 -用于生产级神经网络推理的模型量化

性能分析

即使配置好了训练或部署环境和并行化方案之后,许多配置设置和数据处理选择也会影响 MXNet 的性能。您可能想要查看是否使用了英特尔® MKL-DNN。

使用export MKLDNN_VERBOSE=1 查看英特尔® MKL-DNN 并使用 export MKL_VERBOSE=1 查看 MKL。

此外,MXNet 具有内置分析器,可在符号级别提供关于执行时间的详细信息。然后可以使用 环境变量 打开事件分析器以支持整个程序运行,或者以编程方式仅运行一部分。请参见 example/profiler ,获取有关如何在代码中使用分析器的完整示例。

执行结束后,找到浏览器的跟踪记录(示例 - Chrome* 浏览器中的 chrome://tracing)并加载the profile_output.json 分析器的文件输出以检查结果。

注:输出文件可能会变得非常大,因此一般不建议使用此方法。

参考资料

  1. MXNet 文档
  2. MXNet GitHub
  3. 英特尔 MXNet 官网
  4. 使用英特尔 MKL-DNN 构建/安装 MXNet 
  5. Apache MXNet v1.2.0 通过面向深度神经网络的英特尔® 数学核心函数库(英特尔 MKL-DNN)进行了优化
  6. 英特尔® 至强® 可扩展处理器提供出色的推理性能
  7. 用于生产级神经网络推理的模型量化

问答

问:"pip install mxnet-mkl"  get the follow error:

Collecting mxnet

  Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ConnectTimeoutError(<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x00000146D096ACC0>, 'Connection to pypi.org timed out.(connect timeout=15)')':/simple/MXNet/

A:  设置 PIP 代理或查看网络连接,例如:

  > pip install --proxy proxyserver:port MXNet<o:p></o:p>

产品和性能信息

1

英特尔的编译器针对非英特尔微处理器的优化程度可能与英特尔微处理器相同(或不同)。这些优化包括 SSE2、SSE3 和 SSSE3 指令集和其他优化。对于在非英特尔制造的微处理器上进行的优化,英特尔不对相应的可用性、功能或有效性提供担保。该产品中依赖于微处理器的优化仅适用于英特尔微处理器。某些非特定于英特尔微架构的优化保留用于英特尔微处理器。关于此通知涵盖的特定指令集的更多信息,请参阅适用产品的用户指南和参考指南。

通知版本 #20110804