AlgorithmConfig API#
RLlib 的 AlgorithmConfig API 是一个经过自动验证且类型安全的入口,用于配置和构建 RLlib 的 Algorithm。
本质上,您首先创建一个 AlgorithmConfig 实例,然后调用其方法来设置各种配置选项。RLlib 在其代码的所有部分都使用以下符合 black 规范的格式。
请注意,您可以将多个方法调用链接在一起,包括构造函数
from ray.rllib.algorithms.algorithm_config import AlgorithmConfig
config = (
# Create an `AlgorithmConfig` instance.
AlgorithmConfig()
# Change the learning rate.
.training(lr=0.0005)
# Change the number of Learner actors.
.learners(num_learners=2)
)
提示
出于值检查和类型安全的原因,您绝不应直接在 AlgorithmConfig 中设置属性,而应始终通过适当的方法进行。
# WRONG!
config.env = "CartPole-v1" # <- don't set attributes directly
# CORRECT!
config.environment(env="CartPole-v1") # call the proper method
算法特定的配置类#
实际上,您并不直接使用基类 AlgorithmConfig,而是始终使用其特定于算法的子类,例如 PPOConfig。每个子类都有自己的一组附加参数传递给 training() 方法。
通常,您应该选择与您希望运行学习实验的 Algorithm 匹配的特定 AlgorithmConfig 子类。例如,如果您想使用 IMPALA 作为您的算法,您应该导入其特定的配置类
from ray.rllib.algorithms.impala import IMPALAConfig
config = (
# Create an `IMPALAConfig` instance.
IMPALAConfig()
# Specify the RL environment.
.environment("CartPole-v1")
# Change the learning rate.
.training(lr=0.0004)
)
要更改特定于算法的设置,这里以 IMPALA 为例,也请使用 training() 方法
# Change an IMPALA-specific setting (the entropy coefficient).
config.training(entropy_coeff=0.01)
您可以通过调用 build_algo() 方法直接从配置对象构建 IMPALA 实例
# Build the algorithm instance.
impala = config.build_algo()
任何已构建的 Algorithm 实例中存储的配置对象是您原始配置的副本。这允许您进一步修改原始配置对象并构建另一个算法实例,而不会影响之前构建的实例。
# Further alter the config without affecting the previously built IMPALA object ...
config.training(lr=0.00123)
# ... and build a new IMPALA from it.
another_impala = config.build_algo()
如果您正在使用 Ray Tune,请将您的 AlgorithmConfig 实例传递给 Tuner 的构造函数。
from ray import tune
tuner = tune.Tuner(
"IMPALA",
param_space=config, # <- your RLlib AlgorithmConfig object
..
)
# Run the experiment with Ray Tune.
results = tuner.fit()
通用配置设置#
大多数配置设置是通用的,适用于 RLlib 的所有 Algorithm 类。以下部分将引导您了解用户在深入了解其他配置设置以及开始超参数微调之前应密切关注的最重要的配置设置。
RL 环境#
要配置您的算法训练所针对的 RL 环境,请使用 env 参数调用 environment() 方法。
config.environment("Humanoid-v5")
有关更多详细信息,请参阅此 RL 环境指南。
学习率 lr#
通过 training() 方法中的 lr 参数来设置更新模型的学习率。
config.training(lr=0.0001)
训练批次大小#
通过 training() 方法中的 train_batch_size_per_learner 参数来设置每个 Learner actor 的训练批次大小。
config.training(train_batch_size_per_learner=256)
注意
您可以通过将 train_batch_size_per_learner 与 (num_learners 或 1) 相乘来计算总的有效训练批次大小。或者,您也可以直接查看配置的 total_train_batch_size 属性的值。
config.training(train_batch_size_per_learner=256)
config.learners(num_learners=2)
print(config.total_train_batch_size) # expect: 512 = 256 * 2
折扣因子 gamma#
通过 training() 方法中的 gamma 参数来设置 RL 折扣因子。
config.training(gamma=0.995)
使用 num_env_runners 和 num_learners 进行扩展#
通过 env_runners() 方法中的 num_env_runners 参数来设置用于收集训练样本的 EnvRunner actor 的数量。
config.env_runners(num_env_runners=4)
# Also use `num_envs_per_env_runner` to vectorize your environment on each EnvRunner actor.
# Note that this option is only available in single-agent setups.
# The Ray Team is working on a solution for this restriction.
config.env_runners(num_envs_per_env_runner=10)
通过 learners() 方法中的 num_learners 参数来设置用于更新模型的 Learner actor 的数量。这应对应于可用于训练的 GPU 数量。
config.learners(num_learners=2)
禁用 explore 行为#
通过 env_runners() 方法中的 explore 参数来开启/关闭探索行为。为了计算动作,当 explore=True 时,EnvRunner 会调用 RLModule 的 forward_exploration();当 explore=False 时,则调用 forward_inference()。默认值为 explore=True。
# Disable exploration behavior.
# When False, the EnvRunner calls `forward_inference()` on the RLModule to compute
# actions instead of `forward_exploration()`.
config.env_runners(explore=False)
Rollout 长度#
通过 env_runners() 方法中的 rollout_fragment_length 参数来设置每个 EnvRunner 遍历其每个 RL 环境副本的步数。请注意,某些算法(如 PPO)会根据 训练批次大小、EnvRunner actor 的数量以及每个 EnvRunner 的环境数量自动设置此值。
config.env_runners(rollout_fragment_length=50)
所有可用的方法和设置#
除了前面描述的最常见设置外,AlgorithmConfig 类及其特定于算法的子类还提供了许多其他配置选项。
为了更语义化地组织内容,AlgorithmConfig 将其各种配置设置分组到以下类别中,每个类别都由其自己的方法表示。
要熟悉 RLlib 的各种配置选项,您可以浏览 RLlib 的示例文件夹,或查看此 示例文件夹概述页面。
每个示例脚本通常会介绍一个新的配置设置,或者向您展示如何通过组合设置某些配置选项和向您的实验添加自定义代码来实现特定的自定义。