All Projects → openscoring → Openscoring

openscoring / Openscoring

Licence: agpl-3.0
REST web service for the true real-time scoring (<1 ms) of Scikit-Learn, R and Apache Spark models

Programming Languages

java
68154 projects - #9 most used programming language
r
7636 projects

Projects that are alternatives of or similar to Openscoring

ai-deployment
关注AI模型上线、模型部署
Stars: ✭ 149 (-72.2%)
Mutual labels:  scikit-learn, xgboost, lightgbm
Auto ml
[UNMAINTAINED] Automated machine learning for analytics & production
Stars: ✭ 1,559 (+190.86%)
Mutual labels:  scikit-learn, xgboost, lightgbm
Hyperparameter hunter
Easy hyperparameter optimization and automatic result saving across machine learning algorithms and libraries
Stars: ✭ 648 (+20.9%)
Mutual labels:  scikit-learn, xgboost, lightgbm
Arch-Data-Science
Archlinux PKGBUILDs for Data Science, Machine Learning, Deep Learning, NLP and Computer Vision
Stars: ✭ 92 (-82.84%)
Mutual labels:  scikit-learn, xgboost, lightgbm
Adversarial Robustness Toolbox
Adversarial Robustness Toolbox (ART) - Python Library for Machine Learning Security - Evasion, Poisoning, Extraction, Inference - Red and Blue Teams
Stars: ✭ 2,638 (+392.16%)
Mutual labels:  scikit-learn, xgboost, lightgbm
Nyoka
Nyoka is a Python library to export ML/DL models into PMML (PMML 4.4.1 Standard).
Stars: ✭ 127 (-76.31%)
Mutual labels:  scikit-learn, xgboost, lightgbm
Mljar Supervised
Automated Machine Learning Pipeline with Feature Engineering and Hyper-Parameters Tuning 🚀
Stars: ✭ 961 (+79.29%)
Mutual labels:  scikit-learn, xgboost, lightgbm
AutoTabular
Automatic machine learning for tabular data. ⚡🔥⚡
Stars: ✭ 51 (-90.49%)
Mutual labels:  scikit-learn, xgboost, lightgbm
Mars
Mars is a tensor-based unified framework for large-scale data computation which scales numpy, pandas, scikit-learn and Python functions.
Stars: ✭ 2,308 (+330.6%)
Mutual labels:  scikit-learn, xgboost, lightgbm
M2cgen
Transform ML models into a native code (Java, C, Python, Go, JavaScript, Visual Basic, C#, R, PowerShell, PHP, Dart, Haskell, Ruby, F#, Rust) with zero dependencies
Stars: ✭ 1,962 (+266.04%)
Mutual labels:  scikit-learn, xgboost, lightgbm
Eli5
A library for debugging/inspecting machine learning classifiers and explaining their predictions
Stars: ✭ 2,477 (+362.13%)
Mutual labels:  scikit-learn, xgboost, lightgbm
datascienv
datascienv is package that helps you to setup your environment in single line of code with all dependency and it is also include pyforest that provide single line of import all required ml libraries
Stars: ✭ 53 (-90.11%)
Mutual labels:  scikit-learn, xgboost, lightgbm
Kaggle-Competition-Sberbank
Top 1% rankings (22/3270) code sharing for Kaggle competition Sberbank Russian Housing Market: https://www.kaggle.com/c/sberbank-russian-housing-market
Stars: ✭ 31 (-94.22%)
Mutual labels:  xgboost, lightgbm
recsys2019
The complete code and notebooks used for the ACM Recommender Systems Challenge 2019
Stars: ✭ 26 (-95.15%)
Mutual labels:  xgboost, lightgbm
Tencent2017 Final Rank28 code
2017第一届腾讯社交广告高校算法大赛Rank28_code
Stars: ✭ 85 (-84.14%)
Mutual labels:  xgboost, lightgbm
aws-machine-learning-university-dte
Machine Learning University: Decision Trees and Ensemble Methods
Stars: ✭ 119 (-77.8%)
Mutual labels:  xgboost, lightgbm
xgboost-lightgbm-hyperparameter-tuning
Bayesian Optimization and Grid Search for xgboost/lightgbm
Stars: ✭ 40 (-92.54%)
Mutual labels:  xgboost, lightgbm
aws-lambda-docker-serverless-inference
Serve scikit-learn, XGBoost, TensorFlow, and PyTorch models with AWS Lambda container images support.
Stars: ✭ 56 (-89.55%)
Mutual labels:  scikit-learn, xgboost
HyperGBM
A full pipeline AutoML tool for tabular data
Stars: ✭ 172 (-67.91%)
Mutual labels:  xgboost, lightgbm
SynapseML
Simple and Distributed Machine Learning
Stars: ✭ 3,355 (+525.93%)
Mutual labels:  apache-spark, lightgbm

Openscoring Build Status

REST web service for scoring PMML models.

Table of Contents

Features

  • Full support for PMML specification versions 3.0 through 4.4. The evaluation is handled by the JPMML-Evaluator library.
  • Simple and powerful REST API:
    • Model deployment and undeployment.
    • Model evaluation in single prediction, batch prediction and CSV prediction modes.
  • High performance and high throughput:
    • Sub-millisecond response times.
    • Request and response compression using gzip and deflate encodings.
    • Thread safe.
  • Open, extensible architecture for easy integration with proprietary systems and services:
    • User authentication and authorization.

Prerequisites

  • Java 1.8 or newer.

Installation

Binary release

Openscoring client and server uber-JAR files are distributed via the GitHub releases page, and the Openscoring webapp WAR file is distributed via the Maven Central repository.

This README file corresponds to latest source code snapshot. In order to follow its instructions as closely as possible, it's recommended to download the latest binary release.

The current version is 2.0.4 (20 December, 2020):

Source code snapshot

Enter the project root directory and build using Apache Maven:

mvn clean install

The build produces two uber-JAR files and a WAR file:

  • openscoring-client/target/openscoring-client-executable-2.0-SNAPSHOT.jar
  • openscoring-server/target/openscoring-server-executable-2.0-SNAPSHOT.jar
  • openscoring-webapp/target/openscoring-webapp-2.0-SNAPSHOT.war

Usage

The example PMML file DecisionTreeIris.pmml along with example JSON and CSV files can be found in the openscoring-service/src/etc directory.

Server side

Launch the executable uber-JAR file:

java -jar openscoring-server-executable-${version}.jar

By default, the REST web service is started at http://localhost:8080/openscoring. The main class org.openscoring.server.Main accepts a number of configuration options for URI customization and other purposes. Please specify --help for more information.

java -jar openscoring-server-executable-${version}.jar --help
Advanced configuration

Copy the sample Typesafe's Config configuration file openscoring-server/application.conf.sample to a new file application.conf, and customize its content to current needs. Use the config.file system property to impose changes on the JVM:

java -Dconfig.file=application.conf -jar openscoring-server-executable-${version}.jar

The local configuration overrides the default configuration that is defined in the reference REST web service configuration file openscoring-service/src/main/reference.conf. For example, the following local configuration would selectively override the list-valued networkSecurityContextFilter.adminAddresses property (treats any local or remote IP address as an admin IP address):

networkSecurityContextFilter {
	adminAddresses = ["*"]
}
Logging

Copy the sample Java Logging API configuration file openscoring-server/logging.properties.sample to a new file logging.properties, and customize its content to current needs. Use the java.util.logging.config.file system property to impose changes on the JVM:

java -Djava.util.logging.config.file=logging.properties -jar target/openscoring-server-executable-${version}.jar

Client side

Java

Replay the life cycle of a sample DecisionTreeIris model (in "REST API", see below) by launching the following Java application classes from the uber-JAR file:

java -cp openscoring-client-executable-${version}.jar org.openscoring.client.Deployer --model http://localhost:8080/openscoring/model/DecisionTreeIris --file DecisionTreeIris.pmml

java -cp openscoring-client-executable-${version}.jar org.openscoring.client.Evaluator --model http://localhost:8080/openscoring/model/DecisionTreeIris -XSepal_Length=5.1 -XSepal_Width=3.5 -XPetal_Length=1.4 -XPetal_Width=0.2

java -cp openscoring-client-executable-${version}.jar org.openscoring.client.CsvEvaluator --model http://localhost:8080/openscoring/model/DecisionTreeIris --input input.csv --output output.csv

java -cp openscoring-client-executable-${version}.jar org.openscoring.client.Undeployer --model http://localhost:8080/openscoring/model/DecisionTreeIris

The deployment and undeployment of models can be automated by launching the org.openscoring.client.DirectoryDeployer Java application class from the uber-JAR file, which listens for PMML file addition and removal events on the specified directory ("PMML directory watchdog"):

java -cp openscoring-client-executable-${version}.jar org.openscoring.client.DirectoryDeployer --model-collection http://localhost:8080/openscoring/model --dir pmml
Python

See the Openscoring-Python project.

R

See the Openscoring-R project.

REST API

Overview

Model REST API endpoints:

HTTP method Endpoint Required role(s) Description
GET /model - Get the summaries of all models
PUT /model/${id} admin Deploy a model
GET /model/${id} - Get the summary of a model
GET /model/${id}/pmml admin Download a model as a PMML document
POST /model/${id} - Evaluate data in "single prediction" mode
POST /model/${id}/batch - Evaluate data in "batch prediction" mode
POST /model/${id}/csv - Evaluate data in "CSV prediction" mode
DELETE /model/${id} admin Undeploy a model

By default, the "admin" role is granted to all HTTP requests that originate from the local network address.

In case of an error (ie. response status codes 4XX or 5XX), the response body is a JSON serialized form of an org.openscoring.common.SimpleResponse (source) object.

Java clients may use the following idiom to check if an operation succeeded or failed:

ModelResponse response = ...;

// The error condition is encoded by initializing the "message" field and leaving all other fields uninitialized
String message = response.getMessage();
if(message != null){
	throw new RuntimeException(message);
}

// Proceed as usual

Model deployment

PUT /model/${id}

Creates or updates a model.

The request body is a PMML document (indicated by content-type header text/xml or application/xml).

The response body is a JSON serialized form of an org.openscoring.common.ModelResponse (source) object.

Response status codes:

  • 200 OK. The model was updated.
  • 201 Created. A new model was created.
  • 400 Bad Request. The deployment failed permanently. The request body is not a valid and/or supported PMML document.
  • 403 Forbidden. The acting user does not have an "admin" role.
  • 500 Internal Server Error. The deployment failed temporarily.

Sample cURL invocation:

curl -X PUT --data-binary @DecisionTreeIris.pmml -H "Content-type: text/xml" http://localhost:8080/openscoring/model/DecisionTreeIris

The same, using the gzip encoding:

curl -X PUT --data-binary @DecisionTreeIris.pmml.gz -H "Content-encoding: gzip" -H "Content-type: text/xml" http://localhost:8080/openscoring/model/DecisionTreeIris

Model querying

GET /model

Gets the summaries of all models.

The response body is a JSON serialized form of an org.openscoring.common.BatchModelResponse (source) object.

Response status codes:

  • 200 OK. The model collection was queried.

Sample cURL invocation:

curl -X GET http://localhost:8080/openscoring/model
GET /model/${id}

Gets the summary of a model.

The response body is a JSON serialized form of an org.openscoring.common.ModelResponse (source) object.

Response status codes:

  • 200 OK. The model was queried.
  • 404 Not Found. The requested model was not found.

Sample cURL invocation:

curl -X GET http://localhost:8080/openscoring/model/DecisionTreeIris

Sample response:

{
	"id" : "DecisionTreeIris",
	"miningFunction" : "classification",
	"summary" : "Tree model",
	"properties" : {
		"created.timestamp" : "2015-03-17T12:41:35.933+0000",
		"accessed.timestamp" : "2015-03-21T09:35:58.582+0000",
		"file.size" : 4306,
		"file.md5sum" : "2d4698076ed807308c5ae40563b70345"
	},
	"schema" : {
		"inputFields" : [
			{
				"id" : "Sepal_Length",
				"name" : "Sepal length in cm",
				"dataType" : "double",
				"opType" : "continuous",
				"values" : [ "[4.3, 7.9]" ]
			},
			{
				"id" : "Sepal_Width",
				"name" : "Sepal width in cm",
				"dataType" : "double",
				"opType" : "continuous",
				"values" : [ "[2.0, 4.4]" ]
			},
			{
				"id" : "Petal_Length",
				"name" : "Petal length in cm",
				"dataType" : "double",
				"opType" : "continuous",
				"values" : [ "[1.0, 6.9]" ]
			},
			{
				"id" : "Petal_Width",
				"name" : "Petal width in cm",
				"dataType" : "double",
				"opType" : "continuous",
				"values" : [ "[0.1, 2.5]" ]
			}
		],
		"targetFields" : [
			{
				"id" : "Species",
				"dataType" : "string",
				"opType" : "categorical",
				"values" : [ "setosa", "versicolor", "virginica" ]
			}
		],
		"outputFields" : [
			{
				"id" : "Probability_setosa",
				"dataType" : "double",
				"opType" : "continuous"
			},
			{
				"id" : "Probability_versicolor",
				"dataType" : "double",
				"opType" : "continuous"
			},
			{
				"id" : "Probability_virginica",
				"dataType" : "double",
				"opType" : "continuous"
			},
			{
				"id" : "Node_Id",
				"dataType" : "string",
				"opType" : "categorical"
			}
		]
	}
}

Field definitions are retrieved from the MiningSchema and Output elements of the PMML document. The input and group-by fields relate to the arguments attribute of the evaluation request, whereas the target and output fields relate to the result attribute of the evaluation response (see below).

GET /model/${id}/pmml

Downloads a model.

The response body is a PMML document.

Response status codes:

  • 200 OK. The model was downloaded.
  • 403 Forbidden. The acting user does not have an "admin" role.
  • 404 Not Found. The requested model was not found.

Sample cURL invocation:

curl -X GET http://localhost:8080/openscoring/model/DecisionTreeIris/pmml

Model evaluation

POST /model/${id}

Evaluates data in "single prediction" mode.

The request body is a JSON serialized form of an org.openscoring.common.EvaluationRequest (source) object.

The response body is a JSON serialized form of an org.openscoring.common.EvaluationResponse (source) object.

Response status codes:

  • 200 OK. The evaluation was successful.
  • 400 Bad Request. The evaluation failed permanently due to missing or invalid input data.
  • 404 Not Found. The requested model was not found.
  • 500 Internal Server Error. The evaluation failed temporarily.

Sample cURL invocation:

curl -X POST --data-binary @EvaluationRequest.json -H "Content-type: application/json" http://localhost:8080/openscoring/model/DecisionTreeIris

Sample request:

{
	"id" : "record-001",
	"arguments" : {
		"Sepal_Length" : 5.1,
		"Sepal_Width" : 3.5,
		"Petal_Length" : 1.4,
		"Petal_Width" : 0.2
	}
}

Sample response:

{
	"id" : "record-001",
	"results" : {
		"Species" : "setosa",
		"Probability_setosa" : 1.0,
		"Probability_versicolor" : 0.0,
		"Probability_virginica" : 0.0,
		"Node_Id" : "2"
	}
}
POST /model/${id}/batch

Evaluates data in "batch prediction" mode.

The request body is a JSON serialized form of an org.openscoring.common.BatchEvaluationRequest (source) object.

The response body is a JSON serialized form of an org.openscoring.common.BatchEvaluationResponse (source) object.

Response status codes:

  • 200 OK. The evaluation was successful.
  • 400 Bad Request. The evaluation failed permanently due to missing or invalid input data.
  • 404 Not Found. The requested model was not found.
  • 500 Internal Server Error. The evaluation failed temporarily.

Sample cURL invocation:

curl -X POST --data-binary @BatchEvaluationRequest.json -H "Content-type: application/json" http://localhost:8080/openscoring/model/DecisionTreeIris/batch

The evaluation is performed at "record" isolation level. If the evaluation of some org.openscoring.common.EvaluationRequest object fails, then the corresponding org.openscoring.common.EvaluationResponse object encodes the error condition (see above).

POST /model/${id}/csv

Evaluates data in "CSV prediction" mode.

The request body is a CSV document (indicated by content-type header text/plain). The data table must contain a data column for every input and group-by field. The ordering of data columns is not significant, because they are mapped to fields by name.

The CSV reader component detects the CSV dialect by probing ,, ; and \t as CSV delimiter characters. This detection functionality can be suppressed by supplying the value of the CSV delimiter character using the delimiterChar query parameter.

The response body is a CSV document. The data table contains a data column for every target and output field.

The first data column can be employed for row identification purposes. It will be copied over from the request data table to the response data table if its name equals to "Id" (the comparison is case insensitive) and the number of rows did not change during the evaluation.

Response status codes:

  • 200 OK. The evaluation was successful.
  • 400 Bad request. The evaluation failed permanently. The request body is not a valid and/or supported CSV document, or it contains cells with missing or invalid input data.
  • 404 Not Found. The requested model was not found.
  • 500 Internal Server Error. The evaluation failed temporarily.

Sample cURL invocation:

curl -X POST --data-binary @input.csv -H "Content-type: text/plain; charset=UTF-8" http://localhost:8080/openscoring/model/DecisionTreeIris/csv > output.csv

The same, using the gzip encoding:

curl -X POST --data-binary @input.csv.gz -H "Content-encoding: gzip" -H "Content-type: text/plain; charset=UTF-8" -H "Accept-encoding: gzip" http://localhost:8080/openscoring/model/DecisionTreeIris/csv > output.csv.gz

Sample request:

Id,Sepal_Length,Sepal_Width,Petal_Length,Petal_Width
record-001,5.1,3.5,1.4,0.2
record-002,7,3.2,4.7,1.4
record-003,6.3,3.3,6,2.5

Sample response:

Id,Species,Probability_setosa,Probability_versicolor,Probability_virginica,Node_Id
record-001,setosa,1.0,0.0,0.0,2
record-002,versicolor,0.0,0.9074074074074074,0.09259259259259259,6
record-003,virginica,0.0,0.021739130434782608,0.9782608695652174,7

The evaluation is performed at "all-records-or-nothing" isolation level. If the evaluation of some row fails, then the whole CSV document fails.

Model undeployment

DELETE /model/${id}

Deletes a model.

The response body is a JSON serialized form of an org.openscoring.common.SimpleResponse (source) object.

Response status codes:

  • 200 OK. The model was deleted.
  • 403 Forbidden. The acting user does not have an "admin" role.
  • 404 Not Found. The requested model was not found.
  • 500 Internal Server Error. The undeployment failed temporarily.

Sample cURL invocation:

curl -X DELETE http://localhost:8080/openscoring/model/DecisionTreeIris

An HTTP PUT or DELETE method can be masked as an HTTP POST method by using the HTTP method override mechanism.

Sample cURL invocation that employs the X-HTTP-Method-Override request header:

curl -X POST -H "X-HTTP-Method-Override: DELETE" http://localhost:8080/openscoring/model/DecisionTreeIris

Sample cURL invocation that employs the _method query parameter:

curl -X POST http://localhost:8080/openscoring/model/DecisionTreeIris?_method=DELETE

Documentation

Support

Limited public support is available via the JPMML mailing list.

License

Openscoring is licensed under the terms and conditions of the GNU Affero General Public License, Version 3.0. For a quick summary of your rights ("Can") and obligations ("Cannot" and "Must") under AGPLv3, please refer to TLDRLegal.

If you would like to use Openscoring in a proprietary software project, then it is possible to enter into a licensing agreement which makes it available under the terms and conditions of the BSD 3-Clause License instead.

Additional information

Openscoring is developed and maintained by Openscoring Ltd, Estonia.

Interested in using Java PMML API or Openscoring REST API software in your company? Please contact [email protected]

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].