使用 CPU 的“Keras backend + Tensorflow”和“来自 Tensorflow 的 Keras”有什么区别(在 Tensorflow 2.x 中)

Jih*_*Seo 5 python keras tensorflow2

我想限制 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)
Run Code Online (Sandbox Code Playgroud)

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) 
Run Code Online (Sandbox Code Playgroud)

3) “来自 Tensorflow 的 keras”

import os

os.environ['TF_NUM_INTRAOP_THREADS'] = '2'
os.environ['TF_NUM_INTEROP_THREADS'] = '4'
Run Code Online (Sandbox Code Playgroud)

这三种方式影响一样吗?

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

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

这是正确的吗?如果我错过了理解,请告诉我。

谢谢你。

Aks*_*gal 2

不完全是,事情没那么简单。根据官方文件 -

intra_op_parallelism_threads - 某些操作(例如矩阵乘法和归约)可以利用并行线程来加速。值 0 表示系统选择合适的数字。参考这个

inter_op_parallelism_threads - 确定独立非阻塞操作使用的并行线程数。0 表示系统选择合适的数字。参考这个

所以从技术上来说你不能限制CPU的数量,而只能限制并行线程的数量,这对于限制资源消耗来说就足够了。


关于方法,您正在使用 -

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

import os

os.environ['TF_NUM_INTRAOP_THREADS'] = '2'
os.environ['TF_NUM_INTEROP_THREADS'] = '4'
Run Code Online (Sandbox Code Playgroud)

第二种方法是 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)
Run Code Online (Sandbox Code Playgroud)

第一种方法适用于独立的 Keras。如果 keras 设置为张量流后端,则此方法将起作用。同样,它执行间接设置环境变量的相同操作。

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)
Run Code Online (Sandbox Code Playgroud)

如果您仍然有疑问,可以在独立运行所有 3 个命令后检查环境变量发生了什么,然后使用os-检查特定变量

print(os.environ.get('KEY_THAT_MIGHT_EXIST'))
Run Code Online (Sandbox Code Playgroud)

为了更好地理解该主题,您可以查看此链接,其中详细介绍了该主题。


太长了;如果您使用 tf2,则可以使用第二种或第三种方法。如果您使用带有张量流后端的独立 Keras,则使用第一种或第三种方法。