From b3ca5320231a27e017bd697fd0cb4561d32b875a Mon Sep 17 00:00:00 2001 From: Mukesh Garg Date: Mon, 1 Jun 2026 22:23:28 -0700 Subject: [PATCH] attention: milestone-gqa-llama70b figures + MILESTONE_FAST (sub-cycle 4c, 5/6) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add 5 of the 6 figure renderers ADR-0057 D3 sub-cycle 4c specifies: - gqa_op_log_{panel}.png × 4 — per-panel bar chart of the 5 op_log counts (gemm, ipcq_send, ipcq_recv, dma_read, dma_write). - gqa_comparison.png — cross-panel grouped bars over the same 5 series. Sixth figure (gqa_scaling.png) depends on sub-cycle 4b's Q/cube ∈ {1, 2, 4} sweep on multi_user_* panels and is deferred until that data exists; emit_all_gqa_plots returns just the 5 in-scope paths. Add MILESTONE_FAST=1 mode to run(): skip the panel sweep, reuse the committed sweep.json, render figures only. Validation mode unchanged. The runtime errors clearly when neither env var is set, listing the two supported modes. Renderers live in the bench module (the milestone-1h-gemm pattern); tests/gqa/_gqa_plot_helpers.py re-exports them for figure tests. Tests: tests/gqa/test_plot_gqa_figures.py — 7 tests, all green: - 4 parametrized per-panel emit assertions - 1 comparison emit assertion - 1 emit_all returns exactly 5 PNG paths - 1 default out_dir matches the bench _OUTPUT_DIR Commits the 5 PNG baselines under the bench output dir alongside sweep.json, mirroring milestone-1h-gemm's committed-figures pattern. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../gqa/gqa_comparison.png | Bin 0 -> 34167 bytes .../gqa/gqa_op_log_multi_user_decode.png | Bin 0 -> 21824 bytes .../gqa/gqa_op_log_multi_user_prefill.png | Bin 0 -> 20690 bytes .../gqa/gqa_op_log_single_user_decode.png | Bin 0 -> 24934 bytes .../gqa/gqa_op_log_single_user_prefill.png | Bin 0 -> 23031 bytes .../benches/milestone_gqa_llama70b.py | 238 +++++++++++++++--- tests/gqa/_gqa_plot_helpers.py | 25 ++ tests/gqa/test_plot_gqa_figures.py | 109 ++++++++ 8 files changed, 342 insertions(+), 30 deletions(-) create mode 100644 src/kernbench/benches/1H_milestone_output/gqa/gqa_comparison.png create mode 100644 src/kernbench/benches/1H_milestone_output/gqa/gqa_op_log_multi_user_decode.png create mode 100644 src/kernbench/benches/1H_milestone_output/gqa/gqa_op_log_multi_user_prefill.png create mode 100644 src/kernbench/benches/1H_milestone_output/gqa/gqa_op_log_single_user_decode.png create mode 100644 src/kernbench/benches/1H_milestone_output/gqa/gqa_op_log_single_user_prefill.png create mode 100644 tests/gqa/_gqa_plot_helpers.py create mode 100644 tests/gqa/test_plot_gqa_figures.py diff --git a/src/kernbench/benches/1H_milestone_output/gqa/gqa_comparison.png b/src/kernbench/benches/1H_milestone_output/gqa/gqa_comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..97aae133d8e71d1a28bbfd124c51354972bc4bce GIT binary patch literal 34167 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%0D;a3CNGH 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

