inter_op_parallelism_threads和intra_op_parallelism_threads的含义


73

有人可以解释以下TensorFlow术语吗

  1. inter_op_parallelism_threads

  2. intra_op_parallelism_threads

或者,请提供指向正确说明源的链接。

我通过更改参数进行了一些测试,但结果并不一致,无法得出结论。

Answers:


79

inter_op_parallelism_threadsintra_op_parallelism_threads选项都记录在所述的源tf.ConfigProto协议缓冲器。这些选项配置了TensorFlow用来并行化执行的两个线程池,如注释所述:

// The execution of an individual op (for some op types) can be
// parallelized on a pool of intra_op_parallelism_threads.
// 0 means the system picks an appropriate number.
int32 intra_op_parallelism_threads = 2;

// Nodes that perform blocking operations are enqueued on a pool of
// inter_op_parallelism_threads available in each process.
//
// 0 means the system picks an appropriate number.
//
// Note that the first Session created in the process sets the
// number of threads for all future sessions unless use_per_session_threads is
// true or session_inter_op_thread_pool is configured.
int32 inter_op_parallelism_threads = 5;

运行TensorFlow图时,有几种可能的并行形式,这些选项提供了一些控制多核CPU并行性:

  • 如果您具有可以在内部并行化的操作,例如矩阵乘法(tf.matmul())或归约(例如tf.reduce_sum()),TensorFlow将通过在具有线程的线程池中调度任务来执行该intra_op_parallelism_threads操作。因此,此配置选项控制单个操作的最大并行加速。请注意,如果并行运行多个操作,则这些操作将共享此线程池。

  • 如果您在TensorFlow图中有许多独立的操作-因为在数据流图中它们之间没有直接的路径-TensorFlow将尝试使用带有线程的线程池并发运行它们inter_op_parallelism_threads。如果这些操作具有多线程实现,则它们(在大多数情况下)将共享同一线程池以进行操作内并行操作。

最后,两个配置选项的默认值均为0,表示“系统选择了一个合适的数字”。当前,这意味着每个线程池在您的计算机中每个CPU内核将有一个线程。


可以用来在多个CPU上并行化我的代码吗?万一群集中的一台机器出现故障,如何使用这些功能实现容错能力?
itsamineral

4
这些选项控制通过运行TensorFlow图可获得的最大并行度。但是,它们依赖于您运行的具有并行实现的操作(如许多标准内核一样)来实现操作内并行。以及可在图中运行的独立操作的可用性,以实现操作之间的并行性。但是,如果(例如)您的图是线性操作链,并且这些操作仅具有串行实现,则这些选项将不会增加并行性。这些选项与容错能力(或分布式执行)无关。
mrry '16

2
看来这两个选项仅适用于CPU,而不适用于GPU?如果我有基于tf.add_n的多个基于并行矩阵乘法运算的运算符,并且在GPU中运行,那么默认情况下如何进行并行化,我可以控制它吗?
chentingpc

1
将两个值都设置为1会对速度有多大影响?将两者都设置为一个是否意味着tensorflow将仅使用一个线程?(我刚刚尝试过,一旦我开始训练,我的所有核心使用量都会增加,但速度并没有真正的差别)
Martin Thoma

1
@mrry因此,如果我正确理解答案,可以intra控制核心数(1个节点内),并inter控制节点数,对吗?或粗略地说,intra像OpenMPinter一样工作,并且像OpenMPI一样工作?如果我错了,请纠正我。
Bs He

14

为了从机器上获得最佳性能,请为tensorflow后端(从此处)更改并行线程和OpenMP设置,如下所示:

import tensorflow as tf

#Assume that the number of cores per socket in the machine is denoted as NUM_PARALLEL_EXEC_UNITS
#  when NUM_PARALLEL_EXEC_UNITS=0 the system chooses appropriate settings 

config = tf.ConfigProto(intra_op_parallelism_threads=NUM_PARALLEL_EXEC_UNITS, 
                        inter_op_parallelism_threads=2, 
                        allow_soft_placement=True,
                        device_count = {'CPU': NUM_PARALLEL_EXEC_UNITS})

session = tf.Session(config=config)

下面的评论答案: [来源]

allow_soft_placement=True

如果您希望TensorFlow在不存在指定的设备的情况下自动选择一个现有的受支持的设备来运行操作,则可以allow_soft_placement在创建会话时在配置选项中将其设置为True。简而言之,它允许动态分配GPU内存。


5
什么allow_soft_placement=True
mrgloom

帖子内已回答的问题。
mrk

3

Tensorflow 2.0兼容答:如果我们想在图形模式下执行Tensorflow Version 2.0,在此我们可以配置的功能inter_op_parallelism_threads,并intra_op_parallelism_threads

tf.compat.v1.ConfigProto

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.