深度学习人工智能机器学习分布式训练【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址https://gitcode.com/gh_mirrors/mx/mxnet点击查看免费下载本文是一份完整的 MXNet oneDNN 集成指南从 Linux、macOS、Windows 三大平台的编译安装开始逐步讲解如何验证 oneDNN 后端是否真正生效、如何启用 Intel MKL BLAS 进一步提速以及如何利用optimize_for图优化和 INT8 量化在 Intel 架构 CPU 上获得更好的训练与推理性能。读完本文你将掌握一条可直接复制的源码编译 — 功能验证 — 性能调优完整链路。oneDNN 在 MXNet 中的角色oneDNNoneAPI Deep Neural Network Library原 MKL-DNN是 Intel 开源的深度神经网络原语库为卷积convolution、逐元素操作eltwise、reorder 等算子在 Intel 架构 CPU 上提供高度优化的 JIT 实现。MXNet 内置 oneDNN 支持在 Linux、Windows 和 macOS 上以 oneDNN 为 CPU 后端编译后预期能在 Intel 架构 CPU 上获得更好的训练和推理性能。从构建系统看CMakeLists.txt 中USE_ONEDNN选项的默认值会随平台自动调整在非 Apple、非 MSVC 的 x86_64 主机且非交叉编译环境下USE_ONEDNN默认开启ON其余平台如 Apple、MSVC 或交叉编译默认关闭OFF需要显式传入-DUSE_ONEDNNON。开启后CMake 通过load_onednn()函数CMakeLists.txt以子目录方式引入3rdparty/onednn并强制关闭 oneDNN 自带的测试与示例构建、启用静态链接与 primitive 缓存同时定义编译宏-DMXNET_USE_ONEDNN1CMakeLists.txt这是 MXNet 各算子和子图融合代码判断 oneDNN 可用性的关键开关。构建完成后还会把dnnl_config.h、dnnl_version.h拷贝到仓库的 include/onednn/oneapi/dnnl/ 目录CMakeLists.txt供上层头文件引用。Linux 下的源码构建安装前置依赖基于 Debian/Ubuntu 的系统先安装编译工具与 MXNet 常用依赖sudo apt-get update sudo apt-get install -y build-essential git sudo apt-get install -y libopenblas-dev liblapack-dev sudo apt-get install -y libopencv-dev sudo apt-get install -y graphviz其中libopenblas-dev提供 BLAS 库libopencv-dev用于图像相关的算子与数据迭代graphviz用于模型可视化。克隆 MXNet 源码git clone --recursive https://gitcode.com/gh_mirrors/mx/mxnet.git cd mxnet注意--recursive会一并拉取子模块其中就包括3rdparty/onednn、3rdparty/mshadow、3rdparty/dmlc-core等依赖。三种推荐的构建组合cmake/ChooseBlas.cmake决定了USE_BLAS的取值空间mklIntel MKL、OpenOpenBLAS、AtlasATLAS以及 macOS 下的appleAccelerate。USE_BLAS未显式指定时CMake 会先尝试在MKLROOT、~/intel/mkl、/opt/intel/mkl、/opt/intel/oneapi/mkl/latest等路径下查找mkl_version.h找到即自动切换为 MKL否则回退到默认检测流程。组合一llvm OpenMP Intel MKL/OpenBLAS文档推荐mkdir build cd build cmake -DUSE_CUDAOFF -DUSE_ONEDNNON -DUSE_OPENMPON -DUSE_OPENCVON .. make -j $(nproc)组合二Intel MKL Intel OpenMPmkdir build cd build cmake -DUSE_CUDAOFF -DUSE_ONEDNNON -DUSE_BLASmkl .. make -j $(nproc)组合三OpenBLAS GNU OpenMP性能次优mkdir build cd build cmake -DUSE_CUDAOFF -DUSE_ONEDNNON -DUSE_BLASOpen .. make -j $(nproc)文档特别提示为了获得更好性能推荐使用 Intel OpenMP 或 llvm OpenMP 作为运行时否则默认使用 GNU OpenMP可能得到次优性能。如果未安装完整的 Intel MKL可以通过USE_BLASOpen使用 OpenBLAS。另外USE_OPENMPOFF时load_onednn()会把 oneDNN 的 CPU 运行时切到串行模式ONEDNN_CPU_RUNTIME SEQ所以默认保持USE_OPENMPON即可。提示仓库 config/distribution/linux_cpu.cmake 与 config/distribution/linux_cpu_mkl.cmake 分别提供了CPU oneDNN与CPU oneDNN MKL的现成配置模板CI 流水线如 ci/docker/runtime_functions.sh中的构建组合也可作为参考。macOS 下的源码构建安装前置依赖macOS 自带的 clang 不支持 OpenMP因此必须通过 Homebrew 安装 llvm 作为编译器同时安装 OpenCV用于计算机视觉算子等依赖# 安装 Homebrew /usr/bin/ruby -e $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install) # 安装依赖 brew update brew install pkg-config brew install graphviz brew tap homebrew/core brew install opencv brew tap homebrew/versions brew install llvm构建命令git clone --recursive https://gitcode.com/gh_mirrors/mx/mxnet.git cd mxnet LIBRARY_PATH$(brew --prefix llvm)/lib/ make -j $(sysctl -n hw.ncpu) CC$(brew --prefix llvm)/bin/clang CXX$(brew --prefix llvm)/bin/clang USE_OPENCV1 USE_OPENMP1 USE_ONEDNN1 USE_BLASapple这条命令使用 llvm 的 clang/clang 作为编译器显式开启 OpenMP、OpenCV 与 oneDNN并指定USE_BLASapple使用 macOS 自带的 Accelerate 框架作为 BLAS 实现。sysctl -n hw.ncpu会返回机器 CPU 核数用于并行编译。Windows 下的源码构建Windows 平台推荐使用 Microsoft Visual Studio 2015 或 2017 编译2015 优先推荐。依赖准备Visual Studio 2015安装 Visual Studio 2015社区版即可安装 CMake 3下载 OpenCV 3 并解压设置环境变量OpenCV_DIR指向 OpenCV 的 build 目录如C:\opencv\build并将 OpenCV 的 bin 目录如C:\opencv\build\x64\vc14\bin加入PATH若安装了 Intel MKL设置MKLROOT指向包含include和lib的 MKL 目录通常在C:\Program Files (x86)\IntelSWTools\compilers_and_libraries\windows\mklcmake 时传-DUSE_BLASmkl若未安装 MKL安装 OpenBLAS并同时下载mingw64.dll.zip加入PATH设置环境变量OpenBLAS_HOME指向包含include和lib的 OpenBLAS 目录。生成 VS 解决方案并编译打开 VS2015 X64 Native Tools Command Prompt开始菜单 → Visual Studio 2015 → VS2015 X64 Native Tools Command Prompt然后git clone --recursive https://gitcode.com/gh_mirrors/mx/mxnet.git cd C:\mxnet mkdir build cd build :: 方式一oneDNN OpenBLAS cmake -G Visual Studio 14 Win64 .. -DUSE_CUDA0 -DUSE_CUDNN0 -DUSE_NVRTC0 -DUSE_OPENCV1 -DUSE_OPENMP1 -DUSE_PROFILER1 -DUSE_BLASOpen -DUSE_LAPACK1 -DUSE_DIST_KVSTORE0 -DCUDA_ARCH_NAMEAll -DUSE_ONEDNN1 -DCMAKE_BUILD_TYPERelease :: 方式二oneDNN Intel MKL先加载 MKL 环境变量 C:\Program Files (x86)\IntelSWTools\compilers_and_libraries\windows\mkl\bin\mklvars.bat intel64 cmake -G Visual Studio 14 Win64 .. -DUSE_CUDA0 -DUSE_CUDNN0 -DUSE_NVRTC0 -DUSE_OPENCV1 -DUSE_OPENMP1 -DUSE_PROFILER1 -DUSE_BLASmkl -DUSE_LAPACK1 -DUSE_DIST_KVSTORE0 -DCUDA_ARCH_NAMEAll -DUSE_ONEDNN1 -DCMAKE_BUILD_TYPEReleaseCMake 成功后用 msbuild 编译也可在 Visual Studio 中打开生成的.sln编译msbuild mxnet.sln /p:ConfigurationRelease;Platformx64 /maxcpucount编译产物为./build/Release/或./build/Debug/下的libmxnet.dlloneDNN 的libmkldnn.dll位于./build/3rdparty/onednn/src/Release/。务必将所有用到的 dll如libmkldnn.dll、libmklml*.dll、libiomp5.dll、libopenblas*.dll等加入系统PATH也可统一放入\windows\system32否则加载 MXNet 时会报 Not Found Dependencies。Visual Studio 2017步骤与 2015 相同只需把生成器换成Visual Studio 15 Win64并把 OpenCV 路径改为vc15版本cmake -G Visual Studio 15 Win64 .. -DUSE_CUDA0 -DUSE_CUDNN0 -DUSE_NVRTC0 -DUSE_OPENCV1 -DUSE_OPENMP1 -DUSE_PROFILER1 -DUSE_BLASmkl -DUSE_LAPACK1 -DUSE_DIST_KVSTORE0 -DCUDA_ARCH_NAMEAll -DUSE_ONEDNN1 -DCMAKE_BUILD_TYPERelease安装 Python 包并验证 oneDNN 后端安装与冒烟测试编译完成后安装 Python 绑定并做一次冒烟测试pip install numpy graphviz cd python sudo python setup.py install python -c import mxnet as mx;print((mx.nd.ones((2, 3))*2).asnumpy());预期输出[[ 2. 2. 2.] [ 2. 2. 2.]]也可以设置PYTHONPATH[workdir]\mxnet\pythonWindows 下后直接导入无需安装。用单个卷积层验证 oneDNN用 Gluon 构建一个 3×3 卷积层并前向一次即可验证 oneDNN 后端是否被调用from mxnet import np from mxnet.gluon import nn num_filter 32 kernel (3, 3) pad (1, 1) shape (32, 32, 256, 256) conv_layer nn.Conv2D(channelsnum_filter, kernel_sizekernel, paddingpad) conv_layer.initialize() data np.random.normal(sizeshape) o conv_layer(data) print(o)通过 DNNL_VERBOSE 查看原语执行细节设置环境变量可让 oneDNN 输出详细的调试与性能剖析日志export DNNL_VERBOSE1再次运行上面的代码会得到类似下面的输出关键日志逐行解读dnnl_verbose,info,oneDNN v2.3.2 (commit e2d45252ae9c3e91671339579e3c0f0061f81d49) dnnl_verbose,info,cpu,runtime:OpenMP dnnl_verbose,info,cpu,isa:Intel AVX-512 with Intel DL Boost dnnl_verbose,info,gpu,runtime:none dnnl_verbose,info,prim_template:operation,engine,primitive,implementation,prop_kind,memory_descriptors,attributes,auxiliary,problem_desc,exec_time dnnl_verbose,exec,cpu,reorder,jit:uni,undef,src_f32::blocked:abcd:f0 dst_f32::blocked:acdb:f0,,,32x32x256x256,8.34912 dnnl_verbose,exec,cpu,reorder,jit:uni,undef,src_f32::blocked:abcd:f0 dst_f32::blocked:Acdb32a:f0,,,32x32x3x3,0.0229492 dnnl_verbose,exec,cpu,convolution,brgconv:avx512_core,forward_inference,src_f32::blocked:acdb:f0 wei_f32::blocked:Acdb32a:f0 bia_f32::blocked:a:f0 dst_f32::blocked:acdb:f0,,alg:convolution_direct,mb32_ic32oc32_ih256oh256kh3sh1dh0ph1_iw256ow256kw3sw1dw0pw1,10.5898日志含义如下头几行info记录 oneDNN 版本、CPU 运行时OpenMP与检测到的 ISA此处为支持 Intel DL Boost 的 AVX-512以及日志模板格式reorder原语表明数据在abcdNCHW与acdb等阻塞内存布局之间发生了格式转换——oneDNN 为卷积选择的内部内存格式与 MXNet 默认布局不同reorder 是两者之间必要的桥梁convolution原语行显示实现为brgconv:avx512_coreprop_kind 为forward_inference并给出内存描述符、算法convolution_direct、问题描述mb32_ic32oc32_ih256oh256kh3sh1dh0ph1_iw256ow256kw3sw1dw0pw1与执行耗时微秒级。只要日志中出现dnnl_verbose,exec,cpu,convolution,...这类行就说明卷积已经真实运行在 oneDNN 原语之上。更系统的 oneDNN 算子剖析方法可参考仓库 docs/python_docs/python/tutorials/performance/backend/ 目录下的性能剖析教程。启用 MKL BLAS 进一步提升性能oneDNN 之外MKL BLAS 还能为线性代数类算子带来进一步的性能提升提升幅度取决于模型的矩阵计算负载。安装完整版 MKL 后linalg命名空间下的所有算子都能获得 MKL 加速。安装与编译按 Intel 官网指引下载安装最新完整版 MKLLinux 下也可通过 YUM/APT 软件源安装进入构建目录mkdir build cd build配置cmake -DUSE_CUDAOFF -DUSE_BLASmkl ..编译make -j安装 Python 包cd python sudo python setup.py install。用线性求解器验证 MKLfrom mxnet import np coeff np.array([[7, 0], [5, 2]]) y np.array([14, 18]) x np.linalg.solve(coeff, y) print(x)设置环境变量打开 MKL 的详细日志export MKL_VERBOSE1再次运行上述代码会看到类似下面的输出此处执行了 MKL 的SGESV原语即单精度通用线性求解mkl-service Intel(R) MKL: THREADING LAYER: (null) mkl-service Intel(R) MKL: setting Intel(R) MKL to use INTEL OpenMP runtime mkl-service Intel(R) MKL: preloading libiomp5.so runtime Intel(R) MKL 2020.0 Update 1 Product build 20200208 for Intel(R) 64 architecture Intel(R) Advanced Vector Extensions 512 (Intel(R) AVX-512) with support of Vector Neural Network Instructions enabled processors, Lnx 2.70GHz lp64 intel_thread MKL_VERBOSE SGESV(2,1,0x7f74d4002780,2,0x7f74d4002798,0x7f74d4002790,2,0) 77.58us CNR:OFF Dyn:1 FastMM:1 TID:0 NThr:56日志中的SGESV、执行耗时77.58us、线程数NThr:56等信息可用于确认 MKL 确实接管了线性代数运算。图优化optimize_for 与算子融合要让 oneDNN 的潜力发挥到极致建议配合图优化使用。MXNet 的optimize_forAPI 可以把计算图按子图方式切分并交给 oneDNN 后端执行从而触发算子融合如 Convolution ReLU 融合进单个卷积原语。使用限制使用该功能前需确认满足以下条件仅适用于推理inference只有HybridBlock的子类与Symbol可以调用optimize_for即使编译的是 GPU 版 MXNet该功能也只在 CPU 上运行。代码示例from mxnet import np from mxnet.gluon import nn data np.random.normal(size(32,3,224,224)) net nn.HybridSequential() net.add(nn.Conv2D(channels64, kernel_size(3,3))) net.add(nn.Activation(relu)) net.initialize() print( * 5, Not optimized , * 5) o net(data) print(o) net.optimize_for(data, backendONEDNN) print( * 5, Optimized , * 5) o net(data) print(o)从日志看融合效果开启DNNL_VERBOSE1后优化前后的日志对比如下省略了张量打印 Not optimized [15:05:43] ../src/storage/storage.cc:202: Using Pooled (Naive) StorageManager for CPU dnnl_verbose,info,oneDNN v2.3.2 (commit e2d45252ae9c3e91671339579e3c0f0061f81d49) dnnl_verbose,info,cpu,runtime:OpenMP dnnl_verbose,info,cpu,isa:Intel AVX-512 with AVX512BW, AVX512VL, and AVX512DQ extensions dnnl_verbose,info,gpu,runtime:none dnnl_verbose,info,prim_template:operation,engine,primitive,implementation,prop_kind,memory_descriptors,attributes,auxiliary,problem_desc,exec_time dnnl_verbose,exec,cpu,reorder,jit:uni,undef,src_f32::blocked:abcd:f0 dst_f32::blocked:acdb:f0,,,32x3x224x224,8.87793 dnnl_verbose,exec,cpu,reorder,jit:uni,undef,src_f32::blocked:abcd:f0 dst_f32::blocked:Acdb64a:f0,,,64x3x3x3,0.00708008 dnnl_verbose,exec,cpu,convolution,brgconv:avx512_core,forward_inference,src_f32::blocked:acdb:f0 wei_f32::blocked:Acdb64a:f0 bia_f32::blocked:a:f0 dst_f32::blocked:acdb:f0,,alg:convolution_direct,mb32_ic3oc64_ih224oh222kh3sh1dh0ph0_iw224ow222kw3sw1dw0pw0,91.511 dnnl_verbose,exec,cpu,reorder,jit:uni,undef,src_f32::blocked:abcd:f0 dst_f32::blocked:Acdb64a:f0,,,64x3x3x3,0.00610352 dnnl_verbose,exec,cpu,eltwise,jit:avx512_common,forward_inference,data_f32::blocked:acdb:f0 diff_undef::undef::f0,,alg:eltwise_relu alpha:0 beta:0,32x64x222x222,85.4392 Optimized dnnl_verbose,exec,cpu,reorder,jit:uni,undef,src_f32::blocked:Acdb64a:f0 dst_f32::blocked:abcd:f0,,,64x3x3x3,0.00610352 dnnl_verbose,exec,cpu,reorder,jit:uni,undef,src_f32::blocked:abcd:f0 dst_f32::blocked:Acdb64a:f0,,,64x3x3x3,0.00585938 dnnl_verbose,exec,cpu,reorder,jit:uni,undef,src_f32::blocked:abcd:f0 dst_f32::blocked:acdb:f0,,,32x3x224x224,3.98999 dnnl_verbose,exec,cpu,convolution,brgconv:avx512_core,forward_inference,src_f32::blocked:acdb:f0 wei_f32::blocked:Acdb64a:f0 bia_f32::blocked:a:f0 dst_f32::blocked:acdb:f0,attr-post-ops:eltwise_relu:0:1 ,alg:convolution_direct,mb32_ic3oc64_ih224oh222kh3sh1dh0ph0_iw224ow222kw3sw1dw0pw0,20.46对比可见优化前需要分别执行convolution与eltwiserelu两个原语优化后日志中只剩一个convolution原语且其attributes一栏出现了attr-post-ops:eltwise_relu:0:1——这正是 Convolution ReLU 被融合进单个卷积原语的直接证据post-ops 机制省去了单独的 eltwise 原语及中间数据落盘。从源码看optimize_for在 python/mxnet/gluon/block.py 中定义HybridBlock.optimize_for它把hybridize 前向时图切分的工作提前到一次显式调用中完成随后即可直接export导出模型或运行推理。Symbol侧对应 python/mxnet/symbol/symbol.py 与 python/mxnet/symbol/numpy/_symbol.py 的同名方法。其关键参数包括backend子图后端名称在SubgraphBackendRegistry中注册传ONEDNN即走 oneDNN 子图clear是否清除之前的优化结果默认Falsestatic_alloc/static_shape静态分配内存 / 按不变输入形状优化可进一步提升速度但会增加内存占用inline_limit允许内联的最大算子数默认 2。基于 oneDNN 的 INT8 量化与推理oneDNN 子图特性同时支持量化把 FP32 模型校准为 (U)INT8 模型后可在 Intel Xeon 可扩展平台上获得显著的推理性能提升。仓库提供了完整的可运行示例见 example/quantization/README.md包含三个脚本imagenet_gen_qsym_onednn.py从 FP32 模型生成校准后的量化模型imagenet_inference.py加载量化模型执行推理launch_inference_onednn.sh一键启动推理的脚本。量化脚本的主要参数默认值如下参数作用默认值--model待量化模型名若禁用预训练则需把模型放到脚本同目录的model目录下resnet50_v1--epoch模型 epoch 数0--no-pretrained不从 MXNet / Gluon-CV 模型库下载预训练权重False--batch-size校准时的 batch size32--calib-dataset校准数据集路径RecordIO 格式data/val_256_q90.rec--image-shape输入图像的通道数、高、宽逗号分隔3,224,224--num-calib-batches用于校准的 batch 数默认值见脚本--help--exclude-first-conv是否排除第一个卷积层不量化False--shuffle-dataset是否打乱校准数据集False--calib-mode校准模式如naive/entropy/min_max等默认值见脚本--help--quantized-dtype量化数据类型可选auto/int8/uint8auto示例用法python imagenet_gen_qsym_onednn.py --model resnet50_v1 --calib-dataset data/val_256_q90.rec --batch-size 32常见问题与后续支持构建完成后 Python 导入失败或报缺库错误检查所有 dllLinux 下为.so是否位于LD_LIBRARY_PATHWindows 为PATH可搜索的目录怀疑 oneDNN 未生效设置DNNL_VERBOSE1观察日志中是否出现convolution/reorder等dnnl_verbose,exec行想要更深入的算子级剖析参考 docs/python_docs/python/tutorials/performance/backend/ 目录下的性能剖析教程oneDNN 相关的问题与 bug可到 MXNet 的 oneDNN/MKL 标签下反馈官方支持渠道还包括 Intel 的 MKL 与 oneDNN 官网。从源码到性能验证MXNet oneDNN 的组合可以归结为一条清晰链路选对构建组合USE_ONEDNNON 合适的 BLAS/OpenMP→ 用DNNL_VERBOSE确认原语真实执行 → 用optimize_for触发算子融合 → 必要时用 INT8 量化进一步压缩推理成本。按本文步骤操作即可在 Intel 架构 CPU 上获得开箱即用的性能收益。赞分享深度学习人工智能机器学习分布式训练【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址https://gitcode.com/gh_mirrors/mx/mxnet点击查看免费下载相关推荐Apache MXNet 集成 oneDNN 完整指南Linux/macOS/Windows 构建、图优化与 INT8 量化实战Apache MXNet 集成 oneDNN 完整指南Linux/macOS/Windows 构建、图优化与 INT8 量化实战 Apache MXNet 是深度学习人工智能机器学习分布式训练mxnet-nativeMXNet 纯 CPU无 oneDNNPyPI 包安装与使用指南mxnet nativeMXNet 纯 CPU无 oneDNNPyPI 包安装与使用指南 本篇指南聚焦 Apache MXNet 官方在 PyPI 上发布深度学习人工智能机器学习分布式训练Intel oneDNN释放CPU深度学习性能的终极利器Intel oneDNN释放CPU深度学习性能的终极利器 Intel oneDNN深度神经网络库是一款专为优化深度学习工作负载而设计的开源性能库它能够显上一篇pgmpy结构学习实战PC算法与Hill Climbing搜索详解下一篇aniGamerPlus高級技巧自定義分辨率與批量下載秘籍创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考