使用 GPU 多处理了解 openAI gym 和 Optuna 超参数调整
Understanding openAI gym and Optuna hyperparameter tuning using GPU multiprocessing
我正在使用 openAI stable-baselines. I'm also optimising the agents hyperparameters using optuna.
训练强化学习代理
为了加快这个过程,我在不同的函数调用中使用了多重处理。具体在 SubprocVecEnv
和 study.optimize
中,如 docs here 中所建议(分别在 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 多处理? (我不确定在同一个处理器中创建太多线程是否会通过创建比 运行ning 在更少线程上创建更多的开销而实际上减慢速度)。
我猜您的代码与报告的问题相同 here。 stable-baselines 库使用 Tensorflow 作为深度学习框架,它可能会导致在多个试验中意外共享 Tensorflow 会话。这些试验试图同时更新单个计算图,它们会破坏该图。
我认为如果您修改代码以使用单独的会话进行试验,则可以并行试验。或者您可以简单地从 study.optimize
.
中删除 n_jobs
选项
我正在使用 openAI stable-baselines. I'm also optimising the agents hyperparameters using optuna.
训练强化学习代理为了加快这个过程,我在不同的函数调用中使用了多重处理。具体在 SubprocVecEnv
和 study.optimize
中,如 docs here 中所建议(分别在 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 多处理? (我不确定在同一个处理器中创建太多线程是否会通过创建比 运行ning 在更少线程上创建更多的开销而实际上减慢速度)。
我猜您的代码与报告的问题相同 here。 stable-baselines 库使用 Tensorflow 作为深度学习框架,它可能会导致在多个试验中意外共享 Tensorflow 会话。这些试验试图同时更新单个计算图,它们会破坏该图。
我认为如果您修改代码以使用单独的会话进行试验,则可以并行试验。或者您可以简单地从 study.optimize
.
n_jobs
选项