TensorFlow Serving系列之gRPC基本知识

0 背景

系列文章目录

(一)TensorFlow Serving系列之安装及调用方法

(二)TensorFlow Serving系列之导出自己的训练模型

(三)TensorFlow Serving系列之客户端gRPC调用

(四)TensorFlow Serving系列之gRPC基本知识

(五)TensorFlow Serving系列之源码安装服务

(六)TensorFlow Serving系列之多模型多版本控制

 

1 gRPC是什么

gRPC是由谷歌开发的一款语言中立、平台中立、开源的远程过程调用(RPC)系统。在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法,使用的时候客户端调用server端提供的接口就像是调用本地的函数一样。如下图所示就是一个典型的gRPC结构图。

既然是server/client模型,那么我们直接用restful api不是也可以满足吗,为什么还需要RPC呢PC和restful API都提供了一套通信机制,用于server/client模型通信,而且它们都使用http作为底层的传输协议,不过gRPC还是有些特有的优势,如下:

  • 基于HTTP/2 
    HTTP/2 提供了连接多路复用、双向流、服务器推送、请求优先级、首部压缩等机制。可以节省带宽、降低TCP链接次数、节省CPU,帮助移动设备延长电池寿命等。gRPC 的协议设计上使用了HTTP2 现有的语义,请求和响应的数据使用HTTP Body 发送,其他的控制信息则用Header 表示。
  • IDL使用ProtoBuf 
    gRPC使用ProtoBuf来定义服务,ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。压缩和传输效率高,语法简单,表达力强。
  • 多语言支持(C, C++, Python, PHP, Nodejs, C#, Objective-C、Golang、Java) 
    gRPC支持多种语言,并能够基于语言自动生成客户端和服务端功能库。目前已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它语言的版本正在积极开发中,其中,grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等语言,grpc-java已经支持Android开发。

在以下场景中,使用gRPC具有优势:

  • – 低延迟、高扩展性、分布式的系统 
  • – 同云服务器进行通信的移动应用客户端 
  • – 设计语言独立、高效、精确的新协议 
  • – 便于各方面扩展的分层设计,如认证、负载均衡、日志记录、监控等

2 环境配置

要首先安装grpc相关软件

建议使用-U参数安装最新版本的软件包,如果protoc的版本有问题,会 如下错误

3 使用流程

gRPC的使用通常包括如下几个步骤:

  • 通过protobuf来定义接口和数据类型
  • 编写gRPC server端代码
  • 编写gRPC client端代码

下面来通过一个helloworld实例来详细讲解上述的三步,目录结构如下

├── protos
│   └── helloworld.proto
└── rpc_package
    ├── hello_client.py
    ├── hello_server.py
    ├── helloworld_pb2_grpc.py
    ├── helloworld_pb2.py
    ├── __init__.py

3.1 定义接口和数据类型

生成helloworld.proto文件,内容如下

然后使用gRPC protobuf生成工具生成对应的库函数

其中:

-I指定了源文件的路径,

–python_out,指定 xxxx_pb2.py的输出路径,如果使用其它语言请使用对应语言的option

–grpc_python_out指定xxxx_pb2_grpc.py文件的输出路径

–*.proto是要编译的proto文件。

运行成功后,会自动在rpc_package文件夹中生成helloworld_pb2.py(里面有消息序列化类)和helloworld_pb2_grpc.py(包含了服务器 Stub 类和客户端 Stub 类,以及待实现的服务 RPC 接口)。

3.2 服务端代码

3.3 客户端代码

4 测试

首先运行服务端代码

然后运行客户端代码

输出如下

hello client received: Hello, zongxp!

 5 状态码含义

在使用grpc时,有时 错会返回grpc_status值,不同的值对应不同的含义,具体如下

  • 0:Ok:请求成功
  • 1:Canceled:操作已取消
  • 2:Unknown:未知错误。如果从另一个地址空间接收到的状态值属 于在该地址空间中未知的错误空间,则可以返回此错误的示例。 没有返回足够的错误信息的API引发的错误也可能会转换为此错误
  • 3:InvalidArgument:表示客户端指定了无效的参数。 请注意,这与FailedPrecondition不同。 它表示无论系统状态如何(例如格式错误的文件名)都有问题的参数
  • 4:DeadlineExceeded:意味着操作在完成之前过期。 对于更改系统状态的操作,即使操作成功完成,也可能会返回此错误。 例如,服务器的成功响应可能会延迟足够的时间以使截止日期到期
  • 5:NotFound:表示找不到某个请求的实体(例如文件或目录)
  • 6:AlreadyExists:表示尝试创建实体失败,因为已经存在
  • 7:PermissionDenied:表示调用者没有执行指定操作的权限。它不能用于因耗尽某些资源而引起的拒绝(使用ResourceExhausted代替这些错误)。如果调用者无法识别,则不能使用它(使用Unauthenticated代替这些错误)
  • 8:ResourceExhausted:表示某些资源已耗尽,可能是每个用户的配额,或者整个文件系统空间不足
  • 9:FailedPrecondition:表示操作被拒绝,因为系统不处于操作执行所需的状态。例如,要删除的目录可能不是空的,rmdir操作应用于非目录等。可能帮助服务实现者判断FailedPrecondition,Aborted和Unavailable之间的试金石测试:使用不可用如果客户端只能重试失败的呼叫。如果客户端应该在更高级别重试(例如,重新启动读取 – 修改 – 写入序列),则使用中止。如果客户端不应该重试直到系统状态被明确修复,则使用FailedPrecondition。例如,如果“rmdir”由于目录非空而失败,应该返回FailedPrecondition,因为客户端不应该重试,除非他们首先通过从目录中删除文件来修复该目录。如果客户端在资源上执行条件REST获取/更新/删除并且服务器上的资源与条件不匹配,则使用FailedPrecondition。例如,在相同的资源上发生冲突的读取 – 修改 – 写入
  • 10:Aborted:表示操作被中止,通常是由于并发问题(如序列器检查失败,事务异常终止等)造成的。请参阅上面的试金石测试以确定FailedPrecondition,Aborted和Unavailable之间的差异
  • 11:OutOfRange:表示操作尝试超过有效范围。 例如,寻找或阅读文件末尾。 与InvalidArgument不同,此错误表示如果系统状态更改可能会解决的问题。 例如,如果要求读取的偏移量不在[0,2 ^ 32-1]范围内,则32位文件系统将生成InvalidArgument,但如果要求从偏移量读取当前值,则它将生成OutOfRange 文件大小。 FailedPrecondition和OutOfRange之间有相当多的重叠。 我们建议在应用时使用OutOfRange(更具体的错误),以便遍历空间的调用者可以轻松查找OutOfRange错误以检测何时完成
  • 12:Unimplemented:表示此服务中未执行或未支持/启用操作
  • 13:Internal: 意味着底层系统预期的一些不变量已被打破。 如果你看到其中的一个错误,那么事情就会非常糟糕
  • 14:Unavailable:表示服务当前不可用。这很可能是一种暂时性情况,可能会通过退避重试来纠正。请参阅上面的试金石测试以确定FailedPrecondition,Aborted和Unavailable之间的差异
  • 15:DataLoss:指示不可恢复的数据丢失或损坏
  • 16:Unauthenticated:表示请求没有有效的操作认证凭证
  • 17:_maxCode:这个是最大的状态码

文章知识点与官方知识档案匹配,可进一步学习相关知识Python入门技能树人工智能深度学习213117 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年8月26日
下一篇 2019年8月26日

相关推荐