Tensorflow无法在GPU上运行

48

我已经花了相当长的时间在Stack Overflow和其他地方寻找答案,但是没有找到任何东西。

大家好,

我正在使用Tensorflow和Keras。我有90%的把握我安装了Tensorflow GPU,有没有办法检查我安装的版本?

我试图从Jupyter Notebook中运行一些CNN模型,但是发现Keras在CPU上运行模型(通过任务管理器检查,CPU占用率为100%)。

我尝试运行了Tensorflow网站上的这段代码:

# Creates a graph.
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
# Creates a session with log_device_placement set to True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# Runs the op.
print(sess.run(c))

这是我得到的内容:
MatMul: (MatMul): /job:localhost/replica:0/task:0/cpu:0
2017-06-29 17:09:38.783183: I c:\tf_jenkins\home\workspace\release-win\m\windows\py\35\tensorflow\core\common_runtime\simple_placer.cc:847] MatMul: (MatMul)/job:localhost/replica:0/task:0/cpu:0
b: (Const): /job:localhost/replica:0/task:0/cpu:0
2017-06-29 17:09:38.784779: I c:\tf_jenkins\home\workspace\release-win\m\windows\py\35\tensorflow\core\common_runtime\simple_placer.cc:847] b: (Const)/job:localhost/replica:0/task:0/cpu:0
a: (Const): /job:localhost/replica:0/task:0/cpu:0
2017-06-29 17:09:38.786128: I c:\tf_jenkins\home\workspace\release-win\m\windows\py\35\tensorflow\core\common_runtime\simple_placer.cc:847] a: (Const)/job:localhost/replica:0/task:0/cpu:0
[[ 22.  28.]
 [ 49.  64.]]

根据我的理解,这表明我正在使用CPU运行程序。

我拥有一张GTX1050显卡(驱动版本382.53),我已经安装了CUDA、Cudnn和TensorFlow,安装过程没有出现任何问题。我还安装了Visual Studio 2015,因为它被列为兼容版本之一。

我记得CUDA曾提到过安装了不兼容的驱动程序,但如果我没记错的话,CUDA应该会安装自己的驱动程序。

编辑:我运行了以下命令以列出可用设备

from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())

这是我得到的内容

[name: "/cpu:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 14922788031522107450
]

还有很多类似这样的警告

2017-06-29 17:32:45.401429: W c:\tf_jenkins\home\workspace\release-win\m\windows\py\35\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE instructions, but these are available on your machine and could speed up CPU computations.

编辑2

尝试运行

pip3 install --upgrade tensorflow-gpu

并且我得到

Requirement already up-to-date: tensorflow-gpu in c:\users\xxx\appdata\local\programs\python\python35\lib\site-packages
Requirement already up-to-date: markdown==2.2.0 in c:\users\xxx\appdata\local\programs\python\python35\lib\site-packages (from tensorflow-gpu)
Requirement already up-to-date: html5lib==0.9999999 in c:\users\xxx\appdata\local\programs\python\python35\lib\site-packages (from tensorflow-gpu)
Requirement already up-to-date: werkzeug>=0.11.10 in c:\users\xxx\appdata\local\programs\python\python35\lib\site-packages (from tensorflow-gpu)
Requirement already up-to-date: wheel>=0.26 in c:\users\xxx\appdata\local\programs\python\python35\lib\site-packages (from tensorflow-gpu)
Requirement already up-to-date: bleach==1.5.0 in c:\users\xxx\appdata\local\programs\python\python35\lib\site-packages (from tensorflow-gpu)
Requirement already up-to-date: six>=1.10.0 in c:\users\xxx\appdata\local\programs\python\python35\lib\site-packages (from tensorflow-gpu)
Requirement already up-to-date: protobuf>=3.2.0 in c:\users\xxx\appdata\local\programs\python\python35\lib\site-packages (from tensorflow-gpu)
Requirement already up-to-date: backports.weakref==1.0rc1 in c:\users\xxx\appdata\local\programs\python\python35\lib\site-packages (from tensorflow-gpu)
Requirement already up-to-date: numpy>=1.11.0 in c:\users\xxx\appdata\local\programs\python\python35\lib\site-packages (from tensorflow-gpu)
Requirement already up-to-date: setuptools in c:\users\xxx\appdata\local\programs\python\python35\lib\site-packages (from protobuf>=3.2.0->tensorflow-gpu)

已解决: 请查看评论中的解决方案。 感谢所有提供帮助的人!

我是新手,非常感谢任何帮助! 谢谢。


2
你可以通过运行 pip list 命令并检查所有包含 tensorflow 的行来确认你是否安装了多个 tensorflow 版本。 - P-Gn
4
你应该卸载TensorFlow并保留TensorFlow-GPU:pip uninstall tensorflow - Manolo Santos
4
好的,我认为我已经解决了问题。我想当我卸载tensorflow时,它删除了__init__.py文件或其他文件。所以我运行了 pip install --ignore-installed --upgrade 命令,现在这个 from tensorflow.python.client import device_lib print(device_lib.list_local_devices()) 显示gpu作为其中一个设备。 - valegians
2
我尝试了上述步骤,但没有显示GPU设备。已经在已安装软件列表中看到了tensorflow-gpu和tensorflow-tensorboard。有什么帮助吗? - deadcode
6
从版本1.15开始,tensorflow-gpu已经被包含在tensorflow中。https://www.tensorflow.org/install/gpu - lineage
显示剩余13条评论
8个回答

43

要检查哪些设备可用于TensorFlow,您可以使用此命令并查看GPU卡是否可用:

from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())

更多信息

还有由TF_CPP_MIN_VLOG_LEVEL环境变量控制的C++日志,例如:

