From bdb596217f76ca497187ba72e7c7aa2fd57def93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20du=20Hamel?= Date: Wed, 23 Sep 2026 17:01:06 +0200 Subject: [PATCH 1/2] feat: enable circular RoPE for qwen2.1 --- src/model/diffusion/qwen_image_2_1.hpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/model/diffusion/qwen_image_2_1.hpp b/src/model/diffusion/qwen_image_2_1.hpp index 1364de139..b0cd1c362 100644 --- a/src/model/diffusion/qwen_image_2_1.hpp +++ b/src/model/diffusion/qwen_image_2_1.hpp @@ -425,7 +425,26 @@ namespace Qwen { auto run = [&](const QwenImage21PrefixCache& active_cache) { const bool cached = active_cache.mode == QwenImage21PrefixCache::Mode::REUSE; const auto first_position = layout.positions.begin() + (cached ? layout.prefix_length : 0); - pe_data = Rope::embed_nd(std::vector>(first_position, layout.positions.end()), 1, 10000.f, config.axes_dim); + std::vector> wrap_dims; + if ((circular_y_enabled || circular_x_enabled) && config.axes_dim.size() >= 3) { + int h_len = shapes.back().first; + int w_len = shapes.back().second; + if (h_len > 0 && w_len > 0) { + size_t pos_len = layout.positions.size(); + wrap_dims.assign(config.axes_dim.size(), std::vector(pos_len, 0)); + size_t cursor = layout.prefix_length; + size_t img_tokens = static_cast(h_len) * static_cast(w_len); + for (size_t token_i = 0; token_i < img_tokens; ++token_i) { + if (circular_y_enabled) { + wrap_dims[1][cursor + token_i] = h_len; + } + if (circular_x_enabled) { + wrap_dims[2][cursor + token_i] = w_len; + } + } + } + } + pe_data = Rope::embed_nd(std::vector>(first_position, layout.positions.end()), 1, 10000.f, config.axes_dim, wrap_dims); mask_data.clear(); if (!cached) { for (const auto& segment : layout.segments) { From e864777c16779b43b0c1a6888887bc5dd8d993ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20du=20Hamel?= Date: Wed, 23 Sep 2026 17:27:13 +0200 Subject: [PATCH 2/2] format --- src/model/diffusion/qwen_image_2_1.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/model/diffusion/qwen_image_2_1.hpp b/src/model/diffusion/qwen_image_2_1.hpp index b0cd1c362..be5cd30fb 100644 --- a/src/model/diffusion/qwen_image_2_1.hpp +++ b/src/model/diffusion/qwen_image_2_1.hpp @@ -444,7 +444,7 @@ namespace Qwen { } } } - pe_data = Rope::embed_nd(std::vector>(first_position, layout.positions.end()), 1, 10000.f, config.axes_dim, wrap_dims); + pe_data = Rope::embed_nd(std::vector>(first_position, layout.positions.end()), 1, 10000.f, config.axes_dim, wrap_dims); mask_data.clear(); if (!cached) { for (const auto& segment : layout.segments) {