使用pmml实现跨平台部署机器学习模型
一、概述
对于由Python训练的机器学习模型,通常有pickle和pmml两种部署方式,pickle方式用于在python环境中的部署,pmml方式用于跨平台(如Java环境)的部署,本文叙述的是pmml的跨平台部署方式。
PMML(Predictive Model Markup Language,预测模型标记语言)是一种基于XML描述来存储机器学习模型的标准语言。如,对在Python环境中由sklearn训练得到的模型,通过sklearn2pmml模块可将它完整地保存为一个pmml格式的文件,再在其他平台(如java)中加载该文件进行使用,从而实现模型的跨平台部署。

二、实现步骤
1.训练环境中安装生成pmml文件的工具。
如在Python环境中安装sklearn2pmml模块(pip install sklearn2pmml)。
2.训练模型。
3.将模型保存为pmml文件。
4.部署环境中导入依赖的工具包。
如在Java环境中导入pmml-evaluator、pmml-evaluator-extension(特殊情况下另加)、jaxb-core、jaxb-api、jaxb-impl等jar包。
5.开发应用,加载、使用模型。
注:对sklearn2pmml生成的pmml模型文件,在java中加载使用时,需将文件中的命名空间属性xmlns=".../PMML-4_4"改为xmlns=".../PMML-4_3",以适应低版本的jar包对它的解析。
三、示例
在python中使用sklearn训练一个线性回归模型,并在java环境中部署使用。
工具:PyCharm-2017、Python-39、sklearn2pmml-0.76.1;IntelliJ IDEA-2018、jdk-14.0.2。
1.训练数据集training_data.csv

2.训练、保存模型
import sklearn2pmml as pmml
from sklearn2pmml import PMMLPipeline
from sklearn import linear_model as lm
import os
import pandas as pd
def save_model(data, model_path):
pipeline = PMMLPipeline([("regression", lm.LinearRegression())]) #定义模型,放入pipeline管道
pipeline.fit(data[["x"]], data["y"]) #训练模型,由数据中第一行的名称确定自变量和因变量
pmml.sklearn2pmml(pipeline, model_path, with_repr=True) #保存模型
if __name__ == "__main__":
data = pd.read_csv("training_data.csv")
model_path = model_path = os.path.dirname(os.path.abspath(__file__)) + "/my_example_model.pmml"
save_model(data, model_path)
print("模型保存完成。")
3.将pmml文件的xmlns属性修改为PMML-4_3

4.java程序中加载、使用模型
(1)创建maven项目,将pmml模型文件拷贝至项目根目录下。
(2)加入依赖包
<dependencies>
<dependency>
<groupId>org.jpmml</groupId>
<artifactId>pmml-evaluator</artifactId>
<version>1.4.15</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.11</version>
</dependency>
</dependencies>
(3)java程序加载模型完成预测
public class MLPmmlDeploy {
public static void main(String[] args) {
String model_path = "./my_example_model.pmml"; //模型路径
int x = 20; //测试的自变量值
Evaluator model = loadModel(model_path); //加载模型
Object r = predict(model, x); //预测
Double result = Double.parseDouble(r.toString());
System.out.println("预测的结果为:" + result);
}
private static Evaluator loadModel(String model_path){
PMML pmml = new PMML(); //定义PMML对象
InputStream inputStream; //定义输入流
try {
inputStream = new FileInputStream(model_path); //输入流接到磁盘上的模型文件
pmml = PMMLUtil.unmarshal(inputStream); //将输入流解析为PMML对象
}catch (Exception e){
e.printStackTrace();
}
ModelEvaluatorFactory modelEvaluatorFactory = ModelEvaluatorFactory.newInstance(); //实例化一个模型构造工厂
Evaluator evaluator = modelEvaluatorFactory.newModelEvaluator(pmml); //将PMML对象构造为Evaluator模型对象
return evaluator;
}
private static Object predict(Evaluator evaluator, int x){
Map<String, Integer> data = new HashMap<String, Integer>(); //定义测试数据Map,存入各元自变量
data.put("x", x); //键"x"为自变量的名称,应与训练数据中的自变量名称一致
List<InputField> inputFieldList = evaluator.getInputFields(); //得到模型各元自变量的属性列表
Map<FieldName, FieldValue> arguments = new LinkedHashMap<FieldName, FieldValue>();
for (InputField inputField : inputFieldList) { //遍历各元自变量的属性列表
FieldName inputFieldName = inputField.getName();
Object rawValue = data.get(inputFieldName.getValue()); //取出该元变量的值
FieldValue inputFieldValue = inputField.prepare(rawValue); //将值加入该元自变量属性中
arguments.put(inputFieldName, inputFieldValue); //变量名和变量值的对加入LinkedHashMap
}
Map<FieldName, ?> results = evaluator.evaluate(arguments); //进行预测
List<TargetField> targetFieldList = evaluator.getTargetFields(); //得到模型各元因变量的属性列表
FieldName targetFieldName = targetFieldList.get(0).getName(); //第一元因变量名称
Object targetFieldValue = results.get(targetFieldName); //由因变量名称得到值
return targetFieldValue;
}
}

