Проблема при распараллеливании функции (модель LSTM) - PullRequest
1 голос
/ 06 августа 2020

У меня есть функция с именем fit_model, которая принимает один вход, dataset, выполняет некоторые операции предварительной обработки с набором данных, запускает на нем модель LSTM и, наконец, возвращает число. Вкратце, как показано ниже:

def fit_model(dataset):
    do some preprocess on the dataset
    train the model on the dataset

    return a number

А также у меня есть список с именем my_list, который содержит 21 набор данных (каждый набор данных имеет форму кадра данных pandas). Когда я хочу распараллелить функцию, как показано ниже:

import multiprocessing as mp

results = []

pool = mp.Pool(mp.cpu_count())
results = pool.starmap(fit_model, [(my_list[i]) for i in range(0, 21)])
pool.close()

, я получаю эту ошибку:

"""
Traceback (most recent call last):
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 119, in worker
    result = (True, func(*args, **kwds))
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 47, in starmapstar
    return list(itertools.starmap(args[0], args[1]))
TypeError: fit_model() takes 1 positional argument but 44 were given
"""

Но я не знаю, в чем проблема? Также, когда я запускаю такую ​​функцию: x = fit_model(my_list[4]) или любой другой индекс в диапазоне (0, 21), я не получаю никаких ошибок.

Вы можете мне помочь с этим вопросом?

1 Ответ

1 голос
/ 07 августа 2020

Я думаю, что проблема, с которой вы столкнулись, заключается в том, как вы реализуете вызов карты звездного неба. Эта команда предполагает, что вы пытаетесь создать список отдельных кортежей, которые будут функционировать как свои собственные итерации:

[(my_list[i]) for i in range(0, 21)] # recreates your list [val 1, val 2, val 3, ...]

Однако это снова создает ваш исходный список. Вы можете исправить это, используя запятую, которая создает то, что, я думаю, вы пытаетесь создать, например:

[(my_list[i], ) for i in range(0, 21)] # creates [(val 0), (val 1), (val 2) ...]

Однако это просто создает дополнительный код для вас, хотя он вообще не нужен, я думаю. Я предлагаю вам использовать карту вместо звездной карты, например:

import multiprocessing as mp
# no need to define results 
pool = mp.Pool(mp.cpu_count())
results = pool.map(fit_model, my_list)
pool.close()

Или, на мой взгляд, более pythoni c манеру:

import multiprocessing as mp

with mp.Pool(mp.cpu_count()) as pool:
    results = pool.map(fit_model, my_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...