运行Constrained OptiDice代码时导入py_client.so遇未定义符号错误求助
运行Constrained OptiDice代码时出现Courier库符号未定义错误
问题详情
- 为研究需求运行Google DeepMind的Constrained OptiDice代码,按要求安装依赖后执行
neural/run_experiments时触发错误:envs/cop/lib/python3.7/site-packages/courier/python/py_client.so: undefined symbol:_ZN4absl12lts_2021110214ascii_internal13kPropertyBitsE - 错误触发代码行:
from courier.python import py_client(其中courier/python为目录,py_client是编译生成的.so文件) - 已测试Ubuntu 20.04、22.04系统,更换过不同版本gcc、g++,均未解决;推测为C封装.so文件的符号版本冲突问题
- 环境配置:Ubuntu 22.04 + Miniconda3 + Python 3.7.16,错误源自
dm-launchpad-nightly库 - 可参考错误发生目录的内容截图
解决方案
1. 统一Abseil库版本
该错误核心是py_client.so编译依赖的Abseil(absl)版本与当前环境安装版本不匹配,符号中的lts_20211102标识对应Abseil LTS 20211102版本,需对齐版本:
- 卸载现有absl-py:
pip uninstall -y absl-py - 安装匹配版本的absl-py:
(注:absl-py 1.0.0对应Abseil C++ LTS 20211102版本,可匹配目标符号)pip install absl-py==1.0.0
2. 从源码编译Courier库
若版本对齐无效,需重新编译Courier库以适配当前环境的依赖:
- 克隆Courier源码:
git clone https://github.com/deepmind/courier.git - 进入目录并编译安装:
编译过程会自动链接当前环境的Abseil库,彻底解决符号不匹配问题。cd courier pip install -e .
3. 替换dm-launchpad版本
dm-launchpad-nightly可能自带不兼容的Courier/Abseil依赖,可更换为稳定版:
- 卸载nightly版本:
pip uninstall -y dm-launchpad-nightly - 安装稳定版dm-launchpad:
稳定版依赖经过兼容性测试,冲突概率更低。pip install dm-launchpad
4. 创建全新conda环境隔离依赖
旧环境依赖混乱可能导致隐性冲突,全新环境可彻底隔离问题:
conda create -n constrained_optidice python=3.7.16 conda activate constrained_optidice # 重新安装项目依赖 pip install -r requirements.txt # 按需安装launchpad版本 pip install dm-launchpad-nightly
内容的提问来源于stack exchange,提问作者Minjae Cho
相关产品推荐
相关产品推荐

