添加使用malloc()并具有状态的TensorFlow OP

Adding a TensorFlow Op that uses malloc() and has state

本文关键字:状态 TensorFlow OP malloc 添加      更新时间:2023-10-16

我编写了一个TensorFlow OP,该tensorflow op包裹了用C编写的库,该库在内部将malloc()调用以分配缓冲区并保持状态。我在构造函数中初始化库,这是malloc()调用的地方,然后在Compute()中,我将其与Mutex Guard一起使用。破坏者对free()进行适当的调用。

在我的模型中,每个线程都在同一图中创建OP的副本,并在共享会话中运行。该代码通常会出现与指针相关的问题崩溃的,例如"释放对象的错误检查和释放后可能会修改对象"。我为OP编写的单元测试,带有一个线程,工作正常。

我怀疑图形优化器可以重复使用OP的单个实例,或者类似的东西。有没有办法告诉它,OP是有状态的,应该将其剩下?是否还有其他可能发生崩溃的原因?

我正在运行TensorFlow 1.0.0,并在OSX 10.10下用Clang 7.0编译OP。我首先将C文件编译到共享对象中,然后将C 文件与共享对象一起编译。

根据"添加新OP"的文档:

很重要:可以同时访问Opkernel的实例。您的计算方法必须是线程安全。使用互惠符对班级成员进行任何访问。或者更好的是,不要通过班级成员共享状态!考虑使用Resourcemgr跟踪OP状态。

不幸的是,从编写此答案的时候,Resourcemgr的使用非常粗略。