Tensorflow 安装踩坑

本文描述的是在 Windows 10 下安装 tensorflow-gpu 1.13.1 的时候遇到的几个问题。主要是作为笔记以及交流学习使用,在解决环境配置问题时仅作参考,(本文发布以后,一些信息可能已经失效或发生变化,)请勿直接对号入座。

CUDA 安装失败

安装支持 GPU 版本的 Tensorflow,根据安装文档列出的环境要求,需要下载 CUDA 和相应版本的 cuDNN。(CUDA 和 cuDNN 的版本对应关系详见 cuDNN 的下载页)

在安装 CUDA 的时候,安装进度长时间停留在 Installing Nsight Visual Studio Edition... 这一步,然后安装结束显示安装失败。

搜索引擎查询相关内容,发现似乎是 Nsight Visual Studio Edition 与某些环境下或某些版本的 Visual Studio 2017 有不兼容。

解决的办法很简单,在安装的时候选择自定义安装,然后取消勾选 Nsight Visual Studio Edition 即可。

至于如何把这个未安装的功能安装回来,博主还没折腾过,可以先参考一下这里提到的方法。(博主并未测试这种方法的可用性)

import tensorflow 提示 DLL load failed

Trackback 很长,这里就不全贴出来了,只节选一部分内容如下:

  File "E:\Workspace\KC01\venv\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 24, in swig_import_helper
    _mod = imp.load_module('_pywrap_tensorflow_internal', fp, pathname, description)
  File "E:\Workspace\KC01\venv\lib\imp.py", line 243, in load_module
    return load_dynamic(name, filename, file)
  File "E:\Workspace\KC01\venv\lib\imp.py", line 343, in load_dynamic
    return _load(spec)
ImportError: DLL load failed: 找不到指定的模块。


Failed to load the native TensorFlow runtime.

See https://www.tensorflow.org/install/errors

按说硬件、软件需求满足了,tensorflow 本体也装好了,环境搭建应该是大功告成可以开工了。但是才执行了一行 import tensorflow 就跪了,还给出一个这么模棱两可的错误提示,没办法,还是先根据指示看下是不是“常见问题”。

FAQ?

查看 Tensorflow 安装文档的 Build and install error messages 页面,与此属于同一个错误的有两个 GitHub Issue 22512, 22794,其中提到以下解决办法:

  • 安装 VC++ 2015 运行库
  • 回退 CUDA 版本至 9.0
  • 回退 tensorflow 至某些旧版本
  • 设置环境变量,加上 CUDA 的 bin 目录

VC++运行库是有的,回退 CUDA 版本也无效, 回退 tensorflow 版本也不行,环境变量也确认无误。

搜索引擎搜索相关问题,大多也是这样的回答。

自行查错

既然错误信息是 DLL load failed ,可以怀疑是某个(或某些 DLL)加载失败或找不到导致的。

使用 procmon 记录下python中执行 import tensorflow 时尝试加载了哪些 DLL。设置监视规则如下:

  • [Include] Process Name is python.exe
  • [Include] Path contains .dll

由于加载 DLL 时会根据 Path 环境变量等进行搜索,因此会出现很多 Result 为 NAME NOT FOUND 的记录,排除掉最终成功找到并加载成功的 DLL,下列加载失败的 DLL 进入了视线:

  • cudart64_100.dll
  • cusolver64_100.dll
  • cublas64_100.dll

搜索引擎搜索,发现是属于 CUDA 的相关文件。再使用 Everything 在本机搜索,发现了以下文件名类似的文件:

  • C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cudart64_101.dll
  • C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cublas64_10.dll

想起在安装 CUDA 时直接选择安装了最新版本 10.1 的 CUDA,那么 cudart64_101.dll 似乎可以理解为 CUDA Runtime x64 10.1 ,再想起前面各种搜索相关问题时常常提到的更换 CUDA / Tensorflow 版本,也许 Tensorflow 1.13.1 是需要 CUDA 10.0 版本?

尝试安装 CUDA 10.0 以及对应版本的 cuDNN 以后,Tensorflow 可以正常使用。

