multiprocessing.Pool.map завис на последнем процессе - PullRequest
0 голосов
/ 02 мая 2020

Я запускаю программу на pycharm на linux сервере, который использует multiprocessing.Pool().map для повышения производительности.

Код выглядит примерно так:

import multiprocessing
from functools import partial

for episode in episodes:
    with multiprocessing.Pool() as mpool:
        func_part = partial(worker_function)
        mpool.map(func_part, range(step))

Странная вещь в том, что он отлично работает на моем Windows 10 ноутбуке, но как только я пытаюсь запустить его на linux сервере, программа застревает на самом последнем процессе measurement count 241/242, так что перед переходом к следующей итерации l oop Например, следующий эпизод.

enter image description here

Сообщение об ошибке не выдается. Я бегу pycharm на обеих машинах. В слое Step я поместил функцию multiprocessing.Pool().map.

Редактировать:

Я добавил mpool.close() и mpool.join(), но, похоже, не имеет никакого эффекта:

import multiprocessing
from functools import partial

for episode in episodes:
    with multiprocessing.Pool() as mpool:
        func_part = partial(worker_function)
        mpool.map(func_part, range(step))
        mpool.close()
        mpool.join()

Он все еще застревает при последнем процессе.

Edit2:

Это рабочая функция:

def worker_func(steplength, episode, episodes, env, agent, state, log_data_qvalues, log_data, steps):
    env.time_ = step
    action = agent.act(state, env)                                                                               # given the state, the agent acts (eps-greedy) either by choosing randomly or relying on its own prediction (weights are considered here to sum up the q-values of all objectives)
    next_state, reward = env.steplength(action, state)                                                                # given the action, the environment gives back the next_state and the reward for the transaction for all objectives seperately
    agent.remember(state, action, reward, next_state, env.future_reward)                                        # agent puts the experience in his memory
    q_values = agent.model.predict(np.reshape(state, [1, env.state_size]))                                      # This part is not necessary for the framework, but lets the agent predict every time_ to
    start = 0                                                                                                   # to store the development of the prediction and to investigate the development of the Q-values
    machine_start = 0
    for counter, machine in enumerate(env.list_of_machines):
        liste = [episode, steplength, state[counter]]
        q_values_objectives = []
        for objective in range(1, env.number_of_objectives + 1):
            liste.append(objective)
            liste.append(q_values[0][start:machine.actions + start])
            start = int(agent.action_size / env.number_of_objectives) + start
        log_data_qvalues.append(liste)
        machine_start += machine.actions
        start = machine_start
    state = next_state
    steps.append(state)
    env.current_step += 1
    if len(agent.memory) > agent.batch_size:                                                                    # If the agent has collected more than batch_size-experience, the networks of the agents are starting
        agent.replay(env)                                                                                       # to be trained, with the replay function, batch-size- samples from the memory of the agents are selected
    agent.update_target_model()                                                                                 # the Q-target is updated after one batch-training
    if steplength == env.steplength-2:                                                                                # for plotting the process during training
        #agent.update_target_model()
        print(f'Episode: {episode + 1}/{episodes}    Score: {steplength}    e: {agent.epsilon:.5}')
        log_data.append([episode, agent.epsilon])

Как вы можете видеть, он использует несколько классов для передачи атрибутов. Я не знаю, как бы это воспроизвести. Я все еще экспериментирую на том, где процесс застревает точно. Рабочая функция связывается с классами env и agent и передает информацию, необходимую для обучения нейронной сети. Класс agent управляет процессом обучения, в то время как класс env имитирует среду, которой управляет сеть.

step является целочисленной переменной:

step = 12

1 Ответ

0 голосов
/ 05 мая 2020

Вы звоните

mpool.close()
mpool.join()

в конце?


РЕДАКТИРОВАТЬ

Проблема не в w / multiprocessing, а в measurement count часть. Согласно скриншоту, карта пула успешно заканчивается с шагом 11 (range(12) начинается с 0). measurement count нигде не видно в предоставленных фрагментах, чтобы попытаться отладить эту часть.

...