aR~I9;T}_TD>i3j=8(}1 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 literal 0 HcmV?d00001 diff --git a/src/kernbench/benches/1H_milestone_output/gqa/gqa_op_log_multi_user_decode.png b/src/kernbench/benches/1H_milestone_output/gqa/gqa_op_log_multi_user_decode.png new file mode 100644 index 0000000000000000000000000000000000000000..3c2aff56dff76f91cc7eb2f405de1003e129ecc7 GIT binary patch literal 21824 zcmeIabyQXFw=cZ0un-GSQokr7DN0EigtT;nf|Rg9S~h7SZP48v(j6)r6r@Ww0t(U{ zn~pmlzQ5n^oN>oF?|a6$?pB-v5wqZkZ^OzNJP z5(cxs27}qBarhAYCMz(21pX7S6W6d)wlcPJd}w2Yk$Y(O#KOwX!pz`;gOQD`nU&=Y z4z6n){A?FY?d+b|3UG2_|MdeN~V<9 zZI!2yGySBYDqa1e^LI(bZ=F2N{X_gLYcO-Jq-!pTVs7p8WYcM$y4rIun0PyDP2X%h zt_`oH=DA4i?A4#@b?^uaugb{-V%~?B+}-$gdmROjP0xOx-FAsK(Qp`TZjK7O;W)b* zJ$SQNF77__B{&h&5kfHTAp8(}^KcFP_vbn0I0kcz zTElj|KV9FYDXAHj>Xik(qC<@YrijnFj{T~+BA&E1_tMl;*b3^3)R#v>^pknIH5i>O zb;}*(K3q}YAhM9Kzr`GH{VW!mRq=u5VTjRc_3mbM@6^qw^A9*pj(vRa>A4-jEX8Oy zV0C7>LxGdXl6ySbW${~Qwr)8~Uy&reQ)0vQnZ9C$lxW=JmE9K6U7;wa(J(#R2VO^N zFj@CoqJ=xg+Y(qgv@LSQ)6~d9>}A^{{p9XzU%0J@Y7epZCCP+v zyR6OI_1pItJzH;J&5@*^70w?7LJu`~_!2gR;82&6hT& za#9lf1z5<=UAw?uy|vhDUNu`bmHa_o;HvBVCsLkZ(dmz0Sm@n}UFr%kE{jqE8{-Kb zJyk1(nJP9?4&HO6W6_z34j<%rzv;ESem(j@L8LUEthP+=$)|(8gPM_-U9-jAx2NgM(_F*1B)9zL+*Zpcn)n7Y^QK`j-es2zc~A4`n$tb=QTG2cqyhB=5#H3 zPKd1ins&vqtPZ-nZ}iW(6^nIIZO#1|D}CxeDR*hg=3k!es2gF zGE~v$jqZD&j-_MCaM5Pdwj1{2<8Tnp$Z6?P*Vi5Yk!u*$m;Pqy}_y$+l0h-pE z(yUo3=dL}t6*X1BKe*9doVOWi+kBHu%dI<8^OYYjA+_5cUGb!DK$26ozRQC6!$H^8 ztW}=MrDj3a;1~h>#}8X$ZxcDHzcEFeO_mK)8nGU7HG|CIXH;%Cq4dLPENaSv9A2|p z@}=fUADXi)n@BF?$R|9`P-Qzar&?^;PrV$5O?_Qdtt@}j zC^yE_wneyj0Q;q=&r*A88@D#_Y7`~Y_RvhJPJ5jY zUH_(#7hQI;@?8>Tj-=x9WB+qpe@&73(x;BEyG*8~q_gdQztNJ&=+7T-ur>Ia#xj&h zUthJwu)9{DX>tRX8Xqzzy1TA`U#o72UuEYQ+#2QU;O(>cz|J77Lw2fieRaTj?lke% z_Oyv;MmsBY7fG8k_0)!^=vG|wCi{%7-|05k9a+-aZ}dJ^xo#S-deKie7)bna-&u;G zsNQYa-BN%>&1#4B3#s#?3DI3`m*F%Lj>pq~B^TYgMrZq-tGDdsIG4X(^LUfrKs_n_ z)7a)Q`|&tWV|PKZxls~Q+PB?$&NIuf*Nm||(N+~4ZBx`U_L{;gKMW~$2VqlCmAh1^ zFP!(HUn#X6Gd>f|u2b@{O(dUKSUsNWM^A+CVRjyjr~WIQbcpENV)N#xw}$8V#q6fx z0MTf_;egczh-GiEJfgr9YbV-BU>4P>wLw`qfrRA1OV{7F%d+F)$w^D)lvI}De-r$X-ro~!rAu`vj4=6-M) z^19N!QF0~n$(;>ij(cV8)Mjz@Hv2JgMd^y2jVZoy6}D3X-W#iPF$epYGsqSk|GLm) zY!*G`d;UgyD3>A2jznOy#1roaTHMYn(`;Wo;rjOqS#8=Pu7)*lU~yOm(4@^(GSJ2EKDX12sQN{jJ~jVT*MsM_E@bDe&9gxAS;U?VCJWBjYR` zC^%bU=!J9ld6veUet;#%_Q3bDee>-?J>y(CLUmlvZARv4h9Xm~uMXtoO&Zo2QuZ6n zA8v~{_bK(q3!1-T>wdH}2wS!(>-O=lHngOz;cAn3PsJu2y?}cjB2IgO+1t9w=Zv9= z&u>04auY*$&|U6W_CMX zp_D{1IdYm{z^SV^qJ$rBO3Tbvb~-B~<1-olGF1n^LFN26{EXj;_^IAvs$W@j4~vN+?$=g8$s)QPW7<(bS5ZB>kAq@YM9{gyW>L z`euZXla0f#Sbnj15u$7Ir1tLXZ0CwO{EJIn#kPtUPmatnxGpPFcCvaB*S<^M@@x3O z{O*KekxuE+q>Dqb_i~FxPEd+@1n{b6CTc1L#jL(BBE2wp;DLvL3OPoVH@fSNm9Dp- z??s#j3+rlLWy6%7&hEMDk`nuXsA*=at+nBRjt&LUD0Z5Vb1BrrvW8a#>wK$--P*m2 zTpW2nA}A{Dh*9lK4VTQ%46}tu_uejc!vctMTErw;6(&vt=(--%Krju44&KI01Q0`t* zauTw`8s14@6T&$fq?9o;&0k%~lXw%si`D8jrxgB#zy4>O%V!{YvNCWXR8g8bsngF) zsxijL&?P~qNaGNl@I&jPVFo!mt|{G`;bYVz<@nr~-|E#Hst(l+!v1ZC3}~MmcsBWg zMEvQSZ(-hUkd4$!D@$AgKTF&@%5__1`6y*$N<#mDeUGlaNJ_(yeQK5v?;V9e+xj0( zMie=6To_5KN2T6gx#=M>R97;6q*}tYeDVG-?D31!5te0FX?AICY0loYt0+FjWSCcd z&RoYyDL1r)b)WT{)9VHp4$`2()w%%=OjZN{hnH15#GDjp_VNuDQ^tutbl=Z8Y7VaJ zO(|DWaW@MKJo@_9LXxj;N?bw4Fw5EK)al{K>{EZH1UaWCQevY0j`@A0eR$>h6QR|H zd`8K8EGtZs8s7B7huzv3&)#6HFSQ)5IyG&eWAJ^EIw_ya5PP?!qn!WLV!Ukm+D~d0 zy|KfutJj;X@&*n6iVl5vv$>JFlE63UVjH!p3kyg3*N|}4a=T1^^{J7OQ=bhTWtdQu5}yV2Rd%dOr+B{>2`L=7Gx;!(SP2<8jlwc(23; zMPhDU`COGV!7xBL&-={=LCSDrLcu+p&Voh0m16ig%z+P=NdBw| z)mU@%8&$G5=TnbOX3kWEI#1_HMvYZu&e2vZjkR#P%$VzE5Uu>_h0EHS_tQH3c<8Cc zVA3MInn`p?h}&37pRw7PNa1WNwKjM5V~O!B+;EbniGRw`0WAw90$^gRQ8#UkqsHX> z%~GN!U9iC`rFG6#m&Qo^9jM0Ev#i$1_O5bWM=NxJELU-o?pmCE1DgY25)|*a&%iD z>=+l!eK{eR*?_fn8=C)V+rqx$>Vy3Oi>Yn;*vENb55BMlPxR)StgK^9Q`2AE!kDVG zIiC`ycAhOYQRAf%W^LO%CF~$0=<`_iD@97FS9BtCipBJTZ;-gv2)Wz*i%cp$dOjTe zunI3;Z-!92Brp=FoY($iyw_K+hWWQ&bkg`$-}aWt%bi>t*Kt7sP}M9d9{c+FhP_GX zxr+NfeD(&H9v|){wM_0$KAc?0GLNrjWMk4XHF|TN{nK3lFB#}pHj~M zPE&WJH;Hmaq@mZ4a_p(XkgKoW?{mjo04nnJ;lwum>wQ+^m__Q_1Zlre#Ak{$BpH5x zQW4TdZ^-6ekjC$56UmZ6+svhRmg0ywS9a;frB@iD*_o>)1D7$eL0&mkhsUfZ!wyFT z)qicjUd!JNt@B@-?k|_|bWdaL-<;m&52ajUu6?A(^-Vp}fGjp{8MFVbVB6;T-+Z`o zUj~aX16l{JH8F89>moy~;?(PJ=Cv!yFx-Lk4=}Of-tA)snpUzy6e(+Q#Er#9&iwZ? zQXiO%Ms~SQsVyJc&vu05+yzO4<5qWTEo$Eur+d7P9KBL!c8q{w59zo-^5lLKM|c!Fc$5c4E#t6g__1iZ0Shw#49Sj z`S6bM0x67!&=|=fjiUhXWKdz+_)YE}id!Ck7wx*zySx;$D+JdsIRT5^66`dQ6w(eL zF5)#AP4Lcgil|YK@aj)nv)P}edbZS2yhkuTJ<0c(&r*NX$*$a(%rJXF#(OWPVo{o! z|H*?iby8+!lSpfc4d7fNL}0gfCd)+>bg5}4@$~52=yzFaO48%8k&ZYJ%k#AG)KVy5 zI*HRGt@zX9J$laU!b{(8Oq2}!FKsAYCtSj)K%r%O@#+{=@=e>(L_ouTZIAL*OG(n% zt8{PDK<{TYUq@pVNhr38>DDsOvTNe$d0J_v1fT4b!yM8$)W})w;^38A1zn*lwJ^@k z!PWQR3E+lI1;%4vv~RBt#=Jg${(aSIiV{T#RH z{T15?Y>^aeR)G@rO`At3v9x=$W^0_nvHFB1xDzw<|M`V-N4Re>k_HqHx(Q|#58!%t zGZYFKs*ADa9WqPkh%C+zF@Aplj!LfB0))PYDh}=$DljaKLTkTX^d@Sw(!xznl|I5< zqx9xTmIIv9w2s{jp|J6J9iB=*a%Iqc*P>`_K0jugjb^tmK{B8KPpO><>mrOm;sj)E z;y(k0Ac4F7J#sOkqG#f zJ%WpxI^rME;p#!nQ}OR(qq}cE?7hZD!#WK7@b=igYp_R39~{5dI$m_sBwIb`s6u3K zQesY>x4US0Vt|6vx?N995RL-Fd{MXt-unN}trnzWwg3PppJJ3qL}$!i{L=Z3^ zP|9Fyq_a6f%}e6N5;{wcpSu?OXzB!8@%%6Ygjkl4Y{bXQv)y5>t>fAu3^O0_9*vdAo@%!dy%jcqXSp;DzJB%Z+ z!5pQ3-m{RDxNfdY{CYvo@kt93#(jS+l_PdoLZNxc25~9`l8)kV5ejY1eB+=;m2i#B zob1;zKwXSY08=MrRkd!s(Us#Cw6juNon+;<6rmdIwK#6sUuI;~BJ8{(TTg2%8!qhZ z@U8nioJRX&#mlYYDUmkPyrX;t*goDF$X#ed=af`h4OUGQbjZuRI7BAxL&+`;NzID- zhOsPeeI%rVF+k{jkYtZhL*P}j$<8#@>f8Og#bm$7iJ-5^1A3I<#A0;&-+6g~17UifHG(yh*%cHZ}eb=t; zyh$R8kIhPsQ-P9x)T&e18z#-Nkc!M}P4;DVq&Kzzm3&_!S#C@x*BeLEzF!Dv+&$3! zY(FXQ#>QRq{Ha$<(v?R8-&MzSmnH^OPu`^pTwb`!IXAnUpp>%@BV#S_69M!}VDK6v z>$M({Ke2D4aryI3GWp0ErbK9&i@S}=>?Yphh?7Cd3Nd1*#PlI?Xp+wX!y7Z&6cO^Oe-g3GXS)XOzCLc2TnL3KHnJe~^f!{0n zcNq#=R5PT1JD|yoQ{*6yFSw(N=%DIyJepvDsRG~>j*WsZF+FeR34i|Q*1quX_xb;Q zfhql8UIUb8GIFZIC4A4l>(;StDgd?{@|)IGEQH5IwDW9Q?(|enbu=nzWezjpxRvR! z6F2|7<+h*fe4oh&wywz?bNIe-f zbK0{IFD=ilS7-Y>AS5D;TcV>l%EsfDfpHTQ2H=xsSnr?Y#sWv>&ZngC0LEi=TB$d; zo<3qPsJ>keQ91DIaAl19juYNp?X6AI(RdflR@i-5kct=O*M$F*MCm{36 zgRV2!4nZ5!zw(KcA@Qnmaw5nV6?NP3R8N1FSYOsKgilImi68m}O!Z}&B^p8zHev-x zTRTXACe`k1zdd_f0OoX;=y{|LpZXai* zmTF*PbJvqO<=?%^*a=Q#UO4m*>$y_PcB;MCaakqaOWGq0_OF_oA7s1J`r@B z)yb9BC3y;cgjr{*V&MR#aPxnV1v6Zo`*aSmO=`8*r&O%blbSmH$vC(!FRJlb4OC2s0sX z*vcWHC!}ep1hm7%Cf+_aT@c62##`ek8j-dq3|}vO4F6VVa7`bM zqm={4L3M7r{Ur4Eva9`$`X6%6z+c$!`cUr&F&HBwgW1C#2Ohu+o7?~Q#sB&m#6dBG zc8+7OC;wIR%nUZMLPmDkV}e!ncKgdCXa2KBPl5gGK`NcMI|~8siKt6Ns>eTJj{@qA zKx?uiJa|FI5ywt z)GWHYg;YE>ok7SWb|B7%n94!LXXay1KY*M6^$BQ64G?Cf5BcW zi3GW2l<=T)Egvd_FHT0tgodWVv@PBaWVd84!@9%}eYcy!i(eTvo$Pc$_IsZ!AEh-? z=5^+Zu_zUr##>#F4SUngq>wj9lLjmuI11JbD+}UR4&O2>?q?Uk1Tct-O!fAIzS9Ba zf;C$dss}7@4GC%D&h}=?jb?tveuqA6@0`6?tkC1mR4uCr;E2M3-DDKmZyKeh>*kiG z{_Og7tX9fqB|i`=8VE`;JvMhs%xXwY$X2Ia@x?o`3k3{ zc97SCm}EoW5=XNkUy+p!n#8yUi>&|o&{^&{$D}Wb;zI%A!&)nWe{N1$K{yBr-4@eU zSdyEEq;fufKB}56Iu>c0cRs=M`1y8UbL12$HB}^83sjch(+j%y(<=3=pp22$L4h-57+Shd~!EG zlN>IA-E;Q-|IJhXJ92fL)V_IC@0jGmRmNtlwb}9$p~oq;o6fCI2EdXGb{vtcvdMHa zXvAdBFv+I==e^uzH(9txTAoZtY7qLtEq=Q)Rk0mr68$Y$Q;ACF$?ZMh$_He)9WXh2 z-5kRBW}yC00F+JBK&_nuLdD^L^aOy~=}1e74&MRK#$Ipcx`3yW*{*=^FfAqU;ThP^ z9wiO{Dve25nF-m7Q-G+qTWaD<@uw41(<$EF*-QcA_gWMH*9jnFzGwTi(gZAkSo^55 z_94K+@B8MVZsz|&0bj+fh1mgXNRS?GBFTG@0Tf|mMC#VCgvM_I$dP;7o2&Xm_2-11 zKJlCC)-;LAyd)qU?GqpJ6cN>js~-ZkY^Gld*0wz50qNBywQb)#2yS5#e$+wR)p8NM z6R^?0a}-XrCDbeVkz{8SuY-i$eCG+UB;@UZSCx@Acq=AVrUrfHbzJi@&&kkI{xhv==Wo2&VnLnarz7OdF@I-OKS~cq9m>07Ky^og z52ms+MIoj$ur7ch#{cGMXaNXkDeo91jeDA+1o<{KwQFX6mfGU4+aLS|$y{amkvgC4 z=yz@`p+LgrP^&;z+13_dS))gU0zz?dlTl54_GMR>2A?@=kKijd8k!2v3xUN*NnQbh zCkdi}(SB|~7-j4<=(u}{x@C6X+$1=y?7@x!myGp?Y|Cv>`-b}8r`s*r|L4}RK>*{4 zlG7fz1pZ1o#%;sQFDx#Bb_2R_ok>QFq8{Cu$M{Fuh*`m7@p|J1SM7|fbtBJ|WDg9U ztn9WY>Nt+KUM$BDwLjiF!mU~ymBgLX6#rgCWF)C`=9EXfWqHIUOaQ&GK$P3Y#00DU zx->66zr1p%Mm&`xYJ_3K+#?s7zoiAJI^$vNCX~V5 zZnfc-!XPCGO65#oQ_0UzGuPjrU-de<$KWQ@>;U!}8M>Q8McquC$}Z%y_{Pyi zvH!{P2HcdrCbU^PSI}WPR4&vWc4&{_4i&W1-5FB*oB>PhcZP6yb+ho)wHJBos0&L`s``dy>LOM~~DX z>l^R4t|2z?mRzN$hj)fw!H7cBUHG~m`1>Si(O5u6Vn&%lZlM+a-s(bvOi?*YMIiF9 zVc}@KVw#AaRuQ*sHAJ%?)+ zHX-$dA_lntc|h=AfXBGCbm&*;1TbqDEmutTG}KTTgq&A)fy$PffMDL_R|hBm~qIOyX^Bq2(1)AJH>k! zfeFtcT?0p#6b-gOaj#_o?oQv@b$NpxanFcJPLS}EM)c4>R(yhFFO?#9*ySxsygiqc z8XGhP7--u79p99T5vgqM8wL>>U4tEF093p7q!7LEXoz#_;ytDvii8{iTs9FyacH&H z>oEFHf4|yu(A8}q&}{~+TT`|>1av!GLBz)L#0QR&U(b`D?p<6J{V)D5Mc)Ns=vq4f zA%*X$1tDv@D9-iV)<+7Uh33QGg|oV~M8vp5quzUNP#-K2y-8(2dm1$sSPec(xd>Fg%J4T*2mCae{`=5-rfPwQDe9W`LHH{ zpO8i!l*75zknV?Rob|x8a{=nmT#bMHp0Pf`JAZXs#}HPsDKb6 zw0!05s2=Gu7`2en+1*FgH6QJs*i!CZucw7L-YSM4$WlA1gxe)&FfiV_?>W!0luQ^*HI`-PeiH!p_OSq9^7W z)^}^ne*AKx(K5sBJXjN@x@q7}wwuRjy@f8}QWPqtU8?GG$Tf=tUUgEZNI6A*0$BQN z8(m%tVI%_G27$8y%F|7K&qe$W9DKs3-Z^DCdr309z!P zWBGFMwHB}|;XLMQAF}^}x50H}@NbyOmr7(b)G&{$7C!Yy*@xvBWU&c^j>xFFnNb$% zhmb;w&II%y&2?mw|21?(0CZIIcOB2Vj)`#`a8h*>{pGP=X?JJ4p1GNsThIU) z5P5r%X?g;iIIv?}X2 z=N7{ruriEpy23|NA``;V8!`aQ&6IAoLX1dn5-**A-B*rV+mvid`{cT?CRdxx^HY)3 za@F4XKx{$Z?9b!Ah#1UUIt=#)EZHav9w{ip2m!OiHm&9e40R%4RNxnt-V@=E07G?- zp#CiyDX2^e(UIG3km3>ndWdfBLcI$?`dGsT0^#6$bJc}dP;JS2LGu-l9?pb9GvmmzcyWUc&p?$$@X zAfLywZNc|SL+|fm^H~=VIXm8 zC1<>=E#Q1PHf-W=|H1zbT=`#Q6cJ|zCYcntQLJR=uU{fg_ueQp>tI4We76x2qby2c zio>{(-sbB?Bm*{8HN!;(dak4$gaA@#2d_S`Ird!zU~^4DlOEk813-Qi0G3EXmILrE z^BrqOn|K4JMxqdo>V#!8)^~)%NN2#;BYFzinO#BnmP5oa!N7<8u`b7*IcU?P^&rIA z*gQeBy*`uI$e|gqa7vQ4?YlXWXwwQo2!lZYqu-9!NT@(Q2ep@jA3?NDL2;^WS(@b4 za~evIO=tYRCwGB6CN)EHCZN9Z~ITON~qWazdIY&r*$$)32G5WT-x0&(TNrLB|x#P;WXhRK!KOGcga7foV<)Tlhh znxi7NGueMRfEZyA2KH8P2)CyyCOodhf;3?Uh25{Ls+Iab0ckQfT>^@?8>kSCRa;=j zWc=#&8_+wobTPBQ>95?tIb}qEtvSf(u`TSO6ksen$4Tf#T%Ph~*ufA6wQE#d;eSZ! zH~e;XX{$eRdQra;7qo)8Sa9~;7iyV|V>Nhi*8Dr<)e6XSS}EcLoxmfiShr)8SLYHY zi}C|U3pGK9O{oYh6E?2W(U|0kl?@bkei`Yirqy4Qs;Z`WnK;`oC@80751o-5Z*StI zDUd5cNH4?Cu0WhDhg5G}M!1QhM;Ma0+2@x>cp4(0(0}!$RNvCT8^(#>K3p-W z9)!4=KuXh&`%mk7BjRsl)o%w78SVhD?LHs5l8C|}j}SMH(Fp2}f&I2F@MEge)ZlwJhW07@zY(KOt}6^?6q zUTb7;Kc~w7hg`i@g(&dHh)YQ`@5$a1Ws#o*Z;t&{^`?7jp#xpPy1Ab;4^o|1ed{0W*>OVmaozDTC>G2FwjQyyk*^svawFBrBi zL_PU@q<7a)Vtk?_CB@2hN?Y?JEIsq}Bb4lft0|H1U!R~0Z`#p8*g6qu&-r(Na~`;? zD+;ZF%Q#80IE|>A3*}Q*pX=isx@C!A#>{_&LM4!aB$N_c*rg`33l^#jomDjF1fHg3 z1l9iWj?1kDrd&I#i67*p5o0;ZOg&d!xCk)@?d$^{+6#n3X#F;%U zXK!4Iwg!}KIRQXy?FdFqb^!!wcmvDT4Q?d6PDM#01fDm}A&ur=jr8epHG}3tT^aBU zc#WKh(VbL<_v9s#o`e5%P{qT1JqU&J{~s?*gGkm;T?Hm7jkpNod?7d@gfR27l{5-L zgy&HIJyHhER{5hT1mGqLCNUK=MSV!&Ebh#J)wp%uH0W|`5TtsO2`HFsLCIx;8-0n*c1r#dZAsLIF-@mHb4%K z2tc<@Rm>s24q#G-4)W4Xk3BzlEKla<#&vrbRlLvC5a;J$nlbr&(d>qCy?B}P1#SP<@~aY#1}$JsLXh}6GA~>; zZYbEj1=2{8@U5@zC>ivcskkpEFeHI7Ul?k=GWnA*F$wKVcsDTl-;o{eDGEMETu$uw>&`7ufK z!nnX~5qCX%)7n)=_5BHuxUwwnu<>kTFf|nFI`4u68DM@%&o>eRu4Lnq+Hb%M@@PJS z0NjakUs2Yg8AO-NwJSBiV21&Fa$30RW;=^aETD+pP8iR$_$!my#9uQu2iS3o2b*w1 z|K85h)4n&F@1Z8yVf5T$0^HZokCPyoH29Bx59eV;HEPcS1;cj@Oo-80oI;&7GD>!U z5jz-R7F|A*=1A}Jo`#=)j^9rpn!%oc#<~Tu!d=@i8}qH1y&MSHo)Yj*Z)$DKI#x%3 z{p&HO4r?dN{%f!Ubc=e8BbH&pQ@wN+lxsPZ>#2cR)&iqV<i57Kt+h_}L3q+HnD6*De08F?ay4WN=cDNDJiCu?&AtF-O z=G*0o*cT_HL-cTFdk7AtsWS>fij%5vXJQW!Qq;!L@T&XPFaw%s-qTNX9bq6Z8O^Fj zIS|Yykm;Ss0%6zsUCW4k9w8Ir8ohPxDT*F6FzmWoJ}9?`kDz8sm$||Bb62aK_W%bS z9=YZ^v$Ts@daQtg>urJ4NE0)M(t9hdpyBj5YNCn2i_{VEQvkYk#$3_7*Wa=(^3ZPH zblX}h0JjRHF85ZJLFwQ-DcAXHmhhdNdv>@Gy-AJsdaG53F08=1+6mH6gPRpXtCvmP zI4e8j{%~$iJN<2&%QpJxm)R6yRi(+*wvhKYC=EG)!4)IVlO1qei zbABbktzykTJ7r`vdzbSdS8T<|b&TkpXs9ny%E74Qn>o!%*4^*E{o)W9rXd;d%R8&| zwLNp%-94=SQ!nJ78L+|rpFIrnY-D{3Z%2MaYG`{mz@{9D<{XuBPMCfOr0BcX;I(qE zw2i4z|55qjYVfjdU*FAwHB9JSe?cyiTF5O>Tl#FOeXq;y2dSn1tGSf&n|Z+}zix4I z7~PFXj5G}hJTvpoCP6N^*l1=Q+x6iAHt!pgW&n2ir`igPgsS{R_@fG#8CpYoDh{2{ zY)C>Z{iCqV*bUIjqQS|j-cCe8v0ezb=5Q&O|7yMHjx}$FZQu)KMjbdUIolf%L&2hx4N-h zc*j{_3~V_chn@5=b3kxc09brw#9YCIXoxOq745!r)hD8vaEeC!>%Vx<+3OgZw=c=oRtOh|^^4k#jxLoH?7g2cy zmHnuhq#xOCFf@;hu3c+1$k!?Wr`G|i5+>j{8;SZ}AbhP7WjHIjLG>zb$U8>Kb`K5n zv_li}PEF(Ct4uolE@%049%7qttZlqkr?5r~r~Ar)&A+*g255`qpr2@Y{4=G59cE9l zIM`K>f717LK;!wSvDVQEi=5it^%0;Md=TQ(Ix+Jx8LS-FH#65=0wpqp$xe@4l@~8W zV&=+BpGh3@ax_;xss~jLC<*`N^1*G6V_!3}inQ>qLuHenc)%-}&@i_kz6n#l7mo=A zxdLU0y8Q;r9623PXjhiubdmwi<~3mX`t6h*Ho-*@yb#u*<2_@vGTl1?K04=(5l;6o zda!XX2e@xB_FX)NRzBbMmE&aRRXX_fp0gf#YH{E!Ye!ElKqJ1%Af%+nZv&#BN4{-2 zkdaLU;6VU+ywJj|CWGE7vc2BoE)UeR0%ghVzC_wRA{LC}Ur&tUKMkku@WVWA$K?>6 z_o$DaR(aQjU*W1!RsiJ%ZmA=2=qDhMJtEeDx`F@cR^^;)j$#ZsyK;2jLt2dh*TDvo zr{G`f6%i+HYlh#BJai=dORd+LW5{j)u#(u#DjO|SS~mkXky!_H-d9lV`8Kzq4tp!x zQJ_3EH|PqoPyPt9;7yOgZC4ptfoZceFk5?mMotT1HzQ=(e+cfLSICF^1g>AL6bt$1 z75JYi5XzjML!CzB{Ir=Y+KnsGLU6qlJzZUT-ZMkUyYJ=>4+1y}L>oIYdv`mm#q4gS z%may4HnfTyj^(>XA-ZaYy>Qk-txYe%)e>?A&ulRaovXNT(nFWSW2q0$_=hlK!x;$^IvobZ`E#rmHK*hVBfTkUn)fX{+XP);KBALw0@iB=LF-4mQ2SQ%M~19A)h4NoHqpdxxAqn| ziaN{bcOit@0c?Gs^Yc%Cp5r=WKH;(d#656sXIj_dfKF_bKAzB2cfG6eWP+V2E^F_p z3JVFVPT>9f7Oic+K>Hd9>tN6vk-%-&E_EeoeQAtuypWLroBv~v??KtlXlCMy=(?1H zc0my0rktn8y}V{@muow_U&qf#P{{ps$5W_(-%(R}_%b#6&F@3@*mA&;ONS~9xRXr< zO`@HQ5ow&anq6iEE>Q40=rynuc*pl}usj|rDibS|J1*yqRo6ipT4p7$*z#-fg9^tL zd!eA`U%aBoPC2x>4t@lCG`dnmw%wp!^`6YoYoM|reuy>QA-+?PFb%3;(B2b3p8Wny z9Y7TmP$FDZ+~$D13x~3KV>-e0l(he~coQ(xAGKU+iMHqtwbl4cxwKO( z_)^^L2b9jxgI<$Z5r>VT8u{alB|x5ac#!OG4{%#fu!v#}(GjPq0=^`Va|GGH`aWgo zNlUo(8MlFq1w#EyFmLap4{VRbp8D5tAxANwx+FwN(=5@GD!T#sr`kJlOtHc7>qXB* zL_Hb#FF3y(`5{G?>vCWln7!kvM?^bscz+Zm2<)j{@It45Bcugwa$JG3nk>7slhA#m^FaU z&t3><%>0qR#J1oe4Khfp3##|pe{X?rIQ9{(i+456jPBR3j)Fg7dL!=|^|MmuDn7$; z<>Mb%!r{RglnsX4EIwF0T2p_lUO_dYDe4Tx-uiEMo$Tv?HsxaZ@@&7e*XltH>C5Bx zOrFNgkzql&;|wAdby!s2)u=Tp&dNOS9^ow1jek^%J7O33p#qe|-dz+$(?#fZXi7Z{ zT=Jv6nb&-J{393)sj4>n=hQNh&+r)X;)|C82^y?uya67YM>EU>Jd{4oaX`nvksYG@ zkoU|JfR$vpNM@ga5!6KrgscOC31dHFq-O86$(c=t9uL$CIQTQC`+6fw4@lp;9H75e zH4xh@hv#&mK2r2F#fVnV!_Wy2>k(FOn_i7sfUs#L9D1I>185(yJ7Z>s&9`wb8}epN z*Kz+s#&;H+)Y`ei?A{{=>!=&1Nb1ei2|O?HO`mwZ_GAlZ^c)aHN+T=BI4eH30`>A4 zrh_|T$K-~CqA9_OQuz_Yp>C}_cQjql=M&Ff^dtTWsDLKBIa$lgpw2Rbyp{0;CP-9t zR$-v5{3FoMe5S6$&H_8LFf^<;vSIqd+V!|u`ZSc1ENj=1>x6jlFz0;)Z#)GIR;cGj zgP;4Gw7FrQrX5I;M(zqn?5g@6PE*aov=v1)IW>3cH88wP=c4{#x(revnf!v1p5e_(9Z$v2r21x{ER-z{%F%>2JiSFp#8BD@Y3l^VKni@@ zcB;S|shoJSvwaT(yLiN`Uw3WU&kzY}2V;B{MGt=JWMvC?wT(rDxMDh$@Z%ul z<<#`jSD{j|{D5ztF^KT>`URPmQ+xTnidy7T4r9##`ccHF$KOf$@gW}#?y0Kl7T#`& zsH5t8Uq-m+!dZ9eU7M}`mZrYAstS`B&+S}C*4kZ2^dlBFpI!@0rY1Zt!2j@{1sY$K zV6Z$}x1l~DBJs^sQ7A{l5^QHpMV0vL1pXH_h~7aXxE6hyr3cDODw(Qht`TH%X+^rP z&Qc9Vpussjap4A2j`wfIAS@97z2}*OyWh_q`)K!lpIkok>>K=A(PTF4B#Zq^3-t`@ zy>Xo0?*o2}bE{aKO}NA@ecvFsa!8{H?{&HY9GN_QPb4N}eKpO;o0&%#PlVPsI|Ld? z^r{5jqQDc$$PSQ^oy7M|vIYgzoEdql*l-rhTBVcF$w6?oHeszhEO{+;Do|&^g~ew~ z?KqV<*KFQmNfI-s-&v}~Sxry3U8(r)pFtInC@TmRt=SOcq)cg?1TS9FK{>K2GBIU zA1~}6%wLrMAbPFe8d_4UWUq5MVxMJ_%l`T>zcue0X7MbyqZLDu$8xd9yNZh!dNa*4 z1=h_x7wBA}a6Ve~n^AG`tkXG&f3USZ2eRyWqopqL4g4^N&*grq2NQ=On16f=h)z}4 zb4sei;<-Krk?wN(@Hea?POR@1{zn-+JFM{bst?g;VEk|km(!i;%=X1j$C^ubBxHS+ zv;{NetUX2U82S2T%5gp6uuQp1P+jJzJ;2V@e3i)scKcG^LO^alm88qC4DX2=G2(6e zu8b>>wV70AbrUKA&HFM3%+=0fZ6KF?Kk>8ESn3KJoBtOdyKODj3FDy@^(bw$!GUQyJ#_%#@v(Z1b;36uhevE&_j9OJv#7< z-`(LQ5y&yFO+m8WU=FW;u2Dp2<}c)0Ai9+MU6q~~O4X4yr7%(nYAG+`&wb{%REs}V z7y9gd_Z8fV;b_bFD{sa!qSyPTwSC^-u1@jhMt05QSzBb*5yA+{+2t2iQ)z4J)BGdcyIcKhhKEwF0LyPu7mJ;J{-YRY1 zQn0W!D5oL~@%e2aB}Rif#yqUCD+y!OYQi#4chce?F??7zs}+q;B{s7?+R-E!M6r_lk6X#L4_+oJS^W>Qa>|SL>X>z%ox8&+D9Tobi1q5V&2Xn2TK$oxtz>=DWbx0p z-q4l!bEH%keHN9yi!@`-y`W6FzcIMGJxE=QKR#@&RetiuT}f?!`r=7pi>^MK<)2~^ zzAxfVWoNW7$t`)UoJt|}rkfc`dp$|G7;v4Ks*yJL%RVqlqVTqFhTmL!L&!P3v%>23 z#9zFL>=M7;5VJUnvhZQnKElR9eY)SLP7O{3;mwNUd-z4JSUZoLPi)HTt7s^slNk52 z_mPh($Tz(BZxzDM{nELi;6%hC$*VmIq9)V=2L&#NO9 z@Gq&u=AKb?omQBx=uuld_2FTy6UO|^<@?r};Yu?@P6X4aAsKFh*7Vc*1EOutlpi!| z!auAcQTriN8R{#!4-*W&$J>X2(muI7~ffXrX7Npv8Y_uBgA1}ly-1oXX? z`u$b1Pv>WvRJ`m>hf9V-LF2AICr<~Q@2MXad;2C2&yQD|uC4Pon642&Z!W8Hrm{Tu zi2k_uoDBB)&jo^v*e$rY_=WYozR} zn7sYhEKOhETExQ5tI^4QI-KjvJKWIr+Pe~;+vLql*;jS$dNCW_W&AvC zUvuaSrtZtHy}0pJm_m)$=Mx{M$wu<$K0%_8G6Bt%wE{Qz89LshqHCYXk0LuJ-i8=; z=qiUbE`BoQc6!T@{0kMTl-rLrQ^LKJnYe3V=H%$$?#}8lXcuq}4H+f~=2c1q>9zqfEh z%&l*9sOZJQDku2#rdRm=+K{(VxEo~YJY^cy73lgz1pTC}OV`SQVR!edc7jLk8BLXd zn9gUqt+BGAQ6c8+-I0V;_*VeU3$B@WXHu`4nL1~=Y=og%tIcgdh?%zQNZxP!3GiHI zSy)#yGMSm6Kh0M=W&o+2EfOfuSD^5!vzN2 zt(7R4d9Y_NlT3dz?8eW4RJ}m;-|EXyqTdo-Jn39)sTXAcBpyaeTwW~u&V%Rw1B9HA AMgRZ+ literal 0 HcmV?d00001 diff --git a/src/kernbench/benches/1H_milestone_output/gqa/gqa_op_log_multi_user_prefill.png b/src/kernbench/benches/1H_milestone_output/gqa/gqa_op_log_multi_user_prefill.png new file mode 100644 index 0000000000000000000000000000000000000000..25cb8b3528939172dc283814526e78b8ec98db7d GIT binary patch literal 20690 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 literal 0 HcmV?d00001 diff --git a/src/kernbench/benches/1H_milestone_output/gqa/gqa_op_log_single_user_decode.png b/src/kernbench/benches/1H_milestone_output/gqa/gqa_op_log_single_user_decode.png new file mode 100644 index 0000000000000000000000000000000000000000..351c3ebbcb557b1f683eabe82121cd98e5f0dcaa GIT binary patch literal 24934 zcmeFZXH-<%wl!J=!Gy5It%4*)L6o5697H990+N$TE^C=`lH zLH@cr3Po0fLXqkmq=0v_!h=cRMbzbnj*Eu9xr_T^L zc6{7duW$=;)@Yw$K4Q_iU3!YEA?MTWd)N~4f_M(I329YtPqNl8v4uOaJ`BK6o=Du)r0G%F;E9EJ(e`*t=>C3C$pJz7I zHuH&+Ib7ah2UlEm0NOo2k}(zcJ2+XRZ^nVkPGGhRK35>vs&wgEwHMvi>_&m zxNP?0^BU)Zxd&KHC@pG@I*OuK=MB@7wd?PQ@f@FmIngAVqQivHzM$!mD6s@!^3ZE2K9| z_jd42*h2ILK|w8eIkhk(Lw}S>{QDkZe{W|s#*8;!%sn!i&tjX4u-YcoVm8y6l4tUX zbZc`gxaAo~oj(a#^8LD?NrLR-qi4y<99U6g(xP{=^m+_ldB%%4-^?>@I0tvE)U~lK ztB+33uHN_JFeq_o$5TgHbfv1~nYYld5)4Y66b6cH`CPa1Tm1G{nRAx(t9(3Zt=kf% z>|-3~4sjHkHXNsQurK*RfiJSf7KFr!I5(ziq>abgSA`_{ZYzAy&S8q2B4NpEC#Oe= zH^&Gx@n>9CPky>}JBD42sVnWHSySZ7e12OD{gZ;Vq^_#qR;S9n<*_=m(V7S9*#;tA zk8)gQI(aSISw!3y;zs6jnv6Vt94MXrkkMS^mwQQnq0h)WYrHMd81B#7y5sVl59b+0U0!J$ zd465|$nVpdAfazpxvtekt{!`B)^`0#j-Wy>^S3H-X2RA~qL9kH!e`0Ds>V+$z457A zrLBolBL>CxBm1GgU(j0(u|hcG_G^iARaRD!p9rhu6DM&{8og3aW|(_UD6_VRjNEq7mx zWKZ+irMFb>=+l-o}8vZ=D5KEvsBm_%m8| zuPiZ-r8j*e+xs)#3!Bx1o$8}QLa6B1M^Gj&PG9|;^5knbcT*IPd$pc@^n!LP&A!faYWN{JJ;F{MuOsPd{n2|)ju(^C=Tx4SGCW4HSClyOO(McYDg;>V94vtjk7 zl`zj>vZZ#H0x~qy)j5XQjH`T%2K?4K&T2mYw}tttfADteTm(r+Uz5zxL>XZ=i?c=rfr8c5hehER?%cYCU`Q%xS#-H;o;=3J*s<%ci%oPnyf<_{?8p zk7oVQ2xC`^Y?It+#^`7Dl;VfIRdA1cQ&TnPqGC#&ryASe$`1LVZBf$qq<~?@*`+(jnDDN+gWev~Vpp|g zu3P0(nrT#tbSznrA(UbP7h0eJ6vp^Xfsg6brEAz*gR)( zcmDgwNqfvOujOQc$!)redIj%Ca1tY{xPjtWOiv$$|HS9`8WI+DOWbP>{aiPkUiG>j znakRAhf+34Z(#3r;gj43(}k+&9}IUsXgcz=K^U8>c|f+{YG1MZxDVHXx%J5oKIqS8Vd>;j3t*gtfLl8m?W*q0Tieq*>wkD#w3idK}^DCHkAo#6*__6MjBVio7CfTPD z#^yO>+?F6wIgBpE?6~0xlt)jG7VdSXD8bPltDqU;T?MSW9da@ZO7pxu_jk8iih^Li zChOdUS?!2ld3PhQEQnETa^1_L*8qyl186Qm6o8#kKfn@WJ;@8Hv35=p+tW$eAMe+dY2_H<><)XRlj!*ABuHYgm3FYM zjEcRd;@z89U>Xmgw=npjsdbO-+CIM1DHl*^+Wzhs$sHs9SO#8aPzEZjc=u!n8eXx!Jz+z04IIV>d>(xt0eDvf6y+ zfe|wL8#zZE43Tmc#?)&M68@K^?-MVP$ zM5VSsiVkW1SKgAnu6>46vxBAiXvmDIR^|52yD#3bJFJ;LT`l?jlBR>i-db07T7p+2 z1D|-4(wi{LZ7&bWViD&_(@jazdLLqF<1=eKA>uawn(oc?muIwjHvPQLj>0P1g$+X~ z?IceNqSIt4)0V^I;%u_lKT2!~YImoGioWlFMHMkw*UJ_{*riZAGxETcJ7V#^mBx_t zn!sxz`vfbe3>8~fe(jOec&xI1?6+BInJ7_tZN;`Er-{Z;CWrxvfr1U05YA)loY$sr zS3AAJjs&eqYPSto(dsdpatI_0P+CjQmMb@f3f8IOL@ZZ5xsnnBz8>(ZFo}|N<(L@G zZ+gJq*7jjlq>_OnLdsTazf*}PWkyncTRCN2IE)@cD6sNk!ECRE82fJB81|fE>}uW{ zu&)+4^+Yh<50+5{#nY|@2EyK=U)Nei+)n$ab_Q&+@8?H{7F8NPK zO5BL`bf4+G&@&a6z)Qli4HK}2)xo-25l5Yo6mMNE$QYp|`}#2*PPR8mj(Tf0BZqrN zU=??NRzy36eec2441@zCzqw#l+>|>lD6!Jlb7 zJKa`AqN!%!v4K{Zxqj0tF=GnHpJ^Sf!bR?F$9yq&o7?%}6ZVm*H;ej;X5FjH1&MR_ zgC!z=R#}a7Hr;uD>ufd3_v3z|)m~<*w&H}EoRHhJq_t=HWDHvQX^$g`*ZQn$$4*ro zCPzKxxy^7ze}$juq<@gx!ixu^bV07?%^2ei19F(otgmLA)s`yvB30X=nR`0bYB{i7 z!G9$!BJxNZYQA61NQx}M?3SARtYv>|!*QIf@5eB1WkU+--;kxu|7b?@im32QBZjeW zFZswm3Tt4=165^`NHo#9am;?(Nu7tj>D4->2bj!I-`+c$MaClXHq{%yF!|A^wva+C zejgdY%$H|`Vq_9sW*He@aHKF-m$d*EX_+(3H&=09j;q$de_dU#S}2=q?&fS=?bFL; zPw@D>=qs>>*`7(G6CFuA)|`w_Unm(1;vZ3^)L2Q*`9qa)T->j%eT<{B?M|9pCrKEC z*UuVf6QPuVYa#+ZqNigLrf-XW4?Sj+(zPo5Nk(l~IF2JQPEXlFk0qiz zF|=-X@9FKW9=sZ*VOQImqR$SNqdgDG_#e$G@K0TjVbXU=j3|ohV8QKTO2wN(nRwQ| z1kpYe@bRv)!>WIYs+vlVID~RL2jw$idOCl*)&Q;G8m^Hg(}_L6=qi+gEq#&tLo=5C zQkFs&O$zIjwQX(?X*`ptQ&!MM2EW1F(<;%~JVD1EPg&P5hFM#^1hn*F&8{f=_&RMr zVKFI1bYHgZ!bdH@6Q{8E%p#V-%YrT9_JmjO_H7yPp21#Gu&Aa)eTXo zVaz8}?v%X@D#(~nTGWosOigxQ9G+Y*i13$8jXXo8x9w%w-qCk+s=lZF9bO|ti>s7D zRJ~Zx%55^C_qW{jtE?ez84h|%)6aM?g!R+OgtqBYSF#TLE|iBt>>T`-vkIrUsJ$Mh zIF5Z=SV?BRi}vh{JnFUEj*Bb($e2(^En%L5FG*R`nU6c#74`r?ef<|L75m$BQQ`+97Y8HLUw+RFI5_09+CsuyZZ}kB zIxTe; zOtO>=E8*ecYiu*La~8^eKEJHaZ~`|LET!toG#cJ$@8!BUJcLPP6mzSXX3!>2Ivc#$s6= zoiU_1zcdxkLN z084Yz8@eYSVw<(lrG>o~?QdkvgVaZ4{5!9qy$g*CTJL^P$u9IP6pZi2ilTT%F8>8s!Q)C89KG#0~QIE?p{T2dKI9u|H*YdN0{-y)jdf3dD+<)W14wUcDy#b}`@iXouci#_JA~ z&CzsaQhLLMFXqIny_7pn{;oG1$NM4iZld)HZcf6P%(tnt4meuka(jo*mc;G9#9G8G z#fn%}Tc$D30j@t(6WRXh2%}Z}y~F;D?@1{94<@nJSdXeadwh@aq9SEJse_{zscdZH zrT77THSV)sR?bcq$yhH{qFL!%rqG}9zItfE~`m@%H!PNVPS2(T;133f%b zxYH-SNLIHXJx_WP8 zafCT^kL295$ejWo$u(zk)Kl^9KN-CmetF>O{smK4!=ghsKi!eEvfgK`1hpALe9>X> z$ahU5@-5mL7lz7PDi%cfzD=;8EUr*hisgaMh8be47mFdWjApi5f zL@oLsjY(YSkYkRZ7qFI(naTRwCz zXS!i|(RgdTzGC>rvk379mBX^+1E+(i8Z*dL(iEFeK9~VrqMojPAzkO=y&79VTkLtN zGlJo}TdPe^n0+roats-;D_2oXl*A2BCIw4|dM{S?*%VuLoTC%44$m|wRo5%F<7#MV zsL+1HK#FppyJx^1HRrT|+LwBmaVLWfL3%0HJs&E>{V(vxefzfWth(GPwiqt^$B(Z@ion4uL@GD^gc^n?j;7D*R0U99}P1@2&&_r*YwF8)-D-1PzMjrEhD^ ziyKr|P^KvM-PG%~bC83OoRe-B6&`LHBj?>ofB);2;;myOs1k9YLJyKqRnOLku&M(p zX^0WX2Dxx!03C0T93pyW&;?j@AABIDtxXD!Bkg$-&LDG?U-7{S2 z-Ey$id8$>wZv<$pP(BM)&xO({WrA^h?|Y+4FLRTOh|AiIea3#cDrOvEpxV!m!>FR9 zz`92f(l8I5q)*AAYA-1iJX`;@K*y^eO~0si9%WhmUh13{ep#D)l*qstdW+c&3P%e& zzB|-_E%5xFd)H{sYyFitlu@30>wPL=7F10y=>>Sn%nUszBF=hC*2lra^S4}crZDFu zb)Wzy8CIOMsX6ENpV8qjzF#I6^~fOUlsy~{M$tXUPF|mva5!}id0pM;^v|}#;}B4fPfSEfQ(WRs{9tWGL^a@ zMl*n!GQNVy5&ds9T#8oyc<-wzs$D26$nf+J0u(_C@O{mr&AVXl|KuLL_Pd%3SpbBj6l4wrFs_8q z&-LX971jbF8iK^kg~8GZh(7!RwF!cDgBMGkCPFXW`QX9Tw=|zgiTu*kH#+-}iyrV* zvJly3YGVb^T6{GTk4J$et(U+Lvcggq2(aX^RW(eO|4n0VZlGHaSS+5ebsbe-AeXJ_ z6#*aQoK@K9MKa2xKksRD^7@ynysf`SOg#u`fHltIQaAhlXpN|PfugcHGsv@z`Y-TIJ__{^LmOB^SmMO2+cGvlTvDPF<$he7XX`mm3v1(rZ;~ z$K{J``kN252Gd+_n zo-5;5{rW!KQG#mCZ1VSw0=pqmychCZq$f|ojST^}l;@4N(=BsJ_wGkn-~u_7Siy+z z-~AH2AbqsZ9l*8CwPQy)G*ab3;!3_-`}l6ZAMpU+8pBoI0DXF1E||$RxV^$-`5vD| z&g@Wmu@zR_W66YXqJzFGYT{?d>Vk!S6amj~ zj>-gq&1-0+iKm+Lz~K|GK#XdH6_|4EkHhBWzzROzEhTD|4_P%RMj?>{=X5!zqLcB3 zMpDb$!f!e}$Qk{oPZR>AL;hU4{y#y>M6Tq2ubTSrxq?5GPx-6G37-WB6A{U!ulVWV zfeUPGH&fLT6J~8gLqo@bixM0FcK4e-#>pwKVx{piq6$6>3=9M8R!_<7L-WOg_?!+F z!l9@cMbFnhp^gFtMhS|xE|*vksTzS54*9vAmguWTag5<2d?qvis6$WGZT@1uc}ruB z1Ti>0(nvj0^Y!`fVTkMswVx?az^8`xf%;;*g07)5T^z3Db(`0j>B)!!j#s4&gg98P zks$UNCHSl;fVg{&CV>cRS-K&?w1%)gIl-mJ-!ec=&o2*g@H`Zjhf91r-rY!j<^t^Y zP*Xv=OE8m!Dg2%1hQl81w@1cU+QSSI2}f^^G0$SfYET96Yi!*Vd5&W@8zL@80ebt2 z_5{^wXpVT-(Z*WO)VZUSyzmQL?jx9De#>@gw}nAE2eDrEhe%{xFDKnYt46I`Yw=qnoqm%!P99UE)t1MxyOO4lkVNkOe09k>R z7EVbnz^ymUbY;AO*XDb!{~W9(Hjs{@Dn|UN6sJVbEEr0Y%PX%*Z9LYS7$5vGeBcq? zNDqo;i(lU?9Aa`^Fmu$W0LoaIOvQ*x5wk@AoSZf?3Bk({Kuh}4uJ2H}Pq%-{p(uf> zJCw&*QbAr`9`B5L*U!vO*z);gcjyoy&hls)*GKlxl}8Tp{bSU0%^m^B6g}Cd+GWAm zuE;3j^o8>>z#yK$;!bk+Obo1>L@e`PacytG(JPU5otPpw;r{t}jC}ZFMhd3%w1B~s} zmRA_cOfRTyClG@H2njJXnQH`?SwefBh{_acWxE9GW%BiB$2)WH*5-;6r=T>1Q4*bi z*^VT+Ay$5bIvx6=E9VQ7v8dF;DdrkFE7wAp8-&cYxjwaXtrlAQMYTQcUYaU4L5G%sO( zEd{yMqct2YGqEu+Ofjh~559c+7IQmkofJ9jQ`Ord2Tvk@p{o9!_6_6&|9=d5|D^|} zUXx@KbPQgX>04k)Njbr(bL-x{d#2lKGe!gF+1X>w5TAv5ilPGO(a8W)S3s3&1Rn_L z@FEC}93bL_l#~dk-+KE{IZpWMb*T2?AI+ucODJYh7x~B3%-m3fL_(IN7({4_6;O{G zU}dHNBfSFQRuQ6$ii2Ixhlmmb?i^g2YWyX`GM5lw`(s82-pG*6bfpEqpclAwy$x|X zp=b{4UZ6!>F7qSR#?Mc3T{B5qfv$81mDDIm*BL^VAW`O``iD z4Ptp^v2;+-1FLjaj#yn zKs~6mE=kQGY_d)7jjh6zm#Qi%^8Rxe?Tw?nNggGOlAaFg(IOuOkkbf@jRVop0k@P# zp_xsn${$QWZ7-7)@bUvc$dQtT?;r1{dJ3TYQk>%_%pRO)n>@IaaZ5zR9f?NY+yzkA zC0n%UF3gfGAsj-R`05Msm3r1r&}nj9kr)b~+rPMrBg_S3U9jlz%WwA-4$g7c+X{Fu>ZvhRDj|B zNs7iL4xjkVHf$)e-s-d+JjG)q-m}v;uql}6X4(|lVu0FIQcOL>zb~Ttcp&=qxWgjp zXU^k)1K+q^1Xl8`Bww10=YY9V%xnnPNW5cJV(?!*;F*CgjMHx5wErP-j61~2A*ny zqNJGsbJjMMr)+C7b^>UL74QITw@e@wC9C!~54Nf)#!eY|d}`jwz<92^0d*7#%cKz@ zW`&9VwChg*Gt|AHV+D%Oi6G&(@8f(MvNUfWxNZdd0w}0f%J;~q#Yd0Tv`TAXQ+=Rt zSpnKe0cbAM-Oc4ru>R19pFu8A`aP6?6_AAj?Z%u+xo0Hdh}PW5C;rpFNBj*+-uORI zGV|Y7<^SJ9NhXH@0DZAIr>R!kB1FKR82uFBJ8*%Wy$PWIxrxSzFeG5!PI~OK^ojDU z$KT3t7m`izxA208jMfef<@`@K?~VD8Gj=61MfM}yhy@BnxNDMIL9PZ~n(99TBiyJDXw3`zOj&0xW0-K|md(1^)r7X$jAjWFP#H zJ6rpQ?e)3XR~Z7|hRR&|nl=`OE`yUV0tlc6pemd5fGd*+sd1u#Ju&Fe^r3BRpR}W|EhdXQ%e-= zqj$i}Tx@FYFMh3DNm8RSz}xWCYquGn zQgsauVzgll0FYnbxF$l5dbFU!7!jX{Fv))${++k${FYv|Z)G<`$-Uxz0-_uk-Bp|G z&2s)*ZUSbY2PvPSkoh=2Tscq)hd0Y}ozu!OZ?YXI60kT?AeAGF4oFjuzW2}tW|VBz zA~E*7h~kKqR*T_R2x5|$WqRwm{PU}Mt5Hw6yM5P9AJ9&CEm|2$m%p7!u^*{&`uXJ$ zQiyBj7#T8oO`pYMA~#d?7D&4l{^-hls`JT4Dbr5Unc$BH8<0gBuS zF+)wZtI8@Smo>_4h%Hx`h)L0Zi2~u{5Y`jXGeUu!HxVZ%o-OLU)UpLLaE8EUMI$Lxq> z@-$Pj2Kh2d=QdddFtYr%?zL1xxsAqZ^;S$8AtT^Ww>`OW-H*08~U$ zyU-dhW(G=eXj~j8SiPOD{QaSUB%D^VfYfYI*AE{J?n~-iC>QvMF9d9 z{CfM1A$OF4`;aRykXa_;zdn3>q{hB-J<=G}TMY(57KkoU897y=r>TF%WlOT$pf%$B zk?y86QA6Y$gcRGYR*vTF-X|``cb8E-dIj3vPl2-p%jFtovau<1|}>q2SE zR2jWI(`SQ@b&Qh)B#psTeI2-OO!>)rq^iromqkAgY-20g!}$@Vs| zBE~?am_`yHu;hVJ864}mNHKEy&s&?e_ILfjiW?h9Q)3o!8h`4u`QyptJHp~XaSqsN zsi6Yt|7)x>NF@FCD`v*Te0M#ZmtA)^9rIOsGi72Q6MGf>NBdCd7JCS$8U})3TTno)VC^6Qr{?6@ zX#kH;I}D81Z`~N;N_=E=3(EqRrv}*oNGfpYHGv3pLC0-z*p_0X5wer`#`pW`xh67v z=hgv@On}EW>_*_pXdEIh3Jtl00VQ+;rY$>yO|IVm_Iha-WCaRaB2|yNecYe+`0?ha zZ5;g-p84Y~vDyzOK+=pzk_&DW8u4Mhlc6Qh1jEh-sw40HZ%6q~Yd;`8U<#>W(hE?^ z!d}OxQiSO;_F4V|+8EAR?hvcVrw`fM5z!7ISK-`yy%@qCKnX0r6_kzSfyeSvo}b|O zSy%x&=_bZOXr2CsO*+UMi$pK{8#N1U{~` zz<$IC;qSZnb&C&0f~@g+PL9d*3%_$OTZbrB7pzdb?aj%?2qoX`8Fs$ot}uTp?J|Cp z0A)i`D~3#9mes?Gw3fKB^1HPZNU)o+F9(G`-#~U5LJ>Pmef|ORz+P!|O>f=SbW-qO z6Sz37JeR+oY9ZhkM;5bx-$-eKqq%m}i8zeFQUqK&={6$OSVStaHx~0*HF^X)bIB@TBFr2ycJmdPoy8?sK7QOEA;QGTKqc6c)gdh>B+ zX8XuQi8+GoZgVu>!g@MVJcB^=C-asXT})w*+TR!Ud>nNk^cBsi4eh&1oL$5HL4U(k zDyU^@`#q$&X|#ux7r0B%nKm#%74U_9P@?V6ahq3p2?V>K|H#noQwyFagRm< zYDI0ZGIp<6(^{%A`z$?(rbq|-N-BLN+$jPZwjkA1PSPN%o^h8s^5~@}Pe!P`Nd#tg z3z*Cah!;X+MplG`V5$A@oO7Kif#sg7PzfR;MrVoR{Vod+;9(Jh*Q(>)A9M=DTm~o3 zqtKD_Gs-uA39zhgjdGzcClRW^T5_ZKBj0bAyV-87H1V|fYXh?vW!04$T^az6iZi`? zzet6O_n9PGNOA`gt$|B9Tyeu}Pljxs8ghaDOV1kVO_0A(K42q6UjJwHPa#+I|78M> zriWw`rbQG4N_j+A0AWrYrkE$Lu&<&B=FLlf>+bqY$d>OBg%+`B7h#A9h+GaxbtK{q zx((PmwFvap=eJ2-Mj{pzbBGu^IADV7) z^1Th|9#}A&kX6EZ^Tm}PcrerhXqi718U?NiU@DxR7^i&FMF(26B``kzC1a2)LD7RW zusy;;lae9;M&&m>)!u8XJR$a&Cal5Y#r^sZgbe=|NlZ(OaZH~ky8PGQ3M zbqiKhXQj70{(T#0yiqVX4e$=qAmy~ZW|c2a42QwcPLre70{3kOHU*MCcmT@BX=!Lr}U9$5*X1MPEBhl(Y8QnCE~Fu%!$VyT0uB@un!X%qkXNTgH}AP0D2hIdD-4&xM}W-taXh7+9= ztNydv@B)u|maBFiEFcJ1c)Ncq9mx4f2-GW(^(37Q0r{qDWyP4b#M}|I`950sQZTG{ z>wzl^Co;37*Pb?_e4t?~dJd9!7kcZAeZ}2t_F-%)$^u>>X_cW>l8 z(Wd?u6AQpsKd43oEw3IxK+Zs9VCXrVz!i@~0)mu>8i>e>fuM^QEJXJSI#U2!dTSfM z$OF=|qgpJnhCM$l>J``fGy09!$`)C8%4m0dONV3RMgrg+Gjp<{x~1gCL%M1&kE16x3YiqOz` zL~8&uakMQ$qC&t313sUhbBCC<>pg%0M+ma)@&!?(^%dIJ>d`~5&dMfBKOoJ!_w_K+ zFsZ8rqQDHcFvAB>S0{AtT)_z-Q-Ou`28MPTF*^Yin1F`1b$xe0=!iGL1;l?w-#d_K zFMvMD3%HkNk&E~nop+)r^hzEG? zvw-mR6m{s3BSg#o<4xi2MgMGQxdJA=7`ja;{xC*wwKCdZRIMl~onj=#RNhL= ze*$=^*90K?L;sd{KoZy^r6CeeHB*Gpy~?0cT5TVmY6z>d!7r3AHiEXl8zV%FNW3{9 zF>4z*{xS1pt||J+cjuvhz;=kB1jMHtFi)4c^a@^q(crO5^{;G43)zn62Bd`+eg)Cd zJ7Bd^8TkQK#&uAnK++~2-1H4xmnvehB;~g6ejfsDeWK$##E%X#&Y^!{H@E*$z3<3! z_-|sjgE7!eB@YfMM2rp;gEU9`0zJ#$x*aNaUkySXJRBnpBg4}>NT(gFUrvCBX4g3gqR8u#F6c|ENbFQGsj}U1y8eXto5*bU#auY@y(6~&* zQEKALk>w%&yaq#k)_XD}CJTd|kOVP(i{O{kJKE^D`nWa}4 z%4^nG4^`BZ5oCIK4#Tnnq_-c)RqM!jh%sPTX&!-G7Xs|)(lL^H8gdgDE%F{1(dOw^ z2v}iIedst%HqRI#P2!C}Xd|)Ex46p;VH2S~SpNI3UiMD9fpHH|7#k3jA>at}&hmpG znPOb+Yt*#12#&i3;1`oYYpoDN@g5~^u^`h0q`oeYJIb%G$N*4k`RXj13`=fnh|O<* z*L*t}s_3OwRQ;`ASJraM*ynCGD4TP|3xF4*0H>_Xk{zTYj_^a#mDLnI7~xwR2T=Ds zf9?7p_}4V21&YZ3%Jxz=U&a2ba*MjOA-tqaZRo*-1wZ zisF^m>_t(Zz9J1;$OY&^kAYV68wsA1bcnMVNg_tRTV{ASdM~vEaSmh5dIVB9JU&Wy z4l!gx$D0iJmY8~{{MQCR9u|kL&dG7PzwG5*w2Z~WUKt`Jp|J5mx^Zcx&uJfpi0nZl4YJnKHPb^qdC2+; ztim|hfoY8bpXn_CeXPYpZn1Ha7zj^D4rbwhmv_j81^hvXJDBz%;xC?nRHj~RXIO1p z$aahD1TQ;P9wH$Ss#jaZCIFTB4uFMv$VLc?YCJFQ2vUl$cK>KChm zaizuk1Y7^TwkLCMf0H@)1L%|IjgN0Zd2lPwN%{Jt@EbJ`+n)SR;sHyz6AZ72mMgwg zLuMY`)h%$V<|QOh`!GEeSoHq`Ng_d(+y`Y^Gv&9{N*%EMl$pq@oBFgw@TMjVxjT;aTzM(W9e2Z1U8&BMCr(Ktvt0-ynZL zA{cSD2zRs%FF-i?`Snumr`y&0PRrT)?M3`!fLY55UcTce&cx!fbm;Jy4 z`4mvf-HdFi+2e(_^VTtChq6f)~vK*R^zrWs}?A&e*T%4Fj*+ zC4~^F(k{|RaK*1~U5@6?RJ)j>!Tvc;NagQvlUyDIKKX;geBp~qee zxXphL+#uW-2evZYo5>=6dluRR%u)QVO@15tr`p zo<-!cDI9`@-f3!5n0!|u%eE&BOBYNU^B_l_uX#!&7XH3n&YMF8W~!C(h)Mb2tJSx( z0Px^@EaT9xfc)UUi2(kS7eBWX8uODO2qJKRT#gs+SRgNz%z)5WZD#i=bW)HmyvyT!xSn0kj6x z59!By_hcPz5oNI&Q9#xRc+D|`peEGE9d%jR`wx>}{RX+MwbW9aNS=gV|9WJL7+91m z&3tV{e?AzOj^P*1${(yjZagyyg8>zp8yI0efln~Dp|FugeTC=h=SuX!bHwb1n&ULC zGAMIju(T0bmDNZFc?`B?1got}0Z;kNuT7GAw^ROyeV6zjAQOYry})x7l=5@Z z`zcBnu(y9{lK*>lX+j>?Kg?5|>);-^Oh$Pu9Lf$Q7*7LlTwxyMVTWqs8umYW9d$AU ze80C4%>y!MB7$^~y^N4eKcE3mh;B;{nRBSm7c+G1z{|!9&0C1BEx!DP)?61rSPJ5q z>()>Mt{MHgG7$N$|4|bR)e=;iDlhGU_88<*gbokHX9dPwy?!96ZdSAszjq~H64~?O z_9d;%i?Hg~z3$HT<=AIKP&tuWOk8uXLNe`1D}f+GJaHpO#yG)nYy6yN82UWM0qPnx z`EE^|a;`LMI*D{y$UD2`tlNuRKQH%MZ9Y!SBM48DXQi=`TYXs97ccp^Rx-rloj1Or zey7sEeV~9tU&nZZ)}r;%`tomdPI5I@uf76WtAvuL%AhyxEtHr_K@1|hMyG8laG7d< zuP}!|ri$8|M9Hkq3sjUGEJw3F_NGRKpiPhSke#ayby!5Poa?*3VSgQ$pa;ICrZVa| zvRqZ~6Vu9{qY3c`y4L?HFVX#ft~;o$*Zn`y|3LQVumau;v7ly`&0ZQlcI(((uAnDR zPlVsNPTF|aw5uZZM=?+YQ5fT1N)za1fbKGXm86JPs<==jUj^pCrbPxDX97k$m-GP$ z8ks-(eS#*$-|4BmjPCXGZy0W7H)U

PQ`gU|OjBGOKsc3%JyHZ(@fa%PKq%wDAzK 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 literal 0 HcmV?d00001 diff --git a/src/kernbench/benches/1H_milestone_output/gqa/gqa_op_log_single_user_prefill.png b/src/kernbench/benches/1H_milestone_output/gqa/gqa_op_log_single_user_prefill.png new file mode 100644 index 0000000000000000000000000000000000000000..2907472063a06fbb603da0d1066bfa1234bc91fd GIT binary patch literal 23031 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 KelF{r5}E*18(yUV literal 0 HcmV?d00001 diff --git a/src/kernbench/benches/milestone_gqa_llama70b.py b/src/kernbench/benches/milestone_gqa_llama70b.py index 7991a6f..86dbf54 100644 --- a/src/kernbench/benches/milestone_gqa_llama70b.py +++ b/src/kernbench/benches/milestone_gqa_llama70b.py @@ -196,6 +196,168 @@ def _run_panel(panel: str, topology: str) -> dict: } +# ── Figure renderers (sub-cycle 4c, 5 of 6 figures) ────────────────── +# +# Sixth figure ``gqa_scaling.png`` is deferred to after sub-cycle 4b +# lands the Q/cube ∈ {1, 2, 4} sweep on multi_user_* panels — it needs +# multiple sweep.json rows per multi_user panel to be meaningful. + +_OP_LOG_KEYS = ( + "gemm_count", + "ipcq_send_count", + "ipcq_recv_count", + "dma_read_count", + "dma_write_count", +) +_OP_LOG_DISPLAY = { + "gemm_count": "GEMM", + "ipcq_send_count": "IPCQ send", + "ipcq_recv_count": "IPCQ recv", + "dma_read_count": "DMA read", + "dma_write_count": "DMA write", +} +_OP_LOG_COLORS = { + "gemm_count": "#F59E0B", + "ipcq_send_count": "#3B82F6", + "ipcq_recv_count": "#10B981", + "dma_read_count": "#A855F7", + "dma_write_count": "#EF4444", +} +_PANEL_DISPLAY = { + "single_user_prefill": "single_user / prefill", + "multi_user_prefill": "multi_user / prefill", + "single_user_decode": "single_user / decode", + "multi_user_decode": "multi_user / decode", +} + + +def _load_sweep_data(sweep_json: Path | str) -> dict: + sweep_json = Path(sweep_json) + if not sweep_json.exists(): + return {"rows": [], "config": {}, "panels": []} + return json.loads(sweep_json.read_text()) + + +def _row_for(rows: list, panel: str) -> dict | None: + for r in rows: + if r.get("panel") == panel: + return r + return None + + +def emit_panel_op_log_summary( + panel: str, + sweep_json: Path | str = _SWEEP_JSON, + out_dir: Path | str = _OUTPUT_DIR, +) -> str | None: + """One bar chart of the 5 op_log counts for ``panel``. + + Returns the written PNG path, or ``None`` when sweep.json is empty + or the requested panel is absent. + """ + import matplotlib.pyplot as plt + + data = _load_sweep_data(sweep_json) + row = _row_for(data.get("rows", []), panel) + if row is None: + return None + summary = row.get("op_log_summary", {}) + n_ranks = row.get("n_ranks") + + labels = [_OP_LOG_DISPLAY[k] for k in _OP_LOG_KEYS] + values = [summary.get(k, 0) for k in _OP_LOG_KEYS] + colors = [_OP_LOG_COLORS[k] for k in _OP_LOG_KEYS] + + fig, ax = plt.subplots(figsize=(8, 5)) + bars = ax.bar(labels, values, color=colors) + for b, v in zip(bars, values): + ax.text(b.get_x() + b.get_width() / 2, b.get_height(), + f"{int(v)}", ha="center", va="bottom", fontsize=9) + ax.set_title( + f"{_PANEL_DISPLAY.get(panel, panel)} (n_ranks={n_ranks})", + fontsize=12, fontweight="bold", + ) + ax.set_ylabel("count") + ax.grid(True, axis="y", alpha=0.3) + fig.tight_layout() + + out_dir = Path(out_dir) + out_dir.mkdir(parents=True, exist_ok=True) + out = out_dir / f"gqa_op_log_{panel}.png" + fig.savefig(out, dpi=120) + plt.close(fig) + return str(out) + + +def emit_gqa_comparison( + sweep_json: Path | str = _SWEEP_JSON, + out_dir: Path | str = _OUTPUT_DIR, +) -> str | None: + """Grouped-bar chart comparing the 5 op_log counts across all panels.""" + import matplotlib.pyplot as plt + import numpy as np + + data = _load_sweep_data(sweep_json) + panels_in = data.get("panels") or list(_PANELS_V1) + rows = data.get("rows", []) + panels = [p for p in panels_in if _row_for(rows, p) is not None] + if not panels: + return None + + n_groups = len(panels) + n_series = len(_OP_LOG_KEYS) + x = np.arange(n_groups) + width = 0.8 / n_series + + fig, ax = plt.subplots(figsize=(11, 6)) + for i, key in enumerate(_OP_LOG_KEYS): + offset = (i - (n_series - 1) / 2) * width + vals = [_row_for(rows, p)["op_log_summary"].get(key, 0) + for p in panels] + ax.bar(x + offset, vals, width, + label=_OP_LOG_DISPLAY[key], color=_OP_LOG_COLORS[key]) + + ax.set_xticks(x) + ax.set_xticklabels( + [f"{_PANEL_DISPLAY.get(p, p)}\n(n_ranks={_row_for(rows, p)['n_ranks']})" + for p in panels], + fontsize=8, + ) + ax.set_ylabel("count") + ax.set_title("GQA Llama-70B — op_log summary across panels", + fontsize=13, fontweight="bold") + ax.legend(fontsize=8, loc="upper right") + ax.grid(True, axis="y", alpha=0.3) + fig.tight_layout() + + out_dir = Path(out_dir) + out_dir.mkdir(parents=True, exist_ok=True) + out = out_dir / "gqa_comparison.png" + fig.savefig(out, dpi=120) + plt.close(fig) + return str(out) + + +def emit_all_gqa_plots( + sweep_json: Path | str = _SWEEP_JSON, + out_dir: Path | str = _OUTPUT_DIR, +) -> list[str]: + """Render all 5 in-scope figures and return the written paths. + + Sub-cycle 4c v1 emits 5 of the 6 figures ADR-0057 D3 lists; the + 6th (gqa_scaling.png) needs sub-cycle 4b's Q/cube sweep data. + """ + paths: list[str] = [] + for panel in _PANELS_V1: + p = emit_panel_op_log_summary(panel, sweep_json, out_dir) + if p is not None: + paths.append(p) + comp = emit_gqa_comparison(sweep_json, out_dir) + if comp is not None: + paths.append(comp) + return paths + + # ── Bench entry ──────────────────────────────────────────────────────── @@ -204,42 +366,58 @@ def _run_panel(panel: str, topology: str) -> dict: description="1H milestone: GQA Llama-70B 4-panel sweep (ADR-0057 v1).", ) def run(torch) -> None: - """Drive the four GQA panels at validation scale; write sweep.json. + """Drive the four GQA panels at validation scale; write sweep.json and figures. - v1 only supports validation mode (``GQA_VALIDATION=1``). Headline - mode and figures are deferred to sub-cycles 4b and 4c per ADR-0057 D3. + Modes (mutually exclusive): + MILESTONE_FAST=1 Skip the sweep; re-render figures from the + committed sweep.json. Seconds, no simulator. + GQA_VALIDATION=1 Run the four-panel validation sweep + figures. + ~1-2h on the full simulator. + + Headline-scale mode is deferred to sub-cycle 4c (figures landed + here; headline-scale + scaling figure await sub-cycle 4b). A sentinel tensor is submitted at the end so run_bench's ADR-0045 D4 - "at least one request" contract is satisfied even though the panels - drive their own engines. + "at least one request" contract is satisfied even when the panels + are skipped via MILESTONE_FAST=1. """ - if not os.environ.get("GQA_VALIDATION"): - raise RuntimeError( - "milestone-gqa-llama70b v1 only supports validation mode. " - "Set GQA_VALIDATION=1 to run. Headline mode is deferred to " - "sub-cycle 4b/4c per ADR-0057 D3." - ) _OUTPUT_DIR.mkdir(parents=True, exist_ok=True) - topology = os.environ.get("GQA_TOPOLOGY", "topology.yaml") + fast = bool(os.environ.get("MILESTONE_FAST")) + if not fast and not os.environ.get("GQA_VALIDATION"): + raise RuntimeError( + "milestone-gqa-llama70b v1 needs GQA_VALIDATION=1 (run the " + "sweep) or MILESTONE_FAST=1 (reuse committed sweep.json). " + "Headline mode is deferred to sub-cycle 4b/4c per ADR-0057 D3." + ) - rows = [_run_panel(panel, topology) for panel in _PANELS_V1] + if not fast: + topology = os.environ.get("GQA_TOPOLOGY", "topology.yaml") + rows = [_run_panel(panel, topology) for panel in _PANELS_V1] + sweep = { + "version": 1, + "validation_scale": True, + "panels": list(_PANELS_V1), + "config": { + "S_q_prefill": _S_Q_PREFILL, + "S_kv_per_rank": _S_KV_PER_RANK, + "h_q": _H_Q, + "h_kv": _H_KV, + "d_head": _D_HEAD, + "n_ranks_single_user": _N_RANKS_SINGLE_USER, + "n_ranks_multi_user": _N_RANKS_MULTI_USER, + }, + "rows": rows, + } + _SWEEP_JSON.write_text(json.dumps(sweep, indent=2)) + print(f" milestone-gqa-llama70b: {len(rows)} rows -> {_SWEEP_JSON}") + elif not _SWEEP_JSON.exists(): + raise RuntimeError( + f"MILESTONE_FAST=1 requires {_SWEEP_JSON} to exist; " + "run with GQA_VALIDATION=1 once to seed it." + ) - sweep = { - "version": 1, - "validation_scale": True, - "panels": list(_PANELS_V1), - "config": { - "S_q_prefill": _S_Q_PREFILL, - "S_kv_per_rank": _S_KV_PER_RANK, - "h_q": _H_Q, - "h_kv": _H_KV, - "d_head": _D_HEAD, - "n_ranks_single_user": _N_RANKS_SINGLE_USER, - "n_ranks_multi_user": _N_RANKS_MULTI_USER, - }, - "rows": rows, - } - _SWEEP_JSON.write_text(json.dumps(sweep, indent=2)) - print(f" milestone-gqa-llama70b: {len(rows)} rows -> {_SWEEP_JSON}") + paths = emit_all_gqa_plots() + print(f" milestone-gqa-llama70b: {len(paths)} figures -> {_OUTPUT_DIR} " + f"(fast={fast})") # Sentinel tensor (ADR-0045 D4 / ADR-0054 D2 carve-out). torch.zeros( diff --git a/tests/gqa/_gqa_plot_helpers.py b/tests/gqa/_gqa_plot_helpers.py new file mode 100644 index 0000000..19cf155 --- /dev/null +++ b/tests/gqa/_gqa_plot_helpers.py @@ -0,0 +1,25 @@ +"""Thin re-export shim for the GQA figure tests. + +Not a test module (no ``test_`` prefix → pytest does not collect it). + +Mirrors ``tests/gemm/_gemm_plot_helpers.py``. The renderer logic lives in +``kernbench.benches.milestone_gqa_llama70b`` (production single home, +ADR-0054). Defaults still target the bench's ``_OUTPUT_DIR``. +""" +from __future__ import annotations + +from kernbench.benches.milestone_gqa_llama70b import ( + _OUTPUT_DIR as GQA_PLOTS_DIR, + _SWEEP_JSON as GQA_SWEEP_JSON, + emit_all_gqa_plots, + emit_gqa_comparison, + emit_panel_op_log_summary, +) + +__all__ = [ + "GQA_PLOTS_DIR", + "GQA_SWEEP_JSON", + "emit_all_gqa_plots", + "emit_gqa_comparison", + "emit_panel_op_log_summary", +] diff --git a/tests/gqa/test_plot_gqa_figures.py b/tests/gqa/test_plot_gqa_figures.py new file mode 100644 index 0000000..7f1e9d2 --- /dev/null +++ b/tests/gqa/test_plot_gqa_figures.py @@ -0,0 +1,109 @@ +"""Phase 1 spec test for GQA figure renderers (sub-cycle 4c). + +ADR-0057 D3 sub-cycle 4c adds 6 figure renderers; this test pins the +5 of 6 that don't depend on sub-cycle 4b's Q/cube sweep: + + - 4 per-panel op_log_summary PNGs (one per panel of v1's sweep.json) + - 1 cross-panel ``gqa_comparison.png`` (4-panel grouped bars over the + 5 op_log_summary counts: gemm, ipcq_send, ipcq_recv, dma_read, dma_write) + +The 6th, ``gqa_scaling.png``, needs the Q/cube ∈ {1, 2, 4} sweep from +sub-cycle 4b and is deferred. + +Each test depends on the committed +``benches/1H_milestone_output/gqa/sweep.json`` (landed in commit +``e748a62``); they assert the renderer writes a non-empty PNG at the +expected path. + +Phase 1 expectation: tests fail at import (renderer functions don't +exist yet on the bench module). Phase 2 lands them and the tests +turn green. +""" +from __future__ import annotations + +from pathlib import Path + +import pytest + +from tests.gqa._gqa_plot_helpers import ( + GQA_PLOTS_DIR, + GQA_SWEEP_JSON, + emit_all_gqa_plots, + emit_gqa_comparison, + emit_panel_op_log_summary, +) + + +_PANELS = ( + "single_user_prefill", + "multi_user_prefill", + "single_user_decode", + "multi_user_decode", +) + + +@pytest.mark.skipif( + not GQA_SWEEP_JSON.exists(), + reason="gqa sweep.json absent; run milestone-gqa-llama70b first", +) +@pytest.mark.parametrize("panel", _PANELS) +def test_emit_panel_op_log_summary_writes_png_for_each_panel(panel): + out = emit_panel_op_log_summary(panel) + assert out is not None, f"{panel}: renderer returned None" + path = Path(out) + assert path.exists(), f"{panel}: expected PNG at {path}" + assert path.suffix == ".png", f"{panel}: not a PNG: {path}" + assert path.stat().st_size > 0, f"{panel}: empty PNG: {path}" + assert panel in path.stem, ( + f"{panel}: panel name not in filename {path.name}" + ) + + +@pytest.mark.skipif( + not GQA_SWEEP_JSON.exists(), + reason="gqa sweep.json absent; run milestone-gqa-llama70b first", +) +def test_emit_gqa_comparison_writes_png(): + out = emit_gqa_comparison() + assert out is not None + path = Path(out) + assert path.exists() + assert path.name == "gqa_comparison.png" + assert path.stat().st_size > 0 + + +@pytest.mark.skipif( + not GQA_SWEEP_JSON.exists(), + reason="gqa sweep.json absent; run milestone-gqa-llama70b first", +) +def test_emit_all_gqa_plots_writes_five_figures(): + """emit_all returns a list of 5 written PNG paths (deferring the + 6th gqa_scaling.png to after sub-cycle 4b lands the Q/cube sweep).""" + paths = emit_all_gqa_plots() + assert isinstance(paths, list) + # 4 per-panel + 1 comparison. + assert len(paths) == 5, f"expected 5 PNGs, got {len(paths)}: {paths}" + for p in paths: + assert Path(p).exists() and Path(p).stat().st_size > 0 + names = {Path(p).name for p in paths} + assert "gqa_comparison.png" in names + for panel in _PANELS: + assert any(panel in n for n in names), ( + f"no per-panel PNG for {panel} in {names}" + ) + + +def test_emit_all_gqa_plots_output_dir_matches_bench_output_dir(): + """The renderers must write under the bench's own _OUTPUT_DIR so + MILESTONE_FAST=1 reuse (and committed baselines) all point at the + same on-disk location.""" + # Stub assertion that fails until emit_all_gqa_plots exists with a + # default ``out_dir`` argument identical to GQA_PLOTS_DIR. + import inspect + + sig = inspect.signature(emit_all_gqa_plots) + assert "out_dir" in sig.parameters + default = sig.parameters["out_dir"].default + assert Path(default) == GQA_PLOTS_DIR, ( + f"default out_dir {default} != bench _OUTPUT_DIR {GQA_PLOTS_DIR}" + )