我正在使用openAI的stable-baselines训练一个强化学习智能体。我还在使用optuna优化代理的超参数。
为了加速这个过程,我在不同的函数调用中使用了多进程。特别是在docs here中建议的SubprocVecEnv和study.optimize中(分别低于1.15.3和1.10.4 )。
import numpy as np
from stable_baselines.common.vec_env import SubprocVecEnv
from stable_baselines import PPO2
from stable_baselines.common.policies import MlpLnLstmPolicy
import optuna
n_cpu = 4
def optimize_ppo2(trial):
    """ Learning hyperparamters we want to optimise"""
    return {
        'n_steps': int(trial.suggest_loguniform('n_steps', 16, 2048)),
        'gamma': trial.suggest_loguniform('gamma', 0.9, 0.9999),
        'learning_rate': trial.suggest_loguniform('learning_rate', 1e-5, 1.),
        'ent_coef': trial.suggest_loguniform('ent_coef', 1e-8, 1e-1),
        'cliprange': trial.suggest_uniform('cliprange', 0.1, 0.4),
        'noptepochs': int(trial.suggest_loguniform('noptepochs', 1, 48)),
        'lam': trial.suggest_uniform('lam', 0.8, 1.)
    }
def optimize_agent(trial):
    """ Train the model and optimise
        Optuna maximises the negative log likelihood, so we
        need to negate the reward here
    """
    model_params = optimize_ppo2(trial)
    env = SubprocVecEnv([lambda: gym.make('CartPole-v1') for i in range(n_cpu)])
    model = PPO2(MlpLnLstmPolicy, env, verbose=0, nminibatches=1, **model_params)
    model.learn(10000)
    rewards = []
    n_episodes, reward_sum = 0, 0.0
    obs = env.reset()
    while n_episodes < 4:
        action, _ = model.predict(obs)
        obs, reward, done, _ = env.step(action)
        reward_sum += reward
        if done:
            rewards.append(reward_sum)
            reward_sum = 0.0
            n_episodes += 1
            obs = env.reset()
    last_reward = np.mean(rewards)
    trial.report(-1 * last_reward)
    return -1 * last_reward
if __name__ == '__main__':
    study = optuna.create_study(study_name='cartpol_optuna', storage='sqlite:///params.db', load_if_exists=True)
    study.optimize(optimize_agent, n_trials=1000, n_jobs=4)我在google colab环境中使用GPU。我的问题是,在SubprocVecEnv和study.optimize方法中使用多处理,我如何确保超参数调优在后端正确执行?换句话说,我怎么知道结果不会被覆盖呢?
此外,在这个SubprocVecEnv和study.optimize都可以在多核上运行的特殊用例中,有没有更好的方法来使用GPU多处理?(我不确定在同一处理器中创建太多线程是否会造成更多的开销,而不是在更少的线程上运行)。
发布于 2019-06-17 18:08:22
我猜您的代码与报告的here有相同的问题。稳定基线库使用Tensorflow作为深度学习框架,它可能会导致Tensorflow会话在多个试验中意外共享。这些试验试图同时更新单个计算图形,但它们将破坏该图形。
我认为,如果您修改代码以使用独立的会话进行试验,则可以并行化试验。或者,您可以简单地从study.optimize中删除n_jobs选项。
https://stackoverflow.com/questions/56584975
复制相似问题