运行时加载的Python绑定和库

3npbholx  于 2023-06-20  发布在  Python
关注(0)|答案(1)|浏览(125)

Context

在Linux/Ubuntu上工作,Ubuntu 20和22,Python 3.6,3.8和3.10的行为相同。
onnxruntime是一个用于机器学习推理的C/C库,它可以使用多个“后端”(他们称之为“执行提供程序”)在不同的硬件上运行数字代码,并利用不同的低级Tensor数学框架。其中最受欢迎的是来自NVidia的着名CUDA。为了使用这样的CUDA后端,在运行时使用dlopenlibcudartlibcublas,...)加载几个CUDA库。只要一个人留在C/C域中,这就可以正常工作。但是,onnxruntime通常通过Python绑定使用,无论是通过官方Python发行版还是通过自定义绑定(就像我一样)。无论哪种方式,为了确保CUDA后端按照Python的预期工作,必须预先加载CUDA库,否则找不到。这是他们在官方绑定中的做法,我在自己的代码中做了一些非常相似的事情(我不能分享,抱歉)。

常见问题

  • 为什么在通过绑定使用onnxruntime时需要预加载,而在C++应用程序中使用时则不需要?在我的理解中,Python绑定本身就是一个在运行时加载的库。这是否会以某种方式影响从编译的python扩展本身进一步动态加载其他库?
  • RPATH/RUNPATH传播如何为Python绑定工作?我看到Python可执行文件没有设置它们中的任何一个,但是我们在绑定中设置了RUNPATHRUNPATH可以正确地用于链接的库,但对于在运行时加载的库似乎被忽略了。我认为这是预期的,如果不是因为我不 * 不 * 需要预先加载任何东西,当我使用onnxruntime直接从C++,所有其他事情保持不变。
  • 坚持我上面链接的公共示例代码,有没有替代这种相当粗糙的预加载方法的方法?
7d7tgy0s

7d7tgy0s1#

问题的关键是如何以一种优雅和稳健的方式处理这类问题。
1.您必须了解RPATHRUNPATHwork以及它们之间的difference
1.您必须检查所有相关二进制文件中的RPATH/RUNPATH值。
1.您可以通过设置LD_DEBUG=files,libs来查看链接器对库的搜索。

相关问题