MXNet==1.9.x 源代码编译流程(windows + python)

只为mxnet for win开发做做小贡献
mxnet深度玩家

写在开头:
注意windows powershell、第三方依赖(python、git、7zip、cmake、ninja、opencv等)的安装和运行版本(x64和x84)须统一,建议均为x64

(1)安装VS

MXNet==1.9.0编译于VS 2019,建议安装VS 2019:
MXNet==1.9.x 源代码编译流程(windows + python)_第1张图片

(2)(可选)安装CUDA和Cudnn

如果有英伟达显卡,MXNet==1.9.0官方测试支持CUDA Toolkit 10.1 update2、10.2、11.0、11.2,源代码编译笔者建议CUDA 11.3
CUDA 11.0对于RTX 30 系列仅支持计算能力 <= 8.0,RTX30系列均为8.6计算能力,CUDA 11.3已支持全系RTX30系列8.6,此外,也是为了pip pytorch-cu113,兼容pytorch

(3)安装Math Library

1)(暂时放弃)如果是Intel CPU,可选Intel® oneAPI Base Toolkit精简安装,主要是为了安装Intel MKL和MKLdnn
放弃原因主要是b:
a. 目前VS 2022最新版本对于MKL的编译环境有个已知bug,Intel正在修复,官方建议回滚到VS 2022早期版本,结果Cmake编译不识别VS 2022早期版本(如果从VS 2022更换为VS 2019环境,请卸载重新安装CUDA和oneAPI)
b. 笔者Win 11,在VS 2019和2022出现安装闪退
2)(目前必选)AMD CPU或者Intel® oneAPI Base Toolkit无法安装,安装OpenBLAS (https://github.com/xianyi/OpenBLAS/releases),MXNet依赖于OpenBLAS,由于Intel MKL是OpenBLAS的进一步开发,底层仍有OpenBLAS,安装Intel MKL可不安装此项
a.依据上述windows powershell版本情况(x64还是x86)下载OpenBLASx64或者OpenBLASx86的二进制文件
b. 笔者个人习惯将OpenBLAS安装C:\OpenBLAS中,新增环境变量:变量名为OpenBLAS_HOME,变量值为C:\OpenBLAS

(4)(可选)下载并安装chocolatey

打开windows powershell(管理员身份运行),输入:

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

如果中间进度持续未更新,敲回车可以刷新进度;遇到选择询问,输入Y(不区分大小写)即可

(5)安装第三方依赖(git、7zip、cmake、ninja、opencv,cmake、opencv必选,其他均可选),笔者个人习惯将opencv安装C:\opencv中

MXNet==1.9.x 源代码编译流程(windows + python)_第2张图片

(6)下载并安装python,并添加进入环境变量

笔者安装miniconda-py3.8,勾选加入环境变量并作为python-base环境,选择python 3.8是由于三方包开始抛弃3.6向3.10过渡,3.10可能未支持或处于dev,择中选择是三方包(如pytorch)基本支持python 3.8

(7)cmake编译mxnet(建议离线安装:https://mxnet.apache.org/get_started/download.html,3rdparty在线安装git时有时会timeout)

1.(离线安装)
将apache-mxnet-src-1.9.0-incubating.tar.gz解压至C:\mxnet
(git安装)C盘目录下:

git clone --recursive https://github.com/apache/incubator-mxnet mxnet
cd mxnet
git checkout v1.9.x

git clone -b 1.9.0 --recursive https://github.com/apache/incubator-mxnet mxnet
  1. (可选)如果安装了CUDA且欲使用GPU,打开mxnet源代码目录/make/config.mk)
    编译为:
    USE_CUDA = 1
    USE_CUDA_PATH = (如果环境变量设置了CUDA library,可不修改为CUDA library的路径,笔者了解CUDA>10.0均安装时已自行添加环境变量中)
  2. (可选,一般不选)如果欲使用多节点多GPU(可以理解为分布式GPU运算),打开mxnet源代码目录/make/config.mk,编译为:
    USE_NCCL = 1
    USE_NCCL_PATH = (修改为CUDA NCCL的路径)
    4.打开cmake-gui,C:\mxnet下新建build文件,如下图编译(本例采用vs 2019和x64):
    MXNet==1.9.x 源代码编译流程(windows + python)_第3张图片
    MXNet==1.9.x 源代码编译流程(windows + python)_第4张图片

BLAS根据情况选择Open或MKL,Cmake中配置BLAS或MKL路径,BLAS配置OpenBLAS_INCLUDE_DIROpenBLAS_LIB,笔者配置依次为C:\OpenBLAS\includeC:\OpenBLAS\lib\libopenblas.lib;MKL配置MKL_INCLUDE_DIRMKL_ROOT,笔者记得默认安装情况下,依次配置为C:\Program Files\Intel\oneapi\mkl\latest\include\C:\Program Files\Intel\oneapi\mkl\latest\
USE_CPP_PACKAGE不勾选,MXNet已知bug:C:\mxnet\cpp-package\include\mxnet-cpp找不到op.h,实际该op.h需要后续(9)步骤5生成
MXNET_CUDA_ARCH将auto改为8.6,适配笔者GPU的计算能力,避免冗余编译

(8)编译 MXNet,编译生成libmxnet.dll和mxnet_xx.dll(耐心等待,大概1-4小时)

打开build路径下mxnet.sln文件(如上述图中Open Project)
Release x64编译:
MXNet==1.9.x 源代码编译流程(windows + python)_第5张图片
编译环境配置(笔者在Cmake设置MXNET_CUDA_ARCH为8.6,因此配置为compute_86, sm_86):
MXNet==1.9.x 源代码编译流程(windows + python)_第6张图片
MXNet==1.9.x 源代码编译流程(windows + python)_第7张图片
MXNet==1.9.x 源代码编译流程(windows + python)_第8张图片

MXNet==1.9.x 源代码编译流程(windows + python)_第9张图片

(9)为程序语言(此处为miniconda-python,还支持C++、Clojure、Julia、Perl、R、Scala、Java)安装 MXNet

  1. (懒人版)不配置系统环境,dll复制导入C:\mxnet\python\mxnet路径中,下载everything搜索更快
    opencv_xx、cudnn64_x、libopenblas相关dll都是opencv、CUDA和OpenBLAS的目录里复制过来
    libgcc_s_seh-1.dll和libwinpthread-1.dll从MinGW相关的库目录里复制过来,笔者安装git,git\mingw\bin内包含相关dll
    libquadmath_64-0.dll(https://github.com/adda-team/adda/releases)这个库中复制过来的,由libquadmath-0.dll改名为libquadmath_64-0.dll
    libgfortran-3.dll 是从adda 1.3b4复制过来
    libmxnet.dll、mxnet_xx.dll位于C:\mxnet\build\Release(笔者环境),mxnet_xx.dll在笔者环境为mxnet_86.dll,380 MB左右大小
    此处参考:https://blog.csdn.net/u012234115/article/details/80503086
    MXNet==1.9.x 源代码编译流程(windows + python)_第10张图片

  2. 打开Anaconda Powershell Prompt (Miniconda3),激活需要导入mxnet包的conda某虚拟环境(其它python安装方式只需变通一下即可)

  3. (懒人版)opencv 4.x将SIFT等分离为opencv-contrib包中,默认opencv只有图像基础操作了,上述步骤opencv仅为VS 编译使用,笔者为了方便,选择pip安装,跳过后续可能麻烦的opencv和contrib包编译,以替换VS编译中opencv
    注意与VS中opencv版本一致即可,笔者配置为4.5.5.62

pip install opencv-python==4.5.5.62 -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
pip install opencv-contrib-python==4.5.5.62 -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com

此处参考:https://zhuanlan.zhihu.com/p/58918998
4. Anaconda Prompt (Miniconda3)转到 MXNet 文件夹的根目录(如cd C:\mxnet\python),然后输入以下命令:python -m pip install -e ./python(参数都带上,如果该conda环境有老版本mxnet,确保卸载老版本mxnet)
不能在C:\mxnet\python使用python setup.py install,否则会报错:
OSError: exception: access violation writing 0x0000000000000000
Error in atexit._run_exitfuncs

测试mxnet-python例子:

# coding: utf-8

import mxnet.numpy as nd
import mxnet as mx

a = nd.array([1, 2, 3], ctx=mx.gpu())
print(a)

如果报错:
py_str = lambda x: x.decode(‘utf-8’)
UnicodeDecodeError: ‘utf-8’ codec can’t decode bytes in position 73-74: invalid continuation byte
笔者检查过文件编码原因,均为utf-8,定位问题为:与windows 控制台编码为ansi有关,(不建议)在base.py中修改为:
py_str = lambda x: x.decode('ansi')
(建议)修改注册表,使得cmd控制台默认编码为utf-8,参考链接:https://jingyan.baidu.com/article/f7ff0bfcee2dc22e26bb13d5.html
笔者配置有jdk,由于jdk在win 中文版安装默认使用GBK编码,在系统环境变量中增加一个变量,变量名为: JAVA_TOOL_OPTIONS, 变量值为:-Dfile.encoding=UTF-8,保存即可
5. (可选)如果绑定C++ API,此处生成C++依赖头文件 op.h
在mxnet/cpp-package/scripts目录,将所有依赖到的dll复制进来,如(9)中步骤1所示,运行
python OpWrapperGenerator.py ./libmxnet.dll
此处抛出FileNotFound异常,这是由于python 3.8安全机制搜索dll策略,笔者使用conda创建了一个python 3.7环境,成功生成op.h
此处参考:https://blog.csdn.net/u012234115/article/details/80503086

你可能感兴趣的:(mxnet,windows,python)