【动手学强化学习】番外3-MARLlib之MAPPO+MPE算法示例结果可视化(经验总结)


一、待解决问题

1.1 问题描述

基于ubuntu系统在最新pytorch及ray版本下安装MARLlib环境,并将 MAPPO+MPE-simple_spread 算法示例的结果可视化。

1.2 解决方法

(1)创建虚拟环境并安装MARLlib,并更新torch版本及ray版本。
(2)运行算法示例,并修改MARLlib源码。
(3)可视化算法示例。

二、方法详述

2.1 必要说明

  • 为什么要基于最新版本的pytorch和ray版本运行?

首先 torchray 存在版本不兼容的问题,最好是都能采用最新版本。
后续开发代码,需要在最新 torch 下进行。

2.2 应用步骤

2.2.1 创建虚拟环境并安装MARLlib,并更新torch版本及ray版本

【ps:创建虚拟环境时最好安装3.8或3.9版本的python】
按照以下pip安装最新版本的MARLlib,详细步骤可参考【动手学强化学习】番外2-多智能体强化学习算法框架之“MARLlib”学习

#最好安装3.8或3.9版本的python
conda create -n marllib-py39 python=3.9
conda activate marllib-py39
pip install setuptools==65.5.0
pip install wheel==0.38.0
pip install pip==21.0
cd code/MARLlib-master/
pip install -r requirements.txt
pip install marllib==1.0.3
conda list | grep ray
conda list | grep torch
pip install torch --upgrade
pip install ray --upgrade
pip install ray[tune] --upgrade
pip install ray[rllib] --upgrade
conda list | grep ray
conda list | grep torch

安装过程会提示,不管,我们就是为了更新的torch版本和ray版本兼容:

marllib 1.0.3 requires numpy == 1.20.3, but you have numpy 1.26.4 which is incompatible.
marllib 1.0.3 requires ray == 1.8.0, but you have ray 2.43.0 which is incompatible.
marllib 1.0.3 requires ray[rllib] == 1.8.0, but you have ray 2.43.0 which is incompatible.
marllib 1.0.3 requires ray[tune] == 1.8.0, but you have ray 2.43.0 which is incompatible.
marllib 1.0.3 requires torch == 1.9.0, but you have torch 2.6.0 which is incompatible.

2.2.2 运行算法示例,并修改MARLlib源码

安装可视化IDE,并运行算法示例;

conda install spyder
spyder

MAPPO+MPE-simple_spread 算法示例:

from marllib import marl
# prepare env
env = marl.make_env(environment_name="mpe", map_name="simple_spread")
# initialize algorithm with appointed hyper-parameters
mappo = marl.algos.mappo(hyperparam_source="mpe")
# build agent model based on env + algorithms + user preference
model = marl.build_model(env, mappo, {"core_arch": "mlp", "encode_layer": "128-256"})
# start training
mappo.fit(env, model, stop={"timesteps_total": 100000}, checkpoint_freq=100, share_policy="group")

直接运行,难免会报错,因为原MARLlib是在 torch=1.9.0 ray=1.8.0 下编写的,而本文安装的版本是 torch=1.6.0 ray=2.43.0
因此,需要把旧版本弃用的代码 更新 一下,下面就根据逐个错误进行纠正。

(1)ModuleNotFoundError: No module named ‘ray.rllib.agents’

错误来源:
—> 23 from ray.rllib.agents.ppo.ppo_torch_policy import KLCoeffMixin
解决方法:
替换为 from ray.rllib.algorithms.ppo.ppo_torch_policy import KLCoeffMixin

(2)ImportError: cannot import name ‘EntropyCoeffSchedule’ from ‘ray.rllib.policy.torch_policy’

解决方法:
与(3)一同修改

(3)ImportError: cannot import name ‘TrainerConfigDict’ from ‘ray.rllib.utils.typing’

解决方法:
EntropyCoeffSchedule 已弃用,改使用 AlgorithmConfig。
/marllib/marl/algos/core/__init_.py 代码替换为以下:

from ray.rllib.algorithms.ppo.ppo_torch_policy import KLCoeffMixin
import gym
from ray.rllib.policy.policy import Policy
from ray.rllib.algorithms.algorithm_config import AlgorithmConfig
# import EntropyCoeffSchedule
# import LearningRateSchedule
# from ray.rllib.utils.typing import TrainerConfigDict


def setup_torch_mixins(policy: Policy, obs_space: gym.spaces.Space,
                       action_space: gym.spaces.Space,
                       config: AlgorithmConfig) -> None:
                       # config: TrainerConfigDict) -> None:
    """Call all mixin classes' constructors before PPOPolicy initialization.

    Args:
        policy (Policy): The Policy object.
        obs_space (gym.spaces.Space): The Policy's observation space.
        action_space (gym.spaces.Space): The Policy's action space.
        config (TrainerConfigDict): The Policy's config.
    """
    KLCoeffMixin.__init__(policy, config)
    # EntropyCoeffSchedule.__init__(policy, config["entropy_coeff"],
    #                               config["entropy_coeff_schedule"])
    # LearningRateSchedule.__init__(policy, config["lr"], config["lr_schedule"])
(4)ImportError: cannot import name ‘sequence_mask’ from ‘ray.rllib.utils’

错误来源:
—> 29 from ray.rllib.utils.torch_ops import sequence_mask
解决方法:
替换为 from ray.rllib.utils.torch_utils import sequence_mask

(5)ModuleNotFoundError: No module named ‘ray.rllib.utils.torch_ops’>

错误来源:
—> 31 from ray.rllib.utils.torch_ops import convert_to_torch_tensor
解决方法:
替换为 from ray.rllib.utils.torch_utils import convert_to_torch_tensor

(6)ModuleNotFoundError: No module named ‘ray.rllib.agents’

错误来源:
—> 32 from ray.rllib.agents.a3c.a3c_torch_policy import A3CTorchPolicy
—>33 from ray.rllib.agents.a3c.a2c import A2C_DEFAULT_CONFIG as A2C_CONFIG, A2CTrainer
解决方法:
找到原有的 ray 1.8.0a3c_torch_policya2c 代码进行替换

做到这里的时候,我已经发现这个工作量太大了。果断放弃,即时止损!!!

后面看到 Github 上的讨论,这个 MARLlib 框架的开发还有待提升,torch 1.9.0ray 1.8.0 的版本实在太低了。
难受的点在与:

  1. 新型的显卡不能使用低版本的 torch
  2. 但新版本的 torch 与低版本的 ray 存在兼容性问题

💐 非完结,少撒花 💐

三、疑问

暂无

四、总结

  • MARLlib 无法直接采用最新版本 ray ,源码中太多库引入 import 需要更新了。
  • 希望作者能够早日更新版本吧!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值