在WSL运行VizDoom与PyTorch程序时遭遇多进程锁错误
解决WSL环境下VizDoom运行的两个关键问题
先帮你拆解下遇到的两个核心错误,一步步来解决:
1. 处理Pulseaudio音频服务断言错误
日志里的Assertion 'pthread_mutex_unlock(&m->mutex) == 0' failed at pulsecore/mutex-posix.c:108是WSL老版本(比如你用的Ubuntu14)里的常见音频兼容问题——VizDoom启动时会尝试初始化音频,但WSL的音频服务在这类旧环境里稳定性很差。
最直接的解决方式是禁用VizDoom的音频输出,在环境初始化代码里添加配置:
import gym # 初始化环境时关闭音频 env = gym.make('ppaquette/DoomCorridor-v0') env.unwrapped.doom_config.set_audio_enabled(False) env.reset()
如果还是出现音频相关报错,可以在WSL终端先设置环境变量,强制调用Windows端的音频服务(前提是Windows已安装Pulseaudio):
export PULSE_SERVER=tcp:localhost:4713
2. 修复VizDoom多进程锁缺失问题
错误日志里已经给出了明确的解决方向,结合你的代码场景,推荐两种实操方案:
方法一:提前缓存单例锁(适合单进程训练)
在你的主代码(比如ai.py)最开头,先创建一个临时VizDoom环境并立即关闭,这样会在内存中缓存单例锁,后续正式环境初始化就不会报错:
import gym # 提前初始化临时环境,缓存多进程锁后关闭 temp_env = gym.make('ppaquette/DoomCorridor-v0') temp_env.unwrapped.doom_config.set_audio_enabled(False) # 同时禁用音频 temp_env.close() # 初始化正式训练环境 env = gym.make('ppaquette/DoomCorridor-v0') # 后续训练逻辑...
方法二:手动传递多进程锁(适合多进程训练)
如果你的代码用到了多进程并行训练,可以手动创建锁并传递给VizDoom配置:
import gym import multiprocessing # 创建多进程锁 lock = multiprocessing.Lock() env = gym.make('ppaquette/DoomCorridor-v0') env.unwrapped.doom_config.set_audio_enabled(False) env.unwrapped.configure(lock=lock) # 传递锁给环境 env.reset()
额外环境建议
你当前用的Ubuntu14和Python2.7都已停止官方维护,后续可能还会遇到更多兼容性问题。如果条件允许,建议升级到Ubuntu18.04+和Python3.6+,PyTorch和VizDoom对新版本的支持会更完善。
内容的提问来源于stack exchange,提问作者Abbas
相关产品推荐
相关产品推荐

