Ошибка с OMP_NUM_THREADS при использовании распределенного dask


person Scott    schedule 10.09.2016    source источник


Ответы (2)


Короткий ответ

export OMP_NUM_THREADS=1

or 

dask-worker --nthreads 1

Объяснение

Переменная среды OMP_NUM_THREADS контролирует количество потоков, которые многие библиотеки, включая BLAS библиотеку, использующую numpy.dot, используют в своих вычислениях, например умножение матриц.

Конфликт здесь в том, что у вас есть две параллельные библиотеки, вызывающие друг друга, BLAS и dask.distributed. Каждая библиотека предназначена для использования столько потоков, сколько логических ядер доступно в системе.

Например, если у вас восемь ядер, то dask.distributed может запускать вашу функцию f восемь раз одновременно в разных потоках. Вызов функции numpy.dot в f будет использовать восемь потоков на вызов, в результате чего одновременно будет выполняться 64 потока.

На самом деле это нормально, вы столкнетесь с падением производительности, но все может работать правильно, но это будет медленнее, чем при одновременном использовании всего восьми потоков, либо путем ограничения dask.distributed, либо путем ограничения BLAS.

В вашей системе, вероятно, OMP_THREAD_LIMIT установлено какое-то разумное число, например 16, чтобы предупредить вас об этом событии, когда оно произойдет.

person MRocklin    schedule 10.09.2016

Если вы используете MKL blas, вы можете также получить некоторые улучшения, используя слой потоковой передачи TBB. У меня на самом деле не было возможности попробовать это, так что YMMV.

http://conference.scipy.org/proceedings/scipy2018/anton_malakhov.html

person Dave Hirschfeld    schedule 20.02.2019