#machine-learning #env #cli

hyperparameter

Rust 的高性能配置系统

5 个版本

0.5.12 2024 年 7 月 29 日
0.5.11 2024 年 6 月 23 日
0.5.9 2024 年 3 月 17 日
0.5.8 2023 年 11 月 7 日

#77机器学习

Download history 170/week @ 2024-06-13 198/week @ 2024-06-20 21/week @ 2024-06-27 24/week @ 2024-07-04 125/week @ 2024-07-25 21/week @ 2024-08-01

每月 146 次下载

Apache-2.0

54KB
1.5K SLoC

高性能 Rust 配置系统

Hyperparameter 是为 Rust 和 Python 设计的高性能配置系统,支持以下特性

  1. 高性能:提供快速的参数访问,允许用户在代码中自由读取和写入参数,无需担心性能问题。
  2. 作用域管理:通过作用域管理参数的定义和使用,确保参数值的隔离和安全。
  3. 命令行集成:在应用程序的命令行中自动显示所有参数及其帮助信息。

最小示例

以下是一个简单示例,演示如何使用 Hyperparameter 构建命令行程序

use clap::Parser;
use hyperparameter::*;

#[derive(Parser)]
#[command(after_long_help=generate_params_help())]
struct CommandLineArgs {
    /// Specifies parameters in the format `-D key=value` on the command line
    #[arg(short = 'D', long)]
    define: Vec<String>,
}

fn main() {
    let args = CommandLineArgs::parse();
    with_params! {
        params ParamScope::from(&args.define); // Receives all parameters from the command line

        // Retrieves the parameter `example.param1`, using a default value of `1` if not specified.
        println!("param1={}", get_param!(example.param1, 1));
        // Retrieves the parameter `example.param2`, displaying help information when `<app> --help` is executed.
        println!("param2={}", get_param!(example.param2, false, "help for example.param2"));
    }
}

当执行 clap_mini --help 时,在帮助信息的末尾出现一个 Hyperparameters 部分,解释超参数的名称及其帮助信息

Usage: clap_mini [OPTIONS]

Options:
  -D, --define <DEFINE>
          Specifies hyperparameters in the format `-D key=value` via the command line

  -h, --help
          Print help (see a summary with '-h')

Hyperparameters:
  example.param2
        help for example.param2

按照提示,您可以使用以下命令指定参数值:-D example.param2=<value>

$ clap_mini # Default values
param1=1
param2=false

$ clap_mini -D example.param2=true
param1=1
param2=true

使用配置文件

Hyperparameter 还支持使用配置文件。以下示例显示了如何集成配置文件、命令行参数和用户定义的配置

use std::path::Path;

use clap::Parser;
use config::{self, File};
use hyperparameter::*;

#[derive(Parser)]
#[command(after_long_help=generate_params_help())]
struct CommandLineArgs {
    /// Specifies parameters in the format `-D key=value` on the command line
    #[arg(short = 'D', long)]
    define: Vec<String>,

    /// Specifies the configuration file path in the format `-C <path>` on the command line
    #[arg(short = 'C', long, default_value = "examples/rust/cfg.toml")]
    config: String,
}

fn main() {
    let args = CommandLineArgs::parse();
    let config_path = Path::new(&args.config);
    let config = config::Config::builder()
        .add_source(File::from(config_path))
        .build().unwrap();

    println!("param1={} // No scope", get_param!(example.param1, "default".to_string()));

    with_params! { // Configuration file parameter scope
        params config.param_scope();

        println!("param1={} // cfg file scope", get_param!(example.param1, "default".to_string()));
        with_params! { // Command-line arguments scope
            params ParamScope::from(&args.define);

            println!("param1={} // cmdline args scope", get_param!(example.param1, "default".to_string(), "Example param1"));
            with_params! { // User-defined scope
                set example.param1= "scoped".to_string();

                println!("param1={} // user-defined scope", get_param!(example.param1, "default".to_string()));
            }
        }
    }
}

直接执行命令 clap_layered 会产生以下输出

param1=default     // No scope            # Outside any specific scope
param1=from config // cfg file scope      # Entered configuration file scope, parameter value affected by the config file
param1=from config // cmdline args scope  # Entered command-line scope, command-line overrides config file
param1=scoped      // user-defined scope  # Entered user-defined scope, custom value overrides command-line

如你所见

  1. 嵌套作用域逐层覆盖,内层作用域中的参数会覆盖外层作用域中的参数。
  2. 命令行作用域未指定参数,因此从外层作用域继承值。

如果命令行指定了 example.param1 的值,将得到以下输入

$ clap_layered -D example.param1="from cmdline"
param1=default  // No scope
param1=from config      // cfg file scope
param1=from cmdline     // cmdline args scope
param1=scoped   // user-defined scope

依赖

~1.7–2.7MB
~52K SLoC