win10x64 编译 mxnetWithGPU

1.0.0版本
    git clone时记得加--recursive参数,否则缺少很多依赖库
    windows编译默认会启动多核编译
    openblas需要有二进制package, 而且需要配置环境变量,具体查看FindOpenblas.cmakes (openblas依赖lapack,而lapack依赖于
              cygwin的一些dll,这些必须加入环境路径中,否则后续会出现import mxnet 错误
    需要提供opencv3库
    编译出libmxnet.lib/libmxnet.dll, 但是最后依然出现错误,比如op.h找不到,但是本次目标有libmxnet.dll就够了(mxnet\cpp-                                 package\scripts\OpWrapperGenerator.py 这个文件负责生成一个op.h,但是不知道为什么VS自动调用它总是windows 126错误,
              但是直接命令符中执行它确实可以的)
    到mxnet\python下执行python setup.py install
    保证opencv,openblas,cygwin,相关库都在环境路径后,在python中即可import mxnet了

详细步骤
  1. 安装opencv 3.x
    opencv_world340.dll 加入系统目录中
  2. git clone --recursive https://github.com/apache/incubator-mxnet.git ./
  3. https://sourceforge.net/projects/openblas/files/ 下找找win 64bit下的二进制包,
    一般最新版本是没有win二进制的,找找旧版本
  4. openblas二进制包,不知道是什么编译出来的(mingw? 但我在mingw下没找到
    对应的库),似乎依赖以下三个库
    libgcc_s_seh-1.dll,libgfortran-3.dll, libquadmath-0.dll
  5. 参考mxnet的FindOpenBLAS.cmake,设置环境变量
    OpenBLAS_HOME(OpenBLAS是linux下需要的)
    另外记得把openblas的dll加入系统目录中
  6. 一个坑
    vs2015安装时一定要把WIN10 SDK装上。。。。
  7. 安装了CUDA 9.0 但是 CMAKE configuration时提示找不到CUDA编译器
    Cmake会生成一个CMakeError.log,仔细查看CMake想找的是CUDA 8.0, 而机器上相应目录(在CMakeError.log里找路径)里只有CUDA9.1,所以修改CMakeLists.txt即可(本来此处Cmake应该让用户选择CUDA版本,但是不知道为什么,windows上没有弹出选项,只能直接修改了)
  8. OpenCV
    默认编译时提示找不到OpenCV,此时CMake会提示你修改OpenCV_DIR(CMake界面上搜索),把opencv的build目录赋值给OpenCV_DIR即可(这个目录下有个OpenCVConfig.cmake)
  9. mxnet默认使用多线程编译,虽然理论上速度会快很多,但是同时需要的资源也大幅提高
    如果资源不够,反而影响速度,甚至是失败
    编译速度是机器性能相关,我编译了N个小时
    编译过程中有可能会出现问题,比如heap被耗尽。。,不用修改代码,直接再次编译(不是rebuild,是build),直到得到libmxnet.dll为止
  10. 编译完成后,在mxnet/python目录下执行 python setup install
  11. 运行后出现错误: no kernel image is available for execution on the device
    原因CUDA9 不支持计算能力小于3的GPU。。。,换CUDA8
  12. error == cudaSuccess(8 vs. 0)

GPU版本和编译时指定的计算能力不同 GPU ARCH 的问题,在mxnet/cmake/FirstClassLangCuda.cmake中修改CUDA_COMMON_GPU_ARCHITECTURES 的值,把GPU的计算能力写入(具体GPU对应的计算能力在网上找)       if(${arch_name} STREQUAL "Fermi")
        #if (CUDA_TOOLSET VERSION_LESS "8.0")
          set(arch_bin 2.0 "2.1(2.0)")
        #endif()
注释条件,使得8.0也可令arch_bin = 2.0 (测试GPU的能力是2.1),保证CMake会打印出

cuda arch bin: 20;21(20);30;35;50;52;32;37;53;60;61

你可能感兴趣的:(win10x64 编译 mxnetWithGPU)