带有 TensorFlow 后端的 Keras 不使用 GPU

Posted

技术标签:

【中文标题】带有 TensorFlow 后端的 Keras 不使用 GPU【英文标题】:Keras with TensorFlow backend not using GPU 【发布时间】:2018-02-15 06:20:41 【问题描述】:

我使用 keras 版本 2.0.0 和 tensorflow 版本 0.12.1 构建了 docker 镜像 https://github.com/floydhub/dl-docker 的 gpu 版本。然后我运行了 mnist 教程https://github.com/fchollet/keras/blob/master/examples/mnist_cnn.py,但意识到 keras 没有使用 GPU。以下是我的输出

root@b79b8a57fb1f:~/sharedfolder# python test.py
Using TensorFlow backend.
Downloading data from https://s3.amazonaws.com/img-datasets/mnist.npz
x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
Train on 60000 samples, validate on 10000 samples
Epoch 1/12
2017-09-06 16:26:54.866833: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
2017-09-06 16:26:54.866855: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
2017-09-06 16:26:54.866863: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
2017-09-06 16:26:54.866870: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.
2017-09-06 16:26:54.866876: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations.

谁能告诉我在 keras 使用 GPU 之前是否需要进行一些设置?我对所有这些都很陌生,所以如果我需要提供更多信息,请告诉我。

我已经安装了page中提到的先决条件

按照您平台的安装指南安装 Docker:https://docs.docker.com/engine/installation/

我可以启动 docker 镜像

docker run -it -p 8888:8888 -p 6006:6006 -v /sharedfolder:/root/sharedfolder floydhub/dl-docker:cpu bash
仅限 GPU 版本:直接从 Nvidia 或按照说明 here 在您的计算机上安装 Nvidia 驱动程序。请注意,您不必安装 CUDA 或 cuDNN。这些都包含在 Docker 容器中。

我可以运行最后一步

cv@cv-P15SM:~$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  375.66  Mon May  1 15:29:16 PDT 2017
GCC version:  gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)
仅限 GPU 版本:按照此处的说明安装 nvidia-docker:https://github.com/NVIDIA/nvidia-docker。这将安装 docker CLI 的替代品。它负责在 Docker 容器内设置 Nvidia 主机驱动程序环境以及其他一些事情。

我可以运行步骤here

# Test nvidia-smi
cv@cv-P15SM:~$ nvidia-docker run --rm nvidia/cuda nvidia-smi

Thu Sep  7 00:33:06 2017       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.66                 Driver Version: 375.66                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 780M    Off  | 0000:01:00.0     N/A |                  N/A |
| N/A   55C    P0    N/A /  N/A |    310MiB /  4036MiB |     N/A      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|    0                  Not Supported                                         |
+-----------------------------------------------------------------------------+

我还可以运行 nvidia-docker 命令来启动支持 gpu 的映像。

我的尝试

