Ell*_*ter 2 python parallel-processing multithreading affinity tensorflow
我已经广泛研究了 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)
Run Code Online (Sandbox Code Playgroud)
但是,当我取消注释底部的行并进行更改size以使计算实际上在合理的时间内完成时,我看到 TensorFlow 似乎认为它至少使用了 2 个 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
Run Code Online (Sandbox Code Playgroud)
从根本上说,我想在这里做的是在不同的内核上并行执行不同的操作。我不想将单个操作拆分到多个内核上,尽管我知道这在这个人为的示例中碰巧有效。无论device_count和inter_op_parallelism_threads声音就像我想要的东西,但也似乎确实导致使用多个内核。我已经尝试了我能想到的所有组合,包括设置一个或另一个1以防它们相互冲突,但似乎没有任何效果。
我还可以确认taskset我对 CPU 亲和力没有做任何奇怪的事情:
$ taskset -p $$
pid 21395's current affinity mask: ffffffffff
Run Code Online (Sandbox Code Playgroud)
我到底需要对这段代码做什么才能让它使用多个 CPU 内核?
笔记:
device_count和inter_op_parallelism_threads。tf.device调用,它似乎对我的 CPU 利用率没有任何影响。我正在使用从 conda 安装的 TensorFlow 1.10.0。
在TensorFlow 问题上反复讨论之后,我们确定问题在于程序正在通过不断折叠的过程“优化”,因为输入都是微不足道的。事实证明,这个不断折叠的过程是按顺序运行的。因此,如果您想观察并行执行,那么这样做的方法是使输入变得非平凡,以便常量折叠不适用于它们。问题中建议的方法是使用tf.placeholder,我在这里编写了一个使用它的示例程序:
https://gist.github.com/elliottslaughter/750a27c832782f4daec8686281027de8
请参阅程序示例输出的原始问题:https : //github.com/tensorflow/tensorflow/issues/22619