Многопроцессорная обработка на узле кластера PBS - PullRequest
1 голос
/ 27 октября 2019

Мне нужно запустить несколько симуляций одной и той же модели с различными параметрами (или начальным числом генератора случайных чисел). Ранее я работал на сервере со многими ядрами, где я использовал многопроцессорную библиотеку python с apply_async. Это было очень удобно, так как я мог решить, какое максимальное количество ядер должно быть занято, и симуляции просто войдут в очередь.

Как я понял из других вопросов, многопроцессорная обработка работает на кластерах pbs, пока вы работаете только на одном узле, что пока может быть хорошо. Тем не менее, мой код не всегда работает.

Чтобы вы поняли мой тип кода:

import functions_library as L
import multiprocessing as mp
if __name__ == "__main__":

    N = 100

    proc = 50
    pool = mp.Pool(processes = proc)



    seed = 342
    np.random.seed(seed)

    seeds = np.random.randint(low=1,high=100000,size=N)

    resul = []
    for SEED in seeds:

        SEED = int(SEED)

        resul.append(pool.apply_async(L.some_function, args = (some_args)))
        print(SEED)

    results = [p.get() for p in resul]

    database = pd.DataFrame(results)


    database.to_csv("prova.csv")

Функция создает 3 N = 10000 графов networkx и выполняет некоторые вычисления на них, а затем возвращает простой короткий словарь Python.

Странная вещь, которую я не могу отладить, это следующее сообщение об ошибке:

multiprocessing.pool.MaybeEncodingError: Ошибка при отправке результата:> ''. > Причина: 'RecursionError (' превышена максимальная глубина рекурсии при вызове> объекта Python ')'

Странно то, что я запускаю несколько версий кода на разных узлах. 3 раза код работал правильно, тогда как в большинстве случаев он возвращает предыдущую ошибку. Я попытался запустить различное количество параллельных симуляций, от 7 до 20 (# ядер узлов), но, похоже, здесь нет шаблона, поэтому я думаю, что это не проблема с памятью.

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

Любая идея, чтобы решить или хотя бы понять это поведение?

...