From 8cc2d81264c6089ae86fc25a9f7e6e75114d3590 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Tue, 17 Mar 2026 15:21:14 +0200 Subject: [PATCH 1/3] server : fix ctx checkpoint invalidation (#20671) --- tools/server/server-context.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/server/server-context.cpp b/tools/server/server-context.cpp index c47ad876c..05d6da100 100644 --- a/tools/server/server-context.cpp +++ b/tools/server/server-context.cpp @@ -2402,11 +2402,11 @@ private: } { - // erase any checkpoints with pos_min > pos_min_thold + // erase any checkpoints with pos_max > pos_next for (auto it = slot.prompt.checkpoints.begin(); it != slot.prompt.checkpoints.end();) { const auto & cur = *it; - if (cur.pos_min > pos_min_thold) { - SLT_WRN(slot, "erased invalidated context checkpoint (pos_min = %d, pos_max = %d, n_tokens = %" PRId64 ", n_swa = %d, size = %.3f MiB)\n", cur.pos_min, cur.pos_max, cur.n_tokens, n_swa, (float) cur.data.size() / 1024 / 1024); + if (cur.pos_max > pos_next) { + SLT_WRN(slot, "erased invalidated context checkpoint (pos_min = %d, pos_max = %d, n_tokens = %" PRId64 ", n_swa = %d, pos_next = %d, size = %.3f MiB)\n", cur.pos_min, cur.pos_max, cur.n_tokens, n_swa, pos_next, (float) cur.data.size() / 1024 / 1024); it = slot.prompt.checkpoints.erase(it); } else { ++it; From 3a5cb629b180a074e02056a40695528a2171254c Mon Sep 17 00:00:00 2001 From: Ruben Ortlam Date: Tue, 17 Mar 2026 14:27:23 +0100 Subject: [PATCH 2/3] vulkan: async and event fixes (#20518) * vulkan: fix event wait submission, event command buffer reset * fix event command buffer reset validation error * also reset command buffers before reuse * use timeline semaphores instead of fences for event_synchronize * don't use initializer list for semaphore wait info * use multiple events to avoid reset issues * fix event reuse issue with multiple vectors * add semaphore wait condition also if compute_ctx already exists * remove event pending stage --- ggml/src/ggml-vulkan/ggml-vulkan.cpp | 132 ++++++++++++++++++++------- 1 file changed, 97 insertions(+), 35 deletions(-) diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index e9b6778d6..3d8ce1067 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -191,6 +191,7 @@ struct vk_queue; struct vk_command_buffer { vk::CommandBuffer buf; + uint64_t use_counter = 0; bool in_use = false; }; @@ -938,21 +939,26 @@ struct vk_subbuffer { } }; -// vk_event is used for the event-related backend interfaces. It uses 'event' for -// event_wait and 'fence' for event_synchronize. Polling on an event for -// event_synchronize wouldn't be sufficient to wait for command buffers to complete, -// and would lead to validation errors. -struct vk_event { - vk::Event event; - vk::Fence fence; - vk_command_buffer* cmd_buffer = nullptr; -}; - struct vk_semaphore { vk::Semaphore s; uint64_t value; }; +// vk_event is used for the event-related backend interfaces. It uses vk::Events for +// event_wait and a timeline semaphore for event_synchronize. Polling on an event for +// event_synchronize wouldn't be sufficient to wait for command buffers to complete, +// and would lead to validation errors. +struct vk_event { + std::vector events_free; // Events available for reuse + std::vector events_submitted; // Events that are fully submitted and can be reused on next synchronize + vk::Event event; + bool has_event; + + vk_semaphore tl_semaphore; + vk_command_buffer* cmd_buffer = nullptr; + uint64_t cmd_buffer_use_counter = 0; +}; + struct vk_submission { vk_command_buffer* buffer = nullptr; std::vector wait_semaphores; @@ -2319,7 +2325,7 @@ static vk_command_buffer* ggml_vk_create_cmd_buffer(vk_device& device, vk_comman vk::CommandBufferLevel::ePrimary, 1); const std::vector cmd_buffers = device->device.allocateCommandBuffers(command_buffer_alloc_info); - p.cmd_buffers.push_back({ cmd_buffers.front(), true }); + p.cmd_buffers.push_back({ cmd_buffers.front(), 0, true }); return &p.cmd_buffers[p.cmd_buffers.size()-1]; } @@ -2788,6 +2794,15 @@ static void ggml_vk_sync_buffers(ggml_backend_vk_context* ctx, vk_context& subct ); } +static void ggml_vk_reset_event(vk_context& ctx, vk::Event& event) { + VK_LOG_DEBUG("ggml_vk_set_event()"); + + ctx->s->buffer->buf.resetEvent( + event, + ctx->p->q->stage_flags + ); +} + static void ggml_vk_set_event(vk_context& ctx, vk::Event& event) { VK_LOG_DEBUG("ggml_vk_set_event()"); @@ -6396,6 +6411,7 @@ static vk_subbuffer ggml_vk_tensor_subbuffer( static vk_command_buffer* ggml_vk_get_or_create_cmd_buffer(vk_device& device, vk_command_pool& pool) { for (auto& cmd_buffer : pool.cmd_buffers) { if (!cmd_buffer.in_use) { + cmd_buffer.use_counter++; cmd_buffer.in_use = true; return &cmd_buffer; } @@ -6500,15 +6516,16 @@ static void ggml_vk_ctx_begin(vk_device& device, vk_context& subctx) { } static vk_context ggml_vk_get_compute_ctx(ggml_backend_vk_context * ctx) { + vk_context result; if (!ctx->compute_ctx.expired()) { - return ctx->compute_ctx.lock(); + result = ctx->compute_ctx.lock(); + } else { + result = ggml_vk_create_context(ctx, ctx->compute_cmd_pool); + + ctx->compute_ctx = result; + ggml_vk_ctx_begin(ctx->device, result); } - vk_context result = ggml_vk_create_context(ctx, ctx->compute_cmd_pool); - - ctx->compute_ctx = result; - ggml_vk_ctx_begin(ctx->device, result); - if (ctx->device->async_use_transfer_queue && ctx->transfer_semaphore_last_submitted < ctx->transfer_semaphore.value) { result->s->wait_semaphores.push_back(ctx->transfer_semaphore); ctx->transfer_semaphore_last_submitted = ctx->transfer_semaphore.value; @@ -13801,6 +13818,7 @@ static void ggml_vk_synchronize(ggml_backend_vk_context * ctx) { ctx->submit_pending = false; if (cmd_buf) { cmd_buf->in_use = false; + cmd_buf->buf.reset(); } } @@ -14862,18 +14880,31 @@ static void ggml_backend_vk_event_record(ggml_backend_t backend, ggml_backend_ev vk_context compute_ctx = ggml_vk_get_compute_ctx(ctx); auto* cmd_buf = compute_ctx->s->buffer; // retrieve pointer before it gets reset - // the backend interface doesn't have an explicit reset, so reset it here - // before we record the command to set it - ctx->device->device.resetEvent(vkev->event); - ctx->device->device.resetFences({ vkev->fence }); + if (vkev->has_event) { + // Move existing event into submitted + vkev->events_submitted.push_back(vkev->event); + } + + // Grab the next event and record it, create one if necessary + if (vkev->events_free.empty()) { + vkev->event = ctx->device->device.createEvent({}); + } else { + vkev->event = vkev->events_free.back(); + vkev->events_free.pop_back(); + } + + vkev->has_event = true; ggml_vk_set_event(compute_ctx, vkev->event); + vkev->tl_semaphore.value++; + compute_ctx->s->signal_semaphores.push_back(vkev->tl_semaphore); ggml_vk_ctx_end(compute_ctx); - ggml_vk_submit(compute_ctx, {vkev->fence}); + ggml_vk_submit(compute_ctx, {}); ctx->submit_pending = true; vkev->cmd_buffer = cmd_buf; + vkev->cmd_buffer_use_counter = cmd_buf->use_counter; ctx->compute_ctx.reset(); } @@ -14884,9 +14915,10 @@ static void ggml_backend_vk_event_wait(ggml_backend_t backend, ggml_backend_even vk_context compute_ctx = ggml_vk_get_compute_ctx(ctx); - ggml_vk_wait_events(compute_ctx, {vkev->event}); - ggml_vk_ctx_end(compute_ctx); - ctx->compute_ctx.reset(); + if (vkev->has_event) { + // Wait for latest event + ggml_vk_wait_events(compute_ctx, { vkev->event }); + } } // TODO: enable async and synchronize @@ -15676,10 +15708,13 @@ static ggml_backend_event_t ggml_backend_vk_device_event_new(ggml_backend_dev_t return nullptr; } - // The event/fence is expected to initially be in the signaled state. - vkev->event = device->device.createEvent({}); - vkev->fence = device->device.createFence({vk::FenceCreateFlagBits::eSignaled}); - device->device.setEvent(vkev->event); + // No events initially, they get created on demand + vkev->has_event = false; + + vk::SemaphoreTypeCreateInfo tci{ vk::SemaphoreType::eTimeline, 0 }; + vk::SemaphoreCreateInfo ci{}; + ci.setPNext(&tci); + vkev->tl_semaphore = { device->device.createSemaphore(ci), 0 }; return new ggml_backend_event { /* .device = */ dev, @@ -15693,8 +15728,16 @@ static void ggml_backend_vk_device_event_free(ggml_backend_dev_t dev, ggml_backe vk_event *vkev = (vk_event *)event->context; - device->device.destroyFence(vkev->fence); - device->device.destroyEvent(vkev->event); + device->device.destroySemaphore(vkev->tl_semaphore.s); + for (auto& event : vkev->events_free) { + device->device.destroyEvent(event); + } + for (auto& event : vkev->events_submitted) { + device->device.destroyEvent(event); + } + if (vkev->has_event) { + device->device.destroyEvent(vkev->event); + } delete vkev; delete event; } @@ -15705,10 +15748,29 @@ static void ggml_backend_vk_device_event_synchronize(ggml_backend_dev_t dev, ggm auto device = ggml_vk_get_device(ctx->device); vk_event *vkev = (vk_event *)event->context; - VK_CHECK(device->device.waitForFences({ vkev->fence }, true, UINT64_MAX), "event_synchronize"); - // Finished using current command buffer so we flag for reuse - if (vkev->cmd_buffer) { - vkev->cmd_buffer->in_use = false; + // Only do something if the event has actually been used + if (vkev->has_event) { + vk::Semaphore sem = vkev->tl_semaphore.s; + uint64_t val = vkev->tl_semaphore.value; + vk::SemaphoreWaitInfo swi{vk::SemaphoreWaitFlags{}, sem, val}; + VK_CHECK(device->device.waitSemaphores(swi, UINT64_MAX), "event_synchronize"); + + // Reset and move submitted events + for (auto& event : vkev->events_submitted) { + device->device.resetEvent(event); + } + vkev->events_free.insert(vkev->events_free.end(), vkev->events_submitted.begin(), vkev->events_submitted.end()); + vkev->events_submitted.clear(); + + // Finished using current command buffer so we flag for reuse + if (vkev->cmd_buffer) { + // Only flag for reuse if it hasn't been reused already + if (vkev->cmd_buffer_use_counter == vkev->cmd_buffer->use_counter) { + vkev->cmd_buffer->in_use = false; + vkev->cmd_buffer->buf.reset(); + } + vkev->cmd_buffer = nullptr; + } } } From ab0bb93748cd4c9e105beadb46ffc9c665fc4178 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigbj=C3=B8rn=20Skj=C3=A6ret?= Date: Tue, 17 Mar 2026 14:54:31 +0100 Subject: [PATCH 3/3] ci : bump ccache [no ci] (#20679) * bump ccache * forgotten * disable for s390x * disable also for ppc64le --- .github/workflows/build-apple.yml | 6 +-- .github/workflows/build-sanitize.yml | 2 +- .github/workflows/build-vulkan.yml | 2 +- .github/workflows/build.yml | 45 ++++++++++++----------- .github/workflows/copilot-setup-steps.yml | 4 +- .github/workflows/release.yml | 23 ++++++------ 6 files changed, 42 insertions(+), 40 deletions(-) diff --git a/.github/workflows/build-apple.yml b/.github/workflows/build-apple.yml index 51f0ef230..b99e61466 100644 --- a/.github/workflows/build-apple.yml +++ b/.github/workflows/build-apple.yml @@ -46,7 +46,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: macOS-latest-ios evict-old-files: 1d @@ -124,7 +124,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: macOS-latest-tvos evict-old-files: 1d @@ -186,7 +186,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: macOS-latest-swift evict-old-files: 1d diff --git a/.github/workflows/build-sanitize.yml b/.github/workflows/build-sanitize.yml index 0b1785750..c7b73d1dd 100644 --- a/.github/workflows/build-sanitize.yml +++ b/.github/workflows/build-sanitize.yml @@ -43,7 +43,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ubuntu-latest-sanitizer-${{ matrix.sanitizer }} evict-old-files: 1d diff --git a/.github/workflows/build-vulkan.yml b/.github/workflows/build-vulkan.yml index b25ec5147..dba240a37 100644 --- a/.github/workflows/build-vulkan.yml +++ b/.github/workflows/build-vulkan.yml @@ -45,7 +45,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ubuntu-24-vulkan-llvmpipe evict-old-files: 1d diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fef08d4c0..6d500d309 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -69,7 +69,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: macOS-latest-arm64 evict-old-files: 1d @@ -105,7 +105,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: macOS-latest-x64 evict-old-files: 1d @@ -141,7 +141,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: macOS-latest-arm64-webgpu evict-old-files: 1d @@ -195,7 +195,8 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + if: ${{ matrix.build != 's390x' && matrix.build != 'ppc64le' }} + uses: ggml-org/ccache-action@v1.2.21 with: key: ubuntu-cpu-${{ matrix.build }} evict-old-files: 1d @@ -324,7 +325,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ubuntu-24-webgpu evict-old-files: 1d @@ -436,7 +437,7 @@ jobs: sudo apt-get install -y build-essential git cmake rocblas-dev hipblas-dev libssl-dev rocwmma-dev - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ubuntu-22-hip evict-old-files: 1d @@ -467,7 +468,7 @@ jobs: apt-get install -y build-essential git cmake libssl-dev - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ubuntu-22-musa evict-old-files: 1d @@ -513,7 +514,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ubuntu-22-sycl evict-old-files: 1d @@ -562,7 +563,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ubuntu-22-sycl-fp16 evict-old-files: 1d @@ -605,7 +606,7 @@ jobs: - name: ccache if: runner.environment == 'github-hosted' - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ubuntu-24-openvino-${{ matrix.variant }}-no-preset-v1 evict-old-files: 1d @@ -692,7 +693,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: windows-latest-${{ matrix.build }} variant: ccache @@ -798,7 +799,7 @@ jobs: apt install -y cmake build-essential ninja-build libgomp1 git libssl-dev - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ubuntu-latest-cuda evict-old-files: 1d @@ -830,7 +831,7 @@ jobs: uses: actions/checkout@v6 - name: Install ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: windows-cuda-${{ matrix.cuda }} variant: ccache @@ -883,7 +884,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: windows-latest-sycl variant: ccache @@ -944,7 +945,7 @@ jobs: & $clangPath.FullName --version - name: Install ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ${{ github.job }} evict-old-files: 1d @@ -1068,7 +1069,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ggml-ci-x64-cpu-low-perf evict-old-files: 1d @@ -1094,7 +1095,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ggml-ci-arm64-cpu-low-perf evict-old-files: 1d @@ -1120,7 +1121,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ggml-ci-x64-cpu-high-perf evict-old-files: 1d @@ -1146,7 +1147,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ggml-ci-arm64-cpu-high-perf evict-old-files: 1d @@ -1172,7 +1173,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ggml-ci-arm64-cpu-high-perf-sve evict-old-files: 1d @@ -1198,7 +1199,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ggml-ci-arm64-cpu-kleidiai evict-old-files: 1d @@ -1250,7 +1251,7 @@ jobs: sudo apt-get install -y cmake - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ggml-ci-arm64-cpu-kleidiai-graviton4 evict-old-files: 1d diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml index fc3cec5ea..749debee4 100644 --- a/.github/workflows/copilot-setup-steps.yml +++ b/.github/workflows/copilot-setup-steps.yml @@ -29,7 +29,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: copilot-setup-steps evict-old-files: 1d @@ -52,6 +52,6 @@ jobs: - name: Install Python dependencies run: | python3 -m venv .venv - .venv/bin/activate + source .venv/bin/activate pip install -r requirements/requirements-all.txt -r tools/server/tests/requirements.txt pip install flake8 pyright pre-commit diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b0f2714ff..c3181f177 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -47,7 +47,7 @@ jobs: fetch-depth: 0 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: macOS-latest-arm64 evict-old-files: 1d @@ -94,7 +94,7 @@ jobs: fetch-depth: 0 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: macOS-latest-x64 evict-old-files: 1d @@ -153,7 +153,8 @@ jobs: fetch-depth: 0 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + if: ${{ matrix.build != 's390x' }} + uses: ggml-org/ccache-action@v1.2.21 with: key: ubuntu-cpu-${{ matrix.build }} evict-old-files: 1d @@ -204,7 +205,7 @@ jobs: fetch-depth: 0 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ubuntu-22-vulkan evict-old-files: 1d @@ -269,7 +270,7 @@ jobs: fetch-depth: 0 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ubuntu-24-openvino-release-no-preset-v1 evict-old-files: 1d @@ -342,7 +343,7 @@ jobs: fetch-depth: 0 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: windows-latest-cpu-${{ matrix.arch }} variant: ccache @@ -403,7 +404,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: windows-latest-${{ matrix.backend }}-${{ matrix.arch }} variant: ccache @@ -473,7 +474,7 @@ jobs: uses: actions/checkout@v6 - name: Install ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: windows-cuda-${{ matrix.cuda }} variant: ccache @@ -549,7 +550,7 @@ jobs: uses: actions/checkout@v6 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: windows-latest-sycl variant: ccache @@ -629,7 +630,7 @@ jobs: fetch-depth: 0 - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: ubuntu-rocm-${{ matrix.ROCM_VERSION }}-${{ matrix.build }} evict-old-files: 1d @@ -739,7 +740,7 @@ jobs: key: rocm-${{ env.HIPSDK_INSTALLER_VERSION }}-${{ runner.os }} - name: ccache - uses: ggml-org/ccache-action@v1.2.16 + uses: ggml-org/ccache-action@v1.2.21 with: key: windows-latest-hip-${{ env.HIPSDK_INSTALLER_VERSION }}-${{ matrix.name }}-x64 evict-old-files: 1d