当尝试在任意 rllib 多代理环境中将 3D 形状的 Box 空间传输到代理时,程序崩溃并给出提示消息“A worker 在执行任务时因意外的系统错误而死亡或被杀死,并且 RayActorError:演员在完成这项任务之前意外死亡”。但是,如果输入空间是一维空间,则可以避免该错误。该错误与特定的 3D 形状大小无关,shape=(84, 84, 3) 或任何自定义的 3D 形状大小都会有同样的问题。
有什么方法可以输入 3D 形状而不会出现此错误?射线版本是 1.9.2
核心代码是(例如使用 A3C Trainer):
trainer = A3CTrainer(env="env", config={
"multiagent": {
"policies": {
'0': (A3CTFPolicy, spaces.Box(low=0., high=1., shape=(84, 84, 3)), spaces.Discrete(2), {}), #bug occurs when the shape=(84,84,3)
#'0': (A3CTFPolicy, spaces.Box(low=0., high=1., shape=(84, )), spaces.Discrete(2), {}), #bug is avoided when shape = (84,)
},
"policy_mapping_fn": lambda id: '0' #unique policy
},
})
日志是: Traceback(最近一次调用最后一次):
文件“...\A3C - fortest.py”,第 12 行,在 trainer = A3CTrainer(env="env", config={
文件“...\envs\tensorflow\lib\site-packages\ray\rllib\agents\trainer_template.py”,第 102 行,在 init Trainer.init(self, config, env, logger_creator,
文件“...\envs\tensorflow\lib\site-packages\ray\rllib\agents\trainer.py”,第 661 行,在 init super().init(config, logger_creator, remote_checkpoint_dir,
文件“...\envs\tensorflow\lib\site-packages\ray\tune\trainable.py”,第 121 行,在 init self.setup(copy.deepcopy(self.config))
文件“...\envs\tensorflow\lib\site-packages\ray\rllib\agents\trainer_template.py”,第 113 行,在 setup super().setup(config)
文件“...\envs\tensorflow\lib\site-packages\ray\rllib\agents\trainer.py”,第 764 行,在 setup self._init(self.config, self.env_creator)
文件“...\envs\tensorflow\lib\site-packages\ray\rllib\agents\trainer_template.py”,第 136 行,在 _init
_make_workers 中的文件“...\envs\tensorflow\lib\site-packages\ray\rllib\agents\trainer.py”,第 1727 行,返回 WorkerSet(
文件“...\envs\tensorflow\lib\site-packages\ray\rllib\evaluation\worker_set.py”,第 87 行,在 init remote_spaces = ray.get(self.remote_workers(
文件“C:\Users\y\anaconda3\envs\tensorflow\lib\site-packages\ray_private\client_mode_hook.py”,第 105 行,在包装返回 func(*args, **kwargs) 文件“...\envs \tensorflow\lib\site-packages\ray\worker.py",第 1715 行,获取提升值
RayActorError:演员在完成此任务之前意外死亡。
2022-02-06 11:59:07,856 WARNING worker.py:1245 -- 一个工作人员在执行任务时因意外的系统错误而死亡或被杀死。要解决问题,请检查死亡工人的日志。RayTask ID: ffffffffffffffffb025425fa1d54c02ba27f8df01000000 Worker ID: 51efe6f16f87e7bc770e7c41ff526632786b8dd675e92df108c9e593 Node ID: 5c0244bcb3079a6e7ffed6081741e515f088ef511b5aad6ad7f44a60 Worker IP address: 127.0.0.1 Worker port: 36216 Worker PID: 18336 2022-02-06 11:59:07,890 WARNING worker.py:1245 -- A worker died or was在执行任务时因意外的系统错误而被杀死。要解决问题,请检查死亡工人的日志。RayTask ID:fffffffffffffffaa6a2753a82083400fd70c2b01000000 工作人员 ID:a5b0396bec32388bdf081c130a78af3ae44ee7f8372d4d2e4fefc5c8 节点 ID:
重现错误的简单完整代码示例:
import ray
from ray.rllib.agents.a3c.a3c import A3CTrainer,A3CTFPolicy
from ray.tune.registry import register_env
from gym import spaces
import numpy as np
import gym as gym
from ray.rllib.env.multi_agent_env import MultiAgentEnv
class customEnv(MultiAgentEnv):
def __init__(self, config):
self.zeros = np.zeros((84, 84, 3))
self.action_space = gym.spaces.Discrete(2)
self.observation_space = gym.spaces.Box(0.0, 1.0, shape=(84, 84, 3), dtype=np.float32)
self.i = 0
def reset(self):
self.i = 0
return self.zeros
def step(self, action):
self.i += 1
return self.zeros, 1, self.i > 1000, {}
if __name__ == "__main__":
register_env("env", lambda _: customEnv({}))
ray.init()
trainer = A3CTrainer(env="env", config={
"multiagent": {
"policies": {
'0': (A3CTFPolicy, spaces.Box(low=0., high=1., shape=(84, 84, 3)), spaces.Discrete(2), {}),
},
"policy_mapping_fn": lambda id: '0' #unique policy
},
})
for i in range(5000):
trainer.train()