Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在TensorFlow中使用多个CPU核_Python_Multithreading_Tensorflow_Parallel Processing_Affinity - Fatal编程技术网

Python 在TensorFlow中使用多个CPU核

Python 在TensorFlow中使用多个CPU核,python,multithreading,tensorflow,parallel-processing,affinity,Python,Multithreading,Tensorflow,Parallel Processing,Affinity,我已经广泛研究了TensorFlow的其他答案,但我似乎无法让它在我的CPU上使用多核 根据htop,以下程序仅使用一个CPU内核: import tensorflow as tf n_cpus = 20 sess = tf.Session(config=tf.ConfigProto( device_count={ "CPU": n_cpus }, inter_op_parallelism_threads=n_cpus, intra_op_parallelism_th

我已经广泛研究了TensorFlow的其他答案,但我似乎无法让它在我的CPU上使用多核

根据htop,以下程序仅使用一个CPU内核:

import tensorflow as tf

n_cpus = 20

sess = tf.Session(config=tf.ConfigProto(
    device_count={ "CPU": n_cpus },
    inter_op_parallelism_threads=n_cpus,
    intra_op_parallelism_threads=1,
))

size = 100000

A = tf.ones([size, size], name="A")
B = tf.ones([size, size], name="B")
C = tf.ones([size, size], name="C")

with tf.device("/cpu:0"):
    x = tf.matmul(A, B)
with tf.device("/cpu:1"):
    y = tf.matmul(A, C)

sess.run([x, y])

# run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
# run_metadata = tf.RunMetadata()
# sess.run([x, y], options=run_options, run_metadata=run_metadata)

# for device in run_metadata.step_stats.dev_stats:
#     device_name = device.device
#     print(device.device)
#     for node in device.node_stats:
#         print("   ", node.node_name)
但是,当我取消注释底部的行,并更改
大小
,以便在合理的时间内完成计算时,我发现TensorFlow似乎认为它使用了至少两个CPU设备:

/job:localhost/replica:0/task:0/device:CPU:0
    _SOURCE
    MatMul
    _retval_MatMul_0_0
    _retval_MatMul_1_0_1
/job:localhost/replica:0/task:0/device:CPU:1
    _SOURCE
    MatMul_1
基本上,我想在这里做的是在不同的内核上并行执行不同的操作。我不想将一个操作拆分为多个核心,尽管我知道在这个人为的示例中,这恰好是可行的。
device\u count
inter\u op\u parallelism\u threads
听起来像我想要的,但两者似乎都不会导致实际使用多核。我尝试了我能想到的所有组合,包括将其中一个设置为
1
,以防它们相互冲突,但似乎没有任何效果

我还可以通过
taskset
确认我没有对我的CPU亲和力做任何奇怪的事情:

$ taskset -p $$
pid 21395's current affinity mask: ffffffffff
为了让代码使用多个CPU核,我必须对代码做些什么

注:

  • 我正在设置
    设备计数
    线程间并行度
  • 跟踪命令来自
  • 我可以删除
    tf.device
    调用,这似乎对我的CPU利用率没有任何影响

我使用的是从conda安装的TensorFlow 1.10.0。

在上下反复之后,我们确定问题在于程序正在通过一个恒定的折叠过程进行“优化”,因为输入都是微不足道的。结果表明,这个恒定的折叠过程是按顺序进行的。因此,如果要观察并行执行,方法是使输入不平凡,这样常量折叠就不会应用于它们。本期中建议的方法是使用
tf.placeholder
,我已经编写了一个示例程序,在这里使用了该方法:


有关程序的示例输出,请参阅原始版本:

您应该在github上发布此消息,它可能是一个bug,也可能不是,在这种情况下,您仍然有一个观点,因为文档中没有对此进行很好的解释。在github上试用一下。谢谢,我会的。问题已提交到此处: