我已经为下面写的问题苦苦挣扎了很多天,希望你能帮助我。我想做的是在 Ubuntu 上的 Docker 上使用带有 GPU 的 tensorflow。我的 GPU 是 GeForce GTX 1070,m...
我已经为下面写的问题苦苦挣扎了很多天,希望你能帮助我。
我想要做的是在 Ubuntu 上的 Docker 上使用带有 GPU 的 tensorflow。
我的 GPU 是 GeForce GTX 1070,操作系统是 Ubuntu 22.04.3 LTS
我已经安装了 Docker
$ docker --version
Docker 版本 26.1.1,内部版本 4cf5afa
在开始以下操作之前,我删除了每个 nvidia 或 cuda 模块。
$ sudo apt-get -y --purge remove nvidia*
$ sudo apt-get -y --purge remove cuda*
$ sudo apt-get -y --purge remove cudnn*
$ sudo apt-get -y --purge remove libnvidia*
$ sudo apt-get -y --purge remove libcuda*
$ sudo apt-get -y --purge remove libcudnn*
$ sudo apt-get autoremove
$ sudo apt-get autoclean
$ sudo apt-get update
$ sudo rm -rf /usr/local/cuda*
$ pip uninstall tensorflow-gpu
之后,我安装了 Nvidia 驱动程序
$ sudo apt install nvidia-driver-535
并且 nvidia-smi 运行良好。
$ nvidia-smi
2024 年 5 月 2 日星期四 18:10:31
+------------------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.104.05 驱动程序版本:535.104.05 CUDA 版本:12.2 |
...
我接下来要做的是按照下面显示的说明安装 CUDA Toolkit 12.2 Update 2。
https://developer.nvidia.com/cuda-12-2-2-download-archive?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=22.04&target_type=deb_local
根据下面显示的信息,我认为 CUDA Toolkit 12.2 Update 2 和驱动程序 535.104.05 兼容。
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
然后我安装了 NVIDIA Container Toolkit,如下所示
$ curl https://get.docker.com | sh \
&& sudo systemctl --now enable docker
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
$ sudo apt-get update
$ sudo apt-get install -y nvidia-container-toolkit
$ sudo nvidia-ctk runtime configure --runtime=docker
$ sudo systemctl restart docker
接下来,我拉取了一个 docker 镜像。
$ docker pull tensorflow/tensorflow:latest-gpu
$ docker container run --rm --gpus all -it --name tf --mount type=bind,source=/home/(myname)/docker/tensorflow,target=/bindcont tensorflow/tensorflow:latest-gpu bash
在 Docker 容器中
root@a887e2a18124:/# python
Linux 上的 Python 3.11.0rc1(main,2022 年 8 月 12 日,10:02:14)[GCC 11.2.0]
输入“帮助”、“版权”、“信用”或“许可”以获取更多信息。
>>> import tensorflow as tf
2024-05-02 09:32:46.211605:我 tensorflow/core/util/port.cc:113] oneDNN 自定义操作已开启。由于不同计算顺序的浮点舍入误差,您可能会看到略有不同的数值结果。要关闭它们,请设置环境变量 TF_ENABLE_ONEDNN_OPTS=0
.
2024-05-02 09:32:46.238888:I tensorflow/core/platform/cpu_feature_guard.cc:210] 此 TensorFlow 二进制文件经过优化,可在性能关键型操作中使用可用的 CPU 指令。
要启用以下指令:AVX2 AVX_VNNI FMA,在其他操作中,使用适当的编译器标志重建 TensorFlow。
>>> tf.config.list_physical_devices()
2024-05-02 09:32:55.124912:Eexternal/local_xla/xla/stream_executor/cuda/cuda_driver.cc:282] 调用 cuInit 失败:CUDA_ERROR_COMPAT_NOT_SUPPORTED_ON_DEVICE:在非受支持的硬件上尝试向前兼容
2024-05-02 09:32:55.124931:Iexternal/local_xla/xla/stream_executor/cuda/cuda_diagnostics.cc:134] 检索主机的 CUDA 诊断信息:226046be5f092024-05-02 09:32:55.124934:I external/local_xla/xla/stream_executor/cuda/cuda_diagnostics.cc:141] 主机名:226046be5f092024-05-02 09:32:55.124963:I external/local_xla/xla/stream_executor/cuda/cuda_diagnostics.cc:165] libcuda 报告的版本为:545.23.6
2024-05-02 09:32:55.124975:I external/local_xla/xla/stream_executor/cuda/cuda_diagnostics.cc:169]内核报告的版本为:535.104.5
2024-05-02 09:32:55.124977:E external/local_xla/xla/stream_executor/cuda/cuda_diagnostics.cc:251] 内核版本 535.104.5 与 DSO 版本 545.23.6 不匹配 - 在此配置中找不到工作设备
[物理设备(名称='/物理设备:CPU:0',设备类型='CPU')]
-- 留言结束 --
似乎驱动程序版本和 cuda 版本不一致,但是我安装的是 dvdriver 版本 535 而不是 545,如上所示。并且在安装驱动程序 535 之前我删除了所有内容。
有人能指出哪里出了问题以及我该怎么做吗?
我的问题还没有解决。
我删除了所有内容并重新安装了 Nvidia driver-545。
并按照说明 https://github.com/NVIDIA/nvidia-docker (已弃用)并
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
这次我没有安装 CUDA Tool-kit,而是安装 NVIDIA Container Toolkit。
我从 nvidia-smi 获得
NVIDIA-SMI 545.29.06
驱动程序版本 545.29.06
CUDA 版本 12.3
然后我运行了一个容器
$ docker container run --rm -it --name tf --mount type=bind,source=/home/susumu/docker/tensorflow,target=/bindcont tensorflow/tensorflow:2.15.0rc1-gpu bash
当我运行sample.py时,我得到了
# python sample.py
2024-05-02 13:46:01.669548:Iexternal/local_tsl/tsl/cuda/cudart_stub.cc:31] 在您的机器上找不到 cudadrivers,GPU 将不会被使用。 2024-05-0213:46:01.689375:Eexternal/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:9261] 无法注册 cuDNN 工厂:尝试注册 plugincuDNN 工厂,但有一个工厂已经注册 2024-05-0213:46:01.689395:Eexternal/local_xla/xla/stream_executor/cuda/cuda_fft.cc:607] 无法注册 cuFFT 工厂:尝试注册 plugincuFFT 工厂,但有一个工厂已经注册 2024-05-0213:46:01.690008:Eexternal/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1515] 无法注册cuBLAS 工厂:尝试为 plugincuBLAS 注册工厂,但有一个工厂已经注册 2024-05-0213:46:01.693281:I external/local_tsl/tsl/cuda/cudart_stub.cc:31]无法在您的机器上找到 cuda 驱动程序,GPU 将不会被使用。
2024-05-02 13:46:01.693384:Itensorflow/core/platform/cpu_feature_guard.cc:182] 此 TensorFlow 二进制文件经过优化,可在性能关键型操作中使用可用的 CPU 指令。要启用以下指令:AVX2 AVX_VNNI FMA,在其他操作中,请使用适当的编译器标志重建 TensorFlow。2024-05-0213:46:02.374705:Eexternal/local_xla/xla/stream_executor/cuda/cuda_driver.cc:274] 调用 cuInit 失败:未知错误 (34)tf.Tensor([[1.][1.]],形状=(2,1),dtype=float32)
这里,sample.py 如下
# cat sample.py
import os
os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0'
import tensorflow as tf
x = tf.ones(shape=(2, 1))
print(x)
正如 mhenning 指出的那样,我的命令缺少“--gpus all”。所以我添加了该选项,然后再次运行。
$ docker container run --rm -it --gpus all --name tf --mount type=bind,source=/home/susumu/docker/tensorflow,target=/bindcont tensorflow/tensorflow:2.15.0rc1-gpu bash
root@112cb77313ca:/bindcont# python sample.py
2024-05-07 13:02:16.253609:Iexternal/local_tsl/tsl/cuda/cudart_stub.cc:31] 在您的机器上找不到 cudadrivers,GPU 将不会被使用。 2024-05-0713:02:16.273561:Eexternal/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:9261] 无法注册 cuDNN 工厂:尝试为 plugincuDNN 注册工厂,但有一个工厂已经注册 2024-05-0713:02:16.273586:Eexternal/local_xla/xla/stream_executor/cuda/cuda_fft.cc:607] 无法注册 cuFFT 工厂:尝试为 plugincuFFT 注册工厂,但有一个工厂已经注册 2024-05-0713:02:16.274202:Eexternal/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1515] 无法注册cuBLAS 工厂:尝试为 plugincuBLAS 注册工厂,但有一个工厂已经注册 2024-05-0713:02:16.277520:I external/local_tsl/tsl/cuda/cudart_stub.cc:31]无法在您的机器上找到 cuda 驱动程序,GPU 将不会被使用。
2024-05-07 13:02:16.277623:Itensorflow/core/platform/cpu_feature_guard.cc:182] 此 TensorFlow 二进制文件经过优化,可在性能关键型操作中使用可用的 CPU 指令。要启用以下指令:AVX2 AVX_VNNI FMA,在其他操作中,请使用适当的编译器标志重建 TensorFlow。2024-05-0713:02:17.104731:Iexternal/local_xla/xla/stream_executor/cuda/cuda_executor.cc:901]从 SysFS 成功读取的 NUMA 节点具有负值(-1),但必须至少有一个 NUMA 节点,因此返回 NUMA 节点零。更多内容请参阅 https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355 2024-05-07 13:02:17.107016: Wtensorflow/core/common_runtime/gpu/gpu_device.cc:2256] 无法下载打开某些 GPU 库。如果您想使用 GPU,请确保正确安装了上述缺失的库。请按照 https://www.tensorflow.org/install/gpu 了解如何下载和设置平台所需的库。跳过注册 GPU 设备...
tf.Tensor(
[[1.]
[1.]], shape=(2, 1), dtype=float32)
2024 年 5 月 13 日编辑
按照 mhenning 的建议,我拉取了 tensorflow/tensorflow:2.14.0-gpu 并尝试再次运行 sample.py。
root@e02085a11772:/bindcont# python sample.py
2024-05-13 12:42:46.130673:Etensorflow/compiler/xla/stream_executor/cuda/cuda_dnn.cc:9342] 无法注册 cuDNN 工厂:尝试注册 plugincuDNN 工厂,但已有工厂注册 2024-05-13 12:42:46.130698:E tensorflow/compiler/xla/stream_executor/cuda/cuda_fft.cc:609] 无法注册 cuFFT 工厂:尝试注册 plugincuFFT 工厂,但已有工厂注册 2024-05-13 12:42:46.130737:E tensorflow/compiler/xla/stream_executor/cuda/cuda_blas.cc:1518]无法注册 cuBLAS工厂:尝试注册插件 cuBLAS 的工厂,但已注册一个 2024-05-1312:42:46.134588:I tensorflow/core/platform/cpu_feature_guard.cc:182]此 TensorFlow 二进制文件经过优化,可在性能关键型操作中使用可用的 CPU 指令。要启用以下指令:AVX2 AVX_VNNI FMA,在其他操作中,请使用适当的编译器标志重建 TensorFlow。2024-05-1312:42:46.980797:Itensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894]成功从 SysFS 读取的 NUMA 节点具有负值(-1),但必须至少有一个 NUMA 节点,因此返回 NUMA 节点零。更多内容请参阅 https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355 2024-05-13 12:42:46.986228: Itensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894]成功从 SysFS 读取的 NUMA 节点具有负值(-1),但必须至少有一个 NUMA 节点,因此返回 NUMA 节点零。更多内容请参阅 https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355 2024-05-13 12:42:46.986414:Itensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894]成功从 SysFS 读取的 NUMA 节点具有负值(-1),但必须至少有一个 NUMA 节点,因此返回 NUMA 节点零。更多内容请参阅 https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355 2024-05-13 12:42:46.987792:Itensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894]成功从 SysFS 读取的 NUMA 节点具有负值(-1),但必须至少有一个 NUMA 节点,因此返回 NUMA 节点零。更多内容请参阅 https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355 2024-05-13 12:42:46.987949: Itensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894]成功从 SysFS 读取的 NUMA 节点具有负值(-1),但必须至少有一个 NUMA 节点,因此返回 NUMA 节点零。更多内容请参阅 https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355 2024-05-13 12:42:46.988049: Itensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894]成功从 SysFS 读取的 NUMA 节点具有负值(-1),但必须至少有一个 NUMA 节点,因此返回 NUMA 节点零。更多内容请参阅 https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355 2024-05-13 12:42:47.092104:Itensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894]成功从 SysFS 读取的 NUMA 节点具有负值(-1),但必须至少有一个 NUMA 节点,因此返回 NUMA 节点零。更多内容请参阅 https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355 2024-05-13 12:42:47.092243: Itensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894]成功从 SysFS 读取的 NUMA 节点具有负值(-1),但必须至少有一个 NUMA 节点,因此返回 NUMA 节点零。更多内容请参见 https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355 2024-05-13 12:42:47.092328: Itensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894]成功从 SysFS 读取的 NUMA 节点具有负值(-1),但必须至少有一个 NUMA 节点,因此返回 NUMA 节点零。更多内容请参阅 https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355 2024-05-13 12:42:47.092398: Itensorflow/core/common_runtime/gpu/gpu_device.cc:1886] 创建设备/作业:localhost/replica:0/task:0/device:GPU:0,内存为 7329 MB:->设备:0,名称:NVIDIA GeForce GTX 1070,pci 总线 ID:0000:04:00.0,计算能力:6.1 tf.Tensor([[1.] [1.]],shape=(2, 1),dtype=float32)
看来我的 GPU 运行正常!
root@bce19cf9ec80:/# python -c "import tensorflow as tf;print(tf.sysconfig.get_build_info())"
2024-05-13 12:46:41.451323:我 tensorflow/core/util/port.cc:111] 一个DNN自定义操作已打开。由于不同计算顺序的浮点舍入误差,您可能会看到略有不同的数值结果。要关闭它们,请设置环境变量
TF_ENABLE_ONEDNN_OPTS=0
。 2024-05-13 12:46:41.471928:Etensorflow/compiler/xla/stream_executor/cuda/cuda_dnn.cc:9342] 无法注册 cuDNN 工厂:尝试注册 plugincuDNN 工厂,但已有工厂注册 2024-05-13 12:46:41.471950:E tensorflow/compiler/xla/stream_executor/cuda/cuda_fft.cc:609] 无法注册 cuFFT 工厂:尝试注册 plugincuFFT 工厂,但已有工厂注册 2024-05-13 12:46:41.471964:E tensorflow/compiler/xla/stream_executor/cuda/cuda_blas.cc:1518]无法注册 cuBLAS工厂:尝试为插件 cuBLAS 注册工厂,但已注册一个工厂 2024-05-1312:46:41.475902:I tensorflow/core/platform/cpu_feature_guard.cc:182]此 TensorFlow 二进制文件经过优化,可在性能关键型操作中使用可用的 CPU 指令。要启用以下指令:AVX2 AVX_VNNI FMA,在其他操作中,使用适当的编译器标志重建TensorFlow。OrderedDict([('cpu_compiler', '/usr/lib/llvm-16/bin/clang'),('cuda_compute_capabilities', ['sm_35', 'sm_50', 'sm_60', 'sm_70','sm_75', 'compute_80']), ('cuda_version', '11.8'), ('cudnn_version','8'), ('is_cuda_build', True), ('is_rocm_build', False),('is_tensorrt_build', True)])
顺便说一句,当我检查我的 BIOS 设置时,安全启动已关闭,所以它与我的麻烦无关。
对于 docker 容器来说,似乎 不需要 在主机系统上安装 CUDA 驱动程序。来自链接:
Docker 是在 Linux 上启用 TensorFlow GPU 支持的最简单方法,因为主机上只需要 NVIDIA® GPU 驱动程序( 不需要安装 NVIDIA® CUDA® Toolkit )。
此 TF 容器内安装了 CUDA 12.3(您可以在 image layers
此处的 列表 ),根据 此表 (表中的表 3 NVIDIA CUDA Toolkit Release Notes
),CUDA 12.3 需要 nvidia 驱动程序 >=545(这是错误堆栈中的不匹配)。这与其他表格有点违反直觉,其中 CUDA 12 的最低要求只是驱动程序版本 >=525。来自链接:
CUDA Toolkit Toolkit Driver Version
Linux x86_64 Driver Version Windows x86_64 Driver Version
CUDA 12.4 Update 1 >=550.54.15 >=551.78
CUDA 12.4 GA >=550.54.14 >=551.61
CUDA 12.3 Update 1 >=545.23.08 >=546.12
CUDA 12.3 GA >=545.23.06 <- this one >=545.84
CUDA 12.2 Update 2 >=535.104.05 >=537.13
...
最简单的方法是将驱动程序更新到版本 >=545。对于 1070,最新的驱动程序似乎是 550,因此从版本上来说应该没问题。
或者,您可以使用最后一个 docker 镜像, CUDA 11.8
,其内容是tensorflow:2.15.0rc1-gpu 在查看定义时, CUDA 12.3
此镜像之后的所有其他 gpu 镜像似乎都使用 image layers
.
编辑:我推荐的 tensorflow 标签是错误的,这确实是最不值得推荐的版本。它确实安装了 CUDA 11.8
,可以使用 进行检查 nvcc --version
(或一行) tf.sysconfig.get_build_info()
检查所需的 CUDA 版本时
python3 -c "import tensorflow as tf;print(tf.sysconfig.get_build_info())"
您将获得以下内容 tensorflow:2.15.0rc1-gpu
:
OrderedDict([('cpu_compiler','/usr/lib/llvm-17/bin/clang'),('cuda_compute_capabilities',['sm_50','sm_60','sm_70','sm_75','compute_80']),('cuda_version','12.2'),('cudnn_version','8'),('is_cuda_build',True),('is_rocm_build',False),('is_tensorrt_build',True)])
在这里您可以看到 TF 需要 CUDA 12.2,但显然没有安装,从而导致该容器的 GPU 功能无效。
我检查了其他标签,对于 CUDA 11.8,您可以使用标签 tensorflow/tensorflow:2.14.0-gpu
,对于 CUDA 12.2,您可以使用 tensorflow/tensorflow:2.15.0-gpu
(非 rc 版本)及以上版本。