Bootstrap

Win11+WSL2+Ubuntu24.04安装Genesis并实现正常运行

什么是Genesis

Genesis是一款由卡内基梅隆大学、马里兰大学、斯坦福大学、麻省理工学院等全球顶尖研究机构联合开发的开源生成式物理引擎。于2024年12月19日正式开源。它专为机器人、嵌入式 AI 和物理 AI 应用设计,能够模拟各种物理现象(如刚体、液体、软体等),并通过自然语言描述生成交互式 3D 场景、机器人策略和面部动画。

主要特点:
  • 高速仿真:比现实世界快约 430,000 倍,比 NVIDIA Isaac Gym 快 80 倍。
  • 多物理现象支持:整合了多种物理求解器(如 MPM、SPH、FEM、PBD 等),支持刚体、液体、气体、软体等复杂物理现象的仿真。
  • 生成式数据引擎:通过自然语言生成多模态数据(如 3D 场景、视频、机器人策略等),降低人工数据收集成本。
  • 跨平台兼容性:支持 Linux、MacOS、Windows 等操作系统,兼容 CPU、Nvidia GPU、AMD GPU 等多种硬件。
  • 应用场景:包括机器人研发、虚拟世界构建、科学研究、医疗仿真等。
技术原理:
  • 通用物理引擎:从头构建,集成多种物理求解器,实现精确模拟。
  • 可微分仿真:支持可微分模拟,便于与机器学习算法结合。
  • 高性能渲染:内置光线追踪引擎,生成高保真视觉效果。

为什么需要WSL2

Genesis目前尚未支持Windows系统的图形渲染功能,导致用户无法在Windows平台上直接使用图形化界面进行操作。这对于未安装独立Linux系统的用户造成了诸多不便。为解决这一问题,用户可以通过Windows Subsystem for Linux 2(WSL2)在Windows系统中运行Genesis。

WSL2是微软开发的Windows子系统,它允许用户在Windows环境中直接运行Linux发行版,并提供了接近原生Linux的性能和完整的系统调用兼容性。通过WSL2,用户无需双系统切换或虚拟机配置,即可在Windows系统中无缝运行Genesis,同时还能访问Windows文件系统,实现跨平台数据交互。这种解决方案既保留了Windows系统的便利性,又能够充分利用Genesis的功能特性,为用户提供了高效便捷的开发环境。

关于WSL2详细内容请参阅微软的官方文档


安装

配置清华镜像源

请参考清华镜像站使用帮助
教程非常详细,十分推荐看一下
ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

pypi | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

安装genesis

🛠️ 安装 — Genesis 0.2.0 文档
只需要命令行输入下面的指令执行就可以了

pip install genesis-world

解决bug(重点)

github的issues内有非常详细的解决方案

Win10-WSL2-PROBLEMS · Issue #43 · Genesis-Embodied-AI/Genesis

问题列表

原文链接

  1. 【已解决】pyglet.gl.ContextException: Could not create GL context
  2. 【OPEN】OpenGL.error.Error: OpenGL.error.Error: Attempt to retrieve context when no valid context

以下为原文

【已解决】问题 1 pyglet.gl.ContextException:Could not create GL context

当我完成conda虚拟环境(pytorch和genesis)的设置并开始运行hello_genesis.py时,我遇到了以下错误消息:

