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 proprietary wheels referenced via PEP 508 @ file:... (or [tool.uv.sources] paths ending in .whl) are copied into wheels/ and rewritten as portable file:./wheels/<name>.whl entries in the artifact manifest.

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
├── wheels/            # local .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; @ file:... wheels copied into wheels/
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.2.tar.gz (303.2 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.2-py3-none-any.whl (67.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: raine-0.1.2.tar.gz
  • Upload date:
  • Size: 303.2 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.2.tar.gz
Algorithm Hash digest
SHA256 0cd49211927505ed2228ff70cb2e41113d1269db4e1f0ff96227339fe80c299f
MD5 2fedb2811c18a5f58c248e2ef9d37963
BLAKE2b-256 71a17893e1c832f0cd8bb9209a529d94595dc1aa25e57808928b9df03b5299d2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: raine-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 67.4 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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 a28fc09dbace783b329289dba9453ad038d1cc96e3ceb3c549c07591f8064125
MD5 efccdfcb30a3bfc7f914d976b3e7d030
BLAKE2b-256 46fbcc5d9042cbeae52c066c10b5c8f21f9e1f793badff3e39ca00547bb98182

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