TensorFlow实际使用的CUDA库

4
我使用命令pip3.6 install tensorflow-gpu安装了(我认为)支持CUDA的TF,根据TF安装页面。
我的本地CUDA安装是CUDA 9.0和CUDNN 7.3.1在/usr/local/cuda-9.0中。
按照提示https://github.com/tensorflow/tensorflow/issues/10827,我正在检查虚拟环境中TF使用的库。
% python -c 'import tensorflow as tf; print(tf.sysconfig.get_lib() + "/python/_pywrap_tensorflow_internal.so")' | xargs ldd
linux-vdso.so.1 (0x00007fff57eb8000)
libtensorflow_framework.so => /home/mark/projects/bench/venvs/ve_tf/lib/python3.6/site-packages/tensorflow/python/../libtensorflow_framework.so (0x00007ff29fa25000)
libcublas.so.9.0 => /usr/local/cuda-9.0/lib64/libcublas.so.9.0 (0x00007ff29bda8000)
libcusolver.so.9.0 => /usr/local/cuda-9.0/lib64/libcusolver.so.9.0 (0x00007ff2971ad000)
libcudart.so.9.0 => /usr/local/cuda-9.0/lib64/libcudart.so.9.0 (0x00007ff296f40000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff296d3c000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff296b1f000)
libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007ff2968f2000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff2965ee000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007ff2963e6000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff296064000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff295e4d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff295aae000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff2cb7c7000)
libcuda.so.1 => /usr/lib/x86_64-linux-gnu/libcuda.so.1 (0x00007ff294f0e000)
libcudnn.so.7 => /usr/local/cuda-9.0/lib64/libcudnn.so.7 (0x00007ff282bd5000)
libcufft.so.9.0 => /usr/local/cuda-9.0/lib64/libcufft.so.9.0 (0x00007ff27ab34000)
libcurand.so.9.0 => /usr/local/cuda-9.0/lib64/libcurand.so.9.0 (0x00007ff276bd0000)
libnvidia-fatbinaryloader.so.390.77 => /usr/lib/x86_64-linux-gnu/libnvidia-fatbinaryloader.so.390.77 (0x00007ff276984000)

libcudnn.so 似乎指向正确的库,但是对于 libcuda.so 我有一些疑虑:

libcuda.so.1 => /usr/lib/x86_64-linux-gnu/libcuda.so.1 (0x00007ff294f0e000)

% readlink -f /usr/lib/x86_64-linux-gnu/libcuda.so.1 
/usr/lib/x86_64-linux-gnu/libcuda.so.390.77

好的,显然这会导致CUDA库被NVIDIA设备驱动程序所使用/提供...

这正常吗?它不应该使用/usr/local/cuda-9.0中的libcuda.so吗?

我有一个:/usr/local/cuda-9.0/lib64/stubs/libcuda.so


在这种情况下,“存根”是关键词。 - talonmies
1个回答

10

是的,这是正常的。

所使用的libcuda 库肯定应该是由 GPU 驱动程序提供(安装)。绝对不能使用 stubs 目录中的库。该目录中的文件(或任何在 /usr/local/cuda... 路径下的文件)是为了不同的目的而存在,基本上与某些情况下的应用程序构建有关,而不是用于运行任何应用程序。

对于运行应用程序(如 Tensorflow),需要使用由驱动程序提供的共享对象,用于 libcuda 库。

(stubs 目录中的 libcuda.so 是为您在安装 CUDA 工具包但未安装 GPU 驱动程序时构建 GPU 应用程序而提供的场景提供的,但当然不会运行它们。这种情况可能存在于计算集群中的主节点/登录节点上。在这种情况下,登录节点/构建节点可能没有安装 GPU,但您仍然希望构建 CUDA driver API 应用程序。这样的应用程序需要构建,也就是链接到驱动程序 API 库,并且该库由 libcuda.so 提供。因此,针对此场景提供了一个“存根”库。该“存根”库具有 API 链接过程所需的所有内容,但否则不可用。)


感谢@robert-crovella对CUDA工具包stubs/libcuda.so的解释 - 这与我所假设的相符。我一直在不同的上下文(https://gcc.gnu.org/wiki/Offloading)中查找这个问题,虽然您的答案对我的情况足够,但我想知道是否有任何官方的CUDA文档介绍CUDA工具包`stubs/libcuda.so`?(我找不到任何信息;谷歌搜索引导我来到这里。) - tschwinge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接