Как эффективно использовать параллелизм OpenMP с tenorflow 1.14.0 - PullRequest
0 голосов
/ 03 октября 2019

В настоящее время я пытаюсь найти эффективный способ запуска задачи машинного обучения на заданном количестве ядер, используя tensorflow. Из информации, которую я нашел, было два основных подхода к этому:

Первый из которых - использование двух переменных тензорного потока intra_op_parallelism_threads и inter_op_parallelism_threads, а затем создание сеанса с использованием этой конфигурации.

Второй из которых использует OpenMP. Установка переменной окружения OMP_NUM_THREADS позволяет манипулировать количеством потоков, порождаемых для процесса.

Моя проблема возникла, когда я обнаружил, что установка тензорного потока через conda и через pip дает две разные среды. В conda install изменение переменных среды OpenMP, казалось, изменило способ параллелизации процесса, в то время как в «среде pip» единственное, что, казалось, изменило его, это переменные конфигурации inter / intra, которые я упоминал ранее.

Это привело к некоторым трудностям при попытке сравнить две установки для сравнения. Если я установлю OMP_NUM_THREADS равным 1 и inter / intra равным 16 на 48-ядерном процессоре на conda install, я получу только около 200% загрузки ЦП, поскольку большинство потоков в любой момент бездействуют.

omp_threads = 1
mkl_threads = 1
os.environ["OMP_NUM_THREADS"] = str(omp_threads)
os.environ["MKL_NUM_THREADS"] = str(mkl_threads)

config = tf.ConfigProto()
config.intra_op_parallelism_threads = 16
config.inter_op_parallelism_threads = 16
session = tf.Session(config=config)
K.set_session(session)

Я ожидал бы, что этот код создаст 32 потока, большинство из которых используются в любой момент времени, тогда как на самом деле он порождает 32 потока и только 4-5 используются одновременно.

Кто-нибудь сталкивался с чем-то подобным раньше при использовании tenorflow?

Почему установка через conda и через pip, по-видимому, дает две разные среды?

Существует ли какой-либо способ получения сопоставимой производительности на двух установках с использованием некоторой комбинации двух обсуждаемых методовраньше?

Наконец, может быть, есть еще лучший способ ограничить python определенным количеством ядер?

...