安装 TensorFlow 遇到的问题
最后修改:2022-11-20
安装 TensorFlow 遇到的问题
环境
- 系统:Ubuntu 20.04 LTS
- 虚拟环境:Anaconda
目标
- 在 Anaconda 虚拟环境中能正常使用 TensorFlow
- 可以使用 GPU 计算
- 可以使用 TensorRT
问题 - 无法使用 GPU 计算
安装正确的 Build 版本
使用命令 conda install tensorflow
安装后,TensorFlow 已经可以使用了,但如果使用 API tf.test.gpu_device_name()
去查询 GPU 设备的名称,只会返回一个空字符串,没有正确找到 GPU 设备
出现这种情况的原因可能是 Anaconda 安装的 TensorFlow 就不支持 GPU,虽然谷歌官方在 2.0 版本已经合并了 CPU 版和 GPU 版的 TensorFlow,但 Anaconda 提供的包是由社区维护的版本,仍然是分开的。通过 conda search tensorflow
搜索可以看到,有 3 种 Build 版本:eigen、gpu、mkl,默认安装的可能是 mkl 版本
如果想安装时指定某个 Build 版本,追加一个等号 =
即可,例如:
conda install tensorflow=2.8.2=gpu_py38h75b8afa_0
重编译的问题
使用 Anaconda 社区维护的 TensorFlow GPU 版本可能会出现从 PTX 到 JIT 的编译过程,类似提示信息 TensorFlow was not built with CUDA kernel binaries compatible with compute capability 5.0. CUDA kernels will be jit-compiled from PTX, which could take 30 minutes or longer
并且是每次启动都会来一遍,耗时几分钟到几十分钟不等,出现这种情况,可以尝试安装谷歌官方提供的版本,如果还存在,就只能选择从源码编译安装 TensorFlow
安装官方提供的版本
官方提供的预编译版本需要使用 pip
安装,使用命令 pip install tensorflow
安装好后,默认使用 CPU,还是不能使用 GPU 计算,会提示类似 Could not load dynamic library 'libcudart.so.11.0'
的信息,这说明缺少了 CUDA 环境
按官方文档的说法,用 GPU 跑 TensorFlow 需要有:
- 英伟达 GPU 驱动
- CUDA Toolkit
- CUPTI,这个是 CUDA 附带的
- cuDNN
如果是在 Windows 平台,直接使用命令 conda install cudatoolkit cudnn
安装好 CUDA 和 cuDNN 就可以直接使用 GPU 计算了,并且不需要再额外安装 CUPTI。但在 Ubuntu 上,三个组件全部安装后,仍然会提示找不到 GPU。即使不使用社区维护的版本,切换到 nvidia channel 安装,也同样无法使用 GPU。
目前测试可行的方法,只能是将这些 CUDA 包都安装到操作系统中,毕竟按官方文档的说法,并不推荐使用 conda 管理 TensorFlow 的包。如果安装到系统中,使用 deb 包的话,CUPTI 就不用额外安装了,它会被 CUDA Toolkit 附带一起安装。
问题 - 安装 pycuda 失败
安装好 TensorRT 后,一般还会需要再安装 pycuda 包,因为有许多 TensorRT 示例会用到这个包。但使用 pip install pycuda
命令安装后,可能会编译失败,提示 ERROR: Could not build wheels for pycuda, which is required to install pyproject.toml-based projects
,往上查找可以看到提示找不到 cuda.h
文件,这是因为之前的 CUDA 是安装在系统中的,在 conda 虚拟环境中安装的 pycuda 不会去系统中寻找,要解决这个问题,要么手动创建链接,要么干脆直接在虚拟环境中再安装一个 CUDA。
安装 cudatoolkit 仍然会提示编译失败,英伟达提供了 cuda 和 cudatoolkit 两个包,安装 cuda 包才能解决编译报错的问题,可以用下面的命令,从 nvidia channel 安装 cuda 包:
conda install cuda -c nvidia
总结
- TensorFlow 相关的包,还是要尽可能用 pip 而不是 conda 去管理,官方并不推荐使用社区维护的版本
- Ubuntu 系统下,CUDA 相关的组件需要安装在系统中,TensorFlow 才能自动找到
- pycuda 默认在虚拟环境中寻找 CUDA,不会去系统中寻找