可以通过TensorFlow服务提供自定义TensorFlow user_ops

时间:2017-09-18 12:55:52

标签: tensorflow-serving

我在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符号。我是否需要以不同方式构建用户操作库,或者我只是运气不好?

1 个答案:

答案 0 :(得分:1)

好的,在尝试了许多不同的场地之后,答案变得相对简单:

tensorflow_model_server的链接方式不会为新加载的共享库提供自己的符号。因此,将“-rdynamic”添加到链接器选项以更改它会使所有内容都到位:

     bazel build --linkopt=-rdynamic //tensorflow_serving/model_servers:tensorflow_model_server