Skip to main content

Slayer of Hydra

Project description

Heracls - Slayer of Hydra

heracls is a tiny utility package to instantiate typed dataclasses from flexible config sources (dictionary, OmegaConf, YAML, dotlist, CLI, ...). It is designed for projects that want strict, typed config objects while supporting the dynamic overrides commonly used in scripts and experiments.

Installation

The heracls package is available on PyPi and can be installed with pip.

pip install heracls

Alternatively, if you need the latest features, you can install it from source.

pip install git+https://github.com/francois-rozet/heracls

Getting started

The following example demonstrates how to declare a nested dataclass config, instantiate it from command line arguments, serialize it to YAML, and use it in a script. The heracls.ArgumentParser parser infers arguments from the dataclass structure and types.

from dataclasses import dataclass, field
from typing import Literal, Union

import heracls

@dataclass
class ModelConfig:
    name: str = "mlp"
    depth: int = 3
    width: int = 256

@dataclass
class AdamConfig:
    name: Literal["adam"] = "adam"
    betas: tuple[float, float] = (0.95, 0.95)
    learning_rate: float = 1e-3
    weight_decay: float = 0.0

@dataclass
class SGDConfig:
    name: Literal["sgd"] = "sgd"
    momentum: float = 0.0
    learning_rate: float = 1e-3
    weight_decay: float = 0.0
    nesterov: bool = False

@dataclass
class TrainConfig:
    model: ModelConfig = field(default_factory=ModelConfig)
    optimizer: Union[AdamConfig, SGDConfig] = heracls.choice(
        {"adam": AdamConfig, "sgd": SGDConfig},
        default="adam",
    )
    dataset: str = "mnist"
    data_splits: tuple[float, ...] = (0.8, 0.1)
    n_epochs: int = 1024
    n_steps_per_epoch: int = 256
    tasks: list[str] = field(default_factory=list)

def main():
    parser = heracls.ArgumentParser()
    parser.add_argument("--dry", action="store_true", help="dry run")
    parser.add_arguments(TrainConfig, dest="train", root=True)

    args = parser.parse_args()

    print(heracls.to_yaml(args.train))

    if args.dry:
        return

    trainset, validset, testset = load_dataset(args.train.data_splits)

    model = init_model(args.train.model)

    for epoch in range(args.train.n_epochs):
        ...

if __name__ == "__main__":
    main()
$ python train.py --dry --model.depth 5 --optimizer sgd --data_splits 0.7 0.2
model:
  name: mlp
  depth: 5
  width: 256
optimizer:
  name: sgd
  momentum: 0.0
  learning_rate: 0.001
  weight_decay: 0.0
  nesterov: false
dataset: mnist
data_splits:
- 0.7
- 0.2
n_epochs: 1024
n_steps_per_epoch: 256
tasks: []
$ python train.py --help
usage: train.py [-h] [--dry] [--model.name str] [--model.depth int] [--model.width int]
                [--optimizer {adam,sgd}] [--dataset str] [--data_splits float [float ...]]
                [--n_epochs int] [--n_steps_per_epoch int] [--tasks [str ...]]
                [--optimizer.name {adam}] [--optimizer.betas float float]
                [--optimizer.learning_rate float] [--optimizer.weight_decay float]

optional arguments:
  -h, --help                       show this help message and exit
  --dry                            dry run (default: False)

  --optimizer {adam,sgd}           (default: adam)
  --dataset str                    (default: mnist)
  --data_splits float [float ...]  (default: (0.8, 0.1))
  --n_epochs int                   (default: 1024)
  --n_steps_per_epoch int          (default: 256)
  --tasks [str ...]                (default: [])

model:
  --model.name str                 (default: mlp)
  --model.depth int                (default: 3)
  --model.width int                (default: 256)

optimizer:
  --optimizer.name {adam}          (default: adam)
  --optimizer.betas float float    (default: (0.95, 0.95))
  --optimizer.learning_rate float  (default: 0.001)
  --optimizer.weight_decay float   (default: 0.0)

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

heracls-0.4.0.tar.gz (9.5 kB view details)

Uploaded Source

Built Distribution

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

heracls-0.4.0-py3-none-any.whl (8.4 kB view details)

Uploaded Python 3

File details

Details for the file heracls-0.4.0.tar.gz.

File metadata

  • Download URL: heracls-0.4.0.tar.gz
  • Upload date:
  • Size: 9.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.15 {"installer":{"name":"uv","version":"0.9.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for heracls-0.4.0.tar.gz
Algorithm Hash digest
SHA256 f2e267c0596a9fe4ae141c1d9a6d89e8c2e6a737b40842bf29cc83d239bca39e
MD5 a45e0154cfdafdae7ba68f7dce195909
BLAKE2b-256 021cd8004610545d0370772de99c99699f093807663d2ac41778725377c5c645

See more details on using hashes here.

File details

Details for the file heracls-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: heracls-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 8.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.15 {"installer":{"name":"uv","version":"0.9.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for heracls-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6d5a07abb9487adbcac57378d2551bc19d47a9b9faee8b7c177d42969799f5bc
MD5 bcf5242c53aa1985c0043b998bcd3888
BLAKE2b-256 611a350e01f07d142ca4e7e1098521940e5510831e6aed1d1bb74ce377e2260b

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