7.3 定义服务器接口
接下来需要为导出的模型创建一个服务器。
TensorFlow服务使用gRPC协议(gRPC是一种基于HTTP/2的二进制协议)。它支持用于创建服务器和自动生成客户端存根的各种语言。由于TensorFlow是基于C++的,所以需要在其中定义自己的服务器。幸运的是,服务器端代码比较简短。
为了使用gRPS,必须在一个protocol buffer中定义服务契约,它是用于gRPC的IDL(接口定义语言)和二进制编码。下面来定义我们的服务。前面的导出一节曾提到,我们希望服务有一个能够接收一个JPEG编码的待分类的图像字符串作为输入,并可返回一个依据分数排列的由推断得到的类别列表。
这样的服务应定义在一个classification_service.proto文件中,类似于:
可对能够接收一幅图像,或一个音频片段或一段文字的任意类型的服务使用同一个接口。
为了使用像数据库记录这样的结构化输入,需要修改ClassificationRequest消息。例如,如果试图为Iris数据集构建分类服务,则需要如下编码:
这个proto文件将由proto编译器转换为客户端和服务器相应的类定义。为了使用protobuf编译器,必须为BUILD文件添加一条新的规则,类似于:
请注意位于上述代码片段中最上方的load。它从外部导入的protobuf库中导入了cc_proto_library规则定义。然后,利用它为proto文件定义了一个构建规则。利用bazel build:classification_service_proto可运行该构建,并通过bazel-genfiles/classification_service.grpc.pb.h检查结果:
按照推断逻辑,ClassificationService::Service是必须要实现的接口。我们也可通过检查bazel-genfiles/classification_service.pb.h查看request和response消息的定义:
可以看到,proto定义现在变成了每种类型的C++类接口。它们的实现也是自动生成的,这样便可直接使用它们。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论