100天搞定机器学习:模型训练好了,然后呢?

本文涉及的产品
模型训练 PAI-DLC,100CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: 100天搞定机器学习:模型训练好了,然后呢?

大家好,我是老胡。


许久没有更新100天搞定机器学习系列了,最近在看一个开源框架,其中有用到 gRPC ,它可以用于机器学习模型的部署,也可用于深度学习框架的开发,本文就当是《100天搞定机器学习》的番外篇吧,gRPC ,我们一起探个究竟。


640.png


gRPC(Remote Procedure Call)


gRPC 由 Google 开发,是一款语言中立、平台中立、开源的 RPC 框架。

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


比如:有两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。


640.png


RPC更像是一种思想或机制,其实现方式有很多,除了gRPC ,还有阿里巴巴的 Dubbo、Facebook 的 Thrift、Twitter 的 Finagle 等。


gRPC 基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。你可以很容易地用 c++ 创建一个 gRPC 服务端,用 Go、Python、Ruby 来创建客户端。

640.png


上图中的 Protocbuf 是gRPC的数据序列化工具,使用 Protobuf 将数据序列化成二进制的数据流,即可让用不同语言(proto3支持C++, Java, Python, Go, Ruby, Objective-C, C#)编写并在不同平台上运行的应用程序交换数据。ps:Protocbuf 也是 Google 开源的。


Protocol Buffer 官方提供了编译工具来对 proto 文件进行编译并生成语言相关的代码文件,可以极大地减少编码的工作量。对于序列化协议来说,使用方只需要关注业务对象本身,即 idl 定义,序列化和反序列化的代码只需要通过工具生成即可。

640.png

                              ProtoBuf 协议的工作流程


gRPC 实例详解——机器学习模型部署

640.png


开始实例之前,需要安装 gRPC 及相关工具


pip install -U grpcio
pip install -U grpcio-tools
pip install -U protobuf


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


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


下面我们就以Iris数据集为例,用 gRPC server端部署一个随机森林分类器,client 端发起请求预测鸢尾花类型。


640.png


0、训练一个随机森林分类模型,把训练好的模型保存为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定义接口和数据类型


新建一个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文件格式一般三部分组成,


  • 头部的syntax 注明版本号为 "proto3",必须写,没理由。
  • 中间的 message 定义了predict_iris_species方法的参数IrisPredictRequest和IrisPredictResponse,还有参数字段的类型。
  • 尾部的 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


其中:


-I指定了源文件的路径


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


--grpc_python_out 指定xxx_pb2_grpc.py文件的输出路径


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


运行成功后,会自动生成iris_demo_pb2.py(里面有消息序列化类)和

iris_demo_pb2_grpc.py(包含了服务器 Stub 类和客户端 Stub 类,以及待实现的服务 RPC 接口)。我们无需关心这两个py文件的细节,只需要直到在服务端和客户端怎么调用即可。


本例中,我们会用到的方法如下:


xxx_pb2.py

├── xxx_pb2.IrisPredictRequest   用于传入特征数据

├── xxx_pb2.IrisPredictResponse 用于预测

xxxx_pb2_grpc.py

├── xxx_pb2_grpc.IrisPredictorServicer  服务器 Stub 类

├── xxx_pb2_grpc.IrisPredictorStub  客户端 Stub 类


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


目录
打赏
0
0
0
0
13
分享
相关文章
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
本文探讨了数据基础设施设计中常见的一个问题:数据仓库或数据湖仓中的表格缺乏构建高性能机器学习模型所需的历史记录,导致模型性能受限。为解决这一问题,文章介绍了缓慢变化维度(SCD)技术,特别是Type II类型的应用。通过SCD,可以有效追踪维度表的历史变更,确保模型训练数据包含完整的时序信息,从而提升预测准确性。文章还从数据工程师、数据科学家和产品经理的不同视角提供了实施建议,强调历史数据追踪对提升模型性能和业务洞察的重要性,并建议采用渐进式策略逐步引入SCD设计模式。
159 8
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
PAI Model Gallery 支持云上一键部署 DeepSeek-V3、DeepSeek-R1 系列模型
DeepSeek 系列模型以其卓越性能在全球范围内备受瞩目,多次评测中表现优异,性能接近甚至超越国际顶尖闭源模型(如OpenAI的GPT-4、Claude-3.5-Sonnet等)。企业用户和开发者可使用 PAI 平台一键部署 DeepSeek 系列模型,实现 DeepSeek 系列模型与现有业务的高效融合。
PAI训练服务:云上大模型训练新篇章
本文介绍了通用AI时代下的新训练方法及PAI平台的优化。随着大模型时代的到来,算力需求激增,硬件和网络通信成为瓶颈。PAI平台通过自动容错、3D健康检测等技术确保训练稳定性;通过资源配额、智能调度等提高性价比;并推出PAI-TorchAcc和PAI-ChatLearn两大引擎,分别实现高效训练加速和灵活的对齐训练,显著提升训练性能与效果。这些改进解决了大规模AI训练中的关键问题,提升了效率和稳定性。
MT-MegatronLM:国产训练框架逆袭!三合一并行+FP8黑科技,大模型训练效率暴涨200%
MT-MegatronLM 是摩尔线程推出的面向全功能 GPU 的开源混合并行训练框架,支持多种模型架构和高效混合并行训练,显著提升 GPU 集群的算力利用率。
68 18
云上一键部署通义千问 QwQ-32B 模型,阿里云 PAI 最佳实践
3月6日阿里云发布并开源了全新推理模型通义千问 QwQ-32B,在一系列权威基准测试中,千问QwQ-32B模型表现异常出色,几乎完全超越了OpenAI-o1-mini,性能比肩Deepseek-R1,且部署成本大幅降低。并集成了与智能体 Agent 相关的能力,够在使用工具的同时进行批判性思考,并根据环境反馈调整推理过程。阿里云人工智能平台 PAI-Model Gallery 现已经支持一键部署 QwQ-32B,本实践带您部署体验专属 QwQ-32B模型服务。
MATLAB在机器学习模型训练与性能优化中的应用探讨
本文介绍了如何使用MATLAB进行机器学习模型的训练与优化。MATLAB作为强大的科学计算工具,提供了丰富的函数库和工具箱,简化了数据预处理、模型选择、训练及评估的过程。文章详细讲解了从数据准备到模型优化的各个步骤,并通过代码实例展示了SVM等模型的应用。此外,还探讨了超参数调优、特征选择、模型集成等优化方法,以及深度学习与传统机器学习的结合。最后,介绍了模型部署和并行计算技巧,帮助用户高效构建和优化机器学习模型。
47 1
MATLAB在机器学习模型训练与性能优化中的应用探讨
DistilQwen2.5蒸馏小模型在PAI-ModelGallery的训练、评测、压缩及部署实践
DistilQwen2.5 是阿里云人工智能平台 PAI 推出的全新蒸馏大语言模型系列。通过黑盒化和白盒化蒸馏结合的自研蒸馏链路,DistilQwen2.5各个尺寸的模型在多个基准测试数据集上比原始 Qwen2.5 模型有明显效果提升。这一系列模型在移动设备、边缘计算等资源受限的环境中具有更高的性能,在较小参数规模下,显著降低了所需的计算资源和推理时长。阿里云的人工智能平台 PAI,作为一站式的机器学习和深度学习平台,对 DistilQwen2.5 模型系列提供了全面的技术支持。本文详细介绍在 PAI 平台使用 DistilQwen2.5 蒸馏小模型的全链路最佳实践。
基于机器学习的数据分析:PLC采集的生产数据预测设备故障模型
本文介绍如何利用Python和Scikit-learn构建基于PLC数据的设备故障预测模型。通过实时采集温度、振动、电流等参数,进行数据预处理和特征提取,选择合适的机器学习模型(如随机森林、XGBoost),并优化模型性能。文章还分享了边缘计算部署方案及常见问题排查,强调模型预测应结合定期维护,确保系统稳定运行。
87 0
云上一键部署 DeepSeek-V3 模型,阿里云 PAI-Model Gallery 最佳实践
本文介绍了如何在阿里云 PAI 平台上一键部署 DeepSeek-V3 模型,通过这一过程,用户能够轻松地利用 DeepSeek-V3 模型进行实时交互和 API 推理,从而加速 AI 应用的开发和部署。
阿里云PAI发布DeepRec Extension,打造稳定高效的分布式训练,并宣布开源!
阿里云PAI发布DeepRec Extension,打造稳定高效的分布式训练,并宣布开源!

热门文章

最新文章

相关产品

  • 人工智能平台 PAI