我已经为下面写的问题苦苦挣扎了很多天,希望你能帮助我。
我想做的是在 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。
根据下面显示的信息,我认为 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
。>>> 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 容器来说,您不需要在主机系统上安装 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
。