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.4.tar.gz (305.6 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.4-py3-none-any.whl (69.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: raine-0.1.4.tar.gz
  • Upload date:
  • Size: 305.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","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.4.tar.gz
Algorithm Hash digest
SHA256 7d001ae44791ecbff3496b7eb64af21fdccdf61615a3e63670eacf07f73d8d79
MD5 60cf1e2d4936e05d688a665cadc8e943
BLAKE2b-256 8a458659112c993d0521eec4a322d6901b467727db35670b304d0ed9616a2621

See more details on using hashes here.

File details

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

File metadata

  • Download URL: raine-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 69.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","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.4-py3-none-any.whl
Algorithm Hash digest
SHA256 3c0863f0d3124648e2219d1319360a1ecce2c5c1aa487ca0635d069da9fd0238
MD5 dbafae9973dfd2039a090f5b1474e4bf
BLAKE2b-256 0f1ed96196312176f5c9ffe8524069d92ae947c806b5ffc25405c7b1afbee6ea

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