Skip to main content

MLOps toolkit

Project description

Raine

Raine is an MLOps toolkit for the full model lifecycle: data preparation and feature engineering, training pipeline orchestration (Kubeflow), and model serving. The goal is reusable building blocks you can compose across local development and cloud deployment.

Status: only raine.serve.artifacts is implemented and documented today — packaging a handler, traced local code, model assets, and runtime dependencies into a self-contained bundle. Other areas of the repo are work in progress.

Install

pip install raine

Model packaging does not require LitServe. To run a LitServe-based handler, install the optional serve extra for convenience:

pip install "raine[serve]"

For PyTorch handlers, also install the torch extra. Other extras (gcp, train, data) cover optional tooling elsewhere in the repo and are not required for model packaging.

Exporting bundles (save_model)

save_model writes a PEP 751 pylock.toml by shelling out to the uv CLI when it is available. Put the uv executable on your PATH when you export (for example via uv's standalone installer). It does not need to be installed in the same Python environment as raine — only the command must be reachable.

If uv is missing, export still succeeds: raine writes pyproject.toml and emits a warning that pylock.toml was skipped. Install uv and re-run export, or run uv export --format pylock.toml --directory <bundle_dir> manually against the bundle directory.

Local dependencies are materialized into the artifact:

  • Source directories (PEP 508 @ file:./pkg, Poetry { path = \"...\" }, uv [tool.uv.sources] directory paths) are copied into vendors/ and rewritten as file:./vendors/<name> requirements.
  • Wheel files (PEP 508 @ file:...whl or source-table paths ending in .whl) are copied into vendors/ and rewritten as file:./vendors/<name>.whl requirements.

You do not need uv at all if you use another installer. The artifact pyproject.toml is standard PEP 621 — Poetry, pip, pdm, etc. can install from it. A Poetry consumer can run poetry lock / poetry install in the bundle directory and ignore pylock.toml entirely.

Model bundles

save_model writes a directory like:

my_model/
├── code/              # traced local Python (handler + imports)
├── artifacts/         # weights, configs, and other assets
├── artifacts.json     # logical name → bundle path index
├── pyproject.toml     # merged runtime dependencies
├── vendors/           # local source and .whl deps (copied when referenced)
└── pylock.toml        # locked deps (when uv is on PATH; optional)

At serving time, load the handler with from_bundle. In setup(), access bundle assets via self.context.artifacts, similar to MLflow's PythonModelContext.

Quick start

RaineModel is a mixin — it does not depend on any serving framework. The example below uses LitServe (pip install "raine[serve]"); mix it with your own base class instead if you prefer.

import litserve as ls
from raine.serve.artifacts import RaineModel

class MyInferenceAPI(RaineModel, ls.LitAPI):
    def __init__(self):
        super().__init__(max_batch_size=1)

    def setup(self, device):
        weights = self.context.artifacts["weights"]
        config = self.context.artifacts["config"]
        ...

api = MyInferenceAPI.from_bundle("/path/to/my_model", max_batch_size=1)
ls.LitServer(api).run(port=8080)

Export from a dedicated script:

handler = MyInferenceAPI()
handler.save_model(
    output_dir="./my_model",
    artifacts={
        "config": "/path/to/config.json",
        "weights": "/path/to/weights",
    },
)

Common options

Parameter Purpose
source_dir Root for code tracing (defaults to the handler module directory)
code_seeds Extra modules/classes to include in code/
code_renames Rename files in the bundle, e.g. {"inference_en.py": "inference.py"}
dependency_extras PEP 621 optional deps from your pyproject.toml
dependency_groups uv/poetry dependency groups to merge
extra_dependencies Extra PEP 508 reqs merged last; local @ file:... dirs and wheels are copied into vendors/
include_base When false, skip source [project].dependencies; merge only extras/groups/overrides
pyproject_toml_path Explicit deps manifest (overrides upward search)

Local testing without a full export

Use staged_handler to symlink a bundle layout and yield a loaded handler:

from raine.serve.artifacts import staged_handler

with staged_handler(
    MyInferenceAPI,
    artifacts={"weights": weights_path, "config": config_path},
    source_dir=handler_dir,
    code_renames={"inference_en.py": "inference.py"},
    max_batch_size=1,
) as api:
    ls.LitServer(api).run(port=8080)

Example

See examples/artifact_packaging/ for a minimal export script, handler, and sample assets.

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

raine-0.1.3.tar.gz (305.4 kB view details)

Uploaded Source

Built Distribution

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

raine-0.1.3-py3-none-any.whl (69.1 kB view details)

Uploaded Python 3

File details

Details for the file raine-0.1.3.tar.gz.

File metadata

  • Download URL: raine-0.1.3.tar.gz
  • Upload date:
  • Size: 305.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.17 {"installer":{"name":"uv","version":"0.11.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for raine-0.1.3.tar.gz
Algorithm Hash digest
SHA256 5293794bb3527b9b21d3eb91847f926c116d039d6434b64946a61b06c8c50f27
MD5 06a5f39336ba7ca98ffd7891f8976976
BLAKE2b-256 cf392c557a352b59b64dc6a00a5af1558fdfc40c49812fb96b5f5a4d6d3bf6a7

See more details on using hashes here.

File details

Details for the file raine-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: raine-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 69.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.17 {"installer":{"name":"uv","version":"0.11.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for raine-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 698f6eca11cfdbdac28294519bc5764ffb137d1046bcdc2dfeb512b83b014622
MD5 18a87254e44206db8d2b89e40272d782
BLAKE2b-256 ca0d79f06fc07a2d7c98a9c4101d26b53fa0c6340e7e00a097604c19039a68a2

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