Skip to content

Repository files navigation

Hyperparameter Logo

Hyperparameter

ENGLISH | 中文文档

Make configurable AI applications. Build for Python/Rust hackers.

Hyperparameter is a versatile library designed to streamline the management and control of hyperparameters in machine learning algorithms and system development. Tailored for AI researchers and Machine Learning Systems (MLSYS) developers, Hyperparameter offers a unified solution with a focus on ease of use in Python, high-performance access in Rust and C++, and a set of macros for seamless hyperparameter management.

5-Minute Try

pip install hyperparameter
# Run a ready-to-use demo
python -m hyperparameter.examples.quickstart
# Try the @hp.param CLI: override defaults from the command line
python -m hyperparameter.examples.quickstart --define greet.name=Alice --enthusiasm=3
# Inspect params and defaults
python -m hyperparameter.examples.quickstart -lps
python -m hyperparameter.examples.quickstart -ep greet.name
# Running from source? Use module mode or install editable# python -m hyperparameter.examples.quickstart# or: pip install -e .

Why Hyperparameter?

🚀 Unmatched Performance (vs Hydra)

Hyperparameter is built on a high-performance Rust backend, making it significantly faster than pure Python alternatives like Hydra, especially in inner-loop parameter access.

MethodTime (1M iters)Speedup (vs Hydra)
HP: Injected (Native Speed)0.0184s856.73x 🚀
HP: Dynamic (Optimized)2.4255s6.50x ⚡️
Hydra (Baseline)15.7638s1.00x

Benchmark scenario: Accessing a nested parameter model.layers.0.size 1,000,000 times in a loop. See benchmark/ folder for reproduction scripts.

✨ Zero-Dependency Schema Validation

Hyperparameter supports structural validation using standard Python type hints without introducing heavy dependencies (like Pydantic or OmegaConf).

fromdataclassesimportdataclassimporthyperparameterashp@dataclassclassAppConfig:
host: strport: intdebug: bool=False# Validates types and converts automatically: "8080" -> 8080 (int)cfg=hp.config("config.toml", schema=AppConfig)

Key Features

For Python Users

  • Pythonic Syntax: Define hyperparameters using keyword argument syntax;
    • Intuitive Scoping: Control parameter scope through with statement;
    • Configuration File: Easy to load parameters from config files (JSON/TOML/YAML) with composition and interpolation support;
    • Zero-Overhead Validation: Optional schema validation using standard Python type hints;

For Rust and C++ Users

  • High-Performance Backend: Hyperparameter is implemented in Rust, providing a robust and high-performance backend for hyperparameter management. Access hyperparameters in Rust and C++ with minimal overhead, making it ideal for ML and system developers who prioritize performance.

  • Macro-Based Parameter Management: Hyperparameter provides a set of macros for both Rust and C++ users. These macros mimic Python's with statements and adhere to language-specific scoping rules.

  • Compile-Time Hashing: Both Rust and C++ interfaces utilize compile-time hashing of hyperparameter names, reducing runtime hash computation overhead.

Quick Start

Installation

pip install hyperparameter

Python

importhyperparameterashp@hp.param("foo")deffoo(x=1, y="a"):
returnf"x={x}, y={y}"foo() # x=1, y='a'withhp.scope(**{"foo.x": 2}):
foo() # x=2, y='a'

Rust

