Использование нескольких процессорных ядер в TensorFlow - PullRequest
0 голосов
/ 26 сентября 2018

Я подробно изучил другие ответы на 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.

1 Ответ

0 голосов
/ 18 октября 2018

После некоторой перемотки вопроса TensorFlow здесь мы определили, что проблема заключалась в том, что программа "оптимизировалась" постоянным проходом свертывания, потому что все входные данные были тривиальными.Оказывается, этот постоянный проход складывания проходит последовательно.Поэтому, если вы хотите наблюдать параллельное выполнение, способ сделать это состоит в том, чтобы сделать входные данные нетривиальными, чтобы постоянное свертывание не применялось к ним.Метод, предложенный в этом выпуске, заключался в использовании tf.placeholder, и я написал пример программы, которая использует это здесь:

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

См. Исходный выпуск для примера вывода изпрограмма: https://github.com/tensorflow/tensorflow/issues/22619

...