Polymorphic structured configurations as dataclasses for ray jobs.
Project description
rayconfig
Polymorphic structured jsonargparse-friendly configurations as dataclasses for ray jobs.
Write jsonargparse CLI's for ray jobs.
Pass configurations as typed objects.
Configure hyperparameters search space.
Mainly rayconfig does the following:
- Enables conversion between python
dictand corresponding polymorphicdataclassby using the convention ofjsonargparseusingclass_pathandinit_argsconfig fieldsrayconfigadaptsdacite'sfrom_dictfunction to convert pythondictto corresponding pythondataclass.rayconfigadapts python'sdataclasses.asdictfunction to convert adataclassto a pythondict.
- Introduces
Param[T]type to enable configuring hyperparameters of typeTusing Ray Tune Search Space API
Installation
$ pip install rayconfig
Quick start
from dataclasses import dataclass
from rayconfig import asdict, from_dict
@dataclass
class Config:
user: str
port: int
config_dict = {
'user': 'Ahmed',
'port': 8080,
}
config_obj = Config(user='Ahmed', port=8080)
assert config_dict == asdict(config_obj)
assert config_obj == from_dict(data_class=Config, data=config_dict)
Basic Example
- Write polymorphic nested config types with tunable hyperparameters:
- All classes should be annotated with
@dataclass. - Extendable classes must inherit from
abc.ABC. - Tunable hyperparameters of type
Tshould useParam[T].
- All classes should be annotated with
from abc import ABC
from dataclasses import dataclass
from rayconfig import Param
@dataclass
class ModelConfig(ABC):
name: str
@dataclass
class ModelAConfig(ModelConfig):
n1_dropout: Param[float]
hidden_dim: Param[int]
@dataclass
class ModelBConfig(ModelConfig):
fc_out: Param[int]
embed_dim: Param[int]
@dataclass
class OptimizerConfig(ABC):
name: str
@dataclass
class OptimizerAConfig(OptimizerConfig):
lr: Param[float]
@dataclass
class OptimizerBConfig(OptimizerConfig):
lr: Param[float]
momentum: Param[float]
@dataclass
class TrainConfig:
model: ModelConfig
optimizer: OptimizerConfig
batch_size: Param[int]
- Write
jsonargparseCLI
from jsonargparse import ArgumentParser, ActionConfigFile
def main():
parser_train = ArgumentParser()
parser_train.add_argument("config", type=TrainConfig)
parser = ArgumentParser(prog="app")
parser.add_argument("--config", action=ActionConfigFile)
subcommands = parser.add_subcommands()
subcommands.add_subcommand("train", parser_train)
subcommands.add_subcommand("tune", parser_train)
config = parser.instantiate_classes(parser.parse_args())
if "train" in config:
train(config.train.config)
elif "tune" in config:
tune(config.tune.config)
if __name__ == "__main__":
main()
- Convert config object to dictionary when needed using
asdict
import ray
from rayconfig import asdict
def train(config: TrainConfig):
...
trainer = ray.train.torch.TorchTrainer(
train_func,
train_loop_config=asdict(config) # <--- HERE
)
...
result = trainer.fit()
...
def tune(config: TrainConfig):
...
trainer = ray.train.torch.TorchTrainer(
train_func,
)
...
tuner = ray.tune.Tuner(
trainer,
param_space={
"train_loop_config": asdict(config) # <--- HERE
},
)
...
result_grid = tuner.fit()
...
- Convert config dictionary to object when needed using
from_dict
from rayconfig import from_dict
def train_func(config_dict):
...
config = from_dict(data_class=TrainConfig, data=config_dict) # <--- HERE
...
optimizer = get_optimizer(config.optimizer)
...
model = get_model(config.model)
...
- Write configurations, e.g. yaml file:
- Classes extending from base classes must be qualified by
class_path, a python import path, and fields grouped underinit_args - Hyperparameters can take a single value or to be configured using Ray Tune Search Space API
- WARNING: currently
rayconfigusesevalto evaluate ray tune param configurations. This can introduce security risks. So, use with caution if you only trust your execution environment.
- Classes extending from base classes must be qualified by
tune:
config:
model:
class_path: app.ModelAConfig
init_args:
n1_dropout: ray.tune.uniform(0.4, 0.6)
hidden_dim: "ray.tune.sample_from(lambda _: 2 ** __import__('numpy').random.randint(7, 9))"
optimizer:
class_path: app.OptimizerBConfig
init_args:
lr: ray.tune.grid_search([0.001, 0.01, 0.1])
momentum: 0.9
batch_size: ray.tune.grid_search([32, 64, 128])
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 rayconfig-0.0.2.tar.gz.
File metadata
- Download URL: rayconfig-0.0.2.tar.gz
- Upload date:
- Size: 9.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd599cdfcb3f465219e4b72b502d88dad6ce7f6eeb12365240522852d9d8ca8d
|
|
| MD5 |
a7c042f604cb128e32f638b6927da9e8
|
|
| BLAKE2b-256 |
e0888806745c6fb85030830e30c090fe3fa88be409599168dcad48cb3a938ee7
|
File details
Details for the file rayconfig-0.0.2-py3-none-any.whl.
File metadata
- Download URL: rayconfig-0.0.2-py3-none-any.whl
- Upload date:
- Size: 9.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5d9e895f2785843149f0ffa944cfa580908132675aaa596f29fdaa3290988a89
|
|
| MD5 |
09ffcbf8bc1f79b5bb6b32cecfb2cbcc
|
|
| BLAKE2b-256 |
cf39bfea1878af836e1f3e6bc75047d2461594921b636cff3fb7a39507a1129e
|