可以在 CUDA 的安装目录找到下列文件(正是 Tensorflow 之前加载失败的):

  • C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin\cudart64_100.dll
  • C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin\cublas64_100.dll

再看文档中的软件环境要求

Tensorflow 的 GPU 支持文档 中软件要求一栏内容如下:

必须在系统中安装以下 NVIDIA® 软件:

可以发现,在说明 CUDA 工具包的要求时,使用的说法是 支持 CUDA 9.0 ,但令人疑惑的是最新版本的 Tensorflow-gpu 的 pip 预编译版本硬性要求 CUDA 的版本为 10.0,高了低了都不行(博主尝试了 9.0、10.1 都是 ImportError: DLL load failed 错误)。

再比较下一行对 cuDNN SDK 的版本要求说明是 7.2 及更高版本 ,这两个不同的说法也让人疑惑。支持 CUDA 9.0,到底是仅支持 9.0、支持 9.0 及以上、还是别的什么呢?

软件环境要求的来源

刨根问底,还是需要看一下相关源代码。在 Tensorflow 的 GitHub 项目中搜索 cudart64_ ,可以发现 tensorflow/contrib/cmake/CMakeLists.txt 中有提及的相关配置:

string(REPLACE "." "" short_CUDA_VER ${CUDA_VERSION})
cudart_dll_name=cudart64_${short_CUDA_VER}.dll

另外在用于生成构建 Tensorflow 时附带的参数的 tensorflow/configure.py 中有默认参数如下

_DEFAULT_CUDA_VERSION = '10.0'

_DEFAULT_CUDA_PATH_WIN = ('C:/Program Files/NVIDIA GPU Computing '
                          'Toolkit/CUDA/v%s' % _DEFAULT_CUDA_VERSION)

# ...

def set_tf_cuda_version(environ_cp):
  """Set CUDA_TOOLKIT_PATH and TF_CUDA_VERSION."""
  ask_cuda_version = (
      'Please specify the CUDA SDK version you want to use. '
      '[Leave empty to default to CUDA %s]: ') % _DEFAULT_CUDA_VERSION

  # ...

  for _ in range(_DEFAULT_PROMPT_ASK_ATTEMPTS):
    # Configure the Cuda SDK version to use.
    tf_cuda_version = get_from_env_or_user_or_default(
        environ_cp, 'TF_CUDA_VERSION', ask_cuda_version, _DEFAULT_CUDA_VERSION)

  # ...

  environ_cp['TF_CUDA_VERSION'] = tf_cuda_version

结论

个人推测是 tensorflow-gpu 1.13.1 在 pip 上提供给 Windows 的包内包含的预编译二进制文件默认使用的 CUDA 版本是 configure.py 中指定的 _DEFAULT_CUDA_VERSION 即 10.0

因此要顺利地安装 tensorflow-gpu,需要注意安装对应版本的 CUDA,或者自行编译针对本机 CUDA 版本的相关二进制文件。

tensorflow-gpu 的确“支持 CUDA 9.0”,但文档中这种说法是不准确的。确切来说,tensorflow 支持 CUDA 9.0 及以上版本,但 pip 上只提供针对一个特定 CUDA 版本的包(这里说的特定版本是随 Tensorflow 版本更新而有所改变的,如 Tensorflow 1.10.1 中默认的 CUDA 版本是 9.0)。

总结一些注意事项

  • 建议使用 virtualenv(tensorflow CPU 版 及 GPU 版的包名均为 tensorflow 同时安装会互相覆盖,使用 virtualenv 可以将软件包安装与系统隔离开来)
  • 安装 GPU 版 Tensorflow 需要注意正确安装相关依赖,并正确设置环境变量
  • CUDA 自带显卡驱动,可能会覆盖安装旧版的显卡驱动,即使系统中安装的驱动版本高于 CUDA 安装包中附带的驱动版本。
  • tensorflow 的 pip 包体积较大,建议使用较近的 pip 镜像源(如:清华大学开源软件镜像站提供的 pypi 镜像)进行下载安装。
本文采用 署名-非商业性使用 4.0 国际许可协议 进行许可。
本文作者:KeNorizon
本文链接:https://blog.kenorizon.cn/note/tensorflow-installation.html

评论

暂无

添加新评论