我尝试了以下建议

    检查您是否已完成本教程的第 9 步 (https://github.com/ignaciorlando/skinner/wiki/Keras-and-TensorFlow-installation)。注意:您的文件路径在该 docker 映像中可能完全不同,您必须以某种方式找到它们。

我将建议的行附加到我的 bashrc 并已验证 bashrc 文件已更新。

echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-8.0/lib64:/usr/local/cuda-8.0/extras/CUPTI/lib64' >> ~/.bashrc
echo 'export CUDA_HOME=/usr/local/cuda-8.0' >> ~/.bashrc

    在我的python文件中导入以下命令

    import os os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"]="0"

不幸的是,这两个步骤单独或一起完成并没有解决问题。 Keras 仍然以 CPU 版本的 tensorflow 作为其后端运行。但是,我可能已经发现了可能的问题。我通过以下命令检查了我的 tensorflow 的版本,并找到了其中的两个。

这是CPU版本

root@08b5fff06800:~# pip show tensorflow
Name: tensorflow
Version: 1.3.0
Summary: TensorFlow helps the tensors flow
Home-page: http://tensorflow.org/
Author: Google Inc.
Author-email: opensource@google.com
License: Apache 2.0
Location: /usr/local/lib/python2.7/dist-packages
Requires: tensorflow-tensorboard, six, protobuf, mock, numpy, backports.weakref, wheel

这是GPU版本

root@08b5fff06800:~# pip show tensorflow-gpu
Name: tensorflow-gpu
Version: 0.12.1
Summary: TensorFlow helps the tensors flow
Home-page: http://tensorflow.org/
Author: Google Inc.
Author-email: opensource@google.com
License: Apache 2.0
Location: /usr/local/lib/python2.7/dist-packages
Requires: mock, numpy, protobuf, wheel, six

有趣的是,输出显示 keras 使用的是 tensorflow 版本 1.3.0,它是 CPU 版本,而不是 0.12.1,GPU 版本

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K

import tensorflow as tf
print('Tensorflow: ', tf.__version__)

输出

root@08b5fff06800:~/sharedfolder# python test.py
Using TensorFlow backend.
Tensorflow:  1.3.0

我想现在我需要弄清楚如何让 keras 使用 gpu 版本的 tensorflow。

【问题讨论】:

如果您遵循适用于您的操作系统的 Tensorflow 安装指南 (tensorflow.org/install),它将告诉您所需的一切。您很可能缺少 CUDA 和 CUDAnn 库。 @KDecker 但它在github.com/floydhub/dl-docker 上说 gpu 版本带有 CUDA 8.0 和 cuDNN v5 哦,这是 Docker 镜像。抱歉,我看了一眼。我不知道该告诉你什么,除了,你是否遵循图像的附加条件? (安装 NVidia 驱动和 nvidia-docker) 嗨,是的,我已经遵循了先决条件(更新了我的帖子) 检查您是否已完成本教程的第 9 步 (github.com/ignaciorlando/skinner/wiki/…)。注意:您的文件路径在该 docker 映像中可能完全不同,您必须以某种方式找到它们。 【参考方案1】:

从不tensorflowtensorflow-gpu 软件包并排安装是一个好主意(有一次我不小心发生了这种情况,Keras 使用的是 CPU 版本)。

我想现在我需要弄清楚如何让 keras 使用 gpu 版本的 tensorflow。

您应该简单地从系统中删除这两个软件包,然后重新安装 tensorflow-gpu [评论后更新]:

pip uninstall tensorflow tensorflow-gpu
pip install tensorflow-gpu

此外,令人费解的是为什么您似乎使用floydhub/dl-docker:cpu 容器,而根据说明您应该使用floydhub/dl-docker:gpu 一个...

【讨论】:

哇,你是最正确的。虽然我发现我必须卸载 tensorflow 和 tensorflow-gpu 然后重新安装 tensorflow-gpu。如果我只卸载 tensorflow,那么 python 不会检测到 gpu 版本。让图书馆工作可能会非常耗费精力。 现在可以了。我的意思是在卸载 tensoflow-gpu 之后。而不是重新安装 tensorflow-gpu。在它不起作用之前。 @khan hehe,幸好你叫醒我,先投反对票来编辑它-谢谢;) @desertnaut :D 感谢您更新它。 @BtcSources Tensorboard 可用于两个 Tensorflow 版本 - CPU 和 GPU【参考方案2】:

以后可以尝试使用虚拟环境来分离tensorflow CPU和GPU,例如:

conda create --name tensorflow python=3.5
activate tensorflow
pip install tensorflow

conda create --name tensorflow-gpu python=3.5
activate tensorflow-gpu
pip install tensorflow-gpu

【讨论】:

【参考方案3】:

我遇到了类似的问题 - keras 没有使用我的 GPU。我根据 conda 中的说明安装了 tensorflow-gpu,但是在安装 keras 之后,它根本没有将 GPU 列为可用设备。我已经意识到安装 keras 会添加 tensorflow 包!所以我有 tensorflow 和 tensorflow-gpu 包。我发现有可用的 keras-gpu 包。完全卸载keras, tensorflow, tensorflow-gpu,安装tensorflow-gpu, keras-gpu后问题解决。

【讨论】:

【参考方案4】:

这对我有用: 安装tensorflow v2.2.0 pip install tensorflow==2.2.0 同时删除 tensorflow-gpu(如果存在)

【讨论】:

以上是关于带有 TensorFlow 后端的 Keras 不使用 GPU的主要内容,如果未能解决你的问题,请参考以下文章

Keras tensorflow 后端未检测到 GPU

具有Tensorflow后端的Keras的K.function方法是否适用于网络层?

具有Tensorflow后端的Keras - 运行在CPU上预测但适合GPU

如何在多核上运行 Keras?

使用Tensorflow后端的Keras LSTM RNN中令人费解的训练损失与纪元...行为的任何原因

训练后使用量化权重进行 keras 模型评估