python - 在 TensorFlow 中使用多个 CPU 内核

标签 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_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)

但是,当我取消注释底部的行并更改 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

从根本上说,我想在这里做的是在不同的内核上并行执行不同的操作。我不想将单个操作拆分到多个内核上,尽管我知道这恰好适用于这个人为设计的示例。 device_countinter_op_parallelism_threads 听起来都像我想要的,但似乎都没有真正导致使用多核。我已经尝试了所有我能想到的组合,包括将一个或另一个设置为 1 以防它们相互冲突,但似乎没有任何效果。

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

$ taskset -p $$
pid 21395's current affinity mask: ffffffffff

我必须对这段代码做些什么才能让它使用多个 CPU 内核?

注意:

  • 来自 this answer其中,我正在设置 device_countinter_op_parallelism_threads
  • 追踪命令来自this answer .
  • 我可以删除 tf.device 调用,这似乎对我的 CPU 利用率没有任何影响。

我正在使用从 conda 安装的 TensorFlow 1.10.0。

最佳答案

TensorFlow issue here上来回一番之后我们确定问题在于程序正在通过不断的折叠传递“优化”,因为输入都是微不足道的。事实证明,这个恒定的折叠过程是按顺序运行的。因此,如果你想观察并行执行,做到这一点的方法是使输入不平凡,这样常量折叠就不会应用于它们。问题中建议的方法是使用 tf.placeholder,我在这里编写了一个使用它的示例程序:

https://gist.github.com/elliottslaughter/750a27c832782f4daec8686281027de8

请参阅原始问题以获取程序的示例输出:https://github.com/tensorflow/tensorflow/issues/22619

关于python - 在 TensorFlow 中使用多个 CPU 内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52507748/

相关文章:

python - 如何有效地传输数据框中的值?

Java TCP 多线程问题

JAVA线程(不同栈)同步

neural-network - 动态展开RNN是什么意思?

python - TensorFlow:DNNRegressor,如何保存模型以进行预测

python - 如何在内部计算 numpy 数组的数据类型?

python - docker-compose 中的 FastAPI + Cloud SQL 代理失败

python - PyData 生态系统

android - 如何使 IntentService 的线程保持 Activity 状态?

python-3.x - tensorflow tensorflow.contrib.learn.Estimator 加载训练模型