🚀 并行仿真#
使用 GPU 加速仿真的最大优势是能够实现场景级并行,从而可以在数千个环境中同时训练机器人。
在 Genesis 中,创建并行仿真就像你想象的那么简单:构建场景时,你只需添加一个额外的参数 n_envs 来告诉仿真器你想要多少个环境。就是这样。
注意,为了模仿学习文献中的命名约定,我们也将使用术语 batching 来表示并行化操作。
示例脚本:
import genesis as gs
import torch
########################## init ##########################
gs.init(backend=gs.gpu)
########################## create a scene ##########################
scene = gs.Scene(
show_viewer = True,
viewer_options = gs.options.ViewerOptions(
camera_pos = (3.5, -1.0, 2.5),
camera_lookat = (0.0, 0.0, 0.5),
camera_fov = 40,
),
rigid_options = gs.options.RigidOptions(
dt = 0.01,
),
)
########################## entities ##########################
plane = scene.add_entity(
gs.morphs.Plane(),
)
franka = scene.add_entity(
gs.morphs.MJCF(file='xml/franka_emika_panda/panda.xml'),
)
########################## build ##########################
# 创建 20 个并行环境
B = 20
scene.build(n_envs=B, env_spacing=(1.0, 1.0))
# 控制所有机器人
franka.control_dofs_position(
torch.tile(
torch.tensor([0, 0, 0, -1.0, 0, 1.0, 0, 0.02, 0.02], device=gs.device), (B, 1)
),
)
for i in range(1000):
scene.step()
上述脚本与你在你好,Genesis中看到的示例几乎相同,只是 scene.build() 现在附加了两个额外的参数:
n_envs:这指定了你想要创建的批量环境的数量env_spacing:生成的并行环境共享相同的状态。为了可视化目的,你可以指定此参数要求可视化器以网格形式分布所有环境,每个环境之间的距离为 (x, y) 米。注意这只影响可视化行为,不会改变每个环境中实体的实际位置。
控制批量环境中的机器人#
回想一下,我们在前面的教程中使用了 franka.control_dofs_position() 等 API。现在你可以使用完全相同的 API 来控制批量机器人,只是输入变量需要一个额外的批处理维度:
franka.control_dofs_position(torch.zeros(B, 9, device=gs.device))
由于我们在 GPU 上运行仿真,为了减少 CPU 和 GPU 之间的数据传输开销,我们可以使用通过 gs.device 选择的 torch 张量而不是 numpy 数组(但 numpy 数组也可以)。当你需要频繁发送具有巨大批量大小的张量时,这可以带来明显的性能提升。
上述调用将控制批量环境中的所有机器人。如果你只想控制一部分环境,你可以额外传入 envs_idx,但要确保 position 张量的批处理维度大小与 envs_idx 的长度匹配:
# 仅控制 3 个环境:1、5 和 7
franka.control_dofs_position(
position = torch.zeros(3, 9, device=gs.device),
envs_idx = torch.tensor([1, 5, 7], device=gs.device),
)
此调用只会向 3 个选定的环境发送零位置命令。
享受未来的速度!#
Genesis 支持多达数万个并行环境,并以此来解锁前所未有的仿真速度。现在,让我们关闭查看器,将批量大小更改为 30000(如果你的 GPU 显存相对较小,请考虑使用较小的值):
import torch
import genesis as gs
gs.init(backend=gs.gpu)
scene = gs.Scene(
show_viewer = False,
rigid_options = gs.options.RigidOptions(
dt = 0.01,
),
)
plane = scene.add_entity(
gs.morphs.Plane(),
)
franka = scene.add_entity(
gs.morphs.MJCF(file='xml/franka_emika_panda/panda.xml'),
)
scene.build(n_envs=30000)
# 控制所有机器人
franka.control_dofs_position(
torch.tile(
torch.tensor([0, 0, 0, -1.0, 0, 1.0, 0, 0.02, 0.02], device=gs.device), (30000, 1)
),
)
for i in range(1000):
scene.step()
在配备 RTX 4090 和 14900K 的台式机上运行上述脚本,你会获得未来感的仿真速度——超过4300 万帧每秒,这比实时快 430,000 倍。尽情享受吧!
Tip
FPS 日志记录: 默认情况下,Genesis 日志记录器会在终端中显示实时仿真速度。你可以在创建场景时通过设置 scene.profiling_options.show_FPS=False 来禁用此行为。