Вот (несколько бесполезный) фрагмент код, который я использую. 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