Jev-Bonsai-Compass / native /source /local-qwen35.patch
ajh-code's picture
Publish Jev-Bonsai-Compass runtime, adapter, card and evidence
b4b0f75 verified
Raw History Blame Contribute Delete
1.49 kB
diff --git a/src/models/qwen35.cpp b/src/models/qwen35.cpp
index 8e0944bc5..ecc2c569d 100644
--- a/src/models/qwen35.cpp
+++ b/src/models/qwen35.cpp
@@ -1,5 +1,6 @@
#include "models.h"
#include "llama-memory-recurrent.h"
+#include "llama-impl.h" // llama_mul_mat_hadamard
void llama_model_qwen35::load_arch_hparams(llama_model_loader & ml) {
ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps);
@@ -595,6 +596,20 @@ llama_model_qwen35::graph_mtp::graph_mtp(const llama_model & model, const llm_gr
ggml_tensor * tok_embd_w = layer.nextn.embed_tokens ? layer.nextn.embed_tokens : model.tok_embd;
tok_embd = ggml_get_rows(ctx0, tok_embd_w, inp->tokens);
+
+ // a Hadamard-latent embedding table stores rotated rows; restore the
+ // primal basis right after the lookup: h = s * (H z). The main graph does
+ // this in llm_graph_context::build_inp_embd(); this graph has its own lookup
+ // and must do the same or llama_verify_hadamard_graph rejects the context.
+ if (hadamard_inverses) {
+ const auto it = hadamard_inverses->find(tok_embd_w);
+ if (it != hadamard_inverses->end()) {
+ tok_embd = llama_mul_mat_hadamard(ctx0, tok_embd, it->second.rot);
+ if (it->second.signs) {
+ tok_embd = ggml_mul(ctx0, tok_embd, it->second.signs);
+ }
+ }
+ }
} else {
tok_embd = inp->embd;
}