(genesis) root@L6o0:~/Genesis# /home/circlemoon/miniconda3/envs/genesis/bin/python /home/circlemoon/Genesis/examples/tutorials/hello_genesis.py
[Genesis] [17:20:39] [INFO] ╭─────────────────────────────────────────────────────────────────────────────────────╮
[Genesis] [17:20:39] [INFO] │┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉ Genesis ┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉┈┉│
[Genesis] [17:20:39] [INFO] ╰─────────────────────────────────────────────────────────────────────────────────────╯
[Genesis] [17:20:39] [INFO] Running on [AMD Ryzen 5 7500F 6-Core Processor] with backend gs.cpu. Device memory: 15.44 GB.
[Genesis] [17:20:39] [INFO] 🚀 Genesis initialized. 🔖 version: 0.2.0, 🌱 seed: None, 📏 precision: '32', 🐛 debug: False, 🎨 theme: 'dark'.
[Genesis] [17:20:40] [INFO] Scene <5708222> created.
[Genesis] [17:20:40] [INFO] Adding <gs.RigidEntity>. idx: 0, uid: <1535f0f>, morph: <gs.morphs.Plane>, material: <gs.materials.Rigid>.
[Genesis] [17:20:40] [INFO] Preprocessing geom idx 0.
[Genesis] [17:20:40] [INFO] Adding <gs.RigidEntity>. idx: 1, uid: <0c70d30>, morph: <gs.morphs.MJCF(file='/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/genesis/assets/xml/franka_emika_panda/panda.xml')>, material: <gs.materials.Rigid>.
[Genesis] [17:20:40] [INFO] Preprocessing geom idx 1.
[Genesis] [17:20:40] [INFO] Preprocessing geom idx 2.
[Genesis] [17:20:41] [INFO] Preprocessing geom idx 3.
[Genesis] [17:20:41] [INFO] Preprocessing geom idx 4.
[Genesis] [17:20:42] [INFO] Preprocessing geom idx 5.
[Genesis] [17:20:42] [INFO] Preprocessing geom idx 6.
[Genesis] [17:20:43] [INFO] Preprocessing geom idx 7.
[Genesis] [17:20:43] [INFO] Preprocessing geom idx 8.
[Genesis] [17:20:43] [INFO] Preprocessing geom idx 9.
[Genesis] [17:20:43] [INFO] Preprocessing geom idx 10.
[Genesis] [17:20:43] [INFO] Preprocessing geom idx 11.
[Genesis] [17:20:43] [INFO] Preprocessing geom idx 12.
[Genesis] [17:20:43] [INFO] Preprocessing geom idx 13.
[Genesis] [17:20:43] [INFO] Preprocessing geom idx 14.
[Genesis] [17:20:43] [INFO] Preprocessing geom idx 16.
[Genesis] [17:20:43] [INFO] Building scene <5708222>...
[Genesis] [17:20:51] [INFO] Compiling simulation kernels...
[Genesis] [17:21:14] [INFO] Building visualizer...
Exception in thread Thread-3 (_init_and_start_app):
Traceback (most recent call last):
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/threading.py", line 1075, in _bootstrap_inner
    self.run()
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/threading.py", line 1012, in run
    self._target(*self._args, **self._kwargs)
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/genesis/ext/pyrender/viewer.py", line 1126, in _init_and_start_app
    super(Viewer, self).__init__(
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/pyglet/window/xlib/__init__.py", line 168, in __init__
    super().__init__(*args, **kwargs)
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/pyglet/window/__init__.py", line 527, in __init__
    context = config.create_context(gl.current_context)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/pyglet/gl/xlib.py", line 114, in create_context
    return XlibContext(self, share)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/pyglet/gl/xlib.py", line 149, in __init__
    raise gl.ContextException(msg)
pyglet.gl.ContextException: Could not create GL context

我在 WSL 中找到了此错误的原因:

由于 NVida 驱动程序映射到 WSL2 限制OpenGL 的版本为 3.1(如果使用 GPU 硬件进行渲染)

AND pyglet 自 v2.0 起需要 OpenGL 3.3+
在这里插入图片描述

因此,解决方案是使用软件渲染 OpenGL(带 PREFIX:LIBGL_ALWAYS_SOFTWARE=1 python xxx.py

AND 为了启用软件渲染,您需要使用以下命令

sudo add-apt-repository ppa:kisak/kisak-mesa (or ppa:oibaf/graphics-drivers)
sudo apt update && sudo apt upgrade -y

参考资料:pyglet/pyglet#1047 (评论)

以下是差异:

  • GPU 渲染在这里插入图片描述

  • SOFTWARE 渲染在这里插入图片描述

【OPEN】OpenGL.error.Error: 在没有有效上下文时尝试检索上下文

但我遇到了另一个问题

虽然我渲染了一个 OpenGL 窗口,但内容是空的
在这里插入图片描述

下面是输出:

Exception in thread Thread-2 (_init_and_start_app):
Traceback (most recent call last):
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/threading.py", line 1075, in _bootstrap_inner
    self.run()
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/threading.py", line 1012, in run
    self._target(*self._args, **self._kwargs)
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/genesis/ext/pyrender/viewer.py", line 1149, in _init_and_start_app
    pyglet.clock.tick()
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/pyglet/clock.py", line 528, in tick
    return _default.tick(poll)
           ^^^^^^^^^^^^^^^^^^^
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/pyglet/clock.py", line 270, in tick
    self.call_scheduled_functions(delta_t)
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/pyglet/clock.py", line 217, in call_scheduled_functions
    item.func(now - item.last_ts, *item.args, **item.kwargs)
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/genesis/ext/pyrender/viewer.py", line 941, in _time_event
    self.on_draw()
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/genesis/ext/pyrender/viewer.py", line 640, in on_draw
    self._render()
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/genesis/ext/pyrender/viewer.py", line 1086, in _render
    retval = renderer.render(self.scene, flags, seg_node_map=seg_node_map)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/genesis/ext/pyrender/renderer.py", line 141, in render
    self._update_context(scene, flags)
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/genesis/ext/pyrender/renderer.py", line 899, in _update_context
    p._add_to_context()
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/genesis/ext/pyrender/primitive.py", line 359, in _add_to_context
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, FLOAT_SZ * 3, ctypes.c_void_p(0))
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/OpenGL/latebind.py", line 63, in __call__
    return self.wrapperFunction( self.baseFunction, *args, **named )
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/OpenGL/GL/VERSION/GL_2_0.py", line 469, in glVertexAttribPointer
    contextdata.setValue( key, array )
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/OpenGL/contextdata.py", line 58, in setValue
    context = getContext( context )
              ^^^^^^^^^^^^^^^^^^^^^
  File "/home/circlemoon/miniconda3/envs/genesis/lib/python3.12/site-packages/OpenGL/contextdata.py", line 40, in getContext
    raise error.Error(
OpenGL.error.Error: Attempt to retrieve context when no valid context

我是使用这个方法解决的,原文链接。具体如下

我自己解决了问题(windows 11、wsl2),只需升级 opengl,最新版本就可以是 4.5。
“OpenGL.error.Error:在没有有效上下文时尝试检索上下文”

sudo add-apt-repository ppa:kisak/kisak-mesa
sudo apt update
sudo apt upgrade

并使用直接渲染:

export LIBGL_ALWAYS_INDIRECT=0

现在使用命令检查您的 OpenGL 版本:

glxinfo -B

在这里插入图片描述
在这里插入图片描述

现在我可以看到这个场景,但它没有快速出现在屏幕上,我不知道为什么。

安装pytorch

PyTorch
点击官方链接,之后请根据自己需要选择的版本进行安装。
在这里插入图片描述

安装cuda

这个可能是我个人的问题,仅供参考
【CUDA】Ubuntu系统如何安装CUDA保姆级教程(2022年最新)_ubuntu安装cuda-CSDN博客

消除警告

以下为我利用AI解决问题的方案
在 WSL2 的 Ubuntu 24.04 中运行你的代码时,出现以下警告:

[W 12/31/24 09:31:01.044 9868] [cuda_driver.cpp:load_lib@36] libcuda.so lib not found.
[W 12/31/24 09:31:01.045 9868] [misc.py:adaptive_arch_select@758] Arch=[<Arch.cuda: 3>] is not supported, falling back to CPU

这表明 WSL2 无法找到 CUDA 驱动库 (libcuda.so),因此程序回退到 CPU 模式运行。以下是问题的原因和解决方法:


1. 问题原因

  • WSL2 的 CUDA 支持:WSL2 支持 CUDA,但需要正确安装 NVIDIA 驱动和 CUDA 工具包。
  • 缺少 libcuda.solibcuda.so 是 NVIDIA CUDA 驱动的核心库。如果未正确安装或配置,WSL2 将无法找到它。

2. 解决方法

步骤 1:确保 Windows 上安装了 NVIDIA 驱动
  1. 打开 Windows 设备管理器,检查是否有 NVIDIA 显卡,并确保已安装最新驱动。
  2. 下载并安装最新的 NVIDIA 驱动:
步骤 2:在 WSL2 中安装 CUDA 工具包
  1. 打开 WSL2 的 Ubuntu 终端。
  2. 添加 NVIDIA CUDA 仓库并安装 CUDA 工具包:
    wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.1-1_all.deb
    sudo dpkg -i cuda-keyring_1.1-1_all.deb
    sudo apt update
    sudo apt install cuda-toolkit
    
  3. 安装完成后,验证 CUDA 是否安装成功:
    nvcc --version
    
步骤 3:设置环境变量

确保 WSL2 正确加载 CUDA 驱动库。在 ~/.bashrc~/.zshrc 中添加以下内容:

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

然后运行以下命令使配置生效:

source ~/.bashrc
步骤 4:验证 libcuda.so 是否存在

检查 libcuda.so 是否已正确安装:

ls /usr/lib/wsl/lib/libcuda.so

如果文件存在,说明 CUDA 驱动已正确安装。

步骤 5:重新运行代码

重新运行你的代码,检查是否仍然出现警告:

import genesis as gs
gs.init(backend=gs.cuda)

scene = gs.Scene(show_viewer=True)
plane = scene.add_entity(gs.morphs.Plane())
franka = scene.add_entity(
    gs.morphs.MJCF(file='xml/franka_emika_panda/panda.xml'),
)

scene.build()

for i in range(1000):
    scene.step()

3. 注意事项

  • WSL2 的 CUDA 支持:WSL2 的 CUDA 支持需要 Windows 11 和 NVIDIA 驱动版本 470 或更高。
  • GPU 资源限制:WSL2 中的 CUDA 性能可能不如原生 Linux 系统,因为 WSL2 是虚拟机环境。
  • 回退到 CPU:如果问题仍然存在,程序会回退到 CPU 模式运行,但性能会显著下降。

4. 进一步调试

如果问题仍未解决,可以尝试以下方法:

  1. 检查 WSL2 的 CUDA 支持是否启用:
    nvidia-smi
    
    如果命令未找到或没有输出,说明 CUDA 未正确配置。
  2. 更新 WSL2 到最新版本:
    wsl --update
    
  3. 确保 WSL2 的 Linux 内核是最新的。

鉴于作者水平有限,本文可能存在不足之处,欢迎各位读者提出指导和建议,共同探讨、共同进步。

;