Я подробно изучил другие ответы на TensorFlow, и я просто не могу заставить его использовать несколько ядер на моем процессоре.
Согласно htop, следующая программа использует только одно ядро процессора:
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 процессора:
/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_count
, и inter_op_parallelism_threads
звучат так, как я хочу, но ни одно из них не приводит к использованию нескольких ядер.Я перепробовал все возможные комбинации, в том числе установил одну или другую на 1
на случай, если они конфликтуют друг с другом, и, похоже, ничего не работает.
Я также могу подтвердить с помощью taskset
, чтоЯ не делаю ничего странного с моим сродством к процессору:
$ taskset -p $$
pid 21395's current affinity mask: ffffffffff
Что именно я должен сделать с этим кодом, чтобы он использовал несколько ядер процессора?
Примечание:
- Из этого ответа среди прочего я устанавливаю
device_count
и inter_op_parallelism_threads
. - Команда трассировки приходит от этого ответа .
- Я могу удалить вызовы
tf.device
, и это, похоже, не влияет на использование моего процессора.
Я использую TensorFlow 1.10.0, установленный из conda.