🚀 并行仿真#

../../_images/parallel_sim.png

使用 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 倍。尽情享受吧!

../../_images/parallel_speed.png

Tip

FPS 日志记录: 默认情况下,Genesis 日志记录器会在终端中显示实时仿真速度。你可以在创建场景时通过设置 scene.profiling_options.show_FPS=False 来禁用此行为。