尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ML-Agents PettingZoo 包装器实战指南:用 AEC / Parallel 多智能体 API 驱动 Unity 环境

ML-Agents PettingZoo 包装器实战指南:用 AEC / Parallel 多智能体 API 驱动 Unity 环境 人工智能强化学习深度学习机器学习游戏开发AI 应用【免费下载链接】ml-agentsThe Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinforcement learning and imitation learning.项目地址https://gitcode.com/gh_mirrors/ml/ml-agents点击查看免费下载导读本指南围绕 Unity ML-Agents 提供的 PettingZoo 包装器展开它把基于UnityEnvironment的 Unity 仿真环境封装为符合 PettingZoo 标准的 AECAgent Environment Cycle与 Parallel 两种多智能体接口。你将掌握UnityAECEnv、UnityParallelEnv与PettingZooEnvFactory的完整 API、与底层BaseEnv的对应关系、批量步进机制以及真实可运行的训练循环写法从而把 Unity 多智能体场景无缝接入 PettingZoo 生态如 SuperSuit、稳定基线等工具链。一、背景为什么需要 PettingZoo 包装器随着多智能体强化学习MARL对 gym 风格 API 的需求增长ML-Agents 提供了围绕 PettingZoo API 的包装器。它建立在UnityEnvironment类之上——这是通过 Python 与 Unity 环境交互的默认方式。包装器的目标非常明确让 Unity 环境中多个行为Behavior各异、甚至同一行为下多个智能体的多智能体场景能够以标准的 PettingZoo 接口被外部训练框架消费而不必直接处理底层的DecisionSteps/TerminalSteps批次数据。在 ML-Agents 中一个行为BehaviorName把观测与动作空间相同、期望行为相近的一批智能体归为一组数据按批次传输见 base_env.py 的模块说明。PettingZoo 包装器正是把这种按行为分组的批处理世界翻译成按智能体逐一交互的世界。二、安装与前置条件PettingZoo 包装器属于mlagents_envs包安装mlagents_envs时即包含该包装器pip install mlagents_envs同时需要安装pettingzoo依赖包装器直接继承pettingzoo.AECEnv与pettingzoo.ParallelEnv。完整安装说明可参考 ml-agents-envs/README.md。仓库自带一个端到端的 Colab 示例 Colab_PettingZoo.ipynb演示了安装、基本用法以及基于Strikers vs Goalie一个包含多个不同行为名的多智能体环境详细介绍见 Learning-Environment-Examples.md的完整示例是快速上手的推荐起点。三、架构总览从 UnityEnvironment 到 PettingZoo包装器整体位于 ml-agents-envs/mlagents_envs/envs/ 目录核心包含四个模块模块类职责pettingzoo_env_factory.pyPettingZooEnvFactory从环境注册表创建 Unity 环境并封装为 AEC 包装器unity_aec_env.pyUnityAECEnv(UnityPettingzooBaseEnv, AECEnv)PettingZoo AEC 接口逐智能体轮转unity_parallel_env.pyUnityParallelEnv(UnityPettingzooBaseEnv, ParallelEnv)PettingZoo Parallel 接口全体同时行动unity_pettingzoo_base_env.pyUnityPettingzooBaseEnv共享基类space 映射、动作处理、底层步进继承关系与数据流如下UnityEnvironment (BaseEnv) │ 行为批数据 DecisionSteps / TerminalSteps ▼ UnityPettingzooBaseEnv ── 展开为 {agent_id: obs/reward/...} 字典 ├── UnityAECEnvAEC逐智能体 step └── UnityParallelEnvParallel全体 step构造包装器时基类会在__init__中做一次环境预步进若behavior_specs为空则主动env.step()以便把行为信息发送过来进而建立观测空间与动作空间映射见 unity_pettingzoo_base_env.py。四、环境工厂PettingZooEnvFactoryenv 方法class PettingZooEnvFactory: def __init__(self, env_id: str) - None: ... def env( self, seed: Optional[int] None, **kwargs: Union[List, int, bool, None] ) - UnityAECEnv: ...参数说明seed用于各智能体动作空间的随机种子kwargsUnityEnvironment类接受的任意参数file_name除外。底层行为见 pettingzoo_env_factory.py若未显式传入side_channels会自动补充三个默认侧信道EngineConfigurationChannel、EnvironmentParametersChannel、StatsSideChannel若未提供base_port则从 6000 开始逐个尝试端口直到找到一个未被占用的端口捕获UnityWorkerInUseException后端口自增通过default_registry[env_id].make(**kwargs)从注册表创建环境最后返回UnityAECEnv包装器。这里的default_registry是UnityEnvRegistry单例见 unity_env_registry.py它维护了一批无需安装 Unity 编辑器即可直接启动的环境如StrikersVsGoalie支持从本地或远程 manifestYAML懒加载注册条目并通过registry[identifier].make()启动对应可执行文件。mlagents_envs.envs包在导入时会遍历注册表为每个已注册环境动态绑定一个PettingZooEnvFactory实例见 ml-agents-envs/mlagents_envs/envs/init.py因此可以直接以mlagents_envs.envs.env_name的方式使用import mlagents_envs.envs env mlagents_envs.envs.StrikersVsGoalie.env()五、AEC 接口UnityAECEnv类定义与初始化class UnityAECEnv(UnityPettingzooBaseEnv, AECEnv): def __init__(self, env: BaseEnv, seed: Optional[int] None):env被包装的UnityEnvironment或任意BaseEnvseed用于动作空间采样的随机种子。step(action)def step(self, action: Any) - None:设置当前活跃智能体的动作并获取下一个智能体的观测、奖励、终止、截断与信息。这是 AEC 的核心——每次调用只处理一个智能体。关键实现见 unity_aec_env.py若_live_agents为空即尚未 reset会抛出 gymnasium 的error.Error(You must reset the environment before you can perform a step)将动作通过_process_action存入当前动作缓冲然后推进_agent_index并清零所有智能体的瞬时奖励当_agent_index超过智能体总数时才真正调用_step()把缓冲中的全部动作一次性交给底层 Unity 环境步进。observe(agent_id) 与 last()def observe(self, agent_id): ... def last(self, observeTrue):observe返回指定智能体的五元组(observation, cumulative_reward, termination, truncation, info)。last()是observe的封装返回当前轮转智能体由self.agent_selection指定即_agent_index对应的智能体的同一组数据observeFalse时观测部分返回None。agent_selectionproperty def agent_selection(self):若没有存活智能体返回_agents[0]用于处理最后一个智能体刚刚结束的局面否则返回当前索引对应的智能体。典型 AEC 交互循环from mlagents_envs.environment import UnityEnvironment from mlagents_envs.envs.unity_aec_env import UnityAECEnv unity_env UnityEnvironment(StrikersVsGoalie) env UnityAECEnv(unity_env) env.reset() for agent in env.agent_iter(): observation, reward, termination, truncation, info env.last() action policy(observation, agent) env.step(action)这个循环与 PettingZoo 官方 AEC API 完全一致可以直接替换任何标准 AEC 环境。六、Parallel 接口UnityParallelEnvclass UnityParallelEnv(UnityPettingzooBaseEnv, ParallelEnv): def __init__(self, env: BaseEnv, seed: Optional[int] None):Parallel API 面向所有智能体同时决策的场景接口更贴近传统 RL batch 思维reset(seedNone, optionsNone) - Tuple[Dict[str, Any], Dict[str, Dict]]重置环境返回(observations, infos)两个以agent_id为键的字典step(actions: Dict[str, Any]) - Tuple接收{agent_id: action}字典一次性处理全部智能体的动作并步进环境返回(observations, rewards, terminations, truncations, infos)五个字典实现见 unity_parallel_env.py。Parallel 模式下每次step都会真正驱动底层环境前进动作无需像 AEC 那样攒批。七、共享基类UnityPettingzooBaseEnv基类封装了 AEC 与 Parallel 共用的逻辑是理解整个包装器的关键见 unity_pettingzoo_base_env.py。观测与动作空间property def observation_spaces(self) - Dict[str, spaces.Space]: ... def observation_space(self, agent: str) - Optional[spaces.Space]: ... property def action_spaces(self) - Dict[str, spaces.Space]: ... def action_space(self, agent: str) - Optional[spaces.Space]: ...观测空间每个ObservationSpec被映射为spaces.Box(low-inf, highinf, shapespec.shape, dtypenp.float32)若一个行为有多个观测则包装为spaces.Tuple动作空间根据ActionSpec生成规则如下源码第 112-145 行动作类型生成的 gymnasium 空间仅单个离散分支discrete_size 1且无连续spaces.Discrete(branch_size)多个离散分支无连续spaces.MultiDiscrete(discrete_branches)仅连续动作spaces.Box(-1, 1, (continuous_size,), dtypenp.float32)连续 离散混合spaces.Tuple((c_space, d_space))动作空间在__init__中创建并在提供seed时播种reset(seed...)会重新播种已有空间保证可复现采样对应测试见下文第八节。动作处理与批量步进_process_action(current_agent, action)完成三件事把传入动作转换为 numpy 数组并校验current_action_space.contains(action)非法动作抛出error.Error按空间类型转换为底层ActionTuple离散标量 reshape 为(1, 1)、连续动作直接作为continuous分量若智能体已终止/截断则从存活列表与各状态字典中移除否则把动作写入_current_action缓冲中该智能体对应的行。_step()则是真正的攒批提交遍历_current_action为每个行为调用_env.set_actions(behavior_name, actions)随后_env.step()推进仿真再对各行为调用_batch_update读取新的DecisionSteps/TerminalSteps并刷新所有智能体状态。side_channel 属性property def side_channel(self) - Dict[str, Any]:返回环境侧信道字典按侧信道类名为键可通过env.side_channel[name-of-channel]访问例如EngineConfigurationChannel、EnvironmentParametersChannel、StatsSideChannel用于在训练循环中收发自定义数据。reset / render / closedef reset(self, seed: Optional[int] None, options: Optional[Dict] None) - Any: ... def render(self): ... # NOT SUPPORTED空实现 pass def close(self) - None: ...reset重置所有状态字典、清空possible_agents调用底层_env.reset()然后重新拉取各行为数据render不支持占位实现passclose关闭底层环境并把_env置为None基类还注册了atexit.register(self.close)与__del__确保进程退出时资源被释放。八、智能体 ID 编码与批次解包包装器把行为 批内序号编码为字符串形式的agent_id编码规则在 env_helpers.py 中def _behavior_to_agent_id(behavior_name: str, unique_id: int) - str: return f{behavior_name}?agent_id{unique_id}因此智能体 ID 形如StrikersVsGoalie?agent_id0_agent_id_to_behavior通过split(?agent_id)反向还原行为名。_unwrap_batch_steps则把一对(DecisionSteps, TerminalSteps)解包为字典形式的观测、奖励、终止、截断、info 与 id 映射其中termination 与 truncation 的区分以TerminalSteps.interrupted为准interruptedTrue记为截断truncation否则记为终止termination并在 info 中额外写入interrupted、behavior_name、group_id、group_reward字段观测若为多观测则保留列表单观测直接取出若DecisionSteps.action_mask存在观测会附上action_mask离散动作遮蔽信息。这一interrupted → truncation的语义在单元测试 test_pettingzoo_wrapper.py 中被显式断言是该包装器对齐 PettingZoo 规范的关键细节。九、使用注意事项重要根据官方文档 Python-PettingZoo-API.md 与源码实现使用时需注意以下四点AEC 与 Parallel 双支持包装器同时实现 PettingZoo 的 AEC 与 Parallel 两套 API按需选择AEC 底层是攒批步进UnityAECEnv并不会在每次env.step(action)时真的步进环境而是先存储动作直到当前步所有请求动作的智能体都被分配动作后才批量提交给 Unity。这是出于性能考虑——Unity 与 Python 之间的通信在数据批量发送时效率更高瞬时奖励语义有差异由于 AEC 动作是延迟应用的某些 API 组件可能表现异常。例如env.reward应返回该步的瞬时奖励但真实奖励要等实际环境步进后才可用。建议遵循 API 定义训练——从env.last()获取奖励而不是env.reward底层机制不影响训练结果环境自动重置当环境完成一个 episode 后会自动重置因此env.agent_iter(max_step)会一直运行直到达到指定的最大步数默认2**63。除初始化时外无需手动调用env.reset()。十、测试验证仓库通过 PettingZoo 官方 API 一致性测试保证包装器行为正确见 test_pettingzoo_wrapper.pytest_single_agent_aec/test_multi_agent_aec分别用单智能体与双智能体模拟环境跑pettingzoo.test.api_test各 100 个周期test_single_agent_parallel/test_multi_agent_parallel用pettingzoo.test.parallel_api_test验证 Parallel 包装器test_reset_seed_reseeds_action_spaces验证reset(seed...)会真正重新播种既有动作空间保证采样可复现test_unwrap_batch_steps_terminated_truncated验证interrupted与 termination/truncation 的映射语义。这些测试同时表明包装器可以接收任何实现了BaseEnv接口的对象包括测试用的SimpleEnvironment/MultiAgentEnvironment模拟环境而不限于真实的UnityEnvironment极大方便了算法调试与单元测试。十一、快速参考API 一览类 / 方法签名说明PettingZooEnvFactory.envenv(seedNone, **kwargs) - UnityAECEnv从注册表创建并包装环境自动补充默认侧信道、自动探测空闲端口UnityAECEnv.stepstep(action) - None设置当前智能体动作攒批后步进UnityAECEnv.observeobserve(agent_id)返回智能体的 (obs, 累计奖励, termination, truncation, info)UnityAECEnv.lastlast(observeTrue)返回当前轮转智能体的上述五元组UnityParallelEnv.resetreset(seedNone, optionsNone) - (obs, infos)重置并返回全体观测与 infoUnityParallelEnv.stepstep(actions: Dict) - (obs, rewards, terminations, truncations, infos)全体动作同时步进UnityPettingzooBaseEnv.side_channel属性按类名访问侧信道UnityPettingzooBaseEnv.renderrender()不支持空实现UnityPettingzooBaseEnv.closeclose() - None关闭环境更完整的类与签名定义可查阅 Python-PettingZoo-API-Documentation.md。结语ML-Agents 的 PettingZoo 包装器在保持底层UnityEnvironment批处理性能优势的同时为多智能体场景提供了标准化的 AEC / Parallel 接口。理解智能体 ID 编码 → 空间映射 → 攒批步进这条链路你就能自如地把任意 Unity 多智能体环境接入 PettingZoo 生态直接复用社区中大量基于该 API 开发的 MARL 算法与工具。赞分享人工智能强化学习深度学习机器学习游戏开发AI 应用【免费下载链接】ml-agentsThe Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinforcement learning and imitation learning.项目地址https://gitcode.com/gh_mirrors/ml/ml-agents点击查看免费下载相关推荐Unity ML-Agents 智能体Agent设计实战指南观测、动作、奖励与多智能体协作Unity ML Agents 智能体Agent设计实战指南观测、动作、奖励与多智能体协作 本篇技术指南以 Unity ML Agents 工具包的官方文人工智能强化学习深度学习机器学习游戏开发AI 应用Unity ML-Agents 低层 Python APILLAPI实战指南用 mlagents_envs 直接控制 Unity 强化学习环境Unity ML Agents 低层 Python APILLAPI实战指南用 mlagents_envs 直接控制 Unity 强化学习环境 本文是 U人工智能强化学习深度学习机器学习游戏开发AI 应用ComfyUI-LTXVideo终极指南5个技巧解决LTX-2视频生成技术难题ComfyUI LTXVideo终极指南5个技巧解决LTX 2视频生成技术难题 ComfyUI LTXVideo作为LTX 2视频生成模型在ComfyUI中的人工智能大模型AI 应用媒体生成本地部署创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表