我在C ++中创建了自定义TensorFlow运算符,类似于tensorflow / user / ops /中的示例,并且在TensorFlow会话中使用它们时工作正常。
使用运算符保存SavedModel时,生成的saved_model确实包含运算符(至少粗略检查此类模型的文本协议缓冲区会显示)。尝试使用tensorflow_model_server来提供服务当然会失败,因为运营商是未知的。
所以我继续使用一个选项扩展tensorflow_model_server,以指定预先加载的user_ops库。插入tensorflow_model_server的“main.cc”的相关代码段是:
if (librarypath.size() > 0) {
// Load the library.
TF_Status* status = TF_NewStatus();
TF_LoadLibrary(librarypath.c_str(), status);
if (!TF_GetCode(status) == TF_OK) {
string status_msg(TF_Message(status));
std::cout << "Problem loading user_op library " << librarypath << ": " << TF_Message(status);
return -1; }
TF_DeleteStatus(status);
}
不幸的是,这没有按预期工作,我得到了
Problem loading user_op library /usr/lib64/multipolygon_op.so: /usr/lib64 /multipolygon_op.so: undefined symbol: _ZTIN10tensorflow8OpKernelE
这以某种方式引用_pywrap_tensorflow_internal.so符号。我是否需要以不同方式构建用户操作库,或者我只是运气不好?
答案 0 :(得分:1)
好的,在尝试了许多不同的场地之后,答案变得相对简单:
tensorflow_model_server的链接方式不会为新加载的共享库提供自己的符号。因此,将“-rdynamic”添加到链接器选项以更改它会使所有内容都到位:
bazel build --linkopt=-rdynamic //tensorflow_serving/model_servers:tensorflow_model_server