我想限制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("线程数"(
这是对的吗?如果我错过了理解,请告诉我。
谢谢。
不完全是这样,并没有那么简单。根据官方文件-
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'
第二种方法是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'))
为了更好地理解这个主题,你可以查看这个链接,它非常详细。
TLDR如果使用tf2,可以使用第二种或第三种方法。否则,如果您使用带有tensorflow后端的独立Keras,请使用第一种或第三种方法。
为了完成Akshay-Sehgal的回答,我通过反复试验发现了以下关于在我的案例中选择正确数量的并行内和并行间线程的事实:
- 几乎所有的CPU逻辑内核(处理器(都与内部并行线程的数量完全对应(例如,如果我将8个逻辑处理器的CPU性能降低为1个内部并行线程,那么将发挥大约1/8的CPU性能,然而,比例并不准确(。我还发现,在运行tensorflow模型后,并行间线程在改变CPU性能方面几乎没有任何作用。然而我认为最好将内部并行线程的数量指定为CPU的其余逻辑处理器(例如,当我们已经选择内部并行线程为1时,将具有8个逻辑处理器的CPU的内部并行线程设置为7(。原因是我怀疑内部并行线程可能与并行运行其他进程的逻辑处理器的数量有关到tensorflow模型,但我不确定
- 在os.envorn and tf.config方法中更改内部和内部并行线程没有区别,但为了安全执行,我考虑应用这两种方法
- 增加线程数量超过CPU的逻辑处理器数量将使其性能保持在进程的最大容量上。例如,如果您的CPU有8个逻辑核,那么可以定义200个内部/内部并行线程。但是最终性能仍然等于8个线程。请注意,在tensorflow计算中,如果为模型指定最大CPU性能,则CPU性能不一定达到100%,这对于任何其他与CPU相关的进程也是如此
- 将每个线程的数量更改为0将再次将多线程并行度设置更改为默认设置