gRPC

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

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

RPC(Remote Procedure Call)即:远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。使用的时候,客户端调用server端提供的接口就像是调用本地的函数一样。

    RPC遵从server/client模型。gRPC 由 Google 开发。

## 机器学习模型部署
    1.安装gRPC
pip install -U grpcio
pip install -U grpcio-tools
pip install -U protobuf

实例:用 gRPC server端部署一个随机森林分类器,client 端发起请求预测鸢尾花类型。

训练一个随机森林分类模型,把训练好的模型保存为pkl文件。

# train_model.py
from sklearn import datasets
from sklearn.pipeline import Pipeline
import joblib
from sklearn.ensemble import RandomForestClassifier

def main():
    clf = RandomForestClassifier()
    p = Pipeline([('clf', clf)])
    p.fit(X, y)

    filename_p = 'IrisClassifier.pkl'
    joblib.dump(p, filename_p)
    print('Model saved!')


if __name__ == "__main__":
    iris = datasets.load_iris()
    X, y = iris.data, iris.target
    main()

1、通过protobuf定义接口和数据类型
(1)新建一个iris_demo.proto文件

syntax = "proto3";

package iris;

message IrisPredictRequest {// 定义参数1
	float sepal_length = 1;//参数字段1
	float sepal_width = 2;//参数字段2
	float petal_length = 3;//参数字段3
	float petal_width = 4;//参数字段4
}

message IrisPredictResponse {// 定义参数1
	int32 species = 1;
}

service IrisPredictor{// 定义服务
	rpc predict_iris_species(IrisPredictRequest) returns (IrisPredictResponse){} 
}

proto文件格式
1.头部的syntax 注明版本号必须为 "proto3"
2.中间的 message 定义了predict_iris_species方法的参数IrisPredictRequest和IrisPredictResponse,还有参数字段的类型。
3.尾部的 service 定义一个服务IrisPredictor,其中包括 1 个predict_iris_species的RPC方法。这里可以定义多个RPC方法,在 message 中定义对应的参数即可。

2、使用gRPC protobuf生成Python的库函数


python -m grpc_tools.protoc -I=. --python_out=. --grpc_python_out=. ./iris_demo.proto

3、写一个服务器
这里的重点是定义 IrisPredictor 类的 predict_iris_species 方法,然后用 iris_demo_pb2_grpc.py 中的 add_IrisPredictorServicer_to_server 方法将 IrisPredictor 添加到 server。serve 函数里定义了 gRPC 的运行方式,使用 4 个 worker 的线程池。

# iris_prediction_server.py
import grpc
from concurrent import futures
import time
import joblib
import iris_demo_pb2
import iris_demo_pb2_grpc
import predict_iris
from sklearn.ensemble import RandomForestClassifier


class IrisPredictor(iris_demo_pb2_grpc.IrisPredictorServicer):

    @classmethod
    def get_trained_model(cls):
        cls._model = joblib.load('IrisClassifier.pkl')
        return cls._model

    def predict_iris_species(self, request, context):
        model = self.__class__.get_trained_model()
        sepal_length = request.sepal_length
        sepal_width = request.sepal_width
        petal_length = request.petal_length
        petal_width = request.petal_width
        result = model.predict(
            [[sepal_length, sepal_width, petal_length, petal_width]])
        response = iris_demo_pb2.IrisPredictResponse(species=result[0])
        return response  # not sure


def run():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=4))
    iris_demo_pb2_grpc.add_IrisPredictorServicer_to_server(
        IrisPredictor(), server)
    server.add_insecure_port('[::]:50055')
    server.start()
    print("grpc server start...")
    print("Listening on port 50055")
    server.wait_for_termination()


if __name__ == '__main__':
    run()

4、写一个客户端
客户端的逻辑更加简单,连上gRPC服务,然后发起调用。

# iris_prediction_client.py
import grpc
import iris_demo_pb2
import iris_demo_pb2_grpc


def run():
    channel = grpc.insecure_channel('localhost:50055')
    stub = iris_demo_pb2_grpc.IrisPredictorStub(channel)
    request = iris_demo_pb2.IrisPredictRequest(
        sepal_length=6.7,
        sepal_width=3.0,
        petal_length=5.2,
        petal_width=2.3)
    response = stub.predict_iris_species(request)
    print('The prediction is :', response.species)


if __name__ == '__main__':
    run()

5、调用 RPC
先开启服务端

$ python iris_prediction_server.py 
grpc server start...
Listening on port 50055

另起一个terminal执行客户端代码,调用gRPC服务,预测结果如下:

$ python iris_prediction_client.py 
The prediction is : 2

非原创__________________
https://mp.weixin.qq.com/s/WGCoejI6zzEXTJ4fvgwDGg
https://www.jianshu.com/p/9c947d98e192
——————————————————————————————————————————————————————————————

学习使用心得:

上一篇:机器学习T1


下一篇:笔记1:机器学习算法(一): 基于逻辑回归的分类预测