通过谷歌gRPC部署线上机器学习模型
通过谷歌gRPC部署线上机器学习模型 gRPC是谷歌开发的远程过程调用(RPC)系统,它使用HTTP/2通信,Protocol Buffer作为接口描述语言。分为服务端和客户端,跨平台不受语言限制。 本文主要在http服务中(以下代码使用的是flask),使用gPRC Python远程调用训练好的模型返回RESTful接口,机器学习模型是一个已训练好的人脸检测模型(mtcnn)作为演示。 所有源码托管在github,可按需要查看获取,下文只列出部分主要的代码提供一些思路。 Proto定义 使用gRPC必须先使用protocol buffers定义序列化的结构包括各对象、服务等所有类型,之后通过grpcio-tools生成服务端和客户端可用的代码,使用proto3格式。首先定义存放图片的Image用于请求参数,也就是入参是一张图片 // request image message Image { bytes raw_data = 1; int32 height = 2; int32 width = 3; string image_id = 4; MetaData _meta_data = 5; } message Image定义了单张图片的存放格式主要包括raw_data存放图片二进制,还有图片的长高和唯一id,_meta_data记录各种元数据具体实现可查看上面github源码infer.proto // each message Result message Result { Box box = 1; Landmarks landmarks = 2; double confidence = 3; } // return results message InferResults { string image_id = 1; MetaData _meta_data = 2; repeated Result results = 3; } message Result定义单张人脸格式每张人脸包括bounding box人脸框,landmarks5个点和置信度confidence,message InferResults定义了单张图上所有人脸和各种元数据。 // run inference service Inference { rpc Predict (Image) returns (InferResults) {} } service Inference定义了一个最简单的服务,输入一张图片输出是包含所有人脸信息的InferResults,就像一个函数调用一样,gRPC还支持复杂的服务比如streaming。 protobuf的具体格式可以查看谷歌官网介绍 定义完.proto文件后就可以生成客户端和服务端可用的接口了,需要安装grpcio-tools包。 python3 -m grpc_tools.protoc \ -I ./protos \ --python_out=./protos \ --grpc_python_out=./protos \ ./protos/infer.proto 以上命令会生成infer_pb2.py和infer_pb2_grpc.py两个文件。 infer_pb2.py中包含了我们在proto文件中定义的所有以message开头的类型,每个都是一个python类 infer_pb2_grpc.py中包含了在proto文件中以service开头的类型,包括服务端需要引用...Servicer的类重写方法,下文重写了Predict方法,add_...Servicer_to_server也是在服务端需要添加服务到grpc.Server,...Stub类是客户端需要导入的类与服务端交互。 加载模型启动gRPC服务 服务端主要是继承上文生成的infer_pb2_grpc.py中的InferenceServicer重写在infer.proto中定义的Predict方法,返回指定的类型也就是InferResults。 ...