import os
os.environ["TF_CPP_MIN_VLOG_LEVEL"] = "2"

应该允许在运行 import tensorflow as tf 时打印它们。

如果您使用启用了 GPU 的 tensorflow 并具有对 GPU 计算机的适当访问权限,则应该看到此类日志:

successfully opened CUDA library libcublas.so.*.* locally
successfully opened CUDA library libcudnn.so.*.*  locally
successfully opened CUDA library libcufft.so.*.*  locally

另一方面,如果系统/容器中没有CUDA库,则会看到:

Could not find cuda drivers on your machine, GPU will not be used.

在CUDA已经安装的情况下,但是没有可用的GPU,TF会在导入时不出错,只有当你运行device_lib.list_local_devices()时才会出现错误:

failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected


1
它们是C++日志,由TF_CPP_MIN_VLOG_LEVEL环境变量控制,例如:当运行import tensorflow as tf时,export TF_CPP_MIN_VLOG_LEVEL=2应该允许它们被打印。 - pfm
在我的情况下,TF_CPP_MAX_VLOG_LEVEL=2 起作用,而不是 TF_CPP_MIN_VLOG_LEVEL=2 - undefined

21

听起来可能很傻,但尝试重新启动。这对我和其他一些GitHub上的人有帮助。


6
我也一样。这是什么鬼?我已经苦恼了两天,只需要重新启动一次就解决了 :| - Keerthana Gopalakrishnan
3
我爱你。在我的情况下,这可能是因为在从X更改驱动程序为NVidia后没有重新启动。 - Kostas Mouratidis
3
我使用TensorFlow GPU已经好几个月了,突然间它不再使用GPU了。重新启动解决了这个问题。谢谢。 - McGuile

10

2
如果你在GPU上运行Tensorflow时遇到问题,你应该检查是否安装了好的/任何版本的CUDA和cuDNN。
这些版本最好与开发人员在这里测试过的版本完全相同。例如,对于tensorflow==2.8.0,你应该安装CUDA v11.2cuDNN v8.1
此外,你还应该将CUDA的/bin文件夹和/libnvvp添加到系统路径中。
这个答案基于Tensorflow 2021安装教程

1
非常好的观点 - TF与PyTorch完全相反(后者附带其自己的cuDNN库):如果您根本没有安装cuDNN(例如使用11.8.0-devel-ubuntu22.04容器映像而不是11.8.0-cudnn8-devel-ubuntu22.04),TF将不会发出任何投诉(悄悄地回退到CPU)。之前每个图像节省了1.5 GB,但以后可能会浪费您一天左右的调试时间。 - mirekphd

2
如果您正在使用Anaconda来管理您的环境,那么请卸载所有现有版本的tensorflow。
pip uninstall tensorflow
pip3 uninstall tensorflow

使用conda安装tensorflow-gpu

conda install tensorflow-gpu

如果您不介意从一个新环境开始,最简单的方法是这样做:

conda create --name tf_gpu tensorflow-gpu 

创建一个名为tf_gpu的conda环境,并安装了tensorflow gpu。

3
我相信目前tensorflow已经是基于GPU的版本,而tensorflow-gpu则已经过时。"如果需要基于CPU构建,则需使用名为tensorflow-cpu的pip包。" - Moss Richardson

1

对我来说,以下方法有效。

我使用了conda环境,因为Python环境意味着要设置LD_LIBRARY_PATH并手动安装Cuda,这又是一个麻烦。

在提到的博客中,他在conda中安装了cudatoolkitcudann,然后稍后安装了tensorflow-gpu,这解决了问题。

顺便说一下,据我所读,cudatoolkit和cudann在让您的代码在tensorflow-gpu上运行方面起着重要作用。


1

我遇到了类似的问题,我的 TensorFlow 库版本如下。

tensorboard               2.4.1              pyhd8ed1ab_1    conda-forge
tensorboard-plugin-wit    1.8.0              pyh44b312d_0    conda-forge
tensorflow                2.4.1            py39hf3d152e_0    conda-forge
tensorflow-base           2.4.1            py39h23a8cbf_0    conda-forge
tensorflow-estimator      2.4.0              pyh9656e83_0    conda-forge
tensorflow-gpu            2.4.1                h30adc30_0

在另一台机器上安装了相同版本的库,该机器能够利用GPU。两台机器(工作和不工作的)的Cuda工具包版本和驱动程序版本都是相同的。

事实证明,tensorflow-gpu=2.4.1与Python版本3.8.10兼容。 将我的Python版本更改为3.8.10并保持其他所有内容不变对我有用!


1
您可能还存在CUDA版本不匹配的问题需要解决(将tensorflow降级/固定到您系统CUDA支持的最新版本可能更快,但只是反向操作才能保证未来兼容性)。
要验证,请检查已安装的Tensorflow软件包中使用的CUDA版本:
>>> import tensorflow as tf
>>> tf.sysconfig.get_build_info()['cuda_version']
'11.8'

...并将其与主机/容器/虚拟机上安装的CUDA版本进行比较:

>>> import os
>>> os.system("nvcc --version")

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Sun_Feb_14_21:12:58_PST_2021
Cuda compilation tools, release 11.2, V11.2.152
Build cuda_11.2.r11.2/compiler.29618528_0
0

更多信息

tensorflow导入时没有任何警告,但在装有CUDA库的GPU设备上检测到只有CPU时,则可能存在预编译的tensorflow包轮和系统/容器安装版本之间的CUDA版本不匹配。

上述CUDA版本不匹配(Tensorflow编译期间使用v11.8与容器中安装的v11.2 CUDA编译器)导致TF无法访问GPU,尽管nvidia-smi正确加载)。

另请参见: Tensorflow CUDA兼容性表(已测试的构建配置):


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