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
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 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f2e267c0596a9fe4ae141c1d9a6d89e8c2e6a737b40842bf29cc83d239bca39e
|
|
| MD5 |
a45e0154cfdafdae7ba68f7dce195909
|
|
| BLAKE2b-256 |
021cd8004610545d0370772de99c99699f093807663d2ac41778725377c5c645
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6d5a07abb9487adbcac57378d2551bc19d47a9b9faee8b7c177d42969799f5bc
|
|
| MD5 |
bcf5242c53aa1985c0043b998bcd3888
|
|
| BLAKE2b-256 |
611a350e01f07d142ca4e7e1098521940e5510831e6aed1d1bb74ce377e2260b
|