Version and deploy your models following GitOps principles
Project description
MLEM helps you with machine learning model deployment. It saves ML models in a standard format that can be used in a variety of downstream deployment scenarios such as real-time serving through a REST API or batch processing.
- Run your model anywhere you want: package it as a Python package, a Docker Image or deploy it to Heroku (SageMaker, Kubernetes and more platforms are coming). Switch between formats and deployment platforms with a single command thanks to unified abstraction.
- Simple YAML file to save model metadata: automatically package Python env requirements and input data specifications into a ready-to-deploy format. Use the same human-readable format for any ML framework.
- Stick to your training workflow: MLEM doesn't ask you to rewrite your training code. To start using packaging or deployment machinery, add just two lines to your python script: one to import the library and one to save the model.
- Developer-first experience: use CLI when you feel like DevOps and API when you feel like a developer.
Why MLEM?
- MLEM automatically detects ML framework, Python requirements, model methods and input/output data specifications, saving your time and preventing manual errors.
- MLEM is designed for Git-centered ML models development. Use GitOps with Git as the single source of truth. Enable GitFlow and other software engineering best practices.
- MLEM is made with Unix philosophy in mind - one tool solves one problem very well. Plug MLEM into your toolset, easily integrating it with other tools like DVC.
Usage
Installation
Install MLEM with pip:
$ pip install mlem
To install the development version, run:
$ pip install git+https://github.com/iterative/mlem
Save your model
# train.py
from mlem.api import save
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
def main():
data, y = load_iris(return_X_y=True, as_frame=True)
rf = RandomForestClassifier(
n_jobs=2,
random_state=42,
)
rf.fit(data, y)
save(
rf,
"rf",
tmp_sample_data=data,
tags=["random-forest", "classifier"],
description="Random Forest Classifier",
)
if __name__ == "__main__":
main()
Check out what we have:
$ ls
rf
rf.mlem
$ cat rf.mlem
Click to show `cat` output
artifacts:
data:
hash: ea4f1bf769414fdacc2075ef9de73be5
size: 163651
uri: rf
description: Random Forest Classifier
model_type:
methods:
predict:
args:
- name: data
type_:
columns:
- sepal length (cm)
- sepal width (cm)
- petal length (cm)
- petal width (cm)
dtypes:
- float64
- float64
- float64
- float64
index_cols: []
type: dataframe
name: predict
returns:
dtype: int64
shape:
- null
type: ndarray
predict_proba:
args:
- name: data
type_:
columns:
- sepal length (cm)
- sepal width (cm)
- petal length (cm)
- petal width (cm)
dtypes:
- float64
- float64
- float64
- float64
index_cols: []
type: dataframe
name: predict_proba
returns:
dtype: float64
shape:
- null
- 3
type: ndarray
sklearn_predict:
args:
- name: X
type_:
columns:
- sepal length (cm)
- sepal width (cm)
- petal length (cm)
- petal width (cm)
dtypes:
- float64
- float64
- float64
- float64
index_cols: []
type: dataframe
name: predict
returns:
dtype: int64
shape:
- null
type: ndarray
sklearn_predict_proba:
args:
- name: X
type_:
columns:
- sepal length (cm)
- sepal width (cm)
- petal length (cm)
- petal width (cm)
dtypes:
- float64
- float64
- float64
- float64
index_cols: []
type: dataframe
name: predict_proba
returns:
dtype: float64
shape:
- null
- 3
type: ndarray
type: sklearn
object_type: model
requirements:
- module: sklearn
version: 1.0.2
- module: pandas
version: 1.4.1
- module: numpy
version: 1.22.3
tags:
- random-forest
- classifier
Deploy it
Create an environment to deploy your model:
$ mlem create env heroku staging
💾 Saving env to staging.mlem
Define the deployment:
$ mlem create deployment heroku myservice -c app_name=mlem-quick-start -c model=rf -c env=staging
💾 Saving deployment to myservice.mlem
Deploy it:
$ mlem deploy create myservice
⏳️ Loading deployment from .mlem/deployment/myservice.mlem
🔗 Loading link to .mlem/env/staging.mlem
🔗 Loading link to .mlem/model/rf.mlem
💾 Updating deployment at .mlem/deployment/myservice.mlem
🏛 Creating Heroku App example-mlem-get-started
💾 Updating deployment at .mlem/deployment/myservice.mlem
🛠 Creating docker image for heroku
💼 Adding model files...
🛠 Generating dockerfile...
💼 Adding sources...
💼 Generating requirements file...
🛠 Building docker image registry.heroku.com/example-mlem-get-started/web...
✅ Built docker image registry.heroku.com/example-mlem-get-started/web
🔼 Pushed image registry.heroku.com/example-mlem-get-started/web to remote registry at host registry.heroku.com
💾 Updating deployment at .mlem/deployment/myservice.mlem
🛠 Releasing app my-mlem-service formation
💾 Updating deployment at .mlem/deployment/myservice.mlem
✅ Service example-mlem-get-started is up. You can check it out at https://mlem-quick-start.herokuapp.com/
Check the deployment
https://mlem-quick-start.herokuapp.com
Let's save some data first:
# save_data.py
from mlem.api import save
from sklearn.datasets import load_iris
def main():
data, y = load_iris(return_X_y=True, as_frame=True)
save(
data,
"train.csv",
description="Training data for Random Forest Classifier",
)
if __name__ == "__main__":
main()
$ mlem apply-remote http train.csv -c host=https://mlem-quick-start.herokuapp.com -c port=80 --json
Stop the deployment
$ mlem deploy status myservice.mlem
running
$ mlem deploy teardown myservice.mlem
⏳️ Loading deployment from myservice.mlem
🔗 Loading link to file://staging.mlem
🔻 Deleting mlem-quick-start heroku app
💾 Updating deployment at myservice.mlem
$ mlem deploy status myservice.mlem
not_deployed
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
mlem-0.2.1.tar.gz
(167.9 kB
view details)
Built Distribution
mlem-0.2.1-py3-none-any.whl
(136.8 kB
view details)
File details
Details for the file mlem-0.2.1.tar.gz
.
File metadata
- Download URL: mlem-0.2.1.tar.gz
- Upload date:
- Size: 167.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.0 CPython/3.10.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | bfda4cebaf07e6a3a09ed9f48a7e54effa9bbcd944d939a9c40429c0c0997384 |
|
MD5 | 6bf0e2175b7ae7ca1572f5f3ce2ffbec |
|
BLAKE2b-256 | 80d8d83cf63086467c733d27f61a806655882ad842ff85e3f627626d3a8969f6 |
File details
Details for the file mlem-0.2.1-py3-none-any.whl
.
File metadata
- Download URL: mlem-0.2.1-py3-none-any.whl
- Upload date:
- Size: 136.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.0 CPython/3.10.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e73590794837c5a403489274a07e7b87bc39c73a9a48c060092bcbe163ee6002 |
|
MD5 | 0739bf2b59044d6ea918f05ac03d3f77 |
|
BLAKE2b-256 | a433c6b04414ae89abbb3dd40ecefd5807e904b98020dcfc6490bbed67d21d76 |