tensorflow gpu仅在CPU上运行

时间:2018-10-20 08:56:41

标签: tensorflow keras gpu

我在Windows 10和所有必要的Nvidia / Cuda软件包上安装了Anaconda-Navigator,创建了一个名为tensorflow-gpu-env的新环境,更新了PATH信息等。当我运行模型时(使用tensorflow.keras进行构建) ,我发现CPU利用率显着提高,GPU利用率为0%,并且该模型无法训练。

我进行了一些测试以确保外观:

print(tf.test.is_built_with_cuda())
True

上面的输出(“ True”)看起来正确。

另一种尝试:

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

输出:

[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 1634313269296444741
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 1478485606
locality {
  bus_id: 1
  links {
  }
}
incarnation: 16493618810057409699
physical_device_desc: "device: 0, name: GeForce 940MX, pci bus id: 0000:01:00.0, compute capability: 5.0"
]

到目前为止一切顺利...在我的代码后面,我从以下代码开始训练:

history = merged_model.fit_generator(generator=train_generator,
                                     epochs=60,
                                     verbose=2,
                                     callbacks=[reduce_lr_on_plateau],
                                     validation_data=val_generator,
                                     use_multiprocessing=True,
                                     max_queue_size=50,
                                     workers=3)

我还尝试了如下培训:

with tf.device('/gpu:0'):
    history = merged_model.fit_generator(generator=train_generator,
                                         epochs=60,
                                         verbose=2,
                                         callbacks=[reduce_lr_on_plateau],
                                         validation_data=val_generator,
                                         use_multiprocessing=True,
                                         max_queue_size=50,
                                         workers=3)

无论我如何开始培训,它都永远不会开始培训,我一直看到CPU利用率提高,GPU利用率为0%。

为什么我的tensorflow-gpu安装仅使用CPU?花了HOURS,实际上没有任何进展。

添加

当我在控制台上运行conda list时,我看到以下有关张量流的信息:

tensorflow-base           1.11.0          gpu_py36h6e53903_0
tensorflow-gpu            1.11.0                    <pip>

这个基于tensorflow的基础是什么?会引起问题吗?在安装tensorflow-gpu之前,请确保同时使用conda和pip卸载了tensorflow和tensorflow-gpu。然后使用pip安装tensorflow-gpu。我不确定我的tensorflow-gpu安装是否随附了这个基于tensorflow的基础。

附录2 tensorflow-base似乎是conda的一部分,因为我可以使用conda uninstall tensorflow-base卸载它。我仍然有tensorflow-gpu安装,但现在无法再导入tensorflow。它说“没有模块命名为tensorflow”。看来我的conda环境没有看到我的tensorflor-gpu安装。此刻我很困惑。

2 个答案:

答案 0 :(得分:1)

根据网络的大小,CPU大部分时间都在加载数据。

由于您正在使用Python生成器,因此大部分时间都将花费在Python代码打开文件上。生成器可能正在阻塞您的管道。

一旦加载了数据,由于您的Gpu不断等待新数据,它可能会立即在GPU上进行评估,导致GPU利用率几乎为0%。您可以尝试使用TensorFlows dataset API。 tfrecords的加载时间非常快。看看这个article

答案 1 :(得分:1)

@Smokrow,谢谢您以上的回答。 在Windows平台上,Keras似乎在多处理方面遇到问题。

history = merged_model.fit_generator(generator=train_generator,
                                     epochs=60,
                                     verbose=2,
                                     callbacks=[reduce_lr_on_plateau],
                                     validation_data=val_generator,
                                     use_multiprocessing=True,
                                     max_queue_size=50,
                                     workers=3)

以上代码段导致Keras挂起,实际上看不到进度。如果用户正在Windows上运行他/她的代码,则use_multiprocessor需要设置为False!否则,它将不起作用。 有趣的是,仍然可以将worker设置为大于1的数字,并且仍然可以提高性能。我很难理解后台实际发生的情况,但确实可以提高性能。因此,下面的代码使它起作用。

history = merged_model.fit_generator(generator=train_generator,
                                     epochs=60,
                                     verbose=2,
                                     callbacks=[reduce_lr_on_plateau],
                                     validation_data=val_generator,
                                     use_multiprocessing=False,  # CHANGED
                                     max_queue_size=50,
                                     workers=3)