Skip to main content

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: NeuralNetworkFlow template automatically loads a standard config.json expected 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 @pypi for 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 publish in this document
  • Use "" for latest or pin to specific version for stability
  • --environment=fast-bakery enables @pypi_base decorator

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

  1. Complex configs - Manage hundreds of parameters via JSON files
  2. Selective overrides - Change specific params via CLI without modifying flows
  3. Centralized logic - Write config resolution once in NeuralNetworkFlow, inherit everywhere
  4. 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

min_obproject-0.1.8.tar.gz (39.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

min_obproject-0.1.8-py3-none-any.whl (5.9 kB view details)

Uploaded Python 3

File details

Details for the file min_obproject-0.1.8.tar.gz.

File metadata

  • Download URL: min_obproject-0.1.8.tar.gz
  • Upload date:
  • Size: 39.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.16

File hashes

Hashes for min_obproject-0.1.8.tar.gz
Algorithm Hash digest
SHA256 dc3ffb819eb08370b0a0f5a01949d22bd212f2cfaff04443115e849785f5e968
MD5 f423245fa2fff39cfac0ac46ac3c04b8
BLAKE2b-256 b0fc19303b4a450c525ad3de609f8ca0d8a13273c1c8cb07cf937e8e8fe68207

See more details on using hashes here.

File details

Details for the file min_obproject-0.1.8-py3-none-any.whl.

File metadata

File hashes

Hashes for min_obproject-0.1.8-py3-none-any.whl
Algorithm Hash digest
SHA256 6dcea625395813cf6c98bcce97da07161c2ed6fbb848e6e34e7aea4b987a7cf6
MD5 5817a077674e83bb1925241cba298e1a
BLAKE2b-256 6c8202da494281e7f87a9e985cc4cf1429b1e1c281299b7679181097aebf9a14

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