8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在 Ubuntu 上的 Docker 上使用 GPU 运行 TensorFlow

Ryan Day 2月前

29 0

我已经为下面写的问题苦苦挣扎了很多天,希望你能帮助我。我想做的是在 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 设置时,安全启动已关闭,所以它与我的麻烦无关。

帖子版权声明 1、本帖标题:在 Ubuntu 上的 Docker 上使用 GPU 运行 TensorFlow
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Ryan Day在本站《ubuntu》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我添加了 --gpus all,但没有用。我最近根据以下信息认为这是一个“禁用安全启动”问题。我有更多时间时会尝试一下。

返回
作者最近主题: