理解张量流内/内并行线程

时间:2017-11-29 08:26:10

标签: tensorflow

我想更多地了解这两个参数:内部和操作间并行线程

session_conf = tf.ConfigProto(
  intra_op_parallelism_threads=1,
  inter_op_parallelism_threads=1)

我读过这篇文章,其中有一个很好的解释:TensorFlow: inter- and intra-op parallelism configuration

但我正在寻求确认,并在下面提出新问题。我在keras 2.0.9,tensorflow 1.3.0中运行我的任务:

  1. 当两者都设置为1时,是否意味着,例如,在具有4个内核的计算机上,四个内核只共享一个线程?
  2. 为什么使用1个线程似乎不会在速度方面影响我的任务?我的网络具有以下结构:dropout,conv1d,maxpooling,lstm,globalmaxpooling,dropout,dense。上面引用的帖子说如果有很多矩阵乘法和减法运算,使用多线程设置可以提供帮助。我对下面的数学知之甚少,但我想我的模型中有很多这样的矩阵运算?但是,将两个参数从0设置为1只会在10分钟的任务中减少1分钟。
  3. 为什么多线程可能成为不可重现结果的来源?见Results not reproducible with Keras and TensorFlow in Python。这是我在进行科学实验时需要使用单线程的主要原因。当然,张量流量一直在改善,为什么在发布时没有解决这个问题?
  4. 非常感谢提前

2 个答案:

答案 0 :(得分:2)

  1. 当两个参数都设置为1时,4个核心中的1个将运行1个线程。它运行的核心可能会发生变化,但一次只能变为1个。

  2. 当并行运行时,总是需要在通信丢失和通过并行化获得时间之间进行权衡。根据使用的硬件和特定任务(如矩阵的大小),加速将改变。有时并行运行某些内容比使用一个内核更慢。

  3. 例如,当在cpu上使用浮点数时,由于浮点精度,(a + b) + c将不等于a + (b + c)。使用多个并行线程意味着像a + b + c这样的操作不会总是以相同的顺序计算,导致每次运行时得到不同的结果。然而,这些差异非常小,并且在大多数情况下不会影响整体结果。通常只需要完全可重现的结果进行调试。执行完全可重复性会大大减慢多线程的速度。

答案 1 :(得分:0)

问题1的答案是“否”。

将两个参数都设置为1(intra_op_parallelism_threads = 1,inter_op_parallelism_threads = 1)将生成N个线程,其中N是内核数。我已经在不同版本的TensorFlow上对其进行了多次测试。即使对于最新版本的TensorFlow也是如此。关于如何将线程数减少到1却有多个问题,但没有明确的答案。一些例子是

  1. How to stop TensorFlow from multi-threading
  2. https://github.com/usnistgov/frvt/issues/12
  3. Changing the number of threads in TensorFlow on Cifar10
  4. Importing TensorFlow spawns threads
  5. https://github.com/tensorflow/tensorflow/issues/13853