【问题标题】:What is difference between "Keras backend + Tensorflow" and "Keras from Tensorflow" using CPU(in Tensorflow 2.x)使用 CPU 的“Keras 后端 + Tensorflow”和“来自 Tensorflow 的 Keras”有什么区别(在 Tensorflow 2.x 中)
【发布时间】:2021-03-13 02:18:06
【问题描述】:

我想限制 CPU 内核和线程。 所以我找到了三种方法来限制这些。

1) “Keras 后端 + Tensorflow”

from keras import backend as K
import tensorflow as tf

config = tf.ConfigProto(intra_op_parallelism_threads=2, \ 
                        inter_op_parallelism_threads=4, \
                        allow_soft_placement=True, \
                        device_count = {'CPU': 1})
session = tf.Session(config=config)
K.set_session(session)

2) “来自 Tensorflow 的 Keras”

import tensorflow as tf
from tensorflow import keras

tf.config.threading.set_intra_op_parallelism_threads(2)  
tf.config.threading.set_inter_op_parallelism_threads(4) 

3) “来自 Tensorflow 的 keras”

import os

os.environ['TF_NUM_INTRAOP_THREADS'] = '2'
os.environ['TF_NUM_INTEROP_THREADS'] = '4'

这三种方式效果一样吗?

最后我理解了我在下面写的参数

  • intra_op_parallelism_threads("CPU 核心数")
  • inter_op_parallelism_threads("线程数")

这是对的吗? 如果我误解了,请告诉我。

谢谢。

【问题讨论】:

    标签: python keras tensorflow2


    【解决方案1】:

    不完全是,没有那么简单。根据官方文档 -

    intra_op_parallelism_threads - 矩阵乘法和归约等某些操作可以利用并行线程来提高速度。值 0 表示系统选择了一个适当的数字。 Refer this

    inter_op_parallelism_threads - 确定独立non-blocking operations 使用的并行线程数。 0 表示系统选择一个合适的数字。 Refer this

    所以技术上你不能限制 CPU 的数量,而只限制并行的数量threads,为了限制资源消耗,这就足够了。


    关于方法,您正在使用 -

    第三种方法允许您使用os库直接设置环境变量。

    import os
    
    os.environ['TF_NUM_INTRAOP_THREADS'] = '2'
    os.environ['TF_NUM_INTEROP_THREADS'] = '4'
    

    第二种方法是 tf2 中的一个方法,其作用完全相同(设置环境变量),不同之处在于 Keras 现在被打包到 tf2 中。

    import tensorflow as tf
    from tensorflow import keras
    
    tf.config.threading.set_intra_op_parallelism_threads(2)  
    tf.config.threading.set_inter_op_parallelism_threads(4)
    

    第一种方法适用于独立的 Keras。如果将 keras 设置为 tensorflow 后端,则此方法将起作用。同样,它也做了同样的事情,即间接设置环境变量。

    from keras import backend as K
    import tensorflow as tf
    
    config = tf.ConfigProto(intra_op_parallelism_threads=2, \ 
                            inter_op_parallelism_threads=4, \
                            allow_soft_placement=True, \
                            device_count = {'CPU': 1})
    session = tf.Session(config=config)
    K.set_session(session)
    

    如果你还有疑问,你可以在独立运行所有3个之后检查环境变量会发生什么,然后使用os和-检查具体变量-

    print(os.environ.get('KEY_THAT_MIGHT_EXIST'))
    

    为了更好地理解该主题,您可以check this link 详细说明。


    TLDR; 如果您使用的是 tf2,则可以使用第二种或第三种方法。如果您使用的是带有 tensorflow 后端的独立 Keras,请使用第一种或第三种方法。

    【讨论】:

    • 谢谢你这么多细节!但我仍然不确定我应该输入什么数字。我使用 TF2 和我的计算机 cpu 内核和逻辑处理器都是 8。
    • 其实很难说。并行线程的数量取决于很多因素(您的内存、语言等)。我建议,如果您的目标是限制资源,请先将线程数设置为较小的数字并分析活动监视器或任务管理器。
    • 谢谢。我仍然不确定内部和内部的区别是什么。我应该通过体验来发现。我打印了 os.environ.get('KEY_THAT_MIGHT_EXIST') ,它说没有。如果您不介意,您能告诉我“KEY_THAT_MIGHT_EXIST”中的“无”是什么意思吗?
    • "KEY_THAT_MIGHT_EXIST" 是占位符,可以改成 TF_NUM_INTRAOP_THREADS 或 TF_NUM_INTEROP_THREADS
    猜你喜欢
    • 2020-03-16
    • 2017-10-19
    • 1970-01-01
    • 2023-03-10
    • 2018-04-26
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 2017-10-11
    相关资源
    最近更新 更多