conda + openai-gym + 核显 报错:libGL error: MESA-LOADER: failed to open iris

最近在学习 openai-gym,参考的这篇文章:Getting Started With OpenAI Gym: The Basic Building Blocks

我的系统配置是

  • 笔记本:LG Gram 16 2021 (只有 i5-1135G7 的核显,没有独显)
  • Ubuntu 22.04 LTS
  • conda

在运行脚本里的这一行时报错:

env.render(mode='human')


ibGL error: MESA-LOADER: failed to open iris: /usr/lib/dri/iris_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: iris
libGL error: MESA-LOADER: failed to open iris: /usr/lib/dri/iris_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: iris
libGL error: MESA-LOADER: failed to open swrast: /usr/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: swrast
Traceback (most recent call last):
  File "cartpole.py", line 12, in <module>
    env.render(mode='human')
  File "/home/chenxiyuan/miniconda3/envs/gym/lib/python3.7/site-packages/gym/core.py", line 295, in render
    return self.env.render(mode, **kwargs)
  File "/home/chenxiyuan/miniconda3/envs/gym/lib/python3.7/site-packages/gym/envs/classic_control/cartpole.py", line 179, in render
    from gym.envs.classic_control import rendering
  File "/home/chenxiyuan/miniconda3/envs/gym/lib/python3.7/site-packages/gym/envs/classic_control/rendering.py", line 27, in <module>
    from pyglet.gl import *
  File "/home/chenxiyuan/miniconda3/envs/gym/lib/python3.7/site-packages/pyglet/gl/__init__.py", line 232, in <module>
    import pyglet.window
  File "/home/chenxiyuan/miniconda3/envs/gym/lib/python3.7/site-packages/pyglet/window/__init__.py", line 1899, in <module>
    gl._create_shadow_window()
  File "/home/chenxiyuan/miniconda3/envs/gym/lib/python3.7/site-packages/pyglet/gl/__init__.py", line 206, in _create_shadow_window
    _shadow_window = Window(width=1, height=1, visible=False)
  File "/home/chenxiyuan/miniconda3/envs/gym/lib/python3.7/site-packages/pyglet/window/xlib/__init__.py", line 173, in __init__
    super(XlibWindow, self).__init__(*args, **kwargs)
  File "/home/chenxiyuan/miniconda3/envs/gym/lib/python3.7/site-packages/pyglet/window/__init__.py", line 606, in __init__
    context = config.create_context(gl.current_context)
  File "/home/chenxiyuan/miniconda3/envs/gym/lib/python3.7/site-packages/pyglet/gl/xlib.py", line 204, in create_context
    return XlibContextARB(self, share)
  File "/home/chenxiyuan/miniconda3/envs/gym/lib/python3.7/site-packages/pyglet/gl/xlib.py", line 314, in __init__
    super(XlibContext13, self).__init__(config, share)
  File "/home/chenxiyuan/miniconda3/envs/gym/lib/python3.7/site-packages/pyglet/gl/xlib.py", line 218, in __init__
    raise gl.ContextException('Could not create GL context')
pyglet.gl.ContextException: Could not create GL context

报错显示找不到 iris 驱动,但其实在 /usr/lib/x86_64-linux-gnu/dri/iris_dri.so 是有 iris 驱动的,不知道为什么没有找到。简单的 work-around 是建立一个 /usr/lib/dri/iris_dri.so 的软连接:

(base) chenxiyuan@chenxiyuan-LGgram16:/usr/lib$ sudo mkdir dri
[sudo] password for chenxiyuan: 
(base) chenxiyuan@chenxiyuan-LGgram16:/usr/lib$ cd dri 
(base) chenxiyuan@chenxiyuan-LGgram16:/usr/lib/dri$ sudo ln -s /usr/lib/x86_64-linux-gnu/dri/iris_dri.so iris_dri.so


这里运行脚本报了另一个错:

(gym) chenxiyuan@chenxiyuan-LGgram16:~/Projects/RLtoy$ python cartpole.py 
libGL error: MESA-LOADER: failed to open iris: /home/chenxiyuan/miniconda3/envs/gym/lib/python3.7/site-packages/matplotlib/../../../libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /lib/x86_64-linux-gnu/libLLVM-14.so.1) (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: iris
libGL error: MESA-LOADER: failed to open iris: /home/chenxiyuan/miniconda3/envs/gym/lib/python3.7/site-packages/matplotlib/../../../libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /lib/x86_64-linux-gnu/libLLVM-14.so.1) (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: iris
libGL error: MESA-LOADER: failed to open swrast: /usr/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)

这里是因为 conda 里的 libstdcxx-ng 版本不够高:

(gym) chenxiyuan@chenxiyuan-LGgram16:~/Projects/RLtoy$ strings ~/miniconda3/envs/gym/lib/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_3.4.29

升级 conda 里的 libstdcxx-ng:

(gym) chenxiyuan@chenxiyuan-LGgram16:~/Projects/RLtoy$ conda install libstdcxx-ng=12.1.0
(gym) chenxiyuan@chenxiyuan-LGgram16:~/Projects/RLtoy$ strings ~/miniconda3/envs/gym/lib/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_3.4.29
GLIBCXX_3.4.30

编辑于 2022-07-07 23:21