Deployment tooling for aiSSEMBLE Open Inference Protocol - generates Docker, Kubernetes, and KServe configs
Project description
aiSSEMBLE OIP Deploy
Deployment tooling for aiSSEMBLE Open Inference Protocol - generates deployment configurations for OIP-compatible models.
Overview
aissemble-oip-deploy provides CLI tooling to generate deployment configurations for any OIP-compatible model. Users run a command, get version-controlled configs in their project, and can re-run to update while preserving customizations.
Key Value: Not just "possible to deploy" but "easy to deploy" - enterprise-ready, repeatable, version-controlled.
Extensibility: Generators are discovered via Python entry points, allowing custom deployment targets (OpenShift, AWS SageMaker, air-gapped registries) to be added as separate packages.
Installation
pip install aissemble-oip-deploy
Or with uv:
uv add aissemble-oip-deploy
Quick Start
Navigate to your project directory (containing a models/ directory with your model configurations), then:
# Generate local deployment scripts
oip deploy init --target local
# Start MLServer locally
cd deploy/local && ./run-mlserver.sh
Or for containerized deployment:
# Generate Docker deployment configs
oip deploy init --target docker
# Build and run with Docker Compose
cd deploy/docker && docker-compose up --build
Or for Kubernetes:
# Generate Kubernetes manifests (uses Docker image from above)
oip deploy init --target docker --target kubernetes
# Build Docker image, then deploy to K8s
docker build -t my-app:latest -f deploy/docker/Dockerfile .
kubectl apply -k deploy/kubernetes/base
Or for KServe (serverless ML with scale-to-zero):
# Generate KServe manifests (uses Docker image from above)
oip deploy init --target kserve
# Build and push Docker image, then deploy to KServe
docker build -t my-registry/my-app:v1.0.0 -f deploy/docker/Dockerfile .
docker push my-registry/my-app:v1.0.0
kubectl apply -f deploy/kserve/serving-runtime.yaml
kubectl apply -f deploy/kserve/inference-service.yaml
CLI Reference
oip deploy init
Initialize deployment configurations for your models.
oip deploy init [OPTIONS]
Options:
--target, -t- Deployment target(s) to generate (default: local). Can be specified multiple times.--model-dir, -m- Path to models directory (default: ./models)--output-dir, -o- Output directory for generated configs (default: ./deploy)--project-dir, -p- Project root directory (default: current directory)
Examples:
# Generate local deployment only
oip deploy init --target local
# Generate Docker deployment
oip deploy init --target docker
# Generate Kubernetes manifests
oip deploy init --target kubernetes
# Generate KServe manifests (serverless ML)
oip deploy init --target kserve
# Generate multiple targets
oip deploy init --target local --target docker --target kubernetes --target kserve
# Generate for all available targets
oip deploy init --target all
oip deploy list-targets
List available deployment targets. Generators are discovered via entry points.
oip deploy list-targets
Built-in Generators
| Target | Description | Status |
|---|---|---|
local |
Local MLServer scripts for development | Available |
docker |
Containerized deployment with Docker Compose | Available |
kubernetes |
Standard K8s Deployment + Service with Kustomize | Available |
kserve |
KServe InferenceService with scale-to-zero | Available |
Generated Output Structure
After running oip deploy init, your project will have:
your-project/
models/
your-model/
model-settings.json
deploy/
.oip-deploy.yaml # Tracks generation metadata
local/
run-mlserver.sh # Start MLServer locally
README.md # Local deployment instructions
docker/
Dockerfile # Multi-stage build for MLServer
docker-compose.yml # Local container testing
.dockerignore # Build context exclusions
README.md # Docker deployment instructions
kubernetes/
base/
deployment.yaml # K8s Deployment with health checks
service.yaml # ClusterIP Service
kustomization.yaml # Kustomize base config
overlays/
dev/
kustomization.yaml # Dev overlay (1 replica, lower resources)
prod/
kustomization.yaml # Prod overlay (2 replicas, higher resources)
README.md # Kubernetes deployment instructions
kserve/
serving-runtime.yaml # KServe ServingRuntime (shared runtime config)
inference-service.yaml # KServe InferenceService with scale-to-zero
README.md # KServe deployment instructions
Note: The Kubernetes and KServe generators use the Docker image built by the Docker generator. This keeps things DRY - the Dockerfile is defined once and reused across Docker Compose, Kubernetes, and KServe deployments.
Configuration Tracking
The .oip-deploy.yaml file tracks:
- Generator version used
- When configs were generated
- Which targets were generated
- Checksums of generated files (for future update/merge functionality)
Creating Custom Generators
Custom generators can be added via the oip.generators entry point. This is useful for:
- Air-gapped environments with internal registries
- Platform-specific deployments (OpenShift, AWS SageMaker, etc.)
- Organization-specific deployment patterns
Step 1: Create Your Generator
# my_org_deploy/openshift.py
from aissemble_oip_deploy import Generator, ModelInfo
from pathlib import Path
class OpenShiftGenerator(Generator):
"""Generator for OpenShift deployments."""
name = "openshift"
def generate(self, models: list[ModelInfo] | None = None) -> list[Path]:
if models is None:
models = self.detect_models()
generated_files = []
target_dir = self.output_dir / "openshift"
# Generate OpenShift-specific configs
content = self.render_template(
"openshift/deployment-config.yaml.j2",
{"models": models, "registry": "my-internal-registry.example.com"}
)
path = self.write_file(target_dir / "deployment-config.yaml", content)
generated_files.append(path)
return generated_files
Step 2: Register via Entry Point
# pyproject.toml
[project.entry-points."oip.generators"]
openshift = "my_org_deploy.openshift:OpenShiftGenerator"
Step 3: Install and Use
pip install my-org-deploy
oip deploy list-targets # Shows 'openshift' alongside built-in targets
oip deploy init --target openshift
License
Apache 2.0
Project details
Release history Release notifications | RSS feed
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 aissemble_oip_deploy-1.5.0rc2.tar.gz.
File metadata
- Download URL: aissemble_oip_deploy-1.5.0rc2.tar.gz
- Upload date:
- Size: 42.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.24 {"installer":{"name":"uv","version":"0.9.24","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 |
43d6249606ebe5d543ba38dda49416b368ecfcb2f181d36cf0a3107e0da96b42
|
|
| MD5 |
7fb13b83b5c4325621a10af9a920c55c
|
|
| BLAKE2b-256 |
d81cb60cae580edfbd6f928b0c94ab69f26e0e449f49e7db7830061ec0be8b44
|
File details
Details for the file aissemble_oip_deploy-1.5.0rc2-py3-none-any.whl.
File metadata
- Download URL: aissemble_oip_deploy-1.5.0rc2-py3-none-any.whl
- Upload date:
- Size: 40.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.24 {"installer":{"name":"uv","version":"0.9.24","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 |
d1e65fb18d0b0b28542287608557c3e3e548fd1440772d11d99318206377456b
|
|
| MD5 |
f00d359062cf322ca0f2b52a8a576100
|
|
| BLAKE2b-256 |
0e0e71d50322f360a91dab0955969fa643491179efafb9d489d2b4aef5de0724
|