impl WarmupExecutor {
#[must_use]
pub fn new(config: WarmupConfig) -> Self {
Self { config }
}
#[must_use]
pub fn config(&self) -> &WarmupConfig {
&self.config
}
#[must_use]
pub fn simulate_warmup(&self) -> WarmupResult {
let start = Instant::now();
let mut latencies = Vec::with_capacity(self.config.warmup_iterations);
for i in 0..self.config.warmup_iterations {
let base_latency_us = if i == 0 { 1000 } else { 100 };
let jitter = (i * 10) as u64;
let latency = Duration::from_micros(base_latency_us - jitter.min(50));
latencies.push(latency);
}
WarmupResult::success(self.config.warmup_iterations, start.elapsed(), &latencies)
}
#[allow(dead_code)]
fn check_timeout(&self, start: Instant, iterations: usize) -> Option<WarmupResult> {
if start.elapsed() > self.config.timeout {
Some(WarmupResult::timed_out(iterations, start.elapsed()))
} else {
None
}
}
}
impl Default for WarmupExecutor {
fn default() -> Self {
Self::new(WarmupConfig::default())
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PreloadConfig {
pub models: Vec<PreloadModelConfig>,
pub parallel_loading: bool,
pub max_concurrent: usize,
pub fail_fast: bool,
}
impl Default for PreloadConfig {
fn default() -> Self {
Self {
models: Vec::new(),
parallel_loading: true,
max_concurrent: 4,
fail_fast: false,
}
}
}
impl PreloadConfig {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn with_model(mut self, model: PreloadModelConfig) -> Self {
self.models.push(model);
self
}
#[must_use]
pub fn with_parallel_loading(mut self, parallel: bool) -> Self {
self.parallel_loading = parallel;
self
}
#[must_use]
pub fn with_max_concurrent(mut self, max: usize) -> Self {
self.max_concurrent = max.max(1);
self
}
#[must_use]
pub fn with_fail_fast(mut self, fail_fast: bool) -> Self {
self.fail_fast = fail_fast;
self
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PreloadModelConfig {
pub model_id: String,
pub uri: String,
pub priority: u32,
pub warmup: bool,
pub warmup_config: Option<WarmupConfig>,
}
impl PreloadModelConfig {
#[must_use]
pub fn new(model_id: impl Into<String>, uri: impl Into<String>) -> Self {
Self {
model_id: model_id.into(),
uri: uri.into(),
priority: 100,
warmup: true,
warmup_config: None,
}
}
#[must_use]
pub fn with_priority(mut self, priority: u32) -> Self {
self.priority = priority;
self
}
#[must_use]
pub fn with_warmup(mut self, warmup: bool) -> Self {
self.warmup = warmup;
self
}
#[must_use]
pub fn with_warmup_config(mut self, config: WarmupConfig) -> Self {
self.warmup_config = Some(config);
self.warmup = true;
self
}
}