Manage the KV cache disc usage from preferences and stats
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -479,12 +479,63 @@ impl App {
|
||||
]
|
||||
.spacing(10),
|
||||
);
|
||||
let kv_cache_group = preference_group(
|
||||
"KV CACHE",
|
||||
column![
|
||||
preference_input_row(
|
||||
"Disc budget (GiB)",
|
||||
"How much disc the reusable prompt checkpoints of the endpoint and one-shot requests may occupy. When a new checkpoint does not fit, the least valuable older ones are deleted; they cost only a prefill to rebuild. Blank uses DS4's 4 GiB.",
|
||||
text_input("4", &self.preference_draft.kv_budget_gib)
|
||||
.on_input(Message::PreferenceKvBudgetChanged),
|
||||
),
|
||||
preference_input_row(
|
||||
"Minimum tokens",
|
||||
"Shortest prompt worth keeping a checkpoint for. Below this the prefill is cheaper than the disc traffic of storing and loading it.",
|
||||
text_input("512", &self.preference_draft.kv_min_tokens)
|
||||
.on_input(Message::PreferenceKvMinTokensChanged),
|
||||
),
|
||||
preference_input_row(
|
||||
"Cold maximum tokens",
|
||||
"Largest first prompt of a conversation that is still stored. Very long cold prompts write huge checkpoints that are rarely asked for a second time; 0 stops storing cold prompts entirely.",
|
||||
text_input("30000", &self.preference_draft.kv_cold_max_tokens)
|
||||
.on_input(Message::PreferenceKvColdMaxChanged),
|
||||
),
|
||||
preference_input_row(
|
||||
"Continued interval tokens",
|
||||
"How far a conversation has to grow before the next checkpoint of it is written. Wider spacing writes less and keeps fewer near-identical copies; 0 stores no continued checkpoints at all.",
|
||||
text_input("10000", &self.preference_draft.kv_continued_interval_tokens)
|
||||
.on_input(Message::PreferenceKvContinuedIntervalChanged),
|
||||
),
|
||||
text("Session checkpoints are not covered by the budget: they belong to their session and go away with it. Blank values keep the DS4 defaults.")
|
||||
.size(12),
|
||||
text(
|
||||
self.preference_draft
|
||||
.runtime()
|
||||
.map_or_else(
|
||||
|_| "Effective KV cache settings will appear after valid values are entered.".to_owned(),
|
||||
|runtime| {
|
||||
let settings = runtime.kv_cache.settings();
|
||||
format!(
|
||||
"Transient store: budget {} GiB • minimum {} • cold max {} • continued every {}",
|
||||
settings.budget_bytes / GIB,
|
||||
settings.min_tokens,
|
||||
if settings.cold_max_tokens == 0 { "off".to_owned() } else { settings.cold_max_tokens.to_string() },
|
||||
if settings.continued_interval_tokens == 0 { "off".to_owned() } else { settings.continued_interval_tokens.to_string() },
|
||||
)
|
||||
},
|
||||
)
|
||||
)
|
||||
.size(12),
|
||||
]
|
||||
.spacing(10),
|
||||
);
|
||||
let mut fields = column![
|
||||
model_group,
|
||||
endpoint_group,
|
||||
generation_group,
|
||||
execution_group,
|
||||
acceleration_group,
|
||||
kv_cache_group,
|
||||
steering_group,
|
||||
]
|
||||
.spacing(12);
|
||||
|
||||
Reference in New Issue
Block a user