From bddf8263c31c3dce3212263b00ebd2d98c1a752b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Gallou=C3=ABt?= Date: Wed, 23 Sep 2026 18:24:23 +0200 Subject: [PATCH 01/12] common : keep HF cache dir as path, expose UTF-8 only for logs (#29320) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restore get_cache_directory() as fs::path as string() can be lossy on Windows Partially reverts #29125 Signed-off-by: Adrien Gallouët --- common/hf-cache.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/common/hf-cache.cpp b/common/hf-cache.cpp index 4f8a1bb3d..12d4fcc80 100644 --- a/common/hf-cache.cpp +++ b/common/hf-cache.cpp @@ -30,8 +30,8 @@ namespace hf_cache { namespace fs = std::filesystem; -std::string get_cache_path() { - static const std::string cache = []() { +static fs::path get_cache_directory() { + static const fs::path cache = []() { struct { const char * var; fs::path path; @@ -46,14 +46,14 @@ std::string get_cache_path() { for (const auto & entry : entries) { if (auto * p = std::getenv(entry.var); p && *p) { fs::path base(p); - return (entry.path.empty() ? base : base / entry.path).string(); + return entry.path.empty() ? base : base / entry.path; } } #ifndef _WIN32 const struct passwd * pw = getpwuid(getuid()); if (pw && pw->pw_dir && *pw->pw_dir) { - return (fs::path(pw->pw_dir) / ".cache" / "huggingface" / "hub").string(); + return fs::path(pw->pw_dir) / ".cache" / "huggingface" / "hub"; } #endif throw std::runtime_error("Failed to determine HF cache directory"); @@ -62,6 +62,15 @@ std::string get_cache_path() { return cache; } +std::string get_cache_path() { +#if defined(__cpp_lib_char8_t) + const std::u8string u8str = get_cache_directory().u8string(); + return std::string(reinterpret_cast(u8str.data()), u8str.size()); +#else + return get_cache_directory().u8string(); +#endif +} + static std::string folder_name_to_repo(const std::string & folder) { constexpr std::string_view prefix = "models--"; if (folder.rfind(prefix, 0)) { @@ -80,7 +89,7 @@ static std::string repo_to_folder_name(const std::string & repo_id) { } static fs::path get_repo_path(const std::string & repo_id) { - return fs::path(get_cache_path()) / repo_to_folder_name(repo_id); + return get_cache_directory() / repo_to_folder_name(repo_id); } static bool is_hex_char(const char c) { @@ -393,7 +402,7 @@ static std::string get_cached_ref(const fs::path & repo_path) { } hf_files get_cached_files(const std::string & repo_id) { - const fs::path cache_path = get_cache_path(); + const fs::path cache_path = get_cache_directory(); if (!fs::exists(cache_path)) { return {}; } From 66fba63af1f4161052c33024d150cac31f46ff37 Mon Sep 17 00:00:00 2001 From: Aman Gupta Date: Thu, 24 Sep 2026 00:52:40 +0800 Subject: [PATCH 02/12] CUDA: add a reserve to avoid spurious warning on older GCC builds (#29317) --- ggml/src/ggml-cuda/ggml-cuda.cu | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ggml/src/ggml-cuda/ggml-cuda.cu b/ggml/src/ggml-cuda/ggml-cuda.cu index 60d72046e..27b83503d 100644 --- a/ggml/src/ggml-cuda/ggml-cuda.cu +++ b/ggml/src/ggml-cuda/ggml-cuda.cu @@ -3470,6 +3470,7 @@ static int ggml_cuda_try_fuse(ggml_backend_cuda_context * cuda_ctx, ggml_cgraph ggml_cuda_topk_moe_args args; const bool can_fuse = ggml_cuda_topk_moe_fusion(cgraph, i, args); std::vector ops; + ops.reserve(13); // max ops; avoids gcc -Wstringop-overflow false positive if (can_fuse) { const ggml_tensor * logits = node->src[0]; @@ -4539,6 +4540,7 @@ static void ggml_backend_cuda_graph_optimize(ggml_backend_t backend, ggml_cgraph ggml_cuda_topk_moe_args args; const bool can_fuse = ggml_cuda_topk_moe_fusion(cgraph, i, args); std::vector ops; + ops.reserve(13); // max ops; avoids gcc -Wstringop-overflow false positive const ggml_tensor * node = cgraph->nodes[i]; From e4e2f62325a95cfb52870c7cd5627f588b57c4e5 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Wed, 23 Sep 2026 20:10:09 +0300 Subject: [PATCH 03/12] ggml : bump version to 0.25.1 (ggml/1637) --- ggml/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ggml/CMakeLists.txt b/ggml/CMakeLists.txt index 9f9825f95..1df78fddf 100644 --- a/ggml/CMakeLists.txt +++ b/ggml/CMakeLists.txt @@ -5,7 +5,7 @@ project("ggml" C CXX ASM) ### GGML Version set(GGML_VERSION_MAJOR 0) set(GGML_VERSION_MINOR 25) -set(GGML_VERSION_PATCH 0) +set(GGML_VERSION_PATCH 1) set(GGML_VERSION_BASE "${GGML_VERSION_MAJOR}.${GGML_VERSION_MINOR}.${GGML_VERSION_PATCH}") list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/") From 177cd8cc70e8453938afc660885b905498d2d002 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Wed, 23 Sep 2026 20:28:23 +0300 Subject: [PATCH 04/12] sync : ggml --- scripts/sync-ggml.last | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/sync-ggml.last b/scripts/sync-ggml.last index 3befcace3..8f4afc721 100644 --- a/scripts/sync-ggml.last +++ b/scripts/sync-ggml.last @@ -1 +1 @@ -cae37675560bce40e5e8b7a505cb0cd06d211a5c +e565a8f4ce2e462c4973a24c51098dd3c81c0256 From 7fe450e19305b828c199d602c23a8337aaa1f03b Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Wed, 23 Sep 2026 20:32:51 +0300 Subject: [PATCH 05/12] llama.cpp : bump version to 0.5.0 (#29333) --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4feaf083e..8a874c96e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,8 +4,8 @@ include(CheckIncludeFileCXX) ### llama.cpp version set(LLAMA_VERSION_MAJOR 0) -set(LLAMA_VERSION_MINOR 4) -set(LLAMA_VERSION_PATCH 1) +set(LLAMA_VERSION_MINOR 5) +set(LLAMA_VERSION_PATCH 0) set(LLAMA_VERSION_BASE "${LLAMA_VERSION_MAJOR}.${LLAMA_VERSION_MINOR}.${LLAMA_VERSION_PATCH}") # whether this is a development/nightly build From fee39dd92673ba0c08c8da96040ce53368b35188 Mon Sep 17 00:00:00 2001 From: shaofeiqi Date: Wed, 23 Sep 2026 10:37:04 -0700 Subject: [PATCH 06/12] opencl: add A8 Q6_K non-MoE dp4a binary kernel (#29057) --- ggml/src/ggml-opencl/ggml-opencl.cpp | 81 ++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/ggml/src/ggml-opencl/ggml-opencl.cpp b/ggml/src/ggml-opencl/ggml-opencl.cpp index 91cd1a0ed..239821894 100644 --- a/ggml/src/ggml-opencl/ggml-opencl.cpp +++ b/ggml/src/ggml-opencl/ggml-opencl.cpp @@ -1259,6 +1259,7 @@ struct ggml_backend_opencl_context { cl_kernel kernel_gemm_noshuffle_q6_K_f32; cl_kernel kernel_gemm_noshuffle_q6_K_f32_cok; cl_kernel kernel_gemm_noshuffle_q6_k_f32_32b_trans_ila_a8_bin; + cl_kernel kernel_gemm_noshuffle_q6_k_q8_1_dp4a_ila_a8_bin; cl_kernel kernel_gemv_noshuffle_q6_k_f32_32b_trans; cl_kernel kernel_gemv_noshuffle_q5_k_f32; cl_kernel kernel_gemv_noshuffle_q5_k_f32_mc3; // multi-column (N=3) verify GEMV (spec/MTP) @@ -4407,6 +4408,7 @@ static void load_cl_kernels(ggml_backend_opencl_context *backend_ctx) { backend_ctx->kernel_gemv_noshuffle_q6_k_f32_32b_trans = nullptr; backend_ctx->kernel_gemm_noshuffle_q6_k_f32_32b_trans_ila_a8_bin = nullptr; + backend_ctx->kernel_gemm_noshuffle_q6_k_q8_1_dp4a_ila_a8_bin = nullptr; if (backend_ctx->adreno_gen == ADRENO_GPU_GEN::X2E) { { std::string opts = std::string("-cl-std=") + opencl_c_std + @@ -4439,6 +4441,17 @@ static void load_cl_kernels(ggml_backend_opencl_context *backend_ctx) { CL_CHECK(clReleaseProgram(bin_prog)); GGML_LOG_CONT("."); } + + kernel_bin = (const char *)backend_ctx->get_adreno_bin_kernel("gemm_noshuffle_q6_k_q8_1_dp4a_ila_a8", &bin_size); + if (kernel_bin && bin_size > 0) { + cl_program bin_prog = + build_program_from_binary(backend_ctx->context, backend_ctx->device, kernel_bin, "", bin_size); + + CL_CHECK((backend_ctx->kernel_gemm_noshuffle_q6_k_q8_1_dp4a_ila_a8_bin = + clCreateKernel(bin_prog, "kernel_gemm_noshuffle_q6_k_q8_1_dp4a_ila_a8", &err), err)); + CL_CHECK(clReleaseProgram(bin_prog)); + GGML_LOG_CONT("."); + } } } @@ -21919,6 +21932,74 @@ static void ggml_cl_mul_mat_q6_K_f32_adreno_ila(ggml_backend_t backend, const gg const int gemm_tile_n = 64; int N_pad = CEIL_DIV(N, gemm_tile_n) * gemm_tile_n; + static const char * q6_k_bin_dp4a_env = getenv("GGML_OPENCL_Q6_K_BIN_DP4A"); + bool q6_k_bin_dp4a_on = q6_k_bin_dp4a_env + ? (atoi(q6_k_bin_dp4a_env) != 0) + : true; + // dot prod has to be available + q6_k_bin_dp4a_on = backend_ctx->has_integer_dot && q6_k_bin_dp4a_on; + + if (q6_k_bin_dp4a_on && backend_ctx->kernel_gemm_noshuffle_q6_k_q8_1_dp4a_ila_a8_bin) { + const int dp4a_N_pad = CEIL_DIV(N, 32) * 32; + const size_t n_blocks = (size_t)dp4a_N_pad * (K / 32); + + backend_ctx->prealloc_moe_qa.allocate(context, (size_t)dp4a_N_pad * K * sizeof(cl_char)); + backend_ctx->prealloc_moe_da.allocate(context, n_blocks * sizeof(cl_half)); + backend_ctx->prealloc_moe_sa.allocate(context, n_blocks * sizeof(cl_half)); + + cl_mem b_sub = nullptr; + region.origin = offset1; + region.size = (size_t)K * N * sizeof(float); + CL_CHECK((b_sub = clCreateSubBuffer(extra1->data_device, 0, CL_BUFFER_CREATE_TYPE_REGION, ®ion, &err), err)); + + cl_int tb = (cl_int)((size_t)N * (K / 32)); + cl_kernel qk = backend_ctx->kernel_quant_a_q8_1; + CL_CHECK(clSetKernelArg(qk, 0, sizeof(cl_mem), &b_sub)); + CL_CHECK(clSetKernelArg(qk, 1, sizeof(cl_mem), &backend_ctx->prealloc_moe_qa.buffer)); + CL_CHECK(clSetKernelArg(qk, 2, sizeof(cl_mem), &backend_ctx->prealloc_moe_da.buffer)); + CL_CHECK(clSetKernelArg(qk, 3, sizeof(cl_mem), &backend_ctx->prealloc_moe_sa.buffer)); + CL_CHECK(clSetKernelArg(qk, 4, sizeof(cl_int), &tb)); + size_t q_local[1] = { 64 }; + size_t q_global[1] = { (size_t)CEIL_DIV(tb, 64) * 64 }; + backend_ctx->enqueue_ndrange_kernel(qk, 1, q_global, q_local, dst); + + cl_mem d_sub = nullptr; + cl_mem d_img = nullptr; + region.origin = offsetd; + region.size = (size_t)M * N * sizeof(float); + CL_CHECK((d_sub = clCreateSubBuffer(extrad->data_device, 0, CL_BUFFER_CREATE_TYPE_REGION, ®ion, &err), err)); + + img_fmt = { CL_R, CL_FLOAT }; + memset(&img_desc, 0, sizeof(img_desc)); + img_desc.image_type = CL_MEM_OBJECT_IMAGE1D_BUFFER; + img_desc.image_width = (size_t)M * N; + img_desc.buffer = d_sub; + CL_CHECK((d_img = clCreateImage(context, CL_MEM_WRITE_ONLY, &img_fmt, &img_desc, NULL, &err), err)); + + kernel = backend_ctx->kernel_gemm_noshuffle_q6_k_q8_1_dp4a_ila_a8_bin; + + cl_uint k_arg = 0; + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(cl_mem), &extra0_q6_K->ql_img)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(cl_mem), &extra0_q6_K->qh)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(cl_mem), &extra0_q6_K->s)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(cl_mem), &extra0_q6_K->d)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(cl_mem), &backend_ctx->prealloc_moe_qa.buffer)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(cl_mem), &backend_ctx->prealloc_moe_da.buffer)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(cl_mem), &d_img)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(int), &K)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(int), &M)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(int), &N)); + + size_t local_work_size[3] = { 64, 1, 1 }; + size_t global_work_size[3] = { 64, (size_t)(M / 64), (size_t)(dp4a_N_pad / 32) }; + backend_ctx->enqueue_ndrange_kernel(kernel, 3, global_work_size, local_work_size, dst); + + CL_CHECK(clReleaseMemObject(b_sub)); + CL_CHECK(clReleaseMemObject(d_img)); + CL_CHECK(clReleaseMemObject(d_sub)); + return; + } + cl_mem b_sub_buf = nullptr; cl_mem b_padded = nullptr; cl_mem b_buf = nullptr; From 6e60f35608ec6918b44a9839c0c433687165f086 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Wed, 23 Sep 2026 21:30:39 +0300 Subject: [PATCH 07/12] ci : use hf-jobs-cpu-xl runner in server sanitize workflow (#29297) Assisted-by: pi:llama.cpp/DeepSeek-V4-Flash-Vision-Exp --- .github/workflows/server-sanitize.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/server-sanitize.yml b/.github/workflows/server-sanitize.yml index 43746e91e..8ff285a42 100644 --- a/.github/workflows/server-sanitize.yml +++ b/.github/workflows/server-sanitize.yml @@ -45,7 +45,7 @@ concurrency: jobs: server: - runs-on: hf-jobs-cpu-upgrade + runs-on: hf-jobs-cpu-xl strategy: matrix: From d2e54583c7452353eb35d40431281f6ee984332f Mon Sep 17 00:00:00 2001 From: Masashi Yoshimura Date: Thu, 24 Sep 2026 05:27:27 +0900 Subject: [PATCH 08/12] tests: add `-b/--backend` option to test-llama-archs for testing a specific backend (#27372) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * tests: add backend option to test-llama-archs * Update tests/test-llama-archs.cpp Co-authored-by: Johannes Gäßler * remove extra space --------- Co-authored-by: Johannes Gäßler --- tests/test-llama-archs.cpp | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/tests/test-llama-archs.cpp b/tests/test-llama-archs.cpp index 488770297..27d00b0df 100644 --- a/tests/test-llama-archs.cpp +++ b/tests/test-llama-archs.cpp @@ -93,6 +93,7 @@ static void usage(char ** argv) { LOG(" -d, --stdev Set the standard deviation of the tensor initialization distribution (default: 0.1f)\n"); LOG(" -o, --out Save generated test models to instead of running backend tests\n"); LOG(" -v Set log verbosity level\n"); + LOG(" -b, --backend Run only on the given backend device\n"); LOG(" -h, --help Show this help message\n\n"); LOG("Examples:\n"); LOG(" %s\n", argv[0]); @@ -704,7 +705,7 @@ static int save_models(const std::string & arch_filter, const size_t seed, const return 0; } -static int test_backends(const std::string & arch_filter, const size_t seed, const float stdev, const int verbosity) { +static int test_backends(const std::string & arch_filter, const size_t seed, const float stdev, const int verbosity, const char * target_backend) { struct user_data_t { struct { ggml_log_callback callback; @@ -746,6 +747,9 @@ static int test_backends(const std::string & arch_filter, const size_t seed, con const size_t device_count = ggml_backend_dev_count(); for (size_t i = 0; i < device_count; i++) { ggml_backend_dev_t dev = ggml_backend_dev_get(i); + if (target_backend != nullptr && strcmp(target_backend, ggml_backend_dev_name(dev)) != 0) { + continue; + } dev_configs.emplace_back(std::vector{dev}, ggml_backend_dev_description(dev), LLAMA_SPLIT_MODE_LAYER); max_device_label_length = std::max(max_device_label_length, dev_configs.back().label.length()); @@ -756,7 +760,9 @@ static int test_backends(const std::string & arch_filter, const size_t seed, con } } - dev_configs.emplace_back(devices_meta, "Meta", LLAMA_SPLIT_MODE_TENSOR); + if (target_backend == nullptr) { + dev_configs.emplace_back(devices_meta, "Meta", LLAMA_SPLIT_MODE_TENSOR); + } } size_t max_arch_name_length = 0; @@ -907,6 +913,7 @@ int main(int argc, char ** argv) { size_t seed = rd(); float stdev = 0.1f; std::string out; + const char * target_backend = nullptr; int verbosity = LOG_LEVEL_ERROR; @@ -961,6 +968,19 @@ int main(int argc, char ** argv) { usage(argv); return 1; } + } else if (strcmp(argv[i], "-b") == 0 || strcmp(argv[i], "--backend") == 0) { + if (i + 1 < argc) { + const char * backend_name = argv[++i]; + ggml_backend_dev_t dev = ggml_backend_dev_by_name(backend_name); + if (dev == nullptr) { + LOG_ERR("%s: unknown backend device: %s\n", __func__, backend_name); + return 1; + } + target_backend = ggml_backend_dev_name(dev); + } else { + usage(argv); + return 1; + } } else { LOG_ERR("%s: unknown argument: %s\n", __func__, argv[i]); usage(argv); @@ -977,7 +997,7 @@ int main(int argc, char ** argv) { if (!out.empty()) { return save_models(arch_filter, seed, stdev, verbosity, out); } - return test_backends(arch_filter, seed, stdev, verbosity); + return test_backends(arch_filter, seed, stdev, verbosity, target_backend); } catch (const std::exception & err) { fprintf(stderr, "encountered runtime error: %s\n", err.what()); return -1; From b9ae43a5d4c27564963717281070991fa9b8c1bf Mon Sep 17 00:00:00 2001 From: Xuan-Son Nguyen Date: Thu, 24 Sep 2026 01:16:00 +0200 Subject: [PATCH 09/12] server: allow preset to set log file (#29334) --- tools/server/server-models.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/server/server-models.cpp b/tools/server/server-models.cpp index 91911c75f..841221d8c 100644 --- a/tools/server/server-models.cpp +++ b/tools/server/server-models.cpp @@ -467,7 +467,6 @@ static std::filesystem::path get_server_exec_path() { } static void unset_reserved_args(common_preset & preset, bool unset_model_args) { - preset.unset_option("LLAMA_ARG_LOG_FILE"); preset.unset_option("LLAMA_ARG_SSL_KEY_FILE"); preset.unset_option("LLAMA_ARG_SSL_CERT_FILE"); preset.unset_option("LLAMA_API_KEY"); @@ -585,8 +584,12 @@ server_models::server_models( base_preset(ctx_preset.load_from_args(argc, argv)), sched(std::make_unique(*this)), monitor(std::make_unique(*this)) { - // clean up base preset + // propagate base params to child unset_reserved_args(base_preset, true); + + // do not propagate these options, but allow preset to explicitly set them + base_preset.unset_option("LLAMA_ARG_LOG_FILE"); + // set binary path try { bin_path = get_server_exec_path().string(); From bd4f514db14d87fded667787a7a963bfbaa98e89 Mon Sep 17 00:00:00 2001 From: Tarek Dakhran Date: Thu, 24 Sep 2026 01:16:43 +0200 Subject: [PATCH 10/12] convert : allow vision target for DFlash/Dspark (#29339) Resolve the target arch with get_model_architecture so vision targets (e.g. Lfm2VlForConditionalGeneration) map to their text model for the vocab. Fix double rope reorder for LFM2/LFM2.5 DSpark drafters --- conversion/qwen.py | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/conversion/qwen.py b/conversion/qwen.py index ef5504f3d..64d606176 100644 --- a/conversion/qwen.py +++ b/conversion/qwen.py @@ -10,7 +10,7 @@ import torch if TYPE_CHECKING: from torch import Tensor -from .base import LazyTorchTensor, ModelBase, TextModel, gguf, logger +from .base import LazyTorchTensor, ModelBase, ModelType, TextModel, get_model_architecture, gguf, logger @ModelBase.register("QWenLMHeadModel") @@ -666,7 +666,7 @@ class DFlashModel(Qwen3Model): from . import get_model_class with open(self.target_model_dir / "config.json", "r", encoding="utf-8") as f: target_hparams = json.load(f) - target_arch = target_hparams["architectures"][0] + target_arch = get_model_architecture(target_hparams, ModelType.TEXT) target_cls = get_model_class(target_arch) if target_cls is not type(self): @@ -841,13 +841,6 @@ class DSparkModel(DFlashModel): return None return super().filter_tensors(item) - _ROPE_PERMUTE_SUFFIXES = ( - "self_attn.q_proj.weight", - "self_attn.k_proj.weight", - "self_attn.q_norm.weight", - "self_attn.k_norm.weight", - ) - def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: if name == "model.d2t": self._d2t = data_torch @@ -856,12 +849,6 @@ class DSparkModel(DFlashModel): if self._n_vocab_draft == self.hparams["vocab_size"] and name.endswith("lm_head.weight"): return - # interleaved-rope checkpoints (rope_is_neox_style = false) -> NeoX layout: per head, even dims first then odd - if not self.hparams.get("rope_is_neox_style", True) and name.endswith(self._ROPE_PERMUTE_SUFFIXES): - head_dim = self.hparams["head_dim"] - shape = data_torch.shape - data_torch = data_torch.reshape(-1, head_dim // 2, 2, *shape[1:]).transpose(1, 2).reshape(shape) - yield from super().modify_tensors(data_torch, name, bid) def prepare_tensors(self): From 013b31c03c87ac93aacf2652e83d1baa1a2d3ae4 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Thu, 24 Sep 2026 07:46:38 +0300 Subject: [PATCH 11/12] scripts : make-release-desc - link previous release in changelog title (#29336) make-release-desc.sh now emits "Changelog since [vX.Y.Z](/releases/tag/vX.Y.Z)" instead of a plain version string, so the release notes link back to the previous release. The repo URL is derived from the origin remote (SSH or HTTPS); if it cannot be resolved (local run without origin), the title falls back to plain text. Assisted-by: pi:llama.cpp/Qwen3.8-27B --- scripts/make-release-desc.sh | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/scripts/make-release-desc.sh b/scripts/make-release-desc.sh index 59aa67cba..80bbc218d 100755 --- a/scripts/make-release-desc.sh +++ b/scripts/make-release-desc.sh @@ -39,6 +39,15 @@ if ! git fetch --tags origin 2>/dev/null; then echo "Warning: could not fetch tags from origin (local run?)" fi +# Canonical https URL of this repository (from the origin remote), used to link the previous release. +# Left empty on local runs without an origin remote. +if ORIGIN_URL="$(git remote get-url origin 2>/dev/null)"; then + REPO_URL="https://$(printf '%s' "${ORIGIN_URL}" \ + | sed -E -e 's#^git@([^:]+):#https://\1/#' -e 's#^https?://##' -e 's#\.git$##')" +else + REPO_URL="" +fi + # Release commit: the commit points at when the tag exists, HEAD otherwise. if ! RELEASE_COMMIT="$(git rev-parse -q --verify "refs/tags/${VERSION}^{commit}" 2>/dev/null)"; then RELEASE_COMMIT="$(git rev-parse HEAD)" @@ -53,7 +62,11 @@ PREV="$( { git tag --list; echo "${VERSION}"; } \ if [[ -n "${PREV}" ]]; then CHANGELOG="$(git log --oneline "${PREV}..${RELEASE_COMMIT}")" - CHANGELOG_TITLE="Changelog since ${PREV}" + if [[ -n "${REPO_URL}" ]]; then + CHANGELOG_TITLE="Changelog since [${PREV}](${REPO_URL}/releases/tag/${PREV})" + else + CHANGELOG_TITLE="Changelog since ${PREV}" + fi else CHANGELOG="(no previous release tag found)" CHANGELOG_TITLE="Changelog" From 9710a32175b3b8f04636aaac4aa3cc28651b505d Mon Sep 17 00:00:00 2001 From: Jhen-Jie Hong Date: Thu, 24 Sep 2026 13:02:17 +0800 Subject: [PATCH 12/12] hexagon: reject MUL_MAT_ID when src1 precision is F32 (#29348) --- ggml/src/ggml-hexagon/ggml-hexagon.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ggml/src/ggml-hexagon/ggml-hexagon.cpp b/ggml/src/ggml-hexagon/ggml-hexagon.cpp index 58806e37f..9a3500250 100644 --- a/ggml/src/ggml-hexagon/ggml-hexagon.cpp +++ b/ggml/src/ggml-hexagon/ggml-hexagon.cpp @@ -5476,6 +5476,10 @@ static bool ggml_hexagon_supported_mul_mat_id(const struct ggml_hexagon_session return false; } + if (ggml_get_op_params_i32(op, 3) == GGML_PREC_F32) { + return false; + } + switch (src0->type) { case GGML_TYPE_Q4_0: case GGML_TYPE_Q4_1: