modelib


Namemodelib JSON
Version 0.2.0 PyPI version JSON
download
home_pagehttps://github.com/pier-digital/modelib
SummaryA minimalist framework for online deployment of sklearn-like models
upload_time2024-03-12 17:42:43
maintainer
docs_urlNone
authorGabriel Guarisa
requires_python>=3.8,<4.0
licenseMIT
keywords machine learning fastapi sklearn online deployment
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <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"
}
        
Elapsed time: 4.94661s