From 581ed12cc81c0efbe2715b892889e878181609c4 Mon Sep 17 00:00:00 2001 From: Yichi Date: Mon, 27 Oct 2025 08:45:56 +0000 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20lm=5Fhead=5Fattack?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update the attack experiment and report Signed-off-by: Yichi Update the newest network code Signed-off-by: Yichi final version correct the READMD.md --- examples/community/lm_head_attack/README.md | 109 ++++++++++++++++++ .../community/lm_head_attack/multi_train.py | 101 ++++++++++++++++ .../outputs/different_test_of_llama.png | Bin 0 -> 32076 bytes .../outputs/log_diff_of_gpt2.png | Bin 0 -> 29776 bytes .../outputs/log_diff_of_llama.png | Bin 0 -> 36790 bytes .../outputs/sigular_values_of_gpt2.png | Bin 0 -> 25343 bytes .../src/adapters/local_mindformers_gpt2.py | 82 +++++++++++++ .../src/adapters/local_mindformers_llama.py | 83 +++++++++++++ .../community/lm_head_attack/src/dim_svd.py | 26 +++++ .../community/lm_head_attack/src/metrics.py | 27 +++++ .../community/lm_head_attack/src/numerics.py | 16 +++ .../community/lm_head_attack/src/svd_plots.py | 13 +++ examples/community/lm_head_attack/train.py | 107 +++++++++++++++++ 13 files changed, 564 insertions(+) create mode 100644 examples/community/lm_head_attack/README.md create mode 100644 examples/community/lm_head_attack/multi_train.py create mode 100644 examples/community/lm_head_attack/outputs/different_test_of_llama.png create mode 100644 examples/community/lm_head_attack/outputs/log_diff_of_gpt2.png create mode 100644 examples/community/lm_head_attack/outputs/log_diff_of_llama.png create mode 100644 examples/community/lm_head_attack/outputs/sigular_values_of_gpt2.png create mode 100644 examples/community/lm_head_attack/src/adapters/local_mindformers_gpt2.py create mode 100644 examples/community/lm_head_attack/src/adapters/local_mindformers_llama.py create mode 100644 examples/community/lm_head_attack/src/dim_svd.py create mode 100644 examples/community/lm_head_attack/src/metrics.py create mode 100644 examples/community/lm_head_attack/src/numerics.py create mode 100644 examples/community/lm_head_attack/src/svd_plots.py create mode 100644 examples/community/lm_head_attack/train.py diff --git a/examples/community/lm_head_attack/README.md b/examples/community/lm_head_attack/README.md new file mode 100644 index 0000000..c2a739d --- /dev/null +++ b/examples/community/lm_head_attack/README.md @@ -0,0 +1,109 @@ +# LM-Head参数窃取算法实现 + +## 描述 + +本项目是基于MindSpore和Mindformers对于当今最流行的大型语言模型的 API 进行有针对性的查询,进行提取其嵌入维度或其最终权重矩阵。 +目标复现[2403.06634] Stealing Part of a Production Language Model (arxiv.org)结果 + +## 模型结构 + +采用华为Mindformers仓库中开源的"llama_7b"配置和"gpt_2"配置进行复现模拟参数窃取算法 + +## 环境要求 + +Mindspore=2.9, Mindformers=1.2.0, 使用Ascend硬件平台 + +## 脚本说明 + +```markdown +│── readme.md +│── src +│ │── adapters +│ │ │── local_mindformers_gpt2.py +│ │ │── local_mindformers_llama.py +│ │── dim_svd.py +│ │—— svd_plots.py +│ │── metrics.py +│ │── numerics.py +│── ourputs //攻击结果演示 +│ │── different_test_of_llama.png +│ │── sigular_values_of_gpt2.png +│ │── log_diff_of_gpt2.png +│ └── log_diff_of_llama.png +│── train.py //单次攻击脚本 +└── multi_train.py //多次攻击脚本 +``` + +## 攻击实验: + +前言: +对于论文中所使用的开源模型中,由于缺乏Llama_65b配置,Mindformers则未提供所需配置,因此llama仅复现7b结果,gpt_2并未提供权重矩阵参数,因此只比较隐藏维度的复现结果。 + + +- **单查询次数实验**(以Llama_7b(fp16)为例): +对Llama_7b(fp16)模型进行攻击实验,意图复原其权重矩阵和隐藏维度。 + ```python + from src.adapters.local_mindformers_llama import MindFormersLlamaAdapter + # 对于gpt模型:from src.adapters.local_mindformers_gpt2 import MindFormersGptAdapter + from train import train + adapter = MindFormersLlamaAdapter("llama_7b") + train(adapter) # 使用默认参数:num_queries=5000, prompt_len=16, vocab_subset=None, seed=0, batch_size=8 + ``` +攻击结果和简要报告保存在`outputs`文件夹中 + +- **多次查询次数实验**(以Llama_7b(fp16)为例): + 命令行运行 + ```bash + python3 multi_train.py --model_name "llama_7b" --prompt_len 128 --vocab_subset None --seed 42 --batch_size 16 --num_queries_list 1024 2048 4000 5000 6000 + ``` +其中不同攻击得到的sigular values保存在`temp_results`文件夹中, 攻击得到的最终结果和简要报告保存在`outputs`文件夹中 + + +## 实验结果 + +#### 单次查询实验 + +**对于llama_7b配置的攻击结果**: + +```text +prompt_len:16 +vocab_used:32000 +h_est:4093 +rms_aligned:0.0002823424886589567 +``` +![difference between sigular values for llama in log](outputs/log_diff_of_llama.png) +得到的隐藏层大小为4093,与文献中的标准结果4096$\pm$2,误差大小接近在0.07%,满足攻击结果要求 +而权重矩阵的实验值与真实配置的误差大小在2$\times 10^{-4}$,接近文档平均误差大小水平:$10^{-4}$至$10^{-5}$水平,攻击实验合理完成 +**对于gpt2配置的攻击结果**: + +```text +h_est:761 +``` +![difference between sigular values for gpt2 in log](outputs/log_diff_of_gpt2.png) +本次实验得到的h大小为761,文献得到结果为757$\pm$1,真实结果为768,因此可知本次复现结果合理有效 + +#### 多次查询实验 + +```text +....... +----- Summary ----- +=== 攻击实验评估报告 === +model:llama_7b +num_queries:5000 +prompt_len:16 +vocab_used:32000 +h_est:4093 +rms_aligned:0.0003705834606818188 +----- Summary ----- +=== 攻击实验评估报告 === +model:llama_7b +num_queries:6000 +prompt_len:16 +vocab_used:32000 +h_est:4093 +rms_aligned:0.0002823424886589567 +``` +![different results for multi queries](outputs/different_test_of_llama.png) + +后言: +可通过增加num_queries、改变seed的方式多次对模型进行攻击和实验,提高结果精度。 \ No newline at end of file diff --git a/examples/community/lm_head_attack/multi_train.py b/examples/community/lm_head_attack/multi_train.py new file mode 100644 index 0000000..2a3927c --- /dev/null +++ b/examples/community/lm_head_attack/multi_train.py @@ -0,0 +1,101 @@ +# 构建完整代码,复现不同查询次数和不同种子下的h值复现结果和W_aligned对应的rms复现结果 +import os + +os.environ["GLOG_v"] = "3" +from src.dim_svd import recover_hidden_matrix +from src.metrics import rms_error, summary_report +from src.svd_plots import plot_singular_values +from src.numerics import center_matrix +from src.adapters.local_mindformers_llama import MindFormersLlamaAdapter +import numpy as np +from train import collect_full_logits_matrix, align_and_eval +import matplotlib.pyplot as plt +import pandas as pd +import argparse + + +def main(model_name, num_queries, prompt_len, vocab_subset, seed, batch_size): + adapter = MindFormersLlamaAdapter(model_name) + X, subset_idx = collect_full_logits_matrix( + adapter, + num_queries=num_queries, + prompt_len=prompt_len, + vocab_subset=vocab_subset, + seed=seed, + batch_size=batch_size, + ) + # 行中心化以提升数值稳定性 + Xc = center_matrix(X) + + # 提取隐藏维度 h + h_est, S, W_hat = recover_hidden_matrix(Xc, gap_threshold=2.0) + print(f"[RESULT] Estimated hidden dimension h = {h_est}") + + # 读取真实 W(若本地模型可得) + W_true_full = adapter.get_W_true().astype(np.float64) + if W_true_full is None: + print("[WARN] 无法读取真实 W,跳过对齐评估。") + plot_singular_values(S, h_est) + return h_est, S, None + + # 如使用了子词表,仅对相同行做评估 + if subset_idx is not None: + W_true = W_true_full[subset_idx, :] + else: + W_true = W_true_full + + rms, W_aligned, G = align_and_eval(W_hat, W_true) + print(f"[RESULT] RMS after alignment: {rms:.6e}") + + # 简要报告 + report = { + "model": model_name, + "num_queries": num_queries, + "prompt_len": prompt_len, + "vocab_used": X.shape[1], + "h_est": h_est, + "rms_aligned": rms, + } + print() + print("----- Summary -----") + print(summary_report(report)) + os.makedirs("./outputs", exist_ok=True) + with open("./outputs/summary_report.txt", "a") as f: + f.write("----- Summary -----\n") + f.write(summary_report(report) + "\n") + return h_est, S, rms + + +if __name__ == "__main__": + h_list, rms_list = [], [] + parser = argparse.ArgumentParser() + parser.add_argument("--model_name", type=str, default="llama_7b") + parser.add_argument("--prompt_len", type=int, default=16) + parser.add_argument("--vocab_subset", type=str, default=None) + parser.add_argument("--seed", type=int, default=42) + parser.add_argument("--batch_size", type=int, default=16) + parser.add_argument( + "--num_queries_list", + type=int, + nargs="+", + default=[1024, 2048, 4000, 5000, 6000], + required=True, + ) + args = parser.parse_args() + + h_list, rms_list = [], [] + + for num in args.num_queries_list: + h_est, S, rms = main( + args.model_name, num, args.prompt_len, args.vocab_subset, args.seed, args.batch_size + ) + h_list.append(h_est) + rms_list.append(rms) + pd.DataFrame(S).to_csv(f"./temp_results/{num}.csv") + + for num in args.num_queries_list: + S = pd.read_csv(f"./temp_results/{num}.csv", index_col=0) + plt.plot(S[:-1], label=f"{num}") + plt.yscale("log") + plt.legend() + plt.savefig("./outputs/singular_values_comparison.png") diff --git a/examples/community/lm_head_attack/outputs/different_test_of_llama.png b/examples/community/lm_head_attack/outputs/different_test_of_llama.png new file mode 100644 index 0000000000000000000000000000000000000000..a5c6cd4300460d19be70d07d01d2073a9988d551 GIT binary patch literal 32076 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:y8E4bf$E*eydNBzQT4NDmr-~T2fv5MIw(KK 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 Lep)D~>-T>EN;(v< literal 0 HcmV?d00001 diff --git a/examples/community/lm_head_attack/outputs/log_diff_of_gpt2.png b/examples/community/lm_head_attack/outputs/log_diff_of_gpt2.png new file mode 100644 index 0000000000000000000000000000000000000000..84ffac11e96f4945dc5ca9572a80c8f9353dad83 GIT binary patch literal 29776 zcmbTebyU=07cD%1fRYl@3`!&24I(WiqDXglGc-td35e2-lr++aba%H%!_W=)!S}uQ zyLa7x?)ugOX04gu{Njmo_TFb7Lf&2G3oL9URSVZ8%x@S-6;jhzISR0{TK}&D zSZp0kS)nnDX5b`G>}1p(ArNf+hhKyO(R_0V#IZ?MLhL;(WpBYl>)Yv!D10b2Ab=B} z{w@9IG|gGGYSdYa>JL>}MT)78gVL4@Ydq4tygaoo!S%xR&Mnd#^T$j>_57*9;rZb5F8vFf%K=G3X(3zBJ4Ib(OWtDcjS^C~W9MT86-hvv)FXJ%_Ft)m0w`Z~N}_?{4+ zBJ4qcjEvmwMFdX3_4xGklt|d!shi@XGlJ5aH)xP+Y$k4Q=P%Jg;KYdf9LaCrzRhTi z3jS(=2+baO41S6x&>%7j3dRq2hi~}nLlkA9_3_*Io`9+We7v*LYgl0@)u z$7%n*8M3-+(4Wj{T8AA7PMn32R0UqlrtM|JA6`R<;7@UIVz>YMrQ3u%}2M>udg5Y-b8fBnUqwy!V-=iiL`1-_j1c-A!!GyQrg znw?#c_&`-#cs^JhpZnoNIg}fM?g)^LS@)nznGhD{hm%qkG<6|DHaDv?rVPmcX1}O+ zVgs`fmVqVRiUeU!{i`p8nOhdIF+ zAEaT<($DaakdRPNQqoalJr{KSHYCK;p=3orD45>i zJsx=c4#Y`t66}8``9lKN(rXpRXa9F=Az%>N{lWYzKLP_p0{!=9w-@|*LsbZ6;KTa? zUzmALG^~0z@}THf#XO?-pF&>KyhKXVv~7AuB^A+1*bEO`5y7X-im_)_o0K`b*ZEUH zpe!L_+Ut#k5Bvp8^&WZACfDVM9IpE9Y?Kydv$udZ^%WW{QiBw#RcqhLW2Iz zWJ#t724z+ORbo|~HX_sn7D7q&2SLfylF{7}MVLbS?1pWsJIrlf7WE}D2#84Lt9LWHdacnhZWxud6wDelh%Rlk3Wk1v( zo|g`g*4b*y!@u8bS7%JqJ9-ls{k@wP7j;g~1Xzh^;~6geX(_{eqjb9B68+>fBw`6h zNT8K75#)j{8I6teZV(d8-oCzax8uKJ!hgSVTgD_N=6T}d;|FZpg@(L-V+4!C6fmMD zhS_UR8Jw71;xkNR*vs0?JjF*Rpl9$(2CR$rvJ#=IJ2xs?8uUyw%o@ygc5JJ_5^*QV|0x&%PNG+wU7pANRUBXJTZ; z58Ug^^r?x7%)C4lVq#)?CMJmwAD$&LYX;3!ni}rU|AcK9<`2)z6gpXB5`fK1Kl^hM z9zs(Ru5F@b%~54g_Jk5GJO)*0uGY3|wIe)XsObB52&6BOx!rL{I9TwY5pQECy=!}- zXk>WUcXaff)%1@{-4~8OUNSN&tE)fx7e1<92ovBa^HnvB!$V4FjEK$lIH)*h*iwR} za@@f}BVg8eq@H-YXxb6>Os(8NQYJl#7)lxDQtFSoRz;FS^E7$?2cc|FV9Cw zFbJ6Ol&kRkQR6Ys&c7z_j#GvaflVkOF`{S$d$+cSfSu2bCmHpBg{J}v^~4005~FC} zU}9(%{2>_8FjIz^2z&9US)E;Ve!k#?*v-89jDW3N2OXOo1*#w}<~WkL|6-4sYvBrxMABpj3#S#&J>GVxnc4sP_D*N! zr*1fy4f!aHr#OMZ|MOaolW;yHsJ~*7k!M}8B)-n~Cm`NsB^RvNGi#tc>|%z00p*nu zOv@4mN&016lZO}h?BC_s+zM9^v`h}!z+zSXcT`5ZToOU+9!&_PBsT&!2tf2--AIKV zLx_7)I>hmxfOAjhN=l6Mt5@}dIJlAl;vhK0`J!M2hctv^`2`y5zW}#vJ<74%5C0(- zPT%+t%mb4LXtUdQvx9=czQk#J_)@>X06}+DNyQbbIX@Cq{jax%#LBOKA4mkNrl@`r z+wh)wMjG<9glFAb0{>qo{MBFWEgeT)JBNEJ@Vjer zxu>y)l=b5QLd!FC_Ed>1+F^~2LNajyr#n;U4bdZJ63WUrt7~h@s;WUHnzb)$Qvr~; zyu9q)0Dt%#|H>C&$A{1xq-bk2Bc<)+uR|a_P;)6dUK|>h?&`bzeeO_DLd>`lmeFJo`|YRFqjcbO`N6j-I>;Wj_Ha4^)JrP@JmX z2;5g;K|!lwv~Uo}Y7;wqN+OrkP}nj8lWsFvM@NTRg9|e*9^T<@Z!fUN$l>}qWf(1aZ;tT+w-DsHEN&@ljj7vWp>;&JJ&yJpN{x0yo^R!b zU09!!k_53|WsAAF@$=X&VnDtKy0V<@%>{Fs4rXL$Bi-Mfx0D<8;HF3aG#Mbt$<1Y; z0DwyWUIYN93DfG#h9R_8A53hB)B+VYs`$3hEi)U5fZ-+svQwe`OO2avbGliCaa_6cl@n`vdlB zk|*mbj_}bMcQEn3jC3ZFt4~8&p5P3?jf{=OiYBtkN4&i1%gb?o{`@KKzT4aTW_)te z0Aw0*cQVSXx9`vrF`IW>wHWrcu1WPPd-Mfavg8ybkf2RE(dv~Znf3J=mtO}=#GReF z{|=>#=5+CpMAEacbf)k-2DyKcka$5Agq4T&BZa1)B0ZG4i2ySXx+^?JFbF0(2Tb(V z=H@E}1xyPI3kby7*}0&wu&q!f9|HOC;REbyEC2B3cxbKF4+#cuLmio!30?0?!rpRA ze%Q-g!=0IFt7}ziT>PYv;HS8O@478vHMUDp9pQwG=^sCQK!7~tw2d?mEZ0Rhy1{hO z=!v3_*_oLLxw*O1KlH_0UYk%-a&JD?+sw!Zt9W^!X#;+CCneNq^rj9gax)J1$k%iv zOESjzerJ$TwYW9x8RP4#MkWo~EHk5b7BIw?d6u-eNWPMQYz1;Ymu93jY1-f&cnAxz za&6M2-UHmtiX{@*v|M{@`)+NG%{Il0tgC_SwG2M)f5NizbJAdUs-UOdu#ma^r-7e9 zkOI+PnG3B(PVP%u5*mchIg{~EmxL3;yZ`1TDL*T+Z3P{7L`X*4I1+ko@^cc7|74E> zucu(4vvJJ$@|8ULhQU>R9<=tbR=}0&azKzS$ab~k79xoZNEwGgT4yHrV<-qma-~3A ze@O5o{G38*iuINg$P#M(e=w=DN^S2`nf)G$<$ z8KiT}$p1Mz)AmP{cXeBQ5WN9w&X~lfH?3kHA5sVAzY%LM$sY;}zAq=`A+Fmy^3>v_ zG3|~n9EaP9GH1Q`#~>(Mybsu-(hnqD!Vsc8Z8T({D!cj4K>&XI=W|5Tv()x6(mgr# zmO5vYQQY8~&op%|<~?D)~dSSOd{#!6O6olpgtry z*$R7g2TGbF<~6HfPm*EVa=F7;2I!%Fe1g?igea(Z+*(*u6lx*+4 zb01f3Gi}O|Cm84DlqY*l1nb9pbn0E=fBum?NKZwCw9ZnnNKu4kp3z$U)0*^a&NqcC z_CxTHb*3I=x~4q|IfL?1)2QxES>D!_o*G@YtO5V0fb zUi>0_Afz(6Ry@SD_xmdIC!*hm=SOzVn^8&SFUIoeAP~_eH=6ok{wcdm*j9!T-()b>Do^2>*rtz!!52KwM8T-;?qvLq4D|J8~0MPb|Nx zzWp(4#FU)q-w|I)1^cYn3m22lPgEQHs`>c|n@99S-r{(=iR$^LDy^{ zG9BAr1rzRl&R=B@UGIrn{+g^O02eOS5n#p*{yRaRH0k7V8`Y%ewy)-qp`sBJ1p+V_ z4Mp8QX_{QHVA8q6g_Z*>*iT;7N91s;`8piABo;{^icrh`x;ovtUg$F8$|@*$e0X?B z&&b$5S)wU!UktL8z@?r_7OY^d{Bp z@qOye>Mv>OD0*gn8YbbGf{Hb*oi=51lVhaOYw3bYYtlRCSm&7m?}z`NXm3w42MaTE z$H~^%wHMH9cs6Y_YHJB;<9qh}L(HCcX>$kxF5>A>^>fL~NWJr$$1cK(BZ+@-1eudL@dvxp}X&n3&jbw3tK^v^*yv@hK_3~g*x~UYFH(#9`40Woe2yG&Y8WbJr-DptPHGAa_`9ctYoGai zoSF|6k4)LZL-#&kVZT`|@rSLZii>*}gI#2{v+qxh;9i0P0usDO+1beL_5Y^>ba~CY zD=K1Rjz zL{M~Ob0O!57Hc)U;_1P9mSV25Pu0hXAbQu&ld4%5p-E9TZk_v z8iL=)u7~!rlmNv68_;p-j~@vY(?uSH0qhIg2PUqm8E!pSBf0!Ils<8y)~SsaN!FcN zDq5y>B3=p+vRLHIVmUEhyDD$Vi+ifU1pT|t1c{-R-5N*q-Eu3G;W-%+2sJKgv!R}y zUGK-Rp6>Fco3$2o!#QO>D{bU_u{ns>r@kgdyFwb?MJ1x>ubr=P*!E&6n-p+)q_pB< zCbMb{E}r_b!2d`byq}dMCAiE6!`(TkWna6M3uoAutl{*j1K=8DJego`V__D?Co>F(YCJ8E zA@CeDi-)<}JazB?%8foTG0{6^#Y6hNs0gWd6eAGO9eaEBzx~O0lN&Fxrs>|@8&<|a zAmMbT;zhA`KQb56Zp(XMmbOk#ray60H6WjRdebC=OqY^tGIVc@)Kxiz49s_z`i~?^ z(nN|Xc3-BLlWVLvr1pJ7fLzQ@ti|R`87vXwEiN8-=zL&$Eb#vW@dlr?3O~R}#C2kL z4&65UoHF+DqMy|6_m+@KYhf9l&ClzlX3sf<;{IS*2}MFK&>sFFs{iO zvhX4FnbPvOMM%05#G;R74@?HY_aFN0LEeG=nE>VC zAoo@)iq(})dq=t-yvjZ*y{uo|R3Aj#ZNq@b_b5ne7^F;H1G>o{<#M_wR+Ar&#oVOm zuleRUBX+msGSkd8Zy2ne^z`KDPdK3vU(OPLY#5U&siKaZ4<`h2@3zhdgh{)Ca`J=m zP8$fBQ){K!2xWK0{K4AKjWm`0N`nrx6d^a_7U_7H{=*O)J+Y_6Ylv-K5Gz7W5!~1});)CEPCM_Fh zpoP-?e!)1CVHCT#NYTLRU@Vs4RbMkP@en6PDz*pg;v3K5`4FcixsI>d8KT~u$fi!sN&c;*=X^pE z`Nu_5)^E*q+e)*=hma8<3}u;=`r*K(M%PD#WNi}EpMm z8u6lb2fOi+-mNYq1@`6(BrTS)4hD)53iqkEeGz#1Odv7lT+RnSO=V#`E zc7u;BBPI_YFgYgn2>eRn6zAruslD$0a!-VJ6{A`~dbjX0t6w5Qo_!fSSmNE8;f4OE zi=)Xj?{aC@cv=#u#>bBSkks$fJ>YQBGuR$IKP_5f(<7l=WGc3Nvquk5I_$|vb;`5i zzN6GW4Zr$nbI~rUxRhj87E8CO$%Wv+`&)#4FBeN0=)subz{O6Y%EipiHEQDlW5e!D zs${%0CFcwT(i^90=z-l&0A_e>%+y(P|44P|!$$5G-C;9o{Eb}1kOgDr2hxHM74>wc z@NV>`0KBGd={j^D3!|fc14f22nh<2#PQ%1jAU%zH;GG zsbIjoFSR`HgL;N7sBa9r%st(Uef*5ID-Xi!RjF3i%UD}28A}6n2&~*=P3Il1B~D z8a7ca|8)Lqw!Wj@<4)v6(#alEWFIm5`-1Co4$hJYwkuF!gG18nx$%W zFWImhN1(h(Ze!I&8uk27EB{h8yS290o7=8vn-nw%>}F3KiN$}~io^S8);q-LEt|Gv zgHml)Q`e`H-+cXcMx0zEPnOiU5M28!TAspoSiU=Ijd!`r&J~4P2GI>$ecK!*Ss6Xj z`H~#6s$2+wZfyxKi}U^B4%r3o=Y_36mZVSDN?uON2(6~hgb!qg;ZQ(JaN_49M%lQy zb^bl$iww2FII`;Q2F0Hgj?!hwk$HC=H>G*ll$JyaKWA*)wMu2#FXk%if9N*f&59W5t8=9YKNK1F0;V~m%^UT4f@3QPV0+`m9(B;Vb z*lZ7M?L35l&Rx}17GAF*Kd9iRNR^p8Mh3Sc7|BgY%W%D}pDz8yDQ8#6aeBfqBMF)2 z>5kOU{^>$wa~7A3zv#lmtSUdW$4k|#OCH^ArL(2>U3h%D)F=V6;h?Ho0X2WJXey*I zRLg2Uk;dKe2lD#gqS63-0yeg;y<3>bqE>usi3C~B$v!iY4{B2RLzm9jnSfU@Y+SP{ zn!Xg}Xno7tN+>vR;X{gr2!ZNw5I?ck_~OpQN1`Y8M@ss3a02gI>9r1<2p$6pIUq{q zea2EsDjuu?1FB}!8N>F)7SAa1JN{^StT<#GbPG3B1yFa<=4y-2=gTrLiVg>e6croE zp)}Yg7Y*uc44uUr4(L=mR4}bIA)RHJOhvsG!^k_CETpm6?d>$lcus{-fia$9@xkU} zV&#pI2wj9cAhlwE*W?@65zzo@d9+>V8V!Niq{O28EBcER?Q*I--*)XZnysW2C_(9D z)r~4wm*pFqjm*8jwr_DQiEeRxOxSS6#!rW=`_rL#6cfL@VZEkQ#CSTRR-GRu)iKy{ z%9uHJlC@hV;*uowRY-30E5Yi|EG5+E7}1=|#W2CGFw&jfH=Xl_cd0idMyLm#MJy;L8JDaf7>PJ*VCF@HE&MV* zz3;$N9zILAZV$S}jG3dl2FdNHrXNe@mX(WWM?W9x7*{Sd+h*F9pv#)|a9*BAzDx^WIV^O`Nmo z*?c(3cSc&H7s_Qjt_@{0%<72?h+oxpXze}rGuQi^Mhc(#2lfF)3lw(CGe7}|_s#^* z`(%3&lsj9zkJE%3Do-keB$hMkzBvTlVfQ}u3yZRt*X&M(UN-7E!woMzKv0Q5oBKqDq9bB7h?{2GfzQH%9)z719S8@FQftV6@(|C`?EQZf= zU>an4@xv_Hpl$A&^sUEWK$2_9nP5p3NHw}Qwm@zBFYq>16Vr3m=&1#>dZIgolJFY$B(L3Mbp(b^@$jr`0hnNuLiBln*GB0@N zU-ecLKN9+QIdk=*Cqo61vV5(U!^zIqwcLW8pBLF)<4K9O7t($f^C$Aw=A^`;-$WXt z6|+X3=LZdktEO~^KrIESK}Lq+zQpTny_hs_<8>T$Ke;6~v}OX6y?sq>R6}UyPO#zf z0=f3ra^4wqS7ZSVVzZ!LDiO4yrCB?7D*5Q@a_foAuq8VUFLJ0m^Q;Fm-{`mv>tAfP zc20#J_@i2DS+2JVpgzt3Hf%5up|WkqQEpN12faPs%vzPN6sHd+M+Sc@uP#N7Zt;5T z;s50`DVkD~D-py_&Rm4nXl`lm5*=3GPmp3;TU$wB?B1gGCN99^FX2jV*`T!Icdxgz zu4U-~yW_BR5r#wiFL9PFU#{lXuct2+Q>=IVbn?Y!)b2gr{A962U}?zFrIgb^Nv*VV z%P?jh$xOg4^H!7e)xK_96*@9%Oh5GMV)o|GoSD8gqp zR58Cf?ILbOYYDWiDUOTu=|*17C>3~NPpMRjQE0T zWegxkYh^%vOODw$&yig<+Xi z-m>HjPwmE?V*+>xRtZRgIW+FJrq4_wiTzxg9l7r=ml5Y{GYXdWD#`bT=5E1G-yNLK z!l2%~J#hXY!cD3X8Q_n($2U8k>6D0Z!lJ5R@+TjOh;JDOxi5`e0}^BQ<32?Y^)XC@ zZ#tmi4nE_1ogCP=W=ru4s1~275tO{lXOPIO6@__0OZ0?-sY2E{H zdid8Q&XR@Ov!0{fVG1pu>aX3ipvRpv6vxTY(d`ED zu}||Q6~oS5yDf6Y4>8~d#a4_fK<0kM5JOJiemq*EGVOVT*nEDp@5}RLw_44St2J`rPG-h}vkoK_tTy{w} zEcxZ&AkUT3m6EF^H8@$2V^@691>q*T+&AAR*)@WLB$ACJ@`pyY;QE_#+wi{rNH0_Q zy2&9ymX8N~0!&UMPYAy4Rzgwi@-kRi<+}z|O4N=Ikm^eLq|LFhf+txj9mHA=!YFI! zq^LVzFu%aEUhv|x&s0%&M{IO8!vs?McVW}lre(QH=W~|jtCeeKzGJ!ou#@JkuL408 zK16=pIQ^L!9?3VU5;b7&~8$bGyD=(D1`rOG!%)0-?II`6=@=sW1x; zAtnvg7P>`|07mai5k*~$fz~2Ip7hrHIXkw3b;^hAmiB7StAvO6KydQT)@9dbmvOng zHfDAyRv1J@`fiz5*@e6rh$ck}o#`Tl?Txzc*DjTm9ywY4ViX)|wJOhqz5gEf>?yVE z(M;hwzmpyP(I{R_dK#oiK`OGZ^_Bj0X!zz<19z)NE*J`p@3&n8 zWce9}ExCcnCGHh|P|t2V_vY~v1Q+w4SVPwbn8EYgG6AlZq~%8mO$D~)sDgm^*wG$WBj>`o2Sp07<*e8QfUv%M5b4F>3N^A1Kon#sb*6ZSTxu zgHT_}n`G9533d{R&~-U>>U_#v zP&?wng_kXuCXoEl3vH^j`I0urDy}B<@|mprbq-wIzgQPnv_Zn30MrC8qwF!$$(npE zq)ixNtd7j2N6HIU_~&LZD?3n{RQ(&B&XYeR3Er{%e&>- zIrGbpgW@N9Q8hE?*xZ-z$ z#*-oYEN<&VOxqmvO(<8ZNFGWA0Qmg^yOEuh@Kz`MS&R2Mo6S|a!nE`E59;20^W&xc zi$vWZ;_%H+`(5y1+9W3*oQgCHR7(Wq(=&2ua`zu9*Ue8(1W%Dy%lnNV)Ya>Mb$qh= z?xh;R@7>SBrW#(0`PFmRHMqWxSlAFJx69OL0MHqC-~;q@x?oz~gOgL^^z|@($QG== zu*)@$L)}{W_HO)kU%#Db+m}I#R3J_$^tOtwoKuju1Fc&oa%zRJb^v~<#tG=UPS?@w z_m5|*W-4}Kp&b_O4N){(q`-j!@hFF{zsV4(6G+<^0So!Qctda-c6T!)%k|YgwqWX| zSd8dp?-}k{i`*fKvAl^vi}1$pZ|E#y2iy~~@LxI>~%Y@I~oT=A+pn>~C#JrOJ5kp) zEluo)!c_fg>vmoM4GY3hZsH2UysP4Q?u1fMSH>8<_2L~`l4PXP%rpj*qtnW*(XEKn zi3WT*-F5k-!zQ9f{`dWY7yoLNU(*c`!c?IznlO%OEgw`7tlf@JOB&2 zwETX!`WFvJIB3ZWhS5?e@~I^#L-3a~1+6-Yh=9-q(-8VMC9r~D%qTx4HGBKKuOe=R zfi$VG(Gt3eeJ7)Ws;IO1NhiPUL%dY|L_17#5?7ZreXsGALa%I_@bPZo7fVrrf2ZE5 znF7o-vcPsr3XtoT+aq})uLG-yH*#KAcVykVxLFh=)jGpTvwqSfzg2`VkqNVUx%|X3Lbs9J zb>?;|S==}>QAeNn@B{&Tf2h3Ubk@_f1g8XCir|ke>2W82x4H)J9yPz{)OE>f&Lxd|baSB1nLy0a zCL(eN&j9QZxnA09zK_cdee}UN)o-1G}J*MDiYPTBocsmP5R^7 ziP8HwH~Gy86F^v5xzh&Y8&?-BWzH9DuL5tCL2BWrk9LNHjd55lU8TO z4JFP<7YjQ;EMF4X8Wi@LfFiNy`l&*SO5a3ZKt#w%WYgfz+|3~T35)p%+vW0GJeTwu zR6#=yJo}w~Pa*d{u0Q#78P!GDwgQVi(w_>R@clJilz;A$Rv)4hjtNx8i|r3<5C{di z#gV4aR-dR#T4zV82)+^Za(JaQBca~{f{|Oz_)Mi>5@D3DSboPzW9#AyUs9#kw#JW7WDFI%%6G9&aH0rS!$PZ zj*Wzj=&~r}4&;3(tCa4PzfT2!kx4I~u4K{{U+gG;DdExjn6l=q_5xGBY)tQacG1Ac z*ya`%=2qt}rvrrOofundj2g26H7~Mmiy}?am z*!nL>z-2nz&@v$ya;FK+3J9RhSF0{%r%tb*BPe~+DSEWlwqHbJk&Y|07@;HFBjT=q z_64UK&ERK`Gv0__Uii{>!3;W=KXr)w)>ilef^kolA8=aOKrLJc*|)C;XOJ&8S2`|E zQ*-M~y>XhgR3AfNhn4X-f&_=scEyE;GVz}}sz#94IN2-h9)Y!?w_UFH@o6=$Z7+QV%>p-I!OJ;HL1uIGY>SozJlbEc{9vI|igb~InezH%!+Heem?>-x6f z-^NlYNjxQD^O#giaZo`lPA5D{CwvKGu9?$%+O_i$02Fhq6nut%e-=O6#$wh_%(lDq z7vHd7eN6}gI{bo=1znwB>m9X=;(0>s$y6?K-Ts$-FIhQx{Ygu18+Ej`g`~BG1Fb+X zX5MgAY>&SOvAG?+8*+K;^i)t3!_G~v#=`-|gr-iGi$Zj(y_%)OZMtQIl)bGs6d?oI zKF9s>(Y_=2Z*m&gQFyMHaN6d$fJ?KuxzhQE1{a_hV2QXRiMY-bWTa661``;?q*`p` z_MpaMMQi)7b&OWt!Uy@0L&n||6xv2kFUqfKD+9m~^rDKzd-V&Cd&dQn8F$=KsdRt! zlktXXOg^{Fz7lS&T@szzgi7`|L~S#0k?%AjlElD2ST?Qu~lLrx#20TfN^u zx~UXyIZFY(cV|9}D6A!cw$2FuDKb+ZKcgm|uf#9a#KD+ov`@a6{jkR7(f?TJ%xy_q z-R}*@=I13wAN4REQF5!&--BD4JD<>D5>K~&eh8DIT0yUrLai1;;X_Xnb>Z>=hU-i1 zisH^=hdzc-9RNkZJ-)qs+#LW{* zyynm4G<+T3U6dcE);(>lLlaA`5Ncht^TU8S9!uUN6!JI3tkqZAn1qb^SLwv< zr_Ccb>+|Fn)nP4-P0)^_rA|xkW>knva><)-G|RrkTSONbAccs< zQ`N9XxHc3O&phq+{TVP7oU;&RdwMz8pkYKA3<|I^ul_P+Id;_wZ_a0M7P?ib&r1`@ zZP;~>_N5amlT2G90|HbiGmQ{>BC7b-_)%<=yWtQ&z)f#ICld{OVz+w977babbWR1= z1D7ud;O}nCFUdS_x9wl}?8+&}uFZoI|7nqrql?*=S2LS{tNi($NxqzVVyL`|L_tV# z^>rMamXGoBs6r85tQWgMQ^~SqM&@YUS#3ozfoV;azefj& zh`n>6+U~M08mpx3>8UKh!VKh&rFW~{Ctl_@`mG0dT1aV}gbn)TJ#3p?`ZE!Z?==t! zl%TNBBFMD7+)$w80^Oo!2zS{h-$_4%d@NN?qkQ7#TjH|X=r;5!jsVh+<18e`WXYhC zD4w!{^NZW6688QjE;(La6LW&pH#y2>H&B~``dsV1YB=w#01&K7kVRk-6x^v-(k{<- zJJUr4`3pik@73dv!kHJJxvwRQ2~7SG^jM9aX1)k}vQHe+fxu!(4h(4eVtLXY8*c!7^2oFVg?57JWm0JQV1e6nncl-6ZTpx-OpHT0k9G{<0{k znsAcAz4yNZw%Tk8ab&+^KWNFh;xgm=N5tGl~%BxbFlUtrLipj`L=G}pS%+fZEy$&eoL-Y`CN*wk z>$aXAqNm|~F92ny`va^+O?RXjKKYX~H8v+FGrX6i!oSY>F@hcsYjFx$YkT#&-9)*0Y*UfVUw3-?}j{TsJHNdY?C<26)iRG*9&c8d5+`PXInPgxy+BKq>4 z7Sxp*mQ~SlWzhJ5{!6S%xC?m=s*U%rB;%-=9E{u~@_-%BKYvj$LQ=`o*LiN|g=}kW zAKhw4+2>1gMV^<;&>034HS3D0v!kKUd(@3e2G5WlOOg-yInr8*cq0I%+GFDyi~e^? zYCU@Dj~OFleoJ|itf9lxHeBMgh5R`^mn!mm#|?8Zglsgt#%~vtD3@`*{fzqg=sYj% zgCTjxdRnT+V5WaFrw~$gt}FfAo8PKI(o8DaCyv6L$mKc6d^<2iYb8Qw<>o~)%pkSN zUb%4Wtu^=Y95+!?{Y}|lHy+8x9eD_gwLE$)5+lR8hNge1}#x|$2FiM ze(xBzxVYqNdt;1BaC77(bh?Q1pi;zJw5GSb3$jg8+O8GMMy6*0|C zL?Bth@=8a#^*CQ?8!~M=2OAW3ND!rb@XY~pq^U-OHZ4=IO_P_EDlSlk+pNj~1-TY^ zJ6P|r_(km5BM&S#^ivEd8ijJ-3Nbu{&;tl%p-8*AG>P>FB|*~aqeq9cdgZg9 zXS-h^rOiYYcb&!iAq&01R0>I~f;<;pxO3%a37EpO1+H2A=n7pV|1Eh^EM-D?1PM19 zu=+!M=jXLRt3zh4G2GHWUkmZ6x{D3=@&NGhu9k{gwFN42=56G!R`)V0>!kRz_SX

