From 1990a93f501ffb55756ae2aaebaec44a593f623d Mon Sep 17 00:00:00 2001 From: leejet Date: Sun, 1 Nov 2026 21:29:35 +0800 Subject: [PATCH 1/2] fix: retry Vulkan capacity checks after memory reclamation --- src/model_manager.cpp | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/model_manager.cpp b/src/model_manager.cpp index d07d63a810..1625b389d9 100644 --- a/src/model_manager.cpp +++ b/src/model_manager.cpp @@ -1,9 +1,11 @@ #include "model_manager.h" #include +#include #include #include #include +#include #include #include @@ -2006,10 +2008,30 @@ bool ModelManager::ensure_compute_backend_capacity( } revert_demotions(); - if (check_capacity(request, required_states).fits()) { + auto capacity = check_capacity(request, required_states); + if (capacity.fits()) { return true; } - const auto capacity = check_capacity(request, required_states, true); + if (sd_backend_is(compute_backend, "Vulkan") && + capacity.required_budget_bytes <= capacity.available_budget_bytes) { + ggml_backend_synchronize(compute_backend); + sd_backend_clear_buffer_cache(compute_backend); + // Vulkan heap usage can lag behind buffer releases. Fast memory queries + // must not turn that reporting delay into an allocation failure. + const auto deadline = std::chrono::steady_clock::now() + std::chrono::milliseconds(100); + for (;;) { + capacity = check_capacity(request, required_states); + if (capacity.fits()) { + return true; + } + if (capacity.required_budget_bytes > capacity.available_budget_bytes || + std::chrono::steady_clock::now() >= deadline) { + break; + } + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + } + } + capacity = check_capacity(request, required_states, true); const std::string available_device = capacity.available_device_bytes == SIZE_MAX ? "unknown" : sd_format("%.2f MB", capacity.available_device_bytes / (1024.0 * 1024.0)); From f9355068ea78d19645270119e4aa89ce25299211 Mon Sep 17 00:00:00 2001 From: leejet Date: Sun, 1 Nov 2026 22:12:22 +0800 Subject: [PATCH 2/2] fix: respect reclamation flag in Vulkan capacity checks --- src/model_manager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/model_manager.cpp b/src/model_manager.cpp index 1625b389d9..8b6182797f 100644 --- a/src/model_manager.cpp +++ b/src/model_manager.cpp @@ -2009,7 +2009,7 @@ bool ModelManager::ensure_compute_backend_capacity( revert_demotions(); auto capacity = check_capacity(request, required_states); - if (capacity.fits()) { + if (!capacity.requires_reclamation && capacity.fits()) { return true; } if (sd_backend_is(compute_backend, "Vulkan") && @@ -2021,7 +2021,7 @@ bool ModelManager::ensure_compute_backend_capacity( const auto deadline = std::chrono::steady_clock::now() + std::chrono::milliseconds(100); for (;;) { capacity = check_capacity(request, required_states); - if (capacity.fits()) { + if (!capacity.requires_reclamation && capacity.fits()) { return true; } if (capacity.required_budget_bytes > capacity.available_budget_bytes ||