注意:Ray目前还在开发之中,某些API还没有稳定下来。此教程按照0.7.2版本撰写,已经发现最新版本模型定义的方式上有较大变化,使用的时候留意!
文章目录
Tune
Tune是Ray提供的用于调整超参数的工具,提供了多种参数搜索算法。即使无需调整超参数,也可以作为训练程序的入口,优势在于更好的参数配置、日志输出、结果展示。RLlib里面的算法可以被封装为Trainer被Tune调用。
下面是使用Tune训练CartPole并搜索学习率的示例:
import ray
from ray import tune
ray.init(redis_address="localhost:6379")
tune.run(
"PPO",
stop={
"episode_reward_mean": 200},
config={
"env": "CartPole-v0",
"num_gpus": 0,
"num_workers": 1,
"lr": tune.grid_search([0.01, 0.001, 0.0001]),
},
)
Tune接受两种不同的方式进行训练,function-based API或Trainable API。定义function-based API的方式如下:
def trainable(config, reporter):
"""
Args:
config (dict): Parameters provided from the search algorithm
or variant generation.
reporter (Reporter): Handle to report intermediate metrics to Tune.
"""
while True:
# ...
reporter(**kwargs)
其中reporter属于类ray.tune.function_runner.StatusReporter
,记录了用于控制参数搜索算法的性能反馈,如mean_accuracy。除了使用reporter,也可以用track.log(from ray.tune import track)。
Trainable API则需要定义一个类Trainable
,子类需要覆写_setup
、_test
、_train
、_save
、_restore
等函数。
可以参考使用PyTorch训练MNIST类似的来实现自己的Tune可训练对象,分别见mnist_pytorch和mnist_pytorch_trainable。
RLlib
RLlib是运行在Ray上层的强化学习框架,提供了丰富的接口函数用于快速构建算法。
Environments
RLlib支持OpenAI Gym作为仿真环境,也可以支持用户自定义的环境。下面重点讲一下如何定义多智能体的仿真环境。
MultiAgentEnv
Ray定义了类MultiAgentEnv
来处理多智能体的环境,将原gym函数返回值拓展为了{agent_id: value}的形式
以下是example中的示例,全部代码在twostep_game:
from ray.rllib.env.multi_agent_env import MultiAgentEnv
class TwoStepGame(MultiAgentEnv):
action_space = Discrete(2)
# Each agent gets a separate [3] obs space, to ensure that they can
# learn meaningfully different Q values even with a shared Q model.
observation_space = Discrete(6)
def __init__(self, env_config):
self.state = None
def reset(self):
self.state = 0
return {
"agent_1": self.state, "agent_2": self.state + 3}
def step(self, action_dict