Многопроцессорная обработка Python не ускоряется

У меня есть код, где общий ресурс изменяется при вызове функции. Пока что для каждого входного вектора (входная матрица измерения rxc) я запускаю его последовательно.

Я хочу изменить общий ресурс (скажем, R) при каждом вызове функции. До сих пор я пытался использовать Python Multiprocessing и Pathos Multiprocessing, чтобы ускорить это. Я даже попытался np.apply_along_axis, чтобы попытаться ускорить его.

Пока что я заметил, что последовательная обработка - самый быстрый способ. Я заблудился относительно того, почему это происходит.

Я попробовал следующие подходы

  1. np.apply_along_axis: только небольшая задержка (постоянный сдвиг времени)
  2. Pathos.multiprocessing.ProcessingPool.Map: задержка до 10 раз
  3. multiprocessing.Process (ручное разделение): задержка до 5x
  4. 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)

0 ответов

Другие вопросы по тегам