t#fY{s%J$O{wVdtF9`4%w`p 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 ZJ**p#c{fWZpt~nZMM*<3U*0V6e*w~9uRZ_( literal 0 HcmV?d00001 diff --git a/examples/community/lm_head_attack/outputs/log_diff_of_llama.png b/examples/community/lm_head_attack/outputs/log_diff_of_llama.png new file mode 100644 index 0000000000000000000000000000000000000000..a550110ed1361b77da589e1683c495e31ca530a2 GIT binary patch literal 36790 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 literal 0 HcmV?d00001 diff --git a/examples/community/lm_head_attack/outputs/sigular_values_of_gpt2.png b/examples/community/lm_head_attack/outputs/sigular_values_of_gpt2.png new file mode 100644 index 0000000000000000000000000000000000000000..e4fd36e069d56435386465df4780ccd58813329a GIT binary patch literal 25343 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 literal 0 HcmV?d00001 diff --git a/examples/community/lm_head_attack/src/adapters/local_mindformers_gpt2.py b/examples/community/lm_head_attack/src/adapters/local_mindformers_gpt2.py new file mode 100644 index 0000000..04d8ba8 --- /dev/null +++ b/examples/community/lm_head_attack/src/adapters/local_mindformers_gpt2.py @@ -0,0 +1,82 @@ +from typing import Dict, List, Optional +import numpy as np + +try: + from mindformers import AutoTokenizer, AutoModel + import mindspore as ms + + MINDFORMERS_AVAILABLE = True +except Exception: + MINDFORMERS_AVAILABLE = False + + +class MindFormersGptAdapter: + """ + 本地 GPT (MindFormers) 适配器 + - 提供 full logits for next token + 使用前请确保模型与分词器可用(名称需与你的权重一致) + """ + + def __init__(self, model_name: str = "gpt2_small", device_target: str = "Ascend"): + if not MINDFORMERS_AVAILABLE: + raise ImportError("mindformers / mindspore 未安装或不可用。") + ms.set_context(mode=ms.GRAPH_MODE, device_target=device_target) + self.tokenizer = AutoTokenizer.from_pretrained(model_name) + self.model = AutoModel.from_pretrained(model_name, dtype=ms.float32) + self._hidden_size = getattr(getattr(self.model, "config", None), "hidden_size", None) + + @property + def vocab_size(self) -> int: + return self.tokenizer.vocab_size + + @property + def hidden_size(self) -> Optional[int]: + return self._hidden_size + + def encode(self, text: str) -> List[int]: + return self.tokenizer(text)["input_ids"] + + def batch_encode(self, texts: List[str]) -> List[List[int]]: + return [self.encode(t) for t in texts] + + def decode(self, token_ids: List[int]) -> str: + return self.tokenizer.decode(token_ids) + + def batch_next_token_logits( + self, batch_input_ids: List[List[int]], pad_token_id: int = 0 + ) -> np.ndarray: + """ + 批量获取下一 token 的 logits + batch_input_ids: List[List[int]],批量的 token id 序列 + 返回: np.ndarray,形状 [batch_size, vocab_size] + """ + max_len = max(len(ids) for ids in batch_input_ids) + padded_ids = [ids + [pad_token_id] * (max_len - len(ids)) for ids in batch_input_ids] + input_ids_ms = ms.Tensor(padded_ids, dtype=ms.int64) + outputs = self.model.generate( + input_ids=input_ids_ms, + max_length=max_len + 1, + return_dict_in_generate=True, + output_scores=True, + ) + step_logits = outputs.scores[0] # shape: [batch_size, vocab_size] + return step_logits.astype(np.float64) + + def next_token_logits(self, input_ids: List[int]) -> np.ndarray: + """ + 获取单条输入的下一 token logits + """ + logits_batch = self.batch_next_token_logits( + [input_ids], pad_token_id=self.tokenizer.pad_token_id + ) + return logits_batch[0] + + def get_W_true(self) -> Optional[np.ndarray]: + """ + 获取输出头权重(通常与嵌入权重 tied) + """ + lm_head = getattr(self.model, "lm_head", None) + if lm_head is None or not hasattr(lm_head, "weight"): + return None + W = lm_head.weight.asnumpy() + return W diff --git a/examples/community/lm_head_attack/src/adapters/local_mindformers_llama.py b/examples/community/lm_head_attack/src/adapters/local_mindformers_llama.py new file mode 100644 index 0000000..d4d99ad --- /dev/null +++ b/examples/community/lm_head_attack/src/adapters/local_mindformers_llama.py @@ -0,0 +1,83 @@ +from typing import Dict, List, Optional +import numpy as np + +try: + from mindformers import AutoTokenizer, AutoModel + import mindspore as ms + + MINDFORMERS_AVAILABLE = True +except Exception: + MINDFORMERS_AVAILABLE = False + + +class MindFormersLlamaAdapter: + """ + 本地 LLaMA (MindFormers) 适配器 + - 提供 full logits for next token + - 提供基于 logits + bias 的模拟 top-k logprobs + 使用前请确保模型与分词器可用(名称需与你的权重一致) + """ + + def __init__(self, model_name: str = "llama_7b", device_target: str = "Ascend"): + if not MINDFORMERS_AVAILABLE: + raise ImportError("mindformers / mindspore 未安装或不可用。") + ms.set_context(mode=ms.GRAPH_MODE, device_target=device_target) + self.tokenizer = AutoTokenizer.from_pretrained(model_name) + self.model = AutoModel.from_pretrained(model_name, dtype=ms.float16) + self._hidden_size = getattr(getattr(self.model, "config", None), "hidden_size", None) + + @property + def vocab_size(self) -> int: + return self.tokenizer.vocab_size + + @property + def hidden_size(self) -> Optional[int]: + return self._hidden_size + + def encode(self, text: str) -> List[int]: + return self.tokenizer(text)["input_ids"] + + def batch_encode(self, texts: List[str]) -> List[List[int]]: + return [self.encode(t) for t in texts] + + def decode(self, token_ids: List[int]) -> str: + return self.tokenizer.decode(token_ids) + + def batch_next_token_logits( + self, batch_input_ids: List[List[int]], pad_token_id: int = 0 + ) -> np.ndarray: + """ + 批量获取下一 token 的 logits + batch_input_ids: List[List[int]],批量的 token id 序列 + 返回: np.ndarray,形状 [batch_size, vocab_size] + """ + max_len = max(len(ids) for ids in batch_input_ids) + padded_ids = [ids + [pad_token_id] * (max_len - len(ids)) for ids in batch_input_ids] + input_ids_ms = ms.Tensor(padded_ids, dtype=ms.int64) + outputs = self.model.generate( + input_ids=input_ids_ms, + max_length=max_len + 1, + return_dict_in_generate=True, + output_scores=True, + ) + step_logits = outputs.scores[0] # shape: [batch_size, vocab_size] + return step_logits.astype(np.float64) + + def next_token_logits(self, input_ids: List[int]) -> np.ndarray: + """ + 获取单条输入的下一 token logits + """ + logits_batch = self.batch_next_token_logits( + [input_ids], pad_token_id=self.tokenizer.pad_token_id + ) + return logits_batch[0] + + def get_W_true(self) -> Optional[np.ndarray]: + """ + 获取输出头权重(通常与嵌入权重 tied) + """ + lm_head = getattr(self.model, "lm_head", None) + if lm_head is None or not hasattr(lm_head, "weight"): + return None + W = lm_head.weight.asnumpy() + return W diff --git a/examples/community/lm_head_attack/src/dim_svd.py b/examples/community/lm_head_attack/src/dim_svd.py new file mode 100644 index 0000000..23801cb --- /dev/null +++ b/examples/community/lm_head_attack/src/dim_svd.py @@ -0,0 +1,26 @@ +import numpy as np +from typing import Tuple + + +def recover_hidden_matrix( + logits_matrix: np.ndarray, gap_threshold: float = 2.0 +) -> Tuple[int, np.ndarray, np.ndarray]: + """ + 从logits矩阵中估计隐藏层维度 h并复原W_hat + Args: + logits_matrix: shape [num_queries, vocab_size] + gap_threshold: 判断奇异值落差的阈值(log域差值) + Returns: + h: 估计的隐藏层维度 + singular_values: 奇异值数组 + W: 复原的矩阵 + """ + Q = logits_matrix.T.astype(np.float64) # 转置为[l,n] + U, S, _ = np.linalg.svd(Q, full_matrices=False) + log_s = np.log(np.abs(S)) + gaps = - np.diff(log_s)[1:-1] + h = int(np.argmax(gaps) + 1) + if gaps[h - 1] < np.log(gap_threshold): + print("[WARN] 最大gap低于阈值,结果可能不稳定") + W_hat = U[:,:h] @ np.diag(S[:h]) + return h, S, W_hat diff --git a/examples/community/lm_head_attack/src/metrics.py b/examples/community/lm_head_attack/src/metrics.py new file mode 100644 index 0000000..c6e40fd --- /dev/null +++ b/examples/community/lm_head_attack/src/metrics.py @@ -0,0 +1,27 @@ +import numpy as np +from typing import Dict + + +def rms_error(W_true: np.ndarray, W_est: np.ndarray) -> float: + """ + 计算均方根差 + """ + return np.sqrt(np.mean((W_true - W_est) ** 2)) + + +def bit_agreement(logits_true: np.ndarray, logits_est: np.ndarray) -> float: + """ + 估算logits的位精度(假设已归一化) + """ + diff = np.abs(logits_true - logits_est) + return -np.log2(np.mean(diff) + 1e-12) + + +def summary_report(results: Dict) -> str: + """ + 生成简要评估报告 + """ + lines = ["=== 攻击实验评估报告 ==="] + for k, v in results.items(): + lines.append(f"{k}:{v}") + return "\n".join(lines) diff --git a/examples/community/lm_head_attack/src/numerics.py b/examples/community/lm_head_attack/src/numerics.py new file mode 100644 index 0000000..3b8cf9d --- /dev/null +++ b/examples/community/lm_head_attack/src/numerics.py @@ -0,0 +1,16 @@ +import numpy as np + + +def center_matrix(X: np.ndarray) -> np.ndarray: + """ + 按行中心化矩阵 + """ + return X - X.mean(axis=0, keepdims=True) + + +def normalize_rows(X: np.ndarray) -> np.ndarray: + """ + 按行归一化 + """ + norms = np.linalg.norm(X, axis=1, keepdims=True) + 1e-12 + return X / norms diff --git a/examples/community/lm_head_attack/src/svd_plots.py b/examples/community/lm_head_attack/src/svd_plots.py new file mode 100644 index 0000000..89668da --- /dev/null +++ b/examples/community/lm_head_attack/src/svd_plots.py @@ -0,0 +1,13 @@ +import numpy as np +import matplotlib.pyplot as plt + + +def plot_singular_values(S: np.ndarray, h_est: int): + plt.figure() + plt.semilogy(S, marker="o") + plt.axvline(h_est - 1, color="r", linestyle="--", label=f"estimated h={h_est}") + plt.xlabel("Sorted Singular Values") + plt.ylabel("Magnitude(log)") + plt.legend() + plt.title("Singular Values Distribution") + plt.show() diff --git a/examples/community/lm_head_attack/train.py b/examples/community/lm_head_attack/train.py new file mode 100644 index 0000000..becedd6 --- /dev/null +++ b/examples/community/lm_head_attack/train.py @@ -0,0 +1,107 @@ +import os + +os.environ["GLOG_v"] = "3" +from src.dim_svd import recover_hidden_matrix +from src.metrics import rms_error, summary_report +from src.svd_plots import plot_singular_values +from src.numerics import center_matrix +import numpy as np + + +def collect_full_logits_matrix( + adapter, + num_queries: int, + prompt_len: int, + vocab_subset: int = None, + seed: int = 0, + batch_size: int = 1, +): + """ + 批量采集多次查询的“最后一个位置”的全量 logits,形成矩阵: + 返回: + X: [num_queries, vocab_or_subset] + subset_indices: Optional[np.ndarray] + """ + rng = np.random.default_rng(seed) + vsize = adapter.tokenizer.vocab_size + + # 如果指定了子词表 + subset_idx = None + if vocab_subset is not None: + subset_idx = rng.choice(vsize, size=vocab_subset, replace=False) + + all_logits = [] + + for start in range(0, num_queries, batch_size): + current_bs = min(batch_size, num_queries - start) + + # 随机生成 token id 序列 + batch_prompts = rng.integers( + low=0, high=vsize, size=(current_bs, prompt_len), endpoint=False + ).tolist() + + # 批量获取 logits + logits_batch = adapter.batch_next_token_logits( + batch_prompts, pad_token_id=adapter.tokenizer.pad_token_id + ) # shape: [batch, vocab] + + if subset_idx is not None: + logits_batch = logits_batch[:, subset_idx] + + all_logits.append(logits_batch) + + X = np.vstack(all_logits) # shape: [num_queries, vocab or subset] + return X, subset_idx + + +def align_and_eval(W_hat: np.ndarray, W_true: np.ndarray): + """ + 通过最小二乘在右侧对齐(求解 G:W_hat G ≈ W_true),并计算 RMS + """ + # 解 G 的最小二乘:对每列一起解,lstsq(W_hat, W_true) + G, *_ = np.linalg.lstsq(W_hat.astype(np.float64), W_true.astype(np.float64), rcond=None) + W_aligned = (W_hat.astype(np.float64) @ G).astype(np.float64) + err = rms_error(W_true, W_aligned) + return err, W_aligned, G + + +def train(adapter, num_queries=5000, prompt_len=16, vocab_subset=None, seed=0, batch_size=8): + import matplotlib.pyplot as plt + + X, subset_idx = collect_full_logits_matrix( + adapter, + num_queries=num_queries, + prompt_len=prompt_len, + vocab_subset=vocab_subset, + seed=seed, + batch_size=batch_size, + ) + Xc = center_matrix(X) + Q = Xc.T.astype(np.float64) + U, S, _ = np.linalg.svd(Q, full_matrices=False) + log_s = np.log(np.abs(S)) + gaps = log_s[:-1] - log_s[1:] + + plt.plot(gaps[:-1]) + plt.yscale("log") + plt.savefig("./outputs/gap_plot.png") + h_exp = np.argmax(gaps[1:-1]) + 1 + W_hat = U[:, :h_exp] @ np.diag(S[:h_exp]) + W_true_full = adapter.get_W_true().astype(np.float64) + err, W_aligned, G = align_and_eval(W_hat, W_true_full) + # 简要报告 + report = { + "num_queries": num_queries, + "prompt_len": prompt_len, + "vocab_used": X.shape[1], + "h_exp": h_exp, + "rms_aligned": err, + } + print() + print("----- Summary -----") + print(summary_report(report)) + os.makedirs("./outputs", exist_ok=True) + with open("./outputs/summary_report.txt", "w") as f: + f.write("----- Summary -----\n") + f.write(summary_report(report)) + print("-------------------")