Ошибка с 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
?
- Обновление Pymongo: возможно ли вставить поле с '$ currentDate' только один раз?
- Использование других базовых систем в SymPy
- Как сделать больше или меньше, чем использовать MongoDB?
- Как обновить Mongo-документ после его вставки?
- Лучшая база данных DataMining
Короткий ответ
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, чтобы предупредить вас об этом событии, когда это произойдет.
- Python – проверка параметров с использованием исключения
- В сельдерее есть значительные последствия для работы многих столов
- Очистка вложенных операторов re.sub
- Сохранение битрейзов в MongoDB
- Что вызывает «неспособность подключиться к источнику данных» для pyodbc?
- Как подсчитать количество цифр в разных базах?
- Как бы вы смоделировали эту связь с базой данных?
- Могу ли я использовать ту же базу данных MongoDB из Python и NodeJS
- Есть ли ограничение на количество таблиц, которые может иметь база данных PostgreSQL?
- Структура данных для базы данных текстовых материалов
- MongoDB Оптимизация FindAndModify или Найти + Сортировать