From b6947b8bdc84552ec5f9af47e61112ee174ab9c4 Mon Sep 17 00:00:00 2001 From: losewayy <1134285612@qq.com> Date: Tue, 6 Oct 2026 17:19:56 +0800 Subject: [PATCH] fix: avoid f16 overflow in Z-Image quantized matmuls on CUDA (#2074) Co-authored-by: leejet --- src/model/common/ggml_block.hpp | 5 +++++ src/model/diffusion/z_image.hpp | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/model/common/ggml_block.hpp b/src/model/common/ggml_block.hpp index 3567fd7b..1d35b417 100644 --- a/src/model/common/ggml_block.hpp +++ b/src/model/common/ggml_block.hpp @@ -205,6 +205,11 @@ public: force_prec_f32 = force_prec_f32_; } + bool has_quantized_weight() const { + auto it = params.find("weight"); + return it != params.end() && it->second != nullptr && ggml_is_quantized(it->second->type); + } + ggml_tensor* forward(GGMLRunnerContext* ctx, ggml_tensor* x) override { ggml_tensor* w = params["weight"]; const float scale = ctx->linear_scale > 0.f ? ctx->linear_scale : this->scale; diff --git a/src/model/diffusion/z_image.hpp b/src/model/diffusion/z_image.hpp index 2b330a1a..ed264404 100644 --- a/src/model/diffusion/z_image.hpp +++ b/src/model/diffusion/z_image.hpp @@ -168,13 +168,16 @@ namespace ZImage { int64_t N = x->ne[2]; auto out_proj = std::dynamic_pointer_cast(blocks[split_qkv ? "to_out.0" : "out"]); + if (out_proj->has_quantized_weight()) { + out_proj->set_scale(1.f / 16.f); + } + if (split_qkv) { auto q_proj = std::dynamic_pointer_cast(blocks["to_q"]); auto k_proj = std::dynamic_pointer_cast(blocks["to_k"]); auto v_proj = std::dynamic_pointer_cast(blocks["to_v"]); if (sd_backend_is(ctx->backend, "ROCm")) { - out_proj->set_scale(1.f / 16.f); out_proj->set_force_prec_f32(true); q_proj->set_force_prec_f32(true); k_proj->set_force_prec_f32(true); @@ -197,7 +200,6 @@ namespace ZImage { auto qkv_proj = std::dynamic_pointer_cast(blocks["qkv"]); if (sd_backend_is(ctx->backend, "ROCm")) { - out_proj->set_scale(1.f / 16.f); out_proj->set_force_prec_f32(true); qkv_proj->set_force_prec_f32(true); }