У меня есть несколько большой код, который использует библиотеки numpy, scipy, sklearn, matplotlib
. Мне нужно ограничить использование ЦП, чтобы он не потреблял всю доступную вычислительную мощность в моем вычислительном кластере. Следуя этому ответу, я реализовал следующий блок кода, который выполняется сразу после запуска скрипта:
import os
parallel_procs = "4"
os.environ["OMP_NUM_THREADS"] = parallel_procs
os.environ["MKL_NUM_THREADS"] = parallel_procs
os.environ["OPENBLAS_NUM_THREADS"] = parallel_procs
os.environ["VECLIB_MAXIMUM_THREADS"] = parallel_procs
os.environ["NUMEXPR_NUM_THREADS"] = parallel_procs
Насколько я понимаю, это должно ограничить количество используемых ядер до 4, но, видимо, этого не происходит. Вот что показывает htop
для моего пользователя и этого скрипта:
Есть 16 процессов, 4 из которых показывают процент загрузки процессора выше 100%. Это отрывок из lscpu
:
CPU(s): 48
On-line CPU(s) list: 0-47
Thread(s) per core: 2
Core(s) per socket: 12
Socket(s): 2
Я также использую библиотеку multiprocessing
в своем коде. Я установил такое же количество процессов, используя multiprocessing.Pool(processes=4)
. Без блока кода, показанного выше, скрипт настаивал на использовании как можно большего количества ядер, по-видимому, полностью игнорируя multiprocessing
.
Тогда у меня возникают вопросы: что я ограничиваю, когда использую приведенный выше код? Как мне интерпретировать вывод htop
?
multiprocessing
)? Переменные среды, которые вы устанавливаете, скорее всего, повлияют только на код библиотеки, который может использовать потоки внутри. Однако, если вы используете свою собственную многопоточность, вы все равно можете вызывать эти библиотеки несколько раз параллельно. - person Blckknght   schedule 13.05.2021multiprocessing
в своем коде. Я установил такое же количество процессов, используяmultiprocessing.Pool(processes=4)
. Мне пришлось добавить блок кода, показанный в вопросе, потому что в противном случае скрипт настаивал на использовании как можно большего количества ядер, по-видимому, игнорируяmultiprocessing
. - person Gabriel   schedule 13.05.2021multiprocessing
(или о коде другой библиотеки, который может работать параллельно). Если библиотеки, которые вы используете, выполняют свои собственные потоки, вам может не понадобиться добавлять собственную параллельную обработку. - person Blckknght   schedule 13.05.2021