首页 > 解决方案 > 未定义符号:THPVariableClaload_textures.cpython-37m-x86_64-linux-gnu.so:未定义符号:THPVariableClass

问题描述

你知道我怎么能解决这个问题吗?我正在尝试使用https://github.com/benjiebob/SMALViewer/issues/3存储库,但是在神经渲染器端口上出现错误:

$ python smal_viewer.py 
Traceback (most recent call last):
  File "smal_viewer.py", line 2, in <module>
    import pyqt_viewer
  File "/home/mona/research/3danimals/SMALViewer/pyqt_viewer.py", line 13, in <module>
    from smal.smal3d_renderer import SMAL3DRenderer
  File "/home/mona/research/3danimals/SMALViewer/smal/smal3d_renderer.py", line 6, in <module>
    import neural_renderer as nr
  File "/home/mona/anaconda3/lib/python3.7/site-packages/neural_renderer/__init__.py", line 3, in <module>
    from .load_obj import load_obj
  File "/home/mona/anaconda3/lib/python3.7/site-packages/neural_renderer/load_obj.py", line 8, in <module>
    import neural_renderer.cuda.load_textures as load_textures_cuda
ImportError: /home/mona/anaconda3/lib/python3.7/site-packages/neural_renderer/cuda/load_textures.cpython-37m-x86_64-linux-gnu.so: undefined symbol: THPVariableClass

以下是一些细节:

$ python
Python 3.7.6 (default, Jan  8 2020, 19:59:22) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.__version__
'1.6.0'
>>> torch.version.cuda
'10.1'
>>> torch.cuda.is_available()
True


$ gcc --version
gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


$ lsb_release -a
LSB Version:    core-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.1 LTS
Release:    20.04
Codename:   focal

这是神经渲染器 git repo:https ://github.com/daniilidis-group/neural_renderer

我使用安装了神经渲染器pip install neural_renderer_pytorch

标签: pythonpytorchshared-librariescpython

解决方案


看起来你不是neural_renderer_pytorch自己建造的,而是用了一个轮子。但是,此轮子是使用旧pytorch版本构建的,不适pytorch用于您机器上的当前版本。

neural_renderer使用您当前的 pytorch-version从源代码构建(在neural_renderer您现在卸载后),即

$ pip uninstall neural-renderer-pytorch

$ pip install https://github.com/daniilidis-group/neural_renderer/zipball/master

它应该可以工作。


在 pytorch 1.5 之前,它使用某种脆弱的方式在 Linux 上构建扩展:尽管依赖于torch,但扩展并没有明确链接到libtorch.so. 提供缺少的符号只是因为import torch加载libtorch.soRTLD_GLOBAL,因此使其符号全局可见/可访问 - 这就是为什么在加载这些扩展之前(例如neural_renderer_pytorch这里必须导入的原因torch

可以在第一次RTLD_GLOBAL导入之前torch强制执行旧的行为设置:

import sys; import ctypes;
sys.setdlopenflags(sys.getdlopenflags() | ctypes.RTLD_GLOBAL)
import torch # now all symbols of torch
             # have global visibility and can be used in 
             # other extensions

但是,使用RTLD_GLOBAL是非常危险的,因为它可能会插入不相关的符号并导致细微的错误甚至崩溃。

因此,由于 1.5 pytorch 不再使用RTLD_GLOBAL,但明确链接libpytorch.so(请参阅此提交)和使用旧 pytorch 版本构建的扩展将不起作用。


推荐阅读