在 Ubuntu 上的 Docker 上使用带有 GPU 的 TensorFlow

问题描述 投票:0回答:1

我已经为下面写的问题苦苦挣扎了很多天,希望你能帮助我。
我想做的是在 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(主要,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:我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:E external/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:我 external/local_xla/xla/stream_executor/cuda/cuda_diagnostics.cc:134] 检索主机的 CUDA 诊断信息:226046be5f09 2024-05-02 09:32:55.124934:我外部/local_xla/xla/stream_executor/cuda/cuda_diagnostics.cc:141]主机名:226046be5f09 2024-05-02 09:32:55.124963:我 external/local_xla/xla/stream_executor/cuda/cuda_diagnostics.cc:165] libcuda 报告的版本是:545.23.6
2024-05-02 09:32:55.124975:我 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 不匹配 - 在此配置中找不到工作设备
[PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU')]
-- 留言结束 --

看起来驱动版本和cuda版本不一致,但我安装的是dvriver版本535而不是545,如上所示。 在安装驱动程序 535 之前我删除了所有内容。

有人可以建议我出了什么问题以及我应该做什么吗?

docker tensorflow ubuntu cuda
1个回答
0
投票

对于 docker 容器来说,您不需要在主机系统上安装 CUDA 驱动程序。来自链接:

Docker 是在 Linux 上启用 TensorFlow GPU 支持的最简单方法,因为主机上只需要 NVIDIA® GPU 驱动程序(不需要安装 NVIDIA® CUDA® 工具包)。

这个TF容器里面安装了CUDA 12.3(你可以在

image layers
列表这里看到它),并且根据这个表
NVIDIA CUDA Toolkit Release Notes
中的表3)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,所以你应该在版本方面没问题。
或者,您可以使用最后一个带有

CUDA 11.8
的 docker 镜像,即 tensorflow:2.15.0rc1-gpu。在查看
CUDA 12.3
中的定义时,此后的所有其他 GPU 图像似乎都使用
image layers

© www.soinside.com 2019 - 2024. All rights reserved.