【Mujuco】WSL2安装Mujoco用于python,遇到FatalError,以及图形驱动架构

尝试在wsl2中安装mujoco,并使用python时,渲染遇到了问题,记录一下。

安装Mujoco

本来以为需要正常安装,即:

  • 官网下载对应安装包,放到 ~
  • 解压命令:
    tar -xf mujoco-3.1.5-linux-x86_64.tar.gz -C ~/.mujoco

但其实这一步并不必要,倘若使用python,直接在环境中pip安装即可:

  • pip install mujoco

官网有说明 https://mujoco.readthedocs.io/en/stable/python.html

A copy of the MuJoCo library is provided as part of the package and does not need to be downloaded or installed separately.

并且有给出python mujoco的教程:https://colab.research.google.com/github/google-deepmind/mujoco/blob/main/python/tutorial.ipynb#scrollTo=Xqo7pyX-n72M

渲染遇到FatalError问题

在使用render,对模型进行渲染时,反复遇到问题: mujoco.FatalError: gladLoadGL error,因此无法渲染

没有具体显示是什么问题,一直以为是需要按照教程中的第一个代码块一样,去配置MUJOCO_GL,将它设置为 egl,osmesa 等其他后端

# Add an ICD config so that glvnd can pick up the Nvidia EGL driver.
# This is usually installed as part of an Nvidia driver package, but the Colab
# kernel doesn't install its driver via APT, and as a result the ICD is missing.
# (https://github.com/NVIDIA/libglvnd/blob/master/src/EGL/icd_enumeration.md)
NVIDIA_ICD_CONFIG_PATH = '/usr/share/glvnd/egl_vendor.d/10_nvidia.json'
if not os.path.exists(NVIDIA_ICD_CONFIG_PATH):
  with open(NVIDIA_ICD_CONFIG_PATH, 'w') as f:
    f.write("""{
    "file_format_version" : "1.0.0",
    "ICD" : {
        "library_path" : "libEGL_nvidia.so.0"
    }
}
""")

# Configure MuJoCo to use the EGL rendering backend (requires GPU)
print('Setting environment variable to use GPU rendering:')
%env MUJOCO_GL=egl

另外,这里我也一直搞不清楚 opengl, egl, osmesa, mesa 等概念之间的关联和区别,在此迷惑了一整个下午,一直在尝试配置 MUJOCO_GL=EGLMUJOCO_GL=OSMESA,安装相关的库。失败。看过一些链接,但还是不是很懂:

  • https://blog.csdn.net/shenjunpeng/article/details/127921189
  • https://guolongji.xyz/post/mesa-introduction/
  • https://pytorch.org/rl/stable/reference/generated/knowledge_base/MUJOCO_INSTALLATION.html

最终,重装了wsl系统。按照python教程,从头一步步尝试。在执行python -m mujoco.viewer时,得到其他关键报错,libGL error: MESA-LOADER: failed to open swrast: /usr/lib/dri/swrast_dri.so:.

顺藤摸瓜,找到相关论坛

  • https://stackoverflow.com/questions/71010343/cannot-load-swrast-and-iris-drivers-in-fedora-35/72200748#72200748 (最关键的)
  • https://forum.manjaro.org/t/libgl-error-mesa-loader/69746
  • https://stackoverflow.com/questions/72110384/libgl-error-mesa-loader-failed-to-open-iris

这几个帖子看了好多次,都以为和我问题无关,毕竟没有一个和mujoco/wsl有关,都是关于我完全不了解的软件,例如manjaro。最后,走投无路时,按照论坛尝试了一下
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6

居然意外地成功了,笑死我了。

问题似乎是出在Anaconda上,它内部的libstdc++.so动态库似乎有问题,与系统驱动无法连接,但即使链接失败也不会加载系统内的相同库。

上面的做法相当于提前将系统的libstdc++.so库链接加载,而不使用Anaconda的这个库。出于同样的原理,也有别的处理方法,如手动删除Anaconda中的libstdc++.so,再手动软连接Linux内的libstdc++.so. (https://forum.manjaro.org/t/libgl-error-mesa-loader/69746 这里面就是这么做的,Update 3)

花屏

解决了该问题后,发现重复render画图时,图像显示会花屏

于是尝试修改环境变量,令MUJOCO_GL=egl之后,成功解决该问题。我也不知道为什么,并且每次导入时还会有warning如下:
在这里插入图片描述
似乎其实并没有修改成功,还是在使用kms_swrast,是mesa框架中的。但是这样迂回一下,反而花屏的问题就解决了。神奇。

为方便,参考链接https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#set-env-vars 创建改环境变量,并固定在当前环境中:

  • conda env config vars set MUJOCO_GL=egl
  • conda env config vars list LD_PRELOAD = /usr/lib/x86_64-linux-gnu/libstdc++.so.6

到此,终于完成配置,耗时大半天

架构:图形驱动、渲染

后来花了一点时间了解这方面的知识,放一些有用的链接:

  • https://en.wikipedia.org/wiki/EGL_(API)
  • https://en.wikipedia.org/wiki/User_space_and_kernel_space
  • https://www.mesa3d.org/

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

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值