Skip to main content

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 MLController and implement a few methods
  • 🔄 Automatic /predict endpoint: Generated automatically with proper request/response handling
  • 🎯 Preprocessing/Postprocessing: Decorators for clean data pipeline
  • 📊 Health checks: Built-in /health endpoint
  • 📝 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 predictions
  • GET /health - Health check
  • GET / - API info
  • GET /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

fastmlapi-0.1.0.tar.gz (9.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fastmlapi-0.1.0-py3-none-any.whl (9.5 kB view details)

Uploaded Python 3

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

Hashes for fastmlapi-0.1.0.tar.gz
Algorithm Hash digest
SHA256 5e8d0b3f705e3f60b1b71ffce28c0424a388808fe7daf495629e924516ba894d
MD5 369702e5c42298b3e8e3817b34bf01bb
BLAKE2b-256 c897b69f93f7fd7a5c6d920fc4b6e316f602a84c47c90aadbe5785c920b45503

See more details on using hashes here.

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

Hashes for fastmlapi-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9b372a0b0e7a6d11e24240ab4d777edf972773c5b4c117d90ee00212faf64634
MD5 094041207bd24c3e5edb8398ca3e5f32
BLAKE2b-256 91eb89adcd5090d0c7f1bc0b559a1b7b15da2b58f4ddc570f68f9631a3768281

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page