示例下载:
https://download.csdn.net/download/Albert201605/45645889
End.
参考
- https://www.freesion.com/article/4628411548/
- https://www.cnblogs.com/pinard/p/9220199.html
- https://www.cnblogs.com/moonlightpoet/p/5533313.html
使用pmml实现跨平台部署机器学习模型的更多相关文章
- 使用pmml跨平台部署机器学习模型Demo——房价预测
基于房价数据,在python中训练得到一个线性回归的模型,在JavaWeb中加载模型完成房价预测的功能. 一. 训练.保存模型 工具:PyCharm-2017.Python-39.sklearn2 ...
- 使用Flask部署机器学习模型
Introduction A lot of Machine Learning (ML) projects, amateur and professional, start with an aplomb ...
- 用PMML实现机器学习模型的跨平台上线
在机器学习用于产品的时候,我们经常会遇到跨平台的问题.比如我们用Python基于一系列的机器学习库训练了一个模型,但是有时候其他的产品和项目想把这个模型集成进去,但是这些产品很多只支持某些特定的生产环 ...
- 用PMML实现python机器学习模型的跨平台上线
python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...
- 使用ML.NET + ASP.NET Core + Docker + Azure Container Instances部署.NET机器学习模型
本文将使用ML.NET创建机器学习分类模型,通过ASP.NET Core Web API公开它,将其打包到Docker容器中,并通过Azure Container Instances将其部署到云中. ...
- tensorflow机器学习模型的跨平台上线
在用PMML实现机器学习模型的跨平台上线中,我们讨论了使用PMML文件来实现跨平台模型上线的方法,这个方法当然也适用于tensorflow生成的模型,但是由于tensorflow模型往往较大,使用无法 ...
- Kubernetes入门(四)——如何在Kubernetes中部署一个可对外服务的Tensorflow机器学习模型
机器学习模型常用Docker部署,而如何对Docker部署的模型进行管理呢?工业界的解决方案是使用Kubernetes来管理.编排容器.Kubernetes的理论知识不是本文讨论的重点,这里不再赘述, ...
- 基于FastAPI和Docker的机器学习模型部署快速上手
针对前文所述 机器学习模型部署摘要 中docker+fastapi部署机器学习的一个完整示例 outline fastapi简单示例 基于文件内容检测的机器学习&fastapi 在docker ...
- 为你的机器学习模型创建API服务
1. 什么是API 当调包侠们训练好一个模型后,下一步要做的就是与业务开发组同学们进行代码对接,以便这些‘AI大脑’们可以顺利的被使用.然而往往要面临不同编程语言的挑战,例如很常见的是调包侠们用Pyt ...
随机推荐
- Java(36)IO流案例与总结
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228455.html 博客主页:https://www.cnblogs.com/testero ...
- 虚拟机Parallels Desktop 17 (PD17)支持M1 自己动手制作启动器解锁
个人博客:xzajyjs.cn 如果自己有能力的话,直接查看这个视频即可.点此 前段时间刚出pd17,作为mac上最最强(没有之一)的虚拟机,版本17更是更进一步,性能提升极大,更是支持了Monter ...
- Less-25 preg_replace2
Less-25: 核心语句: 各种回显也均有. 通过blacklist,我们可以发现,本题屏蔽了and和or. preg_replace函数中正则表达式后面的i是一个修饰符,代表正则匹配时不区分大小写 ...
- 【Java虚拟机1】Java字节码文件格式入门
第一次学习看字节码文件,这个对工作没什么用,但是会提升内功. 首先介绍两个IDEA插件以及使用: BinEd:以16进制格式查看class文件 使用方法:右键class文件,点击Open as bin ...
- Golang通脉之错误处理
在实际工程项目中,总是通过程序的错误信息快速定位问题,但是又不希望错误处理代码写的冗余而又啰嗦.Go语言没有提供像Java.C#语言中的try...catch异常处理方式,而是通过函数返回值逐层往上抛 ...
- UML快速概述 - All you need to know about UML
UML 是统一建模语言的缩写,就像使用一组图表来可视化软件建模的蓝图(或设计计划).它不仅可以让您彻底评估整个概念,还可以确保团队中的每个人都在同一页面上. UML 图可以组织成两个不同的组. 结 ...
- BUAA_2020_软件工程_个人项目作业
作业抬头(1') 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人项目作业 我在这个课程的目标是 了解软件工程的技术,掌握工程化开发的能力 这 ...
- 嵌入式物联网之SPI接口原理与配置
本实验采用W25Q64芯片 W25Q64是华邦公司推出的大容量SPI FLASH产品,其容量为64Mb.该25Q系列的器件在灵活性和性能方面远远超过普通的串行闪存器件.W25Q64将8M字节的容量分为 ...
- Spring IOC(控制反转)和DI(依赖注入)原理
一.Spring IoC容器和bean简介 Spring Framework实现了控制反转(IoC)原理,IoC也称为依赖注入(DI). 这是一个过程,通过这个过程,对象定义它们的依赖关系,即它们使用 ...
- python文件读写及修改
转载:https://www.cnblogs.com/zhxwind/p/8761618.html 文件的读写有三种形式:读.写和追加. 一.读模式 r 和读写模式 r+ 1.读模式 r 读模式r特点 ...