use clap::{Args, Subcommand, ValueEnum};
use std::path::PathBuf;
#[derive(Subcommand, Debug, Clone)]
pub enum BenchmarkCommand {
Tune(Box<BenchmarkTuneCommand>),
#[command(name = "import-prompts")]
ImportPrompts {
#[arg(long, value_enum)]
source: PromptImportSource,
#[arg(long, default_value = "20")]
limit: usize,
#[arg(long)]
max_tokens: Option<u32>,
#[arg(long)]
output: PathBuf,
},
}
#[derive(Args, Debug, Clone)]
pub struct BenchmarkTuneCommand {
#[arg(long, conflicts_with = "models")]
pub model: Option<String>,
#[arg(long, value_delimiter = ',')]
pub models: Vec<String>,
#[arg(long)]
pub json: bool,
#[arg(long, value_delimiter = ',')]
pub ctx_sizes: Vec<u32>,
#[arg(long, value_delimiter = ',')]
pub batch_sizes: Vec<u32>,
#[arg(long, value_delimiter = ',')]
pub ubatch_sizes: Vec<u32>,
#[arg(long = "mmap-values", value_delimiter = ',')]
pub mmap_values: Vec<BenchmarkBoolOrAuto>,
#[arg(long = "mlock-values", value_delimiter = ',')]
pub mlock_values: Vec<BenchmarkBool>,
#[arg(long = "flash-attention", value_delimiter = ',')]
pub flash_attention: Vec<BenchmarkFlashAttention>,
#[arg(
long = "speculative-types",
value_delimiter = ',',
conflicts_with = "no_speculative_tune"
)]
pub speculative_types: Vec<BenchmarkSpeculativeType>,
#[arg(
long = "no-speculative-tune",
conflicts_with_all = [
"speculative_types",
"spec_draft_models",
"spec_draft_max_tokens",
"spec_draft_min_tokens",
"spec_draft_acceptance_threshold",
"spec_draft_split_probability",
"spec_ngram_min",
"spec_ngram_max"
]
)]
pub no_speculative_tune: bool,
#[arg(long = "spec-draft-models", value_delimiter = ',')]
pub spec_draft_models: Vec<PathBuf>,
#[arg(long = "spec-draft-max-tokens", value_delimiter = ',')]
pub spec_draft_max_tokens: Vec<u32>,
#[arg(long = "spec-draft-min-tokens", value_delimiter = ',')]
pub spec_draft_min_tokens: Vec<u32>,
#[arg(long = "spec-ngram-min", value_delimiter = ',')]
pub spec_ngram_min: Vec<u32>,
#[arg(long = "spec-ngram-max", value_delimiter = ',')]
pub spec_ngram_max: Vec<u32>,
#[arg(long = "spec-draft-acceptance-threshold", value_delimiter = ',')]
pub spec_draft_acceptance_threshold: Vec<f64>,
#[arg(long = "spec-draft-split-probability", value_delimiter = ',')]
pub spec_draft_split_probability: Vec<f64>,
#[arg(long)]
pub apply: bool,
#[arg(long, requires = "apply")]
pub replace_existing: bool,
#[arg(long)]
pub launch_args: bool,
#[arg(long, default_value_t = 10.0)]
pub throughput_tolerance_pct: f64,
#[arg(long, default_value_t = 128)]
pub max_tokens: u32,
#[arg(long, default_value_t = 600)]
pub startup_timeout_secs: u64,
#[arg(long, default_value_t = 600)]
pub request_timeout_secs: u64,
#[arg(long)]
pub debug_telemetry: bool,
#[arg(
long,
default_value = "Write a concise paragraph about distributed GPU inference."
)]
pub prompt: String,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)]
pub enum BenchmarkBoolOrAuto {
Auto,
#[value(alias = "true")]
Enabled,
#[value(alias = "false")]
Disabled,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)]
pub enum BenchmarkBool {
#[value(alias = "true")]
Enabled,
#[value(alias = "false")]
Disabled,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)]
pub enum BenchmarkFlashAttention {
#[value(alias = "enabled", alias = "true", alias = "1")]
On,
#[value(alias = "disabled", alias = "false", alias = "0")]
Off,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)]
pub enum BenchmarkSpeculativeType {
Auto,
Disabled,
Mtp,
Draft,
MtpNgram,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)]
pub enum GpuBenchmarkBackend {
Metal,
Cuda,
Hip,
Intel,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)]
pub enum PromptImportSource {
MtBench,
Gsm8k,
Humaneval,
}