A FastAPI-based ML worker node library for easy model deployment
Project description
FastMLAPI
A FastAPI-based ML worker node library for easy model deployment. Create production-ready ML APIs with minimal boilerplate.
Features
- 🚀 Simple API: Extend
MLControllerand implement a few methods - 🔄 Automatic
/predictendpoint: Generated automatically with proper request/response handling - 🎯 Preprocessing/Postprocessing: Decorators for clean data pipeline
- 📊 Health checks: Built-in
/healthendpoint - 📝 Auto documentation: Swagger/OpenAPI docs out of the box
- 🔧 Customizable: Custom request/response models supported
Installation
pip install fastmlapi
Or install from source:
pip install -e .
Quick Start
from fastmlapi import MLController, preprocessing, postprocessing
import numpy as np
class MyClassifier(MLController):
model_name = "my-classifier"
model_version = "1.0.0"
def load_model(self):
# Load your model here (sklearn, pytorch, tensorflow, etc.)
return lambda x: np.array([1 if sum(x[0]) > 0 else 0])
@preprocessing
def preprocess(self, data: dict) -> np.ndarray:
"""Transform input data for the model."""
features = data.get("features", [])
return np.array(features).reshape(1, -1)
@postprocessing
def postprocess(self, prediction: np.ndarray) -> dict:
"""Format model output for API response."""
return {
"class": int(prediction[0]),
"label": "positive" if prediction[0] == 1 else "negative"
}
# Run the server
if __name__ == "__main__":
MyClassifier().run()
Or with uvicorn:
# main.py
classifier = MyClassifier()
app = classifier.app
uvicorn main:app --reload
API Endpoints
Once running, your API will have:
POST /predict- Run predictionsGET /health- Health checkGET /- API infoGET /docs- Swagger documentation
Example Request
curl -X POST http://localhost:8000/predict \
-H "Content-Type: application/json" \
-d '{"data": {"features": [1.0, 2.0, 3.0]}}'
Example Response
{
"success": true,
"prediction": {
"class": 1,
"label": "positive"
},
"metadata": {
"model_name": "my-classifier",
"model_version": "1.0.0"
}
}
Advanced Usage
Custom Request/Response Models
from pydantic import BaseModel
from typing import List
class ImageRequest(BaseModel):
image_url: str
threshold: float = 0.5
class ImageResponse(BaseModel):
objects: List[dict]
count: int
class ObjectDetector(MLController):
model_name = "object-detector"
request_model = ImageRequest
response_model = ImageResponse
def load_model(self):
return load_yolo_model()
@preprocessing
def preprocess(self, data: dict):
image = download_image(data["image_url"])
return image
@postprocessing
def postprocess(self, detections) -> dict:
return {
"objects": detections,
"count": len(detections)
}
Custom Prediction Logic
Override predict_raw for models without a standard predict() method:
class PyTorchController(MLController):
def load_model(self):
model = torch.load("model.pt")
model.eval()
return model
def predict_raw(self, preprocessed_data):
with torch.no_grad():
return self.model(preprocessed_data)
Configuration
MLController Options
| Attribute | Type | Default | Description |
|---|---|---|---|
model_name |
str | "ml-model" | Name of the model |
model_version |
str | "1.0.0" | Model version |
title |
str | "FastMLAPI" | API title for docs |
description |
str | "ML Model Serving API" | API description |
api_version |
str | "1.0.0" | API version |
request_model |
BaseModel | PredictionRequest | Custom request schema |
response_model |
BaseModel | PredictionResponse | Custom response schema |
enable_health |
bool | True | Enable /health endpoint |
enable_docs |
bool | True | Enable Swagger/OpenAPI docs |
run() Options
| Parameter | Type | Default | Description |
|---|---|---|---|
host |
str | "0.0.0.0" | Host to bind to |
port |
int | 8000 | Port to bind to |
reload |
bool | False | Enable auto-reload |
Development
# Install dev dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run example
python examples/simple_classifier.py
License
MIT License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fastmlapi-0.1.0.tar.gz.
File metadata
- Download URL: fastmlapi-0.1.0.tar.gz
- Upload date:
- Size: 9.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5e8d0b3f705e3f60b1b71ffce28c0424a388808fe7daf495629e924516ba894d
|
|
| MD5 |
369702e5c42298b3e8e3817b34bf01bb
|
|
| BLAKE2b-256 |
c897b69f93f7fd7a5c6d920fc4b6e316f602a84c47c90aadbe5785c920b45503
|
File details
Details for the file fastmlapi-0.1.0-py3-none-any.whl.
File metadata
- Download URL: fastmlapi-0.1.0-py3-none-any.whl
- Upload date:
- Size: 9.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9b372a0b0e7a6d11e24240ab4d777edf972773c5b4c117d90ee00212faf64634
|
|
| MD5 |
094041207bd24c3e5edb8398ca3e5f32
|
|
| BLAKE2b-256 |
91eb89adcd5090d0c7f1bc0b559a1b7b15da2b58f4ddc570f68f9631a3768281
|