fix: re-clamp streaming VRAM budget to currently free memory (#1878)

This commit is contained in:
fszontagh 2026-08-19 16:21:21 +02:00 committed by GitHub
parent 58b6cb6b0c
commit 1706b32813
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -2456,13 +2456,14 @@ protected:
GGML_ASSERT(gf != nullptr); GGML_ASSERT(gf != nullptr);
size_t effective_budget = max_graph_vram_bytes; size_t effective_budget = max_graph_vram_bytes;
size_t free_clamp = SIZE_MAX;
if (stream_layers_enabled && max_graph_vram_bytes > 0 && runtime_backend != nullptr) { if (stream_layers_enabled && max_graph_vram_bytes > 0 && runtime_backend != nullptr) {
ggml_backend_dev_t dev = ggml_backend_get_device(runtime_backend); ggml_backend_dev_t dev = ggml_backend_get_device(runtime_backend);
if (dev != nullptr && ggml_backend_dev_type(dev) != GGML_BACKEND_DEVICE_TYPE_CPU) { if (dev != nullptr && ggml_backend_dev_type(dev) != GGML_BACKEND_DEVICE_TYPE_CPU) {
size_t free_vram = 0, total_vram = 0; size_t free_vram = 0, total_vram = 0;
ggml_backend_dev_memory(dev, &free_vram, &total_vram); ggml_backend_dev_memory(dev, &free_vram, &total_vram);
constexpr size_t safety_margin = 512ull * 1024 * 1024; constexpr size_t safety_margin = 512ull * 1024 * 1024;
size_t free_clamp = (free_vram > safety_margin) ? (free_vram - safety_margin) : 0; free_clamp = (free_vram > safety_margin) ? (free_vram - safety_margin) : 0;
if (free_clamp < effective_budget) { if (free_clamp < effective_budget) {
LOG_DEBUG("%s clamping streaming budget: actual free VRAM %.2f MB < user cap %.2f MB", LOG_DEBUG("%s clamping streaming budget: actual free VRAM %.2f MB < user cap %.2f MB",
get_desc().c_str(), get_desc().c_str(),
@ -2479,7 +2480,9 @@ protected:
observed_max_effective_budget_ = effective_budget; observed_max_effective_budget_ = effective_budget;
budget_increased = true; budget_increased = true;
} else { } else {
effective_budget = observed_max_effective_budget_; // Keep the plan cache stable, but never plan above what is free now:
// another model or process can take VRAM after the first measurement.
effective_budget = std::min(observed_max_effective_budget_, free_clamp);
} }
} }