文章目录
- 一、待解决问题
- 二、方法详述
- 2.1 必要说明
- 2.2 应用步骤
- 2.2.1 创建虚拟环境并安装MARLlib,并更新torch版本及ray版本
- 2.2.2 运行算法示例,并修改MARLlib源码
- (1)ModuleNotFoundError: No module named 'ray.rllib.agents'
- (2)ImportError: cannot import name 'EntropyCoeffSchedule' from 'ray.rllib.policy.torch_policy'
- (3)ImportError: cannot import name 'TrainerConfigDict' from 'ray.rllib.utils.typing'
- (4)ImportError: cannot import name 'sequence_mask' from 'ray.rllib.utils'
- (5)ModuleNotFoundError: No module named 'ray.rllib.utils.torch_ops'>
- (6)ModuleNotFoundError: No module named 'ray.rllib.agents'
- 三、疑问
- 四、总结
一、待解决问题
1.1 问题描述
基于ubuntu系统在最新pytorch及ray版本下安装MARLlib环境,并将 MAPPO+MPE-simple_spread 算法示例的结果可视化。
1.2 解决方法
(1)创建虚拟环境并安装MARLlib,并更新torch版本及ray版本。
(2)运行算法示例,并修改MARLlib源码。
(3)可视化算法示例。
二、方法详述
2.1 必要说明
- 为什么要基于最新版本的pytorch和ray版本运行?
首先
torch
与ray
存在版本不兼容的问题,最好是都能采用最新版本。
后续开发代码,需要在最新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.0
中a3c_torch_policy
与a2c
代码进行替换
做到这里的时候,我已经发现这个工作量太大了。果断放弃,即时止损!!!
后面看到 Github 上的讨论,这个 MARLlib 框架的开发还有待提升,torch 1.9.0
和 ray 1.8.0
的版本实在太低了。
难受的点在与:
- 新型的显卡不能使用低版本的
torch
- 但新版本的
torch
与低版本的ray
存在兼容性问题
💐 非完结,少撒花 💐
三、疑问
暂无
四、总结
MARLlib
无法直接采用最新版本ray
,源码中太多库引入import
需要更新了。- 希望作者能够早日更新版本吧!