[讨论] apply_lora 用 in_features == out_features 选层,实际只挂到 q_proj / o_proj #849
a0917-cell
started this conversation in
Ideas
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
model/model_lora.py里挑选注入层的条件是形状:在当前主线结构下实际命中的是哪些层,跑一遍数出来:
q_proj、o_projq_proj、o_projuse_moe=Trueq_proj、o_projhead_dim=128两点观察
1. 落到的是 q 和 o,而不是常见的 q 和 v。
k_proj/v_proj因为 GQA(num_key_value_heads=4)是 768→384,非方阵;MLP 的gate/up/down是 768↔2432;lm_head是 768→6400。所以形状条件筛完只剩q_proj(768→768)与o_proj(768→768)。LoRA 原论文的默认配方是$W_q$ 与 $W_v$ ,而这里 $W_v$ 恰好因为 GQA 被形状条件排除、$W_o$ 恰好因为是 $W_q$ 的转置形状被包含进来。结果未必更差,但它是形状巧合的产物,而不是选择的结果——对一个以「读懂每一行」为目标的教程仓库来说,这个差别值得写清楚。
2.
head_dim一旦不等于hidden_size // num_attention_heads,就会一个都挂不上。q_proj是hidden → heads*head_dim,o_proj是heads*head_dim → hidden,两者互为转置,所以「同时是方阵」或「同时不是」,没有中间状态。MiniMindConfig允许显式传head_dim(Qwen3 自己就是head_dim=128配hidden_size=1024/2048这样用的),一旦这么配:好消息是它会崩而不是静默空转。坏消息是报错落在 optimizer 上,信息里没有任何东西指向「形状启发式一个都没匹配到」,排查时不容易联想到
apply_lora。建议
('q_proj', 'k_proj', 'v_proj', 'o_proj'),或者开一个target_modules参数交给使用者配。按名字选也顺便让 k/v 能进来——GQA 下v_proj只有 768→384,LoRA 反而更划算。apply_lora里加一句命中数为 0 时的显式报错(raise ValueError(f'LoRA 没有匹配到任何层,检查 target_modules')),比让它一路走到 AdamW 才崩要好。如果作者认为「只挂 q/o」是有意的取舍,那我觉得在 README 的 LoRA 章节写一句「当前实现只注入 q_proj / o_proj」就够了,这条就当读码笔记。
复现
All reactions