运行环境&版本:Linux,Python3.10,ray1.13.0
问题描述:
用pybind11打的cpp的.so,python中直接调用其class没有问题,作为worker actor的内置变量出了错,有大佬遇到过这个问题吗?
报错截图:
运行环境&版本:Linux,Python3.10,ray1.13.0
问题描述:
用pybind11打的cpp的.so,python中直接调用其class没有问题,作为worker actor的内置变量出了错,有大佬遇到过这个问题吗?
报错截图:
你好,欢迎加入Ray。
你贴出的信息比较少 所以暂时没法给出根因,但是基本的定位思路可以告诉一下你。
1、你现在的错误是 你创建了一个Actor:DelayCalulatorWorker. 然后这个Actor 在执行task的时候 因为你的pybind11::cpp_function::inttilize这函数内出现了 Segmentation Fault 导致Actor dead了。
根因还是你引用的 pybind11 这块 出的问题。 然后crash调用栈在你图片里也显示了。
解决思路:
你说你这个pybind11 如果是python中正常调用是正常。 结果上了ray 就出问题了。 排除思路如下:
1、你这个是单机跑的ray的么? 如果不是,你要你的集群里每个节点都是python环境都是和你正常调用pybind11的环境一样。确保pybind11 是装了,都有你编的libWrapper_OpenSta so 并且路径是对的。
2、pybind11 import你的so 肯定是对so的 存放路径有要求的 不然会加载不到之类的。 actor是一个独立的进程 你可以确认下你的so的路径是否有问题
3、你看下上面的crash调用栈 看下是你自己的代码 还是 pybind11的
感谢您的回复,使我聚焦在pybind11引用到空指针使Python报段错误上。由于用ray不久,我十分担心它的actor不支持so的class引用和序列化传递,实际并没有这个问题。真正定位到的问题是:我在主进程中创建了对象,并分发到各actor;但这个类有’开进程的内存并引用其地址’的行为且没管理在类的内部,导致分发到actor上出现了地址引用失败。您“actor是一个独立的进程”这句话启发了我,再次感谢。