You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用RLlib、PettingZoo构建Speaker-Listener训练环境时A2CTrainer报错NotImplementedError的求助

解决RLlib + PettingZoo + Supersuit的NotImplementedError(符号Tensor转numpy失败)

我帮你排查了这段代码的几个关键问题,这个NotImplementedError: Cannot convert a symbolic Tensor...错误的核心原因是你在注册环境时直接传递了已实例化的环境对象,而不是返回新环境实例的工厂函数,再加上配置被意外覆盖,导致RLlib在初始化训练器时无法正确处理符号张量和环境实例的关系。

具体问题分析

  1. 错误的环境注册方式:你用register_env("simple_speaker_listener", lambda stam: mod_env)直接返回了已经创建好的mod_env实例,但RLlib需要的是一个工厂函数——每次调用时生成新的环境实例,因为训练器的worker进程需要各自独立的环境副本。直接传现有实例会导致符号张量在共享时出现转换错误。
  2. 配置被意外覆盖:你先深拷贝了A2C的默认配置,之后又直接将config重新赋值为{"num_gpus": 0, "num_workers": 1},完全覆盖了之前的A2C关键配置(比如rollout_fragment_length、lr_schedule等),这会导致训练器初始化逻辑异常。
  3. 重复的环境实例化:你多次创建simple_speaker_listener_v3.env()实例,没有必要,且容易导致变量混乱。

修正后的完整代码

import numpy as np
import supersuit
from copy import deepcopy
from ray.rllib.env import PettingZooEnv
import ray.rllib.agents.a3c.a2c as a2c
import ray
from ray.tune.registry import register_env
from pettingzoo.mpe import simple_speaker_listener_v3

# 定义环境工厂函数(关键修复点)
def create_speaker_listener_env(_):
    env = simple_speaker_listener_v3.env()
    # 用Supersuit包装环境
    env = supersuit.aec_wrappers.pad_action_space(env)
    env = supersuit.aec_wrappers.pad_observations(env)
    # 转换为RLlib兼容的PettingZooEnv
    return PettingZooEnv(env)

# 初始化Ray
ray.init(num_gpus=0, local_mode=True)

# 注册环境(使用工厂函数,而非现成实例)
register_env("simple_speaker_listener", create_speaker_listener_env)

# 配置A2C训练器(保留默认配置并修改,而非覆盖)
config = deepcopy(a2c.A2C_DEFAULT_CONFIG)
config["env_config"] = {}
config["rollout_fragment_length"] = 20
config["num_workers"] = 1  # 调整为1避免local_mode下的多进程问题
config["num_envs_per_worker"] = 1
config["lr_schedule"] = [[0, 0.007], [20000000, 1e-9]]
config["clip_rewards"] = True
config["num_gpus"] = 0

# 初始化训练器(现在可以正常工作)
agent = a2c.A2CTrainer(env="simple_speaker_listener", config=config)

# 训练循环
s = "{:3d} reward {:6.2f}/{:6.2f}/{:6.2f} len {:6.2f}"
for it in range(5):
    result = agent.train()
    print(s.format(
        it + 1,
        result["episode_reward_min"],
        result["episode_reward_mean"],
        result["episode_reward_max"],
        result["episode_len_mean"]
    ))

# 清理Ray资源
ray.shutdown()

关键修改说明

  • 环境工厂函数:create_speaker_listener_env每次调用都会生成全新的环境实例,确保每个worker(包括主进程)都有独立的环境,避免张量共享冲突。
  • 配置修复:不再覆盖整个config,而是在A2C默认配置的基础上修改参数,保留训练器所需的所有默认设置。
  • Ray资源清理:添加ray.shutdown()避免后续运行时的资源泄漏。
  • 简化逻辑:移除了重复的环境实例化代码,让流程更清晰。

这个修改应该能解决你遇到的符号Tensor转换错误,同时让整个训练流程符合RLlib、PettingZoo和Supersuit的兼容要求。

内容的提问来源于stack exchange,提问作者user13399343

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 06:04:09