Reusable Outerbounds project patterns.
Project description
min-obproject
Reusable Outerbounds flow templates. Demonstrates how to build ML projects with complex configurations in an extensible way.
Quick Start
# 1. Install editable package
curl -LsSf https://astral.sh/uv/install.sh | sh
uv pip install -e .
# 2. Run example flow locally
python flows/02-projectflow-inheritance/flow.py run --lr 0.5
# 3. Run on Kubernetes (requires @pypi_base uncommented + published to PyPI)
python flows/02-projectflow-inheritance/flow.py --environment=fast-bakery run --with kubernetes --lr 0.5
Key Features
- Base flow + configs with overrides:
NeuralNetworkFlowtemplate automatically loads a standardconfig.jsonexpected to be present for each inheriting flow. Override specific config values via CLI Parameters without flow boilerplate. - Reusable templates: Write the flow logic once, inherit across flows and projects.
- Fast changing and consistent dependencies: Toggle
@pypifor local dev (editable install) vs. remote (PyPI install).
The @pypi_base Toggle Pattern
Core concept: Comment/uncomment one decorator to switch between local and remote execution.
Important: @pypi_base requires --environment=fast-bakery flag. Local runs without the decorator don't need this flag.
Local development (decorator commented out):
# @pypi_base(packages={"min-obproject": ""})
class MyFlow(ProjectFlow, NeuralNetworkFlow):
...
- Uses editable install from
uv pip install -e . - Faster iteration, no publishing required --> comment out @pypi_base in the workflows since we don't want to reinstall.
- Avoids platform-specific wheel issues with @pypi on workstation environment that doesn't match prod (e.g., mac vs linux).
Remote execution (decorator uncommented + --environment=fast-bakery):
@pypi_base(packages={"min-obproject": ""}) # "" = latest, or pin: "0.1.1"
class MyFlow(ProjectFlow, NeuralNetworkFlow):
...
- Installs from PyPI in remote containers
- Requires package published to PyPI, as demonstrated with
uv publishin this document - Use
""for latest or pin to specific version for stability --environment=fast-bakeryenables@pypi_basedecorator
Repository Structure
min-obproject/
├── src/
│ └── flow_templates.py # NeuralNetworkFlow base template
├── flows/
│ ├── 01-config-override/ # Basic config + parameter override
│ └── 02-projectflow-inheritance/ # Template inheritance example
├── pyproject.toml
└── obproject.toml
Example Flows
Flow 1: Config Override (01-config-override/)
Basic pattern showing config loading and parameter overrides.
from metaflow import FlowSpec, step, Config, Parameter
class ConfigOverrideFlow(FlowSpec):
base_config = Config("config", default="config.json")
lr = Parameter('lr', default=None, type=float)
def _resolve_config(self):
train_args = dict(self.base_config['train_args'])
if self.lr:
train_args['lr'] = self.lr
self.config = train_args
@step
def start(self):
self._resolve_config()
print(f"Config: {self.config}")
self.next(self.end)
@step
def end(self):
pass
Run:
python flows/01-config-override/flow.py run --lr 0.01
Flow 2: Template Inheritance (02-projectflow-inheritance/)
Reuses NeuralNetworkFlow template - no need to redefine config logic.
from metaflow import step, pypi_base
from obproject import ProjectFlow
from src.flow_templates import NeuralNetworkFlow
# Toggle for local/remote execution
# @pypi_base(packages={"min-obproject": ""})
class CustomizedTrainingFlow(ProjectFlow, NeuralNetworkFlow):
@step
def start(self):
self._resolve_config() # Inherited method
self.next(self.end)
@step
def end(self):
print(f"Config: {self.config}")
config.json (same directory as flow):
{
"train_args": {
"lr": 0.001,
"optimizer": "lbfgs"
}
}
Run:
# Local
python flows/02-projectflow-inheritance/flow.py run --lr 1.2
# Remote (uncomment @pypi_base first)
python flows/02-projectflow-inheritance/flow.py --environment=fast-bakery run --with kubernetes --lr 1.2
Publishing for Remote Execution
When you need to run on Kubernetes/AWS Batch:
# Build and publish
uv build
uv publish
# Or test PyPI first
uv publish --publish-url https://test.pypi.org/legacy/
Then uncomment @pypi_base in your flow and run with --environment=fast-bakery run --with kubernetes.
Deploy to Argo Workflows
# Ensure @pypi_base is uncommented, then:
python flows/02-projectflow-inheritance/flow.py --environment=fast-bakery argo-workflows create
Trigger from Outerbounds UI after overriding learning rate -> CustomizedTrainingFlow will launch a new run.
Benefits of This Pattern
- Complex configs - Manage hundreds of parameters via JSON files
- Selective overrides - Change specific params via CLI without modifying flows
- Centralized logic - Write config resolution once in
NeuralNetworkFlow, inherit everywhere - No boilerplate - Flows that inherit the template get config handling for free
Requirements
- Python 3.12
uv pip install -e .for local development- Published to PyPI for remote execution
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 min_obproject-0.1.5.tar.gz.
File metadata
- Download URL: min_obproject-0.1.5.tar.gz
- Upload date:
- Size: 24.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fca9463f931aed2450afa7b7036ae6cdd4e4fa59d9c0ab1a0e1a2c0f64bc87c7
|
|
| MD5 |
d07c441cf726b56d722f04dd234d1e16
|
|
| BLAKE2b-256 |
62a10297feec55e1faa4a2a41d8e03774baf3e27e4b9bd7e02717487ab97e04c
|
File details
Details for the file min_obproject-0.1.5-py2.py3-none-any.whl.
File metadata
- Download URL: min_obproject-0.1.5-py2.py3-none-any.whl
- Upload date:
- Size: 4.8 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3f17b296d5a302184ca956d18e710548f9ad758e2895e2f01f873a3d0f758ca7
|
|
| MD5 |
23d3ec0ff1053a6e8db6fb40c82bd73b
|
|
| BLAKE2b-256 |
95cdcc22667d7356581560441dbeb782bfcddfb4db5829fa377521c2117a66f1
|