<p align="center">
<a href="https://github.com/pier-digital/modelib"><img src="https://raw.githubusercontent.com/pier-digital/modelib/main/logo.png" alt="modelib"></a>
</p>
<p align="center">
<em>A minimalist framework for online deployment of sklearn-like models</em>
</p>
<div align="center">
[![Package version](https://img.shields.io/pypi/v/modelib?color=%2334D058&label=pypi%20package)](https://pypi.org/project/modelib/)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![Semantic Versions](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--versions-e10079.svg)](https://github.com/pier-digital/modelib/releases)
[![License](https://img.shields.io/github/license/pier-digital/modelib)](https://github.com/pier-digital/modelib/blob/main/LICENSE)
</div>
## Installation
```bash
pip install modelib
```
## Usage
The modelib package provides a simple interface to deploy and serve models online. The package is designed to be used with the [fastapi](https://fastapi.tiangolo.com/) package, and supports serving models that are compatible with the [sklearn](https://scikit-learn.org/stable/) package.
First, you will need to create a model that is compatible with the sklearn package. For example, let's create a simple RandomForestClassifier model with a StandardScaler preprocessor:
```python
MODEL = Pipeline(
[
("scaler", StandardScaler()),
("clf", RandomForestClassifier(random_state=42)),
]
).set_output(transform="pandas")
```
Let's assume that you have a dataset with the following columns:
```python
request_model = [
{"name": "sepal length (cm)", "dtype": "float64"},
{"name": "sepal width (cm)", "dtype": "float64"},
{"name": "petal length (cm)", "dtype": "float64"},
{"name": "petal width (cm)", "dtype": "float64"},
]
```
Alternatively, you can use a pydantic model to define the request model, where the alias field is used to match the variable names with the column names in the training dataset:
```python
class InputData(pydantic.BaseModel):
sepal_length: float = pydantic.Field(alias="sepal length (cm)")
sepal_width: float = pydantic.Field(alias="sepal width (cm)")
petal_length: float = pydantic.Field(alias="petal length (cm)")
petal_width: float = pydantic.Field(alias="petal width (cm)")
request_model = InputData
```
After the model is created and trained, you can create a modelib runner for this model as follows:
```python
import modelib as ml
simple_runner = ml.SklearnRunner(
name="my simple model",
predictor=MODEL,
method_name="predict",
request_model=request_model,
)
```
Another option is to use the `SklearnPipelineRunner` class which allows you to get all the outputs of the pipeline:
```python
pipeline_runner = ml.SklearnPipelineRunner(
"Pipeline Model",
predictor=MODEL,
method_names=["transform", "predict"],
request_model=request_model,
)
```
Now you can create a FastAPI app with the runners:
```python
app = ml.init_app(runners=[simple_runner, pipeline_runner])
```
You can also pass an existing FastAPI app to the `init_app` function:
```python
import fastapi
app = fastapi.FastAPI()
app = ml.init_app(app=app, runners=[simple_runner, pipeline_runner])
```
The `init_app` function will add the necessary routes to the FastAPI app to serve the models. You can now start the app with:
```bash
uvicorn <replace-with-the-script-filename>:app --reload
```
After the app is running you can check the created routes in the Swagger UI at the `/docs` endpoint.
![Swagger UI](images/swagger.png)
The created routes expect a JSON payload with the features as keys and the values as the input to the model. For example, to make a prediction with the simple model runner you can send a POST request to the `/my-simple-model` endpoint with the following payload:
```json
{
"sepal length (cm)": 5.1,
"sepal width (cm)": 3.5,
"petal length (cm)": 1.4,
"petal width (cm)": 0.2
}
```
The response will be a JSON with the prediction:
```json
{
"result": 0
}
```
## Contributing
If you want to contribute to the project, please read the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information.
Raw data
{
"_id": null,
"home_page": "https://github.com/pier-digital/modelib",
"name": "modelib",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8,<4.0",
"maintainer_email": "",
"keywords": "machine learning,fastapi,sklearn,online deployment",
"author": "Gabriel Guarisa",
"author_email": "gabrielguarisa@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/33/6d/37c5885f88f0f0187adeb2c336731527bb634eb1d4d0e544dd6fcce38410/modelib-0.2.0.tar.gz",
"platform": null,
"description": "<p align=\"center\">\n <a href=\"https://github.com/pier-digital/modelib\"><img src=\"https://raw.githubusercontent.com/pier-digital/modelib/main/logo.png\" alt=\"modelib\"></a>\n</p>\n<p align=\"center\">\n <em>A minimalist framework for online deployment of sklearn-like models</em>\n</p>\n\n<div align=\"center\">\n\n[![Package version](https://img.shields.io/pypi/v/modelib?color=%2334D058&label=pypi%20package)](https://pypi.org/project/modelib/)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n[![Semantic Versions](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--versions-e10079.svg)](https://github.com/pier-digital/modelib/releases)\n[![License](https://img.shields.io/github/license/pier-digital/modelib)](https://github.com/pier-digital/modelib/blob/main/LICENSE)\n\n</div>\n\n\n## Installation\n\n```bash\npip install modelib\n```\n\n## Usage\n\nThe modelib package provides a simple interface to deploy and serve models online. The package is designed to be used with the [fastapi](https://fastapi.tiangolo.com/) package, and supports serving models that are compatible with the [sklearn](https://scikit-learn.org/stable/) package.\n\nFirst, you will need to create a model that is compatible with the sklearn package. For example, let's create a simple RandomForestClassifier model with a StandardScaler preprocessor:\n\n```python\nMODEL = Pipeline(\n [\n (\"scaler\", StandardScaler()),\n (\"clf\", RandomForestClassifier(random_state=42)),\n ]\n).set_output(transform=\"pandas\")\n```\n\nLet's assume that you have a dataset with the following columns:\n\n```python\nrequest_model = [\n {\"name\": \"sepal length (cm)\", \"dtype\": \"float64\"},\n {\"name\": \"sepal width (cm)\", \"dtype\": \"float64\"},\n {\"name\": \"petal length (cm)\", \"dtype\": \"float64\"},\n {\"name\": \"petal width (cm)\", \"dtype\": \"float64\"},\n]\n```\nAlternatively, you can use a pydantic model to define the request model, where the alias field is used to match the variable names with the column names in the training dataset:\n\n```python\nclass InputData(pydantic.BaseModel):\n sepal_length: float = pydantic.Field(alias=\"sepal length (cm)\")\n sepal_width: float = pydantic.Field(alias=\"sepal width (cm)\")\n petal_length: float = pydantic.Field(alias=\"petal length (cm)\")\n petal_width: float = pydantic.Field(alias=\"petal width (cm)\")\n\nrequest_model = InputData\n```\n\nAfter the model is created and trained, you can create a modelib runner for this model as follows:\n\n```python\nimport modelib as ml\n\nsimple_runner = ml.SklearnRunner(\n name=\"my simple model\",\n predictor=MODEL,\n method_name=\"predict\",\n request_model=request_model,\n)\n```\n\nAnother option is to use the `SklearnPipelineRunner` class which allows you to get all the outputs of the pipeline:\n\n```python\npipeline_runner = ml.SklearnPipelineRunner(\n \"Pipeline Model\",\n predictor=MODEL,\n method_names=[\"transform\", \"predict\"],\n request_model=request_model,\n)\n```\n\nNow you can create a FastAPI app with the runners:\n\n```python\napp = ml.init_app(runners=[simple_runner, pipeline_runner])\n```\n\nYou can also pass an existing FastAPI app to the `init_app` function:\n\n```python\nimport fastapi\n\napp = fastapi.FastAPI()\n\napp = ml.init_app(app=app, runners=[simple_runner, pipeline_runner])\n```\n\nThe `init_app` function will add the necessary routes to the FastAPI app to serve the models. You can now start the app with:\n\n```bash\nuvicorn <replace-with-the-script-filename>:app --reload\n```\n\nAfter the app is running you can check the created routes in the Swagger UI at the `/docs` endpoint.\n\n![Swagger UI](images/swagger.png)\n\nThe created routes expect a JSON payload with the features as keys and the values as the input to the model. For example, to make a prediction with the simple model runner you can send a POST request to the `/my-simple-model` endpoint with the following payload:\n\n```json\n{\n \"sepal length (cm)\": 5.1,\n \"sepal width (cm)\": 3.5,\n \"petal length (cm)\": 1.4,\n \"petal width (cm)\": 0.2\n}\n```\n\nThe response will be a JSON with the prediction:\n\n```json\n{\n \"result\": 0\n}\n```\n\n## Contributing\n\nIf you want to contribute to the project, please read the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information.",
"bugtrack_url": null,
"license": "MIT",
"summary": "A minimalist framework for online deployment of sklearn-like models",
"version": "0.2.0",
"project_urls": {
"Homepage": "https://github.com/pier-digital/modelib",
"Repository": "https://github.com/pier-digital/modelib"
},
"split_keywords": [
"machine learning",
"fastapi",
"sklearn",
"online deployment"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "af095bc1602c39448b805dff4aac98ce52e8037a4db278df006397867d0fb9d7",
"md5": "9b719e40c686ad3498527eb3c1a24628",
"sha256": "f66622e1e21dd1f350c328957406e814758d740e877c2307ac1695fd0329ef47"
},
"downloads": -1,
"filename": "modelib-0.2.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "9b719e40c686ad3498527eb3c1a24628",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8,<4.0",
"size": 10950,
"upload_time": "2024-03-12T17:42:42",
"upload_time_iso_8601": "2024-03-12T17:42:42.332314Z",
"url": "https://files.pythonhosted.org/packages/af/09/5bc1602c39448b805dff4aac98ce52e8037a4db278df006397867d0fb9d7/modelib-0.2.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "336d37c5885f88f0f0187adeb2c336731527bb634eb1d4d0e544dd6fcce38410",
"md5": "11a19922b7c87198ae3f558f146fd628",
"sha256": "756779f0147d1dbcc41575ea86767d5fce1e3898bafcf5e7812b95950e3afe31"
},
"downloads": -1,
"filename": "modelib-0.2.0.tar.gz",
"has_sig": false,
"md5_digest": "11a19922b7c87198ae3f558f146fd628",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8,<4.0",
"size": 9705,
"upload_time": "2024-03-12T17:42:43",
"upload_time_iso_8601": "2024-03-12T17:42:43.291014Z",
"url": "https://files.pythonhosted.org/packages/33/6d/37c5885f88f0f0187adeb2c336731527bb634eb1d4d0e544dd6fcce38410/modelib-0.2.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-03-12 17:42:43",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "pier-digital",
"github_project": "modelib",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "modelib"
}