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 intovendors/and rewritten asfile:./vendors/<name>requirements. - Wheel files (PEP 508
@ file:...whlor source-table paths ending in.whl) are copied intovendors/and rewritten asfile:./vendors/<name>.whlrequirements.
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
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 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7d001ae44791ecbff3496b7eb64af21fdccdf61615a3e63670eacf07f73d8d79
|
|
| MD5 |
60cf1e2d4936e05d688a665cadc8e943
|
|
| BLAKE2b-256 |
8a458659112c993d0521eec4a322d6901b467727db35670b304d0ed9616a2621
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3c0863f0d3124648e2219d1319360a1ecce2c5c1aa487ca0635d069da9fd0238
|
|
| MD5 |
dbafae9973dfd2039a090f5b1474e4bf
|
|
| BLAKE2b-256 |
0f1ed96196312176f5c9ffe8524069d92ae947c806b5ffc25405c7b1afbee6ea
|