Многопроцессорная обработка Python не ускоряется
У меня есть код, где общий ресурс изменяется при вызове функции. Пока что для каждого входного вектора (входная матрица измерения rxc) я запускаю его последовательно.
Я хочу изменить общий ресурс (скажем, R) при каждом вызове функции. До сих пор я пытался использовать Python Multiprocessing и Pathos Multiprocessing, чтобы ускорить это. Я даже попытался np.apply_along_axis, чтобы попытаться ускорить его.
Пока что я заметил, что последовательная обработка - самый быстрый способ. Я заблудился относительно того, почему это происходит.
Я попробовал следующие подходы
- np.apply_along_axis: только небольшая задержка (постоянный сдвиг времени)
- Pathos.multiprocessing.ProcessingPool.Map: задержка до 10 раз
- multiprocessing.Process (ручное разделение): задержка до 5x
- multiprocessing.Pool: соответствует пафосным результатам.
Я новичок в программировании на Python и могу делать что-то не так. Какой хороший способ сделать это?
Обновление: код самоорганизующейся карты прилагается
Я цитирую, что я делаю.
class SOM(object):
def __init__(self, X):
pool = Pool()
pool.ncpus=4
self.map = pool.map
def train_single( self, x, lr, r):
b = np.argmin(np.linalg.norm(self.W-x, axis=1))
N = np.where(np.linalg.norm(self.Y-self.Y[b],axis=1)<r)[0]
d = np.linalg.norm(self.Y[N]-self.Y[b],axis=1)
H = np.array([np.exp(-d**2/np.max(d)**2*0.5)]).T
H/=H.max()
gradients = - (self.W[N] - x) * H * lr
if np.isnan(gradients).any():
return
#
self.W[N] += gradients
def train_batch_parallel(self, X):
self.W = np.random.random(size=(100, X.shape[1]))
self.Y = np.array([[i, j] for i in range(10) for j in range(10)])
self.X = X
r = 10
lr = .5
self.rs = np.repeat(r, X.shape[0]).astype(float)
self.lrs = np.repeat(lr, X.shape[0])
for k in range(1, 100):
self.rs *=0.8# np.append(self.rs, np.repeat(r * 0.8 ** k, X.shape[0]), axis=0)
self.lrs *=0.9# np.append(self.rs, np.repeat(lr * 0.9 ** k, X.shape[0]), axis=0)
#parallel execution using the pool.map
self.map(self.train_single, X, self.lrs, self.rs)