Windows下MXNet的安装(针对 OSError: [WinError 126] 错误)

记录一下在Windows下安装GPU版MXNet时踩到的坑。

MXNet安装引导:http://mxnet.incubator.apache.org/get_started

MXNet版本选择master,其余根据实际情况选择。

1
pip install mxnet-cu91 --pre

安装完成后,执行以下命令,查看MXNet版本号,检测是否安装成功。

1
python -c "import mxnet; print(mxnet.__version__)"

我在检测安装是否成功时,出现以下报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Users\UserName\AppData\Local\Programs\Python\Python36\lib\site-packages\mxnet\__init__.py", line 24, in <module>
from .context import Context, current_context, cpu, gpu, cpu_pinned
File "C:\Users\UserName\AppData\Local\Programs\Python\Python36\lib\site-packages\mxnet\context.py", line 24, in <module>
from .base import classproperty, with_metaclass, _MXClassPropertyMetaClass
File "C:\Users\UserName\AppData\Local\Programs\Python\Python36\lib\site-packages\mxnet\base.py", line 214, in <module>
_LIB = _load_lib()
File "C:\Users\UserName\AppData\Local\Programs\Python\Python36\lib\site-packages\mxnet\base.py", line 205, in _load_lib
lib = ctypes.CDLL(lib_path[0], ctypes.RTLD_LOCAL)
File "C:\Users\UserName\AppData\Local\Programs\Python\Python36\lib\ctypes\__init__.py", line 348, in __init__
self._handle = _dlopen(self._name, mode)
OSError: [WinError 126] The specified module could not be found

OSError: [WinError 126]应该是一个很通用的报错,可以理解为没有找到所需的dll。

正如一位Github网友所说,这个报错只告诉你缺少dll,却不会告诉你缺少了什么dll。没办法,自力更生。

MXNet的“核心dll”是libmxnet.dll,我们需要做的事情就是搞清它所依赖的dll都有什么。

利用Visual Studio的dumpbin工具,可以查看一个dll所依赖的其他dll。

打开Developer Command Prompt,进入libmxnet.dll所在文件夹(位于Python\Python36\lib\site-packages\mxnet),执行以下命令。

1
dumpbin /dependents libmxnet.dll

得到如下结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Dump of file libmxnet.dll

File Type: DLL

Image has the following dependencies:

libopenblas.dll
cudnn64_7.dll
cublas64_91.dll
cufft64_91.dll
cusolver64_91.dll
curand64_91.dll
nvrtc64_91.dll
nvcuda.dll
KERNEL32.dll
USER32.dll
VCOMP140.DLL

Summary

......(这部分省略)

我们需要的是第一部分,在这里列出了libmxnet.dll所依赖的dll。在libmxnet.dll所在文件夹和C:\Windows\System32里逐个对比,我缺少的是以下几个dll。

1
2
3
4
5
cublas64_91.dll
cufft64_91.dll
cusolver64_91.dll
curand64_91.dll
nvrtc64_91.dll

看名字就和CUDA有关,搜索了一下确实如此。按照常规的套路,把CUDA安装目录里相应的dll复制到C:\Windows\System32就OK了。

(对于正常安装了CUDA的同学,看到了这里,复制了那几个dll后,工作就结束了)

但我惊讶地发现,我好像没有CUDA安装目录。一瞬间我惊呆了。那我的nvcuda.dll是从哪飞来的…我之前用GPU版的Pytorch和Waifu2x又是怎么用的…难道我只下了一个nvcuda.dll…(好像真的是…)

重新装CUDA,但安装失败了,也许因为我已经有nvcuda.dll导致冲突。别问,问就是我不会。

不管那么多了,直接用压缩软件打开CUDA的exe安装包,把上面几个dll解压出来、复制,完事大吉。执行前面查看版本号的命令,终于看到可爱的版本号了,安装成功。

顺带一提,对于我所安装的mxnet-cu91,对numpy的版本有限制,版本上限是1.14.6,我原本的numpy 1.15.x被卸掉了;我专门试了一下mxnet-cu90mxnet-cu92,都没有此限制。和我一样安装了mxnet-cu91的同学可能要留心一下。

参考:https://stackoverflow.com/questions/54870595/oserror-winerror-126-module-could-not-be-found