在典型的机器学习和深度学习项目中,建模的常规流程是定义问题、数据收集、数据理解、数据处理、构建模型。但是,如果我们想要将模型提供给最终用户,以便用户能够使用它,就需要进行
模型部署
,模型部署要做的工作就是
如何将机器学习模型传递给客户/利益相关者
。模型的部署大致分为以下三个步骤:
-
模型持久化;
持久化,通俗得讲,就是临时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)。那我们训练好的模型一般都是存储在内存中,这个时候就需要用到持久化方式,在 Python 中,常用的模型持久化方式一般都是以文件的方式持久化。
-
选择适合的服务器加载已经持久化的模型;
-
提高服务接口,拉通前后端数据交流;
MLflow的Python接口
将训练好的机器学习模型转化为
PMML
格式,以供
Java
调用。
Python
代码如下
from sklearn import tree
from sklearn.datasets import load_iris
from sklearn2pmml.pipeline import PMMLPipeline
from sklearn2pmml import sklearn2pmml
if __name__ == '__main__':
iris = load_iris()
X = iris.data
y = iris.target
pipeline = PMMLPipeline([("classifier", tree.DecisionTreeClassifier())])
pipeline.fit(X, y)
sklearn2pmml(pipeline, "iris.pmml", with_repr=True)
Java
读取模型文件并预测,具体代码如下:
import org.dmg.pmml.FieldName;
import org.dmg.pmml.PMML;
import org.jpmml.evaluator.*;
import org.xml.sax.SAXException;
import javax.xml.bind.JAXBException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
public class TestPmml {
public static void main(String args[]) throws Exception {
String fp = "iris.pmml";
TestPmml obj = new TestPmml();
Evaluator model = obj.loadPmml(fp);
List<Map<String, Object>> inputs = new ArrayList<>();
inputs.add(obj.getRawMap(5.1, 3.5, 1.4, 0.2));
inputs.add(obj.getRawMap(4.9, 3, 1.4, 0.2));
for (int i = 0; i < inputs.size(); i++) {
Map<String, Object> output = obj.predict(model, inputs.get(i));
System.out.println("X=" + inputs.get(i) + " -> y=" + output.get("y"));
private Evaluator loadPmml(String fp) throws FileNotFoundException, JAXBException, SAXException {
InputStream is = new FileInputStream(fp);
PMML pmml = org.jpmml.model.PMMLUtil.unmarshal(is);
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
ModelEvaluatorFactory factory = ModelEvaluatorFactory.newInstance();
return factory.newModelEvaluator(pmml);
private Map<String, Object> getRawMap(Object a, Object b, Object c, Object d) {
Map<String, Object> data = new HashMap<String, Object>();
data.put("x1", a);
data.put("x2", b);
data.put("x3", c);
data.put("x4", d);
return data;
* 运行模型得到结果。
private Map<String, Object> predict(Evaluator evaluator, Map<String, Object> data) {
Map<FieldName, FieldValue> input = getFieldMap(evaluator, data);
Map<String, Object> output = evaluate(evaluator, input);
return output;
* 把原始输入转换成PMML格式的输入。
private Map<FieldName, FieldValue> getFieldMap(Evaluator evaluator, Map<String, Object> input) {
List<InputField> inputFields = evaluator.getInputFields();
Map<FieldName, FieldValue> map = new LinkedHashMap<FieldName, FieldValue>();
for (InputField field : inputFields) {
FieldName fieldName = field.getName();
Object rawValue = input.get(fieldName.getValue());
FieldValue value = field.prepare(rawValue);
map.put(fieldName, value);
return map;
* 运行模型得到结果。
private Map<String, Object> evaluate(Evaluator evaluator, Map<FieldName, FieldValue> input) {
Map<FieldName, ?> results = evaluator.evaluate(input);
List<TargetField> targetFields = evaluator.getTargetFields();
Map<String, Object> output = new LinkedHashMap<String, Object>();
for (int i = 0; i < targetFields.size(); i++) {
TargetField field = targetFields.get(i);
FieldName fieldName = field.getName();
Object value = results.get(fieldName);
if (value instanceof Computable) {
Computable computable = (Computable) value;
value = computable.getResult();
output.put(fieldName.getValue(), value);
return output;
可通过示例–python模型转换为ONNX格式了解简单的模型转换。详细内容可参考ONNX官方教程
该方法主要是通过一些Web
框架将预测模型打包成Web
服务接口的形式,是一种比较常见的线上部署方式。常用的Web
框架如下所示:
- 深度学习模型部署技术方案
- 谈谈机器学习模型的部署
- MLflow:一种机器学习生命周期管理平台
- 总结一下模型工程化部署的几种方式
- 用PMML实现机器学习模型的跨平台上线
- 机器学习模型之PMML
目录什么是模型部署?模型部署工具介绍MLflowMLeapPMMLPysparkSklearnONNX介绍TensorRT[TensorFlow Serving](https://github.com/tensorflow/serving)Web服务化部署Docker菜鸟教程参考什么是模型部署?在典型的机器学习和深度学习项目中,建模的常规流程是定义问题、数据收集、数据理解、数据处理、构建模型。但是,如果我们想要将模型提供给最终用户,以便用户能够使用它,就需要进行模型部署,模型部署要做的工作就是如何将机器
BentoML从i
python笔记本中的
模型到5分钟内即可投入生产的API服务。
BentoML是用于打包和
部署机器学习
模型的
python库。
它无需更改您的BentoML,即可完成两件事:从i
python Notebook中的
模型到5分钟内即可投入生产的API服务。
BentoML是用于打包和
部署机器学习
模型的
python库。
它无需更改
模型训练工作流即可完成两件事:标准化如何打包用于生产的ML
模型,包括其预处理/特征获取代码,依赖项和配置。
轻松将您的ML
模型分发为PyPI包,API服务器(在Docker映像中),命令行
工具或Spark / Flink U
在前面所有的模型训练和预测中,我们训练好的模型都是直接通过控制台或者 Jupyter Notebook 来进行预测和交互的,在一个系统或者项目中使用这种方式显然不可能,那在 Web 应用中如何使用我们训练好的模型呢?本文将通过以下四个方面对该问题进行讲解:
微服务架构简介;
模型的持久化与加载方式;
Flask 和 Bottle 微服务框架;
Tensorflow Serving 模型部署和服务...
Python模型部署到Java Web,可以通过将Python模型封装为可调用的API,在Java Web中调用这个API来实现模型的部署和使用。
首先,我们需要将Python模型转换为Java可调用的形式。可以使用第三方库py4j来实现Python和Java之间的通信。将Python模型封装成可以被Java调用的函数或类,并使用py4j将这个函数或类暴露给Java。
接下来,在Java Web项目中,引入py4j相关的依赖,将Python模型封装为Java的API接口。可以使用Java的Spring框架来创建RESTful API。通过Spring的@RequestMapping注解将API接口映射到具体的URL上,并编写处理请求的Java代码。
在Java代码中,调用Python模型的API接口。可以使用py4j提供的Java和Python的通信机制,将Java中的请求参数传递给Python模型,并将模型的返回结果传递回Java。
同时,需要将Python模型所依赖的Python库一同部署到Java项目中。可以使用Python的virtualenv工具创建一个独立的Python环境,并在Java项目中通过py4j调用这个环境执行Python代码。
最后,部署Java Web项目,可以选择使用Java的Spring Boot框架来打包和运行项目。将Java Web项目打包成可执行的JAR文件,并将其部署到服务器上。
总结一下,将Python模型部署到Java Web需要借助于py4j来实现Java和Python的通信,将Python模型封装为Java的API接口,并在Java Web项目中调用这个接口来实现模型的部署和使用。