Я запускаю программу на 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 Например, следующий эпизод.
Сообщение об ошибке не выдается. Я бегу 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