Я пытаюсь адаптировать свой код для работы в кластере, управляемом с помощью планировщика заданий PBS.
Этот вопрос относится к этому , этому и этой теме .
В данный момент мой код выглядит примерно так:
from threadpoolctl import threadpool_limits
import numpy as np
from multiprocessing import Pool
def simple_numpy_job(n=5000):
return n*2
def heavy_numpy_job(n=1000):
# I use threadpool_limits to avoid sub-jobs to use more than one CPU
with threadpool_limits(limits=1, user_api='blas'):
a = np.random.randn(n, n)
for i in range(20):
b = a @ a
return b
def multi_job(job, n):
with Pool(n) as pool:
res = pool.map(job, [1000]*8)
return res
if __name__ == '__main__':
# Initial part of the job. Can be done one one core as it's not computationally expensive
simple_numpy_job
# Part of the job I'd like to parallelize
res = multi_job(heavy_numpy_job,6)
Я проверяю это на моей Windows машине, проверяя использование ЦП с помощью монитора ресурсов (я не могу проверить количество потоков напрямую как - я не знаю почему - Python spawn десятков потоков в любом случае. Так что это число не имеет смысла)
Как вы можете видеть на картинке ниже, даже если я настрою Pool
на 6 рабочих, и каждое задание будет ограничено использованием только 1 ЦП, тем не менее все ЦП (12) активируются.
Я также заметил, что код
def heavy_numpy_job(n=5000):
with threadpool_limits(limits=1, user_api='blas'):
a = np.random.randn(n, n)
for i in range(20):
b = a @ a
return b
if __name__ == '__main__':
heavy_numpy_job()
действительно ограничивает количество процессоров, Numpy
используемых одним в то время, но для каждой итерации l oop выше используется другой . Я не знаю, может ли это вызвать проблемы на общем узле вычислительного кластера HP C.
Какой лучший способ сделать мой код "PBS" / "HP C" дружественным? Спасибо