【问题标题】:Can Keras with Tensorflow backend be forced to use CPU or GPU at will?带有 Tensorflow 后端的 Keras 是否可以随意强制使用 CPU 或 GPU?
【发布时间】:2017-04-03 02:27:38
【问题描述】:

我安装了带有 Tensorflow 后端和 CUDA 的 Keras。我有时想按需强制 Keras 使用 CPU。不用说在虚拟环境中安装单独的仅 CPU 的 Tensorflow 就可以做到这一点吗?如果有怎么办?如果后端是 Theano,则可以设置标志,但我还没有听说过可以通过 Keras 访问的 Tensorflow 标志。

【问题讨论】:

    标签: python machine-learning tensorflow keras


    【解决方案1】:

    如果你想强制 Keras 使用 CPU

    方式 1

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

    在导入 Keras/Tensorflow 之前。

    方式 2

    运行你的脚本

    $ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py
    

    另见

    1. https://github.com/keras-team/keras/issues/152
    2. https://github.com/fchollet/keras/issues/4613

    【讨论】:

    • 对我不起作用(Keras 2,Windows)- 必须在下面的答案中设置 os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
    • #152 指的是什么问题?一个链接会很好。
    • 我在 issue #152 中没有看到对 CUDA_DEVICE_ORDER=PCI_BUS_ID 的任何引用
    • 我在 ipython3 终端中并且我已经设置了import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = "" ,现在我该如何“撤消”这个?我希望 Keras 再次使用 GPU。
    • @MartinThoma 我的意思是不必离开 ipython,我在其中运行了很多东西,所以我想回到“启用 GPU”的环境。我尝试删除 os.environ 字典中的键,但徒劳无功。
    【解决方案2】:

    这样做的一个相当可分离的方法是使用

    import tensorflow as tf
    from keras import backend as K
    
    num_cores = 4
    
    if GPU:
        num_GPU = 1
        num_CPU = 1
    if CPU:
        num_CPU = 1
        num_GPU = 0
    
    config = tf.ConfigProto(intra_op_parallelism_threads=num_cores,
                            inter_op_parallelism_threads=num_cores, 
                            allow_soft_placement=True,
                            device_count = {'CPU' : num_CPU,
                                            'GPU' : num_GPU}
                           )
    
    session = tf.Session(config=config)
    K.set_session(session)
    

    在这里,通过booleansGPUCPU,我们通过严格定义允许 Tensorflow 会话访问的 GPU 和 CPU 的数量来表明我们是希望使用 GPU 还是 CPU 运行我们的代码。变量num_GPUnum_CPU 定义了这个值。 num_cores 然后通过intra_op_parallelism_threadsinter_op_parallelism_threads 设置可供使用的CPU 内核数。

    intra_op_parallelism_threads 变量指示计算图中单个节点中的并行操作允许使用的线程数(内部)。而inter_ops_parallelism_threads 变量定义了跨计算图(inter)节点的并行操作可访问的线程数。

    allow_soft_placement 允许在满足以下任一条件时在 CPU 上运行操作:

    1. 该操作没有 GPU 实现

    2. 没有已知或注册的 GPU 设备

    3. 需要与来自 CPU 的其他输入共同定位

    所有这些都在我的类的构造函数中执行,然后再执行任何其他操作,并且与我使用的任何模型或其他代码完全分离。

    注意:这需要安装 tensorflow-gpucuda/cudnn,因为提供了使用 GPU 的选项。

    参考:

    【讨论】:

    • 这是一个很好的解决方案,因为仅定义“CUDA_VISIBLE_DEVICES”会导致 CUDA_ERROR_NO_DEVICE 进行大量诊断,然后继续在 CPU 上执行。虽然......两种方法都有效!
    • 这是唯一适合我的一致解决方案。继续回来。
    • 您能解释一下其他参数的含义吗?比如allow_soft_placementintra_op_parallelism_threadsinter_op_parallelism_threads
    • inter/intra_op_parallelism_threads 是指 CPU 还是 GPU 操作?
    • @bluesummers 它们与 CPU 并行化有关
    【解决方案3】:

    这对我有用(win10),在你导入 keras 之前放置:

    import os
    os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
    

    【讨论】:

    • 这是做什么的?
    • 使用 Win,强制 TF 使用 CPU 并忽略任何 GPU。 0 或空白没有运气,但 -1 似乎可以解决问题。
    • 为我在 Win10 x64 上工作。我也没有任何运气赢得 0 或空白,只有 -1 有效。
    • 在 Ubuntu 上为我工作
    • 我的机器上有两个 GPU,设置 'CUDA_VISIBLE_DEVICES' = 0/1 是指可用 GPU 的物理 ID。将其设置为 -1 会占用 CPU。
    【解决方案4】:

    只需导入 tensorflow 并使用 keras,就这么简单。

    import tensorflow as tf
    # your code here
    with tf.device('/gpu:0'):
        model.fit(X, y, epochs=20, batch_size=128, callbacks=callbacks_list)
    

    【讨论】:

    • 最佳答案在这里
    • 当我设置tf.device('/cpu:0')时,我仍然可以看到稍后使用nvidia-smi分配给python的内存。
    • @CMCDragonkai 解决还是不解决^_^?
    • 似乎对我也不起作用,当我将它设置为使用 cpu 时仍然使用 gpu
    • 不应该也是模型定义和编译在同一个with下执行吗?
    【解决方案5】:

    根据 keras tutorial,您可以简单地使用与常规 tensorflow 中相同的 tf.device 范围:

    with tf.device('/gpu:0'):
        x = tf.placeholder(tf.float32, shape=(None, 20, 64))
        y = LSTM(32)(x)  # all ops in the LSTM layer will live on GPU:0
    
    with tf.device('/cpu:0'):
        x = tf.placeholder(tf.float32, shape=(None, 20, 64))
        y = LSTM(32)(x)  # all ops in the LSTM layer will live on CPU:0
    

    【讨论】:

    • 如何在 Keras 中以 Tensorflow 作为后端而不是使用 Tensorflow 调用 Keras 层?
    • 我不明白你的问题。 with 里面的代码可以是任何 Keras 代码。
    • 如何使用从磁盘加载的训练模型完成此操作?我目前正在 gpu 上进行培训,但之后想在 CPU 上进行验证
    • 通过使用上述方法,我能够在训练过程中将训练从 gpu 切换到 cpu,其中我使用 model.save 保存模型,然后使用不同的 tf.device 重新加载它keras.models.load_model 。如果您想在不同的设备上进行训练然后进行预测,这同样适用。
    【解决方案6】:

    我只是花了一些时间弄清楚。 托马斯的回答并不完整。 假设你的程序是test.py,你想使用gpu0来运行这个程序,并保持其他gpus空闲。

    你应该写CUDA_VISIBLE_DEVICES=0 python test.py

    注意它是DEVICES 而不是DEVICE

    【讨论】:

      【解决方案7】:

      对于使用 PyCharm 和强制 CPU 的人,您可以在运行/调试配置中的环境变量下添加以下行:

      <OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
      

      【讨论】:

        猜你喜欢
        • 2021-11-28
        • 2018-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-11
        • 2017-12-17
        • 1970-01-01
        相关资源
        最近更新 更多