Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/fidelity/spock

spock is a framework that helps manage complex parameter configurations during research and development of Python applications
https://github.com/fidelity/spock

configuration-management machine-learning python3

Last synced: about 2 months ago
JSON representation

spock is a framework that helps manage complex parameter configurations during research and development of Python applications

Awesome Lists containing this project

README

        



Managing complex configurations any other way would be highly illogical...















Quick Start
ยท
Documentation
ยท
Examples
ยท
Releases


## About

`spock` is a framework that helps users easily define, manage, and use complex parameter configurations within Python
applications. It lets you focus on the code you need to write instead of re-implementing boilerplate code such as
creating ArgParsers, reading configuration files, handling dependencies, implementing type validation,
maintaining traceability, etc.

`spock` configurations are normal python classes that are decorated with `@spock`. It supports
inheritance, dynamic class dependencies, loading/saving configurations from/to multiple markdown formats, automatically
generating CLI arguments, and hierarchical configuration by composition.

## ๐Ÿ’ฅ Why You Should Use Spock ๐Ÿ’ฅ

* Simple organized parameter definitions (i.e. a single line)
* Type checked (static-eqsue) & frozen parameters (i.e. fail early during long ML training runs)
* Complex parameter dependencies made simple (i.e. `@spock` class with a parameter that is an Enum of other
`@spock` classes)
* Fully serializable parameter state(s) (i.e. exactly reproduce prior runtime parameter configurations)
* Automatic type checked CLI generation w/o argparser boilerplate (i.e click and/or typer for free!)
* Easily maintain parity between CLIs and Python APIs (i.e. single line changes between CLI and Python API definitions)
* Unified hyper-parameter definitions and interface (i.e. don't write different definitions for Ax or Optuna)
* Resolver that supports value definitions from reference to other defined variables, environmental variables, dynamic template re-injection, and encryption of sensitive values

## Key Features

* [Simple Declaration](https://fidelity.github.io/spock/basics/Define): Type checked parameters are
defined within a `@spock` decorated class. Supports required/optional and automatic defaults.
* Easily Managed Parameter Groups: Each class automatically generates its own object within a single namespace.
* [Parameter Inheritance](https://fidelity.github.io/spock/advanced_features/Inheritance): Classes support
inheritance (w/ lazy evaluation of inheritance/dependencies) allowing for complex configurations derived from
a common base set of parameters.
* [Complex Types](https://fidelity.github.io/spock/advanced_features/Advanced-Types/): Nested Lists/Tuples,
List/Tuples of Enum of `@spock` classes, List of repeated `@spock` classes
* Multiple Configuration File Types: Configurations are specified from YAML, TOML, or JSON files.
* [Hierarchical Configuration](https://fidelity.github.io/spock/advanced_features/Composition/): Compose from
multiple configuration files via simple include statements.
* [Command-Line Overrides](https://fidelity.github.io/spock/advanced_features/Command-Line-Overrides/): Quickly
experiment by overriding a value with automatically generated command line arguments.
* Immutable: All classes are *frozen* preventing any misuse or accidental overwrites (to the extent they can be in
Python).
* [Tractability and Reproducibility](https://fidelity.github.io/spock/basics/Saving): Save runtime
parameter configuration to YAML, TOML, or JSON with a single chained command (with extra runtime info such as Git info,
Python version, machine FQDN, etc). The saved markdown file can be used as the configuration input to reproduce
prior runtime configurations.
* [Hyper-Parameter Tuner Addon](https://fidelity.github.io/spock/addons/tuner/About): Provides a unified
interface for defining hyper-parameters (via `@spockTuner` decorator) that supports various tuning/algorithm
backends (currently: Optuna, Ax)
* [S3 Addon](https://fidelity.github.io/spock/addons/S3): Automatically detects `s3://` URI(s) and handles loading
and saving `spock` configuration files when an active `boto3.Session` is passed in (plus any additional
`S3Transfer` configurations)

## Quick Install

The basic install and `[s3]` extension require Python 3.7+ while the `[tune]` extension requires Python 3.8+

| Base | w/ S3 Extension | w/ Hyper-Parameter Tuner |
|------|-----------------|--------------------------|
| `pip install spock-config` | `pip install spock-config[s3]` | `pip install spock-config[tune]` |

## News/Releases

See [Releases](https://github.com/fidelity/spock/releases) for more information.


Recent Changes

#### August 30th, 2023
* Removed Python 3.6 support as it was causing dependency hell
* Collection of bugfixes

#### Jan 12th, 2023
* Added support for resolving value definitions from references to other defined variables with the following syntax,`${spock.var:SpockClass.defined_variable}`
* Added support for new fundamental types: (1) file: this is an overload of a str that verifies file existence and (r/w) access (2) directory: this is an overload of a str that verifies directory existence, creation if not existing, and (r/w) access
* Deprecated support for `List` of repeated `@spock` decorated classes.
* Collection of bugfixes

#### May 17th, 2022
* Added support for resolving value definitions from environmental variables with the following syntax,
`${spock.env:name, default}`
* Added `.inject` annotation that will write back the original env notation to the saved output
* Added the `.crypto` annotation which provides a simple way to hide sensitive environmental
variables while still maintaining the written/loadable state of the spock config

#### March 17th, 2022
* Added support for `typing.Callable` types (includes advanced types such as `List[List[Callable]]`)
* Added support for `typing.Dict` types with type checking for types of both keys and values (includes advanced types
such as `Dict[str, Tuple[Callable, Callable]]`)
* Added support for post init hooks that allow for validation on parameters defined within `@spock` decorated classes.
Additionally, added some common validation check to utils (within, greater than, less than, etc.)
* Updated unit tests to support Python 3.10

#### January 26th, 2022
* Added `evolve` support to the underlying `SpockBuilder` class. This provides functionality similar to the underlying attrs library ([attrs.evolve](https://www.attrs.org/en/stable/api.html#attrs.evolve)). `evolve()` creates a new `Spockspace` instance based on differences between the underlying declared state and any passed
in instantiated `@spock` decorated classes.

## Original Implementation

`spock` was originally developed by the **Artificial Intelligence Center of Excellence at Fidelity Investments** by [Nicholas Cilfone](https://github.com/ncilfone) and [Siddharth Narayanan](https://github.com/sidnarayanan)