Context
在Linux/Ubuntu上工作,Ubuntu 20和22,Python 3.6,3.8和3.10的行为相同。onnxruntime
是一个用于机器学习推理的C/C库,它可以使用多个“后端”(他们称之为“执行提供程序”)在不同的硬件上运行数字代码,并利用不同的低级Tensor数学框架。其中最受欢迎的是来自NVidia的着名CUDA。为了使用这样的CUDA后端,在运行时使用dlopen
(libcudart
,libcublas
,...)加载几个CUDA库。只要一个人留在C/C域中,这就可以正常工作。但是,onnxruntime
通常通过Python绑定使用,无论是通过官方Python发行版还是通过自定义绑定(就像我一样)。无论哪种方式,为了确保CUDA后端按照Python的预期工作,必须预先加载CUDA库,否则找不到。这是他们在官方绑定中的做法,我在自己的代码中做了一些非常相似的事情(我不能分享,抱歉)。
常见问题
- 为什么在通过绑定使用
onnxruntime
时需要预加载,而在C++应用程序中使用时则不需要?在我的理解中,Python绑定本身就是一个在运行时加载的库。这是否会以某种方式影响从编译的python扩展本身进一步动态加载其他库? RPATH
/RUNPATH
传播如何为Python绑定工作?我看到Python可执行文件没有设置它们中的任何一个,但是我们在绑定中设置了RUNPATH
。RUNPATH
可以正确地用于链接的库,但对于在运行时加载的库似乎被忽略了。我认为这是预期的,如果不是因为我不 * 不 * 需要预先加载任何东西,当我使用onnxruntime
直接从C++,所有其他事情保持不变。- 坚持我上面链接的公共示例代码,有没有替代这种相当粗糙的预加载方法的方法?
1条答案
按热度按时间7d7tgy0s1#
问题的关键是如何以一种优雅和稳健的方式处理这类问题。
1.您必须了解
RPATH
和RUNPATH
work以及它们之间的difference。1.您必须检查所有相关二进制文件中的
RPATH
/RUNPATH
值。1.您可以通过设置
LD_DEBUG=files,libs
来查看链接器对库的搜索。