主机中,运行nvidia-smi查询到的信息为:
NVIDIA-SMI 440.33.01 Driver Version: 440.33.01 CUDA Version: 10.2
0x1
项目中build docker 的文档,需要pull的nvidia docker版本是10.01
FROM nvidia/cuda:10.1-cudnn7-devel-ubuntu16.04
生成的docker,导入到主机中,程序运行正常,但GPU显存和使用率均为极低,可以判断为没有调起GPU。
0x2
将nvidia docker的版本改为10.2,重新生成一次docker,导入主机,程序运行正常,但依然没有使用到GPU。
0x3
查看TensorFlow官网的文档,得到如下信息(https://www.tensorflow.org/install/source#gpu)
GPU
版本 | Python 版本 | 编译器 | 构建工具 | cuDNN | CUDA |
---|---|---|---|---|---|
tensorflow-2.6.0 | 3.6-3.9 | GCC 7.3.1 | Bazel 3.7.2 | 8.1 | 11.2 |
tensorflow-2.5.0 | 3.6-3.9 | GCC 7.3.1 | Bazel 3.7.2 | 8.1 | 11.2 |
tensorflow-2.4.0 | 3.6-3.8 | GCC 7.3.1 | Bazel 3.1.0 | 8.0 | 11.0 |
tensorflow-2.3.0 | 3.5-3.8 | GCC 7.3.1 | Bazel 3.1.0 | 7.6 | 10.1 |
tensorflow-2.2.0 | 3.5-3.8 | GCC 7.3.1 | Bazel 2.0.0 | 7.6 | 10.1 |
tensorflow-2.1.0 | 2.7、3.5-3.7 | GCC 7.3.1 | Bazel 0.27.1 | 7.6 | 10.1 |
tensorflow-2.0.0 | 2.7、3.3-3.7 | GCC 7.3.1 | Bazel 0.26.1 | 7.4 | 10.0 |
使用用python的pip查询一下安装到docker里的tensorflow版本,是最新的2.6.2,由上述资料可知,它使用的cuda是11.2版本,跟docker内的cuda10.1/10.2有冲突,问题似乎出在这里了。再检查build docker的文档,在一个include文件里,有列出了tensorflow的版本要求
tensorflow-gpu>=2.2.0,<2.7.0
官方编译的版本没有cuda 10.2 的版本,尝试使用10.1的 tensorflow 2.3.0。标准操作是将tensorflow版本要求改为
tensorflow-gpu==2.3.0
但重新生成docker比较花时间,决定使用手工降级tensorflow的方法试验一下。本项目涉及的相关库如下,不如项目可能有所差异:
gast-0.3.3 h5py-2.10.0 numpy-1.18.5 scipy-1.4.1 tensorflow-estimator-2.3.0 tensorflow-gpu-2.3.0
使用python -m pip download tensorflow-gpu == 2.3.0,会下载它依赖的所有库。
0x4
在docker中,将tensorflow 从2.6.2降级到2.3.0后,程序运行正常,GPU也能正常调用了。也就是说,docker中安装的cuda版本必须要和tensorflow编译包中的依赖版本一致,但不必跟主机中的cuda版本一致。主机中的cuda版本高于docker版本是可以的,但低于docker版本效果如何,没有继续进行验证了。