use super::types::App;
impl App {
pub fn update_vram_estimate(&mut self) {
if let Some(model) = self.selected_model() {
let model_mib = model.file_size / (1024 * 1024);
let hidden = if self.loading.model_hidden_size > 0 {
Some(self.loading.model_hidden_size)
} else {
None
};
let n_head = if self.loading.model_n_head > 0 {
Some(self.loading.model_n_head)
} else {
None
};
let n_kv_head = if self.loading.model_n_kv_head > 0 {
Some(self.loading.model_n_kv_head)
} else {
None
};
let gpu_mem_total_mib = self.metrics.gpu_mem_total / (1024 * 1024);
self.loading.vram_estimate = crate::models::estimate_vram_mib(
model_mib,
&self.settings,
self.loading.model_total_layers,
hidden,
n_head,
n_kv_head,
gpu_mem_total_mib,
);
}
}
pub fn update_model_metadata(&mut self) {
let model = match self.selected_model() {
Some(m) => m.clone(),
None => return,
};
let key = model.path.to_string_lossy().to_string();
if let Ok(meta) = std::fs::metadata(&model.path) {
let mtime = meta.modified().unwrap_or(std::time::SystemTime::now());
let (last_path, last_mtime) = &self.loading.last_metadata_parse;
if last_path == &model.path && mtime == *last_mtime {
if let Some(cached) = self.search.gguf_metadata_cache.get(&key) {
self.loading.model_total_layers = cached.layers;
self.loading.model_hidden_size = cached.hidden_size;
self.loading.model_n_ctx_train = cached.n_ctx_train;
self.loading.model_n_head = cached.n_head;
self.loading.model_n_kv_head = cached.n_kv_head;
}
if self.loading.model_hidden_size > 0 {
self.update_vram_estimate();
}
return;
}
self.loading.last_metadata_parse = (model.path.clone(), mtime);
}
const MAX_CACHE_SIZE: usize = 50;
if self.search.gguf_metadata_cache.len() > MAX_CACHE_SIZE
&& let Some(first_key) = self.search.gguf_metadata_cache.keys().next().cloned() {
self.search.gguf_metadata_cache.remove(&first_key);
}
if let Ok(meta) = crate::models::GgufMetadata::from_path(&model.path) {
self.loading.model_total_layers = meta.layers;
self.loading.model_hidden_size = meta.hidden_size;
self.loading.model_n_ctx_train = meta.n_ctx_train;
self.loading.model_n_head = meta.n_head;
self.loading.model_n_kv_head = meta.n_kv_head;
if meta.arch == "mtp" {
self.settings.spec_type = "draft-mtp".to_string();
self.settings.draft_tokens = meta.draft_tokens;
}
self.search.gguf_metadata_cache.insert(key, meta);
} else {
self.add_log(
format!("Failed to parse GGUF metadata for {}", model.path.display()),
crate::config::LogLevel::Error,
);
}
if self.loading.model_hidden_size > 0 {
self.update_vram_estimate();
}
}
}