TensorFlow 1.6.0共享库缺失DatasetOpKernel符号的技术求助
解决TensorFlow 1.6中DatasetOpKernel符号缺失的问题
这问题我之前帮朋友排查过类似的,TensorFlow 1.6的官方预编译共享库确实存在这个符号未导出的情况——DatasetOpKernel在1.6版本里还属于内部实现细节,直到1.7才正式把这个符号对外暴露,所以你用pip安装的标准包肯定会遇到加载失败的问题。
下面给你几个可行的解决方向:
直接升级到TensorFlow 1.7及以上版本
这是最省心的方案,如果你没有必须停留在1.6的硬性要求,直接升级后,官方预编译库就会包含DatasetOpKernel的导出符号,插件加载问题自然就解决了。自行编译TensorFlow 1.6源码并导出符号
如果必须坚守1.6版本,那就得自己从源码编译,手动开启符号导出:- 克隆TensorFlow仓库并切换到v1.6.0分支:
git clone https://github.com/tensorflow/tensorflow.git && cd tensorflow && git checkout v1.6.0 - 安装对应版本的Bazel(TensorFlow 1.6需要Bazel 0.11.0左右,别用太高版本)
- 运行
./configure配置编译选项,过程中按需选择即可 - 修改TensorFlow源码中的BUILD配置,找到DatasetOpKernel相关的目标,在
cc_binary或cc_library规则里添加linkopts = ["-Wl,--export-dynamic"],或者在visibility里放宽访问权限,确保符号能被外部插件访问 - 执行编译命令:
bazel build --config=opt //tensorflow:libtensorflow_framework.so - 编译完成后,把生成的
libtensorflow_framework.so替换掉系统中pip安装的对应文件,或者在构建你的插件时指定链接这个自定义编译的库
- 克隆TensorFlow仓库并切换到v1.6.0分支:
验证符号是否存在
不管用哪种方案,都可以用nm工具确认符号是否导出:nm -D /path/to/libtensorflow_framework.so | grep DatasetOpKernel如果能看到类似
0000000000xxxxxx T _ZN10tensorflow16DatasetOpKernelC2ERKNS_15OpKernelContextE这样的输出,就说明符号已经成功导出了。
内容的提问来源于stack exchange,提问作者Owen
相关产品推荐
相关产品推荐

