ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DeepMind Lab Python 环境 API 完全指南:从 Lab 类到 level_cache 的实战解析

DeepMind Lab Python 环境 API 完全指南:从 Lab 类到 level_cache 的实战解析 人工智能强化学习机器学习【免费下载链接】labA customisable 3D platform for agent-based AI research项目地址https://gitcode.com/gh_mirrors/la/lab点击查看免费下载DeepMind Lab 是一个面向 agent-based AI 研究、基于 Quake III Arena 引擎定制的可配置 3D 平台而deepmind_lab模块是研究者与这个 3D 环境交互的核心入口。本文以仓库中的 docs/users/python_api.md 为骨架结合 python/dmlab_module.c 等源码实现与 python/tests/dmlab_module_test.py 等测试用例系统讲解deepmind_lab模块的函数、Lab类的全部方法、配置项、渲染器选择、观察与动作协议以及 Level Cache 机制。读完本文你将能够独立创建环境、配置分辨率与渲染方式、理解观测/动作规格、管理种子与回合并为每回合动态生成地图的高频场景落地可复用的关卡缓存。1. 模块概览与参考示例deepmind_lab模块定义了核心类Lab以及若干模块级函数。官方推荐的三个可直接运行的参考实现分别是python/tests/dmlab_module_test.py对模块 API 的完整行为测试覆盖构造参数校验、reset/step 循环、观察与动作规格、事件、关闭语义等python/random_agent.py随机 agent 示例包含离散动作 agentDiscretizedRandomAgent与弹簧平滑动作 agentSpringAgent两种策略并演示了record/demo/demofiles/video等扩展配置python/random_agent_simple.py最简随机 agent 示例展示了从构造环境到逐帧step的最小闭环并演示了set_runfiles_path的用法。这些示例是理解整套 API 的最佳起点后续章节会反复引用其中的调用模式。2. 模块级函数2.1deepmind_lab.version()打印当前 DeepMind Lab 的版本号。该信息的参考价值有限文档原文也注明版本号很少更新通常不需要在生产代码中依赖它。在 python/dmlab_module.c 中它直接返回编译期宏DEEPMIND_LAB_WRAPPER_VERSION。2.2deepmind_lab.runfiles_path()与deepmind_lab.set_runfiles_path(path)这两个函数用于管理与模块的 runfiles path即模块运行时依赖尤其是原生代码库例如头less渲染用的.so动态库所在的目录。模块的部署方式决定了你是否需要在创建环境前手动设置该路径在 Bazel 构建的运行目录下模块会依据__file__自动推导出形如.runfiles/org_deepmind_lab的路径见 python/dmlab_module.c此时通常无需手动设置在打包或自定义部署场景下若运行时找不到依赖应调用deepmind_lab.set_runfiles_path(path)显式指定。random_agent_simple.py提供了典型用法先解析命令行参数--runfiles_path再在创建环境前调用set_runfiles_path见 python/random_agent_simple.py。测试代码中的另一种常见用法是结合 Bazel 的TEST_SRCDIR环境变量设置路径import os import deepmind_lab if os.environ.get(TEST_SRCDIR): deepmind_lab.set_runfiles_path(os.path.join( os.environ[TEST_SRCDIR], org_deepmind_lab))此模式见于 python/tests/dmlab_module_test.py 的测试入口。3. 核心类deepmind_lab.Lab3.1 构造签名与基本语义deepmind_lab.Lab(level, observations, config{}, renderersoftware, level_cacheNone)level要加载的游戏脚本文件Lua 关卡脚本名。例如lt_chasm、tests/empty_room_test、contributed/dmlab30/explore_goal_locations_small。observations字符串列表指定环境observations()方法将返回哪些观测。列表为空也是合法的例如仅用于跑动作循环。config键值均为字符串的字典用于追加设置详见第 4 节。renderer渲染器选择software或hardware默认software与 Bazel 构建时选择的图形实现配合生效详见第 5 节。level_cache可选的对象用于复用已编译的关卡详见第 7 节。构造参数具有严格的类型约束python/tests/dmlab_module_test.py 的testInitArgs通过assertRaisesRegex验证了四类错误deepmind_lab.Lab(tests/empty_room_test, [], [wrongconfig]) # TypeError: must be dict, not list deepmind_lab.Lab(tests/empty_room_test, [], {wrongtype: 3}) # TypeError: 配置值必须是字符串 deepmind_lab.Lab(tests/empty_room_test, None, {}) # TypeError: must be list, not None deepmind_lab.Lab(tests/empty_room_test, [nonexisting_obs], {}) # ValueError: Unknown observation3.2 构造示例运行带机器人的 lt_chasm文档给出了一个直接可运行的示例以RGBD带深度的玩家视角为观测将分辨率设为 640×480并通过botCount关卡选项注入 2 个机器人import deepmind_lab observations [RGBD] env deepmind_lab.Lab(lt_chasm, observations, config{width: 640, # screen size, in pixels height: 480, # screen size, in pixels botCount: 2}, # lt_chasm option. rendererhardware) # select renderer. env.reset()其中botCount属于关卡自有选项它不会被引擎当作保留配置处理而是被透传给关卡脚本的 init 函数。lt_chasm关卡在 game_scripts/levels/lt_chasm.lua 中通过factories.lasertag.factory创建而该工厂在 game_scripts/factories/lasertag/factory.lua 中定义botCount的取值范围为[-1, 6]-1表示全部机器人并断言必须提供该参数。也就是说关卡脚本可以自由声明自己的配置项Python 侧只需把它们放进config字典即可。4.config配置项详解引擎在 engine/code/deepmind/dmlab_connect.c 的dmlab_setting函数中对保留配置逐项解析下表综合了文档与源码配置项说明默认值width观测帧的水平分辨率320height观测帧的垂直分辨率240fps每秒帧数60levelDirectory关卡目录的路径相对路径以game_scripts/levels为基准appendCommand追加到内部 Quake 控制台的命令串mixerSeed与环境收到的每个种子混合的值用于划分子种子集合0未在上述保留项列表中的配置项会通过hooks.add_setting继续传递给关卡层的 init 函数在 Lua 侧对应api:init中的kwargs.opts另见 Lua map API 文档对 command line 的说明。botCount正是这一透传机制的典型案例。从源码实现可以补充以下细节width/height必须是 4 的正整数倍。dmlab_setting中显式校验v 4 || v % 4 ! 0时会报错engine/code/deepmind/dmlab_connect.cfps与引擎时间换算引擎时间按毫秒整数递增无法精确表示 60fps 这类常见倒数因此引入外部时间概念engine_frame_period_msec round(0.96 * 1000 / fps)。120/60/30/20/15 fps 分别对应每帧 8/16/32/48/64 引擎毫秒engine/code/deepmind/dmlab_connect.cmixerSeed必须是[0, 2^32)内的整数越界会触发Invalid mixerSeed value错误engine/code/deepmind/dmlab_connect.cappendCommand直接拼接进引擎启动命令行engine/code/deepmind/dmlab_connect.c可用于注入任何 ioquake3 控制台变量例如set r_gpuDeviceIndex之类的渲染或调试参数。random_agent.py还展示了另一些透传/扩展配置的实际写法record录制 demo 文件、demo回放 demo、demofilesdemo 文件目录、video将 demo 录制成视频它们都作为可选config键传入python/random_agent.py。5. 渲染器选择与 Bazel 图形实现Python 侧的renderer参数必须与 Bazel 构建时的--define graphicsoption配合。三个选项如下5.1--define graphicsosmesa_or_egl默认若未指定任何 define构建默认采用此配置见 BUILD 中config_setting与select的默认分支。renderersoftware使用 OSMesa离屏软件渲染rendererhardware使用 EGL硬件加速渲染。5.2--define graphicsosmesa_or_glxrenderersoftware使用 OSMesarendererhardware使用 GLX。5.3--define graphicssdl渲染到原生窗口。此时observations中必须包含一个以RGB开头的观测例如RGB或RGB_INTERLEAVED否则游戏无法正确渲染。对应地仓库 BUILD 中将图形实现编译进libdmlab_headless_hw.so硬件路径按 define 选择 EGL 或 GLX与libdmlab_headless_sw.soOSMesa 软件路径SDL 则直接链接game_lib_sdlBUILD。random_agent_simple.py默认在 80×80 分辨率下用默认软件渲染器运行适合无显示环境下的快速验证。6.Lab对象方法逐一解析6.1reset(episode-1, seedNone)将环境重置到初始状态。新回合必须在上个回合结束后环境进入is_running() False调用此方法。episode可选整数指定加载特定回合的关卡缺省或为负时按数值顺序依次加载。传入非负值时 Python 层记录该回合号并传给引擎python/dmlab_module.cseed可选整数用于给环境的随机数生成器播种缺省或为None时使用rand()生成的随机种子。非整数会抛出ValueError: seed must be int or Nonepython/dmlab_module.ctestReset用例对此做了回归验证mixerSeed构造环境时提供的mixerSeed会与每次传给reset的种子混合。对每个不同的mixerSeed值产生的种子集合是[0, 2^64)整数域的独特子集但注意这些子集对应的随机序列并不保证互不相交。回合计数会在每次reset成功后自增python/dmlab_module.c。6.2num_steps()返回自上次reset()以来经过的帧数。底层通过LabObject.num_steps维护python/dmlab_module.c。6.3is_running()返回环境是否处于运行状态在ENV_STATUS_INITIALIZED与运行态返回True否则Falsepython/dmlab_module.c。回合结束后、调用reset之前应使用它判断是否继续step——random_agent_simple.py的循环就是if not env.is_running(): env.reset()的标准模式。6.4step(action, num_steps1)让环境前进num_steps帧每一帧都执行给定的action。action必须是np.intc类型的 Numpy 数组维度与取值必须符合action_spec()的约定否则行为未定义返回本次推进累积的即时奖励float参考示例通常写作reward env.step(action, num_steps1)关闭后的环境调用step会抛出RuntimeError: wrong status to advance见 python/tests/dmlab_module_test.py 的testRunClosed。6.5observation_spec()返回 DeepMind Lab 支持的全部观测规格列表含关卡自定义观测每项是一个包含name、dtype、shape的字典import pprint env deepmind_lab.Lab(tests/empty_room_test, []) observation_spec env.observation_spec() pprint.pprint(observation_spec) # 输出节选 [{dtype: type numpy.uint8, name: RGB_INTERLEAVED, shape: (180, 320, 3)}, {dtype: type numpy.uint8, name: RGBD_INTERLEAVED, shape: (180, 320, 4)}, {dtype: type numpy.uint8, name: RGB, shape: (3, 180, 320)}, {dtype: type numpy.uint8, name: RGBD, shape: (4, 180, 320)}, {dtype: type numpy.float64, name: MAP_FRAME_NUMBER, shape: (1,)}, {dtype: type numpy.float64, name: VEL.TRANS, shape: (3,)}, {dtype: type numpy.float64, name: VEL.ROT, shape: (3,)}, {dtype: type str, name: INSTR, shape: ()}, {dtype: type numpy.float64, name: DEBUG.POS.TRANS, shape: (3,)}, # etc... ]单个规格项的结构说明{ name: RGB_INTERLEAVED, ## 观测名。 dtype: type numpy.uint8, ## 数组数据类型。 shape: (180, 320, 3) ## 数组形状 (Height, Width, Colors)。 }若dtype为type str则返回字符串而非数组如INSTR若某个维度在运行时才能确定动态维度该维度记为0若秩rank未知则shape为空元组。观测的完整清单与语义包括RGB_INTERLEAVED/RGBD_INTERLEAVED/RGB/RGBD/BGR_*/VEL.*/DEBUG.*/INSTR/TEAM.SCORE以及调试相机与服务器侧观测可参考 docs/users/observations.md。一个实用要点优先选用RGB_INTERLEAVED它比 planar平面布局所需的处理更少、速度略快。6.6events()返回自上次reset()或step()以来发生的事件列表每个事件为(名称, 观测列表)元组。事件的消费是一次性的调用后事件队列清空。testEvents用例展示了事件与回合的生命周期reset后立刻有 4 个事件连续step期间事件为空回合结束帧会出现(LOG, [Episode ended])再次reset后重新产生回合事件python/tests/dmlab_module_test.py。6.7fps()一个建议性指标将离散的环境步帧与真实墙钟时间关联返回每秒真实帧数。它不改变环境语义仅用于性能观测。6.8action_spec()返回step()期望的动作规格列表每项为{name, min, max}env deepmind_lab.Lab(tests/empty_room_test, []) action_spec env.action_spec() pprint.pprint(action_spec) # 输出 # [{max: 512, min: -512, name: LOOK_LEFT_RIGHT_PIXELS_PER_FRAME}, # {max: 512, min: -512, name: LOOK_DOWN_UP_PIXELS_PER_FRAME}, # {max: 1, min: -1, name: STRAFE_LEFT_RIGHT}, # {max: 1, min: -1, name: MOVE_BACK_FORWARD}, # {max: 1, min: 0, name: FIRE}, # {max: 1, min: 0, name: JUMP}, # {max: 1, min: 0, name: CROUCH}]这些动作的名称与取值范围在引擎侧被硬编码为kActionNames/kMaxLookAngularVelocity 512engine/code/deepmind/dmlab_connect.c。完整的动作语义含可选的SELECT_GADGET/SWITCH_GADGET及其开关标志参见 docs/users/actions.md。需要注意look 类动作的单位是像素按 640×48060fps 的鼠标移动估算约 57 对应每秒 360° 旋转。random_agent_simple.py展示了不依赖硬编码维度的通用做法action np.zeros([len(action_spec)], dtypenp.intc)再按规格的min/max在单个动作维度上随机取值python/random_agent_simple.pyrandom_agent.py的DiscretizedRandomAgent则把 11 个离散动作look/strafe/forward/fire/jump/crouch硬编码为 7 维np.intc数组python/random_agent.py。6.9observations()返回一个字典键为构造时传入的每个观测名值为对应 Numpy 数组env deepmind_lab.Lab(tests/empty_room_test, [RGBD]) env.reset() obs env.observations() obs[RGBD].dtype # dtype(int64)注意测试用例中的实际断言RGBD的shape会随width/height配置变化——例如config{width: 80, height: 80}时形状为(4, 80, 80)lt_chasm默认配置下RGB_INTERLEAVED为(240, 320, 3)python/tests/dmlab_module_test.py。文档中dtype(int64)的打印在较新环境中通常表现为dtype(uint8)两种都属正常取决于运行环境。6.10close()关闭环境并释放底层 Quake III Arena 实例。关闭后仅允许调用is_running()step与observations都会抛出RuntimeError错误消息分别含wrong status to advance与wrong status。testOpenClose用例验证了可连续创建并关闭多个环境python/tests/dmlab_module_test.py。7. Level Cache为动态关卡加速7.1 动机与协议关卡缓存是可选的level_cache参数它允许复用已经见过的关卡而无需重新编译。对于每回合都要重新生成新地图的关卡如explore_goal_locations_small缓存可以显著改善性能。缓存对象必须实现两个方法bool fetch(self, key, pk3_path)若key在缓存中找到则返回True且必须把缓存的关卡复制到pk3_path否则返回Falsewrite(self, key, pk3_path)需要缓存的关卡位于pk3_path将其写入缓存以key为索引。7.2 文件型缓存实现示例文档给出了可直接复用的文件级缓存实现import os.path import shutil class LevelCache(object): def __init__(self, cache_dir): self._cache_dir cache_dir def fetch(self, key, pk3_path): path os.path.join(self._cache_dir, key) if os.path.isfile(path): # Copy the cached file to the path expected by DeepMind Lab. shutil.copyfile(path, pk3_path) return True return False def write(self, key, pk3_path): path os.path.join(self._cache_dir, key) if not os.path.isfile(path): # Copy the cached file DeepMind Lab has written to the cache directory. shutil.copyfile(pk3_path, path)7.3 缓存协议的正确性验证缓存对象的接口是强契约缺失方法会直接导致运行时错误。python/tests/level_cache_test.py 验证了只实现fetch而缺少write在reset后执行step时抛出AttributeError: write只实现write而缺少fetch抛出AttributeError: fetchfetch参数个数不符同样会报错。因此自定义缓存时务必同时实现两个方法并保持签名一致。缓存路径的语义在 C 层由 public/level_cache_types.h 中的DeepMindLabLevelCacheParams描述fetch_level_from_cache与write_level_to_cache均为线程安全函数且支持向多个缓存路径读写——这为跨进程共享编译产物提供了扩展空间。8. 组装一个完整的 agent 循环综合前述 API一个最小但完整的训练/评估循环如下参考 python/random_agent_simple.py 并加入缓存与确定性控制import numpy as np import deepmind_lab observations [RGB_INTERLEAVED] config {width: 96, height: 72, fps: 60} env deepmind_lab.Lab( contributed/dmlab30/explore_goal_locations_small, observations, configconfig, level_cacheLevelCache(/tmp/dmlab_level_cache)) # 复用上面第 7.2 节的类。 env.reset(episode1, seed123) # 指定种子保证可复现见 determinism 测试约定。 total_reward 0 for _ in range(1000): if not env.is_running(): env.reset(seed123) # 回合结束重开一局。 action np.zeros((len(env.action_spec()),), dtypenp.intc) total_reward env.step(action, num_steps1) print(Total reward:, total_reward) env.close()关键点总结确定性实验reset(episode1, seed123)固定回合与种子配合mixerSeed可为不同实验划分种子子集测试代码中大量采用这一模式例如 python/tests/determinism_test.py动态关卡每回合生成新地图的关卡务必接入level_cache否则重复编译会成为性能瓶颈渲染选择无显示环境用默认renderersoftwareOSMesa即可需要硬件加速时按第 5 节选择 EGL/GLX 构建需要可视化窗口时选用 SDL 构建并要求RGB*观测。9. 进阶入口dm_env 兼容包装若你的研究栈基于 DeepMind 的dm_envAPIdm_env.Environment协议仓库还提供了 python/dmenv_module.py 包装层它将deepmind_lab.Lab适配为dm_env风格action_spec()/observation_spec()返回dm_env.specs.BoundedArray/Arrayreset()返回dm_env.restart(...)step()根据is_running()返回transition或termination。这为需要在 dm_env 生态中训练的研究者提供了直接的桥接方案该包装器明确不支持动态形状观测shape中含0时会抛NotImplementedError。结语从模块级 runfiles 路径管理到Lab的构造与配置、渲染器选型、观测/动作规格、种子与回合控制再到 Level Cache 协议本文完整覆盖了 docs/users/python_api.md 的核心内容并以 python/dmlab_module.c、engine/code/deepmind/dmlab_connect.c 与 python/tests 下的测试为佐证。对于任何需要在可定制 3D 环境中训练或评估智能体的研究者这套 API 既是环境入口也是深入底层 Quake III 引擎机制的桥梁。赞分享人工智能强化学习机器学习【免费下载链接】labA customisable 3D platform for agent-based AI research项目地址https://gitcode.com/gh_mirrors/la/lab点击查看免费下载相关推荐开发者必看dlite-v1-355m的Pipeline架构与自定义扩展方法开发者必看dlite v1 355m的Pipeline架构与自定义扩展方法 dlite v1 355m是一款轻量级AI模型其核心Pipeline架构为开发者Lucky 公网访问部署教程5 种方式安装并配置端口转发、DDNS 与反向代理Lucky 公网访问部署教程5 种方式安装并配置端口转发、DDNS 与反向代理 这篇文章是一份面向没有网络基础读者的 Lucky 公网访问部署教程从安装到打后端网络通信DeepMind Lab环境搭建与基础使用指南DeepMind Lab环境搭建与基础使用指南 本文详细介绍了DeepMind Lab环境的完整搭建流程和使用指南涵盖了系统要求与依赖库安装、Bazel构建系人工智能强化学习机器学习上一篇Dex文件损坏了怎么办DexRepair助你快速修复Android应用下一篇15分钟上手AristojQuery UI主题界的优雅革命创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表