fnfoo() -> i32{with_params!{
@get x = foo.x or 1i32;// Read hyperparameter with default value
println!("x={}", x);}}fnmain(){foo();// x=1with_params!{
@set foo.x = 2i32;// Set hyperparameter
foo();// x=2}foo();// x=1}

C++

ASSERT(1 == GET_PARAM(a.b, 1), "get undefined param");
{
auto guard = WITH_PARAMS(a, 1, //
a.b, 2.0, //
a.b.c, true, //
a.b.c.d, "str");
ASSERT(1 == GET_PARAM(a, 0), "get int value");
ASSERT(1 == GET_PARAM(a, 0), "get int value");
}

Detailed Usage Examples

Support for Default Values

Python

x=hp.scope.foo.x|"default value"

Rust

@get x = foo.x or "default value";

Scope Control of Parameter Values

Python

withhp.scope() asps: # 1st scope startps.foo.x=1withhp.scope() asps2: # 2nd scope startps.foo.y=2# 2nd scope end# 1st scope end

Rust

with_params!{// 1st scope start
@set foo.x=1;
with_params!{//2nd scope start
@set foo.y=2
...
}// 2nd scope end}// 1st scope end

Thread Isolation/Thread Safety

Python

@hp.param("foo")deffoo(x=1): # Print hyperparameter foo.xprint(f"foo.x={x}")
withhp.scope() asps:
ps.foo.x=2# Modify foo.x in the current threadfoo() # foo.x=2threading.Thread(target=foo).start() # foo.x=1, new thread's hyperparameter value is not affected by the main thread

Rust

fnfoo(){// Print hyperparameter foo.xwith_params!{
@get x = foo.x or 1;
println!("foo.x={}", x);}}fnmain(){with_params!{
@set foo.x = 2;// Modify foo.x in the current thread
foo();// foo.x=2
thread::spawn(foo);// foo.x=1, new thread's hyperparameter value is not affected by the main thread}}

Command Line Application

In command line applications, it's common to define hyperparameters using command line arguments (e.g., -D, --define) and control hyperparameters on the command line. Here's an example in Python and Rust:

Python

# example.pyimporthyperparameterashp@hp.param("example")defmain(a=0, b=1):
print(f"example.a={a}, example.b={b}")
if__name__=="__main__":
importargparseparser=argparse.ArgumentParser()
parser.add_argument("-D", "--define", nargs="*", default=[], action="extend")
args=parser.parse_args()
withhp.scope(*args.define):
main()

Rust

// example.rsuse hyperparameter::*;use hyperparameter_derive::Parser;fnmain(){#[derive(Parser,Debug)]structDeriveArgs{#[arg(short = 'D', long)]define:Vec<String>,}let args = DeriveArgs::parse();with_params!{
params ParamScope::from(&args.define);
foo()}}fnfoo(){with_params!{
@get a = example.a or 0;
@get b = example.b or 1;
println!("example.a={}, example.b={}",a ,b);}}

More Examples

This example demonstrates how to use hyperparameter in research projects, and make experiments reproducible.

This example showcases experiment management with hyperparameter and result tracing with mlflow.tracing.

Behavior Guarantees (Semantic Contract)

  • Keys & hashing: keys use . for nesting, case is preserved, and hashing uses the same UTF-8 input and seed across Python/Rust/C++; invalid characters are an error.
  • Read precedence: current thread’s innermost scope > parent scopes outward > frozen global snapshot > user default. Writes only affect the current scope and rollback on exit.
  • Defaults vs. missing: only missing keys fall back to defaults; explicit None/False/0 are treated as existing values. Type conversion rules (bool/int/float/str) are consistent across languages; invalid values use a best-effort conversion and otherwise fall back to the provided default (no silent random values).
  • Threads & frozen(): each thread starts from the frozen global snapshot; mutations stay in-thread unless frozen() is called, which atomically updates the global snapshot. Global mutations are lock-protected in the Python backend, matching Rust semantics.
  • Error model: reading an undefined key without a default raises a key error; backend load failure falls back to the Python backend without noisy tracebacks; no silent failure on type errors.
  • Multiprocess notice: cross-process consistency requires a shared backend (e.g., Rust backend or user-provided storage adapter); the built-in Python backend only guards threads, not processes.

About

Hyperparameter: The High-Performance Configuration Library for AI Systems

Topics

Resources

Code of conduct

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - reiase/hyperparameter: Hyperparameter: The High-Performance Configuration Library for AI Systems · GitHub
Skip to content

Repository files navigation

Hyperparameter Logo

Hyperparameter

ENGLISH | 中文文档

Make configurable AI applications. Build for Python/Rust hackers.

Hyperparameter is a versatile library designed to streamline the management and control of hyperparameters in machine learning algorithms and system development. Tailored for AI researchers and Machine Learning Systems (MLSYS) developers, Hyperparameter offers a unified solution with a focus on ease of use in Python, high-performance access in Rust and C++, and a set of macros for seamless hyperparameter management.

5-Minute Try

pip install hyperparameter
# Run a ready-to-use demo
python -m hyperparameter.examples.quickstart
# Try the @hp.param CLI: override defaults from the command line
python -m hyperparameter.examples.quickstart --define greet.name=Alice --enthusiasm=3
# Inspect params and defaults
python -m hyperparameter.examples.quickstart -lps
python -m hyperparameter.examples.quickstart -ep greet.name
# Running from source? Use module mode or install editable# python -m hyperparameter.examples.quickstart# or: pip install -e .

Why Hyperparameter?

🚀 Unmatched Performance (vs Hydra)

Hyperparameter is built on a high-performance Rust backend, making it significantly faster than pure Python alternatives like Hydra, especially in inner-loop parameter access.

MethodTime (1M iters)Speedup (vs Hydra)
HP: Injected (Native Speed)0.0184s856.73x 🚀
HP: Dynamic (Optimized)2.4255s6.50x ⚡️
Hydra (Baseline)15.7638s1.00x

Benchmark scenario: Accessing a nested parameter model.layers.0.size 1,000,000 times in a loop. See benchmark/ folder for reproduction scripts.

✨ Zero-Dependency Schema Validation

Hyperparameter supports structural validation using standard Python type hints without introducing heavy dependencies (like Pydantic or OmegaConf).

fromdataclassesimportdataclassimporthyperparameterashp@dataclassclassAppConfig:
host: strport: intdebug: bool=False# Validates types and converts automatically: "8080" -> 8080 (int)cfg=hp.config("config.toml", schema=AppConfig)

Key Features

For Python Users

  • Pythonic Syntax: Define hyperparameters using keyword argument syntax;
    • Intuitive Scoping: Control parameter scope through with statement;
    • Configuration File: Easy to load parameters from config files (JSON/TOML/YAML) with composition and interpolation support;
    • Zero-Overhead Validation: Optional schema validation using standard Python type hints;

For Rust and C++ Users

  • High-Performance Backend: Hyperparameter is implemented in Rust, providing a robust and high-performance backend for hyperparameter management. Access hyperparameters in Rust and C++ with minimal overhead, making it ideal for ML and system developers who prioritize performance.

  • Macro-Based Parameter Management: Hyperparameter provides a set of macros for both Rust and C++ users. These macros mimic Python's with statements and adhere to language-specific scoping rules.

  • Compile-Time Hashing: Both Rust and C++ interfaces utilize compile-time hashing of hyperparameter names, reducing runtime hash computation overhead.

Quick Start

Installation

pip install hyperparameter

Python

importhyperparameterashp@hp.param("foo")deffoo(x=1, y="a"):
returnf"x={x}, y={y}"foo() # x=1, y='a'withhp.scope(**{"foo.x": 2}):
foo() # x=2, y='a'

Rust

fnfoo() -> i32{with_params!{
@get x = foo.x or 1i32;// Read hyperparameter with default value
println!("x={}", x);}}fnmain(){foo();// x=1with_params!{
@set foo.x = 2i32;// Set hyperparameter
foo();// x=2}foo();// x=1}

C++

ASSERT(1 == GET_PARAM(a.b, 1), "get undefined param");
{
auto guard = WITH_PARAMS(a, 1, //
a.b, 2.0, //
a.b.c, true, //
a.b.c.d, "str");
ASSERT(1 == GET_PARAM(a, 0), "get int value");
ASSERT(1 == GET_PARAM(a, 0), "get int value");
}

Detailed Usage Examples

Support for Default Values

Python

x=hp.scope.foo.x|"default value"

Rust

@get x = foo.x or "default value";

Scope Control of Parameter Values

Python

withhp.scope() asps: # 1st scope startps.foo.x=1withhp.scope() asps2: # 2nd scope startps.foo.y=2# 2nd scope end# 1st scope end

Rust

with_params!{// 1st scope start
@set foo.x=1;
with_params!{//2nd scope start
@set foo.y=2
...
}// 2nd scope end}// 1st scope end

Thread Isolation/Thread Safety

Python

@hp.param("foo")deffoo(x=1): # Print hyperparameter foo.xprint(f"foo.x={x}")
withhp.scope() asps:
ps.foo.x=2# Modify foo.x in the current threadfoo() # foo.x=2threading.Thread(target=foo).start() # foo.x=1, new thread's hyperparameter value is not affected by the main thread

Rust

fnfoo(){// Print hyperparameter foo.xwith_params!{
@get x = foo.x or 1;
println!("foo.x={}", x);}}fnmain(){with_params!{
@set foo.x = 2;// Modify foo.x in the current thread
foo();// foo.x=2
thread::spawn(foo);// foo.x=1, new thread's hyperparameter value is not affected by the main thread}}

Command Line Application

In command line applications, it's common to define hyperparameters using command line arguments (e.g., -D, --define) and control hyperparameters on the command line. Here's an example in Python and Rust:

Python

# example.pyimporthyperparameterashp@hp.param("example")defmain(a=0, b=1):
print(f"example.a={a}, example.b={b}")
if__name__=="__main__":
importargparseparser=argparse.ArgumentParser()
parser.add_argument("-D", "--define", nargs="*", default=[], action="extend")
args=parser.parse_args()
withhp.scope(*args.define):
main()

Rust

// example.rsuse hyperparameter::*;use hyperparameter_derive::Parser;fnmain(){#[derive(Parser,Debug)]structDeriveArgs{#[arg(short = 'D', long)]define:Vec<String>,}let args = DeriveArgs::parse();with_params!{
params ParamScope::from(&args.define);
foo()}}fnfoo(){with_params!{
@get a = example.a or 0;
@get b = example.b or 1;
println!("example.a={}, example.b={}",a ,b);}}

More Examples

This example demonstrates how to use hyperparameter in research projects, and make experiments reproducible.

This example showcases experiment management with hyperparameter and result tracing with mlflow.tracing.

Behavior Guarantees (Semantic Contract)

  • Keys & hashing: keys use . for nesting, case is preserved, and hashing uses the same UTF-8 input and seed across Python/Rust/C++; invalid characters are an error.
  • Read precedence: current thread’s innermost scope > parent scopes outward > frozen global snapshot > user default. Writes only affect the current scope and rollback on exit.
  • Defaults vs. missing: only missing keys fall back to defaults; explicit None/False/0 are treated as existing values. Type conversion rules (bool/int/float/str) are consistent across languages; invalid values use a best-effort conversion and otherwise fall back to the provided default (no silent random values).
  • Threads & frozen(): each thread starts from the frozen global snapshot; mutations stay in-thread unless frozen() is called, which atomically updates the global snapshot. Global mutations are lock-protected in the Python backend, matching Rust semantics.
  • Error model: reading an undefined key without a default raises a key error; backend load failure falls back to the Python backend without noisy tracebacks; no silent failure on type errors.
  • Multiprocess notice: cross-process consistency requires a shared backend (e.g., Rust backend or user-provided storage adapter); the built-in Python backend only guards threads, not processes.

About

Hyperparameter: The High-Performance Configuration Library for AI Systems

Topics

Resources

Code of conduct

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - reiase/hyperparameter: Hyperparameter: The High-Performance Configuration Library for AI Systems · GitHub
Skip to content

Repository files navigation

Hyperparameter Logo

Hyperparameter

ENGLISH | 中文文档

Make configurable AI applications. Build for Python/Rust hackers.

Hyperparameter is a versatile library designed to streamline the management and control of hyperparameters in machine learning algorithms and system development. Tailored for AI researchers and Machine Learning Systems (MLSYS) developers, Hyperparameter offers a unified solution with a focus on ease of use in Python, high-performance access in Rust and C++, and a set of macros for seamless hyperparameter management.

5-Minute Try

pip install hyperparameter
# Run a ready-to-use demo
python -m hyperparameter.examples.quickstart
# Try the @hp.param CLI: override defaults from the command line
python -m hyperparameter.examples.quickstart --define greet.name=Alice --enthusiasm=3
# Inspect params and defaults
python -m hyperparameter.examples.quickstart -lps
python -m hyperparameter.examples.quickstart -ep greet.name
# Running from source? Use module mode or install editable# python -m hyperparameter.examples.quickstart# or: pip install -e .

Why Hyperparameter?

🚀 Unmatched Performance (vs Hydra)

Hyperparameter is built on a high-performance Rust backend, making it significantly faster than pure Python alternatives like Hydra, especially in inner-loop parameter access.

MethodTime (1M iters)Speedup (vs Hydra)
HP: Injected (Native Speed)0.0184s856.73x 🚀
HP: Dynamic (Optimized)2.4255s6.50x ⚡️
Hydra (Baseline)15.7638s1.00x

Benchmark scenario: Accessing a nested parameter model.layers.0.size 1,000,000 times in a loop. See benchmark/ folder for reproduction scripts.

✨ Zero-Dependency Schema Validation

Hyperparameter supports structural validation using standard Python type hints without introducing heavy dependencies (like Pydantic or OmegaConf).

fromdataclassesimportdataclassimporthyperparameterashp@dataclassclassAppConfig:
host: strport: intdebug: bool=False# Validates types and converts automatically: "8080" -> 8080 (int)cfg=hp.config("config.toml", schema=AppConfig)

Key Features

For Python Users

  • Pythonic Syntax: Define hyperparameters using keyword argument syntax;
    • Intuitive Scoping: Control parameter scope through with statement;
    • Configuration File: Easy to load parameters from config files (JSON/TOML/YAML) with composition and interpolation support;
    • Zero-Overhead Validation: Optional schema validation using standard Python type hints;

For Rust and C++ Users

  • High-Performance Backend: Hyperparameter is implemented in Rust, providing a robust and high-performance backend for hyperparameter management. Access hyperparameters in Rust and C++ with minimal overhead, making it ideal for ML and system developers who prioritize performance.

  • Macro-Based Parameter Management: Hyperparameter provides a set of macros for both Rust and C++ users. These macros mimic Python's with statements and adhere to language-specific scoping rules.

  • Compile-Time Hashing: Both Rust and C++ interfaces utilize compile-time hashing of hyperparameter names, reducing runtime hash computation overhead.

Quick Start

Installation

pip install hyperparameter

Python

importhyperparameterashp@hp.param("foo")deffoo(x=1, y="a"):
returnf"x={x}, y={y}"foo() # x=1, y='a'withhp.scope(**{"foo.x": 2}):
foo() # x=2, y='a'

Rust

fnfoo() -> i32{with_params!{
@get x = foo.x or 1i32;// Read hyperparameter with default value
println!("x={}", x);}}fnmain(){foo();// x=1with_params!{
@set foo.x = 2i32;// Set hyperparameter
foo();// x=2}foo();// x=1}

C++

ASSERT(1 == GET_PARAM(a.b, 1), "get undefined param");
{
auto guard = WITH_PARAMS(a, 1, //
a.b, 2.0, //
a.b.c, true, //
a.b.c.d, "str");
ASSERT(1 == GET_PARAM(a, 0), "get int value");
ASSERT(1 == GET_PARAM(a, 0), "get int value");
}

Detailed Usage Examples

Support for Default Values

Python

x=hp.scope.foo.x|"default value"

Rust

@get x = foo.x or "default value";

Scope Control of Parameter Values

Python

withhp.scope() asps: # 1st scope startps.foo.x=1withhp.scope() asps2: # 2nd scope startps.foo.y=2# 2nd scope end# 1st scope end

Rust

with_params!{// 1st scope start
@set foo.x=1;
with_params!{//2nd scope start
@set foo.y=2
...
}// 2nd scope end}// 1st scope end

Thread Isolation/Thread Safety

Python

@hp.param("foo")deffoo(x=1): # Print hyperparameter foo.xprint(f"foo.x={x}")
withhp.scope() asps:
ps.foo.x=2# Modify foo.x in the current threadfoo() # foo.x=2threading.Thread(target=foo).start() # foo.x=1, new thread's hyperparameter value is not affected by the main thread

Rust

fnfoo(){// Print hyperparameter foo.xwith_params!{
@get x = foo.x or 1;
println!("foo.x={}", x);}}fnmain(){with_params!{
@set foo.x = 2;// Modify foo.x in the current thread
foo();// foo.x=2
thread::spawn(foo);// foo.x=1, new thread's hyperparameter value is not affected by the main thread}}

Command Line Application

In command line applications, it's common to define hyperparameters using command line arguments (e.g., -D, --define) and control hyperparameters on the command line. Here's an example in Python and Rust:

Python

# example.pyimporthyperparameterashp@hp.param("example")defmain(a=0, b=1):
print(f"example.a={a}, example.b={b}")
if__name__=="__main__":
importargparseparser=argparse.ArgumentParser()
parser.add_argument("-D", "--define", nargs="*", default=[], action="extend")
args=parser.parse_args()
withhp.scope(*args.define):
main()

Rust

// example.rsuse hyperparameter::*;use hyperparameter_derive::Parser;fnmain(){#[derive(Parser,Debug)]structDeriveArgs{#[arg(short = 'D', long)]define:Vec<String>,}let args = DeriveArgs::parse();with_params!{
params ParamScope::from(&args.define);
foo()}}fnfoo(){with_params!{
@get a = example.a or 0;
@get b = example.b or 1;
println!("example.a={}, example.b={}",a ,b);}}

More Examples

This example demonstrates how to use hyperparameter in research projects, and make experiments reproducible.

This example showcases experiment management with hyperparameter and result tracing with mlflow.tracing.

Behavior Guarantees (Semantic Contract)

  • Keys & hashing: keys use . for nesting, case is preserved, and hashing uses the same UTF-8 input and seed across Python/Rust/C++; invalid characters are an error.
  • Read precedence: current thread’s innermost scope > parent scopes outward > frozen global snapshot > user default. Writes only affect the current scope and rollback on exit.
  • Defaults vs. missing: only missing keys fall back to defaults; explicit None/False/0 are treated as existing values. Type conversion rules (bool/int/float/str) are consistent across languages; invalid values use a best-effort conversion and otherwise fall back to the provided default (no silent random values).
  • Threads & frozen(): each thread starts from the frozen global snapshot; mutations stay in-thread unless frozen() is called, which atomically updates the global snapshot. Global mutations are lock-protected in the Python backend, matching Rust semantics.
  • Error model: reading an undefined key without a default raises a key error; backend load failure falls back to the Python backend without noisy tracebacks; no silent failure on type errors.
  • Multiprocess notice: cross-process consistency requires a shared backend (e.g., Rust backend or user-provided storage adapter); the built-in Python backend only guards threads, not processes.

About

Hyperparameter: The High-Performance Configuration Library for AI Systems

Topics

Resources

Code of conduct

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - reiase/hyperparameter: Hyperparameter: The High-Performance Configuration Library for AI Systems · GitHub
Skip to content

Repository files navigation

Hyperparameter Logo

Hyperparameter

ENGLISH | 中文文档

Make configurable AI applications. Build for Python/Rust hackers.

Hyperparameter is a versatile library designed to streamline the management and control of hyperparameters in machine learning algorithms and system development. Tailored for AI researchers and Machine Learning Systems (MLSYS) developers, Hyperparameter offers a unified solution with a focus on ease of use in Python, high-performance access in Rust and C++, and a set of macros for seamless hyperparameter management.

5-Minute Try

pip install hyperparameter
# Run a ready-to-use demo
python -m hyperparameter.examples.quickstart
# Try the @hp.param CLI: override defaults from the command line
python -m hyperparameter.examples.quickstart --define greet.name=Alice --enthusiasm=3
# Inspect params and defaults
python -m hyperparameter.examples.quickstart -lps
python -m hyperparameter.examples.quickstart -ep greet.name
# Running from source? Use module mode or install editable# python -m hyperparameter.examples.quickstart# or: pip install -e .

Why Hyperparameter?

🚀 Unmatched Performance (vs Hydra)

Hyperparameter is built on a high-performance Rust backend, making it significantly faster than pure Python alternatives like Hydra, especially in inner-loop parameter access.

MethodTime (1M iters)Speedup (vs Hydra)
HP: Injected (Native Speed)0.0184s856.73x 🚀
HP: Dynamic (Optimized)2.4255s6.50x ⚡️
Hydra (Baseline)15.7638s1.00x

Benchmark scenario: Accessing a nested parameter model.layers.0.size 1,000,000 times in a loop. See benchmark/ folder for reproduction scripts.

✨ Zero-Dependency Schema Validation

Hyperparameter supports structural validation using standard Python type hints without introducing heavy dependencies (like Pydantic or OmegaConf).

fromdataclassesimportdataclassimporthyperparameterashp@dataclassclassAppConfig:
host: strport: intdebug: bool=False# Validates types and converts automatically: "8080" -> 8080 (int)cfg=hp.config("config.toml", schema=AppConfig)

Key Features

For Python Users

  • Pythonic Syntax: Define hyperparameters using keyword argument syntax;
    • Intuitive Scoping: Control parameter scope through with statement;
    • Configuration File: Easy to load parameters from config files (JSON/TOML/YAML) with composition and interpolation support;
    • Zero-Overhead Validation: Optional schema validation using standard Python type hints;

For Rust and C++ Users

  • High-Performance Backend: Hyperparameter is implemented in Rust, providing a robust and high-performance backend for hyperparameter management. Access hyperparameters in Rust and C++ with minimal overhead, making it ideal for ML and system developers who prioritize performance.

  • Macro-Based Parameter Management: Hyperparameter provides a set of macros for both Rust and C++ users. These macros mimic Python's with statements and adhere to language-specific scoping rules.

  • Compile-Time Hashing: Both Rust and C++ interfaces utilize compile-time hashing of hyperparameter names, reducing runtime hash computation overhead.

Quick Start

Installation

pip install hyperparameter

Python

importhyperparameterashp@hp.param("foo")deffoo(x=1, y="a"):
returnf"x={x}, y={y}"foo() # x=1, y='a'withhp.scope(**{"foo.x": 2}):
foo() # x=2, y='a'

Rust

fnfoo() -> i32{with_params!{
@get x = foo.x or 1i32;// Read hyperparameter with default value
println!("x={}", x);}}fnmain(){foo();// x=1with_params!{
@set foo.x = 2i32;// Set hyperparameter
foo();// x=2}foo();// x=1}

C++

ASSERT(1 == GET_PARAM(a.b, 1), "get undefined param");
{
auto guard = WITH_PARAMS(a, 1, //
a.b, 2.0, //
a.b.c, true, //
a.b.c.d, "str");
ASSERT(1 == GET_PARAM(a, 0), "get int value");
ASSERT(1 == GET_PARAM(a, 0), "get int value");
}

Detailed Usage Examples

Support for Default Values

Python

x=hp.scope.foo.x|"default value"

Rust

@get x = foo.x or "default value";

Scope Control of Parameter Values

Python

withhp.scope() asps: # 1st scope startps.foo.x=1withhp.scope() asps2: # 2nd scope startps.foo.y=2# 2nd scope end# 1st scope end

Rust

with_params!{// 1st scope start
@set foo.x=1;
with_params!{//2nd scope start
@set foo.y=2
...
}// 2nd scope end}// 1st scope end

Thread Isolation/Thread Safety

Python

@hp.param("foo")deffoo(x=1): # Print hyperparameter foo.xprint(f"foo.x={x}")
withhp.scope() asps:
ps.foo.x=2# Modify foo.x in the current threadfoo() # foo.x=2threading.Thread(target=foo).start() # foo.x=1, new thread's hyperparameter value is not affected by the main thread

Rust

fnfoo(){// Print hyperparameter foo.xwith_params!{
@get x = foo.x or 1;
println!("foo.x={}", x);}}fnmain(){with_params!{
@set foo.x = 2;// Modify foo.x in the current thread
foo();// foo.x=2
thread::spawn(foo);// foo.x=1, new thread's hyperparameter value is not affected by the main thread}}

Command Line Application

In command line applications, it's common to define hyperparameters using command line arguments (e.g., -D, --define) and control hyperparameters on the command line. Here's an example in Python and Rust:

Python

# example.pyimporthyperparameterashp@hp.param("example")defmain(a=0, b=1):
print(f"example.a={a}, example.b={b}")
if__name__=="__main__":
importargparseparser=argparse.ArgumentParser()
parser.add_argument("-D", "--define", nargs="*", default=[], action="extend")
args=parser.parse_args()
withhp.scope(*args.define):
main()

Rust

// example.rsuse hyperparameter::*;use hyperparameter_derive::Parser;fnmain(){#[derive(Parser,Debug)]structDeriveArgs{#[arg(short = 'D', long)]define:Vec<String>,}let args = DeriveArgs::parse();with_params!{
params ParamScope::from(&args.define);
foo()}}fnfoo(){with_params!{
@get a = example.a or 0;
@get b = example.b or 1;
println!("example.a={}, example.b={}",a ,b);}}

More Examples

This example demonstrates how to use hyperparameter in research projects, and make experiments reproducible.

This example showcases experiment management with hyperparameter and result tracing with mlflow.tracing.

Behavior Guarantees (Semantic Contract)

  • Keys & hashing: keys use . for nesting, case is preserved, and hashing uses the same UTF-8 input and seed across Python/Rust/C++; invalid characters are an error.
  • Read precedence: current thread’s innermost scope > parent scopes outward > frozen global snapshot > user default. Writes only affect the current scope and rollback on exit.
  • Defaults vs. missing: only missing keys fall back to defaults; explicit None/False/0 are treated as existing values. Type conversion rules (bool/int/float/str) are consistent across languages; invalid values use a best-effort conversion and otherwise fall back to the provided default (no silent random values).
  • Threads & frozen(): each thread starts from the frozen global snapshot; mutations stay in-thread unless frozen() is called, which atomically updates the global snapshot. Global mutations are lock-protected in the Python backend, matching Rust semantics.
  • Error model: reading an undefined key without a default raises a key error; backend load failure falls back to the Python backend without noisy tracebacks; no silent failure on type errors.
  • Multiprocess notice: cross-process consistency requires a shared backend (e.g., Rust backend or user-provided storage adapter); the built-in Python backend only guards threads, not processes.

About

Hyperparameter: The High-Performance Configuration Library for AI Systems

Topics

Resources

Code of conduct

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - reiase/hyperparameter: Hyperparameter: The High-Performance Configuration Library for AI Systems · GitHub
Skip to content

Repository files navigation

Hyperparameter Logo

Hyperparameter

ENGLISH | 中文文档

Make configurable AI applications. Build for Python/Rust hackers.

Hyperparameter is a versatile library designed to streamline the management and control of hyperparameters in machine learning algorithms and system development. Tailored for AI researchers and Machine Learning Systems (MLSYS) developers, Hyperparameter offers a unified solution with a focus on ease of use in Python, high-performance access in Rust and C++, and a set of macros for seamless hyperparameter management.

5-Minute Try

pip install hyperparameter
# Run a ready-to-use demo
python -m hyperparameter.examples.quickstart
# Try the @hp.param CLI: override defaults from the command line
python -m hyperparameter.examples.quickstart --define greet.name=Alice --enthusiasm=3
# Inspect params and defaults
python -m hyperparameter.examples.quickstart -lps
python -m hyperparameter.examples.quickstart -ep greet.name
# Running from source? Use module mode or install editable# python -m hyperparameter.examples.quickstart# or: pip install -e .

Why Hyperparameter?

🚀 Unmatched Performance (vs Hydra)

Hyperparameter is built on a high-performance Rust backend, making it significantly faster than pure Python alternatives like Hydra, especially in inner-loop parameter access.

MethodTime (1M iters)Speedup (vs Hydra)
HP: Injected (Native Speed)0.0184s856.73x 🚀
HP: Dynamic (Optimized)2.4255s6.50x ⚡️
Hydra (Baseline)15.7638s1.00x

Benchmark scenario: Accessing a nested parameter model.layers.0.size 1,000,000 times in a loop. See benchmark/ folder for reproduction scripts.

✨ Zero-Dependency Schema Validation

Hyperparameter supports structural validation using standard Python type hints without introducing heavy dependencies (like Pydantic or OmegaConf).

fromdataclassesimportdataclassimporthyperparameterashp@dataclassclassAppConfig:
host: strport: intdebug: bool=False# Validates types and converts automatically: "8080" -> 8080 (int)cfg=hp.config("config.toml", schema=AppConfig)

Key Features

For Python Users

  • Pythonic Syntax: Define hyperparameters using keyword argument syntax;
    • Intuitive Scoping: Control parameter scope through with statement;
    • Configuration File: Easy to load parameters from config files (JSON/TOML/YAML) with composition and interpolation support;
    • Zero-Overhead Validation: Optional schema validation using standard Python type hints;

For Rust and C++ Users

  • High-Performance Backend: Hyperparameter is implemented in Rust, providing a robust and high-performance backend for hyperparameter management. Access hyperparameters in Rust and C++ with minimal overhead, making it ideal for ML and system developers who prioritize performance.

  • Macro-Based Parameter Management: Hyperparameter provides a set of macros for both Rust and C++ users. These macros mimic Python's with statements and adhere to language-specific scoping rules.

  • Compile-Time Hashing: Both Rust and C++ interfaces utilize compile-time hashing of hyperparameter names, reducing runtime hash computation overhead.

Quick Start

Installation

pip install hyperparameter

Python

importhyperparameterashp@hp.param("foo")deffoo(x=1, y="a"):
returnf"x={x}, y={y}"foo() # x=1, y='a'withhp.scope(**{"foo.x": 2}):
foo() # x=2, y='a'

Rust

fnfoo() -> i32{with_params!{
@get x = foo.x or 1i32;// Read hyperparameter with default value
println!("x={}", x);}}fnmain(){foo();// x=1with_params!{
@set foo.x = 2i32;// Set hyperparameter
foo();// x=2}foo();// x=1}

C++

ASSERT(1 == GET_PARAM(a.b, 1), "get undefined param");
{
auto guard = WITH_PARAMS(a, 1, //
a.b, 2.0, //
a.b.c, true, //
a.b.c.d, "str");
ASSERT(1 == GET_PARAM(a, 0), "get int value");
ASSERT(1 == GET_PARAM(a, 0), "get int value");
}

Detailed Usage Examples

Support for Default Values

Python

x=hp.scope.foo.x|"default value"

Rust

@get x = foo.x or "default value";

Scope Control of Parameter Values

Python

withhp.scope() asps: # 1st scope startps.foo.x=1withhp.scope() asps2: # 2nd scope startps.foo.y=2# 2nd scope end# 1st scope end

Rust

with_params!{// 1st scope start
@set foo.x=1;
with_params!{//2nd scope start
@set foo.y=2
...
}// 2nd scope end}// 1st scope end

Thread Isolation/Thread Safety

Python

@hp.param("foo")deffoo(x=1): # Print hyperparameter foo.xprint(f"foo.x={x}")
withhp.scope() asps:
ps.foo.x=2# Modify foo.x in the current threadfoo() # foo.x=2threading.Thread(target=foo).start() # foo.x=1, new thread's hyperparameter value is not affected by the main thread

Rust

fnfoo(){// Print hyperparameter foo.xwith_params!{
@get x = foo.x or 1;
println!("foo.x={}", x);}}fnmain(){with_params!{
@set foo.x = 2;// Modify foo.x in the current thread
foo();// foo.x=2
thread::spawn(foo);// foo.x=1, new thread's hyperparameter value is not affected by the main thread}}

Command Line Application

In command line applications, it's common to define hyperparameters using command line arguments (e.g., -D, --define) and control hyperparameters on the command line. Here's an example in Python and Rust:

Python

# example.pyimporthyperparameterashp@hp.param("example")defmain(a=0, b=1):
print(f"example.a={a}, example.b={b}")
if__name__=="__main__":
importargparseparser=argparse.ArgumentParser()
parser.add_argument("-D", "--define", nargs="*", default=[], action="extend")
args=parser.parse_args()
withhp.scope(*args.define):
main()

Rust

// example.rsuse hyperparameter::*;use hyperparameter_derive::Parser;fnmain(){#[derive(Parser,Debug)]structDeriveArgs{#[arg(short = 'D', long)]define:Vec<String>,}let args = DeriveArgs::parse();with_params!{
params ParamScope::from(&args.define);
foo()}}fnfoo(){with_params!{
@get a = example.a or 0;
@get b = example.b or 1;
println!("example.a={}, example.b={}",a ,b);}}

More Examples

This example demonstrates how to use hyperparameter in research projects, and make experiments reproducible.

This example showcases experiment management with hyperparameter and result tracing with mlflow.tracing.

Behavior Guarantees (Semantic Contract)

  • Keys & hashing: keys use . for nesting, case is preserved, and hashing uses the same UTF-8 input and seed across Python/Rust/C++; invalid characters are an error.
  • Read precedence: current thread’s innermost scope > parent scopes outward > frozen global snapshot > user default. Writes only affect the current scope and rollback on exit.
  • Defaults vs. missing: only missing keys fall back to defaults; explicit None/False/0 are treated as existing values. Type conversion rules (bool/int/float/str) are consistent across languages; invalid values use a best-effort conversion and otherwise fall back to the provided default (no silent random values).
  • Threads & frozen(): each thread starts from the frozen global snapshot; mutations stay in-thread unless frozen() is called, which atomically updates the global snapshot. Global mutations are lock-protected in the Python backend, matching Rust semantics.
  • Error model: reading an undefined key without a default raises a key error; backend load failure falls back to the Python backend without noisy tracebacks; no silent failure on type errors.
  • Multiprocess notice: cross-process consistency requires a shared backend (e.g., Rust backend or user-provided storage adapter); the built-in Python backend only guards threads, not processes.

About

Hyperparameter: The High-Performance Configuration Library for AI Systems

Topics

Resources

Code of conduct

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - reiase/hyperparameter: Hyperparameter: The High-Performance Configuration Library for AI Systems · GitHub
Skip to content

Repository files navigation

Hyperparameter Logo

Hyperparameter

ENGLISH | 中文文档

Make configurable AI applications. Build for Python/Rust hackers.

Hyperparameter is a versatile library designed to streamline the management and control of hyperparameters in machine learning algorithms and system development. Tailored for AI researchers and Machine Learning Systems (MLSYS) developers, Hyperparameter offers a unified solution with a focus on ease of use in Python, high-performance access in Rust and C++, and a set of macros for seamless hyperparameter management.

5-Minute Try

pip install hyperparameter
# Run a ready-to-use demo
python -m hyperparameter.examples.quickstart
# Try the @hp.param CLI: override defaults from the command line
python -m hyperparameter.examples.quickstart --define greet.name=Alice --enthusiasm=3
# Inspect params and defaults
python -m hyperparameter.examples.quickstart -lps
python -m hyperparameter.examples.quickstart -ep greet.name
# Running from source? Use module mode or install editable# python -m hyperparameter.examples.quickstart# or: pip install -e .

Why Hyperparameter?

🚀 Unmatched Performance (vs Hydra)

Hyperparameter is built on a high-performance Rust backend, making it significantly faster than pure Python alternatives like Hydra, especially in inner-loop parameter access.

MethodTime (1M iters)Speedup (vs Hydra)
HP: Injected (Native Speed)0.0184s856.73x 🚀
HP: Dynamic (Optimized)2.4255s6.50x ⚡️
Hydra (Baseline)15.7638s1.00x

Benchmark scenario: Accessing a nested parameter model.layers.0.size 1,000,000 times in a loop. See benchmark/ folder for reproduction scripts.

✨ Zero-Dependency Schema Validation

Hyperparameter supports structural validation using standard Python type hints without introducing heavy dependencies (like Pydantic or OmegaConf).

fromdataclassesimportdataclassimporthyperparameterashp@dataclassclassAppConfig:
host: strport: intdebug: bool=False# Validates types and converts automatically: "8080" -> 8080 (int)cfg=hp.config("config.toml", schema=AppConfig)

Key Features

For Python Users

  • Pythonic Syntax: Define hyperparameters using keyword argument syntax;
    • Intuitive Scoping: Control parameter scope through with statement;
    • Configuration File: Easy to load parameters from config files (JSON/TOML/YAML) with composition and interpolation support;
    • Zero-Overhead Validation: Optional schema validation using standard Python type hints;

For Rust and C++ Users

  • High-Performance Backend: Hyperparameter is implemented in Rust, providing a robust and high-performance backend for hyperparameter management. Access hyperparameters in Rust and C++ with minimal overhead, making it ideal for ML and system developers who prioritize performance.

  • Macro-Based Parameter Management: Hyperparameter provides a set of macros for both Rust and C++ users. These macros mimic Python's with statements and adhere to language-specific scoping rules.

  • Compile-Time Hashing: Both Rust and C++ interfaces utilize compile-time hashing of hyperparameter names, reducing runtime hash computation overhead.

Quick Start

Installation

pip install hyperparameter

Python

importhyperparameterashp@hp.param("foo")deffoo(x=1, y="a"):
returnf"x={x}, y={y}"foo() # x=1, y='a'withhp.scope(**{"foo.x": 2}):
foo() # x=2, y='a'

Rust

fnfoo() -> i32{with_params!{
@get x = foo.x or 1i32;// Read hyperparameter with default value
println!("x={}", x);}}fnmain(){foo();// x=1with_params!{
@set foo.x = 2i32;// Set hyperparameter
foo();// x=2}foo();// x=1}

C++

ASSERT(1 == GET_PARAM(a.b, 1), "get undefined param");
{
auto guard = WITH_PARAMS(a, 1, //
a.b, 2.0, //
a.b.c, true, //
a.b.c.d, "str");
ASSERT(1 == GET_PARAM(a, 0), "get int value");
ASSERT(1 == GET_PARAM(a, 0), "get int value");
}

Detailed Usage Examples

Support for Default Values

Python

x=hp.scope.foo.x|"default value"

Rust

@get x = foo.x or "default value";

Scope Control of Parameter Values

Python

withhp.scope() asps: # 1st scope startps.foo.x=1withhp.scope() asps2: # 2nd scope startps.foo.y=2# 2nd scope end# 1st scope end

Rust

with_params!{// 1st scope start
@set foo.x=1;
with_params!{//2nd scope start
@set foo.y=2
...
}// 2nd scope end}// 1st scope end

Thread Isolation/Thread Safety

Python

@hp.param("foo")deffoo(x=1): # Print hyperparameter foo.xprint(f"foo.x={x}")
withhp.scope() asps:
ps.foo.x=2# Modify foo.x in the current threadfoo() # foo.x=2threading.Thread(target=foo).start() # foo.x=1, new thread's hyperparameter value is not affected by the main thread

Rust

fnfoo(){// Print hyperparameter foo.xwith_params!{
@get x = foo.x or 1;
println!("foo.x={}", x);}}fnmain(){with_params!{
@set foo.x = 2;// Modify foo.x in the current thread
foo();// foo.x=2
thread::spawn(foo);// foo.x=1, new thread's hyperparameter value is not affected by the main thread}}

Command Line Application

In command line applications, it's common to define hyperparameters using command line arguments (e.g., -D, --define) and control hyperparameters on the command line. Here's an example in Python and Rust:

Python

# example.pyimporthyperparameterashp@hp.param("example")defmain(a=0, b=1):
print(f"example.a={a}, example.b={b}")
if__name__=="__main__":
importargparseparser=argparse.ArgumentParser()
parser.add_argument("-D", "--define", nargs="*", default=[], action="extend")
args=parser.parse_args()
withhp.scope(*args.define):
main()

Rust

// example.rsuse hyperparameter::*;use hyperparameter_derive::Parser;fnmain(){#[derive(Parser,Debug)]structDeriveArgs{#[arg(short = 'D', long)]define:Vec<String>,}let args = DeriveArgs::parse();with_params!{
params ParamScope::from(&args.define);
foo()}}fnfoo(){with_params!{
@get a = example.a or 0;
@get b = example.b or 1;
println!("example.a={}, example.b={}",a ,b);}}

More Examples

This example demonstrates how to use hyperparameter in research projects, and make experiments reproducible.

This example showcases experiment management with hyperparameter and result tracing with mlflow.tracing.

Behavior Guarantees (Semantic Contract)

  • Keys & hashing: keys use . for nesting, case is preserved, and hashing uses the same UTF-8 input and seed across Python/Rust/C++; invalid characters are an error.
  • Read precedence: current thread’s innermost scope > parent scopes outward > frozen global snapshot > user default. Writes only affect the current scope and rollback on exit.
  • Defaults vs. missing: only missing keys fall back to defaults; explicit None/False/0 are treated as existing values. Type conversion rules (bool/int/float/str) are consistent across languages; invalid values use a best-effort conversion and otherwise fall back to the provided default (no silent random values).
  • Threads & frozen(): each thread starts from the frozen global snapshot; mutations stay in-thread unless frozen() is called, which atomically updates the global snapshot. Global mutations are lock-protected in the Python backend, matching Rust semantics.
  • Error model: reading an undefined key without a default raises a key error; backend load failure falls back to the Python backend without noisy tracebacks; no silent failure on type errors.
  • Multiprocess notice: cross-process consistency requires a shared backend (e.g., Rust backend or user-provided storage adapter); the built-in Python backend only guards threads, not processes.

About

Hyperparameter: The High-Performance Configuration Library for AI Systems

Topics

Resources

Code of conduct

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - reiase/hyperparameter: Hyperparameter: The High-Performance Configuration Library for AI Systems · GitHub
Skip to content

Repository files navigation

Hyperparameter Logo

Hyperparameter

ENGLISH | 中文文档

Make configurable AI applications. Build for Python/Rust hackers.

Hyperparameter is a versatile library designed to streamline the management and control of hyperparameters in machine learning algorithms and system development. Tailored for AI researchers and Machine Learning Systems (MLSYS) developers, Hyperparameter offers a unified solution with a focus on ease of use in Python, high-performance access in Rust and C++, and a set of macros for seamless hyperparameter management.

5-Minute Try

pip install hyperparameter
# Run a ready-to-use demo
python -m hyperparameter.examples.quickstart
# Try the @hp.param CLI: override defaults from the command line
python -m hyperparameter.examples.quickstart --define greet.name=Alice --enthusiasm=3
# Inspect params and defaults
python -m hyperparameter.examples.quickstart -lps
python -m hyperparameter.examples.quickstart -ep greet.name
# Running from source? Use module mode or install editable# python -m hyperparameter.examples.quickstart# or: pip install -e .

Why Hyperparameter?

🚀 Unmatched Performance (vs Hydra)

Hyperparameter is built on a high-performance Rust backend, making it significantly faster than pure Python alternatives like Hydra, especially in inner-loop parameter access.

MethodTime (1M iters)Speedup (vs Hydra)
HP: Injected (Native Speed)0.0184s856.73x 🚀
HP: Dynamic (Optimized)2.4255s6.50x ⚡️
Hydra (Baseline)15.7638s1.00x

Benchmark scenario: Accessing a nested parameter model.layers.0.size 1,000,000 times in a loop. See benchmark/ folder for reproduction scripts.

✨ Zero-Dependency Schema Validation

Hyperparameter supports structural validation using standard Python type hints without introducing heavy dependencies (like Pydantic or OmegaConf).

fromdataclassesimportdataclassimporthyperparameterashp@dataclassclassAppConfig:
host: strport: intdebug: bool=False# Validates types and converts automatically: "8080" -> 8080 (int)cfg=hp.config("config.toml", schema=AppConfig)

Key Features

For Python Users

  • Pythonic Syntax: Define hyperparameters using keyword argument syntax;
    • Intuitive Scoping: Control parameter scope through with statement;
    • Configuration File: Easy to load parameters from config files (JSON/TOML/YAML) with composition and interpolation support;
    • Zero-Overhead Validation: Optional schema validation using standard Python type hints;

For Rust and C++ Users

  • High-Performance Backend: Hyperparameter is implemented in Rust, providing a robust and high-performance backend for hyperparameter management. Access hyperparameters in Rust and C++ with minimal overhead, making it ideal for ML and system developers who prioritize performance.

  • Macro-Based Parameter Management: Hyperparameter provides a set of macros for both Rust and C++ users. These macros mimic Python's with statements and adhere to language-specific scoping rules.

  • Compile-Time Hashing: Both Rust and C++ interfaces utilize compile-time hashing of hyperparameter names, reducing runtime hash computation overhead.

Quick Start

Installation

pip install hyperparameter

Python

importhyperparameterashp@hp.param("foo")deffoo(x=1, y="a"):
returnf"x={x}, y={y}"foo() # x=1, y='a'withhp.scope(**{"foo.x": 2}):
foo() # x=2, y='a'

Rust

fnfoo() -> i32{with_params!{
@get x = foo.x or 1i32;// Read hyperparameter with default value
println!("x={}", x);}}fnmain(){foo();// x=1with_params!{
@set foo.x = 2i32;// Set hyperparameter
foo();// x=2}foo();// x=1}

C++

ASSERT(1 == GET_PARAM(a.b, 1), "get undefined param");
{
auto guard = WITH_PARAMS(a, 1, //
a.b, 2.0, //
a.b.c, true, //
a.b.c.d, "str");
ASSERT(1 == GET_PARAM(a, 0), "get int value");
ASSERT(1 == GET_PARAM(a, 0), "get int value");
}

Detailed Usage Examples

Support for Default Values

Python

x=hp.scope.foo.x|"default value"

Rust

@get x = foo.x or "default value";

Scope Control of Parameter Values

Python

withhp.scope() asps: # 1st scope startps.foo.x=1withhp.scope() asps2: # 2nd scope startps.foo.y=2# 2nd scope end# 1st scope end

Rust

with_params!{// 1st scope start
@set foo.x=1;
with_params!{//2nd scope start
@set foo.y=2
...
}// 2nd scope end}// 1st scope end

Thread Isolation/Thread Safety

Python

@hp.param("foo")deffoo(x=1): # Print hyperparameter foo.xprint(f"foo.x={x}")
withhp.scope() asps:
ps.foo.x=2# Modify foo.x in the current threadfoo() # foo.x=2threading.Thread(target=foo).start() # foo.x=1, new thread's hyperparameter value is not affected by the main thread

Rust

fnfoo(){// Print hyperparameter foo.xwith_params!{
@get x = foo.x or 1;
println!("foo.x={}", x);}}fnmain(){with_params!{
@set foo.x = 2;// Modify foo.x in the current thread
foo();// foo.x=2
thread::spawn(foo);// foo.x=1, new thread's hyperparameter value is not affected by the main thread}}

Command Line Application

In command line applications, it's common to define hyperparameters using command line arguments (e.g., -D, --define) and control hyperparameters on the command line. Here's an example in Python and Rust:

Python

# example.pyimporthyperparameterashp@hp.param("example")defmain(a=0, b=1):
print(f"example.a={a}, example.b={b}")
if__name__=="__main__":
importargparseparser=argparse.ArgumentParser()
parser.add_argument("-D", "--define", nargs="*", default=[], action="extend")
args=parser.parse_args()
withhp.scope(*args.define):
main()

Rust

// example.rsuse hyperparameter::*;use hyperparameter_derive::Parser;fnmain(){#[derive(Parser,Debug)]structDeriveArgs{#[arg(short = 'D', long)]define:Vec<String>,}let args = DeriveArgs::parse();with_params!{
params ParamScope::from(&args.define);
foo()}}fnfoo(){with_params!{
@get a = example.a or 0;
@get b = example.b or 1;
println!("example.a={}, example.b={}",a ,b);}}

More Examples

This example demonstrates how to use hyperparameter in research projects, and make experiments reproducible.

This example showcases experiment management with hyperparameter and result tracing with mlflow.tracing.

Behavior Guarantees (Semantic Contract)

  • Keys & hashing: keys use . for nesting, case is preserved, and hashing uses the same UTF-8 input and seed across Python/Rust/C++; invalid characters are an error.
  • Read precedence: current thread’s innermost scope > parent scopes outward > frozen global snapshot > user default. Writes only affect the current scope and rollback on exit.
  • Defaults vs. missing: only missing keys fall back to defaults; explicit None/False/0 are treated as existing values. Type conversion rules (bool/int/float/str) are consistent across languages; invalid values use a best-effort conversion and otherwise fall back to the provided default (no silent random values).
  • Threads & frozen(): each thread starts from the frozen global snapshot; mutations stay in-thread unless frozen() is called, which atomically updates the global snapshot. Global mutations are lock-protected in the Python backend, matching Rust semantics.
  • Error model: reading an undefined key without a default raises a key error; backend load failure falls back to the Python backend without noisy tracebacks; no silent failure on type errors.
  • Multiprocess notice: cross-process consistency requires a shared backend (e.g., Rust backend or user-provided storage adapter); the built-in Python backend only guards threads, not processes.

About

Hyperparameter: The High-Performance Configuration Library for AI Systems

Topics

Resources

Code of conduct

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - reiase/hyperparameter: Hyperparameter: The High-Performance Configuration Library for AI Systems · GitHub
Skip to content

Repository files navigation

Hyperparameter Logo

Hyperparameter

ENGLISH | 中文文档

Make configurable AI applications. Build for Python/Rust hackers.

Hyperparameter is a versatile library designed to streamline the management and control of hyperparameters in machine learning algorithms and system development. Tailored for AI researchers and Machine Learning Systems (MLSYS) developers, Hyperparameter offers a unified solution with a focus on ease of use in Python, high-performance access in Rust and C++, and a set of macros for seamless hyperparameter management.

5-Minute Try

pip install hyperparameter
# Run a ready-to-use demo
python -m hyperparameter.examples.quickstart
# Try the @hp.param CLI: override defaults from the command line
python -m hyperparameter.examples.quickstart --define greet.name=Alice --enthusiasm=3
# Inspect params and defaults
python -m hyperparameter.examples.quickstart -lps
python -m hyperparameter.examples.quickstart -ep greet.name
# Running from source? Use module mode or install editable# python -m hyperparameter.examples.quickstart# or: pip install -e .

Why Hyperparameter?

🚀 Unmatched Performance (vs Hydra)

Hyperparameter is built on a high-performance Rust backend, making it significantly faster than pure Python alternatives like Hydra, especially in inner-loop parameter access.

MethodTime (1M iters)Speedup (vs Hydra)
HP: Injected (Native Speed)0.0184s856.73x 🚀
HP: Dynamic (Optimized)2.4255s6.50x ⚡️
Hydra (Baseline)15.7638s1.00x

Benchmark scenario: Accessing a nested parameter model.layers.0.size 1,000,000 times in a loop. See benchmark/ folder for reproduction scripts.

✨ Zero-Dependency Schema Validation

Hyperparameter supports structural validation using standard Python type hints without introducing heavy dependencies (like Pydantic or OmegaConf).

fromdataclassesimportdataclassimporthyperparameterashp@dataclassclassAppConfig:
host: strport: intdebug: bool=False# Validates types and converts automatically: "8080" -> 8080 (int)cfg=hp.config("config.toml", schema=AppConfig)

Key Features

For Python Users

  • Pythonic Syntax: Define hyperparameters using keyword argument syntax;
    • Intuitive Scoping: Control parameter scope through with statement;
    • Configuration File: Easy to load parameters from config files (JSON/TOML/YAML) with composition and interpolation support;
    • Zero-Overhead Validation: Optional schema validation using standard Python type hints;

For Rust and C++ Users

  • High-Performance Backend: Hyperparameter is implemented in Rust, providing a robust and high-performance backend for hyperparameter management. Access hyperparameters in Rust and C++ with minimal overhead, making it ideal for ML and system developers who prioritize performance.

  • Macro-Based Parameter Management: Hyperparameter provides a set of macros for both Rust and C++ users. These macros mimic Python's with statements and adhere to language-specific scoping rules.

  • Compile-Time Hashing: Both Rust and C++ interfaces utilize compile-time hashing of hyperparameter names, reducing runtime hash computation overhead.

Quick Start

Installation

pip install hyperparameter

Python

importhyperparameterashp@hp.param("foo")deffoo(x=1, y="a"):
returnf"x={x}, y={y}"foo() # x=1, y='a'withhp.scope(**{"foo.x": 2}):
foo() # x=2, y='a'

Rust

fnfoo() -> i32{with_params!{
@get x = foo.x or 1i32;// Read hyperparameter with default value
println!("x={}", x);}}fnmain(){foo();// x=1with_params!{
@set foo.x = 2i32;// Set hyperparameter
foo();// x=2}foo();// x=1}

C++

ASSERT(1 == GET_PARAM(a.b, 1), "get undefined param");
{
auto guard = WITH_PARAMS(a, 1, //
a.b, 2.0, //
a.b.c, true, //
a.b.c.d, "str");
ASSERT(1 == GET_PARAM(a, 0), "get int value");
ASSERT(1 == GET_PARAM(a, 0), "get int value");
}

Detailed Usage Examples

Support for Default Values

Python

x=hp.scope.foo.x|"default value"

Rust

@get x = foo.x or "default value";

Scope Control of Parameter Values

Python

withhp.scope() asps: # 1st scope startps.foo.x=1withhp.scope() asps2: # 2nd scope startps.foo.y=2# 2nd scope end# 1st scope end

Rust

with_params!{// 1st scope start
@set foo.x=1;
with_params!{//2nd scope start
@set foo.y=2
...
}// 2nd scope end}// 1st scope end

Thread Isolation/Thread Safety

Python

@hp.param("foo")deffoo(x=1): # Print hyperparameter foo.xprint(f"foo.x={x}")
withhp.scope() asps:
ps.foo.x=2# Modify foo.x in the current threadfoo() # foo.x=2threading.Thread(target=foo).start() # foo.x=1, new thread's hyperparameter value is not affected by the main thread

Rust

fnfoo(){// Print hyperparameter foo.xwith_params!{
@get x = foo.x or 1;
println!("foo.x={}", x);}}fnmain(){with_params!{
@set foo.x = 2;// Modify foo.x in the current thread
foo();// foo.x=2
thread::spawn(foo);// foo.x=1, new thread's hyperparameter value is not affected by the main thread}}

Command Line Application

In command line applications, it's common to define hyperparameters using command line arguments (e.g., -D, --define) and control hyperparameters on the command line. Here's an example in Python and Rust:

Python

# example.pyimporthyperparameterashp@hp.param("example")defmain(a=0, b=1):
print(f"example.a={a}, example.b={b}")
if__name__=="__main__":
importargparseparser=argparse.ArgumentParser()
parser.add_argument("-D", "--define", nargs="*", default=[], action="extend")
args=parser.parse_args()
withhp.scope(*args.define):
main()

Rust

// example.rsuse hyperparameter::*;use hyperparameter_derive::Parser;fnmain(){#[derive(Parser,Debug)]structDeriveArgs{#[arg(short = 'D', long)]define:Vec<String>,}let args = DeriveArgs::parse();with_params!{
params ParamScope::from(&args.define);
foo()}}fnfoo(){with_params!{
@get a = example.a or 0;
@get b = example.b or 1;
println!("example.a={}, example.b={}",a ,b);}}

More Examples

This example demonstrates how to use hyperparameter in research projects, and make experiments reproducible.

This example showcases experiment management with hyperparameter and result tracing with mlflow.tracing.

Behavior Guarantees (Semantic Contract)

  • Keys & hashing: keys use . for nesting, case is preserved, and hashing uses the same UTF-8 input and seed across Python/Rust/C++; invalid characters are an error.
  • Read precedence: current thread’s innermost scope > parent scopes outward > frozen global snapshot > user default. Writes only affect the current scope and rollback on exit.
  • Defaults vs. missing: only missing keys fall back to defaults; explicit None/False/0 are treated as existing values. Type conversion rules (bool/int/float/str) are consistent across languages; invalid values use a best-effort conversion and otherwise fall back to the provided default (no silent random values).
  • Threads & frozen(): each thread starts from the frozen global snapshot; mutations stay in-thread unless frozen() is called, which atomically updates the global snapshot. Global mutations are lock-protected in the Python backend, matching Rust semantics.
  • Error model: reading an undefined key without a default raises a key error; backend load failure falls back to the Python backend without noisy tracebacks; no silent failure on type errors.
  • Multiprocess notice: cross-process consistency requires a shared backend (e.g., Rust backend or user-provided storage adapter); the built-in Python backend only guards threads, not processes.

About

Hyperparameter: The High-Performance Configuration Library for AI Systems

Topics

Resources

Code of conduct

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages