【问题标题】:tensorflow gpu is only running on CPUtensorflow gpu 仅在 CPU 上运行
【发布时间】:2018-10-20 08:56:40
【问题描述】:

我在 Windows 10 上安装了 Anaconda-Navigator 和所有必要的 Nvidia/Cuda 软件包,创建了一个名为 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 的信息:

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

这个 tensorflow-base 是什么?它会导致问题吗?在安装 tensorflow-gpu 之前,我确保我使用 conda 和 pip 卸载了 tensorflow 和 tensorflow-gpu;然后使用pip 安装 tensorflow-gpu。我不确定这个 tensorflow-base 是否与我的tensorflow-gpu 安装一起提供。

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

【问题讨论】:

    标签: tensorflow keras gpu


    【解决方案1】:

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

    由于您使用的是 Python 生成器,因此您的大部分时间都将花在 Python 代码打开文件上。生成器可能会成为您管道的瓶颈。

    加载数据后,可能会立即在 GPU 上对其进行评估,从而导致 GPU 利用率几乎为 0%,因为您的 Gpu 一直在等待新数据。您可以尝试使用 TensorFlows dataset API。 tfrecords 的加载时间非常快。看看这个article

    【讨论】:

    • 感谢您的回答。但是,看起来这不是问题,因为 0% 的 GPU 利用率并不是唯一奇怪的问题。如果我的回答正确,那么它应该以某种方式进行培训,我应该在那里看到一些进展。但就我而言,它根本不是训练。它只是冻结,没有任何反应。我在上面的附录 2 中添加了更多信息。看起来我的 Jupyter 无法看到我的 Tensorflow GPU 安装。会不会是问题?
    • 我可以试试。但你这是什么意思?
    • 尝试使用普通的 Python 解释器而不是 Jupyter notebook 运行它。例如,您可以使用 VS Code 作为编辑器。它有一个集成的 Python 执行插件。
    【解决方案2】:

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

    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!否则,它不起作用。 有趣的是,workers 仍然可以设置为大于 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      • 2018-11-24
      相关资源
      最近更新 更多