Python 在TensorFlow中使用多个CPU核
我已经广泛研究了TensorFlow的其他答案,但我似乎无法让它在我的CPU上使用多核 根据htop,以下程序仅使用一个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
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核,我必须对代码做些什么
注:
- 我正在设置
和设备计数
线程间并行度
- 跟踪命令来自
- 我可以删除
调用,这似乎对我的CPU利用率没有任何影响tf.device
我使用的是从conda安装的TensorFlow 1.10.0。在上下反复之后,我们确定问题在于程序正在通过一个恒定的折叠过程进行“优化”,因为输入都是微不足道的。结果表明,这个恒定的折叠过程是按顺序进行的。因此,如果要观察并行执行,方法是使输入不平凡,这样常量折叠就不会应用于它们。本期中建议的方法是使用
tf.placeholder
,我已经编写了一个示例程序,在这里使用了该方法:
有关程序的示例输出,请参阅原始版本:您应该在github上发布此消息,它可能是一个bug,也可能不是,在这种情况下,您仍然有一个观点,因为文档中没有对此进行很好的解释。在github上试用一下。谢谢,我会的。问题已提交到此处: