Skip to content

Latest commit

 

History

History
33 lines (19 loc) · 3.14 KB

log.md

File metadata and controls

33 lines (19 loc) · 3.14 KB

09-10

Windows平台使用c++ load custom op dll

  • python 接口 tf.load_op_library()在加载库文件的同时,实现了对op及opkernel的动态注册,此过程无法通过简单的 Windows API LoadLibray()实现,需要通过调用TF接口 TF_LoadLibrary 实现custom op lib的加载

  • TF_LoadLibrary 位于 c/c_api.h 中,属于TF C API,并未public c++ API,可以包含该头文件,或者手动暴露其内部的C++实现,完成调用;lib的释放存在同样的问题

  • 通过 TF_LoadLibrary 加载简单的 zero_out.dll 失败,返回错误码5,提示找不到dll,从dll加载原理上分析,应该是 zero_out.dll 所依赖的某些dll未找到, 最终通过Process Manager发现需要依赖python36.dll,可能是Win平台下TF lib的编译不规范,导致链接了并不需要的python lib,但随后的操作发现尽管能够找zero_out.dll,但TF_GetOpList返回的buff为空,没有op被注册,原因未知,是否类似Win TF lib编译后缺少导出符号是相同的原因。

  • 在Linux尝试上述过程,相对顺利,注意编译libzero_out.so与编译tf_cc.so的gcc版本需要统一(ABI一致),否则仍出现找不到lib的情况;随后解析TF_GetOpList返回值,能够看到ZeroOut字符串,但问题是如何调用该op,目前仍无解决方案,可参考tf src, 有个绕开直接调用该op的办法,就是将改op作为模型的一部分,类似目前AI应用的cc inference过程,因为sense过程并没有可训练参数,需要额外定义一个变量以便保存模型,经尝试该方法可行。

相关链接

需要留意的回复