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

Я использую распределенную структуру для параллельного вычисления. В этом мой основной вариант использования – с NumPy. Когда я включаю код NumPy, который полагается на np.linalg , я получаю сообщение об ошибке с OMP_NUM_THREADS , которое связано с библиотекой OpenMP .

Минимальный пример:

 from distributed import Executor import numpy as np e = Executor('144.92.142.192:8786') def f(x, m=200, n=1000): A = np.random.randn(m, n) x = np.random.randn(n) # return np.fft.fft(x) # tested; no errors # return np.random.randn(n) # tested; no errors return A.dot(y).sum() # tested; throws error below s = [e.submit(f, x) for x in [1, 2, 3, 4]] s = e.gather(s) 

Когда я тестирую тест linalg, e.gather терпит неудачу, поскольку каждое задание вызывает следующую ошибку:

 OMP: Error #34: System unable to allocate necessary resources for OMP thread: OMP: System error #11: Resource temporarily unavailable OMP: Hint: Try decreasing the value of OMP_NUM_THREADS. 

Для чего нужно установить OMP_NUM_THREADS ?

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

 export OMP_NUM_THREADS=1 or dask-worker --nthreads 1 

объяснение

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

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

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

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

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