Почему многопроцессорная обработка Python с использованием функций класса для этого кода выполняется медленнее, чем послPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему многопроцессорная обработка Python с использованием функций класса для этого кода выполняется медленнее, чем посл

Сообщение Anonymous »

Я пытаюсь запустить многопроцессорный пул внутри класса для вычисления нескольких значений, использующих функции класса гораздо большего класса. Я пытаюсь взять начальные значения, добавить случайное 5%-ное нормальное распределение к каждому значению и вычислить новую логарифмическую вероятность этих новых значений.
Вот (несколько бесполезный) фрагмент код, который я использую. make_model очень длинный, но выдает модель скорости, которую я сравниваю с измеренными значениями, хранящимися в контейнере данных.

Код: Выделить всё

import multiprocessing as mp

class fit_time_dependent():
def __init__(self):
setup a bunch of things here

def make_model(self):
a bunch of things here too
return velocity_model

def log_likelihood_pass1(self,pars):
velocity_model = self.make_model(pars)

totallogprob = 0
if self.datum.velocities:
for inst in self.datum.velocity_instruments:

vsh_data = self.datum.get_velocity(inst)
vsh_data_y = vsh_data["vsh"]*u.km/u.s
vsh_data_y_err = vsh_data["vsh_err"]*u.km/u.s

sigma2 = vsh_data_y_err ** 2# + model ** 2
totallogprob += -0.5 * np.sum((vsh_data_y - velocity_model)**2/sigma2)

return totallogprob.value

def log_prob_pass1(self,pars):
lp = self.log_prior(pars)
if not np.isfinite(lp):
return -np.inf
return lp + self.log_likelihood_pass1(pars)

def do_fit(self)

p0 = some initial values from a previous fit of model to data

nsize = 128
spread = 0.05
pos = np.array(p0) + spread * np.random.randn(nsize, len(p0))

time_start_pool = time_counter.time()
pool = mp.Pool(8)
results_pool = pool.map(self.log_prob_pass1,pos)
time_end_pool = time_counter.time()
time_elapsed_pool = float(time_end_pool) - float(time_start_pool)
print("Pool - map - %s seconds" % time_elapsed_pool)

time_start_serial = time_counter.time()
results_serial = np.asarray(list(map(self.log_prob_pass1,pos)))
time_end_serial = time_counter.time()
time_elapsed_serial = float(time_end_serial) - float(time_start_serial)
print("Serial - map - %s seconds" % time_elapsed_serial)
Проблема в том, что этот расчет приходится повторять много раз, а выполнение на одном ядре займет слишком много времени.
При тестировании кода в пуле против последовательного порта я получаю огромное снижение производительности при использовании пула.

Код: Выделить всё

Pool - map - 296.5006010532379 seconds
Serial - map - 17.647610187530518 seconds
Кроме того, я следил за загрузкой ЦП и обнаружил, что пул не использует ни одно из ядер, которые я запросил в пуле:
Использование ЦП
Я пытался использовать pathos/multiprocess с различными параметрами пула, такими как ProcessPool, ParallelPool, ThreadPool. Я хотел бы сохранить простоту и не использовать Process, но если до этого дойдет, то все в порядке.
Это похоже на мою проблему, но не совсем: https:// stackoverflow.com/questions/66790158/how-to-make-use-of-a-multiprocessing-manager-within-a-class
Спасибо за помощь.

Подробнее здесь: https://stackoverflow.com/questions/790 ... -serial-fo
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»