ONNX
This guide demonstrates the process of automatically containerizing your ONNX model.
What you will need
- Dockerhub account
- Connection to running Chassis.ml service (either from a local deployment or via publicly-hosted service)
- Trained ONNX model that can be loaded into memory or code to train a ONNX model from scratch
- Python environment
NOTE: To follow along, you can reference the Jupyter notebook example and data files here.
Set Up Environment
We recommend you follow this guide using a Jupyter Notebook. Follow the appropriate install instructions based on your environment.
Create a Python virtual environment and install the python packages required to load and run your model. At a minimum, pip install the following packages:
pip install chassisml modzy-sdk
If you would like to follow this guide directly, pip install the following additional packages:
onnx>=1.11.0
onnxruntime>=1.11.1
matplotlib>=3.5.1
numpy>=1.22.3
Load Model into Memory
If you plan to use the Chassis service, you must first load your model into memory. If you have your trained model file saved locally (.pth
, .pkl
, .h5
, .joblib
, or other file format), you can load your model from the weights file directly, or alternatively train and use the model object.
import cv2
import pickle
import tempfile
import chassisml
import numpy as np
import getpass
from shutil import rmtree
import json
import onnx
from onnx import backend
from onnx import numpy_helper
import onnxruntime as ort
import matplotlib.pyplot as plt
# load model
model = onnx.load("models/mobilenetv2-7.onnx")
onnx.checker.check_model(model)
# format sample data and reshape
img = cv2.cvtColor(cv2.imread('data/dog.jpg'), cv2.COLOR_BGR2RGB)
img_show = cv2.resize(img, (224,224))
sample_img = np.reshape(img_show, (1,3,224,224)).astype(np.float32)
# load imagenet labels
labels = pickle.load(open('./data/imagenet_labels.pkl','rb'))
# visualize image
plt.figure()
plt.imshow(img)
plt.colorbar()
plt.grid(False)
plt.show()
Now, we will create an ONNX runtime inference session and test our model locally.
# create onnx runtime inference session and print top prediction
session = ort.InferenceSession("models/mobilenetv2-7.onnx")
results = session.run(None, {"input": sample_img})
print("Top Prediction: {}".format(labels[results[0].argmax()]))
>>> "Top Prediction: sunglass"
Define process
Function
process
FunctionYou can think of this function as your "inference" function that will take input data as raw bytes, process the inputs, make predictions, and return the results. This method is the sole parameter required to create a ChassisModel
object.
def process(input_bytes):
# save model to filepath for inference
tmp_dir = tempfile.mkdtemp()
import onnx
onnx.save(model, "{}/model.onnx".format(tmp_dir))
# preprocess data
decoded = cv2.cvtColor(cv2.imdecode(np.frombuffer(input_bytes, np.uint8), -1), cv2.COLOR_BGR2RGB)
img = cv2.resize(decoded, (224,224))
img = np.reshape(img, (1,3,224,224)).astype(np.float32)
# run inference
session = ort.InferenceSession("{}/model.onnx".format(tmp_dir))
results = session.run(None, {"input": img})
# postprocess
inference_result = labels[results[0].argmax()]
# format results
structured_result = {
"data": {
"result": {"classPredictions": [{"class": str(inference_result)}]}
}
}
# remove temp directory
rmtree(tmp_dir)
return structured_result
Create ChassisModel
Object and Publish Model
ChassisModel
Object and Publish ModelFirst, connect to a running instance of the Chassis service - either by deploying on your machine or by connecting to the publicly hosted version of the service). Then, you can use the process
function you defined to create a ChassisModel
object, run a few tests to ensure your model object returns the expected results, and finally publish your model.
chassis_client = chassisml.ChassisClient("http://localhost:5000")
chassis_model = chassis_client.create_model(process_fn=process)
Define sample file from local filepath and run a series of tests.
NOTE: test_env
method is not available on publicly-hosted service.
sample_filepath = './data/dog.jpg'
results = chassis_model.test(sample_filepath)
print(results)
test_env_result = chassis_model.test_env(sample_filepath)
print(test_env_result)
Define your Dockerhub and publish your model.
dockerhub_user = <my.username>
dockerhub_pass = <my.password>
response = chassis_model.publish(
model_name="ONNX MobileNet Image Classifiction",
model_version="0.0.1",
registry_user=dockerhub_user,
registry_pass=dockerhub_pass
)
job_id = response.get('job_id')
final_status = chassis_client.block_until_complete(job_id)
You have successfully completed the packaging of your ONNX model. In your Dockerhub account, you should see your new container listed in the "Repositories" tab.
Figure 1. Example Chassis-built Container
Congratulations! In just minutes you automatically created a Docker container with just a few lines of code. To deploy of your new model container to Modzy, follow the Import Container guide.
Programmatic Model Deployment (Beta)
If you prefer to automate the deployment of your model programmatically instead of following the above guide, follow the below instructions. Note: this feature includes limited error handling and does not allow you to configure the hardware options or documentation for your model.
To continue, you will need valid Modzy Credentials (instance URL and API Key, e.g., https://app.modzy.com and q4jp1pOZyFTddkFsOYwI.flHw34veJgfKu2MNzAa7)
First, modify your publish
method to include your Modzy credentials.
dockerhub_user = <my.username>
dockerhub_pass = <my.password>
modzy_url = <modzy.base.url> # E.g., https://app.modzy.com/api
modzy_api_key = <my.modzy.api.key> # E.g., 8eba4z0AHqguxyf1gU6S.4AmeDQYIQZ724AQAGLJ8
response = chassis_model.publish(
model_name="ONNX MobileNet Image Classifiction",
model_version="0.0.1",
registry_user=dockerhub_user,
registry_pass=dockerhub_pass,
modzy_url=modzy_url,
modzy_api_key=modzy_api_key,
modzy_sample_input_path=sample_filepath
)
job_id = response.get('job_id')
final_status = chassis_client.block_until_complete(job_id)
Executing this code will not only build and push a new container image to your Dockerhub repository, but it will also programmatically deploy the model to Modzy. However, as noted above, you have less flexibility to configure custom hardware options, and you will need to go back into your model to add documentation after the fact.
Once your model is deployed and you navigate to the new model page, click "Edit Model" to add documentation and tags to your newly deployed model. This will ensure other team members within your organization can discover this model and decide whether or not it fits their use case.


Figure 2. Edit Model
Edit the "Add documentation" section to add the following documentation to your model:
- Description: Few sentence summary of your model. Include the task your model accomplishes and brief information about expected inputs and outputs.
- Performance Overview: Few sentence overview of how your model was evaluated and any relevant performance metrics captured during the training and validation processes.
- Performance Metrics: Add metrics you computed during training that will be displayed on your model home page.
- Transparency and bias reporting: Technical details for your model, such as information about your model’s design, architecture, training data, development approach, etc.


Figure 3. Add documentation
When you have finished, move on to the "Assign tags and categories" section. Adding tags will make your model more accessible and discoverable within your organization's Modzy model library.
Figure 4. Assign tags
Congratulations! In just minutes, you have successfully packaged, deployed, and documented your machine learning model. Check out our Running Inferences guides to start using your model right away.
Updated about 1 month ago