From b50f1872ea6dbb386615c08789cef8c7a2c585ca Mon Sep 17 00:00:00 2001 From: hiyouga Date: Wed, 9 Aug 2023 17:36:17 +0800 Subject: [PATCH 01/45] Update wechat.jpg Former-commit-id: ef5b299b18040e660eec264e3433774bf0748243 --- assets/wechat.jpg | Bin 142464 -> 145701 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/wechat.jpg b/assets/wechat.jpg index 741cef3ce5bbc52b605c66c02e6b967000b8f0db..35932dd202142e5d6b88acacc360cde9e055dec3 100644 GIT binary patch literal 145701 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∋G@a)g8%zT=SO4zPyxpt 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

?a4nX2Ny-{8Qm z1IdbyRVIQ_?THwz3N;vBpVz0E+)K`i<|Xlz?2uGtXASOKxNbTsWoA|+Cvy11V`sPl ziKT8SwL&*hLU}*`&Zr(vgEf z+?xI04xy=YNdog2;qfBZ6$dkhzm+wO>{X1mub!~Z-a_z+Qt1stKl)~`d8{FVE`S8z zg+m+M=^$&DRN>IOD_%ayU!d7UIbaZZ0{b}Bd~t!);pFmMeLRFW-{aq6|u{6l$Cj8snk0lvMgTlj!;_rV&KXlR&EU-MAlBH z68ICHm{gDaHaaJgM=FLrQ zFbxfI^tcGTdJ*ofMzR=wjf9iRp7m&7$qYy@ax)&WVOfb&U*EQHy6jHQD#aJhQ{`!}qlbD6?2)ax9;+ZjU^4zG-Wq=AT zJ0AV~Ia<19Yy7SbWuR5KuGY0ocd&j(Rf=f)9|#A~R7G?IE7gKb5?Q&=vFs81qV82f zM^{_~$(1f1ubGAypk|m2ef$}}p)po9vn3&S#+uh%QBD0fZKV|!eFz_Pe={w#^aMhma0ao)T|N-3CQRWo7zBwX5taw zoaz|1GskP%ZH2seHM%Crj3edQiF1SB%C_hOZ7Mp479Ux#adNhuSv}4(XE3dilK1Lv zsAqB5K3z_L@hCkY+gm~4fjH$_FPs}XrTg1_OsT8cG`;o%VGp2-cpi}Jsl8(kwEwZv zNc^)prFh2-Pt*B4-0VHR$g#2KDH9Rd*Lw`4BW=7xn30V|V*7)H=*>GEODjdE>hVJSzRM8y|DzHeI)aixtv z7cRF=P-O}H7mIp)0VYMc6lSzw@Utq?$RI97Q|R_hVqyr<-*r!Iz!KEM36uv5oB!D< zn(Mapce|Ox!Y7KXBEQu#a8>E*S}LGfa=AYK*M1=zkgA>_E%8Ta+S&D^KFo=Ihkz}S zVNW6CIs`&wS#-()i#E>1NFQc-6wdZr%jE2#B)Xn4X{we;{tE3M84snVKku^?%S8ty zoERRaDJ6_lmT5~N*^)cuZqqL&V2l1(CY>t48OF~!@o5I*a5aCMVO@J?Ow`!_#oK#D zHPyb~qM?a&1?g3Zg3_e7&_qf^Ku`!BlqS82^e)m{5Ky|Jbcpm$=)Fk`1nD5Xgc=~= zUVPtgkN+O~=A4W3JC2bHFL<-oO7gz*na_OYj0$G_)lbJ^&ZfuE?Pkh*J@I&wv$XT( z&!Jv3+`2xV`hg{jAPDpr1pHek@=@6abRY(6-QGiA-1C1Ao1yKDK3m4u9@6Q3dOWNc z_PX2XaO4FMh0loz#&c4DG9}=+2a=#40rXEvG_b+r+>>qY8C08tw z^^2$4y|lhVS8U{9t-?DX-`a;4?Eyg{wMRfwz{A1ASmj*sVTYtQCfhEQGsh(lzQe6! zzPPpW{9L%OK$Z9p17Il*FBd5nF5p0Z9*sY7uj+mq!gw{DWo4ORXR_%JaKaQ`oETsV zO`cbKpm`@3dty~Ge*L?`a<#hmUW-$R6e3t8fTkTWZ;%%A2G5>uB;|HKxwu78;$f!X zOo>mY6*hU(P=LxdMR%v%)4>uh)*@l{Ata<5;DuObuloJP)e4d)50#QZE6O|41(w5v zF=2$U)1up^1Xtv?{*?Q1QI)g)=QBG}IQ;R;6#k#t&^uzPjB-s}46MWu45o89!o9yJ z!n$^1ZzUBbBwf`GAJBkqnJWADUp<-xK${5;Do~*LaI|=GcX;TY<^#n$D+vvfgk538 zu~M$Ccmuxy6`KTfMNdFP@*equucjka9Z0yu@ z&9s7hjXXTtOhcS~E-{)iB-3s=E$g`QBXO*Tyks5Ha-OBQw9I%tjseV*7G@M@ zWWUsuwn*GsqS%I{#OZ&tGl)UX_$m_22-awCIOdAWD@gnXhWCO-n?(W4F+SQ@zIh(f zv#tN7)CjJr?S&|oGw1VpH35-cB9nP`>z_@GVqVGG{UIUF7$Wsl_0gcu^X?8SDWyjHR4TH> z3Vnqu#S?5lGnc6_%>b+w;&7c#$bVN(+OLU*C;%WQY>8E&$}qRNyq@l{k+9X%(C1*w~;v3Xbjv_`(2ZHKv!s#wq8mUX+$>=MUq5s zwTpb0kXZ}FrN-fe_G15n*4CZ?Fgox0ksXV-B5n*X$c3TbhkCiD&J!shI zI_Vv@x_7b*T#Ewm7r2`N7{m`>rDdvH0qu9+N(D|hDjm=MD$86nq=xW-`)<{kHZTQy z$5TRkdx$5h*4Wu)*=K={?V}AT_iIQD@BVc3-rlWb4LgGvU=NpnhHF z2>@_C)s^V!+BT-xmg%$=NomW}G@jy7ny7pTjTxY}x$WwcQJBM(7@eM;3OdWVV)W<^ zI6V9su<$Ai=h$3{HD7$c4+}gBpn|&ce=iR&8Yrq178XvYdR|7bVXS@!M0!Ytrdpgm z?FhIrvvICIe#-=H%s24H_e0{UV?AkSUJLDX&TI~plnW{QQo=pkaq+R#Jy`7|zO#@hPrKiZubjh2BMjnZX>M!`E ztAw#Y;|wU9dlOHLFu%;0_7ur7RqNsx0_N*4XxgO2ah!9szmA-whp&b!B2j}gHU1rB z>FEX!_5-4XqVCtNf}S#rtcp44wy zouD4hEQ52-lR}JgC4_H*FitD;4zfZV_Jniwto%dxM~Uv!nb`EBY^oA&#DJO{%~mzc z`8Rs=6f;Z~!Rg`*7-tfSx z7lH`R0GU_@S4xuBbEb2elO7CRnO!N?O{03;(X8A~pi1OLo&0FBu(k(8vj z#;-v5o&}YTwL1YOn46KWWf8@16Q-1edLLH7^}%iFi#j=4y&zZ5A+L?+mz7l+N)WFc z8yhbn8_Y(L>rYMxQ_&wu`ms{!_hP-xWAkM117=9CMjQ3Nn*akS1N2%(xhQ=qMhTAd z>pJEpmmZ{h0{X^H#y$Xwqb=&%rMFs zOC|iLdJ{)FW!1INl?z^Y?_IP9h(I|94gy$CuMJaU0CY&>{IRqpo&X`Uzg2%DC-14j ztl9N~Gc~(Ok7CkS)+D;5*J9OL*ek>%DgzkT(YaMcZ`=C1Hl=gv;A-G#tq>x->wBb0 zJ)eXJ%DQ1O`}78w`IvwjoLs@iFR%S#w|3v5G*S?rcH}gn`;cJl*>XD8Ysly0kb0>h=1Ta%oB<%8md+{UV0fUoONMS&W|%8Xs}X4mGU^3vZNMZsIXO zRT=Yar}};zDNYN(dX|w?skwYIKx&RT<8M zf{VpW&^{K+v3RYp#%haf1GLi}vUe~iX{B4}T=?W9uchkt9F%pQ0ko?Ga@BD4euv1v z&K2g)rb=$+@gI`CixG$uRdKyZu~Y&%gFyb@51^%}6P3whiDo_p zvlJBjo2KedMo)}BCBC84R@kLdL;=N0JXP&mfZ98w2SooB^pTKrm(Po2|{`R(g+YiGq<`k%{71uM-! z-l=D9OIB6+nXCOf7;Y+OK|U#YpdOI~C7 zlffiw75S23XGWwH2)PtD?F3{v-5qy)7h|pj@3TSc#SFl^A26(u(}^(>CbX_GF8}c6 z+Q#f_!mut&6l!{?DrUyD%<<_?ibUzsN%!|wyoGL`Kp^SVGoEgylY$~oq+Zjw!0v-O z_@?^MkT*dfaW+u-EP#l7the=xZ7G&#t)Kh!W_GCymKxC6BR-dRe63q|-j>+P^d<#e z(ETGkDr>sy*;G*g1z@SkP%>U*SF}!T7$*A? z%G-N?6RHr;aBZ3F zT*&zHH({;6*=lW~CQo7KAMy|Qs+aHBrUeHM;DL9+`!doN=M(=iw7wpY7ss%-6Lk6C zoM@DFR4-@>e>7P0zKfiJS~@y^@ZBdsy%(_G*DU@Ql#K|J+rt4M%c?1{J%BK8teMD; zjksarjre)`yd8WA{D6D)#=Sz}VAv^7VxSiUR(tK6bzX831?a+3&^iOjHFhjo#lQCZ z5F&4jYqHV5DVPbccz()n>byz}BCzcH)iH$FE%I z%*9)u;by;nYGpqAbDyyVk_Z$d9CmfXP=Nkz9`x(JxNm#@5wV{nSGl`dFP2hn&@!6Q zc~9p_LFRXgZpQV;#6Wqzlm*<11aK>P9|1sqFW^epWYA{cV3R%2gN?{fm!RPJUyzMB z9u>U8k*We^1!FGD#O|2Pn&@As+j`V%wl+B~tJlHNR)SB48Qbl>X!WeC6*w{3R9VQy zBwyg-6-+4r==$`ZXOz6WP%?%ih-)b*Y`^@$e3@@VE31{};*i-O&z|Q!%Fddgg(F1R)r|XJkeu*e z(0sdTwp@jOo=*{uVSjZl&+Yz1ul_fo9@kE7YbC*vJ3xvnti561~1>nCJcJ>UEVz4(&XSU2YICslWI_g4Y< z5}Hk!e7y%W2Ao7Rf=SKwF^EWb>Gm^m)e*Eff-mbv_C6dKqq%6wK3jqfs*a7?>p$}UT` zX(CrW!mcoGzgRzZPi!FNM-m%^>a$Q0>$Fyv;IN70DIlC#=931Vk-4d1jEdgKas@wR zEf|_9|7Fegb08PncUZAM5UYKx8IDR-{`%Ec?1iy@>xs?X#^3q9@Yaw=WkVW*(LR`v z-Kqo49YnG1V?dIEwudElzdq5eJGdQLkmzOHL77KDAS2`glRuY7ASJ zY)$ccZ=Rx1uV5uy|NdPsynhg-MW%2%i`n>PRTXm=W;Z5RbRbMK?zvi0&2Z0s8%u5M zaT_;|rvpNtKW8J$J1X#Q=8J>lQk^=yW9oHcu|8a?l}hNnK{445^(`q$S>@NS4|tM^4@c7+G0d8KR6g*P!_Bd zqjP!+`~1SeFNnti*!=Og*dQ4A))m|M5jOR$u5`FlRQ8iVB5o~1j@ay=Xm`owG^`zf z7{dU>7*n)$UY!Ua#y`?c$=a$1(p{}d{%^-Ys*I8wXR+)j4dVz$e?Cof7kA#|_sPG! zZdLdu?8zGvoV$l!ec%O|ZZ{P8$ptd7hp#0&Ji!<5p{aKehzawtr z@Hpn@{fN(w%B-y|5;6dn0a%%x^DG3Q;a9tR%Nlh=gB|epw|66F88A$rwZaK%20E@p zRZd)x4Q1Hg#fgeqIBngh*2juLU`yyDKV^Bj7XXXS^nZW=s!z@LuLfoBq988CwpZ*E zm54H1ajN&)=TK_ZIRM8UD7WN;7uF=sEsjj_{PFGB2r*wU#Nkykvbw=^v2$c}9+XD6 zI;SU`LF>Q>L4Ft2uXq0#RulKKiC=#9g%)_$=pcWI`mt=BdQiEr&wvx|GY>7@)SGgK zg4PmZGk9t*vt)^FkyH?Muad3vr07G@y6Rx&2k(spiM~WV%35R~7)SM)(zr91yj-FR zFLm0rtWDb)s_1T&dAZo!l)oi) zl4I%OE?QO@$^5`dJ~V0i%a>Pc+#rzm75iP!Wv#{u-`B-+o8m&hXQA#7Ho*39JT&nL z2*etQ-&Aw*aNH5qT|b%5fB%9!)%LI;gvp^&`;Z-Y(=W4d|YGSh;Wgp^DEN z=M*_A)X%n)s{(mMFar)sX97X2m-z@djVgaZ{y>X;c{~8{O6Ix>GU5CSLf#6%Y+_3zK^HHtm=LXUN2D0`OKiwr zP@EPpVG3KwIw$gsyTSoPTX)e?JvYIQCe{{72%OA39Ra6HR97-8I8oE!fOXm>xeE;O zUl1E262OsFa*KsH8bCONxDA}d;d0nx_WcQe;8@Luh5rTZb+F^Sn|Xkv;lF%sFAe;G zN0zzBncQz$tt=tb?{r(|RN8{;;70R(z#UZ`!U#O?u4F2&#inP>Q;GOWPZYb;mt8Yq z5;7|08^%Qb=2+oQDMU!sg`fG8y0`p`km!tZfp@QGHGlX=;p8wnh!_ZGp4}wRYNrR= zpSbsXeBI<97OV+xr;~!#?LGs0lnACf$la8(*L4!?x)U2)`aO2pH9GG3QE4VX zZXvE1VO>BS8IK4fzO2dm3yMaK&J+6L{{>O{l2Jyvc-Evi@faIH8QMq~xF3C4$w%MN zAlV8^r#x>&ox~#>#$-u7lh-tB;d2XM!3a(XGX&&q3%mOpIVR9i;c_#-r(~no0;{Hc z?25slGwo8+$5&F1Eh*-0IEh&fP1C-^p5X9q2D|r5p5BWK2 zHRN*kJ7O&M6JFRqILYap%+n2UZyg3G(IT{?ELqzP)cjoTcO+E)EK+rS!kMHqoDISQ=p_Q+yZH)Jb4lbY z3Hb1?T|;32e<4W%+Q=68xY~2qb~N8co4lwc2QtrsHj+7f-qhD$&!qg%3&DSx?aw&t z`+UFYNA4FNqSCLHav4-;;Z60iMPg<%{Gqr2jkzDDI&z30^8sG%ITt?3#P=fy%_$(vo%k;{tN5TE~ODe zULxY{SFBsa8BKrltE);g&mpNKlQ=9o$(^I> zw8WQp_{*NQAOSAT&)GXjp55@5Y4WXpUSSmxA&6^N>#vc;Pa*LNtQ7vqIEkj(aUj~n z=w?h=B0CX6=Zw6h}XR-*PV9`uR|{ z_V?8J2=Vy%bs*_%XUsPJ`OVynP$188oea{Dv z5cTZ?G&s)!Fnjgr@Y(n~KIKvL$*8asSUfFREczexL{7!fbyG(9v0oeTon2N2z>x+z z{zZ++5QU|6jkT$brwE)EK9N64|kS zHsMgbn_YbYE}JDNix-wkdPFjtV!wu9eeAa8&v2RIZs&As<8X8C?wD*Vc|UI(%I8^M zo`i89h>M|jBYk0+SombJsm>|fTP8~LZbh6Lbdq(RBO&*bu=#kXR+cUBgl?J|+cZBM zb=>B^UtJfwDFpB6)UynP#Jx~G2l}P2ef_blei-HsU4zNE!Wo0#Dvo@)k?Ufkg&jo? zUugK7$NLq9?R#uD6mQINj|o)8cxZ}=)sR4RBN))fwCheG&MSKgd=?krKVc)=xSQ&JV!teU z+2_GY47F>*D;Yuk?m|PoqR7etKxmpB9djpd#1GA8m53cB{|1#Wp${(O|D$ZwQt1huBp&G%&Q1-5J{ zxw$U+eVA6}oG>R%xky5A_7UiPY1+w)asC~D5gWSXQ=x7LFP04#>S{V2J+M2u^x`Kb z&_&Nr0yyzxsM$1H;hYJ#h#d}a&-c~En9u!IlU6D;YGq7_m}Yv`7byb*k;5D=?#&y| z;7qHkf|vAmN=tHSI*On4R*~^9jw~D<0hy5-z#dAl0@T%415%|qOC`D&&oDRAlRaQm zQujw(?(Ip3ODju&7tY@_mAY|D*Qx6R%+D`zagXJ#T)JujPpJd zUXt1A1P}vGN#OH@0?dL|{QFI~kC&9sT>^odlk+rxFvyiZf z2e}v_RsfhXYrSi?Shw$X=bk?^t&;D)D+RykmT)Lk;D8HBElaTSjL3p~Z#QBcN;eIf zO9~BVXN?T~;M_YwQ~CP(QFNfhPe$hRrJkpc3_v`sNc*iXW>_t277ZP)i8rzGauL3D zhQt^hxlo@$z>1^jF9=)#^v-?`n4UlI20HNnPa9J+`ZAjTe%hk?rW&V^LSa9Pt@ph% z7ct_cfdD3Ka`VJx< zt%^rCyfZafd8Y09S|fnXa_YNkpBKb zO)9*1w^oVahyiF8;l{5H#tu!B>JZ;?c1si{no}2TG`$7JBB<05{okq<(mz5C)^AQ7 z^MsF>Una=2n|KvmuI8au-TnA5>_!t0E)#s2A?VQlK`&pvQm_q)jk#&%Ylc(y2F;6= z7sMzwTkE|NStJiJ7`EQs(r{6twkYt?5wQkeTHU#^Vew{Q>dg)4R?8i{S=48oFV=>u z14)LSMw@n9`dG_l&^#BW!58~!?<%o!`#11Q&4UePRaYHPAcNmYzvY5U`=m|MD3=6r z==}cLBoDci&!!}jv(&szZ+yl13mB<|w8@`4AYNmO_Vut0i+dlBC^%nU$aIA;DLU|t zu0D{Dj6uHbk$9oNxUMYOgVkqDm`I2$PY~*hr;!5FDji)$ zipK|Umt_MHY2*uTfjm$C?OO5l1iY2|kRnG@^6rbstTMCoj?DKLHK5P4?2Ie;3Pj4% z?g$eAYeUK}KS2~vdSqu18$5Q6Ub(k9C7vHv(t^_8^&$Yb``Do&GI#UUwkW1#Nc@c( z0gqCfpI_D>9APi_JL5Ao%PNHiMs}siK7zz#oK=D1%FlvTQ`vMV8Og`%x?|_w7>s%knmR z&Ao_zRwi&g`Bi?yN?WkUzQMYTVI$U)isGv8bTaigbf{=a+PeIsC0wUE^h5NWHB!SM zIH-3>hQd!@33QL55VX_DcZU?T9~Uc!&jq*^g^Lb~>qquEaVUtuZYRG4np&KhYm%j~ z7NGM$u^Y9t!=*EhQ*;omifJ?Yyt8Pw+oQ@tokyN z378ZRFpM2i`>x++(sa7(yW0Wty|3jKR8P zwAKj>LimOp{PM%D5)4BsWA9!N(u*fgekV%{e+{bH)o2 zpswX}g$=c}*y&P5$U!efz2SH6foEO0b7FT@%=ABFey6r#NjzL^fY7h5Nw3#JbKkYS z>|x%5tuJG<0YlMs_s*S?GWlwifGUcK z&h9ScEfvTplogrC@@!i*#`lvw_qGu9JnE(+!i=5xit` z|JFd6GHb+C(4A1mbxDZNMBH@bu8&iUKbxu*TqM1pr7&9F{lI9kNm>4%<^Or?CfKhR zQZaU2=**JWOHs_+$0P zm}1OO^oKghWjhwUSb#%3^yr%DPaBSs<*}QI$n&gXTvX&tMn|qZiar97;~9%@=lQrf zVGv3+HMObSj_^gU7^Bdnr__(hr33q@0A}zQ5L;K=pAUyv7uhkXgmVPXzo_-8j@-OA z09Wly$FC)F)sS8eNw?U;(O?PW0wE@%moE(>5A@!=-C3%RE`+xf(eq6aw6G4FJoY>P zcMmv|yY79tG-9lZyeyYy#n5C0=*8EK3`t}e9V{&FTx?UNs0I2~_kH$oL{(9YKk8Mj zotp#8d-IhS9dx`J8va^wUCmIy9o5BadH&Y0he+ap(;Csrn{Iq%ki|KO$Q!k7?ctn7 z<5Z#zGxT~l&ALqfzJe!rRK-lc<*?Dy&8do4+>nh3kIxzStnR3 z{AUY5C}L&yYhc)?og*tI@dn0JPS8{9A%0rbj1LKTO|x zmkgy98A9#+?Egr%=c z{3*}}>uU1R!wTBD?aTJJ_b*Ile;eSy zos|b|74z-n-^6(S+=bmYWL1`5Mh8Not{5ZNuELC|uFm9^O@1MKX)4FBNNr4RR8Lr` zj9FY5H_hZfI;6Sl&`11R)@^|x;o!j8ZQtEL#D5T01GM@G8--<#J8Ed`Gv$PId1thj zl(Z739tFw-W>ZlD42332ZryTBZf_uI>xvi4<4}ZS9&MzsE*xaGaV_bfcg?=La(3#d zh2t9Z1-Z(aXi)n31KntXD@JLcLGm?C1CWDx0FCbRfL3oJL@=c3S=1DB?cYFV`mV@w070U&HQN zSRA}hX6>1qI_k})`a$z*Y{mU)bEUO;;5SQfmcpPBq7S?Bb_EtQ&8ndj)JlvJJ-6Jy zTCzjpVIBW$!cvzU#L&?D@v9lp&(vssCk}#~UbziZ)H~HCOC(DC-o9gvDd1T(oeAE2 zm)NFTBod5Ps!Lb`HX|xtd|uY)}U8ZpD;Vk)btSlu}Z9;^zcDUhxdV3Hi6n@%AB$Cv;f5N2h`DsgnG*VIHlGo-Kx0}{+4%95%Q}e zgp_fLn~PQQ9Jbo@W8lO?%LuIw7Qg-2b0sFS{O3AA^#BufHYP^M2w!nq6m{C`yt5^~ zZl}-2LH6&4K#ahNSo&t%-ZH^F@?d(!slMnD+&@Ir7RkHqxN9%)x}hx7&?nyr%JNGR zrp$ViGv4l4=zo6W|3#$5W4cLa;LS5XJA=+);ZeVr%{5{%VW;k++E}Z{Co0XjX1^25 z^WnV&qXcLz`$6-Q%PPk_IqG*&x~Yoxsn1l)=%r~>ZGz02@b12%nI{-+RBS^Dqp>N^ zGAC{Be&PRS0T+AJ=Rv8!5(&B#L5|y39xEdotE*rVFCm3#&0ioBKI%Tu#yUeEb?q*% z8ENy#Mb_9G8X!qToSgl}pMXfQTaa>*+Zzex%6duKqfj`pyv7ax;Kr~P7>xmTUOpAA ze=o^tp}nh9^>TqYVfY#7Qusf69e(cDLOq)qxk`Z&2ah$UETQfOR+q$KEiFAeZ`~Zh zFwOC8$6T`7@ANl!;*1E!Qn5}aCH0w3G4%t&n!E{yosJ2dbv)ONm>1p@0~*Axn%=9j z~#0P%Aj?0rk5MSn$K1f?uiTH5Pm}#`d zOuZ;*kt6=H%z=Q=huF1Wb`eA3`6h zp<>j^910tW7`KT*y2IOLZV*!zk(-ODs>>OU+B(-;>6|iNm`l>jklzI8KpCf{JRlMD zhwYr$c-32+jpg@@C&~>zh7;PYvk`Cdym8;xSo|MU`QO0Z8iPDs7Qx_SOHqcIePXvd zE$$Fn>pn3hpJrAwa~U3Ow#QDp$)Gy3=$gh41~v+YslTw4-7M94W&IP7?|^uITqg0C z-o?&-?Ib_w269kHggE2DT7=OAlnX)yt-E-D;fT+*qAbg=)JB(v!O5M6$19Mqn|D2$ zcqBDZW5QlkPWVFh1ijS{V7z-eesx2_A>E2+ur-0sh(C4MFH61rmT>(WMel+#qHcZD zC6(L;fhb#GU$44rXp}I{N-X8P+EW8yr8l&g%IH|E2;Pk6)``bxX(Oy)wtKlrPQ&mE zI-tV%+ZRrLk6RkY%i!hM&!uAvRIQiNtxT6E6~qxcRsA8v(@75aA7b=^Jzl3JR+{Je zR~^W8Fh@B0x-F5ET6q1iJ8Sh~D3fp{=Gurn&YBusvc!J%!B^cP+b9?ADt=N%#YVzP zDdcjTO^ND2mRHy^U0(kAvgBS}~x8r#mLX?Lu? zU{YqucdK0>h|TcJ2eMfPF=92=i^Ej&TTF>k)6-AJpg%3cSp$z{h$kxpK_Ds8ZcJ>D z!xDmQ(}4A`m$mBX0lnw&K;62sA4Z-{f4}=AOnE3gXHv3^;UPuW9<7^xdn^ODZvK{&*Un8eFlX+qW)Y!g2s2qJ@MSyHi;6o#~ zvFPmkKC}g4<=xXB!RVN%#7q@{4SIB0e8r-K!0O{*xvfBiv%@3EZ+n(OM=HtF=gGsl zd$!op=7UBoW|0T`AWUr(2Q5YSgtDno@MSz!zA4=YWS?N8I;3>EzT`g#|3p?)+c5VS z_ArT0C)P;rMS}YNH%LWP1-wC?-ACtLezg1x`t=yrsdIwZh5;;J!>enS4|)E86m)ui zeJHB9$1u(Ye~V7$0#UtGGcmnT|E+GfFWqrqs0P-i4I)$S)R?S|(6e~|NR_h|Ak+ZC zD2Z|qAafcN0EAl00EC;R3=oa(fXvSE^~fibs-oQt>#Yd zYX3(3p(Ehgx8Ner26O@cecvWw;C*v|_g!li@Z|4bq7SkjK(P&+#BItg>MW1=_|<0aL^6mZiHS$+(%G=P@ZUR#~=eURq_&QWQDB{F5funos&F zQUhq{{S*Cy8b?y$#LX83@NLjw`j2YTH@~F*u_9%t5U!vZAusFB?&d1-w}Jig7oHH9 zKatvh?K6`ryy@WdP^f0_9;_Z6GyDir*#e;`TIVL%62Lwap*pA7$imXHV<$5@JH$pr zPH9x`JQ5m}CVC+Qg}_#W5Z`6*+KQK7bzhNq@$WL`juTST+?8H7t=v)E%z0zRcH&ax=*HSQ{`@~-|FU#BCkRGQ7(ScOapA3JMwJX5Y4Z` zp~lwgyc!^SC_F%Ftf4M=Xm+h3lbhqYBOFGW!$knbj7Q?i$Q1~kRlLttPQu0oxByO} zVyK}upb`yE+>Or??YO;|Cg+J8>^+vP#5*?dOjGot6PXnG^Ilp7v&ui&_i=6N-eOHCKYuRV zC*oZi6r8NgJJfaO{^v|6I1ykNC+AO|)zRNhi=%6MO)mbS{BGo0x+Ny{JW+Y<>!^qi ztJp|gO+~P@XMcM2_=_Aa6n-h7S@D8(JAHs+lqvXfCMYw!%#1iiOx_5|isK7Wx)z0G z85{$yQLD^y)BKhVALcyE#j7dFi)a&IJel(Mdx%;0?Z%o#aI|4deAO{0#`=|88A8JN zA_-oFn9L4*%I%;bKTm`iK!v>=1H3M4)Yh2*#W<8N+u2gJxKEnj3zWja?#pz9jAbW! zgH3YFH8Hdu%rlwpJaIJ<5M_fTj@(kj_x{uL5kM_4waY|u@6d)#lZX1nNv+8e_I=U_ zXNEe^#R6*L6>uZh0-XQyi%kwwu@IWqv18KxifJI#__&eX%IZQc6RynonW7eij2vrBJbD*lhr9nKr=IjOqiLD!QtO z!cGUswEMXGRL*j6N*S62eO)P>d-Jzj?*o|^`+w~1;o31rlT&*2t9GZKvFqz6=Z!=gYE3W>ui z{Gsj@ImG@|+?;@mJbUgq(4DZhJ^z#V?M!Zl=|^Z-Mi$QwjD!wnF70tU-QwLbE#;Rb zKVqGR3;r)98!0K$YF@ghEGb|p76H#9}_ zCd?7KfBshZQGN8mWBd?QjRqD;dPRga)WCG56(}rUu=?8()4NPh^SieED%5>m@Bp8dzFe5-n4G7B+`Zpe{&ekC z&6A!^sIGHy9cv`~Up*UZk=?m$3>aFpiS`TWBZ+Y=)xNjj-ttEH`Di2b>*gt+)AubY zhvT-d3E!&gp?cgL7NOu}F!@C!P#xsfrkcjea>UvgkKU9G8Ue#FsA;uw5d z%pUX-O4UV0QYi$nM`6A`Qtc~iC)ifti1P+r5==BIep^3Op+gjHOj7qWB=DDNKX^UH zA;@?q6&8M^{$_ROD8pQ%IfLFu#laQ+(7=V}Zh+DY`n^mcD< z)1S#yy7I%W{l}`ZZx+lbANv59pXV}z&zEAE+4PnXHd0-~P{--s{fYySmG<|txoHNj zSe`jR^phpac{Qk;$&U%WYOr2{zMHSEN#mum;JRGg)M@N&fw+XsXQ?4cW2I0HTJr3IzA!BPqMuq9`eU98@FC;-DGdHj z_9$W&TjO$jDD)Mr;n})3oLkd^43TBoAC8u*DTY|vEU7hcPbsl}R?<@|x@$edx%Nnp zGUNQ@ENfY(1I13)XmU#3%M+vR*)C0Y7Z_sh-M#}NHUpLBoV=_}WshZIaUKNQKs*Hd z@;gZAd)}klYkwCy`{c{y6YP0k6ZdX_<5audk^rr3YG+C$_-E{uN1dG)ukU5)n%nEf z&Smg|dE~l3g)dPRpy`KJ)m2T48s?CEq@`aW>;30kj{yPfh?O)v6pjj%dI5 zN??K?jE&1(A9fMUD0Uou0KfMaB-ktbu$7B*mE|_7&vObP^G4nuT))kLY+g0eM zT#VtUXodjL#1Zj()^{Z_gtF70e33Vj#6^3Sv(yiuf32c^7hZVJDZBy_t^YYi5}cU} z2;m;3>R`VVwUkQ)9Yy>@74wdSf;~8d%{PHSy&cm3mt?MN{$-fsYki2Zttm}ybpmVx zHb8h~4=`2bNI(*9wa28mFdUKWYTCbQQy-ir9VSELa>j6RgFrSg5sj4pS0hx&bW-*@ z+lF2$6XBXXDb`~GHQFaWmJLRrhUa*NaVA(KS17f%FY{uqzPo%(XXlXWZEDF)2J>pv zE)htb60vL=4YR*uYpB~t1c}EBj5stk=}1URp5aNZczaw_{l@Yv5{E#*caz(dgO|>Q z7)<84GtJuLTWU!C#z}XJOTJcCN0PnG`8Wr@-F?TFR!hDGLwHuwOnp#bQ?fzloteR% zJhXd1mFrlSkv0i{r3^MEMEiq7b*0i#Z^M;hImr6fzHx&sGJTE+PqHa_y5;a7R7;;{ z7st$hAynIj^SHwa_888nR;ZeMLow!n%jEtXfH70~hQ9EI@*x(9`xB!B6)sAGPW@s@ z2t-f9+DxOQxH>wK>JR1)M*j@kz?qYblI$0Qv=vxjmP_hXnwSTnUf=ELwp?Dn&ooM? z`E&D#BT!)*kgWEjd5W-E3;h7O2UKZK8l6O6JB&QPL0BgKXlkchYbsc>R6CIL;^oOB zplUPxmz2IuteDb0~hm3=)+$CH5#T{JXh#)`k(KRy~&All?UG+#|f zniyYhW>jI_`Ud<&fr;LaDt|!*fW_=Xxy$;d!$qfHK7V#kS(HLWUGlo}Ah@EZ!MB%r z?^fduTL>3hUI{>C;~8ajvJ;|l^84;{Azp6x^FM{fzB8UPis~yfifJFWupWm2{Xkzp zJ3t=u7xc2`N;}}f-8-{pKR_uUc*OI8pSGbPAA~t++@iaegMWuJSbiqujj}Sazpx3y zg#F_6Ft6#&3C@IH_s3sDY4rj(X{QJ_g|Zh;K>*Rm30!c%e##~74%rnBkWusk#uVMH zCCqwQxm+w8h4K=Q9UVO#Dw|l=gbn$V097? zUIzxSo|JSH79~z`0~7$BJewwP#c{wDBd)ZOz!ir@U)^384%YS#A z>(P5v@zoW=e2%lYE)}g|+AYxq05%+S?&r4NOZfF*V)6Q#w^pA|$>u!DW6OR)oD6J8 zf%{pPw6p*Fl8>FjL`no&nkmZ1l+dlYHb29!etF!>Cy>#P1@+36_*(^JCLM)!`pnb? zSjL65seSpZCdIkhJ68zbAs#0ur<`K@gm+8@ApAQ3W1gi5c+q|^#p$@Qv*HMTcpkQC zDHhv3{6_Zh!>@U@%5FyRLrTU^x7>mbDOI;du6$ffReYVA>QVsrIh$rL)4``gA6-3` z_=UG3L9y)9hi!3>1aN#Mvm<;Sv4MZTVhOC3WLaMKCnXHNDZ%-b_9$$J#=}jZRW6jxec*tk7_RT3s`+^d*g>od zn9~x62mIdR^Jq?=wzbIL&)!Hr=Z|>(WBLYN zwJv7n3B$?oO0%pE(wd){L_JLPY`Gte6G9W59=6Jy4Oont{UcA zo_@;@&6zTgM6x1A zT=hfGAMmeb_a_=7&&TlPkELM;Y)OlA%*m<{l^^|Njjs2{pO=OaX<&Ld0W5^XAQs&7 zItHzVb=0lYADuAx4|Dou4eQ^chQ(}E1`iHtxa}APd5Q7-sa@r5<}lnwv~MTyIy@+nX~rB%nk|v2>vbc z($O0VDtrgJvcNA;*%YMj3`f9%}ob%%j$mPe&rqKD5N&B`Nb{h&_Guby#= z7~-tUkm8N{tc04u3))fj)!m`l8EBWYOJ=R;*&@c(h6{-5Ax>3E_=tEPSO(tF*MH>) z0#Us-uGvoEO~Ab!OJYs3sIG;979Jn;wjMKr0C^ErrMnZOr@3;Ios4;hH(w|^aFA%? zNK1k^{#gaVpx#KM%2#a2@Kx*NyIIYinLn428xIantsQs1FH1-a8!_Rwu|;4wP6K29 zYU~!wQpASY7@X0dSd8AgRj{h(2-ZQGnuIm~NML}uO zdr?4?BGNkn6cAB^iqeS+N|Poap@t&8gMuOu5EKz1(mSC@Q<~CyAV^0Nqy$Lf+1$_l zj_*C=eB+Gq{dmuh^CN>Y$iB$F_On$uA|j>T6fWQ z;G}gX7;cm}d_qKml<=E`8`a7g@^4Znt%SAmWqSBY9o_w&ojNUQoiJBC44Z&zm$`pr z>S}w_%%nDI;~T{=IpwQ`MdVChDj0F|XA@9NrCOk_@B{HoI63kWVDc2kFk>OXlbCH| zMa&T+SoH54a#>ahQmWg7VxBB}k)QdnXO_MdbP^Ji6cCkk;q)biIFFO?HOS2WU zm9*xfDzx^SA7Nnss!etnh*6L+O0&+*%6Nma{5f-E+r#@F2cw2xVJDq(wD3)x zQJ)XuXyePp%FYN~c(YJllOFKKE|UIbW9qfmdmN0ZMp%f(@T)~+m368i z9%dn@an{LocvH1o{-fxsj$j5!+MO0Th?~cd_;kTEnd$j3hz~Irj6KJ}&X99wc+I}C zy3SyNJ!=G(RlAf9oZyDjHlS>Q@u3TF15{6XwLdWZXMFQ802GX&@MVGQ$L;BkYh<11 zK<&S2vlP+HfUwnmR4ik5+e(8eY+FXx9)5}K)Aesg8Wxvt`SH?jtBU@KY)&S~Om80X z5FIOjW*^2Rly|*khec?&J7WV_u0ud^dxS6+c_>W*m8{JVK$d9cA-eTYISDIEGvQQS z<0O<+sAD~2{f#===y}R(Je4#oci?@n^VlFouAvTEHW21(eIsz@US43`K|bJG3x}EF zLI+)i!a}qQz|e7^Hb)>3WG{qYgAzY|Cyrn@MZ2_VGP|rs*soXDymG@~o>Qv|>YDVW zQdw&-vZ?Q)`!f$!y2i|yK(|Vs9>o&O9ad#)Qa8rwcTW z_X?BJ;CjRX>{8N#Y^0@cxa-!Xr@2GCLjAv@GQYK)F)lS#zM>-V46zzZIzs<|hOik) zv|>&xmV!@i-)X*xRe(StkX#ln;quGVDv05fX(o_-Qe*akbcbj$-vpZvew#PzB9&*p z5+>*J(MJ7c+`HgEUKcb%yKeUYUbhaeN||CSM?l-V1;dp7{5CCYS~_!I`k>z?npr~WwhWhJ0b9Zky~v2sX;!E6Df zOBc%|OA#%k(@1jo_@VCY@8?q-fB&9(^SbRtD(tR~p#Cu<=_kC&gx}XCl%{-`acMqR zgWpJ(m)8$?cK6#^!ppO7bR`~$=5&?#{|d}I^6ZhAB#CnEZC|%8v&NhA9CV?fB@nw6 zB()~1=jRE%Ij%}A9V7LNmDSt#EwL7Qu$Y4JhL(Y~8c;2CpWVv-(ZTM9L-x#%4pb z-<1*OUbz2Ws464e5BKs>c$&!L!(%hkL><|qR9Ld^e?QzgLw%{x?!#0=^r+SM7ZJQ) zZVj4;+@ez5Q#uIcuY4xe*_&7(53r@79uqJ`cKj}isA!i{C`<6}n>WI;pY7=?Y9U2H zf^HTPm)k5~ZQS?wja8Its7oBjhMPnhdaZCM8y%YI!_!%f#n{EZG;~Qn$Tth*b9$t1{NN<^qeK8<#*b|8yDnDE{ELsxrm#i+2+Lh2Q>OtZyWR` zrbQd_o>fEQu0+(A;4nDyIuLl zqwUqRbMX#t3kvaxIaOxY2{jQ_0mBu5|9m$)Q!DwyW~+~ioCrbeE%7~d?W zV0EZ|%l!A2Xv7CJ1-BGdz8AXUysrv;1il4yyeRH49tJj%Mektj2b- z)v+HvIcF9<)$S%UkBZ>J2dela;u_V^)=kY(XeZ0~m4-}(Rmt_~6*!q8~#nNzm+5bYS{)D-Wfdb;& z4*$d|r_$+FjQgun@tSSgmg`-YTH~mx#Im0Ebn(!*%yYNc$j&dv2wS^aE}J%)$KRiS zcc#Fq_K664ZA#0AJVJstKnYmqYylGGiH+3P9LZsyw>H7cFss$f`Atf{ID@D_9izDb zml!ZEMuI5;=_vC9(GH^qC7wmIisyNJubwjxJ^C7QYrzAuvs{YUQ~z(3fDm#OaxvWr zxyKs^3NZ$3|3dyB83G~NlE=Dnai(&D{HUYLJ6)@>iq#M_STRU17Ab&Tb+?sK>NL^OUs>0 zJ$3n6YKZ!)p56JkG^%K6P+xj?^U{OHs@SEUj)gU^u5?M?;I)D2(PLxNLH|7!0>+An z2)|Ve+ti}1-YV}NN5H)JpVQT<3B49e+r@+hUq(oEo+;dWUcuBfU@L3*t0RAkir5?uaz3+V)ipH z%`20BVMZbFSsq-Hx$?D!LU)&Jslgd`lC7&KFMM zmF%KKuA@j)aLT2oTk!BnF%!W5z!$7}8|CWOL4L6BjJF5MD=oD&5E6obURX8FVbhJ*{3@koM~FUne8q16?lPz#*?S$8*(%PtgEIb zbRZcP-=hrQQL#p1sez68x80jw*rm`S(#3MTypiXL>_qXZx@pU+DCrvo4otN@=gmIw z;CN{LAA|Kx2lVC)GSe88NR1)c_`?%}xrmnT;d`^}jl)((KNUfHU8Lt_@^H9^yxJp< z-+zQfL;rZjGy1Je zOfSuwlDd-FtZ8;ya#=oL=Is#@lqg{);Nj9QOp&ah$OftoQ6vyu}@8R zs%&WSaCS4&4|s-$udys^1t*eNQ+^SR=ap09EaEK#LemMO2oNY$g7+v zGr6{>(JwU|EE*{EBk(acTe!X0%d_x9;>UD_!mZOHChskb4npq(t!=8Ei|c z82cvG>ydCSo5}|X->RJp60w5IbaN-0Q-18M+Xx$#4|x+w#Tu%2X6g62ruZ)0CJx}=!iafJg)$>MlR>}YR9Vd^1gkM%)T`)N~#!q0H}lH-F+9 zLw}QQ`)bwKSEk6k%k!ao#ngxsjmIuDz?0xijZzB<8ipua0w*RiAx3%7dir{(ApJl_ z)MHvwZg>_}V7aE;tb4Bd4~8Tr#B;On7dib7x26MPnFG?tf-dX4@K}?&!wz{v!&ab@ke~RmmboZyKJts3 z1lb!S;Wz5O)MRo7B<)dIFnDb!tR`0Nb_AOlY;nYi-RL=Y=G!+9T|rQbl>a}kh1(Fq zv7K=Q`NK}i_V1;3lj@{yh4w#wDfVCP6o!WN>I!Uo<;Z3q*9Qt!X^-KfQ!;y${7#dcW_PRCJ6M z-kbFY1-&e(N@T?_U2eHEhDQq_(CdLl3w<>0+J+=C^^U|$hk=)up3uVuJ#(7$O@2_$ zA)pq+55N3uG=6V0+j}jMr<9{2%K_rM3YVZv^ujs<&ZdPHw0Ds!(;LGk+mhl*sx| z72#)AGsZr@Pv^PBnH4%5I>$+XZ{GPz@+3gSlDWni_k=cPZn;cf$YpsO ztU$U<^eG}Pt=}07bl?gtvUz8uRPim!vr}chju+y&c{h-i_!$4^I-$|BFp6X+9Id3G zn!OOFX5#0^Z=75x5h*&9d2qBBBi^itD3nmGGl6bRg36+Ta*`Xq^AvCD1LRikORD{o z7~H^VVt|RV`f{}56n{%zuR{N)d6=HQ@%#WE!sTnt9V&n)H< zJhaRGKw1dw+~@--;O{7{t&VtlQS{uRu;-qWBh3m*Fu1Q-hyaUq2kil^$lAtZ3O5;@ z%P%HpRZvgI=XegXd4`54Hgl0^1{-M>9*@}#%PR4Y-%g$DqgIOkBH0&l^tA|Bp~HAv zg}U@1Ug}#(jS{)evJXo@E4A__9p1c5A2Sm_UQWCA969`Q%=;W!mi7C5@yP%kPCnSk z&7#)Xgy+n0nb&kcdD7LOQ{3U&vtF^ANc*3Lo!OVEb(HrZILz-pNYJa2Ks|h7)JLO- z#l$4zibkLqXU^Zt(2P$Uac>X4jNgh`%z?7F9FGn8SyI{hjb<$E0qX8@3s~Kz-O(0b9AWCAph-{2&^~z4-v>dHh8ib`46~Th5rZK z!E}T<|BWO5d(cPasl-35Qxx#*lRA|Y?!609)>K%KfwvtN z_$P*bv^KZN<3U*QM|wpH@&pKkTS3`KzDNR{MHQ%X4sb+2s* z^+SiM;Fx{fgpC(djNFPqDbgF{&Q(r=O;FJhC$dLo1iGOhONj>jOvo|H{D{8vpu8$` z>9-@u%`)y0OQ^bSD3&&ETJ;NAbxITqkMXz$il!fSk%RPg_%Zk@(h0yqJqOq|)R>|) zbiU?;b`-fhW3SL?yAe27#?Za`h100P0S|r?Z{)4m6?ri2?)A zfB}M!2XFxcDA&9%jr2+TXqh0Uzf4B=37KWY|DGA*Jn)6<+h`!$xhIk1H_-FTN{}Fl zzYqqy7Wj_x3Wmsm!P#g|j=p7%_whq-rWv#Pb*>grYh}OnydkXDQ#Mwr8s^kAiM^*Qn4evqSPzH49XVt=QbzW$;W1>-jK2`W9vvZfK=Nh3Lk@li zw`VSTeW=k2AKpHDmgrN6&{67ppOba(^OE5-;Y+vJa%A@tkcHNH!e4b2XuBY9nDOm9 zU~KdKBY5Wvw0HOsLyHhwW!S>DpoYPh1eu>!MPE3)P0V-C*Yh3J?9Kdzq!_lNc7a3S z;iV8QPi-j#)1oPi%dxjt2Vx^3@uzfz*M>7W@;)!HT19{RMm|rxIz{0`XfBJbD%WXK z?hMk|=+nICfZTV8Rw7HZSD*W1GwkYpbf=ZJhK=@4S1#|CrO$TP=C{6z*6Tc*=XX+a zP6-)6-{i9RR1@>DF2%2N!#n&n`lMdyb4#T^@}OI`c@=!$Y;`Q`bxpW8mtE>pnI7m~ zpCio^;Q00e4}GC|+v)u*u>pRQ+RE24ug;I-6i58a$u7EFH35QcEBqW~3ituEU77cs z+NeOTxahF12-631Si9Ue0l)5uGMST10yJ{oTU1^0Gliie!e~r z1D@pE>0{~TyL9VkVdAN7(VV&g9ukR;P6QiEzFFB*^&+Q%4&c}v#es>t?dg*VjboFu zd48_^k*U+~I>l*-#uvNkrcm#Lc>ia4od4P`sFt8y!Ay?AZ0JqdU5&W!8taJ0P^AjS zMn7qeNLmkzL_^In(cIu(ZML6PZ#52f1@9loEV7Yv?&}+h=8BsNIM9VpHf_g3wn6p5 z+=)t-7{2V%{G#dEi8)>Fl%*+o(#k23GcAdy+;XbE13O=P{D&B{`I>8ya}CD+<&7^l zx>?`&@lNLAJ^c632q2aT-I1=rQdiTOAvE66UBrAoN*?9vl`QQ9Ip91Qo+q zGY|p0_fLotdmi|jh(_bbB@COlC@w1OS2)`x-*wYVb~)05<_)U5eF2~ad@mxuD~AhT zvUoq|?3nb%rN=P2bFZ2o)rqPK)(N5F6v=8M++yU@Vn*m3IunNh6h{RVPb(yKm zN)YTbg^IoSjFc*$6;1ooi4>o?Mw9dumzjnw3~AM&?P82*A5G5=Erl#%Bb z%Mg9HH&ylR5<`{)U9|_4bsbI>_-J_n6n<{V07uJw%X;L53&j`}g`5F(fIk6Z7^Pe! zsS%B36MZxid^@&R>a)L--!1)AyBCr|c{DD0Z6*t+wVp?0z`94)o5lS05vD_=-we1{ z6Gdg8Ohc`#`ykIuZ8a^+VcP859G4pC7|fmnt#$`KOx0UJw#**rY?7ih{f6$`HK8jE zyh-%IC&C1rE7pY+(f~^)t}ty;5Zfw-e3Jyc+SNJ(_DYMfbYa>8t3qd+hXeT+l*fE7 zirnB)g6fVvIcyn@9HwqU+urh?i!awL z))y;4o__t_8bxHkKysNaMiIcWE75eA7c|ywcE2Q5`|WdsFAwTdEiZ3tE9iRs=Thu6 z0TodNr*qlo({6Y=Xw!zEY{caV!hBTM&AtC?Yx&=PHJgH#B{U8OUTjJ=l}uY3GGc{( zeRm;4ltTL%disE&wV4|@%b}+n4+Se=zH*DWUkL#XLf^DpcC1>2xT}C;oZ`&Mo|-Nv zuF*8NA<-NQLchF`>c56iWq}U!4J_P5pqlE9j7)wbP&ao@e!Ft=KHacROL0eg!-ISZ2AzarE^L zKe|m@=t9rhU&!w4++T=62?T*ANx6q1ckYxTx4=_NoCzqP(Bm%>`4kN>4D(9in^GTR z4j6B3Y53~-3T$@Dd&Uw^H%B-8g`{1s1l1TInElbGLw7s|>Ua#GK!e5-EF>xDsdZ5F z;0?N(S@ww4)5qU*@nUR1d5XWtt7kKo15Tnm=mE>4qdhCIe0b*vN(Lw|zv~FVN%Bb% z$Q6weiYJo5xvDku4Gu78JPG{nU<7-^fsvE9#~WQbptW1lWR_b|G@u5PySG)mh$Bs`)&64nmaJDbTRTx?{V}$+~TX% zf4N1Nj^IA&l6w?tN7-raEi%HV9uw`IAgoUr8{Xx22~u$WQs;1jM`cDN5gdZ(?}vvH z3pJ$7fp*j(QTUK{m}J1I`a!oThLi$CSV%nnJGN=df=wF9(ZG*Gg;O>84u#@Z1w_3j0V5 zXlZ6ISIMZJbc=D~cs{6E{`h%B+Xc;ZRUr~}fZ3935c?508hTiX`hOu0cEDbO0MW-v z^JNk=-82!(xf+oj7T>MYvo9LErAte#b`m4GzJs2Jky3$;KXRN8sHj)PAwEjKP{O2( z*g4h}^}t!Rk;Ejyf)3ZxQJv2Wp>+_E@a&MC?x|h$UGyuAoBKg3a`Oma`V|`fTOj_r zV`DHXM>xF@wEgJ-CMgn_vYkGDndQdfqvpnn>d5||3|986t+Xxzj?f6x2f(T7S3+<$ zAgZp;&{10V0NRpqq;YOsUzlsNVOeq4KdP|IZr?4tDn_ZJ8% z3mzj+S=qKK^%obRMQvrRPK zEY^Lvm)geZ(K`_DK&7k7E3mUvRtbw2q8?MSa#guO5dU0LBm1j^Uo2(I?uYJU8i`!q zMJ)3*bSBhQlO@(4P7Vb~_{X2IXkq~63MlRm>;fDr$e+*yaScsxvjm9?-}TkTcJA(| z*s!bnqquKQ((m>EaBH4qj#pjg>9Y0ec!;55%(tJh~+n1e{>h0>+?uEuAd z^*Rf%*u(&{s{a&b2o%N#pF`Yjtx2{-WLVae)#X5y&OLT`^rmxxgN;fg1ZFMZtz_2r z7s3IEplln(CI)zQ{jk`5`*4?hRT>GmU%Vprzzzpy2Nw(;E`$m+UZHH(P|~`rQEjpZ zlFiKfBb(5jXM=Q;P*%zb1n@IB8{~c`<4y%8h4XyC#oJdKbnZ#>@+Skt6C#-rigZBJ z5usnx>t{Y6mh8?H&77XS5y5(-&B~FgVUNqnmKrbn*9U)&klzNSzeMu%@?H1~VY7AO z>-*~XN7wNv+%sfDvu5%dO?)Cmb@@CzOy~?z-vMXZhN(~QDTV!)$9d zZcM(mtm)n1|DJ;ir+pbTcII6`vCgimu&?czsig9LNbE<9Dg(k{9{1>!W{&5kC5B0x zj%YT&SAW=?cK*F@(686HfYp@7+~B>z=zKBHG}Kcs+kB8dRuczx5I%`W`>Hbebzi+N zYd`hP``A&$*MI@(7R9Fqw_vurW%vPXVFX3Uh21&xYJI}UM#_P)_{PWCJ2?${=MoY9 zUPJL-sM`g(EU%i+5k;}lgwhgn)k2fujp4~h`^xF%Zi#CAX-U(~rzFJOu&Ju60HcuS zk&)`QWglmWG}d*aN}MkYrEIRLbnrsknk_x9@v3UkiE5JkaHs>pMvzhZkRgf8GqMgZ zLz7+=qmEAW0h}NTN=|$*aTMyoU6&GtyWqJ{sUG;%$5)V4)=(r_VDBxeDG=UWl0=7C zZnst7hT`Mb2Axk%xo3UkwNS`n_wN9YG3J2I9L7OSr@|6cjN-Waqnoo>WzEb4Ri>YI(b#iM#N_dkIeZ*bT?hJl7NyqKp&&1TRl>Z1JKj&vR=QhiyGrVyNYg^ks0j_F7W%+keS5tjnY1jiu-%Z419H{Wl*)y|jc#|NT&Mvq8|(m8%&u5=qR^{clOGa%nU+w`8WwWSfBVwUG8jfL z0=lDsLghMi4aN?BAXX#1$MF{ESBW87lXXcknYQ7d5yJN>3EssgV;{|V$^}J=6rK&; zrDgPZhG<>2(E{iS=u=`aa}axs&K;^b(tHJF_os+dfW_IXIY^=yqH}?x{Vda%HtQtO z;fAc&e9;1%t|v!b%4<@a$#^HZOI4H?n>cc?4ELk-%x&u{q7JwIfxjV_p}?UZWHsr+ z0RcTngcAD#48uukg$U#JbakNwenUIQ2s`Gf*Nf@Wup&^D=whe%AKyY?Tjx&e1U;jv zI;q@P5%ji~T`XC9;#@K{%|(&;`Pa|rm+HYj^zUi}%N;DoeTpze$u@2wDI%Dcz#aOu zQNq(*sXF6v<>XsGIWcivUdEQiSVCdj90PHzjn6j1PhfD|X(g=FN=*l0ashJj zK}%RJv+gb+kh1R`8snoVMrPrlgq+n0q!^}$Xg14Ez*|pADmdGoO)(9-U3#`XK;SB~ z_6xIy)zSNtZYUQ!JGOQw7q(VL;~%U#r}M`lCt$`pCp?8Yn)w`|Y)_>(s{mbRu;(^F zyI0C~bta*GiIHBzOieK2`Hl%)s1@bAEq(0LMYze>(p8Vni{orDzAvqLCus{Bog;)YB>0#(r(z1?l9-Jfi3vvQNogex6Eg(Wh;1RF5Yra5o?Da&11n;sSlLNv9ClL~Ov&3puT_xHs zhw|*|ZLP*1?jjCU*^q(iX8~rwk(z~+4pu#y9=hlJ$2}6ceVcR!AAM9&m(3V+Cf3NxQMHG)n3Jvyd~Ahq(?D55R7=jq(Y&ADurr3*d6%`V zW!)7u2;=b_Pj zlWT{?&Ro7n)W$OLA9Fk)CuVth*dQ&U0v=wWKm?)<9?)jQCq-}i6gw#y9~Iwirftqt zPE@1n_Tc1}*04`j$BD3RfY^!~2a6SA!r#vmOp5WT-INuBUDo^3qi|y5n!an@X4aEj zd{V~%4Whx^MoMSwT`k7@QgRRNmkgSZch7yao1@91_6%{sVJ6ck#x*gR%`wnt;n8PU zC~Dh`Bnl>n9+M3T>cPpz<}l!&e5m)0QR?25wV=(p-Y(ty$)9U`q+10uN%}wxT!!`EfT5j9Hjm zJZEhUavnzHrE^JT*`MO{4Zx|QBPr@2w0lVKCBG0W!A!VQj0+<%n;^6{dYsGhrO|@m z3xdN@;p<~n#FAb5VTI#M+}L5XGl1;3s$V;&}#ce#hb zwO^h#wjpFI9w(}$A1FvjqFnF#@643LF*Bu|0X@7a0|`1frdq&@E|yrh=Y}_n_Bood zG){QbX$Uw3u8Y4KPdtg0_o_1OL|qhN^YEj|ky@Bz%|gVPY9W8V z{|C0YADc#q8w2e2Me!flcBo-ZoWXBh9VxAxG5ne${;T5P+2{L1H$KgDF6tE|M$v^Q z`<<*Iv4VY#5wWC^fv+wB_je+ituUQX?~pgS#>`SG*NX0I0MP9(1h96c38cP&u7A+s zKbO(O9IAsJYzpSYdHlNJ$R%%ZAhKPpdERgL%C0Ks-hDxXMZH3yt`hHHdcs^}qo=#4 zN<@_-dUU4kdY+Jqo`LQKtTKyTyucY2I^oQ#i#Z2MJJ90~A=-=?AhiJwwYx}1SZ56> zKoM}tOz2Bkjjp^r7&wVhjKOj47;gCfg$Oq*gZVM1xatUzKL$Q0x)#n^TTBx(q1vbTRJJ!I zQhaH`Bh9~k*{6+NYvjbiSrD^rE&~i}o^!3VIi@c}JG;jRB(az2$~sxJBQXk1E^92~ zz7)OSOJH`C=MFhQ6j4l(ANk_r=LdRJgbi|4)gv4YeD3h}sd}2#3L+4&fl*zXi`5dB% z{Tcr=E`NlYtH@D)KS?$Nr0QxMg+?3_1pRl>9xq%fi(rYtN?=*yXqKs6;Z~!}?Nn|) zz`J+`_@_g{$3tB19D8&VAG^~E0P<+)E9yUh91X|IzVJ?>AwHYCI(XJ`^W1lZYg3?? z!1V8cvaYAhEf7d)7?2NN6Ehy>I@{8Xlr+N6>A&MKw!Yq1*-6#?7&=Q!eUkasNtWxY zeF$K!b_@>h{x5LYhMDIg=U`R>2ok_-kD`w*4(3^<2>m266-*)2P2XNU6BYK@wbOdr zB1u?IP3*yg#RuN#KFg!7J+SAeUVM)n3rHgK4O4A!q80?*Z{mL^d3{>P9HK{z9Fwd)mkMWS2$A^&}>dZ96x@I z1YQXed=+nhF{SkpxSC{``4Qx%%NWQRuO1+!&9GD2!a@GIk&fVNkPFMp1wmw_diEuN zU31dM1s4<*TD3(bMo}A%_>e4SB!ezNd56A^_cOmgSL+}m6&A54U^RKjrwd?>!9NO4&shRl&~?;Vrgom370io8Ftu z^tiC`Qftl@`m#^IP>I1N2-+Rmv8DHbH`7A`+RX4jwAl|<6S~G$!qI%zpDs2;_LXa` zx&az5OpLmu?I0}AJftcJ4)KaCryP4e5u@%#_O}_BChGC_zSuea>6DuqR!D6X{^s5e z_og7Y$@$m;GJqF*5haiy8dt)f`S%^e_X)(z%iFd3@|M;HxoL?O`KR-zlj;0-X?;>S ze}qdhhB51M9$3IX2r~lhBnx3iX;nrYieI29C5H+Rxf*T~5^;r6H-l9DNHZa=twB=8G}lyC6BL63x227iz(pHkTD~hj zG!00Floob2tKyf#o^Jkby#2}0jd;U0U`={}A)<#dcic zDY$-n(O1MiIhx^tuWC#8atb_CX$Q8Mi(Dwhk3s)13LnaSq*;*>#wE39!|zrPZ3G(g z+gR5oil>hvUY4x@_{O`hw5kMVFZit5p!nJEV4cf)0S-!^~w(r6YBOu+G@i zD)Y$qzDfmQ<_lo7bM1K#&H!k@+i9q_YWp4VFwjk^f+4>8dMmQA zZNMV*z%-Dm|5WEQe_Z0-`SftSxTgDiXcS2|09jnnP~y6kt{?qPd-dSm?OGuniH`z& zf3~J*D8>xPu@}NeN`B~e=)pxHaJqddK~oYfAxCKoDy^tf;8-(@yF2=*A&e}#o#|qv z$7>oigAF?+5aN%;F4OP^vyf4Nob&EyCf1e1O+dn(yF6#ZD;v%(!_%3Bi%y66G16`0<9Ok z4<&g~W+}=~Fw`4@db&8)jjGacz(qwvr>l<%?e&*LJ?O$3Q6mfab$09@;UWl4V8>>> z2n;AiK6U;vYqiG2lW6qx7wbXoym45e7$f6u3(c1fcN!8c-XWZ%?_Og5o;>pF%XwBm z`Few8Vp|07!+wP<2i0y`|0WQ{V!8ymu_FTswn+YUGfTGyv5U*%u?_A#Z50s-El(eK zg@;I@TeBIkl|rgDZ(ApSjTV*~@+&o(t)DxgHKB4fq?Wg(2b-2Cuc@*J;-%F21>`5ZpL=A#AzZX!hoWuZjo zgF+IN$PeC4Lkv~QmXR%$&A(HowD@h|oB_jy(`v1v+Aqe6ZtDo$#-T!T7zs(yrAoy+ zn5xEFntm=XNwIind|2UBFJHsv)OKUpQ6NiK6C9!#9@2^V>_U~@J!0E70#}C78lU7sVP@t=;uRChlrQgn}T_W-J90(%<{~6*L;EqfTFlU z2WF28K)N3TwlPN{;6SvCqBH{ht0U|MGLoopwr9y%jSMC0zV%sgMV3ZBXJ5@%W#19E z8*_f8O1lU;Y<;8VJZ}nh=&j3mqWhNB+JFK7?X2$P?21BoGVDG z!|*%JXYVYyc7TQ|fE}C~XOs!AY+K%_uEDL5NGd zKr^X?oItl&CcgJU6ct$lU8KP}K;EwtWad>!Z2?r zW*brX=9F{AUg=N&`OO~B^6J{-JKSlBmyI+tiCoPnaujq?VqxnL=L$p(BcM6oeVlSG zVe!?7sE);(MC#Dtv|CF3Byh~9`Yj|Kov=Z!q~|j0;c#2+8h(qBF!nsec-}<^kF{&6 z^DpdKf1f&8pTt6}Y0J^X|Jv=(_-N^DY0wq9asB;0lcH%cLr8=as`0Xc%OA6?Z!&u&i!p>!@Qn>B6I+erI5(n-j;@J zt7+h_es=3-UvEU?zUSaIUek{>xsxZ=czY!Nj2>gzDAIM3C33Z@<`}I7L2uhyw?1}J z>YM)2?tVHW)rjBuU80f1m!g}VP=4fM3bBFG3Q~L&slt$s!jU@3fj7H%zSKdFZZ)9k ziG})v;N<$kC|O){*^`S)lI6+mA0=DlQ6D)ElHm5iUoqQfT`+s>0FHsF)4%6>oicRe zOU}{l+Sti{T6tr|&z!dn?-&)IYaH530aGZtfI7qpQxdO3ialw%kyX zTZ5}YXRzQfNpe=ad}Pyp@CWbgM%g_b^+>uCurkQDD!RA+kfs&0{bUwIwO@LXhk_vZ zrvk&Az=J{ncTzIQr^We9S`dfYYjW7!*{7WM2J)nz+;8YPo$Eu(nmmDX;vL}W3w}KI zLz@Rk(6S&djsPsekI_o1-ypsJA580TjA>C66`On0+I+-3tV6UhS7GkjZGxD65swkr6(E`{Wko+ROksSQo54lapwYB6qv+AuncI4+QB6 zWA{p(wE4k5kyJ5V>7N)E9A@qi@x?T$egzp3y1P%y3Sd#y{_+OkZp0MYQC2AO#q^NN z$oY&wI?(i#ZwqA3{e|$O?eViQg+%u&cmow7E_JZEloj) zBP2;UpE7@w&&KSl%8&7J1HH=9Q$1P`lT&sZR7&W7D`%v@{&4KA8J!cNjv_ijBcVGA z$Y0va;C~(2ipy^a79k=sgp`KQ!dbqpDm87e)YYKse{eFICtqu!3qzm>)DJ}$F#nOh z500g8$S?f<#(FKX!>UxspXb;Yvd4cP7HetN?nL2U-J@Kn3+rmXd~gL;TParWL49C# zFYd8F9?_#EuT6!17Yvg9>PaA0^hEC5gPb8E_n!aB7sjW%xc^~!g?oK*IZs=sg`^)) z*wH63-_+IKq|Cx=-TE-k>cH-1ZIy&SQ|^Tq7ao1P`>~aWcY_{eCd82Qpo`Ig=fLvv zN3LorQptP>J<x!Qz$V8V6}fLq_Y+4b>1)m| z(7EkBu|Z5#YTv2vD{${@w%P-z<8Z z`TM65O(gRLvzW(enGHOGBAc&}YcPv;_%5=4A6T^|5ZS0e=#iFo-Gj4)OL<;$Z=UNS zQVZmj5oYH(`C);{QX^1DCfWJ-o6Ro)A6s>D$U*PUsMVd>012PTj|Vrfi)gw${%Gha zvme6MAnb|7w7aan2in{)Rq;HWnKIzIprvYsNTlo`)dCv=c2XXsRJ7GOn%Zf_K!Dlf zZWG9IT+99+RqOwICV;1{HW4)sqnfd@0`{8Qm)y>Drx>zdKk|xC&c(84v9GwWxBrC* zHd2+YE7#j3era3#MXGIF_Y=J{6Z!D51|Y+nSTgnI3Bsu z0f@O~=oIOEnr#^}nwwqsGtaHLGCFxhKV0u5i=Zb8d3}+>J3*ocbpeSH0e;$_#ZQjN zehrgVe1`GUnaRl^ZpHqYn_{3C(;&ySS(ZkY<`|KS1&F(pwo%NnsI*fbtACWg3IGZ; z(6^GPPLYlv`FM&q*A6BrY*2kKCsckfgQ>3OcqX>omu+)_g~s7ZG>Oi?mx3JGT-k54 z(UbZ+d_SJ}3u)NuUIeCrllc_mjQ@tT!A>R)Z=KuYt^zx2v5v4eVh-pzn(Utv6yPI` z4dl>Co`-%GRI3e+8b$&k0bchSMG1v1v(lsUKfM#I->!yk=jYHxt5H^@Au=oKnFqpq z`QY4G2aTeA03tRoX2H6X(pl*LLdNxEfo9-{*utX216@n2(Vs1?#g9IHPPH=rbx_N5 zqIMAntiSwCgHIEMu^75_f{VIMc5lXD*g2P?_%L~7jDhx^>Ohmf&;Km~r1}*sLuA4t zIS^s%=9r4Q$lt3qy)sX>f6O(!>YCLu`t7%N(!wX7YX5AidM4W>fyf34qLLI*hcGL1|fq{casDjl?}c-CMN!&##>?U)zZ z?D&)KJwG}sSMX2RZ8xsJ3G7S=h`_}YQ1AVjfGqbl@jhg@YoAK)%G+)7a2GkR)L z?=elgndo+1`7Pzrf@CL2;2MhK+?m!MEi9d2CK&Nw{RQKt3h5Rk42h0npqhZF6YYw| zY>0aPn+vA|X0!tQ@SqN}qq;(~ISERAH3KZj*(9n@&KYI{c0R7+?Qi&`oO(SkYCSL2 zzMaz^Iz?UY9))BGl*3bu>l(G5tb0A9HuBUsNPQ}>LAzs(O;%4<$YS(0HK9&?IRPE1 z85}AqM;5#1<+7wS>N*^0AzkNUwv_1Kvnwx_v%Th6PJVqy`S1bmXOrC?vXc0u+On4D zBWm5f!L_yduyNrv_F;&I`d+73CQ)-&X{TmGAAAPG7|eRVESYhTu6QoEZ;qvOOQM!5 zW6-Y@{w;Fx(|MRa57x{9e>A@w*~~van{b+jxsBw?vSghH2=9mc<_;fQmuE3b#cSwsJBow*5tz^^P>v~;G=ZMq7-RcZUH?LN z{7a%nMU}$1J$vYG=|CHlrBNI!%jA4tnd?4bb?m|bQf8iI*|0K9{0TPq&a@CjX3cAI zOp0JfF>;SbZZP=)DMBbj`%zOlIXnILQ~0`wyXMvN7t|=iY3~E(TFe7!SRzWH^H$f& zEh{JL{Z9S){->sQ<_}d;L#H|}YizkG$mNIy*)7q5*_{Lwm~Lu_HtN%4c0_4W;k5bM z8ADG8Pu^Jb0$#H_mvuRx#6k#HjuZnmq1#(UNk;+Dc^hyLG^)&_BDFbknAGfsc4}3u zt*vhzNQ`7B*_?5yy zsA>OBzP_~mbF1yA!RqrdUVR<8JXP*^_a zbjpvHdk@D)TR@!wqL8Fu*gkhK58yD?0%+d5D5e#EWMrj=mZ(9El?%hw2@aR3tW?-D zBe9&t%;UZrodoxo$|U-gH0N27#>AiB+sLve_)s}E3#gHAt85>1f?2+_EC!^XuTqbT$uXqM^f+NtHt*>lVinlxoDc0+ zp_#>KO0A%Tkv%8`3#BdUzy{nC+2ebnzV%Dx_?D~^PEXCh4LtuP$;QQ;bnczPgS~=O z7X0hz?_8Z;!{m*9G(bJ5*tu2}9_ z!8WEMb4a|UWomJgHl+q_tB^@#{$J!Rr4CJr%{?VjLC$Vm`3o7^MK!8=Dh~}H!L#7r z(SVG67O3$vDsFaG@PuaB2c-|bpEh~6pHpAo?DU}T)H)H!00PKC2BD0t$b=_ z+h|i+nlQ)?4`~7Y6CDBFHf{u*?E@Dm`OHhImewOBl4c@e(Z$9 zOZ?tx%S-gix9BOgZZEXR(siZ1oqEmWBrAu5bG$c?fSDOwDtP+;;_W@7n*7#p(I8+@ zDbl196cnWjNEHZJs0vm(1Ox;`M5IF?6e&^#6clL+h>8$VdJDZsl@{rQ&}%{ski@%i z|MuDcbMA+G$GBtP4-CZ--z0BYYd-Utb3T)sB47#GrH=MOKaK|Wg7YRNb>_LV?E8d< zqlta@@3*(;iU+AJ4}C~D_d?{wApR+jsevZ+J+u!azPvSGkJ=DjKy2fH<>kXrkb-j? z+)>{(g5A`~g(&C{ep~p2QR(=6Li`(KR(iS$G0hkaXtL5>a*P$Ih0vxzeVTQ2;S?~k z@65)hpgy&Wrd8e9(h~xK0J2#w+wIK(Cx}p7N*GnB(a!Tg%c(#q+~0d+>;jcBE`Ji5 z_tR}{U^aWS7MFQ4Q~7*64jx2<2dYX1Mu zyZ*oBZE0|rVvfn*? z&5GZPHz&LX7{gi5F^`YF5O9mxZ3b(5sRQ}-JHS0$1)Jzu^l5@IInIoQ@?7!{Wa~jM z^fv-#N7AdLgpjB_IfLY+vK8~D5LM#bW8s*2p4~!y+*gp@j>0MQwS>{n_?4y6XFoc6 z^<)YukSJcI)Z&k?@!eew1<)znaGwDFdvE_sjRSiu~meEm0fVuB=HN zZEZ|(5!^~!!b8~vYqnMc*ur1Cyq9HYr=AkdwuK5# zr%$0`tr&?P%PY0w17s&vl4GS#%j~_G2^0O?VxUHYj>9;{?@0=RI8pR#a1x!2;1ALN z*gF!z=KmI?)W`E6-3Z#xJr}nE?ofTDvuL}`9T}tfU^o%Ca&Lhj%SNhD;=B4N!zDGRt<#h`J$S(r2LK7G9YnYda6{(kFO%G&) z+lMo&HD=<<+ZUMCVWdXzCbliG9WFq0{3@{2J}mst_BUqgXHw232dRG{I<%sWkZi3g z`=qyz%~qGVBn70hi)F`s0&n9XTr{=8HA_O=T_#EYn!L|B4ciziK~*s z3bb0dFC$KnO#nE|#lsGmKw`$iZsF*T0r&?j=obRPmM66VruD$}oA>TByOM`)N3SdgA|g%iMpb<=w%lyEfmtEE%_5|>=Z z<2l8|k+F6jn}MSOPkq|(Q46&KMoCVXIO->@HJ%QC(;PN7gp0ksg$sgsO6y9T|i!*Ks^AQ zHE$UuI2T-A!Y$~C$Nzz&J@)_>iC@iMmmR(3u=&p2lm{8&-jfpEGPcz!_#|(x^ zaPl6EDO<+k$z6}K%eBACXk8~nR=WM%(&kH$+$zR>nMGXWSgW((fdJ3kmOUf@b=z|9 z$dGHv-h)wF-`Xb%k6SPQXpu>q%l#S;HiowB0-#ZencSD?h5qzQ?^#)s7ysrWudVJp zTR_IK&QN;Zt?j$@)nIl|Nw}@lQyJf}FXVCWXRy zZ*rpHDNtZ4xKikPp}Z(3L_}7?PP)$2PO&PrWY~!+PjHPz(tmo?6d*r&u;fY=tC_5qL(0LSg_Am` zoTlnTxbmMdUv(?jW9dY!*zvjgpw z#Xk`B%K3Q!t2wP!KXef~$*k#LufHK&d>;J@xyF?6a&NDCeAI0$y?hmsxxHl^1{%tp z)u0lv0Sm*HX8}ZX1m%F(+r*-jF{Cg1-ngqIOY(`2nMWeSBg%Gd+{+b-$K<-n+dUi2 zfse7{uzx7heL#`Yj*7#YYeo9VqFI*Cyt8d(-^+L&E_E7Szdin9>iBQ;DM}$`CUzW! zoq_FhLPW`z(4Z#R8vxWSE2gDt850@ET}-$XD3x+A`hfW!6MsjCPE*3{mu=~nnpVG+ zTbRK6^-citE=h)fri3AY1K6S$S_E*e9$EDdB(p#pguaYa!Xi_5gFGk09E^x+T?O-D zYYoM+v?;#Ibm{kzhJ|= zRGpqM_;Np30vSgiRlM$0sg*)$lmHu4XJvJD;A>Q4 zR-_aIUb&Tf*(y!NxC>LdPL2xX15f`je9IEzc55uK`@?l$;TZ~UJD>s?)E|hvzjyOu zEw6NA!Ff`Ji(RjIhsuKy2Vcu7e5}3Q&?@0X%XKT!RQ5Y z02vR#n-csOvvuVb)Y!`SKtrFfuSRPKV>3p&$ORO=Hq)_Zgih_9idjUL5)txb`srqM+u<}MR~GMfQ? z%-!ie-Qw8g8TcrQs%6NC!hW6H=k2A*>N!wFxtQ#EVHW{XHrx7X16B2X_a?Ts0zXt+ zWx>e@vLh706cGXU?NdB_c-6 zsd`V6KyBj#&XLF9lmdph$#u{O47f`HK$FEE5f{h@>@#wshSLG(F1Lfb?b$J_bI1MJ zVvY&6=GrbG=mG^7%xX&WK9YRdHipZZ`YgJ{^1Uuwwu$&hZTW%0CMZXyyEwJNs=P)b z^k(Mm!RI2MzDuF`?TB+69#bG&XG=}4N0iWEM&c5U-OA~`ba_<3bavEPepBz)F_v-I zrLVN?bt0avXR6nCFaSU_0AC^wO6{_8A@or7w8MZ^)*0XnU~<-906`6h*`k~9NE9#m z^wdr71DJ8@T7af4o4!EK6+;ohd&&|Qb>;=0YOcu{*TV&Yd=ntu(S=fWt5GWpyQ@3p zS43hdb@lO`zAbKPwx1#7fQOL%Pvt4$c24DD6l58mU$B^k?R4x0H1&}x{1 zb1cg}svHXC$8OqoCM(ZI_->!(J`zAoG9q&k(DfN72JA3|xfcQ@%XumDs^4$?tZ7KG zEdvq)tP7x2*I(2!lAui^o%@A9aHLsG+MKCvd9uL#L6dNh;pdi{Rs`dQb*PW%t>lA7 zGYPMhXQIguo$TI*>|gM5saTJ3sPTGr3!3heG=&aQ)%`m5sIoLD5n&+n61KYz?7}C2mTT~N}yKx z<{IqB4h$u7=Op*h`|L7j$=IX`vItyvCCh`!@UD^GSR*rzvfC4*d8yWwF+S1> zf^>QYjO*2vL2ATk6KsbSV8CCoRuu=lfJ-w2zkIWp+~@b8*#a{KF5~9P@-3FkA|h^$ zkJawoFqXTPTb2F^r{$N%Y$#tbKXrqrP#RKm7)y#)m{FLhgz^FQM)GRp5ig-(foBuEFT%1@a* zu_d&;6?j=;-Bm4WbSnDYD7T)%+}-VO|0Y>!o>tWk zs}1ynh&zdWk}69#Z)WM!y%@n2GO$M0U5=iQE$?=35o>-n$%&as@oA;jVKetnFVN2E zkGt=9JGZwJT7I0DG9a1RU+uY%P_p)8WXT2FwErIn&7_Z!8)0Jj@d`dI`kgPW@AByd zI|+S|CYpGWL4X04QL>F*0Z2+{5?F4XT`5QPAp3zo$XBJ(nIlkAQql2voe&DMRrehtIWAC)LP2WcQ+oSAlTS|FZOYtVL2WU7qCu6R99;J~ zwxdcRJ$(AAD z8ZWW@!?FTs^Mu-s*%Eio+}&}d!mT!OmWH@|BzJjbAO3qpy-d@xCtc%NzL=b##FjgH zQ~W>J-gFzoGhc79gra7;ssR`}oW6Zo1@ePZai9WZ)96CfRr3E(2^VCyDCNj6OJ zVP6Y!2_;P~jL9)MvSmbxAo7H@lCr31I9&`cc?n&HvV{Y)6nuvhfU4`w8Uie2xyeT9 zeJ&O%6fn2MpIdO|1v7{6VrLiet3Tp;49hHwngxBfMKW~N+S}znssMTLGX&=oq@2^# z%{vHwZT?EZuJ28C$qDhtKgS5nYzf79wzW7H9HL7A#bPc0ftNnJJM$}`%YLO0;0Y9v zvf{Vbc}qVNh65QIz5O}AW*qh5v@W}M`R#X&YqWE0Ydu0C3=eebg*SII)xu)| z420IhJ<8~=73?IS6z0h<(Ll2~ilx5R*I)v$&YxrtJ`^4`6#!fU{DoL!0wO{lbwV^k zdMn!L(zWA7BcIL}tuEXvJf5(`0Q@iu;1LI(gC;`4{vlT2j)J?v&Wzy3Ed; zy*g)csfYKOvgc;pJ#TJhfq1=r>1k*ah7k$x^Ejxn!ljCLOFsBo$73VOwd44hS>lb$Ye$O z1Ib4!l=feWCz*J~etK(BljapO;WhT`;PtDO8Si?fDSUhg5WbEa{1v`(0O2b=1!_sj z2rqkJLs-jpkxr{RSLJKQ@tDxf_*G%PP?K{D))XJ5&O`D_)-UXl>+w$Ftod?G8e&Krf8`~QhTJxrhaFZ|G^5L<&(W$qJx#dXPqkaKt3B+X1 z(U)CZS5vsk^z6)?FByBri@3UUW*yO_&CpQ~uP|f|?3-X1+OAT&RR7h4?=zjgn>XD9 z5!-$@Q|=&xqi(?&Pi3`Z0!K18?rmWXXhBhvJ&$JTh0k362p9~Y7CM>5f~h@^d_d@F zj9xaEbVOK8jETORG1V$;dt3K#>?cIzr1FY$8liRd>{L3+>U&=z)1gO&PFHP)H8K=d zdCZhMCXM+``#fzbVSQAQs@I%H33(6p?L=%mNt&uHaDs{fvddr5z{nP;NOHkR^No#K z_+)BD?f83M;14l9W1Uwd^F5jWDYIKr+{YhCMS^pkI^R&iwhOHBS0n0){&nH8uJc!8 z?8GYoC~I4_dhP_=_0)4nX9Bvh%Su4nh-)`xEyK3amaQVpKw(|tr}8|+4kUlbB~4*Q zgzE#vi2@nXE~oNs-Mt!=>}ta0V`o&w>@6cj2udwJ=rokG^qwSdJjLG}P!dHJ@CMYL zSRhz(zICNg34&Y3B%_c{$_8kaJmCjZDJWm@*jBm)K_vyH2somtq@9kYr z7x=74LgJ^&(T!p60E3%y4e(>ttWy+=M;U^>*(DeTThk2Rhhoff#X2iAcpiTI;c>p4 zrwt=|H=yWzFh(kwksjQI=qNg;L|+?;qi$6l_H>&An=#BmcgX^Tym~99L4#ae*YV5x z)8R5;40rRr?bbJ4@t@|Z9+^Qlqy+lkfP$^fye8^Cz?`zojFz-VsgRwi3Z&iJ}5vO4`}5L6IE~) z5gRC#5lRYbrqaiOI)U0s22$vKVD4t&C+4lPPW2r3N!+|%5q-b5qS#f+N#cEMwl0+M ztrJHg3pBJh}bCqd?@*DZh}`Ic=sby>NS;@o)JTe-d;=`1xa|@Y9CT zu#J0Uur1iU>!Ap4j|KvBuh|xQ9|s7452;{M_Thz_g}ty6C9#9pl-jTInI|5lX5@Td zt*GoD&JNdw(0rp?kY%A;N9`N$oB<17UK3_}7DkQGfFbTmor{||CYnB^^x)3g z%2Q5_c9H!DnI;pm;ALw1Q`W2p{J%j~$& zW5H}8*e&s2>Re>K-awJXGH*Ycir7_tk)2%~Hj~ZtoFJY0`g&*)x?5^{+i*n=+cLR> z2m1{N&Gt>>fhUqKmk#n{ujpid4?maaox*qO;;{$Ac<$~;|2L>P+jX@W_5)W_?n=5M zzo(fH|CTN;a%}tlfzF89(W7eg{yp_@R-_sVGBM#JNRzXuKtEd>KE-;8n?Cwy^P6uY zvV87OWm@{6^V?v90)Vsq6bTf!*5Hop^If3rpQU^zGbUCRW=``!M4;x5PbcuQp?gtV zmI}GkTB?GmfMTAiRo}%iZvyf0US=lud%e60Geaecd zOjo$Nv@){dYRlGZ-3Ke)(q59~w(@%ih--)JT#_bnm+~A8U@w4x67+fIjxW%baW!S` zf}`z;)h3ZFMMG3?6S~D+kC^}>jbR{aXydou+w;Ho`fllVJUb?mHp8Dbhq=u3ukb~Q zLDWCtiz;Z6!(_M`SuXwn1xj`NYpjJXt|vSYns_fzVm8x9VbMPS%y;Vh0aTEhz$s832p0!-1j*xM^@=aH5A- z={hit{p%_fs=D%NNS0ZphpQ2A!TzOVm-QhN?j zs^I5CQ=CO>lOez31cb0RxV`(XU6vs`ik?ZN5EZ5=P4Q>+u52)X_ zPz#^WA8Dg}sb)5z%_YV7zw=Q7cjDlppe&HnWghoY>2E44yJNAq`=05;NS2cntu^_5 zR2)=P#G1u|cCX0~`wPa0nHdiRynH!kUo1#X1wN8j*L5b}sa9A+hkj&)U%H|xhkAdl z(q*+YH*XYS()nY=qUpy~F%J)$*TPE-=nfT%C<)v;BKbg_#&FnE71sc?E>FCZ!f<&3j z^|SGjLfTIYE+zlsjA8E(_?{Gu4KmDT*FJtZjD{Xy^_7QeCCC;l*k>;wx7je zCjKWi*TlaP<3m)H@s}ASKQOnw^Bd=1qTf*9BFz0*Pdol!x6#@?8UlsrCd#O!q4?E zEu9Av?@EevYg4}aiAs!IChKF;qip^u>q_H zj;OXt9QuHs;ncfiaVQE5!-)>8?R7=RA9J+xPqLg4}@|<8hP_WKw-?XB4=^9X`?*D

_SDe*h-A8+oZGLueR9dz-Olxy@VvKqm> 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 bvjcBiVE9&+FuCQ} Date: Wed, 9 Aug 2023 17:52:15 +0800 Subject: [PATCH 02/45] fix tokenizer Former-commit-id: 572ea3bafb1b495e33b1abd1998972f3a5e6f310 --- src/llmtuner/extras/template.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/llmtuner/extras/template.py b/src/llmtuner/extras/template.py index 5b00af03..91595751 100644 --- a/src/llmtuner/extras/template.py +++ b/src/llmtuner/extras/template.py @@ -1,10 +1,15 @@ from typing import TYPE_CHECKING, Dict, List, Optional, Tuple, Union from dataclasses import dataclass +from llmtuner.extras.logging import get_logger + if TYPE_CHECKING: from transformers import PreTrainedTokenizer +logger = get_logger(__name__) + + @dataclass class Template: @@ -179,11 +184,16 @@ def get_template_and_fix_tokenizer( template = templates.get(name, None) assert template is not None, "Template {} does not exist.".format(name) - if tokenizer.eos_token_id is None and len(template.stop_words): # inplace method - tokenizer.eos_token = template.stop_words[0] + if tokenizer.eos_token_id is None: # inplace method + if len(template.stop_words): + tokenizer.eos_token = template.stop_words[0] + else: + tokenizer.eos_token = "<|endoftext|>" + logger.info("Add eos token: {}".format(tokenizer.eos_token)) - if tokenizer.pad_token_id is None and tokenizer.eos_token_id is not None: + if tokenizer.pad_token_id is None: tokenizer.pad_token = tokenizer.eos_token + logger.info("Add pad token: {}".format(tokenizer.pad_token)) tokenizer.add_special_tokens(dict(additional_special_tokens=template.stop_words)) return template From 6404167ab76070cddae10552b80ea49d1d10eabd Mon Sep 17 00:00:00 2001 From: hiyouga Date: Wed, 9 Aug 2023 23:00:26 +0800 Subject: [PATCH 03/45] support val set in streaming mode Former-commit-id: d86ea314a197fd821770d895e988c48d46679047 --- src/llmtuner/api/app.py | 2 +- src/llmtuner/dsets/preprocess.py | 7 ++-- src/llmtuner/dsets/utils.py | 28 ++++++++++++---- src/llmtuner/extras/template.py | 2 +- src/llmtuner/hparams/data_args.py | 4 +-- src/llmtuner/tuner/core/parser.py | 52 ++++++++++++++---------------- src/llmtuner/tuner/ppo/workflow.py | 7 ++-- src/llmtuner/tuner/pt/workflow.py | 2 +- src/llmtuner/tuner/rm/workflow.py | 2 +- src/llmtuner/tuner/sft/workflow.py | 2 +- 10 files changed, 58 insertions(+), 50 deletions(-) diff --git a/src/llmtuner/api/app.py b/src/llmtuner/api/app.py index 4fc5fc43..47b7661f 100644 --- a/src/llmtuner/api/app.py +++ b/src/llmtuner/api/app.py @@ -49,8 +49,8 @@ def create_app(chat_model: ChatModel) -> FastAPI: async def create_chat_completion(request: ChatCompletionRequest): if request.messages[-1].role != Role.USER: raise HTTPException(status_code=400, detail="Invalid request") - query = request.messages[-1].content + query = request.messages[-1].content prev_messages = request.messages[:-1] if len(prev_messages) > 0 and prev_messages[0].role == Role.SYSTEM: prefix = prev_messages.pop(0).content diff --git a/src/llmtuner/dsets/preprocess.py b/src/llmtuner/dsets/preprocess.py index d2150dbc..534d77b5 100644 --- a/src/llmtuner/dsets/preprocess.py +++ b/src/llmtuner/dsets/preprocess.py @@ -104,9 +104,9 @@ def preprocess_dataset( if len(source_ids) > data_args.max_source_length: source_ids = source_ids[:data_args.max_source_length] if len(accept_ids) > data_args.max_target_length: - accept_ids = accept_ids[:data_args.max_target_length - 1] + accept_ids = accept_ids[:data_args.max_target_length] if len(reject_ids) > data_args.max_target_length: - reject_ids = reject_ids[:data_args.max_target_length - 1] + reject_ids = reject_ids[:data_args.max_target_length] accept_ids = source_ids + accept_ids reject_ids = source_ids + reject_ids @@ -166,8 +166,5 @@ def preprocess_dataset( **kwargs ) - if data_args.streaming: - dataset = dataset.shuffle(buffer_size=data_args.buffer_size) - print_function(next(iter(dataset))) return dataset diff --git a/src/llmtuner/dsets/utils.py b/src/llmtuner/dsets/utils.py index 31c48222..e1093a95 100644 --- a/src/llmtuner/dsets/utils.py +++ b/src/llmtuner/dsets/utils.py @@ -1,15 +1,29 @@ -from typing import TYPE_CHECKING, Dict +from typing import TYPE_CHECKING, Dict, Union if TYPE_CHECKING: - from datasets import Dataset + from datasets import Dataset, IterableDataset + from transformers import TrainingArguments + from llmtuner.hparams import DataArguments -def split_dataset(dataset: "Dataset", dev_ratio: float, do_train: bool) -> Dict[str, "Dataset"]: - if do_train: - if dev_ratio > 1e-6: # Split the dataset - dataset = dataset.train_test_split(test_size=dev_ratio) - return {"train_dataset": dataset["train"], "eval_dataset": dataset["test"]} +def split_dataset( + dataset: Union["Dataset", "IterableDataset"], + data_args: "DataArguments", + training_args: "TrainingArguments" +) -> Dict[str, "Dataset"]: + if training_args.do_train: + if data_args.val_size > 1e-6: # Split the dataset + if data_args.streaming: + val_set = dataset.take(int(data_args.val_size)) + train_set = dataset.skip(int(data_args.val_size)) + dataset = dataset.shuffle(buffer_size=data_args.buffer_size, seed=training_args.seed) + return {"train_dataset": train_set, "eval_dataset": val_set} + else: + dataset = dataset.train_test_split(test_size=data_args.val_size, seed=training_args.seed) + return {"train_dataset": dataset["train"], "eval_dataset": dataset["test"]} else: + if data_args.streaming: + dataset = dataset.shuffle(buffer_size=data_args.buffer_size, seed=training_args.seed) return {"train_dataset": dataset} else: # do_eval or do_predict return {"eval_dataset": dataset} diff --git a/src/llmtuner/extras/template.py b/src/llmtuner/extras/template.py index 91595751..413333ac 100644 --- a/src/llmtuner/extras/template.py +++ b/src/llmtuner/extras/template.py @@ -97,7 +97,7 @@ class Template: sep_ids = self._convert_inputs_to_ids(tokenizer, context=self.sep) encoded_pairs = [] for turn_idx, (query, resp) in enumerate(history): - if turn_idx == 0: + if turn_idx == 0 and prefix: prefix_ids = self._convert_inputs_to_ids(tokenizer, context=prefix) + eos_ids + sep_ids else: prefix_ids = sep_ids diff --git a/src/llmtuner/hparams/data_args.py b/src/llmtuner/hparams/data_args.py index 60945b60..de470ae2 100644 --- a/src/llmtuner/hparams/data_args.py +++ b/src/llmtuner/hparams/data_args.py @@ -90,9 +90,9 @@ class DataArguments: default=None, metadata={"help": "A prefix to add before every source text. Use `|` to separate multiple prefixes in training."} ) - dev_ratio: Optional[float] = field( + val_size: Optional[float] = field( default=0, - metadata={"help": "Proportion of the dataset to include in the development set, should be between 0.0 and 1.0."} + metadata={"help": "Size of the development set, should be an integer or a float in range `[0,1)`."} ) def init_for_training(self): # support mixing multiple datasets diff --git a/src/llmtuner/tuner/core/parser.py b/src/llmtuner/tuner/core/parser.py index d872afcc..692f9b13 100644 --- a/src/llmtuner/tuner/core/parser.py +++ b/src/llmtuner/tuner/core/parser.py @@ -67,33 +67,33 @@ def get_train_args( # Check arguments (do not check finetuning_args since it may be loaded from checkpoints) data_args.init_for_training() - assert general_args.stage == "sft" or (not training_args.predict_with_generate), \ - "`predict_with_generate` cannot be set as True at PT, RM and PPO stages." + if general_args.stage != "sft" and training_args.predict_with_generate: + raise ValueError("`predict_with_generate` cannot be set as True at PT, RM and PPO stages.") - assert not (training_args.do_train and training_args.predict_with_generate), \ - "`predict_with_generate` cannot be set as True while training." + if training_args.do_train and training_args.predict_with_generate: + raise ValueError("`predict_with_generate` cannot be set as True while training.") - assert general_args.stage != "sft" or (not training_args.do_predict) or training_args.predict_with_generate, \ - "Please enable `predict_with_generate` to save model predictions." + if general_args.stage == "sft" and training_args.do_predict and not training_args.predict_with_generate: + raise ValueError("Please enable `predict_with_generate` to save model predictions.") - assert model_args.quantization_bit is None or finetuning_args.finetuning_type == "lora", \ - "Quantization is only compatible with the LoRA method." + if training_args.max_steps == -1 and data_args.streaming: + raise ValueError("Please specify `max_steps` in streaming mode.") - assert not (training_args.max_steps == -1 and data_args.streaming), \ - "Please specify `max_steps` in streaming mode." + if general_args.stage == "ppo" and data_args.streaming: + raise ValueError("Streaming mode does not suppport PPO training currently.") - assert training_args.evaluation_strategy == "no" or (not data_args.streaming), \ - "Streaming mode does not support evaluation currently." + if data_args.val_size > 1e-6 and data_args.val_size < 1 and data_args.streaming: + raise ValueError("Streaming mode should have an integer val size.") - assert not (general_args.stage == "ppo" and data_args.streaming), \ - "Streaming mode does not suppport PPO training currently." + if model_args.quantization_bit is not None and finetuning_args.finetuning_type != "lora": + raise ValueError("Quantization is only compatible with the LoRA method.") if model_args.checkpoint_dir is not None: if finetuning_args.finetuning_type != "lora": - assert len(model_args.checkpoint_dir) == 1, "Only LoRA tuning accepts multiple checkpoints." - else: - assert model_args.quantization_bit is None or len(model_args.checkpoint_dir) == 1, \ - "Quantized model only accepts a single checkpoint." + if len(model_args.checkpoint_dir) != 1: + raise ValueError("Only LoRA tuning accepts multiple checkpoints.") + elif model_args.quantization_bit is not None and len(model_args.checkpoint_dir) != 1: + raise ValueError("Quantized model only accepts a single checkpoint.") if model_args.quantization_bit is not None and (not training_args.do_train): logger.warning("Evaluating model in 4/8-bit mode may cause lower scores.") @@ -113,10 +113,6 @@ def get_train_args( logger.warning("`max_samples` is incompatible with `streaming`. Disabling max_samples.") data_args.max_samples = None - if data_args.dev_ratio > 1e-6 and data_args.streaming: - logger.warning("`dev_ratio` is incompatible with `streaming`. Disabling development set.") - data_args.dev_ratio = 0 - training_args.optim = "adamw_torch" if training_args.optim == "adamw_hf" else training_args.optim # suppress warning if model_args.quantization_bit is not None: @@ -145,14 +141,14 @@ def get_infer_args( ) -> Tuple[ModelArguments, DataArguments, FinetuningArguments, GeneratingArguments]: model_args, data_args, finetuning_args, generating_args = parse_infer_args(args) - assert model_args.quantization_bit is None or finetuning_args.finetuning_type == "lora", \ - "Quantization is only compatible with the LoRA method." + if model_args.quantization_bit is not None and finetuning_args.finetuning_type != "lora": + raise ValueError("Quantization is only compatible with the LoRA method.") if model_args.checkpoint_dir is not None: if finetuning_args.finetuning_type != "lora": - assert len(model_args.checkpoint_dir) == 1, "Only LoRA tuning accepts multiple checkpoints." - else: - assert model_args.quantization_bit is None or len(model_args.checkpoint_dir) == 1, \ - "Quantized model only accepts a single checkpoint." + if len(model_args.checkpoint_dir) != 1: + raise ValueError("Only LoRA tuning accepts multiple checkpoints.") + elif model_args.quantization_bit is not None and len(model_args.checkpoint_dir) != 1: + raise ValueError("Quantized model only accepts a single checkpoint.") return model_args, data_args, finetuning_args, generating_args diff --git a/src/llmtuner/tuner/ppo/workflow.py b/src/llmtuner/tuner/ppo/workflow.py index 0ca8cbd4..aa372671 100644 --- a/src/llmtuner/tuner/ppo/workflow.py +++ b/src/llmtuner/tuner/ppo/workflow.py @@ -41,14 +41,15 @@ def run_ppo( max_grad_norm=training_args.max_grad_norm ) - optimizer = AdamW(filter(lambda p: p.requires_grad, model.parameters()), lr=ppo_config.learning_rate) + optimizer = AdamW(filter(lambda p: p.requires_grad, model.parameters()), lr=training_args.learning_rate) total_train_batch_size = \ training_args.per_device_train_batch_size * training_args.gradient_accumulation_steps * training_args.world_size + num_training_steps = training_args.num_train_epochs * math.ceil(len(dataset) / total_train_batch_size) lr_scheduler = get_scheduler( training_args.lr_scheduler_type, optimizer=optimizer, - num_warmup_steps=training_args.warmup_steps, - num_training_steps=(training_args.num_train_epochs * math.ceil(len(dataset) / total_train_batch_size)) + num_warmup_steps=training_args.get_warmup_steps(num_training_steps), + num_training_steps=num_training_steps ) # Initialize our Trainer diff --git a/src/llmtuner/tuner/pt/workflow.py b/src/llmtuner/tuner/pt/workflow.py index 2a9f8279..b4ea148b 100644 --- a/src/llmtuner/tuner/pt/workflow.py +++ b/src/llmtuner/tuner/pt/workflow.py @@ -38,7 +38,7 @@ def run_pt( tokenizer=tokenizer, data_collator=data_collator, callbacks=callbacks, - **split_dataset(dataset, data_args.dev_ratio, training_args.do_train) + **split_dataset(dataset, data_args, training_args) ) # Training diff --git a/src/llmtuner/tuner/rm/workflow.py b/src/llmtuner/tuner/rm/workflow.py index 19527ce8..b19a13e6 100644 --- a/src/llmtuner/tuner/rm/workflow.py +++ b/src/llmtuner/tuner/rm/workflow.py @@ -39,7 +39,7 @@ def run_rm( data_collator=data_collator, callbacks=callbacks, compute_metrics=compute_accuracy, - **split_dataset(dataset, data_args.dev_ratio, training_args.do_train) + **split_dataset(dataset, data_args, training_args) ) # Training diff --git a/src/llmtuner/tuner/sft/workflow.py b/src/llmtuner/tuner/sft/workflow.py index 69d200f3..a5cd2cd3 100644 --- a/src/llmtuner/tuner/sft/workflow.py +++ b/src/llmtuner/tuner/sft/workflow.py @@ -46,7 +46,7 @@ def run_sft( data_collator=data_collator, callbacks=callbacks, compute_metrics=ComputeMetrics(tokenizer) if training_args.predict_with_generate else None, - **split_dataset(dataset, data_args.dev_ratio, training_args.do_train) + **split_dataset(dataset, data_args, training_args) ) # Keyword arguments for `model.generate` From ce9ffca0d98eb3d8050c22473f9e32dbc9c17c4d Mon Sep 17 00:00:00 2001 From: hiyouga Date: Wed, 9 Aug 2023 23:10:20 +0800 Subject: [PATCH 04/45] fix template Former-commit-id: ac29f4d5f0d9d514aec9224fd751b9eb49430e7e --- src/llmtuner/extras/template.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/llmtuner/extras/template.py b/src/llmtuner/extras/template.py index 413333ac..dd88782d 100644 --- a/src/llmtuner/extras/template.py +++ b/src/llmtuner/extras/template.py @@ -97,10 +97,10 @@ class Template: sep_ids = self._convert_inputs_to_ids(tokenizer, context=self.sep) encoded_pairs = [] for turn_idx, (query, resp) in enumerate(history): - if turn_idx == 0 and prefix: - prefix_ids = self._convert_inputs_to_ids(tokenizer, context=prefix) + eos_ids + sep_ids - else: + if turn_idx != 0: prefix_ids = sep_ids + elif prefix: + prefix_ids = self._convert_inputs_to_ids(tokenizer, context=prefix) + eos_ids + sep_ids query_ids = self._convert_inputs_to_ids(tokenizer, context=self.prompt, query=query) resp_ids = self._convert_inputs_to_ids(tokenizer, context=[resp]) encoded_pairs.append((bos_ids + prefix_ids + query_ids, resp_ids + eos_ids)) From 0dc9b41b167565067260163e2857621df51fa4c9 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Wed, 9 Aug 2023 23:14:27 +0800 Subject: [PATCH 05/45] fix template Former-commit-id: eb6e571cb7c0a6da6696e8ce4b39cdcdb7f04e36 --- src/llmtuner/extras/template.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/llmtuner/extras/template.py b/src/llmtuner/extras/template.py index dd88782d..d94d5b37 100644 --- a/src/llmtuner/extras/template.py +++ b/src/llmtuner/extras/template.py @@ -101,6 +101,9 @@ class Template: prefix_ids = sep_ids elif prefix: prefix_ids = self._convert_inputs_to_ids(tokenizer, context=prefix) + eos_ids + sep_ids + else: + prefix_ids = [] + query_ids = self._convert_inputs_to_ids(tokenizer, context=self.prompt, query=query) resp_ids = self._convert_inputs_to_ids(tokenizer, context=[resp]) encoded_pairs.append((bos_ids + prefix_ids + query_ids, resp_ids + eos_ids)) From 7ffd961b8b531f88064d9c6889af984d44f72f51 Mon Sep 17 00:00:00 2001 From: jiongxuc Date: Thu, 10 Aug 2023 14:57:12 +0800 Subject: [PATCH 06/45] huggingface login for projects must login while running Former-commit-id: 3e000c2b60c2e29bcafcf8d39c1a5d567ae2491c --- requirements.txt | 1 + src/llmtuner/hparams/model_args.py | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/requirements.txt b/requirements.txt index 9b74b21d..c71b6c9c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,3 +16,4 @@ pydantic==1.10.11 fastapi==0.95.1 sse-starlette matplotlib +huggingface_hub \ No newline at end of file diff --git a/src/llmtuner/hparams/model_args.py b/src/llmtuner/hparams/model_args.py index 253d9839..94e882fe 100644 --- a/src/llmtuner/hparams/model_args.py +++ b/src/llmtuner/hparams/model_args.py @@ -1,6 +1,7 @@ import torch from typing import Literal, Optional from dataclasses import dataclass, field +from huggingface_hub.hf_api import HfFolder @dataclass @@ -63,6 +64,11 @@ class ModelArguments: default=False, metadata={"help": "Whether to plot the training loss after fine-tuning or not."} ) + hf_hub_token : Optional[str] = field( + default=None, + metadata={"help": "Path to the directory containing the checkpoints of the reward model."} + ) + def __post_init__(self): if self.checkpoint_dir is not None: # support merging multiple lora weights @@ -70,3 +76,6 @@ class ModelArguments: if self.quantization_bit is not None: assert self.quantization_bit in [4, 8], "We only accept 4-bit or 8-bit quantization." + + if self.use_auth_token == True and self.hf_hub_token != None: + HfFolder.save_token(self.hf_hub_token) From 58e95776e1f27709beab84a2ba6eafe2488e920a Mon Sep 17 00:00:00 2001 From: hiyouga Date: Thu, 10 Aug 2023 15:20:44 +0800 Subject: [PATCH 07/45] fix webui val size Former-commit-id: ad6e7c76c7b5590ea6ca55c4f76db2d3206b5987 --- src/llmtuner/webui/components/sft.py | 6 +++--- src/llmtuner/webui/locales.py | 4 ++-- src/llmtuner/webui/runner.py | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/llmtuner/webui/components/sft.py b/src/llmtuner/webui/components/sft.py index 678693b9..9db57ac9 100644 --- a/src/llmtuner/webui/components/sft.py +++ b/src/llmtuner/webui/components/sft.py @@ -38,7 +38,7 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ value="cosine", choices=[scheduler.value for scheduler in SchedulerType] ) max_grad_norm = gr.Textbox(value="1.0") - dev_ratio = gr.Slider(value=0, minimum=0, maximum=1, step=0.001) + val_size = gr.Slider(value=0, minimum=0, maximum=1, step=0.001) with gr.Accordion(label="Advanced config", open=False) as advanced_tab: with gr.Row(): @@ -88,7 +88,7 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ gradient_accumulation_steps, lr_scheduler_type, max_grad_norm, - dev_ratio, + val_size, logging_steps, save_steps, warmup_steps, @@ -122,7 +122,7 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ gradient_accumulation_steps=gradient_accumulation_steps, lr_scheduler_type=lr_scheduler_type, max_grad_norm=max_grad_norm, - dev_ratio=dev_ratio, + val_size=val_size, advanced_tab=advanced_tab, logging_steps=logging_steps, save_steps=save_steps, diff --git a/src/llmtuner/webui/locales.py b/src/llmtuner/webui/locales.py index ba9a73bd..9bf3d7a9 100644 --- a/src/llmtuner/webui/locales.py +++ b/src/llmtuner/webui/locales.py @@ -227,9 +227,9 @@ LOCALES = { "info": "用于梯度裁剪的范数。" } }, - "dev_ratio": { + "val_size": { "en": { - "label": "Dev ratio", + "label": "Val size", "info": "Proportion of data in the dev set." }, "zh": { diff --git a/src/llmtuner/webui/runner.py b/src/llmtuner/webui/runner.py index 763ff614..fddc4070 100644 --- a/src/llmtuner/webui/runner.py +++ b/src/llmtuner/webui/runner.py @@ -83,7 +83,7 @@ class Runner: gradient_accumulation_steps: int, lr_scheduler_type: str, max_grad_norm: str, - dev_ratio: float, + val_size: float, logging_steps: int, save_steps: int, warmup_steps: int, @@ -139,8 +139,8 @@ class Runner: output_dir=output_dir ) - if dev_ratio > 1e-6: - args["dev_ratio"] = dev_ratio + if val_size > 1e-6: + args["val_size"] = val_size args["evaluation_strategy"] = "steps" args["eval_steps"] = save_steps args["load_best_model_at_end"] = True From abdfa26d06a5549a70865d356452e572dbe50209 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Fri, 11 Aug 2023 03:02:53 +0800 Subject: [PATCH 08/45] support DPO training (2305.18290) Former-commit-id: 3ec4351cfdaf2aefcc7d13345e19d79874ed61d3 --- README.md | 60 +++++++++++------- README_zh.md | 68 ++++++++++++-------- data/dataset_info.json | 20 ------ data/refgpt_zh_50k_p1.json.REMOVED.git-id | 1 - data/refgpt_zh_50k_p2.json.REMOVED.git-id | 1 - requirements.txt | 3 +- src/api_demo.py | 2 +- src/llmtuner/chat/stream_chat.py | 3 +- src/llmtuner/dsets/preprocess.py | 39 ++++++------ src/llmtuner/extras/callbacks.py | 9 +++ src/llmtuner/extras/constants.py | 4 +- src/llmtuner/extras/misc.py | 8 ++- src/llmtuner/extras/template.py | 73 +++++++++++++++------- src/llmtuner/hparams/data_args.py | 2 +- src/llmtuner/hparams/finetuning_args.py | 24 +++++--- src/llmtuner/hparams/general_args.py | 4 +- src/llmtuner/hparams/generating_args.py | 2 +- src/llmtuner/hparams/model_args.py | 13 ++-- src/llmtuner/tuner/core/adapter.py | 2 +- src/llmtuner/tuner/core/loader.py | 7 +-- src/llmtuner/tuner/core/parser.py | 61 +++++++++++++++--- src/llmtuner/tuner/core/trainer.py | 31 ++++++---- src/llmtuner/tuner/dpo/__init__.py | 1 + src/llmtuner/tuner/dpo/collator.py | 51 +++++++++++++++ src/llmtuner/tuner/dpo/trainer.py | 75 +++++++++++++++++++++++ src/llmtuner/tuner/dpo/workflow.py | 59 ++++++++++++++++++ src/llmtuner/tuner/ppo/trainer.py | 19 +++--- src/llmtuner/tuner/ppo/workflow.py | 25 ++++---- src/llmtuner/tuner/pt/workflow.py | 8 +-- src/llmtuner/tuner/rm/collator.py | 9 ++- src/llmtuner/tuner/sft/trainer.py | 2 +- src/llmtuner/tuner/sft/workflow.py | 15 ++--- src/llmtuner/tuner/tune.py | 22 +++++-- src/llmtuner/webui/runner.py | 2 +- 34 files changed, 513 insertions(+), 212 deletions(-) delete mode 100644 data/refgpt_zh_50k_p1.json.REMOVED.git-id delete mode 100644 data/refgpt_zh_50k_p2.json.REMOVED.git-id create mode 100644 src/llmtuner/tuner/dpo/__init__.py create mode 100644 src/llmtuner/tuner/dpo/collator.py create mode 100644 src/llmtuner/tuner/dpo/trainer.py create mode 100644 src/llmtuner/tuner/dpo/workflow.py diff --git a/README.md b/README.md index cca8fdc3..fcbe0761 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ ## Changelog +[23/08/11] Now we support **[DPO training](https://arxiv.org/abs/2305.18290)** for instruction-tuned models. See [this example](#dpo-training) to train your models (experimental feature). + [23/08/03] Now we support training the **Qwen-7B** model in this repo. Try `--model_name_or_path Qwen/Qwen-7B-Chat` and `--lora_target c_attn` arguments to train the Qwen-7B model. Remember to use `--template chatml` argument when you are using the Qwen-7B-Chat model. [23/07/31] Now we support dataset streaming. Try `--streaming` and `--max_steps 100` arguments to stream your dataset. @@ -54,24 +56,18 @@ | [Qwen](https://github.com/QwenLM/Qwen-7B) | 7B | c_attn | chatml | | [XVERSE](https://github.com/xverse-ai/XVERSE-13B) | 13B | q_proj,v_proj | - | -> * **Default module** is used for the `--lora_target` argument. Please use `python src/train_bash.py -h` to see all available options. -> * For the "base" models, the `--template` argument can be chosen from `default`, `alpaca`, `vicuna` etc. +- **Default module** is used for the `--lora_target` argument. Please use `python src/train_bash.py -h` to see all available options. +- For the "base" models, the `--template` argument can be chosen from `default`, `alpaca`, `vicuna` etc. But make sure to use the corresponding template for the "chat" models. ## Supported Training Approaches -- [(Continually) pre-training](https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf) - - Full-parameter tuning - - Partial-parameter tuning - - [LoRA](https://arxiv.org/abs/2106.09685) - - [QLoRA](https://arxiv.org/abs/2305.14314) -- [Supervised fine-tuning](https://arxiv.org/abs/2109.01652) - - Full-parameter tuning - - Partial-parameter tuning - - [LoRA](https://arxiv.org/abs/2106.09685) - - [QLoRA](https://arxiv.org/abs/2305.14314) -- [RLHF](https://arxiv.org/abs/2203.02155) - - [LoRA](https://arxiv.org/abs/2106.09685) - - [QLoRA](https://arxiv.org/abs/2305.14314) +| Approach | Full-parameter | Partial-parameter | LoRA | QLoRA | +| ---------------------- | -------------- | ----------------- | ---- | ----- | +| Pre-Training | ✅ | ✅ | ✅ | ✅ | +| Supervised Fine-Tuning | ✅ | ✅ | ✅ | ✅ | +| Reward Model Training | | | ✅ | ✅ | +| PPO Training | | | ✅ | ✅ | +| DPO Training | ✅ | | ✅ | ✅ | ## Provided Datasets @@ -88,7 +84,6 @@ - [Open Assistant (multilingual)](https://huggingface.co/datasets/OpenAssistant/oasst1) - [Self-cognition (zh)](data/self_cognition.json) - [ShareGPT (zh)](https://huggingface.co/datasets/QingyiSi/Alpaca-CoT/tree/main/Chinese-instruction-collection) - - [RefGPT (zh)](https://github.com/sufengniu/RefGPT) - [Guanaco Dataset (multilingual)](https://huggingface.co/datasets/JosephusCheung/GuanacoDataset) - [BELLE 2M (zh)](https://huggingface.co/datasets/BelleGroup/train_2M_CN) - [BELLE 1M (zh)](https://huggingface.co/datasets/BelleGroup/train_1M_CN) @@ -103,7 +98,7 @@ - [Web QA (zh)](https://huggingface.co/datasets/suolyer/webqa) - [UltraChat (en)](https://github.com/thunlp/UltraChat) - [WebNovel (zh)](https://huggingface.co/datasets/zxbsmk/webnovel_cn) -- For reward modelling: +- For reward modelling or DPO training: - [HH-RLHF (en)](https://huggingface.co/datasets/Anthropic/hh-rlhf) - [Open Assistant (multilingual)](https://huggingface.co/datasets/OpenAssistant/oasst1) - [GPT-4 Generated Data (en&zh)](https://github.com/Instruction-Tuning-with-GPT-4/GPT-4-LLM) @@ -139,7 +134,6 @@ Note: please update `data/dataset_info.json` to use your custom dataset. About t ### Dependence Installation (optional) ```bash -git lfs install git clone https://github.com/hiyouga/LLaMA-Efficient-Tuning.git conda create -n llama_etuning python=3.10 conda activate llama_etuning @@ -161,7 +155,7 @@ CUDA_VISIBLE_DEVICES=0 python src/train_web.py Currently the web UI only supports training on **a single GPU**. -### (Continually) Pre-Training +### Pre-Training ```bash CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ @@ -222,7 +216,7 @@ CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ --resume_lora_training False \ --checkpoint_dir path_to_sft_checkpoint \ --output_dir path_to_rm_checkpoint \ - --per_device_train_batch_size 4 \ + --per_device_train_batch_size 2 \ --gradient_accumulation_steps 4 \ --lr_scheduler_type cosine \ --logging_steps 10 \ @@ -233,7 +227,7 @@ CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ --fp16 ``` -### PPO Training (RLHF) +### PPO Training ```bash CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ @@ -257,6 +251,30 @@ CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ --plot_loss ``` +### DPO Training + +```bash +CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ + --stage dpo \ + --model_name_or_path path_to_your_model \ + --do_train \ + --dataset comparison_gpt4_en \ + --template default \ + --finetuning_type lora \ + --resume_lora_training False \ + --checkpoint_dir path_to_sft_checkpoint \ + --output_dir path_to_dpo_checkpoint \ + --per_device_train_batch_size 2 \ + --gradient_accumulation_steps 4 \ + --lr_scheduler_type cosine \ + --logging_steps 10 \ + --save_steps 1000 \ + --learning_rate 1e-5 \ + --num_train_epochs 1.0 \ + --plot_loss \ + --fp16 +``` + ### Distributed Training ```bash diff --git a/README_zh.md b/README_zh.md index d5eca99d..955fefc1 100644 --- a/README_zh.md +++ b/README_zh.md @@ -12,7 +12,9 @@ ## 更新日志 -[23/08/03] 现在我们支持了 **Qwen-7B** 模型的训练。请尝试使用 `--model_name_or_path Qwen/Qwen-7B-Chat` 和 `--lora_target c_attn` 参数。请注意使用 Qwen-7B-Chat 模型需要添加 `--template chatml` 参数。 +[23/08/11] 现在我们支持了指令模型的 **[DPO 训练](https://arxiv.org/abs/2305.18290)**。详情请参阅[此示例](#dpo-training)(实验性功能)。 + +[23/08/03] 现在我们支持了 **Qwen-7B** 模型的训练。请尝试使用 `--model_name_or_path Qwen/Qwen-7B-Chat` 和 `--lora_target c_attn` 参数。使用 Qwen-7B-Chat 模型请添加 `--template chatml` 参数。 [23/07/31] 现在我们支持了训练数据流式加载。请尝试使用 `--streaming` 和 `--max_steps 100` 参数来流式加载数据集。 @@ -54,41 +56,34 @@ | [Qwen](https://github.com/QwenLM/Qwen-7B) | 7B | c_attn | chatml | | [XVERSE](https://github.com/xverse-ai/XVERSE-13B) | 13B | q_proj,v_proj | - | -> * **默认模块**是 `--lora_target` 参数的默认值。请使用 `python src/train_bash.py -h` 查看全部可选项。 -> * 对于所有“基座”模型,`--template` 参数可以是 `default`, `alpaca`, `vicuna` 等值。 +- **默认模块**是 `--lora_target` 参数的部分可选项。请使用 `python src/train_bash.py -h` 查看全部可选项。 +- 对于所有“基座”(Base)模型,`--template` 参数可以是 `default`, `alpaca`, `vicuna` 等任意值。但“对话”(Chat)模型请务必使用对应的模板。 -## 微调方法 +## 训练方法 -- [二次预训练](https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf) - - 全参数微调 - - 部分参数微调 - - [LoRA](https://arxiv.org/abs/2106.09685) - - [QLoRA](https://arxiv.org/abs/2305.14314) -- [指令监督微调](https://arxiv.org/abs/2109.01652) - - 全参数微调 - - 部分参数微调 - - [LoRA](https://arxiv.org/abs/2106.09685) - - [QLoRA](https://arxiv.org/abs/2305.14314) -- [人类反馈的强化学习(RLHF)](https://arxiv.org/abs/2203.02155) - - [LoRA](https://arxiv.org/abs/2106.09685) - - [QLoRA](https://arxiv.org/abs/2305.14314) +| 方法 | 全参数训练 | 部分参数训练 | LoRA | QLoRA | +| ---------- | ---------- | ----------- | ---- | ----- | +| 预训练 | ✅ | ✅ | ✅ | ✅ | +| 指令监督微调 | ✅ | ✅ | ✅ | ✅ | +| 奖励模型训练 | | | ✅ | ✅ | +| PPO 训练 | | | ✅ | ✅ | +| DPO 训练 | ✅ | | ✅ | ✅ | ## 数据集 -- 用于二次预训练: +- 用于预训练: - [Wiki Demo (en)](data/wiki_demo.txt) - [RefinedWeb (en)](https://huggingface.co/datasets/tiiuae/falcon-refinedweb) - [StarCoder (en)](https://huggingface.co/datasets/bigcode/starcoderdata) - [Wikipedia (en)](https://huggingface.co/datasets/olm/olm-wikipedia-20221220) - [Wikipedia (zh)](https://huggingface.co/datasets/pleisto/wikipedia-cn-20230720-filtered) -- 用于指令监督微调: +- 用于指令监督微调: - [Stanford Alpaca (en)](https://github.com/tatsu-lab/stanford_alpaca) - [Stanford Alpaca (zh)](https://github.com/ymcui/Chinese-LLaMA-Alpaca) - [GPT-4 Generated Data (en&zh)](https://github.com/Instruction-Tuning-with-GPT-4/GPT-4-LLM) - [Open Assistant (multilingual)](https://huggingface.co/datasets/OpenAssistant/oasst1) - [Self-cognition (zh)](data/self_cognition.json) - [ShareGPT (zh)](https://huggingface.co/datasets/QingyiSi/Alpaca-CoT/tree/main/Chinese-instruction-collection) - - [RefGPT (zh)](https://github.com/sufengniu/RefGPT) - [Guanaco Dataset (multilingual)](https://huggingface.co/datasets/JosephusCheung/GuanacoDataset) - [BELLE 2M (zh)](https://huggingface.co/datasets/BelleGroup/train_2M_CN) - [BELLE 1M (zh)](https://huggingface.co/datasets/BelleGroup/train_1M_CN) @@ -103,7 +98,7 @@ - [Web QA (zh)](https://huggingface.co/datasets/suolyer/webqa) - [UltraChat (en)](https://github.com/thunlp/UltraChat) - [WebNovel (zh)](https://huggingface.co/datasets/zxbsmk/webnovel_cn) -- 用于奖励模型训练: +- 用于奖励模型或 DPO 训练: - [HH-RLHF (en)](https://huggingface.co/datasets/Anthropic/hh-rlhf) - [Open Assistant (multilingual)](https://huggingface.co/datasets/OpenAssistant/oasst1) - [GPT-4 Generated Data (en&zh)](https://github.com/Instruction-Tuning-with-GPT-4/GPT-4-LLM) @@ -139,7 +134,6 @@ huggingface-cli login ### 环境搭建(可跳过) ```bash -git lfs install git clone https://github.com/hiyouga/LLaMA-Efficient-Tuning.git conda create -n llama_etuning python=3.10 conda activate llama_etuning @@ -161,7 +155,7 @@ CUDA_VISIBLE_DEVICES=0 python src/train_web.py 目前网页 UI 仅支持**单卡训练**。 -### 二次预训练 +### 预训练 ```bash CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ @@ -222,7 +216,7 @@ CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ --resume_lora_training False \ --checkpoint_dir path_to_sft_checkpoint \ --output_dir path_to_rm_checkpoint \ - --per_device_train_batch_size 4 \ + --per_device_train_batch_size 2 \ --gradient_accumulation_steps 4 \ --lr_scheduler_type cosine \ --logging_steps 10 \ @@ -233,7 +227,7 @@ CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ --fp16 ``` -### RLHF 训练 +### PPO 训练 ```bash CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ @@ -257,6 +251,30 @@ CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ --plot_loss ``` +### DPO 训练 + +```bash +CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ + --stage dpo \ + --model_name_or_path path_to_your_model \ + --do_train \ + --dataset comparison_gpt4_zh \ + --template default \ + --finetuning_type lora \ + --resume_lora_training False \ + --checkpoint_dir path_to_sft_checkpoint \ + --output_dir path_to_dpo_checkpoint \ + --per_device_train_batch_size 2 \ + --gradient_accumulation_steps 4 \ + --lr_scheduler_type cosine \ + --logging_steps 10 \ + --save_steps 1000 \ + --learning_rate 1e-5 \ + --num_train_epochs 1.0 \ + --plot_loss \ + --fp16 +``` + ### 多 GPU 分布式训练 ```bash diff --git a/data/dataset_info.json b/data/dataset_info.json index 3a3b4e76..3eaf920e 100644 --- a/data/dataset_info.json +++ b/data/dataset_info.json @@ -49,26 +49,6 @@ "history": "history" } }, - "refgpt_zh_p1": { - "file_name": "refgpt_zh_50k_p1.json", - "file_sha1": "b40f4f4d0ffacd16da7c275b056d5b6670021752", - "columns": { - "prompt": "instruction", - "query": "input", - "response": "output", - "history": "history" - } - }, - "refgpt_zh_p2": { - "file_name": "refgpt_zh_50k_p2.json", - "file_sha1": "181f32b2c60264a29f81f59d3c76095793eae1b0", - "columns": { - "prompt": "instruction", - "query": "input", - "response": "output", - "history": "history" - } - }, "lima": { "file_name": "lima.json", "file_sha1": "9db59f6b7007dc4b17529fc63379b9cd61640f37", diff --git a/data/refgpt_zh_50k_p1.json.REMOVED.git-id b/data/refgpt_zh_50k_p1.json.REMOVED.git-id deleted file mode 100644 index 3e8a9e41..00000000 --- a/data/refgpt_zh_50k_p1.json.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -f967a4f6d04a11308a15524aa9a846a19a8d1e83 \ No newline at end of file diff --git a/data/refgpt_zh_50k_p2.json.REMOVED.git-id b/data/refgpt_zh_50k_p2.json.REMOVED.git-id deleted file mode 100644 index a6525b27..00000000 --- a/data/refgpt_zh_50k_p2.json.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -0a4f0d74fd1c5cab2eb6d84a3a3fe669847becd8 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index c71b6c9c..fb5fa72f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ transformers>=4.29.1 datasets>=2.12.0 accelerate>=0.21.0 peft>=0.4.0 -trl>=0.4.7 +trl>=0.5.0 scipy sentencepiece tiktoken @@ -16,4 +16,3 @@ pydantic==1.10.11 fastapi==0.95.1 sse-starlette matplotlib -huggingface_hub \ No newline at end of file diff --git a/src/api_demo.py b/src/api_demo.py index c0ca9760..777f9dcf 100644 --- a/src/api_demo.py +++ b/src/api_demo.py @@ -7,7 +7,7 @@ def main(): chat_model = ChatModel() app = create_app(chat_model) uvicorn.run(app, host="0.0.0.0", port=8000, workers=1) - # Visit http://localhost:8000/docs for document. + print("Visit http://localhost:8000/docs for API document.") if __name__ == "__main__": diff --git a/src/llmtuner/chat/stream_chat.py b/src/llmtuner/chat/stream_chat.py index 79d3b92d..8220c0b3 100644 --- a/src/llmtuner/chat/stream_chat.py +++ b/src/llmtuner/chat/stream_chat.py @@ -18,7 +18,6 @@ class ChatModel: self.model = self.model.eval() # change to eval mode self.template = get_template_and_fix_tokenizer(data_args.template, self.tokenizer) self.source_prefix = data_args.source_prefix - self.stop_ids = self.tokenizer.convert_tokens_to_ids(self.template.stop_words) self.model.generate = MethodType(PreTrainedModel.generate, self.model) # disable custom method (for Qwen) def process_args( @@ -53,7 +52,7 @@ class ChatModel: top_k=top_k or gen_kwargs["top_k"], repetition_penalty=repetition_penalty or gen_kwargs["repetition_penalty"], logits_processor=get_logits_processor(), - stopping_criteria=get_stopping_criteria(self.stop_ids) + stopping_criteria=get_stopping_criteria(self.tokenizer.additional_special_tokens_ids) )) if max_length: diff --git a/src/llmtuner/dsets/preprocess.py b/src/llmtuner/dsets/preprocess.py index 534d77b5..4efbcbb6 100644 --- a/src/llmtuner/dsets/preprocess.py +++ b/src/llmtuner/dsets/preprocess.py @@ -46,7 +46,6 @@ def preprocess_dataset( k: [t[i: i + block_size] for i in range(0, total_length, block_size)] for k, t in concatenated_examples.items() } - result["labels"] = result["input_ids"].copy() return result def preprocess_supervised_dataset(examples: Dict[str, List[Any]]) -> Dict[str, Any]: @@ -95,24 +94,22 @@ def preprocess_dataset( return model_inputs def preprocess_pairwise_dataset(examples): - # build input pairs with format ` X Y1 ` and ` X Y2 ` - model_inputs = {"accept_ids": [], "reject_ids": []} + # build input pairs with format ` X`, `Y1 ` and `Y2 ` + model_inputs = {"prompt_ids": [], "chosen_ids": [], "rejected_ids": []} for query, response, history, prefix in construct_example(examples): - source_ids, accept_ids = template.encode_oneturn(tokenizer, query, response[0], history, prefix) - source_ids, reject_ids = template.encode_oneturn(tokenizer, query, response[1], history, prefix) + prompt_ids, chosen_ids = template.encode_oneturn(tokenizer, query, response[0], history, prefix) + _, rejected_ids = template.encode_oneturn(tokenizer, query, response[1], history, prefix) - if len(source_ids) > data_args.max_source_length: - source_ids = source_ids[:data_args.max_source_length] - if len(accept_ids) > data_args.max_target_length: - accept_ids = accept_ids[:data_args.max_target_length] - if len(reject_ids) > data_args.max_target_length: - reject_ids = reject_ids[:data_args.max_target_length] + if len(prompt_ids) > data_args.max_source_length: + prompt_ids = prompt_ids[:data_args.max_source_length] + if len(chosen_ids) > data_args.max_target_length: + chosen_ids = chosen_ids[:data_args.max_target_length] + if len(rejected_ids) > data_args.max_target_length: + rejected_ids = rejected_ids[:data_args.max_target_length] - accept_ids = source_ids + accept_ids - reject_ids = source_ids + reject_ids - - model_inputs["accept_ids"].append(accept_ids) - model_inputs["reject_ids"].append(reject_ids) + model_inputs["prompt_ids"].append(prompt_ids) + model_inputs["chosen_ids"].append(chosen_ids) + model_inputs["rejected_ids"].append(rejected_ids) return model_inputs def print_supervised_dataset_example(example): @@ -124,10 +121,12 @@ def preprocess_dataset( ], skip_special_tokens=False))) def print_pairwise_dataset_example(example): - print("accept_ids:\n{}".format(example["accept_ids"])) - print("accepts:\n{}".format(tokenizer.decode(example["accept_ids"], skip_special_tokens=False))) - print("reject_ids:\n{}".format(example["reject_ids"])) - print("rejects:\n{}".format(tokenizer.decode(example["reject_ids"], skip_special_tokens=False))) + print("prompt_ids:\n{}".format(example["prompt_ids"])) + print("prompt:\n{}".format(tokenizer.decode(example["prompt_ids"], skip_special_tokens=False))) + print("chosen_ids:\n{}".format(example["chosen_ids"])) + print("chosen:\n{}".format(tokenizer.decode(example["chosen_ids"], skip_special_tokens=False))) + print("rejected_ids:\n{}".format(example["rejected_ids"])) + print("rejected:\n{}".format(tokenizer.decode(example["rejected_ids"], skip_special_tokens=False))) def print_unsupervised_dataset_example(example): print("input_ids:\n{}".format(example["input_ids"])) diff --git a/src/llmtuner/extras/callbacks.py b/src/llmtuner/extras/callbacks.py index d325b0a8..61deae25 100644 --- a/src/llmtuner/extras/callbacks.py +++ b/src/llmtuner/extras/callbacks.py @@ -7,10 +7,16 @@ from datetime import timedelta from transformers import TrainerCallback from transformers.trainer_utils import has_length +from llmtuner.extras.constants import LOG_FILE_NAME +from llmtuner.extras.logging import get_logger + if TYPE_CHECKING: from transformers import TrainingArguments, TrainerState, TrainerControl +logger = get_logger(__name__) + + class LogCallback(TrainerCallback): def __init__(self, runner=None): @@ -38,6 +44,9 @@ class LogCallback(TrainerCallback): self.in_training = True self.start_time = time.time() self.max_steps = state.max_steps + if os.path.exists(os.path.join(args.output_dir, LOG_FILE_NAME)): + logger.warning("Previous log file in this folder will be deleted.") + os.remove(os.path.join(args.output_dir, LOG_FILE_NAME)) def on_train_end(self, args: "TrainingArguments", state: "TrainerState", control: "TrainerControl", **kwargs): r""" diff --git a/src/llmtuner/extras/constants.py b/src/llmtuner/extras/constants.py index 6f6dbdd7..dc1cb2e7 100644 --- a/src/llmtuner/extras/constants.py +++ b/src/llmtuner/extras/constants.py @@ -1,10 +1,12 @@ IGNORE_INDEX = -100 +LOG_FILE_NAME = "trainer_log.jsonl" + VALUE_HEAD_FILE_NAME = "value_head.bin" FINETUNING_ARGS_NAME = "finetuning_args.json" -LAYERNORM_NAMES = ["norm", "ln_f", "ln_attn", "ln_mlp"] # for LLaMA, BLOOM and Falcon settings +LAYERNORM_NAMES = ["norm", "ln_f", "ln_attn", "ln_mlp"] METHODS = ["full", "freeze", "lora"] diff --git a/src/llmtuner/extras/misc.py b/src/llmtuner/extras/misc.py index e1fbb156..ee918fbb 100644 --- a/src/llmtuner/extras/misc.py +++ b/src/llmtuner/extras/misc.py @@ -1,7 +1,11 @@ import torch from typing import TYPE_CHECKING, List, Optional, Tuple - -from transformers import LogitsProcessor, LogitsProcessorList, StoppingCriteria, StoppingCriteriaList +from transformers import ( + LogitsProcessor, + LogitsProcessorList, + StoppingCriteria, + StoppingCriteriaList +) from llmtuner.extras.constants import LAYERNORM_NAMES diff --git a/src/llmtuner/extras/template.py b/src/llmtuner/extras/template.py index d94d5b37..c3388ab3 100644 --- a/src/llmtuner/extras/template.py +++ b/src/llmtuner/extras/template.py @@ -61,7 +61,7 @@ class Template: prefix: Optional[str] = None ) -> Tuple[List[Union[str, Dict[str, str]]], List[Tuple[str, str]]]: r""" - Aligns inputs to a special format. + Aligns inputs to the standard format. """ prefix = [prefix] if prefix else self.prefix # use prefix if provided history = history if (history and self.use_history) else [] @@ -92,28 +92,32 @@ class Template: ) -> List[Tuple[List[int], List[int]]]: r""" Encodes formatted inputs to pairs of token ids. + Turn 0: bos + prefix + sep + query resp + eos + Turn t: sep + bos + query resp + eos """ bos_ids, eos_ids = self._get_special_ids(tokenizer) sep_ids = self._convert_inputs_to_ids(tokenizer, context=self.sep) encoded_pairs = [] for turn_idx, (query, resp) in enumerate(history): - if turn_idx != 0: - prefix_ids = sep_ids - elif prefix: - prefix_ids = self._convert_inputs_to_ids(tokenizer, context=prefix) + eos_ids + sep_ids + if turn_idx == 0: + if prefix: # has prefix + prefix_ids = bos_ids + self._convert_inputs_to_ids(tokenizer, context=prefix) + sep_ids + else: + prefix_ids = bos_ids else: - prefix_ids = [] + prefix_ids = sep_ids + bos_ids - query_ids = self._convert_inputs_to_ids(tokenizer, context=self.prompt, query=query) + query_ids = self._convert_inputs_to_ids(tokenizer, context=self.prompt, query=query, idx=str(turn_idx)) resp_ids = self._convert_inputs_to_ids(tokenizer, context=[resp]) - encoded_pairs.append((bos_ids + prefix_ids + query_ids, resp_ids + eos_ids)) + encoded_pairs.append((prefix_ids + query_ids, resp_ids + eos_ids)) return encoded_pairs def _convert_inputs_to_ids( self, tokenizer: "PreTrainedTokenizer", context: List[Union[str, Dict[str, str]]], - query: Optional[str] = "" + query: Optional[str] = "", + idx: Optional[str] = "" ) -> List[int]: r""" Converts context to token ids. @@ -127,6 +131,7 @@ class Template: for elem in context: if isinstance(elem, str): elem = elem.replace("{{query}}", query, 1) + elem = elem.replace("{{idx}}", idx, 1) token_ids = token_ids + tokenizer.encode(elem, **kwargs) elif isinstance(elem, dict): token_ids = token_ids + [tokenizer.convert_tokens_to_ids(elem.get("token"))] @@ -146,10 +151,12 @@ class Llama2Template(Template): ) -> List[Tuple[List[int], List[int]]]: r""" Encodes formatted inputs to pairs of token ids. + Turn 0: bos + prefix + query resp + eos + Turn t: bos + query resp + eos """ bos_ids, eos_ids = self._get_special_ids(tokenizer) encoded_pairs = [] - assert isinstance(prefix[0], str), "LLaMA-2 template only accepts list containing a single str." + assert isinstance(prefix[0], str), "LLaMA-2 template only accepts list containing a single string." for turn_idx, (query, resp) in enumerate(history): if turn_idx == 0: # llama2 template has not sep_ids query = prefix[0] + query @@ -187,11 +194,12 @@ def get_template_and_fix_tokenizer( template = templates.get(name, None) assert template is not None, "Template {} does not exist.".format(name) - if tokenizer.eos_token_id is None: # inplace method - if len(template.stop_words): - tokenizer.eos_token = template.stop_words[0] - else: - tokenizer.eos_token = "<|endoftext|>" + if len(template.stop_words): # inplace method + tokenizer.eos_token = template.stop_words[0] + logger.info("Replace eos token: {}".format(tokenizer.eos_token)) + + if tokenizer.eos_token_id is None: + tokenizer.eos_token = "<|endoftext|>" logger.info("Add eos token: {}".format(tokenizer.eos_token)) if tokenizer.pad_token_id is None: @@ -422,12 +430,13 @@ register_template( name="baichuan", prefix=[], prompt=[ - {"token": ""}, - "{{query}}", - {"token": ""} + {"token": ""}, # user token (a little difference in position) + "{{query}}" ], sep=[], - stop_words=[], + stop_words=[ + "" # assistant token + ], use_history=True ) @@ -440,7 +449,8 @@ register_template( name="starchat", prefix=[ {"token": "<|system|>"}, - "\n" + "\n", + {"token": "<|end|>"} ], prompt=[ {"token": "<|user|>"}, @@ -466,7 +476,8 @@ register_template( name="chatml", prefix=[ {"token": "<|im_start|>"}, - "system\nYou are a helpful assistant." + "system\nYou are a helpful assistant.", + {"token": "<|im_end|>"} ], prompt=[ {"token": "<|im_start|>"}, @@ -484,3 +495,23 @@ register_template( ], use_history=True ) + + +r""" +Supports: https://huggingface.co/THUDM/chatglm2-6b +""" +register_template( + name="chatglm2", + prefix=[ + {"token": "[gMASK]"}, + {"token": "sop"} + ], + prompt=[ + "[Round {{idx}}]\n\n问:{{query}}\n\n答:" + ], + sep=[ + "\n\n" + ], + stop_words=[], + use_history=True +) diff --git a/src/llmtuner/hparams/data_args.py b/src/llmtuner/hparams/data_args.py index de470ae2..7d1c982c 100644 --- a/src/llmtuner/hparams/data_args.py +++ b/src/llmtuner/hparams/data_args.py @@ -24,7 +24,7 @@ class DatasetAttr: @dataclass class DataArguments: - """ + r""" Arguments pertaining to what data we are going to input our model for training and evaluation. """ template: str = field( diff --git a/src/llmtuner/hparams/finetuning_args.py b/src/llmtuner/hparams/finetuning_args.py index 277602ae..c4713c5e 100644 --- a/src/llmtuner/hparams/finetuning_args.py +++ b/src/llmtuner/hparams/finetuning_args.py @@ -5,7 +5,7 @@ from dataclasses import asdict, dataclass, field @dataclass class FinetuningArguments: - """ + r""" Arguments pertaining to which techniques we are going to fine-tuning with. """ finetuning_type: Optional[Literal["none", "freeze", "lora", "full"]] = field( @@ -14,7 +14,7 @@ class FinetuningArguments: ) num_hidden_layers: Optional[int] = field( default=32, - metadata={"help": "Number of decoder blocks in the model. \ + metadata={"help": "Number of decoder blocks in the model for partial-parameter (freeze) fine-tuning. \ LLaMA choices: [\"32\", \"40\", \"60\", \"80\"], \ LLaMA-2 choices: [\"32\", \"40\", \"80\"], \ BLOOM choices: [\"24\", \"30\", \"70\"], \ @@ -25,16 +25,16 @@ class FinetuningArguments: ) num_layer_trainable: Optional[int] = field( default=3, - metadata={"help": "Number of trainable layers for Freeze fine-tuning."} + metadata={"help": "Number of trainable layers for partial-parameter (freeze) fine-tuning."} ) name_module_trainable: Optional[Literal["mlp", "self_attn", "self_attention"]] = field( default="mlp", - metadata={"help": "Name of trainable modules for Freeze fine-tuning. \ - LLaMA & LLaMA-2 choices: [\"mlp\", \"self_attn\"], \ + metadata={"help": "Name of trainable modules for partial-parameter (freeze) fine-tuning. \ + LLaMA choices: [\"mlp\", \"self_attn\"], \ BLOOM & Falcon choices: [\"mlp\", \"self_attention\"], \ Baichuan choices: [\"mlp\", \"self_attn\"], \ Qwen choices: [\"mlp\", \"attn\"], \ - InternLM, XVERSE choices: the same as LLaMA."} + LLaMA-2, InternLM, XVERSE choices: the same as LLaMA."} ) lora_rank: Optional[int] = field( default=8, @@ -51,11 +51,15 @@ class FinetuningArguments: lora_target: Optional[str] = field( default="q_proj,v_proj", metadata={"help": "Name(s) of target modules to apply LoRA. Use commas to separate multiple modules. \ - LLaMA & LLaMA-2 choices: [\"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\", \"gate_proj\", \"up_proj\", \"down_proj\"], \ + LLaMA choices: [\"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\", \"gate_proj\", \"up_proj\", \"down_proj\"], \ BLOOM & Falcon choices: [\"query_key_value\", \"self_attention.dense\", \"mlp.dense\"], \ Baichuan choices: [\"W_pack\", \"o_proj\", \"gate_proj\", \"up_proj\", \"down_proj\"], \ Qwen choices: [\"c_attn\", \"attn.c_proj\", \"w1\", \"w2\", \"mlp.c_proj\"], \ - InternLM, XVERSE choices: the same as LLaMA."} + LLaMA-2, InternLM, XVERSE choices: the same as LLaMA."} + ) + dpo_beta: Optional[float] = field( + default=0.1, + metadata={"help": "The beta parameter for the DPO loss."} ) def __post_init__(self): @@ -72,14 +76,14 @@ class FinetuningArguments: assert self.finetuning_type in ["none", "freeze", "lora", "full"], "Invalid fine-tuning method." def save_to_json(self, json_path: str): - """Saves the content of this instance in JSON format inside `json_path`.""" + r"""Saves the content of this instance in JSON format inside `json_path`.""" json_string = json.dumps(asdict(self), indent=2, sort_keys=True) + "\n" with open(json_path, "w", encoding="utf-8") as f: f.write(json_string) @classmethod def load_from_json(cls, json_path: str): - """Creates an instance from the content of `json_path`.""" + r"""Creates an instance from the content of `json_path`.""" with open(json_path, "r", encoding="utf-8") as f: text = f.read() return cls(**json.loads(text)) diff --git a/src/llmtuner/hparams/general_args.py b/src/llmtuner/hparams/general_args.py index 397d3019..c0c1a0de 100644 --- a/src/llmtuner/hparams/general_args.py +++ b/src/llmtuner/hparams/general_args.py @@ -4,10 +4,10 @@ from dataclasses import dataclass, field @dataclass class GeneralArguments: - """ + r""" Arguments pertaining to which stage we are going to perform. """ - stage: Optional[Literal["pt", "sft", "rm", "ppo"]] = field( + stage: Optional[Literal["pt", "sft", "rm", "ppo", "dpo"]] = field( default="sft", metadata={"help": "Which stage will be performed in training."} ) diff --git a/src/llmtuner/hparams/generating_args.py b/src/llmtuner/hparams/generating_args.py index e25ff4b9..f8b935fb 100644 --- a/src/llmtuner/hparams/generating_args.py +++ b/src/llmtuner/hparams/generating_args.py @@ -4,7 +4,7 @@ from dataclasses import asdict, dataclass, field @dataclass class GeneratingArguments: - """ + r""" Arguments pertaining to specify the decoding parameters. """ do_sample: Optional[bool] = field( diff --git a/src/llmtuner/hparams/model_args.py b/src/llmtuner/hparams/model_args.py index 94e882fe..6c8491da 100644 --- a/src/llmtuner/hparams/model_args.py +++ b/src/llmtuner/hparams/model_args.py @@ -1,12 +1,11 @@ import torch from typing import Literal, Optional from dataclasses import dataclass, field -from huggingface_hub.hf_api import HfFolder @dataclass class ModelArguments: - """ + r""" Arguments pertaining to which model/config/tokenizer we are going to fine-tune. """ model_name_or_path: str = field( @@ -64,12 +63,11 @@ class ModelArguments: default=False, metadata={"help": "Whether to plot the training loss after fine-tuning or not."} ) - hf_hub_token : Optional[str] = field( + hf_auth_token: Optional[str] = field( default=None, - metadata={"help": "Path to the directory containing the checkpoints of the reward model."} + metadata={"help": "Auth token to log in with Hugging Face Hub."} ) - def __post_init__(self): if self.checkpoint_dir is not None: # support merging multiple lora weights self.checkpoint_dir = [cd.strip() for cd in self.checkpoint_dir.split(",")] @@ -77,5 +75,6 @@ class ModelArguments: if self.quantization_bit is not None: assert self.quantization_bit in [4, 8], "We only accept 4-bit or 8-bit quantization." - if self.use_auth_token == True and self.hf_hub_token != None: - HfFolder.save_token(self.hf_hub_token) + if self.use_auth_token == True and self.hf_auth_token is not None: + from huggingface_hub.hf_api import HfFolder # lazy load + HfFolder.save_token(self.hf_auth_token) diff --git a/src/llmtuner/tuner/core/adapter.py b/src/llmtuner/tuner/core/adapter.py index 4afad13a..a8ac5a84 100644 --- a/src/llmtuner/tuner/core/adapter.py +++ b/src/llmtuner/tuner/core/adapter.py @@ -39,7 +39,7 @@ def init_adapter( if finetuning_args.finetuning_type == "none" and is_trainable: raise ValueError("You cannot use finetuning_type=none while training.") - if finetuning_args.finetuning_type == "full": + if finetuning_args.finetuning_type == "full" and is_trainable: logger.info("Fine-tuning method: Full") model = model.float() diff --git a/src/llmtuner/tuner/core/loader.py b/src/llmtuner/tuner/core/loader.py index c06eabfa..39bec1d8 100644 --- a/src/llmtuner/tuner/core/loader.py +++ b/src/llmtuner/tuner/core/loader.py @@ -34,7 +34,7 @@ check_min_version("4.29.1") require_version("datasets>=2.12.0", "To fix: pip install datasets>=2.12.0") require_version("accelerate>=0.21.0", "To fix: pip install accelerate>=0.21.0") require_version("peft>=0.4.0", "To fix: pip install peft>=0.4.0") -require_version("trl>=0.4.7", "To fix: pip install trl>=0.4.7") +require_version("trl>=0.5.0", "To fix: pip install trl>=0.5.0") def load_model_and_tokenizer( @@ -52,9 +52,6 @@ def load_model_and_tokenizer( logger.warning("Checkpoint is not found at evaluation, load the original model.") finetuning_args = FinetuningArguments(finetuning_type="none") - assert stage in ["pt", "sft"] or finetuning_args.finetuning_type == "lora", \ - "RM and PPO training can only be performed with the LoRA method." - config_kwargs = { "trust_remote_code": True, "cache_dir": model_args.cache_dir, @@ -132,8 +129,6 @@ def load_model_and_tokenizer( }) if stage == "ppo": # load reward model - assert is_trainable, "PPO stage cannot be performed at evaluation." - assert model_args.reward_model is not None, "Reward model is necessary for PPO training." logger.info("Load reward model from {}".format(model_args.reward_model)) model.pretrained_model.load_adapter(model_args.reward_model, "reward", is_trainable=False) assert load_valuehead_params(model, model_args.reward_model), "Reward model is not correctly loaded." diff --git a/src/llmtuner/tuner/core/parser.py b/src/llmtuner/tuner/core/parser.py index 692f9b13..c5bdbe16 100644 --- a/src/llmtuner/tuner/core/parser.py +++ b/src/llmtuner/tuner/core/parser.py @@ -19,7 +19,7 @@ from llmtuner.hparams import ( logger = get_logger(__name__) -def _parse_args(parser: HfArgumentParser, args: Optional[Dict[str, Any]] = None): +def _parse_args(parser: HfArgumentParser, args: Optional[Dict[str, Any]] = None) -> Tuple[Any]: if args is not None: return parser.parse_dict(args) elif len(sys.argv) == 2 and sys.argv[1].endswith(".yaml"): @@ -32,26 +32,53 @@ def _parse_args(parser: HfArgumentParser, args: Optional[Dict[str, Any]] = None) def parse_train_args( args: Optional[Dict[str, Any]] = None -) -> Tuple[ModelArguments, DataArguments, Seq2SeqTrainingArguments, FinetuningArguments, GeneralArguments]: +) -> Tuple[ + ModelArguments, + DataArguments, + Seq2SeqTrainingArguments, + FinetuningArguments, + GeneratingArguments, + GeneralArguments +]: parser = HfArgumentParser(( - ModelArguments, DataArguments, Seq2SeqTrainingArguments, FinetuningArguments, GeneralArguments + ModelArguments, + DataArguments, + Seq2SeqTrainingArguments, + FinetuningArguments, + GeneratingArguments, + GeneralArguments )) return _parse_args(parser, args) def parse_infer_args( args: Optional[Dict[str, Any]] = None -) -> Tuple[ModelArguments, DataArguments, FinetuningArguments, GeneratingArguments]: +) -> Tuple[ + ModelArguments, + DataArguments, + FinetuningArguments, + GeneratingArguments +]: parser = HfArgumentParser(( - ModelArguments, DataArguments, FinetuningArguments, GeneratingArguments + ModelArguments, + DataArguments, + FinetuningArguments, + GeneratingArguments )) return _parse_args(parser, args) def get_train_args( args: Optional[Dict[str, Any]] = None -) -> Tuple[ModelArguments, DataArguments, Seq2SeqTrainingArguments, FinetuningArguments, GeneralArguments]: - model_args, data_args, training_args, finetuning_args, general_args = parse_train_args(args) +) -> Tuple[ + ModelArguments, + DataArguments, + Seq2SeqTrainingArguments, + FinetuningArguments, + GeneratingArguments, + GeneralArguments +]: + model_args, data_args, training_args, finetuning_args, generating_args, general_args = parse_train_args(args) # Setup logging if training_args.should_log: @@ -68,7 +95,7 @@ def get_train_args( data_args.init_for_training() if general_args.stage != "sft" and training_args.predict_with_generate: - raise ValueError("`predict_with_generate` cannot be set as True at PT, RM and PPO stages.") + raise ValueError("`predict_with_generate` cannot be set as True except SFT.") if training_args.do_train and training_args.predict_with_generate: raise ValueError("`predict_with_generate` cannot be set as True while training.") @@ -76,6 +103,15 @@ def get_train_args( if general_args.stage == "sft" and training_args.do_predict and not training_args.predict_with_generate: raise ValueError("Please enable `predict_with_generate` to save model predictions.") + if general_args.stage in ["rm", "ppo"] and finetuning_args.finetuning_type != "lora": + raise ValueError("RM and PPO training can only be performed with the LoRA method.") + + if general_args.stage in ["ppo", "dpo"] and not training_args.do_train: + raise ValueError("PPO and DPO stage can only be performed at training.") + + if general_args.stage == "ppo" and model_args.reward_model is None: + raise ValueError("Reward model is necessary for PPO training.") + if training_args.max_steps == -1 and data_args.streaming: raise ValueError("Please specify `max_steps` in streaming mode.") @@ -133,12 +169,17 @@ def get_train_args( # Set seed before initializing model. transformers.set_seed(training_args.seed) - return model_args, data_args, training_args, finetuning_args, general_args + return model_args, data_args, training_args, finetuning_args, generating_args, general_args def get_infer_args( args: Optional[Dict[str, Any]] = None -) -> Tuple[ModelArguments, DataArguments, FinetuningArguments, GeneratingArguments]: +) -> Tuple[ + ModelArguments, + DataArguments, + FinetuningArguments, + GeneratingArguments +]: model_args, data_args, finetuning_args, generating_args = parse_infer_args(args) if model_args.quantization_bit is not None and finetuning_args.finetuning_type != "lora": diff --git a/src/llmtuner/tuner/core/trainer.py b/src/llmtuner/tuner/core/trainer.py index ae80f32f..058bb740 100644 --- a/src/llmtuner/tuner/core/trainer.py +++ b/src/llmtuner/tuner/core/trainer.py @@ -13,26 +13,25 @@ from llmtuner.extras.logging import get_logger from llmtuner.extras.save_and_load import get_state_dict, load_trainable_params if TYPE_CHECKING: + from transformers import PreTrainedTokenizer, Seq2SeqTrainingArguments, TrainerState from llmtuner.hparams import FinetuningArguments logger = get_logger(__name__) -class PeftTrainer(Seq2SeqTrainer): +class PeftModelMixin: r""" - Inherits Seq2SeqTrainer to support parameter-efficient checkpoints. + Patches the save and load methods in Hugging Face Trainer for PeftModel and ModelWithValueHead. """ - def __init__(self, finetuning_args: "FinetuningArguments", **kwargs): - super().__init__(**kwargs) - self.finetuning_args = finetuning_args - self._remove_log() - - def _remove_log(self): - if self.is_world_process_zero() and os.path.exists(os.path.join(self.args.output_dir, "trainer_log.jsonl")): - logger.warning("Previous log file in this folder will be deleted.") - os.remove(os.path.join(self.args.output_dir, "trainer_log.jsonl")) + def __init__(self) -> None: # for type checking + self.model: PreTrainedModel = None + self.tokenizer: "PreTrainedTokenizer" = None + self.args: "Seq2SeqTrainingArguments" = None + self.finetuning_args: "FinetuningArguments" = None + self.state: "TrainerState" = None + raise AssertionError("Mixin should not be initialized.") def _save(self, output_dir: Optional[str] = None, state_dict: Optional[Dict[str, torch.Tensor]] = None) -> None: r""" @@ -96,3 +95,13 @@ class PeftTrainer(Seq2SeqTrainer): model.load_adapter(self.state.best_model_checkpoint, model.active_adapter) else: # freeze/full-tuning load_trainable_params(model, self.state.best_model_checkpoint) + + +class PeftTrainer(PeftModelMixin, Seq2SeqTrainer): + r""" + Inherits Seq2SeqTrainer to support parameter-efficient checkpoints. + """ + + def __init__(self, finetuning_args: "FinetuningArguments", **kwargs): + Seq2SeqTrainer.__init__(self, **kwargs) + self.finetuning_args = finetuning_args diff --git a/src/llmtuner/tuner/dpo/__init__.py b/src/llmtuner/tuner/dpo/__init__.py new file mode 100644 index 00000000..f2b5cfb5 --- /dev/null +++ b/src/llmtuner/tuner/dpo/__init__.py @@ -0,0 +1 @@ +from llmtuner.tuner.dpo.workflow import run_dpo diff --git a/src/llmtuner/tuner/dpo/collator.py b/src/llmtuner/tuner/dpo/collator.py new file mode 100644 index 00000000..2f0f4bdc --- /dev/null +++ b/src/llmtuner/tuner/dpo/collator.py @@ -0,0 +1,51 @@ +import torch +from dataclasses import dataclass +from typing import Any, Dict, List, Sequence, Tuple +from transformers import DataCollatorForSeq2Seq + + +@dataclass +class DPODataCollatorWithPadding(DataCollatorForSeq2Seq): + r""" + Data collator for pairwise data. + """ + + def _pad_labels(self, batch: torch.Tensor, positions: List[Tuple[int, int]]) -> torch.Tensor: + padded_labels = [] + for feature, (prompt_len, answer_len) in zip(batch, positions): + if self.tokenizer.padding_side == "left": + start, end = feature.size(0) - answer_len, feature.size(0) + else: + start, end = prompt_len, answer_len + padded_tensor = self.label_pad_token_id * torch.ones_like(feature) + padded_tensor[start:end] = feature[start:end] + padded_labels.append(padded_tensor) + return torch.stack(padded_labels, dim=0).contiguous() # in contiguous memory + + def __call__(self, features: Sequence[Dict[str, Any]]) -> Dict[str, torch.Tensor]: + r""" + Pads batched data to the longest sequence in the batch. + + We generate 2 * n examples where the first n examples represent chosen examples and + the last n examples represent rejected examples. + """ + concatenated_features = [] + label_positions = [] + for key in ("chosen_ids", "rejected_ids"): + for feature in features: + prompt_len, answer_len = len(feature["prompt_ids"]), len(feature[key]) + concatenated_features.append({ + "input_ids": feature["prompt_ids"] + feature[key], + "attention_mask": [1] * (prompt_len + answer_len) + }) + label_positions.append((prompt_len, answer_len)) + + batch = self.tokenizer.pad( + concatenated_features, + padding=self.padding, + max_length=self.max_length, + pad_to_multiple_of=self.pad_to_multiple_of, + return_tensors=self.return_tensors, + ) + batch["labels"] = self._pad_labels(batch["input_ids"], label_positions) + return batch diff --git a/src/llmtuner/tuner/dpo/trainer.py b/src/llmtuner/tuner/dpo/trainer.py new file mode 100644 index 00000000..a94642c1 --- /dev/null +++ b/src/llmtuner/tuner/dpo/trainer.py @@ -0,0 +1,75 @@ +import torch +from collections import defaultdict +from peft import PeftModel +from typing import TYPE_CHECKING, Dict, Optional, Tuple, Union +from transformers import Trainer +from trl import DPOTrainer + +from llmtuner.extras.constants import IGNORE_INDEX +from llmtuner.tuner.core.trainer import PeftModelMixin + +if TYPE_CHECKING: + from transformers import PreTrainedModel + from llmtuner.hparams import FinetuningArguments, GeneratingArguments + + +class DPOPeftTrainer(PeftModelMixin, DPOTrainer): + + def __init__( + self, + finetuning_args: "FinetuningArguments", + generating_args: "GeneratingArguments", + ref_model: Optional[Union["PreTrainedModel", torch.nn.Module]] = None, + **kwargs + ): + self.finetuning_args = finetuning_args + self.generating_args = generating_args + self.ref_model = ref_model + self.use_dpo_data_collator = True # hack to avoid warning + self.label_pad_token_id = IGNORE_INDEX + self.padding_value = 0 + self.beta = finetuning_args.dpo_beta + self._stored_metrics = defaultdict(lambda: defaultdict(list)) + + Trainer.__init__(self, **kwargs) + if ref_model is not None: + if hasattr(self, "accelerator"): + self.ref_model = self.accelerator.prepare_model(self.ref_model, evaluation_mode=True) + else: + raise AttributeError("Please update `transformers`.") + + def concatenated_forward( + self, + model: Optional[torch.nn.Module] = None, + batch: Optional[Dict[str, torch.Tensor]] = None + ) -> Tuple[torch.FloatTensor, torch.FloatTensor, torch.FloatTensor, torch.FloatTensor]: + unwrapped_model: "PreTrainedModel" = self.accelerator.unwrap_model(self.model) + if not torch.is_grad_enabled(): + unwrapped_model.gradient_checkpointing_disable() + + if model is None and isinstance(unwrapped_model, PeftModel): # peft model has no ref_model + with unwrapped_model.disable_adapter(): + all_logits: torch.Tensor = self.model( + batch["input_ids"], + attention_mask=batch["attention_mask"], + return_dict=True + ).logits.to(torch.float32) + else: + all_logits: torch.Tensor = model( + batch["input_ids"], + attention_mask=batch["attention_mask"], + return_dict=True + ).logits.to(torch.float32) + + if not torch.is_grad_enabled(): + unwrapped_model.gradient_checkpointing_enable() + + all_logps = self._get_batch_logps( + all_logits, + batch["labels"], + average_log_prob=False + ) + batch_size = batch["input_ids"].size(0) // 2 + chosen_logps, rejected_logps = all_logps.split(batch_size, dim=0) + chosen_logits, rejected_logits = all_logits.split(batch_size, dim=0) + return chosen_logps, rejected_logps, chosen_logits, rejected_logits diff --git a/src/llmtuner/tuner/dpo/workflow.py b/src/llmtuner/tuner/dpo/workflow.py new file mode 100644 index 00000000..350d64a7 --- /dev/null +++ b/src/llmtuner/tuner/dpo/workflow.py @@ -0,0 +1,59 @@ +# Inspired by: https://github.com/huggingface/trl/blob/main/examples/research_projects/stack_llama_2/scripts/dpo_llama2.py + +from copy import deepcopy +from peft import PeftModel +from typing import TYPE_CHECKING, Optional, List + +from llmtuner.dsets import get_dataset, preprocess_dataset, split_dataset +from llmtuner.extras.constants import IGNORE_INDEX +from llmtuner.extras.ploting import plot_loss +from llmtuner.tuner.core import load_model_and_tokenizer +from llmtuner.tuner.dpo.collator import DPODataCollatorWithPadding +from llmtuner.tuner.dpo.trainer import DPOPeftTrainer + +if TYPE_CHECKING: + from transformers import Seq2SeqTrainingArguments, TrainerCallback + from llmtuner.hparams import ModelArguments, DataArguments, FinetuningArguments, GeneratingArguments + + +def run_dpo( + model_args: "ModelArguments", + data_args: "DataArguments", + training_args: "Seq2SeqTrainingArguments", + finetuning_args: "FinetuningArguments", + generating_args: "GeneratingArguments", + callbacks: Optional[List["TrainerCallback"]] = None +): + dataset = get_dataset(model_args, data_args) + model, tokenizer = load_model_and_tokenizer(model_args, finetuning_args, training_args.do_train, stage="sft") + dataset = preprocess_dataset(dataset, tokenizer, data_args, training_args, stage="rm") + data_collator = DPODataCollatorWithPadding( + tokenizer=tokenizer, + label_pad_token_id=IGNORE_INDEX if data_args.ignore_pad_token_for_loss else tokenizer.pad_token_id + ) + + training_args.remove_unused_columns = False # important for pairwise dataset + ref_model = deepcopy(model) if not isinstance(model, PeftModel) else None + + # Initialize our Trainer + trainer = DPOPeftTrainer( + finetuning_args=finetuning_args, + generating_args=generating_args, + ref_model=ref_model, + model=model, + args=training_args, + tokenizer=tokenizer, + data_collator=data_collator, + callbacks=callbacks, + **split_dataset(dataset, data_args, training_args) + ) + + # Training + if training_args.do_train: + train_result = trainer.train() + trainer.log_metrics("train", train_result.metrics) + trainer.save_metrics("train", train_result.metrics) + trainer.save_state() + trainer.save_model() + if trainer.is_world_process_zero() and model_args.plot_loss: + plot_loss(training_args.output_dir, keys=["loss", "eval_loss"]) diff --git a/src/llmtuner/tuner/ppo/trainer.py b/src/llmtuner/tuner/ppo/trainer.py index 3392aa4d..26a8db99 100644 --- a/src/llmtuner/tuner/ppo/trainer.py +++ b/src/llmtuner/tuner/ppo/trainer.py @@ -10,7 +10,7 @@ from trl import PPOTrainer from trl.core import LengthSampler from llmtuner.extras.logging import get_logger -from llmtuner.extras.misc import AverageMeter, count_parameters, get_logits_processor +from llmtuner.extras.misc import AverageMeter, count_parameters, get_logits_processor, get_stopping_criteria from llmtuner.tuner.core.trainer import PeftTrainer from llmtuner.tuner.ppo.utils import cast_layernorm_dtype, replace_model @@ -18,7 +18,7 @@ if TYPE_CHECKING: from transformers import Seq2SeqTrainingArguments from trl import AutoModelForCausalLMWithValueHead from llmtuner.extras.callbacks import LogCallback - from llmtuner.hparams import FinetuningArguments + from llmtuner.hparams import FinetuningArguments, GeneratingArguments logger = get_logger(__name__) @@ -33,16 +33,17 @@ class PPOPeftTrainer(PPOTrainer, PeftTrainer): self, training_args: "Seq2SeqTrainingArguments", finetuning_args: "FinetuningArguments", + generating_args: "GeneratingArguments", callbacks: List["LogCallback"], **kwargs ): PPOTrainer.__init__(self, **kwargs) self.args = training_args self.finetuning_args = finetuning_args + self.generating_args = generating_args self.log_callback = callbacks[0] self.state = TrainerState() self.control = TrainerControl() - self._remove_log() def ppo_train(self, max_target_length: int) -> None: r""" @@ -72,14 +73,10 @@ class PPOPeftTrainer(PPOTrainer, PeftTrainer): logger.info(f" Number of trainable parameters = {count_parameters(self.model)[0]}") # Keyword arguments for `model.generate` - gen_kwargs = { - "top_k": 0.0, - "top_p": 1.0, - "do_sample": True, - "pad_token_id": self.tokenizer.pad_token_id, - "eos_token_id": self.tokenizer.eos_token_id, - "logits_processor": get_logits_processor() - } + gen_kwargs = self.generating_args.to_dict() + gen_kwargs["logits_processor"] = get_logits_processor() + gen_kwargs["stopping_criteria"] = get_stopping_criteria(self.tokenizer.additional_special_tokens_ids) + length_sampler = LengthSampler(max_target_length // 2, max_target_length) unwrapped_model: "AutoModelForCausalLMWithValueHead" = self.accelerator.unwrap_model(self.model) diff --git a/src/llmtuner/tuner/ppo/workflow.py b/src/llmtuner/tuner/ppo/workflow.py index aa372671..6734ab78 100644 --- a/src/llmtuner/tuner/ppo/workflow.py +++ b/src/llmtuner/tuner/ppo/workflow.py @@ -1,11 +1,9 @@ -# Inspired by: -# https://github.com/lvwerra/trl/blob/main/examples/research_projects/stack_llama/scripts/rl_training.py +# Inspired by: https://github.com/lvwerra/trl/blob/main/examples/research_projects/stack_llama/scripts/rl_training.py import math -from typing import TYPE_CHECKING from trl import PPOConfig from torch.optim import AdamW -from typing import Optional, List +from typing import TYPE_CHECKING, Optional, List from transformers import DataCollatorForSeq2Seq from transformers.optimization import get_scheduler @@ -16,7 +14,7 @@ from llmtuner.tuner.ppo.trainer import PPOPeftTrainer if TYPE_CHECKING: from transformers import Seq2SeqTrainingArguments, TrainerCallback - from llmtuner.hparams import ModelArguments, DataArguments, FinetuningArguments + from llmtuner.hparams import ModelArguments, DataArguments, FinetuningArguments, GeneratingArguments def run_ppo( @@ -24,6 +22,7 @@ def run_ppo( data_args: "DataArguments", training_args: "Seq2SeqTrainingArguments", finetuning_args: "FinetuningArguments", + generating_args: "GeneratingArguments", callbacks: Optional[List["TrainerCallback"]] = None ): dataset = get_dataset(model_args, data_args) @@ -42,8 +41,9 @@ def run_ppo( ) optimizer = AdamW(filter(lambda p: p.requires_grad, model.parameters()), lr=training_args.learning_rate) - total_train_batch_size = \ + total_train_batch_size = ( training_args.per_device_train_batch_size * training_args.gradient_accumulation_steps * training_args.world_size + ) num_training_steps = training_args.num_train_epochs * math.ceil(len(dataset) / total_train_batch_size) lr_scheduler = get_scheduler( training_args.lr_scheduler_type, @@ -56,6 +56,7 @@ def run_ppo( ppo_trainer = PPOPeftTrainer( training_args=training_args, finetuning_args=finetuning_args, + generating_args=generating_args, callbacks=callbacks, config=ppo_config, model=model, @@ -67,8 +68,10 @@ def run_ppo( lr_scheduler=lr_scheduler ) - ppo_trainer.ppo_train(max_target_length=data_args.max_target_length) - ppo_trainer.save_model() - ppo_trainer.save_state() # must be after save_model - if ppo_trainer.is_world_process_zero() and model_args.plot_loss: - plot_loss(training_args.output_dir, keys=["loss", "reward"]) + # Training + if training_args.do_train: + ppo_trainer.ppo_train(max_target_length=data_args.max_target_length) + ppo_trainer.save_model() + ppo_trainer.save_state() # must be called after save_model to have a folder + if ppo_trainer.is_world_process_zero() and model_args.plot_loss: + plot_loss(training_args.output_dir, keys=["loss", "reward"]) diff --git a/src/llmtuner/tuner/pt/workflow.py b/src/llmtuner/tuner/pt/workflow.py index b4ea148b..f7bf6448 100644 --- a/src/llmtuner/tuner/pt/workflow.py +++ b/src/llmtuner/tuner/pt/workflow.py @@ -2,10 +2,9 @@ import math from typing import TYPE_CHECKING, Optional, List -from transformers import DataCollatorForSeq2Seq +from transformers import DataCollatorForLanguageModeling from llmtuner.dsets import get_dataset, preprocess_dataset, split_dataset -from llmtuner.extras.constants import IGNORE_INDEX from llmtuner.extras.ploting import plot_loss from llmtuner.tuner.core import load_model_and_tokenizer from llmtuner.tuner.core.trainer import PeftTrainer @@ -25,10 +24,7 @@ def run_pt( dataset = get_dataset(model_args, data_args) model, tokenizer = load_model_and_tokenizer(model_args, finetuning_args, training_args.do_train, stage="pt") dataset = preprocess_dataset(dataset, tokenizer, data_args, training_args, stage="pt") - data_collator = DataCollatorForSeq2Seq( - tokenizer=tokenizer, - label_pad_token_id=IGNORE_INDEX if data_args.ignore_pad_token_for_loss else tokenizer.pad_token_id - ) + data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False) # Initialize our Trainer trainer = PeftTrainer( diff --git a/src/llmtuner/tuner/rm/collator.py b/src/llmtuner/tuner/rm/collator.py index c0da0579..161f003d 100644 --- a/src/llmtuner/tuner/rm/collator.py +++ b/src/llmtuner/tuner/rm/collator.py @@ -1,8 +1,10 @@ import torch +from dataclasses import dataclass from typing import Any, Dict, Sequence from transformers import DataCollatorWithPadding +@dataclass class PairwiseDataCollatorWithPadding(DataCollatorWithPadding): r""" Data collator for pairwise data. @@ -16,7 +18,10 @@ class PairwiseDataCollatorWithPadding(DataCollatorWithPadding): the last n examples represent rejected examples. """ features = [ - {"input_ids": feature[key], "attention_mask": [1] * len(feature[key])} - for key in ("accept_ids", "reject_ids") for feature in features + { + "input_ids": feature["prompt_ids"] + feature[key], + "attention_mask": [1] * (len(feature["prompt_ids"]) + len(feature[key])) + } + for key in ("chosen_ids", "rejected_ids") for feature in features ] return super().__call__(features) diff --git a/src/llmtuner/tuner/sft/trainer.py b/src/llmtuner/tuner/sft/trainer.py index 21739ac1..6243928f 100644 --- a/src/llmtuner/tuner/sft/trainer.py +++ b/src/llmtuner/tuner/sft/trainer.py @@ -79,7 +79,7 @@ class Seq2SeqPeftTrainer(PeftTrainer): padded_tensor = pad_token_id * torch.ones_like(tgt_tensor) padded_tensor[:, -src_tensor.shape[-1]:] = src_tensor # adopt left-padding - return padded_tensor.contiguous() + return padded_tensor.contiguous() # in contiguous memory def save_predictions( self, diff --git a/src/llmtuner/tuner/sft/workflow.py b/src/llmtuner/tuner/sft/workflow.py index a5cd2cd3..10f7aafb 100644 --- a/src/llmtuner/tuner/sft/workflow.py +++ b/src/llmtuner/tuner/sft/workflow.py @@ -5,7 +5,7 @@ from transformers import DataCollatorForSeq2Seq from llmtuner.dsets import get_dataset, preprocess_dataset, split_dataset from llmtuner.extras.constants import IGNORE_INDEX -from llmtuner.extras.misc import get_logits_processor +from llmtuner.extras.misc import get_logits_processor, get_stopping_criteria from llmtuner.extras.ploting import plot_loss from llmtuner.tuner.core import load_model_and_tokenizer from llmtuner.tuner.sft.metric import ComputeMetrics @@ -13,7 +13,7 @@ from llmtuner.tuner.sft.trainer import Seq2SeqPeftTrainer if TYPE_CHECKING: from transformers import Seq2SeqTrainingArguments, TrainerCallback - from llmtuner.hparams import ModelArguments, DataArguments, FinetuningArguments + from llmtuner.hparams import ModelArguments, DataArguments, FinetuningArguments, GeneratingArguments def run_sft( @@ -21,6 +21,7 @@ def run_sft( data_args: "DataArguments", training_args: "Seq2SeqTrainingArguments", finetuning_args: "FinetuningArguments", + generating_args: "GeneratingArguments", callbacks: Optional[List["TrainerCallback"]] = None ): dataset = get_dataset(model_args, data_args) @@ -50,13 +51,9 @@ def run_sft( ) # Keyword arguments for `model.generate` - gen_kwargs = { - "do_sample": True, - "top_p": 0.7, - "max_new_tokens": data_args.max_target_length + 1, - "temperature": 0.95, - "logits_processor": get_logits_processor() - } + gen_kwargs = generating_args.to_dict() + gen_kwargs["logits_processor"] = get_logits_processor() + gen_kwargs["stopping_criteria"] = get_stopping_criteria(tokenizer.additional_special_tokens_ids) # Training if training_args.do_train: diff --git a/src/llmtuner/tuner/tune.py b/src/llmtuner/tuner/tune.py index 99f5d2a9..dee49ef4 100644 --- a/src/llmtuner/tuner/tune.py +++ b/src/llmtuner/tuner/tune.py @@ -1,35 +1,47 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional from llmtuner.extras.callbacks import LogCallback +from llmtuner.extras.logging import get_logger from llmtuner.tuner.core import get_train_args, load_model_and_tokenizer from llmtuner.tuner.pt import run_pt from llmtuner.tuner.sft import run_sft from llmtuner.tuner.rm import run_rm from llmtuner.tuner.ppo import run_ppo +from llmtuner.tuner.dpo import run_dpo if TYPE_CHECKING: from transformers import TrainerCallback +logger = get_logger(__name__) + + def run_exp(args: Optional[Dict[str, Any]] = None, callbacks: Optional[List["TrainerCallback"]] = None): - model_args, data_args, training_args, finetuning_args, general_args = get_train_args(args) - callbacks = [LogCallback()] if callbacks is None else callbacks + model_args, data_args, training_args, finetuning_args, generating_args, general_args = get_train_args(args) + callbacks = [LogCallback()] if callbacks is None else callbacks + [LogCallback()] if general_args.stage == "pt": run_pt(model_args, data_args, training_args, finetuning_args, callbacks) elif general_args.stage == "sft": - run_sft(model_args, data_args, training_args, finetuning_args, callbacks) + run_sft(model_args, data_args, training_args, finetuning_args, generating_args, callbacks) elif general_args.stage == "rm": run_rm(model_args, data_args, training_args, finetuning_args, callbacks) elif general_args.stage == "ppo": - run_ppo(model_args, data_args, training_args, finetuning_args, callbacks) + run_ppo(model_args, data_args, training_args, finetuning_args, generating_args, callbacks) + elif general_args.stage == "dpo": + run_dpo(model_args, data_args, training_args, finetuning_args, callbacks) + else: + raise ValueError("Unknown task.") def export_model(args: Optional[Dict[str, Any]] = None, max_shard_size: Optional[str] = "10GB"): model_args, _, training_args, finetuning_args, _ = get_train_args(args) model, tokenizer = load_model_and_tokenizer(model_args, finetuning_args) model.save_pretrained(training_args.output_dir, max_shard_size=max_shard_size) - tokenizer.save_pretrained(training_args.output_dir) + try: + tokenizer.save_pretrained(training_args.output_dir) + except: + logger.warning("Cannot save tokenizer, please copy the files manually.") if __name__ == "__main__": diff --git a/src/llmtuner/webui/runner.py b/src/llmtuner/webui/runner.py index fddc4070..36a8bf53 100644 --- a/src/llmtuner/webui/runner.py +++ b/src/llmtuner/webui/runner.py @@ -4,7 +4,7 @@ import threading import time import transformers from transformers.trainer import TRAINING_ARGS_NAME -from typing import Generator, List, Optional, Tuple +from typing import Generator, List, Tuple from llmtuner.extras.callbacks import LogCallback from llmtuner.extras.constants import DEFAULT_MODULE From f1485ab92707bace72ab85364e18a3e670765b83 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Fri, 11 Aug 2023 13:45:47 +0800 Subject: [PATCH 09/45] fix baichuan template Former-commit-id: 9c6dd1051417c91074daa7dd6ed6cc53448135ad --- src/llmtuner/dsets/preprocess.py | 4 +++- src/llmtuner/extras/template.py | 15 +++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/llmtuner/dsets/preprocess.py b/src/llmtuner/dsets/preprocess.py index 4efbcbb6..dc882ae0 100644 --- a/src/llmtuner/dsets/preprocess.py +++ b/src/llmtuner/dsets/preprocess.py @@ -1,3 +1,4 @@ +import tiktoken from typing import TYPE_CHECKING, Any, Dict, Generator, List, Literal from itertools import chain @@ -31,10 +32,11 @@ def preprocess_dataset( def preprocess_pretrain_dataset(examples: Dict[str, List[Any]]) -> Dict[str, Any]: # build grouped texts with format `X1 X2 X3 ...` (without ) - if hasattr(tokenizer, "tokenizer"): # for tiktoken tokenizer (Qwen) + if isinstance(getattr(tokenizer, "tokenizer"), tiktoken.Encoding): # for tiktoken tokenizer (Qwen) kwargs = dict(allowed_special="all") else: kwargs = dict(add_special_tokens=False) + tokenized_examples = tokenizer(examples["prompt"], **kwargs) concatenated_examples = {k: list(chain(*tokenized_examples[k])) for k in tokenized_examples.keys()} total_length = len(concatenated_examples[list(concatenated_examples.keys())[0]]) diff --git a/src/llmtuner/extras/template.py b/src/llmtuner/extras/template.py index c3388ab3..4bf490aa 100644 --- a/src/llmtuner/extras/template.py +++ b/src/llmtuner/extras/template.py @@ -1,5 +1,6 @@ -from typing import TYPE_CHECKING, Dict, List, Optional, Tuple, Union +import tiktoken from dataclasses import dataclass +from typing import TYPE_CHECKING, Dict, List, Optional, Tuple, Union from llmtuner.extras.logging import get_logger @@ -122,7 +123,7 @@ class Template: r""" Converts context to token ids. """ - if hasattr(tokenizer, "tokenizer"): # for tiktoken tokenizer (Qwen) + if isinstance(getattr(tokenizer, "tokenizer"), tiktoken.Encoding): # for tiktoken tokenizer (Qwen) kwargs = dict(allowed_special="all") else: kwargs = dict(add_special_tokens=False) @@ -428,14 +429,16 @@ Supports: https://huggingface.co/baichuan-inc/Baichuan-13B-Chat """ register_template( name="baichuan", - prefix=[], + prefix=[ + {"token": ""} # user token (a little difference in the first turn) + ], prompt=[ - {"token": ""}, # user token (a little difference in position) - "{{query}}" + "{{query}}", + {"token": ""} # assistant token ], sep=[], stop_words=[ - "" # assistant token + {"token": ""} # user token ], use_history=True ) From eb26bfc2bade43d848587ac16a54c704d97aecb6 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Fri, 11 Aug 2023 13:51:46 +0800 Subject: [PATCH 10/45] fix stop word in baichuan template Former-commit-id: d59f9389590aab570f68ad4898b035741f9fd1c8 --- src/llmtuner/extras/template.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llmtuner/extras/template.py b/src/llmtuner/extras/template.py index 4bf490aa..64c22285 100644 --- a/src/llmtuner/extras/template.py +++ b/src/llmtuner/extras/template.py @@ -438,7 +438,7 @@ register_template( ], sep=[], stop_words=[ - {"token": ""} # user token + "" # user token ], use_history=True ) From 21bf79e72b1afb9a12aaae75f1a331b7a918973d Mon Sep 17 00:00:00 2001 From: hiyouga Date: Fri, 11 Aug 2023 13:56:26 +0800 Subject: [PATCH 11/45] add defaults Former-commit-id: d3844e97e387b2106a32a576a61318ecec948e23 --- src/llmtuner/dsets/preprocess.py | 2 +- src/llmtuner/extras/template.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/llmtuner/dsets/preprocess.py b/src/llmtuner/dsets/preprocess.py index dc882ae0..64e0d8b1 100644 --- a/src/llmtuner/dsets/preprocess.py +++ b/src/llmtuner/dsets/preprocess.py @@ -32,7 +32,7 @@ def preprocess_dataset( def preprocess_pretrain_dataset(examples: Dict[str, List[Any]]) -> Dict[str, Any]: # build grouped texts with format `X1 X2 X3 ...` (without ) - if isinstance(getattr(tokenizer, "tokenizer"), tiktoken.Encoding): # for tiktoken tokenizer (Qwen) + if isinstance(getattr(tokenizer, "tokenizer", None), tiktoken.Encoding): # for tiktoken tokenizer (Qwen) kwargs = dict(allowed_special="all") else: kwargs = dict(add_special_tokens=False) diff --git a/src/llmtuner/extras/template.py b/src/llmtuner/extras/template.py index 64c22285..c6e21d87 100644 --- a/src/llmtuner/extras/template.py +++ b/src/llmtuner/extras/template.py @@ -123,7 +123,7 @@ class Template: r""" Converts context to token ids. """ - if isinstance(getattr(tokenizer, "tokenizer"), tiktoken.Encoding): # for tiktoken tokenizer (Qwen) + if isinstance(getattr(tokenizer, "tokenizer", None), tiktoken.Encoding): # for tiktoken tokenizer (Qwen) kwargs = dict(allowed_special="all") else: kwargs = dict(add_special_tokens=False) From e86c4ef06c57940654f54d7d0860ede1a6527339 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Fri, 11 Aug 2023 14:06:02 +0800 Subject: [PATCH 12/45] Update README_zh.md Former-commit-id: 156710a9954b7dd079c6d583c399d7a3d5c3915c --- README_zh.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_zh.md b/README_zh.md index 955fefc1..f9d967c5 100644 --- a/README_zh.md +++ b/README_zh.md @@ -12,7 +12,7 @@ ## 更新日志 -[23/08/11] 现在我们支持了指令模型的 **[DPO 训练](https://arxiv.org/abs/2305.18290)**。详情请参阅[此示例](#dpo-training)(实验性功能)。 +[23/08/11] 现在我们支持了指令模型的 **[DPO 训练](https://arxiv.org/abs/2305.18290)**。详情请参阅[此示例](#dpo-训练)(实验性功能)。 [23/08/03] 现在我们支持了 **Qwen-7B** 模型的训练。请尝试使用 `--model_name_or_path Qwen/Qwen-7B-Chat` 和 `--lora_target c_attn` 参数。使用 Qwen-7B-Chat 模型请添加 `--template chatml` 参数。 From 79f4ba0d262c5540b16d15c189f8d34ebbca6ab7 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Fri, 11 Aug 2023 23:25:57 +0800 Subject: [PATCH 13/45] Release v0.1.6 Former-commit-id: a48cb0d474ef0648a97387daf5f623498b5e3ee6 --- README.md | 3 +++ src/llmtuner/__init__.py | 2 +- src/llmtuner/dsets/loader.py | 6 ++++-- src/llmtuner/dsets/utils.py | 3 ++- src/llmtuner/extras/constants.py | 8 +++++-- src/llmtuner/extras/template.py | 19 ++++++++++++++++- src/llmtuner/hparams/finetuning_args.py | 4 ++++ src/llmtuner/hparams/model_args.py | 4 ---- src/llmtuner/tuner/core/adapter.py | 2 +- src/llmtuner/tuner/tune.py | 2 +- src/llmtuner/webui/components/data.py | 2 +- src/llmtuner/webui/components/eval.py | 15 +++++++++++-- src/llmtuner/webui/components/sft.py | 28 ++++++++++++++++++++----- src/llmtuner/webui/components/top.py | 2 +- src/llmtuner/webui/interface.py | 2 +- src/llmtuner/webui/locales.py | 20 ++++++++++++++++++ src/llmtuner/webui/runner.py | 27 ++++++++++++++---------- src/llmtuner/webui/utils.py | 19 ++++++++++------- 18 files changed, 127 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index fcbe0761..a54ac30a 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ | [InternLM](https://github.com/InternLM/InternLM) | 7B | q_proj,v_proj | intern | | [Qwen](https://github.com/QwenLM/Qwen-7B) | 7B | c_attn | chatml | | [XVERSE](https://github.com/xverse-ai/XVERSE-13B) | 13B | q_proj,v_proj | - | +| [ChatGLM2](https://github.com/THUDM/ChatGLM2-6B) | 6B | query_key_value | chatglm2 | - **Default module** is used for the `--lora_target` argument. Please use `python src/train_bash.py -h` to see all available options. - For the "base" models, the `--template` argument can be chosen from `default`, `alpaca`, `vicuna` etc. But make sure to use the corresponding template for the "chat" models. @@ -408,6 +409,8 @@ Please follow the model licenses to use the corresponding model weights: - [Baichuan](https://huggingface.co/baichuan-inc/baichuan-7B/resolve/main/baichuan-7B%20%E6%A8%A1%E5%9E%8B%E8%AE%B8%E5%8F%AF%E5%8D%8F%E8%AE%AE.pdf) - [InternLM](https://github.com/InternLM/InternLM#open-source-license) - [Qwen](https://huggingface.co/Qwen/Qwen-7B-Chat/blob/main/LICENSE) +- [XVERSE](https://github.com/xverse-ai/XVERSE-13B/blob/main/MODEL_LICENSE.pdf) +- [ChatGLM2](https://github.com/THUDM/ChatGLM2-6B/blob/main/MODEL_LICENSE) ## Citation diff --git a/src/llmtuner/__init__.py b/src/llmtuner/__init__.py index e647b92b..bbc1420b 100644 --- a/src/llmtuner/__init__.py +++ b/src/llmtuner/__init__.py @@ -6,4 +6,4 @@ from llmtuner.tuner import export_model, run_exp from llmtuner.webui import create_ui, create_web_demo -__version__ = "0.1.5" +__version__ = "0.1.6" diff --git a/src/llmtuner/dsets/loader.py b/src/llmtuner/dsets/loader.py index 90a4212f..7588443f 100644 --- a/src/llmtuner/dsets/loader.py +++ b/src/llmtuner/dsets/loader.py @@ -93,11 +93,13 @@ def get_dataset( dataset = dataset.rename_column(getattr(dataset_attr, column_name), column_name) if dataset_attr.source_prefix: # add prefix - features = None if data_args.streaming: features = dataset.features features["prefix"] = Value(dtype="string", id=None) - dataset = dataset.map(lambda _: {"prefix": dataset_attr.source_prefix}, features=features) + dataset = dataset.map(lambda _: {"prefix": dataset_attr.source_prefix}, features=features) + else: + prefix_data = [dataset_attr.source_prefix] * len(dataset) + dataset = dataset.add_column("prefix", prefix_data) all_datasets.append(dataset) diff --git a/src/llmtuner/dsets/utils.py b/src/llmtuner/dsets/utils.py index e1093a95..f816649e 100644 --- a/src/llmtuner/dsets/utils.py +++ b/src/llmtuner/dsets/utils.py @@ -19,7 +19,8 @@ def split_dataset( dataset = dataset.shuffle(buffer_size=data_args.buffer_size, seed=training_args.seed) return {"train_dataset": train_set, "eval_dataset": val_set} else: - dataset = dataset.train_test_split(test_size=data_args.val_size, seed=training_args.seed) + val_size = int(data_args.val_size) if data_args.val_size > 1 else data_args.val_size + dataset = dataset.train_test_split(test_size=val_size, seed=training_args.seed) return {"train_dataset": dataset["train"], "eval_dataset": dataset["test"]} else: if data_args.streaming: diff --git a/src/llmtuner/extras/constants.py b/src/llmtuner/extras/constants.py index dc1cb2e7..8ee997bb 100644 --- a/src/llmtuner/extras/constants.py +++ b/src/llmtuner/extras/constants.py @@ -37,7 +37,9 @@ SUPPORTED_MODELS = { "InternLM-7B": "internlm/internlm-7b", "InternLM-7B-Chat": "internlm/internlm-chat-7b", "Qwen-7B": "Qwen/Qwen-7B", - "Qwen-7B-Chat": "Qwen/Qwen-7B-Chat" + "Qwen-7B-Chat": "Qwen/Qwen-7B-Chat", + "XVERSE-13B": "xverse/XVERSE-13B", + "ChatGLM2-6B": "THUDM/chatglm2-6b" } DEFAULT_MODULE = { @@ -48,5 +50,7 @@ DEFAULT_MODULE = { "Falcon": "query_key_value", "Baichuan": "W_pack", "InternLM": "q_proj,v_proj", - "Qwen": "c_attn" + "Qwen": "c_attn", + "XVERSE": "q_proj,v_proj", + "ChatGLM2": "query_key_value" } diff --git a/src/llmtuner/extras/template.py b/src/llmtuner/extras/template.py index c6e21d87..6724dd46 100644 --- a/src/llmtuner/extras/template.py +++ b/src/llmtuner/extras/template.py @@ -178,7 +178,7 @@ def register_template( stop_words: List[str], use_history: bool ) -> None: - template_class = Llama2Template if name == "llama2" else Template + template_class = Llama2Template if "llama2" in name else Template templates[name] = template_class( prefix=prefix, prompt=prompt, @@ -272,6 +272,23 @@ register_template( ) +r""" +Supports: https://github.com/ymcui/Chinese-LLaMA-Alpaca-2 +""" +register_template( + name="llama2_zh", + prefix=[ + "<>\nYou are a helpful assistant. 你是一个乐于助人的助手。\n<>\n\n" + ], + prompt=[ + "[INST] {{query}} [/INST] " + ], + sep=[], + stop_words=[], + use_history=True +) + + r""" Supports: https://huggingface.co/tatsu-lab/alpaca-7b-wdiff https://github.com/ymcui/Chinese-LLaMA-Alpaca diff --git a/src/llmtuner/hparams/finetuning_args.py b/src/llmtuner/hparams/finetuning_args.py index c4713c5e..d7d651dd 100644 --- a/src/llmtuner/hparams/finetuning_args.py +++ b/src/llmtuner/hparams/finetuning_args.py @@ -57,6 +57,10 @@ class FinetuningArguments: Qwen choices: [\"c_attn\", \"attn.c_proj\", \"w1\", \"w2\", \"mlp.c_proj\"], \ LLaMA-2, InternLM, XVERSE choices: the same as LLaMA."} ) + resume_lora_training: Optional[bool] = field( + default=True, + metadata={"help": "Whether to resume training from the last LoRA weights or create new weights after merging them."} + ) dpo_beta: Optional[float] = field( default=0.1, metadata={"help": "The beta parameter for the DPO loss."} diff --git a/src/llmtuner/hparams/model_args.py b/src/llmtuner/hparams/model_args.py index 6c8491da..44454f45 100644 --- a/src/llmtuner/hparams/model_args.py +++ b/src/llmtuner/hparams/model_args.py @@ -55,10 +55,6 @@ class ModelArguments: default=None, metadata={"help": "Path to the directory containing the checkpoints of the reward model."} ) - resume_lora_training: Optional[bool] = field( - default=True, - metadata={"help": "Whether to resume training from the last LoRA weights or create new weights after merging them."} - ) plot_loss: Optional[bool] = field( default=False, metadata={"help": "Whether to plot the training loss after fine-tuning or not."} diff --git a/src/llmtuner/tuner/core/adapter.py b/src/llmtuner/tuner/core/adapter.py index a8ac5a84..5db56876 100644 --- a/src/llmtuner/tuner/core/adapter.py +++ b/src/llmtuner/tuner/core/adapter.py @@ -65,7 +65,7 @@ def init_adapter( assert os.path.exists(os.path.join(model_args.checkpoint_dir[0], CONFIG_NAME)), \ "The given checkpoint may be not a LoRA checkpoint, please specify `--finetuning_type full/freeze` instead." - if (is_trainable and model_args.resume_lora_training) or (not is_mergeable): # continually train on the lora weights + if (is_trainable and finetuning_args.resume_lora_training) or (not is_mergeable): # continually fine-tuning checkpoints_to_merge, latest_checkpoint = model_args.checkpoint_dir[:-1], model_args.checkpoint_dir[-1] else: checkpoints_to_merge = model_args.checkpoint_dir diff --git a/src/llmtuner/tuner/tune.py b/src/llmtuner/tuner/tune.py index dee49ef4..7b9446e9 100644 --- a/src/llmtuner/tuner/tune.py +++ b/src/llmtuner/tuner/tune.py @@ -18,7 +18,7 @@ logger = get_logger(__name__) def run_exp(args: Optional[Dict[str, Any]] = None, callbacks: Optional[List["TrainerCallback"]] = None): model_args, data_args, training_args, finetuning_args, generating_args, general_args = get_train_args(args) - callbacks = [LogCallback()] if callbacks is None else callbacks + [LogCallback()] + callbacks = [LogCallback()] if callbacks is None else callbacks if general_args.stage == "pt": run_pt(model_args, data_args, training_args, finetuning_args, callbacks) diff --git a/src/llmtuner/webui/components/data.py b/src/llmtuner/webui/components/data.py index 9787b36a..af19cc41 100644 --- a/src/llmtuner/webui/components/data.py +++ b/src/llmtuner/webui/components/data.py @@ -16,6 +16,6 @@ def create_preview_box() -> Tuple["Block", "Component", "Component", "Component" close_btn = gr.Button() - close_btn.click(lambda: gr.update(visible=False), outputs=[preview_box]) + close_btn.click(lambda: gr.update(visible=False), outputs=[preview_box], queue=False) return preview_box, preview_count, preview_samples, close_btn diff --git a/src/llmtuner/webui/components/eval.py b/src/llmtuner/webui/components/eval.py index 29b590ae..ce6eddae 100644 --- a/src/llmtuner/webui/components/eval.py +++ b/src/llmtuner/webui/components/eval.py @@ -20,7 +20,12 @@ def create_eval_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict dataset_dir.change(list_dataset, [dataset_dir], [dataset]) dataset.change(can_preview, [dataset_dir, dataset], [preview_btn]) - preview_btn.click(get_preview, [dataset_dir, dataset], [preview_count, preview_samples, preview_box]) + preview_btn.click( + get_preview, + [dataset_dir, dataset], + [preview_count, preview_samples, preview_box], + queue=False + ) with gr.Row(): max_source_length = gr.Slider(value=512, minimum=4, maximum=4096, step=1) @@ -33,6 +38,9 @@ def create_eval_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict start_btn = gr.Button() stop_btn = gr.Button() + with gr.Row(): + process_bar = gr.Slider(visible=False, interactive=False) + with gr.Box(): output_box = gr.Markdown() @@ -54,7 +62,10 @@ def create_eval_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict batch_size, predict ], - [output_box] + [ + output_box, + process_bar + ] ) stop_btn.click(runner.set_abort, queue=False) diff --git a/src/llmtuner/webui/components/sft.py b/src/llmtuner/webui/components/sft.py index 9db57ac9..05a6e530 100644 --- a/src/llmtuner/webui/components/sft.py +++ b/src/llmtuner/webui/components/sft.py @@ -22,7 +22,12 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ dataset_dir.change(list_dataset, [dataset_dir], [dataset]) dataset.change(can_preview, [dataset_dir, dataset], [preview_btn]) - preview_btn.click(get_preview, [dataset_dir, dataset], [preview_count, preview_samples, preview_box]) + preview_btn.click( + get_preview, + [dataset_dir, dataset], + [preview_count, preview_samples, preview_box], + queue=False + ) with gr.Row(): max_source_length = gr.Slider(value=512, minimum=4, maximum=4096, step=1) @@ -46,12 +51,14 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ save_steps = gr.Slider(value=100, minimum=10, maximum=5000, step=10) warmup_steps = gr.Slider(value=0, minimum=0, maximum=5000, step=1) compute_type = gr.Radio(choices=["fp16", "bf16"], value="fp16") + padding_side = gr.Radio(choices=["left", "right"], value="left") with gr.Accordion(label="LoRA config", open=False) as lora_tab: with gr.Row(): lora_rank = gr.Slider(value=8, minimum=1, maximum=1024, step=1, scale=1) - lora_dropout = gr.Slider(value=0, minimum=0, maximum=1, step=0.01, scale=1) + lora_dropout = gr.Slider(value=0.1, minimum=0, maximum=1, step=0.01, scale=1) lora_target = gr.Textbox(scale=2) + resume_lora_training = gr.Checkbox(value=True, scale=1) with gr.Row(): start_btn = gr.Button() @@ -59,7 +66,11 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ with gr.Row(): with gr.Column(scale=3): - output_dir = gr.Textbox() + with gr.Row(): + output_dir = gr.Textbox() + + with gr.Row(): + process_bar = gr.Slider(visible=False, interactive=False) with gr.Box(): output_box = gr.Markdown() @@ -93,16 +104,21 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ save_steps, warmup_steps, compute_type, + padding_side, lora_rank, lora_dropout, lora_target, + resume_lora_training, output_dir ], - [output_box] + [ + output_box, + process_bar + ] ) stop_btn.click(runner.set_abort, queue=False) - output_box.change( + process_bar.change( gen_plot, [top_elems["model_name"], top_elems["finetuning_type"], output_dir], loss_viewer, queue=False ) @@ -128,10 +144,12 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ save_steps=save_steps, warmup_steps=warmup_steps, compute_type=compute_type, + padding_side=padding_side, lora_tab=lora_tab, lora_rank=lora_rank, lora_dropout=lora_dropout, lora_target=lora_target, + resume_lora_training=resume_lora_training, start_btn=start_btn, stop_btn=stop_btn, output_dir=output_dir, diff --git a/src/llmtuner/webui/components/top.py b/src/llmtuner/webui/components/top.py index 4fc5b506..77d60593 100644 --- a/src/llmtuner/webui/components/top.py +++ b/src/llmtuner/webui/components/top.py @@ -43,7 +43,7 @@ def create_top() -> Dict[str, "Component"]: can_quantize, [finetuning_type], [quantization_bit] ) - refresh_btn.click(list_checkpoint, [model_name, finetuning_type], [checkpoints]) + refresh_btn.click(list_checkpoint, [model_name, finetuning_type], [checkpoints], queue=False) return dict( lang=lang, diff --git a/src/llmtuner/webui/interface.py b/src/llmtuner/webui/interface.py index 2fb61d37..8539e18c 100644 --- a/src/llmtuner/webui/interface.py +++ b/src/llmtuner/webui/interface.py @@ -67,7 +67,7 @@ def create_web_demo() -> gr.Blocks: demo.load(manager.gen_label, [lang], [lang] + list(chat_elems.values())) - lang.change(manager.gen_label, [lang], [lang] + list(chat_elems.values())) + lang.change(manager.gen_label, [lang], [lang] + list(chat_elems.values()), queue=False) return demo diff --git a/src/llmtuner/webui/locales.py b/src/llmtuner/webui/locales.py index 9bf3d7a9..61491ece 100644 --- a/src/llmtuner/webui/locales.py +++ b/src/llmtuner/webui/locales.py @@ -277,6 +277,16 @@ LOCALES = { "info": "是否启用 FP16 或 BF16 混合精度训练。" } }, + "padding_side": { + "en": { + "label": "Padding side", + "info": "The side on which the model should have padding applied." + }, + "zh": { + "label": "填充位置", + "info": "使用左填充或右填充。" + } + }, "lora_tab": { "en": { "label": "LoRA configurations" @@ -315,6 +325,16 @@ LOCALES = { "info": "应用 LoRA 的线性层名称。使用英文逗号分隔多个名称。" } }, + "resume_lora_training": { + "en": { + "label": "Resume LoRA training", + "info": "Whether to resume training from the last LoRA weights or create new lora weights." + }, + "zh": { + "label": "继续上次的训练", + "info": "接着上次的 LoRA 权重训练或创建一个新的 LoRA 权重。" + } + }, "start_btn": { "en": { "value": "Start" diff --git a/src/llmtuner/webui/runner.py b/src/llmtuner/webui/runner.py index 36a8bf53..1ae92786 100644 --- a/src/llmtuner/webui/runner.py +++ b/src/llmtuner/webui/runner.py @@ -1,3 +1,4 @@ +import gradio as gr import logging import os import threading @@ -13,7 +14,7 @@ from llmtuner.extras.misc import torch_gc from llmtuner.tuner import run_exp from llmtuner.webui.common import get_model_path, get_save_dir from llmtuner.webui.locales import ALERTS -from llmtuner.webui.utils import format_info, get_eval_results +from llmtuner.webui.utils import get_eval_results, update_process_bar class Runner: @@ -88,14 +89,16 @@ class Runner: save_steps: int, warmup_steps: int, compute_type: str, + padding_side: str, lora_rank: int, lora_dropout: float, lora_target: str, + resume_lora_training: bool, output_dir: str ) -> Generator[str, None, None]: model_name_or_path, error, logger_handler, trainer_callback = self.initialize(lang, model_name, dataset) if error: - yield error + yield error, gr.update(visible=False) return if checkpoints: @@ -133,9 +136,11 @@ class Runner: warmup_steps=warmup_steps, fp16=(compute_type == "fp16"), bf16=(compute_type == "bf16"), + padding_side=padding_side, lora_rank=lora_rank, lora_dropout=lora_dropout, lora_target=lora_target or DEFAULT_MODULE.get(model_name.split("-")[0], "q_proj,v_proj"), + resume_lora_training=resume_lora_training, output_dir=output_dir ) @@ -150,18 +155,18 @@ class Runner: thread.start() while thread.is_alive(): - time.sleep(1) + time.sleep(2) if self.aborted: - yield ALERTS["info_aborting"][lang] + yield ALERTS["info_aborting"][lang], gr.update(visible=False) else: - yield format_info(logger_handler.log, trainer_callback) + yield logger_handler.log, update_process_bar(trainer_callback) if os.path.exists(os.path.join(output_dir, TRAINING_ARGS_NAME)): finish_info = ALERTS["info_finished"][lang] else: finish_info = ALERTS["err_failed"][lang] - yield self.finalize(lang, finish_info) + yield self.finalize(lang, finish_info), gr.update(visible=False) def run_eval( self, @@ -182,7 +187,7 @@ class Runner: ) -> Generator[str, None, None]: model_name_or_path, error, logger_handler, trainer_callback = self.initialize(lang, model_name, dataset) if error: - yield error + yield error, gr.update(visible=False) return if checkpoints: @@ -223,15 +228,15 @@ class Runner: thread.start() while thread.is_alive(): - time.sleep(1) + time.sleep(2) if self.aborted: - yield ALERTS["info_aborting"][lang] + yield ALERTS["info_aborting"][lang], gr.update(visible=False) else: - yield format_info(logger_handler.log, trainer_callback) + yield logger_handler.log, update_process_bar(trainer_callback) if os.path.exists(os.path.join(output_dir, "all_results.json")): finish_info = get_eval_results(os.path.join(output_dir, "all_results.json")) else: finish_info = ALERTS["err_failed"][lang] - yield self.finalize(lang, finish_info) + yield self.finalize(lang, finish_info), gr.update(visible=False) diff --git a/src/llmtuner/webui/utils.py b/src/llmtuner/webui/utils.py index 7b667c0f..fb22bd0c 100644 --- a/src/llmtuner/webui/utils.py +++ b/src/llmtuner/webui/utils.py @@ -15,13 +15,18 @@ if TYPE_CHECKING: from llmtuner.extras.callbacks import LogCallback -def format_info(log: str, callback: "LogCallback") -> str: - info = log - if callback.max_steps: - info += "Running **{:d}/{:d}**: {} < {}\n".format( - callback.cur_steps, callback.max_steps, callback.elapsed_time, callback.remaining_time - ) - return info +def update_process_bar(callback: "LogCallback") -> Dict[str, Any]: + if not callback.max_steps: + return gr.update(visible=False) + + percentage = round(100 * callback.cur_steps / callback.max_steps, 0) if callback.max_steps != 0 else 100.0 + label = "Running {:d}/{:d}: {} < {}".format( + callback.cur_steps, + callback.max_steps, + callback.elapsed_time, + callback.remaining_time + ) + return gr.update(label=label, value=percentage, visible=True) def get_time() -> str: From 7bd4c59b7e0941fe37647a2be0d18732db982059 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Sat, 12 Aug 2023 00:25:29 +0800 Subject: [PATCH 14/45] fix unusual output of 8bit models #278 #391 Former-commit-id: dd51c242032ce3f878cb191dc144536db4a2bb45 --- src/llmtuner/extras/misc.py | 3 +++ src/llmtuner/tuner/core/loader.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/llmtuner/extras/misc.py b/src/llmtuner/extras/misc.py index ee918fbb..b0a7365c 100644 --- a/src/llmtuner/extras/misc.py +++ b/src/llmtuner/extras/misc.py @@ -142,6 +142,9 @@ def dispatch_model(model: "PreTrainedModel") -> "PreTrainedModel": Dispatches a pre-trained model to GPUs with balanced memory. Borrowed from: https://github.com/huggingface/transformers/blob/v4.31.0/src/transformers/modeling_utils.py#L2803 """ + if getattr(model, "is_loaded_in_8bit", False) or getattr(model, "is_loaded_in_4bit", False): # do nothing + return model + if torch.cuda.device_count() > 1: from accelerate import dispatch_model from accelerate.utils import infer_auto_device_map, get_balanced_memory diff --git a/src/llmtuner/tuner/core/loader.py b/src/llmtuner/tuner/core/loader.py index 39bec1d8..74b4b59f 100644 --- a/src/llmtuner/tuner/core/loader.py +++ b/src/llmtuner/tuner/core/loader.py @@ -92,7 +92,7 @@ def load_model_and_tokenizer( ) is_mergeable = False - config_kwargs["device_map"] = {"": int(os.environ.get("LOCAL_RANK", "0"))} + config_kwargs["device_map"] = {"": int(os.environ.get("LOCAL_RANK", "0"))} if is_trainable else "auto" logger.info("Quantizing model to {} bit.".format(model_args.quantization_bit)) # Load and prepare pretrained models (without valuehead). From 3ba1b81105f4b26da948d7ff529632b9fc33d89f Mon Sep 17 00:00:00 2001 From: codemayq Date: Sat, 12 Aug 2023 13:53:55 +0800 Subject: [PATCH 15/45] add sft script preview in webui Former-commit-id: 6bc8e9866d482c945dd98f4e9ab205a7d7270755 --- src/llmtuner/extras/constants.py | 2 + src/llmtuner/webui/components/sft.py | 46 +++++++++++- src/llmtuner/webui/locales.py | 16 ++++ src/llmtuner/webui/runner.py | 105 +++++++++++++++++++++------ 4 files changed, 145 insertions(+), 24 deletions(-) diff --git a/src/llmtuner/extras/constants.py b/src/llmtuner/extras/constants.py index 8ee997bb..4e7101f7 100644 --- a/src/llmtuner/extras/constants.py +++ b/src/llmtuner/extras/constants.py @@ -1,5 +1,7 @@ IGNORE_INDEX = -100 +SFT_SCRIPT_PREFIX = "CUDA_VISIBLE_DEVICES=0 python " + LOG_FILE_NAME = "trainer_log.jsonl" VALUE_HEAD_FILE_NAME = "value_head.bin" diff --git a/src/llmtuner/webui/components/sft.py b/src/llmtuner/webui/components/sft.py index 05a6e530..e74ef5cf 100644 --- a/src/llmtuner/webui/components/sft.py +++ b/src/llmtuner/webui/components/sft.py @@ -61,11 +61,15 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ resume_lora_training = gr.Checkbox(value=True, scale=1) with gr.Row(): + preview_script_btn = gr.Button() start_btn = gr.Button() stop_btn = gr.Button() with gr.Row(): with gr.Column(scale=3): + with gr.Box(): + preview_script_box = gr.Textbox() + with gr.Row(): output_dir = gr.Textbox() @@ -78,6 +82,44 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ with gr.Column(scale=1): loss_viewer = gr.Plot() + preview_script_btn.click( + runner.preview_sft_script, + [ + top_elems["lang"], + top_elems["model_name"], + top_elems["checkpoints"], + top_elems["finetuning_type"], + top_elems["quantization_bit"], + top_elems["template"], + top_elems["source_prefix"], + dataset_dir, + dataset, + max_source_length, + max_target_length, + learning_rate, + num_train_epochs, + max_samples, + batch_size, + gradient_accumulation_steps, + lr_scheduler_type, + max_grad_norm, + val_size, + logging_steps, + save_steps, + warmup_steps, + compute_type, + padding_side, + lora_rank, + lora_dropout, + lora_target, + resume_lora_training, + output_dir + ], + [ + preview_script_box + ] + ) + start_btn.click( runner.run_train, [ @@ -154,5 +196,7 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ stop_btn=stop_btn, output_dir=output_dir, output_box=output_box, - loss_viewer=loss_viewer + loss_viewer=loss_viewer, + preview_script_btn=preview_script_btn, + preview_script_box=preview_script_box ) diff --git a/src/llmtuner/webui/locales.py b/src/llmtuner/webui/locales.py index 61491ece..c4845735 100644 --- a/src/llmtuner/webui/locales.py +++ b/src/llmtuner/webui/locales.py @@ -500,6 +500,22 @@ LOCALES = { "zh": { "value": "开始导出" } + }, + "preview_script_btn": { + "en": { + "value": "preview train script" + }, + "zh": { + "value": "预览训练脚本命令" + } + }, + "preview_script_box": { + "en": { + "label": "SFT Script Preview", + }, + "zh": { + "label": "训练命令预览", + } } } diff --git a/src/llmtuner/webui/runner.py b/src/llmtuner/webui/runner.py index 1ae92786..d0d12d14 100644 --- a/src/llmtuner/webui/runner.py +++ b/src/llmtuner/webui/runner.py @@ -8,7 +8,7 @@ from transformers.trainer import TRAINING_ARGS_NAME from typing import Generator, List, Tuple from llmtuner.extras.callbacks import LogCallback -from llmtuner.extras.constants import DEFAULT_MODULE +from llmtuner.extras.constants import DEFAULT_MODULE, SFT_SCRIPT_PREFIX from llmtuner.extras.logging import LoggerHandler from llmtuner.extras.misc import torch_gc from llmtuner.tuner import run_exp @@ -100,16 +100,44 @@ class Runner: if error: yield error, gr.update(visible=False) return + output_dir = os.path.join(get_save_dir(model_name), finetuning_type, output_dir) + args = self._build_args(batch_size, checkpoints, compute_type, dataset, dataset_dir, finetuning_type, + gradient_accumulation_steps, learning_rate, logging_steps, lora_dropout, lora_rank, + lora_target, lr_scheduler_type, max_grad_norm, max_samples, max_source_length, + max_target_length, model_name, model_name_or_path, num_train_epochs, output_dir, + padding_side, quantization_bit, resume_lora_training, save_steps, source_prefix, + template, val_size, warmup_steps) + + run_kwargs = dict(args=args, callbacks=[trainer_callback]) + thread = threading.Thread(target=run_exp, kwargs=run_kwargs) + thread.start() + + while thread.is_alive(): + time.sleep(2) + if self.aborted: + yield ALERTS["info_aborting"][lang], gr.update(visible=False) + else: + yield logger_handler.log, update_process_bar(trainer_callback) + + if os.path.exists(os.path.join(output_dir, TRAINING_ARGS_NAME)): + finish_info = ALERTS["info_finished"][lang] + else: + finish_info = ALERTS["err_failed"][lang] + + yield self.finalize(lang, finish_info), gr.update(visible=False) + + def _build_args(self, batch_size, checkpoints, compute_type, dataset, dataset_dir, finetuning_type, + gradient_accumulation_steps, learning_rate, logging_steps, lora_dropout, lora_rank, lora_target, + lr_scheduler_type, max_grad_norm, max_samples, max_source_length, max_target_length, model_name, + model_name_or_path, num_train_epochs, output_dir, padding_side, quantization_bit, + resume_lora_training, save_steps, source_prefix, template, val_size, warmup_steps): if checkpoints: checkpoint_dir = ",".join( [os.path.join(get_save_dir(model_name), finetuning_type, checkpoint) for checkpoint in checkpoints] ) else: checkpoint_dir = None - - output_dir = os.path.join(get_save_dir(model_name), finetuning_type, output_dir) - args = dict( stage="sft", model_name_or_path=model_name_or_path, @@ -143,30 +171,12 @@ class Runner: resume_lora_training=resume_lora_training, output_dir=output_dir ) - if val_size > 1e-6: args["val_size"] = val_size args["evaluation_strategy"] = "steps" args["eval_steps"] = save_steps args["load_best_model_at_end"] = True - - run_kwargs = dict(args=args, callbacks=[trainer_callback]) - thread = threading.Thread(target=run_exp, kwargs=run_kwargs) - thread.start() - - while thread.is_alive(): - time.sleep(2) - if self.aborted: - yield ALERTS["info_aborting"][lang], gr.update(visible=False) - else: - yield logger_handler.log, update_process_bar(trainer_callback) - - if os.path.exists(os.path.join(output_dir, TRAINING_ARGS_NAME)): - finish_info = ALERTS["info_finished"][lang] - else: - finish_info = ALERTS["err_failed"][lang] - - yield self.finalize(lang, finish_info), gr.update(visible=False) + return args def run_eval( self, @@ -240,3 +250,52 @@ class Runner: finish_info = ALERTS["err_failed"][lang] yield self.finalize(lang, finish_info), gr.update(visible=False) + + def preview_sft_script( + self, + lang: str, + model_name: str, + checkpoints: List[str], + finetuning_type: str, + quantization_bit: str, + template: str, + source_prefix: str, + dataset_dir: str, + dataset: List[str], + max_source_length: int, + max_target_length: int, + learning_rate: str, + num_train_epochs: str, + max_samples: str, + batch_size: int, + gradient_accumulation_steps: int, + lr_scheduler_type: str, + max_grad_norm: str, + val_size: float, + logging_steps: int, + save_steps: int, + warmup_steps: int, + compute_type: str, + padding_side: str, + lora_rank: int, + lora_dropout: float, + lora_target: str, + resume_lora_training: bool, + output_dir: str + ): + model_name_or_path, error, logger_handler, trainer_callback = self.initialize(lang, model_name, dataset) + output_dir = os.path.join(get_save_dir(model_name), finetuning_type, output_dir) + + args = self._build_args(batch_size, checkpoints, compute_type, dataset, dataset_dir, finetuning_type, + gradient_accumulation_steps, learning_rate, logging_steps, lora_dropout, lora_rank, + lora_target, lr_scheduler_type, max_grad_norm, max_samples, max_source_length, + max_target_length, model_name, model_name_or_path, num_train_epochs, output_dir, + padding_side, quantization_bit, resume_lora_training, save_steps, source_prefix, + template, val_size, warmup_steps) + script_lines = [SFT_SCRIPT_PREFIX] + for param_key, param_value in args.items(): + # filter None + if param_value: + script_lines.append(" --" + param_key + " " + str(param_value) + " ") + script_str = "\\\n".join(script_lines) + return gr.update(value=script_str) From 3f0a2d6adc76bc60dfccd8147e22772d4b746a66 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Sat, 12 Aug 2023 20:46:27 +0800 Subject: [PATCH 16/45] support rope scaling, fix #475 #476 #478 Former-commit-id: fa940c17b8d3e379af08804003f1a522c1cd6ac4 --- src/llmtuner/chat/stream_chat.py | 6 +- src/llmtuner/extras/constants.py | 2 - src/llmtuner/extras/logging.py | 3 + src/llmtuner/hparams/model_args.py | 15 +- src/llmtuner/tuner/core/loader.py | 63 +++++++- src/llmtuner/tuner/core/parser.py | 17 ++- src/llmtuner/tuner/tune.py | 2 +- src/llmtuner/webui/components/eval.py | 57 +++---- src/llmtuner/webui/components/sft.py | 131 ++++++---------- src/llmtuner/webui/locales.py | 30 ++-- src/llmtuner/webui/runner.py | 208 +++++++++++--------------- src/llmtuner/webui/utils.py | 10 ++ 12 files changed, 267 insertions(+), 277 deletions(-) diff --git a/src/llmtuner/chat/stream_chat.py b/src/llmtuner/chat/stream_chat.py index 8220c0b3..e207ee0b 100644 --- a/src/llmtuner/chat/stream_chat.py +++ b/src/llmtuner/chat/stream_chat.py @@ -1,8 +1,7 @@ import torch -from types import MethodType from typing import Any, Dict, Generator, List, Optional, Tuple from threading import Thread -from transformers import PreTrainedModel, TextIteratorStreamer +from transformers import TextIteratorStreamer from llmtuner.extras.misc import dispatch_model, get_logits_processor, get_stopping_criteria from llmtuner.extras.template import get_template_and_fix_tokenizer @@ -15,10 +14,9 @@ class ChatModel: model_args, data_args, finetuning_args, self.generating_args = get_infer_args(args) self.model, self.tokenizer = load_model_and_tokenizer(model_args, finetuning_args) self.model = dispatch_model(self.model) - self.model = self.model.eval() # change to eval mode + self.model = self.model.eval() # enable evaluation mode self.template = get_template_and_fix_tokenizer(data_args.template, self.tokenizer) self.source_prefix = data_args.source_prefix - self.model.generate = MethodType(PreTrainedModel.generate, self.model) # disable custom method (for Qwen) def process_args( self, diff --git a/src/llmtuner/extras/constants.py b/src/llmtuner/extras/constants.py index 4e7101f7..8ee997bb 100644 --- a/src/llmtuner/extras/constants.py +++ b/src/llmtuner/extras/constants.py @@ -1,7 +1,5 @@ IGNORE_INDEX = -100 -SFT_SCRIPT_PREFIX = "CUDA_VISIBLE_DEVICES=0 python " - LOG_FILE_NAME = "trainer_log.jsonl" VALUE_HEAD_FILE_NAME = "value_head.bin" diff --git a/src/llmtuner/extras/logging.py b/src/llmtuner/extras/logging.py index 0b1a68f6..d6f185e6 100644 --- a/src/llmtuner/extras/logging.py +++ b/src/llmtuner/extras/logging.py @@ -8,6 +8,9 @@ class LoggerHandler(logging.Handler): super().__init__() self.log = "" + def reset(self): + self.log = "" + def emit(self, record): if record.name == "httpx": return diff --git a/src/llmtuner/hparams/model_args.py b/src/llmtuner/hparams/model_args.py index 44454f45..dc515f51 100644 --- a/src/llmtuner/hparams/model_args.py +++ b/src/llmtuner/hparams/model_args.py @@ -43,9 +43,9 @@ class ModelArguments: default=True, metadata={"help": "Whether to use double quantization in int4 training or not."} ) - compute_dtype: Optional[torch.dtype] = field( + rope_scaling: Optional[Literal["linear", "dynamic"]] = field( default=None, - metadata={"help": "Used in quantization configs. Do not specify this argument manually."} + metadata={"help": "Adopt scaled rotary positional embeddings."} ) checkpoint_dir: Optional[str] = field( default=None, @@ -63,8 +63,19 @@ class ModelArguments: default=None, metadata={"help": "Auth token to log in with Hugging Face Hub."} ) + compute_dtype: Optional[torch.dtype] = field( + default=None, + metadata={"help": "Used in quantization configs. Do not specify this argument manually."} + ) + model_max_length: Optional[int] = field( + default=None, + metadata={"help": "Used in rope scaling. Do not specify this argument manually."} + ) def __post_init__(self): + if self.compute_dtype is not None or self.model_max_length is not None: + raise ValueError("These arguments cannot be specified.") + if self.checkpoint_dir is not None: # support merging multiple lora weights self.checkpoint_dir = [cd.strip() for cd in self.checkpoint_dir.split(",")] diff --git a/src/llmtuner/tuner/core/loader.py b/src/llmtuner/tuner/core/loader.py index 74b4b59f..c03bdf63 100644 --- a/src/llmtuner/tuner/core/loader.py +++ b/src/llmtuner/tuner/core/loader.py @@ -1,5 +1,7 @@ import os +import math import torch +from types import MethodType from typing import TYPE_CHECKING, Literal, Optional, Tuple from transformers import ( @@ -66,15 +68,56 @@ def load_model_and_tokenizer( **config_kwargs ) - if model_args.checkpoint_dir is not None and finetuning_args.finetuning_type == "full": + if finetuning_args.finetuning_type == "full" and model_args.checkpoint_dir is not None: model_to_load = model_args.checkpoint_dir[0] else: model_to_load = model_args.model_name_or_path config = AutoConfig.from_pretrained(model_to_load, **config_kwargs) - is_mergeable = True + + if hasattr(config, "fp16") and hasattr(config, "bf16"): # fix Qwen config + if model_args.compute_dtype == torch.bfloat16: + setattr(config, "bf16", True) + else: + setattr(config, "fp16", True) + + # Set RoPE scaling + if model_args.rope_scaling is not None: + if hasattr(config, "use_dynamic_ntk"): # for Qwen models + if is_trainable: + logger.warning("Qwen model does not support rope scaling in training.") + else: + setattr(config, "use_dynamic_ntk", True) + setattr(config, "use_logn_attn", True) + logger.info("Using dynamic NTK scaling.") + + elif hasattr(config, "rope_scaling"): # for LLaMA models + if is_trainable: + if model_args.rope_scaling == "dynamic": + logger.warning( + "Dynamic NTK may not work well with fine-tuning. " + "See: https://github.com/huggingface/transformers/pull/24653" + ) + + current_max_length = getattr(config, "max_position_embeddings", None) + if current_max_length and model_args.model_max_length <= current_max_length: + logger.warning("Input length is smaller than max length. Consider increase input length.") + scaling_factor = 1.0 + else: + scaling_factor = float(math.ceil(model_args.model_max_length / current_max_length)) + else: + scaling_factor = 2.0 + + setattr(config, "rope_scaling", {"type": model_args.rope_scaling, "factor": scaling_factor}) + logger.info("Using {} scaling strategy and setting scaling factor to {}".format( + model_args.rope_scaling, scaling_factor + )) + + else: + logger.warning("Current model does not support RoPE scaling.") # Quantization configurations (using bitsandbytes library). + is_mergeable = True if model_args.quantization_bit is not None: if model_args.quantization_bit == 8: require_version("bitsandbytes>=0.37.0", "To fix: pip install bitsandbytes>=0.37.0") @@ -95,7 +138,7 @@ def load_model_and_tokenizer( config_kwargs["device_map"] = {"": int(os.environ.get("LOCAL_RANK", "0"))} if is_trainable else "auto" logger.info("Quantizing model to {} bit.".format(model_args.quantization_bit)) - # Load and prepare pretrained models (without valuehead). + # Load and prepare pre-trained models (without valuehead). model = AutoModelForCausalLM.from_pretrained( model_to_load, config=config, @@ -104,6 +147,10 @@ def load_model_and_tokenizer( **config_kwargs ) + # Disable custom generate method (for Qwen) + if "GenerationMixin" not in str(model.generate.__func__): + model.generate = MethodType(PreTrainedModel.generate, model) + # Register auto class to save the custom code files. if isinstance(config, PretrainedConfig) and "AutoConfig" in getattr(config, "auto_map", {}): config.__class__.register_for_auto_class() @@ -116,10 +163,10 @@ def load_model_and_tokenizer( model = prepare_model_for_training(model, finetuning_args.finetuning_type) if is_trainable else model model = init_adapter(model, model_args, finetuning_args, is_trainable, is_mergeable) - if stage == "rm" or stage == "ppo": # add value head - model: "AutoModelForCausalLMWithValueHead" = AutoModelForCausalLMWithValueHead.from_pretrained(model) + # Prepare model with valuehead for RLHF + if stage == "rm" or stage == "ppo": + model: AutoModelForCausalLMWithValueHead = AutoModelForCausalLMWithValueHead.from_pretrained(model) reset_logging() - if stage == "rm" and model_args.checkpoint_dir is not None: # load valuehead weights to evaluate reward model logger.warning("Only the last checkpoint containing valuehead will be loaded as the valuehead.") if load_valuehead_params(model, model_args.checkpoint_dir[-1]): @@ -133,9 +180,11 @@ def load_model_and_tokenizer( model.pretrained_model.load_adapter(model_args.reward_model, "reward", is_trainable=False) assert load_valuehead_params(model, model_args.reward_model), "Reward model is not correctly loaded." + # Prepare model for inference if not is_trainable: model.requires_grad_(False) # fix all model params - model = model.half() if model_args.quantization_bit is None else model # cast from fp32 to fp16 + infer_dtype = torch.bfloat16 if torch.cuda.is_bf16_supported() else torch.float16 # detect cuda capability + model = model.to(infer_dtype) if model_args.quantization_bit is None else model trainable_params, all_param = count_parameters(model) logger.info("trainable params: {:d} || all params: {:d} || trainable%: {:.4f}".format( diff --git a/src/llmtuner/tuner/core/parser.py b/src/llmtuner/tuner/core/parser.py index c5bdbe16..7dda0a5c 100644 --- a/src/llmtuner/tuner/core/parser.py +++ b/src/llmtuner/tuner/core/parser.py @@ -151,13 +151,16 @@ def get_train_args( training_args.optim = "adamw_torch" if training_args.optim == "adamw_hf" else training_args.optim # suppress warning - if model_args.quantization_bit is not None: - if training_args.fp16: - model_args.compute_dtype = torch.float16 - elif training_args.bf16: - model_args.compute_dtype = torch.bfloat16 - else: - model_args.compute_dtype = torch.float32 + if training_args.fp16: + model_args.compute_dtype = torch.float16 + elif training_args.bf16: + if not torch.cuda.is_bf16_supported(): + raise ValueError("Current device does not support bf16 training.") + model_args.compute_dtype = torch.bfloat16 + else: + model_args.compute_dtype = torch.float32 + + model_args.model_max_length = data_args.max_source_length + data_args.max_target_length # Log on each process the small summary: logger.info("Process rank: {}, device: {}, n_gpu: {}\n distributed training: {}, 16-bits training: {}".format( diff --git a/src/llmtuner/tuner/tune.py b/src/llmtuner/tuner/tune.py index 7b9446e9..a4a4c2a1 100644 --- a/src/llmtuner/tuner/tune.py +++ b/src/llmtuner/tuner/tune.py @@ -35,7 +35,7 @@ def run_exp(args: Optional[Dict[str, Any]] = None, callbacks: Optional[List["Tra def export_model(args: Optional[Dict[str, Any]] = None, max_shard_size: Optional[str] = "10GB"): - model_args, _, training_args, finetuning_args, _ = get_train_args(args) + model_args, _, training_args, finetuning_args, _, _ = get_train_args(args) model, tokenizer = load_model_and_tokenizer(model_args, finetuning_args) model.save_pretrained(training_args.output_dir, max_shard_size=max_shard_size) try: diff --git a/src/llmtuner/webui/components/eval.py b/src/llmtuner/webui/components/eval.py index ce6eddae..72d08a1f 100644 --- a/src/llmtuner/webui/components/eval.py +++ b/src/llmtuner/webui/components/eval.py @@ -14,13 +14,13 @@ def create_eval_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict with gr.Row(): dataset_dir = gr.Textbox(value=DEFAULT_DATA_DIR, scale=2) dataset = gr.Dropdown(multiselect=True, scale=4) - preview_btn = gr.Button(interactive=False, scale=1) + data_preview_btn = gr.Button(interactive=False, scale=1) preview_box, preview_count, preview_samples, close_btn = create_preview_box() dataset_dir.change(list_dataset, [dataset_dir], [dataset]) - dataset.change(can_preview, [dataset_dir, dataset], [preview_btn]) - preview_btn.click( + dataset.change(can_preview, [dataset_dir, dataset], [data_preview_btn]) + data_preview_btn.click( get_preview, [dataset_dir, dataset], [preview_count, preview_samples, preview_box], @@ -35,6 +35,7 @@ def create_eval_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict predict = gr.Checkbox(value=True) with gr.Row(): + cmd_preview_btn = gr.Button() start_btn = gr.Button() stop_btn = gr.Button() @@ -44,35 +45,36 @@ def create_eval_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict with gr.Box(): output_box = gr.Markdown() - start_btn.click( - runner.run_eval, - [ - top_elems["lang"], - top_elems["model_name"], - top_elems["checkpoints"], - top_elems["finetuning_type"], - top_elems["quantization_bit"], - top_elems["template"], - top_elems["source_prefix"], - dataset_dir, - dataset, - max_source_length, - max_target_length, - max_samples, - batch_size, - predict - ], - [ - output_box, - process_bar - ] - ) + input_list = [ + top_elems["lang"], + top_elems["model_name"], + top_elems["checkpoints"], + top_elems["finetuning_type"], + top_elems["quantization_bit"], + top_elems["template"], + top_elems["source_prefix"], + dataset_dir, + dataset, + max_source_length, + max_target_length, + max_samples, + batch_size, + predict + ] + + output_list = [ + output_box, + process_bar + ] + + cmd_preview_btn.click(runner.preview_eval, input_list, output_list) + start_btn.click(runner.run_eval, input_list, output_list) stop_btn.click(runner.set_abort, queue=False) return dict( dataset_dir=dataset_dir, dataset=dataset, - preview_btn=preview_btn, + data_preview_btn=data_preview_btn, preview_count=preview_count, preview_samples=preview_samples, close_btn=close_btn, @@ -81,6 +83,7 @@ def create_eval_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict max_samples=max_samples, batch_size=batch_size, predict=predict, + cmd_preview_btn=cmd_preview_btn, start_btn=start_btn, stop_btn=stop_btn, output_box=output_box diff --git a/src/llmtuner/webui/components/sft.py b/src/llmtuner/webui/components/sft.py index e74ef5cf..a4101d15 100644 --- a/src/llmtuner/webui/components/sft.py +++ b/src/llmtuner/webui/components/sft.py @@ -16,13 +16,13 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ with gr.Row(): dataset_dir = gr.Textbox(value=DEFAULT_DATA_DIR, scale=2) dataset = gr.Dropdown(multiselect=True, scale=4) - preview_btn = gr.Button(interactive=False, scale=1) + data_preview_btn = gr.Button(interactive=False, scale=1) preview_box, preview_count, preview_samples, close_btn = create_preview_box() dataset_dir.change(list_dataset, [dataset_dir], [dataset]) - dataset.change(can_preview, [dataset_dir, dataset], [preview_btn]) - preview_btn.click( + dataset.change(can_preview, [dataset_dir, dataset], [data_preview_btn]) + data_preview_btn.click( get_preview, [dataset_dir, dataset], [preview_count, preview_samples, preview_box], @@ -61,15 +61,12 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ resume_lora_training = gr.Checkbox(value=True, scale=1) with gr.Row(): - preview_script_btn = gr.Button() + cmd_preview_btn = gr.Button() start_btn = gr.Button() stop_btn = gr.Button() with gr.Row(): with gr.Column(scale=3): - with gr.Box(): - preview_script_box = gr.Textbox() - with gr.Row(): output_dir = gr.Textbox() @@ -82,82 +79,45 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ with gr.Column(scale=1): loss_viewer = gr.Plot() - preview_script_btn.click( - runner.preview_sft_script, - [ - top_elems["lang"], - top_elems["model_name"], - top_elems["checkpoints"], - top_elems["finetuning_type"], - top_elems["quantization_bit"], - top_elems["template"], - top_elems["source_prefix"], - dataset_dir, - dataset, - max_source_length, - max_target_length, - learning_rate, - num_train_epochs, - max_samples, - batch_size, - gradient_accumulation_steps, - lr_scheduler_type, - max_grad_norm, - val_size, - logging_steps, - save_steps, - warmup_steps, - compute_type, - padding_side, - lora_rank, - lora_dropout, - lora_target, - resume_lora_training, - output_dir - ], - [ - preview_script_box - ] - ) + input_list = [ + top_elems["lang"], + top_elems["model_name"], + top_elems["checkpoints"], + top_elems["finetuning_type"], + top_elems["quantization_bit"], + top_elems["template"], + top_elems["source_prefix"], + dataset_dir, + dataset, + max_source_length, + max_target_length, + learning_rate, + num_train_epochs, + max_samples, + batch_size, + gradient_accumulation_steps, + lr_scheduler_type, + max_grad_norm, + val_size, + logging_steps, + save_steps, + warmup_steps, + compute_type, + padding_side, + lora_rank, + lora_dropout, + lora_target, + resume_lora_training, + output_dir + ] - start_btn.click( - runner.run_train, - [ - top_elems["lang"], - top_elems["model_name"], - top_elems["checkpoints"], - top_elems["finetuning_type"], - top_elems["quantization_bit"], - top_elems["template"], - top_elems["source_prefix"], - dataset_dir, - dataset, - max_source_length, - max_target_length, - learning_rate, - num_train_epochs, - max_samples, - batch_size, - gradient_accumulation_steps, - lr_scheduler_type, - max_grad_norm, - val_size, - logging_steps, - save_steps, - warmup_steps, - compute_type, - padding_side, - lora_rank, - lora_dropout, - lora_target, - resume_lora_training, - output_dir - ], - [ - output_box, - process_bar - ] - ) + output_list = [ + output_box, + process_bar + ] + + cmd_preview_btn.click(runner.preview_train, input_list, output_list) + start_btn.click(runner.run_train, input_list, output_list) stop_btn.click(runner.set_abort, queue=False) process_bar.change( @@ -167,7 +127,7 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ return dict( dataset_dir=dataset_dir, dataset=dataset, - preview_btn=preview_btn, + data_preview_btn=data_preview_btn, preview_count=preview_count, preview_samples=preview_samples, close_btn=close_btn, @@ -192,11 +152,10 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ lora_dropout=lora_dropout, lora_target=lora_target, resume_lora_training=resume_lora_training, + cmd_preview_btn=cmd_preview_btn, start_btn=start_btn, stop_btn=stop_btn, output_dir=output_dir, output_box=output_box, - loss_viewer=loss_viewer, - preview_script_btn=preview_script_btn, - preview_script_box=preview_script_box + loss_viewer=loss_viewer ) diff --git a/src/llmtuner/webui/locales.py b/src/llmtuner/webui/locales.py index c4845735..aba4acae 100644 --- a/src/llmtuner/webui/locales.py +++ b/src/llmtuner/webui/locales.py @@ -105,12 +105,12 @@ LOCALES = { "label": "数据集" } }, - "preview_btn": { + "data_preview_btn": { "en": { - "value": "Preview" + "value": "Preview dataset" }, "zh": { - "value": "预览" + "value": "预览数据集" } }, "preview_count": { @@ -335,6 +335,14 @@ LOCALES = { "info": "接着上次的 LoRA 权重训练或创建一个新的 LoRA 权重。" } }, + "cmd_preview_btn": { + "en": { + "value": "Preview command" + }, + "zh": { + "value": "预览命令" + } + }, "start_btn": { "en": { "value": "Start" @@ -500,22 +508,6 @@ LOCALES = { "zh": { "value": "开始导出" } - }, - "preview_script_btn": { - "en": { - "value": "preview train script" - }, - "zh": { - "value": "预览训练脚本命令" - } - }, - "preview_script_box": { - "en": { - "label": "SFT Script Preview", - }, - "zh": { - "label": "训练命令预览", - } } } diff --git a/src/llmtuner/webui/runner.py b/src/llmtuner/webui/runner.py index d0d12d14..aab31349 100644 --- a/src/llmtuner/webui/runner.py +++ b/src/llmtuner/webui/runner.py @@ -5,16 +5,16 @@ import threading import time import transformers from transformers.trainer import TRAINING_ARGS_NAME -from typing import Generator, List, Tuple +from typing import Any, Dict, Generator, List, Tuple from llmtuner.extras.callbacks import LogCallback -from llmtuner.extras.constants import DEFAULT_MODULE, SFT_SCRIPT_PREFIX +from llmtuner.extras.constants import DEFAULT_MODULE from llmtuner.extras.logging import LoggerHandler from llmtuner.extras.misc import torch_gc from llmtuner.tuner import run_exp from llmtuner.webui.common import get_model_path, get_save_dir from llmtuner.webui.locales import ALERTS -from llmtuner.webui.utils import get_eval_results, update_process_bar +from llmtuner.webui.utils import gen_cmd, get_eval_results, update_process_bar class Runner: @@ -22,39 +22,36 @@ class Runner: def __init__(self): self.aborted = False self.running = False + self.logger_handler = LoggerHandler() + self.logger_handler.setLevel(logging.INFO) + logging.root.addHandler(self.logger_handler) + transformers.logging.add_handler(self.logger_handler) def set_abort(self): self.aborted = True self.running = False - def initialize( + def _initialize( self, lang: str, model_name: str, dataset: List[str] - ) -> Tuple[str, str, LoggerHandler, LogCallback]: + ) -> str: if self.running: - return None, ALERTS["err_conflict"][lang], None, None + return ALERTS["err_conflict"][lang] if not model_name: - return None, ALERTS["err_no_model"][lang], None, None + return ALERTS["err_no_model"][lang] - model_name_or_path = get_model_path(model_name) - if not model_name_or_path: - return None, ALERTS["err_no_path"][lang], None, None + if not get_model_path(model_name): + return ALERTS["err_no_path"][lang] if len(dataset) == 0: - return None, ALERTS["err_no_dataset"][lang], None, None + return ALERTS["err_no_dataset"][lang] self.aborted = False - self.running = True + self.logger_handler.reset() + self.trainer_callback = LogCallback(self) + return "" - logger_handler = LoggerHandler() - logger_handler.setLevel(logging.INFO) - logging.root.addHandler(logger_handler) - transformers.logging.add_handler(logger_handler) - trainer_callback = LogCallback(self) - - return model_name_or_path, "", logger_handler, trainer_callback - - def finalize( + def _finalize( self, lang: str, finish_info: str ) -> str: self.running = False @@ -64,7 +61,7 @@ class Runner: else: return finish_info - def run_train( + def _parse_train_args( self, lang: str, model_name: str, @@ -95,52 +92,19 @@ class Runner: lora_target: str, resume_lora_training: bool, output_dir: str - ) -> Generator[str, None, None]: - model_name_or_path, error, logger_handler, trainer_callback = self.initialize(lang, model_name, dataset) - if error: - yield error, gr.update(visible=False) - return - output_dir = os.path.join(get_save_dir(model_name), finetuning_type, output_dir) - - args = self._build_args(batch_size, checkpoints, compute_type, dataset, dataset_dir, finetuning_type, - gradient_accumulation_steps, learning_rate, logging_steps, lora_dropout, lora_rank, - lora_target, lr_scheduler_type, max_grad_norm, max_samples, max_source_length, - max_target_length, model_name, model_name_or_path, num_train_epochs, output_dir, - padding_side, quantization_bit, resume_lora_training, save_steps, source_prefix, - template, val_size, warmup_steps) - - run_kwargs = dict(args=args, callbacks=[trainer_callback]) - thread = threading.Thread(target=run_exp, kwargs=run_kwargs) - thread.start() - - while thread.is_alive(): - time.sleep(2) - if self.aborted: - yield ALERTS["info_aborting"][lang], gr.update(visible=False) - else: - yield logger_handler.log, update_process_bar(trainer_callback) - - if os.path.exists(os.path.join(output_dir, TRAINING_ARGS_NAME)): - finish_info = ALERTS["info_finished"][lang] - else: - finish_info = ALERTS["err_failed"][lang] - - yield self.finalize(lang, finish_info), gr.update(visible=False) - - def _build_args(self, batch_size, checkpoints, compute_type, dataset, dataset_dir, finetuning_type, - gradient_accumulation_steps, learning_rate, logging_steps, lora_dropout, lora_rank, lora_target, - lr_scheduler_type, max_grad_norm, max_samples, max_source_length, max_target_length, model_name, - model_name_or_path, num_train_epochs, output_dir, padding_side, quantization_bit, - resume_lora_training, save_steps, source_prefix, template, val_size, warmup_steps): + ) -> Tuple[str, str, List[str], str, Dict[str, Any]]: if checkpoints: checkpoint_dir = ",".join( - [os.path.join(get_save_dir(model_name), finetuning_type, checkpoint) for checkpoint in checkpoints] + [os.path.join(get_save_dir(model_name), finetuning_type, ckpt) for ckpt in checkpoints] ) else: checkpoint_dir = None + + output_dir = os.path.join(get_save_dir(model_name), finetuning_type, output_dir) + args = dict( stage="sft", - model_name_or_path=model_name_or_path, + model_name_or_path=get_model_path(model_name), do_train=True, overwrite_cache=True, checkpoint_dir=checkpoint_dir, @@ -171,14 +135,16 @@ class Runner: resume_lora_training=resume_lora_training, output_dir=output_dir ) + if val_size > 1e-6: args["val_size"] = val_size args["evaluation_strategy"] = "steps" args["eval_steps"] = save_steps args["load_best_model_at_end"] = True - return args - def run_eval( + return lang, model_name, dataset, output_dir, args + + def _parse_eval_args( self, lang: str, model_name: str, @@ -194,12 +160,7 @@ class Runner: max_samples: str, batch_size: int, predict: bool - ) -> Generator[str, None, None]: - model_name_or_path, error, logger_handler, trainer_callback = self.initialize(lang, model_name, dataset) - if error: - yield error, gr.update(visible=False) - return - + ) -> Tuple[str, str, List[str], str, Dict[str, Any]]: if checkpoints: checkpoint_dir = ",".join( [os.path.join(get_save_dir(model_name), finetuning_type, checkpoint) for checkpoint in checkpoints] @@ -211,7 +172,7 @@ class Runner: args = dict( stage="sft", - model_name_or_path=model_name_or_path, + model_name_or_path=get_model_path(model_name), do_eval=True, overwrite_cache=True, predict_with_generate=True, @@ -233,7 +194,33 @@ class Runner: args.pop("do_eval", None) args["do_predict"] = True - run_kwargs = dict(args=args, callbacks=[trainer_callback]) + return lang, model_name, dataset, output_dir, args + + def preview_train(self, *args) -> Generator[Tuple[str, Dict[str, Any]], None, None]: + lang, model_name, dataset, _, args = self._parse_train_args(*args) + error = self._initialize(lang, model_name, dataset) + if error: + yield error, gr.update(visible=False) + else: + yield gen_cmd(args), gr.update(visible=False) + + def preview_eval(self, *args) -> Generator[Tuple[str, Dict[str, Any]], None, None]: + lang, model_name, dataset, _, args = self._parse_eval_args(*args) + error = self._initialize(lang, model_name, dataset) + if error: + yield error, gr.update(visible=False) + else: + yield gen_cmd(args), gr.update(visible=False) + + def run_train(self, *args) -> Generator[Tuple[str, Dict[str, Any]], None, None]: + lang, model_name, dataset, output_dir, args = self._parse_train_args(*args) + error = self._initialize(lang, model_name, dataset) + if error: + yield error, gr.update(visible=False) + return + + self.running = True + run_kwargs = dict(args=args, callbacks=[self.trainer_callback]) thread = threading.Thread(target=run_exp, kwargs=run_kwargs) thread.start() @@ -242,60 +229,37 @@ class Runner: if self.aborted: yield ALERTS["info_aborting"][lang], gr.update(visible=False) else: - yield logger_handler.log, update_process_bar(trainer_callback) + yield self.logger_handler.log, update_process_bar(self.trainer_callback) + + if os.path.exists(os.path.join(output_dir, TRAINING_ARGS_NAME)): + finish_info = ALERTS["info_finished"][lang] + else: + finish_info = ALERTS["err_failed"][lang] + + yield self._finalize(lang, finish_info), gr.update(visible=False) + + def run_eval(self, *args) -> Generator[str, None, None]: + lang, model_name, dataset, output_dir, args = self._parse_eval_args(*args) + error = self._initialize(lang, model_name, dataset) + if error: + yield error, gr.update(visible=False) + return + + self.running = True + run_kwargs = dict(args=args, callbacks=[self.trainer_callback]) + thread = threading.Thread(target=run_exp, kwargs=run_kwargs) + thread.start() + + while thread.is_alive(): + time.sleep(2) + if self.aborted: + yield ALERTS["info_aborting"][lang], gr.update(visible=False) + else: + yield self.logger_handler.log, update_process_bar(self.trainer_callback) if os.path.exists(os.path.join(output_dir, "all_results.json")): finish_info = get_eval_results(os.path.join(output_dir, "all_results.json")) else: finish_info = ALERTS["err_failed"][lang] - yield self.finalize(lang, finish_info), gr.update(visible=False) - - def preview_sft_script( - self, - lang: str, - model_name: str, - checkpoints: List[str], - finetuning_type: str, - quantization_bit: str, - template: str, - source_prefix: str, - dataset_dir: str, - dataset: List[str], - max_source_length: int, - max_target_length: int, - learning_rate: str, - num_train_epochs: str, - max_samples: str, - batch_size: int, - gradient_accumulation_steps: int, - lr_scheduler_type: str, - max_grad_norm: str, - val_size: float, - logging_steps: int, - save_steps: int, - warmup_steps: int, - compute_type: str, - padding_side: str, - lora_rank: int, - lora_dropout: float, - lora_target: str, - resume_lora_training: bool, - output_dir: str - ): - model_name_or_path, error, logger_handler, trainer_callback = self.initialize(lang, model_name, dataset) - output_dir = os.path.join(get_save_dir(model_name), finetuning_type, output_dir) - - args = self._build_args(batch_size, checkpoints, compute_type, dataset, dataset_dir, finetuning_type, - gradient_accumulation_steps, learning_rate, logging_steps, lora_dropout, lora_rank, - lora_target, lr_scheduler_type, max_grad_norm, max_samples, max_source_length, - max_target_length, model_name, model_name_or_path, num_train_epochs, output_dir, - padding_side, quantization_bit, resume_lora_training, save_steps, source_prefix, - template, val_size, warmup_steps) - script_lines = [SFT_SCRIPT_PREFIX] - for param_key, param_value in args.items(): - # filter None - if param_value: - script_lines.append(" --" + param_key + " " + str(param_value) + " ") - script_str = "\\\n".join(script_lines) - return gr.update(value=script_str) + yield self._finalize(lang, finish_info), gr.update(visible=False) diff --git a/src/llmtuner/webui/utils.py b/src/llmtuner/webui/utils.py index fb22bd0c..6ca55e14 100644 --- a/src/llmtuner/webui/utils.py +++ b/src/llmtuner/webui/utils.py @@ -62,6 +62,16 @@ def can_quantize(finetuning_type: str) -> Dict[str, Any]: return gr.update(interactive=True) +def gen_cmd(args: Dict[str, Any]) -> str: + cmd_lines = ["CUDA_VISIBLE_DEVICES=0 python "] + for k, v in args.items(): + if v is not None and v is not False and v != "": + cmd_lines.append(" --{} {} ".format(k, str(v))) + cmd_text = "\\\n".join(cmd_lines) + cmd_text = "```bash\n{}\n```".format(cmd_text) + return cmd_text + + def get_eval_results(path: os.PathLike) -> str: with open(path, "r", encoding="utf-8") as f: result = json.dumps(json.load(f), indent=4) From ba65dcb15e11d1359f1aec57b0ad30b39b69b05d Mon Sep 17 00:00:00 2001 From: hiyouga Date: Sat, 12 Aug 2023 21:00:11 +0800 Subject: [PATCH 17/45] update readme Former-commit-id: 1836c020c514e7a94aaa48abdf19ea8accbc1a2a --- README.md | 2 ++ README_zh.md | 2 ++ src/llmtuner/tuner/core/loader.py | 2 ++ 3 files changed, 6 insertions(+) diff --git a/README.md b/README.md index a54ac30a..3d617f47 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ ## Changelog +[23/08/12] Now we support **RoPE scaling** to extend the context length of the LLaMA models. Try `--rope_scaling linear` argument in training and `--rope_scaling dynamic` argument at inference to extrapolate the position embeddings. + [23/08/11] Now we support **[DPO training](https://arxiv.org/abs/2305.18290)** for instruction-tuned models. See [this example](#dpo-training) to train your models (experimental feature). [23/08/03] Now we support training the **Qwen-7B** model in this repo. Try `--model_name_or_path Qwen/Qwen-7B-Chat` and `--lora_target c_attn` arguments to train the Qwen-7B model. Remember to use `--template chatml` argument when you are using the Qwen-7B-Chat model. diff --git a/README_zh.md b/README_zh.md index f9d967c5..5aa9a7d6 100644 --- a/README_zh.md +++ b/README_zh.md @@ -12,6 +12,8 @@ ## 更新日志 +[23/08/12] 现在我们支持了 **RoPE 插值**来扩展 LLaMA 模型的上下文长度。请尝试使用 `--rope_scaling linear` 参数训练模型或使用 `--rope_scaling dynamic` 参数评估模型。 + [23/08/11] 现在我们支持了指令模型的 **[DPO 训练](https://arxiv.org/abs/2305.18290)**。详情请参阅[此示例](#dpo-训练)(实验性功能)。 [23/08/03] 现在我们支持了 **Qwen-7B** 模型的训练。请尝试使用 `--model_name_or_path Qwen/Qwen-7B-Chat` 和 `--lora_target c_attn` 参数。使用 Qwen-7B-Chat 模型请添加 `--template chatml` 参数。 diff --git a/src/llmtuner/tuner/core/loader.py b/src/llmtuner/tuner/core/loader.py index c03bdf63..32d6247a 100644 --- a/src/llmtuner/tuner/core/loader.py +++ b/src/llmtuner/tuner/core/loader.py @@ -83,6 +83,8 @@ def load_model_and_tokenizer( # Set RoPE scaling if model_args.rope_scaling is not None: + require_version("transformers>=4.31.0", "RoPE scaling requires transformers>=4.31.0") + if hasattr(config, "use_dynamic_ntk"): # for Qwen models if is_trainable: logger.warning("Qwen model does not support rope scaling in training.") From 8686e62dfa75ce864a66c5c92e5288c3dd2e7b4e Mon Sep 17 00:00:00 2001 From: hiyouga Date: Sat, 12 Aug 2023 21:23:05 +0800 Subject: [PATCH 18/45] update readme Former-commit-id: 2618e0b5a7ad88f68971f21d0e7eb4560866400f --- README.md | 52 +++++++++++++++++++++++++++++++++++++----- README_zh.md | 64 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 97 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 3d617f47..fc7ff69e 100644 --- a/README.md +++ b/README.md @@ -18,17 +18,17 @@ [23/08/03] Now we support training the **Qwen-7B** model in this repo. Try `--model_name_or_path Qwen/Qwen-7B-Chat` and `--lora_target c_attn` arguments to train the Qwen-7B model. Remember to use `--template chatml` argument when you are using the Qwen-7B-Chat model. -[23/07/31] Now we support dataset streaming. Try `--streaming` and `--max_steps 100` arguments to stream your dataset. +[23/07/31] Now we support **dataset streaming**. Try `--streaming` and `--max_steps 10000` arguments to load your dataset in streaming mode. [23/07/29] We release two instruction-tuned 13B models at Hugging Face. See these Hugging Face Repos ([LLaMA-2](https://huggingface.co/hiyouga/Llama-2-Chinese-13b-chat) / [Baichuan](https://huggingface.co/hiyouga/baichuan-13b-sft)) for details. [23/07/19] Now we support training the **LLaMA-2** models in this repo. Try `--model_name_or_path meta-llama/Llama-2-7b-hf` argument to use the LLaMA-2 model. Remember to use `--template llama2` argument when you are using the LLaMA-2-chat model. -[23/07/18] Now we develop an all-in-one Web UI for training, evaluation and inference. Try `train_web.py` to fine-tune models in your Web browser. Thank [@KanadeSiina](https://github.com/KanadeSiina) and [@codemayq](https://github.com/codemayq) for their efforts in the development. +[23/07/18] Now we develop an **all-in-one Web UI** for training, evaluation and inference. Try `train_web.py` to fine-tune models in your Web browser. Thank [@KanadeSiina](https://github.com/KanadeSiina) and [@codemayq](https://github.com/codemayq) for their efforts in the development. [23/07/11] Now we support training the **Baichuan-13B** model in this repo. Try `--model_name_or_path baichuan-inc/Baichuan-13B-Base` and `--lora_target W_pack` arguments to train the Baichuan-13B model. Remember to use `--template baichuan` argument when you are using the Baichuan-13B-Chat model. -[23/07/09] Now we release [FastEdit](https://github.com/hiyouga/FastEdit)⚡🩹, an easy-to-use package for editing the factual knowledge of large language models efficiently. Please follow [FastEdit](https://github.com/hiyouga/FastEdit) if you are interested. +[23/07/09] Now we release **[FastEdit](https://github.com/hiyouga/FastEdit)**⚡🩹, an easy-to-use package for editing the factual knowledge of large language models efficiently. Please follow [FastEdit](https://github.com/hiyouga/FastEdit) if you are interested. [23/07/07] Now we support training the **InternLM-7B** model in this repo. Try `--model_name_or_path internlm/internlm-7b` argument to use the InternLM model. Remember to use `--template intern` argument when you are using the InternLM-chat model. @@ -72,6 +72,8 @@ | PPO Training | | | ✅ | ✅ | | DPO Training | ✅ | | ✅ | ✅ | +- Use `--quantization_bit 4/8` argument to enable QLoRA. + ## Provided Datasets - For pre-training: @@ -204,8 +206,6 @@ CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ --fp16 ``` -Remember to specify `--lora_target W_pack` if you are using Baichuan models. - ### Reward Model Training ```bash @@ -280,12 +280,14 @@ CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ ### Distributed Training +#### Use Huggingface Accelerate + ```bash accelerate config # configure the environment accelerate launch src/train_bash.py # arguments (same as above) ``` -

Example configuration for full-tuning with DeepSpeed ZeRO-2 +
Example config.yaml for training with DeepSpeed ZeRO-2 ```yaml compute_environment: LOCAL_MACHINE @@ -313,6 +315,44 @@ use_cpu: false
+#### Use DeepSpeed + +```bash +deepspeed --num_gpus 8 --master_port=9901 src/train_bash.py \ + --deepspeed ds_config.json \ + ... # arguments (same as above) +``` + +
Example ds_config.json for training with DeepSpeed ZeRO-2 + +```json +{ + "train_micro_batch_size_per_gpu": "auto", + "gradient_accumulation_steps": "auto", + "gradient_clipping": "auto", + "zero_allow_untested_optimizer": true, + "fp16": { + "enabled": "auto", + "loss_scale": 0, + "initial_scale_power": 16, + "loss_scale_window": 1000, + "hysteresis": 2, + "min_loss_scale": 1 + }, + "zero_optimization": { + "stage": 2, + "allgather_partitions": true, + "allgather_bucket_size": 5e8, + "reduce_scatter": true, + "reduce_bucket_size": 5e8, + "overlap_comm": false, + "contiguous_gradients": true + } +} +``` + +
+ ### Evaluation (BLEU and ROUGE_CHINESE) ```bash diff --git a/README_zh.md b/README_zh.md index 5aa9a7d6..c2f83504 100644 --- a/README_zh.md +++ b/README_zh.md @@ -16,31 +16,31 @@ [23/08/11] 现在我们支持了指令模型的 **[DPO 训练](https://arxiv.org/abs/2305.18290)**。详情请参阅[此示例](#dpo-训练)(实验性功能)。 -[23/08/03] 现在我们支持了 **Qwen-7B** 模型的训练。请尝试使用 `--model_name_or_path Qwen/Qwen-7B-Chat` 和 `--lora_target c_attn` 参数。使用 Qwen-7B-Chat 模型请添加 `--template chatml` 参数。 +[23/08/03] 现在我们支持了 **Qwen-7B** 模型的训练。请尝试使用 `--model_name_or_path Qwen/Qwen-7B-Chat` 和 `--lora_target c_attn` 参数。使用 Qwen-7B-Chat 模型时请添加 `--template chatml` 参数。 -[23/07/31] 现在我们支持了训练数据流式加载。请尝试使用 `--streaming` 和 `--max_steps 100` 参数来流式加载数据集。 +[23/07/31] 现在我们支持了**数据流式加载**。请尝试使用 `--streaming` 和 `--max_steps 10000` 参数来流式加载数据集。 [23/07/29] 我们在 Hugging Face 发布了两个 13B 指令微调模型。详细内容请查阅我们的 Hugging Face 项目([LLaMA-2](https://huggingface.co/hiyouga/Llama-2-Chinese-13b-chat) / [Baichuan](https://huggingface.co/hiyouga/baichuan-13b-sft))。 -[23/07/19] 现在我们支持了 **LLaMA-2** 模型的训练。请尝试使用 `--model_name_or_path meta-llama/Llama-2-7b-hf` 参数。请注意使用 LLaMA-2-chat 模型需要添加 `--template llama2` 参数。 +[23/07/19] 现在我们支持了 **LLaMA-2** 模型的训练。请尝试使用 `--model_name_or_path meta-llama/Llama-2-7b-hf` 参数。使用 LLaMA-2-chat 模型时请添加 `--template llama2` 参数。 -[23/07/18] 我们开发了支持训练和测试的浏览器一键微调界面。请尝试使用 `train_web.py` 在您的浏览器中微调模型。感谢 [@KanadeSiina](https://github.com/KanadeSiina) 和 [@codemayq](https://github.com/codemayq) 在该功能开发中付出的努力。 +[23/07/18] 我们开发了支持训练和测试的**一体化浏览器界面**。请尝试使用 `train_web.py` 在您的浏览器中微调模型。感谢 [@KanadeSiina](https://github.com/KanadeSiina) 和 [@codemayq](https://github.com/codemayq) 在该功能开发中付出的努力。 -[23/07/11] 现在我们支持了 **Baichuan-13B** 模型的训练。请尝试使用 `--model_name_or_path baichuan-inc/Baichuan-13B-Base` 和 `--lora_target W_pack` 参数。请注意使用 Baichuan-13B-Chat 模型需要添加 `--template baichuan` 参数。 +[23/07/11] 现在我们支持了 **Baichuan-13B** 模型的训练。请尝试使用 `--model_name_or_path baichuan-inc/Baichuan-13B-Base` 和 `--lora_target W_pack` 参数。使用 Baichuan-13B-Chat 模型时请添加 `--template baichuan` 参数。 -[23/07/09] 我们开源了 [FastEdit](https://github.com/hiyouga/FastEdit)⚡🩹,一个简单易用的、能迅速编辑大模型事实记忆的工具包。如果您感兴趣请关注我们的 [FastEdit](https://github.com/hiyouga/FastEdit) 项目。 +[23/07/09] 我们开源了 **[FastEdit](https://github.com/hiyouga/FastEdit)**⚡🩹,一个简单易用的、能迅速编辑大模型事实记忆的工具包。如果您感兴趣请关注我们的 [FastEdit](https://github.com/hiyouga/FastEdit) 项目。 -[23/07/07] 现在我们支持了 **InternLM-7B** 模型的训练。请尝试使用 `--model_name_or_path internlm/internlm-7b` 参数。请注意使用 InternLM-chat 模型需要添加 `--template intern` 参数。 +[23/07/07] 现在我们支持了 **InternLM-7B** 模型的训练。请尝试使用 `--model_name_or_path internlm/internlm-7b` 参数。使用 InternLM-chat 模型时请添加 `--template intern` 参数。 [23/07/05] 现在我们支持了 **Falcon-7B/40B** 模型的训练。请尝试使用 `--model_name_or_path tiiuae/falcon-7b` 和 `--lora_target query_key_value` 参数。 [23/06/29] 我们提供了一个**可复现的**指令模型微调示例,详细内容请查阅 [Hugging Face 项目](https://huggingface.co/hiyouga/baichuan-7b-sft)。 -[23/06/22] 我们对齐了[示例 API](src/api_demo.py) 与 [OpenAI API](https://platform.openai.com/docs/api-reference/chat) 的格式,您可以将微调模型接入任意基于 ChatGPT 的应用中。 +[23/06/22] 我们对齐了[示例 API](src/api_demo.py) 与 [OpenAI API](https://platform.openai.com/docs/api-reference/chat) 的格式,您可以将微调模型接入**任意基于 ChatGPT 的应用**中。 [23/06/15] 现在我们支持了 **Baichuan-7B** 模型的训练。请尝试使用 `--model_name_or_path baichuan-inc/Baichuan-7B` 和 `--lora_target W_pack` 参数。 -[23/06/03] 现在我们实现了 4 比特的 LoRA 训练(也称 [QLoRA](https://github.com/artidoro/qlora))。请尝试使用 `--quantization_bit 4` 参数进行 4 比特量化微调。 +[23/06/03] 现在我们实现了 4 比特的 LoRA 训练(也称 **[QLoRA](https://github.com/artidoro/qlora)**)。请尝试使用 `--quantization_bit 4` 参数进行 4 比特量化微调。 [23/05/31] 现在我们支持了 **BLOOM & BLOOMZ** 模型的训练。请尝试使用 `--model_name_or_path bigscience/bloomz-7b1-mt` 和 `--lora_target query_key_value` 参数。 @@ -71,6 +71,8 @@ | PPO 训练 | | | ✅ | ✅ | | DPO 训练 | ✅ | | ✅ | ✅ | +- 使用 `--quantization_bit 4/8` 参数来启用 QLoRA 训练。 + ## 数据集 - 用于预训练: @@ -203,8 +205,6 @@ CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ --fp16 ``` -使用 Baichuan 模型时请指定 `--lora_target W_pack` 参数。 - ### 奖励模型训练 ```bash @@ -279,6 +279,8 @@ CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ ### 多 GPU 分布式训练 +#### 使用 Huggingface Accelerate + ```bash accelerate config # 首先配置分布式环境 accelerate launch src/train_bash.py # 参数同上 @@ -312,7 +314,43 @@ use_cpu: false
-### 指标评估(BLEU分数和汉语ROUGE分数) +#### 使用 DeepSpeed + +```bash +deepspeed --num_gpus 8 --master_port=9901 src/train_bash.py --deepspeed ds_config.json ... # 参数同上 +``` + +
使用 DeepSpeed ZeRO-2 进行全参数微调的 DeepSpeed 配置示例 + +```json +{ + "train_micro_batch_size_per_gpu": "auto", + "gradient_accumulation_steps": "auto", + "gradient_clipping": "auto", + "zero_allow_untested_optimizer": true, + "fp16": { + "enabled": "auto", + "loss_scale": 0, + "initial_scale_power": 16, + "loss_scale_window": 1000, + "hysteresis": 2, + "min_loss_scale": 1 + }, + "zero_optimization": { + "stage": 2, + "allgather_partitions": true, + "allgather_bucket_size": 5e8, + "reduce_scatter": true, + "reduce_bucket_size": 5e8, + "overlap_comm": false, + "contiguous_gradients": true + } +} +``` + +
+ +### 指标评估(BLEU 分数和汉语 ROUGE 分数) ```bash CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ @@ -329,7 +367,7 @@ CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ --predict_with_generate ``` -我们建议在量化模型的评估中使用 `--per_device_eval_batch_size=1` 和 `--max_target_length 128` 参数。 +我们建议在量化模型的评估中使用 `--per_device_eval_batch_size=1` 和 `--max_target_length 128`。 ### 模型预测 From 6af7fe15adfdb12f7f5b350b730e5ac4d9b36385 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Sat, 12 Aug 2023 21:25:19 +0800 Subject: [PATCH 19/45] update readme Former-commit-id: 3ea1fa35d1f951ae411248c03a8549b9714d876a --- README_zh.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README_zh.md b/README_zh.md index c2f83504..7455a98c 100644 --- a/README_zh.md +++ b/README_zh.md @@ -317,7 +317,9 @@ use_cpu: false #### 使用 DeepSpeed ```bash -deepspeed --num_gpus 8 --master_port=9901 src/train_bash.py --deepspeed ds_config.json ... # 参数同上 +deepspeed --num_gpus 8 --master_port=9901 src/train_bash.py \ + --deepspeed ds_config.json \ + ... # 参数同上 ```
使用 DeepSpeed ZeRO-2 进行全参数微调的 DeepSpeed 配置示例 From 2bcf0025d6ccc3bf3e20b8be4d7df0834ffd3868 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Sat, 12 Aug 2023 21:29:06 +0800 Subject: [PATCH 20/45] update readme Former-commit-id: 8a79ded55d6e696368c96a6d9958e7c8cdaf977b --- README.md | 2 +- README_zh.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fc7ff69e..975a783f 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ [23/07/11] Now we support training the **Baichuan-13B** model in this repo. Try `--model_name_or_path baichuan-inc/Baichuan-13B-Base` and `--lora_target W_pack` arguments to train the Baichuan-13B model. Remember to use `--template baichuan` argument when you are using the Baichuan-13B-Chat model. -[23/07/09] Now we release **[FastEdit](https://github.com/hiyouga/FastEdit)**⚡🩹, an easy-to-use package for editing the factual knowledge of large language models efficiently. Please follow [FastEdit](https://github.com/hiyouga/FastEdit) if you are interested. +[23/07/09] Now we release **[FastEdit](https://github.com/hiyouga/FastEdit)** ⚡🩹, an easy-to-use package for editing the factual knowledge of large language models efficiently. Please follow [FastEdit](https://github.com/hiyouga/FastEdit) if you are interested. [23/07/07] Now we support training the **InternLM-7B** model in this repo. Try `--model_name_or_path internlm/internlm-7b` argument to use the InternLM model. Remember to use `--template intern` argument when you are using the InternLM-chat model. diff --git a/README_zh.md b/README_zh.md index 7455a98c..0b8ce714 100644 --- a/README_zh.md +++ b/README_zh.md @@ -28,7 +28,7 @@ [23/07/11] 现在我们支持了 **Baichuan-13B** 模型的训练。请尝试使用 `--model_name_or_path baichuan-inc/Baichuan-13B-Base` 和 `--lora_target W_pack` 参数。使用 Baichuan-13B-Chat 模型时请添加 `--template baichuan` 参数。 -[23/07/09] 我们开源了 **[FastEdit](https://github.com/hiyouga/FastEdit)**⚡🩹,一个简单易用的、能迅速编辑大模型事实记忆的工具包。如果您感兴趣请关注我们的 [FastEdit](https://github.com/hiyouga/FastEdit) 项目。 +[23/07/09] 我们开源了 **[FastEdit](https://github.com/hiyouga/FastEdit)** ⚡🩹,一个简单易用的、能迅速编辑大模型事实记忆的工具包。如果您感兴趣请关注我们的 [FastEdit](https://github.com/hiyouga/FastEdit) 项目。 [23/07/07] 现在我们支持了 **InternLM-7B** 模型的训练。请尝试使用 `--model_name_or_path internlm/internlm-7b` 参数。使用 InternLM-chat 模型时请添加 `--template intern` 参数。 From bd611e0090322fd999c40187219ed55fb0b86b2d Mon Sep 17 00:00:00 2001 From: hiyouga Date: Sat, 12 Aug 2023 22:00:01 +0800 Subject: [PATCH 21/45] fix rope scaling Former-commit-id: 8545c11c45906b33c78e144c2338963eaf0406b8 --- src/llmtuner/tuner/core/loader.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/llmtuner/tuner/core/loader.py b/src/llmtuner/tuner/core/loader.py index 32d6247a..47c72de1 100644 --- a/src/llmtuner/tuner/core/loader.py +++ b/src/llmtuner/tuner/core/loader.py @@ -102,11 +102,11 @@ def load_model_and_tokenizer( ) current_max_length = getattr(config, "max_position_embeddings", None) - if current_max_length and model_args.model_max_length <= current_max_length: + if current_max_length and model_args.model_max_length > current_max_length: + scaling_factor = float(math.ceil(model_args.model_max_length / current_max_length)) + else: logger.warning("Input length is smaller than max length. Consider increase input length.") scaling_factor = 1.0 - else: - scaling_factor = float(math.ceil(model_args.model_max_length / current_max_length)) else: scaling_factor = 2.0 From e1b43dfc7fbca053bbeb11e285e9e67366d9c489 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Sat, 12 Aug 2023 22:02:43 +0800 Subject: [PATCH 22/45] tiny fix Former-commit-id: 9dc6a296e327c5ff27cbd1697437d9d3145e3d9a --- src/llmtuner/tuner/core/loader.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/llmtuner/tuner/core/loader.py b/src/llmtuner/tuner/core/loader.py index 47c72de1..8de98387 100644 --- a/src/llmtuner/tuner/core/loader.py +++ b/src/llmtuner/tuner/core/loader.py @@ -83,17 +83,17 @@ def load_model_and_tokenizer( # Set RoPE scaling if model_args.rope_scaling is not None: - require_version("transformers>=4.31.0", "RoPE scaling requires transformers>=4.31.0") - if hasattr(config, "use_dynamic_ntk"): # for Qwen models if is_trainable: - logger.warning("Qwen model does not support rope scaling in training.") + logger.warning("Qwen model does not support RoPE scaling in training.") else: setattr(config, "use_dynamic_ntk", True) setattr(config, "use_logn_attn", True) logger.info("Using dynamic NTK scaling.") elif hasattr(config, "rope_scaling"): # for LLaMA models + require_version("transformers>=4.31.0", "RoPE scaling requires transformers>=4.31.0") + if is_trainable: if model_args.rope_scaling == "dynamic": logger.warning( From 7984ae8b629cce831214e36090efc31e9739d51d Mon Sep 17 00:00:00 2001 From: hiyouga Date: Sat, 12 Aug 2023 23:52:07 +0800 Subject: [PATCH 23/45] fix webui Former-commit-id: d69b1388e61e5e867ec5c9a9a223677c5b5860ce --- src/llmtuner/webui/components/top.py | 2 +- src/llmtuner/webui/runner.py | 4 +--- src/llmtuner/webui/utils.py | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/llmtuner/webui/components/top.py b/src/llmtuner/webui/components/top.py index 77d60593..97a332c1 100644 --- a/src/llmtuner/webui/components/top.py +++ b/src/llmtuner/webui/components/top.py @@ -26,7 +26,7 @@ def create_top() -> Dict[str, "Component"]: with gr.Accordion(label="Advanced config", open=False) as advanced_tab: with gr.Row(): - quantization_bit = gr.Dropdown([8, 4], scale=1) + quantization_bit = gr.Dropdown(["", "8", "4"], scale=1) template = gr.Dropdown(value="default", choices=list(templates.keys()), scale=1) source_prefix = gr.Textbox(scale=2) diff --git a/src/llmtuner/webui/runner.py b/src/llmtuner/webui/runner.py index aab31349..3a28dae6 100644 --- a/src/llmtuner/webui/runner.py +++ b/src/llmtuner/webui/runner.py @@ -126,8 +126,6 @@ class Runner: logging_steps=logging_steps, save_steps=save_steps, warmup_steps=warmup_steps, - fp16=(compute_type == "fp16"), - bf16=(compute_type == "bf16"), padding_side=padding_side, lora_rank=lora_rank, lora_dropout=lora_dropout, @@ -135,7 +133,7 @@ class Runner: resume_lora_training=resume_lora_training, output_dir=output_dir ) - + args[compute_type] = True if val_size > 1e-6: args["val_size"] = val_size args["evaluation_strategy"] = "steps" diff --git a/src/llmtuner/webui/utils.py b/src/llmtuner/webui/utils.py index 6ca55e14..168fbe43 100644 --- a/src/llmtuner/webui/utils.py +++ b/src/llmtuner/webui/utils.py @@ -65,7 +65,7 @@ def can_quantize(finetuning_type: str) -> Dict[str, Any]: def gen_cmd(args: Dict[str, Any]) -> str: cmd_lines = ["CUDA_VISIBLE_DEVICES=0 python "] for k, v in args.items(): - if v is not None and v is not False and v != "": + if v is not None and v != "": cmd_lines.append(" --{} {} ".format(k, str(v))) cmd_text = "\\\n".join(cmd_lines) cmd_text = "```bash\n{}\n```".format(cmd_text) From e75024fde3b8f96a706a8915dd890354449b1d5e Mon Sep 17 00:00:00 2001 From: hiyouga Date: Mon, 14 Aug 2023 00:23:56 +0800 Subject: [PATCH 24/45] fix #480 Former-commit-id: 2f2fd55d8175eb3c6ce94bc821ab4e6331f79d8e --- src/llmtuner/tuner/dpo/trainer.py | 16 +++++++++------- src/llmtuner/webui/utils.py | 1 + 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/llmtuner/tuner/dpo/trainer.py b/src/llmtuner/tuner/dpo/trainer.py index a94642c1..f0da9eaa 100644 --- a/src/llmtuner/tuner/dpo/trainer.py +++ b/src/llmtuner/tuner/dpo/trainer.py @@ -2,7 +2,7 @@ import torch from collections import defaultdict from peft import PeftModel from typing import TYPE_CHECKING, Dict, Optional, Tuple, Union -from transformers import Trainer +from transformers import BatchEncoding, Trainer from trl import DPOTrainer from llmtuner.extras.constants import IGNORE_INDEX @@ -43,21 +43,23 @@ class DPOPeftTrainer(PeftModelMixin, DPOTrainer): model: Optional[torch.nn.Module] = None, batch: Optional[Dict[str, torch.Tensor]] = None ) -> Tuple[torch.FloatTensor, torch.FloatTensor, torch.FloatTensor, torch.FloatTensor]: + batch_copied = BatchEncoding({k: v.detach().clone() for k, v in batch.items()}) # avoid error unwrapped_model: "PreTrainedModel" = self.accelerator.unwrap_model(self.model) + if not torch.is_grad_enabled(): unwrapped_model.gradient_checkpointing_disable() if model is None and isinstance(unwrapped_model, PeftModel): # peft model has no ref_model with unwrapped_model.disable_adapter(): - all_logits: torch.Tensor = self.model( - batch["input_ids"], - attention_mask=batch["attention_mask"], + all_logits = self.model( + input_ids=batch_copied["input_ids"], + attention_mask=batch_copied["attention_mask"], return_dict=True ).logits.to(torch.float32) else: - all_logits: torch.Tensor = model( - batch["input_ids"], - attention_mask=batch["attention_mask"], + all_logits = model( + input_ids=batch_copied["input_ids"], + attention_mask=batch_copied["attention_mask"], return_dict=True ).logits.to(torch.float32) diff --git a/src/llmtuner/webui/utils.py b/src/llmtuner/webui/utils.py index 168fbe43..152df6e3 100644 --- a/src/llmtuner/webui/utils.py +++ b/src/llmtuner/webui/utils.py @@ -63,6 +63,7 @@ def can_quantize(finetuning_type: str) -> Dict[str, Any]: def gen_cmd(args: Dict[str, Any]) -> str: + args["plot_loss"] = True cmd_lines = ["CUDA_VISIBLE_DEVICES=0 python "] for k, v in args.items(): if v is not None and v != "": From 6c9b035c0e524be1ba5a2f1d70ec03349b1d2fe7 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Mon, 14 Aug 2023 10:48:47 +0800 Subject: [PATCH 25/45] web UI integrating RLHF Former-commit-id: ec94274ca155300aee27621c018dd1bbaf78194b --- README.md | 6 +-- src/llmtuner/tuner/ppo/workflow.py | 4 +- src/llmtuner/webui/common.py | 10 +++-- src/llmtuner/webui/components/__init__.py | 2 +- src/llmtuner/webui/components/top.py | 15 +++++--- .../webui/components/{sft.py => train.py} | 36 ++++++++++++++---- src/llmtuner/webui/interface.py | 10 ++--- src/llmtuner/webui/locales.py | 38 +++++++++++++++++++ src/llmtuner/webui/manager.py | 14 +++++-- src/llmtuner/webui/runner.py | 22 ++++++++++- src/llmtuner/webui/utils.py | 3 +- 11 files changed, 128 insertions(+), 32 deletions(-) rename src/llmtuner/webui/components/{sft.py => train.py} (80%) diff --git a/README.md b/README.md index 975a783f..1124ade2 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ | ---------------------- | -------------- | ----------------- | ---- | ----- | | Pre-Training | ✅ | ✅ | ✅ | ✅ | | Supervised Fine-Tuning | ✅ | ✅ | ✅ | ✅ | -| Reward Model Training | | | ✅ | ✅ | +| Reward Modeling | | | ✅ | ✅ | | PPO Training | | | ✅ | ✅ | | DPO Training | ✅ | | ✅ | ✅ | @@ -103,7 +103,7 @@ - [Web QA (zh)](https://huggingface.co/datasets/suolyer/webqa) - [UltraChat (en)](https://github.com/thunlp/UltraChat) - [WebNovel (zh)](https://huggingface.co/datasets/zxbsmk/webnovel_cn) -- For reward modelling or DPO training: +- For reward modeling or DPO training: - [HH-RLHF (en)](https://huggingface.co/datasets/Anthropic/hh-rlhf) - [Open Assistant (multilingual)](https://huggingface.co/datasets/OpenAssistant/oasst1) - [GPT-4 Generated Data (en&zh)](https://github.com/Instruction-Tuning-with-GPT-4/GPT-4-LLM) @@ -206,7 +206,7 @@ CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ --fp16 ``` -### Reward Model Training +### Reward Modeling ```bash CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ diff --git a/src/llmtuner/tuner/ppo/workflow.py b/src/llmtuner/tuner/ppo/workflow.py index 6734ab78..243468cc 100644 --- a/src/llmtuner/tuner/ppo/workflow.py +++ b/src/llmtuner/tuner/ppo/workflow.py @@ -37,7 +37,9 @@ def run_ppo( batch_size=training_args.per_device_train_batch_size * training_args.gradient_accumulation_steps, gradient_accumulation_steps=training_args.gradient_accumulation_steps, ppo_epochs=1, - max_grad_norm=training_args.max_grad_norm + max_grad_norm=training_args.max_grad_norm, + seed=training_args.seed, + optimize_cuda_cache=True ) optimizer = AdamW(filter(lambda p: p.requires_grad, model.parameters()), lr=training_args.learning_rate) diff --git a/src/llmtuner/webui/common.py b/src/llmtuner/webui/common.py index bf1d18fb..04b0774b 100644 --- a/src/llmtuner/webui/common.py +++ b/src/llmtuner/webui/common.py @@ -29,14 +29,16 @@ def load_config() -> Dict[str, Any]: with open(get_config_path(), "r", encoding="utf-8") as f: return json.load(f) except: - return {"last_model": "", "path_dict": {}} + return {"lang": "", "last_model": "", "path_dict": {}} -def save_config(model_name: str, model_path: str) -> None: +def save_config(lang: str, model_name: str, model_path: str) -> None: os.makedirs(DEFAULT_CACHE_DIR, exist_ok=True) user_config = load_config() - user_config["last_model"] = model_name - user_config["path_dict"][model_name] = model_path + user_config["lang"] = lang or user_config["lang"] + if model_name: + user_config["last_model"] = model_name + user_config["path_dict"][model_name] = model_path with open(get_config_path(), "w", encoding="utf-8") as f: json.dump(user_config, f, indent=2, ensure_ascii=False) diff --git a/src/llmtuner/webui/components/__init__.py b/src/llmtuner/webui/components/__init__.py index 5b86f396..32228b8e 100644 --- a/src/llmtuner/webui/components/__init__.py +++ b/src/llmtuner/webui/components/__init__.py @@ -1,5 +1,5 @@ from llmtuner.webui.components.top import create_top -from llmtuner.webui.components.sft import create_sft_tab +from llmtuner.webui.components.train import create_train_tab from llmtuner.webui.components.eval import create_eval_tab from llmtuner.webui.components.infer import create_infer_tab from llmtuner.webui.components.export import create_export_tab diff --git a/src/llmtuner/webui/components/top.py b/src/llmtuner/webui/components/top.py index 97a332c1..8611e280 100644 --- a/src/llmtuner/webui/components/top.py +++ b/src/llmtuner/webui/components/top.py @@ -20,22 +20,25 @@ def create_top() -> Dict[str, "Component"]: model_path = gr.Textbox(scale=3) with gr.Row(): - finetuning_type = gr.Dropdown(value="lora", choices=METHODS, scale=1) + finetuning_type = gr.Dropdown(choices=METHODS, value="lora", scale=1) checkpoints = gr.Dropdown(multiselect=True, scale=5) refresh_btn = gr.Button(scale=1) with gr.Accordion(label="Advanced config", open=False) as advanced_tab: with gr.Row(): - quantization_bit = gr.Dropdown(["", "8", "4"], scale=1) - template = gr.Dropdown(value="default", choices=list(templates.keys()), scale=1) + quantization_bit = gr.Dropdown(choices=["None", "8", "4"], value="None", scale=1) + template = gr.Dropdown(choices=list(templates.keys()), value="default", scale=1) source_prefix = gr.Textbox(scale=2) + lang.change(save_config, [lang, model_name, model_path]) + model_name.change( list_checkpoint, [model_name, finetuning_type], [checkpoints] ).then( get_model_path, [model_name], [model_path] ) # do not save config since the below line will save - model_path.change(save_config, [model_name, model_path]) + + model_path.change(save_config, [lang, model_name, model_path]) finetuning_type.change( list_checkpoint, [model_name, finetuning_type], [checkpoints] @@ -43,7 +46,9 @@ def create_top() -> Dict[str, "Component"]: can_quantize, [finetuning_type], [quantization_bit] ) - refresh_btn.click(list_checkpoint, [model_name, finetuning_type], [checkpoints], queue=False) + refresh_btn.click( + list_checkpoint, [model_name, finetuning_type], [checkpoints], queue=False + ) return dict( lang=lang, diff --git a/src/llmtuner/webui/components/sft.py b/src/llmtuner/webui/components/train.py similarity index 80% rename from src/llmtuner/webui/components/sft.py rename to src/llmtuner/webui/components/train.py index a4101d15..a4d593c8 100644 --- a/src/llmtuner/webui/components/sft.py +++ b/src/llmtuner/webui/components/train.py @@ -3,7 +3,7 @@ from transformers.trainer_utils import SchedulerType import gradio as gr -from llmtuner.webui.common import list_dataset, DEFAULT_DATA_DIR +from llmtuner.webui.common import list_checkpoint, list_dataset, DEFAULT_DATA_DIR from llmtuner.webui.components.data import create_preview_box from llmtuner.webui.utils import can_preview, get_preview, gen_plot @@ -12,7 +12,7 @@ if TYPE_CHECKING: from llmtuner.webui.runner import Runner -def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[str, "Component"]: +def create_train_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[str, "Component"]: with gr.Row(): dataset_dir = gr.Textbox(value=DEFAULT_DATA_DIR, scale=2) dataset = gr.Dropdown(multiselect=True, scale=4) @@ -40,7 +40,7 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ batch_size = gr.Slider(value=4, minimum=1, maximum=512, step=1) gradient_accumulation_steps = gr.Slider(value=4, minimum=1, maximum=512, step=1) lr_scheduler_type = gr.Dropdown( - value="cosine", choices=[scheduler.value for scheduler in SchedulerType] + choices=[scheduler.value for scheduler in SchedulerType], value="cosine" ) max_grad_norm = gr.Textbox(value="1.0") val_size = gr.Slider(value=0, minimum=0, maximum=1, step=0.001) @@ -60,6 +60,20 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ lora_target = gr.Textbox(scale=2) resume_lora_training = gr.Checkbox(value=True, scale=1) + with gr.Accordion(label="RLHF config", open=False) as rlhf_tab: + with gr.Row(): + rlhf_method = gr.Dropdown(choices=["None", "Reward Modeling", "PPO", "DPO"], value="None", scale=1) + dpo_beta = gr.Slider(value=0.1, minimum=0, maximum=1, step=0.01, scale=2) + reward_model = gr.Dropdown(scale=2) + refresh_btn = gr.Button(scale=1) + + refresh_btn.click( + list_checkpoint, + [top_elems["model_name"], top_elems["finetuning_type"]], + [reward_model], + queue=False + ) + with gr.Row(): cmd_preview_btn = gr.Button() start_btn = gr.Button() @@ -79,7 +93,7 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ with gr.Column(scale=1): loss_viewer = gr.Plot() - input_list = [ + input_components = [ top_elems["lang"], top_elems["model_name"], top_elems["checkpoints"], @@ -108,16 +122,19 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ lora_dropout, lora_target, resume_lora_training, + rlhf_method, + dpo_beta, + reward_model, output_dir ] - output_list = [ + output_components = [ output_box, process_bar ] - cmd_preview_btn.click(runner.preview_train, input_list, output_list) - start_btn.click(runner.run_train, input_list, output_list) + cmd_preview_btn.click(runner.preview_train, input_components, output_components) + start_btn.click(runner.run_train, input_components, output_components) stop_btn.click(runner.set_abort, queue=False) process_bar.change( @@ -152,6 +169,11 @@ def create_sft_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[ lora_dropout=lora_dropout, lora_target=lora_target, resume_lora_training=resume_lora_training, + rlhf_tab=rlhf_tab, + rlhf_method=rlhf_method, + dpo_beta=dpo_beta, + reward_model=reward_model, + refresh_btn=refresh_btn, cmd_preview_btn=cmd_preview_btn, start_btn=start_btn, stop_btn=stop_btn, diff --git a/src/llmtuner/webui/interface.py b/src/llmtuner/webui/interface.py index 8539e18c..0ae59224 100644 --- a/src/llmtuner/webui/interface.py +++ b/src/llmtuner/webui/interface.py @@ -3,7 +3,7 @@ from transformers.utils.versions import require_version from llmtuner.webui.components import ( create_top, - create_sft_tab, + create_train_tab, create_eval_tab, create_infer_tab, create_export_tab, @@ -24,8 +24,8 @@ def create_ui() -> gr.Blocks: with gr.Blocks(title="Web Tuner", css=CSS) as demo: top_elems = create_top() - with gr.Tab("SFT"): - sft_elems = create_sft_tab(top_elems, runner) + with gr.Tab("Train"): + train_elems = create_train_tab(top_elems, runner) with gr.Tab("Evaluate"): eval_elems = create_eval_tab(top_elems, runner) @@ -36,7 +36,7 @@ def create_ui() -> gr.Blocks: with gr.Tab("Export"): export_elems = create_export_tab(top_elems) - elem_list = [top_elems, sft_elems, eval_elems, infer_elems, export_elems] + elem_list = [top_elems, train_elems, eval_elems, infer_elems, export_elems] manager = Manager(elem_list) demo.load( @@ -59,7 +59,7 @@ def create_web_demo() -> gr.Blocks: chat_model = WebChatModel(lazy_init=False) with gr.Blocks(title="Web Demo", css=CSS) as demo: - lang = gr.Dropdown(choices=["en", "zh"], value="en") + lang = gr.Dropdown(choices=["en", "zh"], value="") _, _, _, chat_elems = create_chat_box(chat_model, visible=True) diff --git a/src/llmtuner/webui/locales.py b/src/llmtuner/webui/locales.py index aba4acae..0c7abae0 100644 --- a/src/llmtuner/webui/locales.py +++ b/src/llmtuner/webui/locales.py @@ -335,6 +335,44 @@ LOCALES = { "info": "接着上次的 LoRA 权重训练或创建一个新的 LoRA 权重。" } }, + "rlhf_tab": { + "en": { + "label": "RLHF configurations" + }, + "zh": { + "label": "RLHF 参数设置" + } + }, + "rlhf_method": { + "en": { + "label": "RLHF method", + "info": "The RLHF algorithm to adopt." + }, + "zh": { + "label": "RLHF 方法", + "info": "RLHF 阶段使用的算法。" + } + }, + "dpo_beta": { + "en": { + "label": "DPO beta", + "info": "Value of the beta parameter in the DPO loss." + }, + "zh": { + "label": "DPO beta 参数", + "info": "DPO 损失函数中 beta 超参数大小。" + } + }, + "reward_model": { + "en": { + "label": "Reward model", + "info": "Checkpoint of the reward model for PPO training." + }, + "zh": { + "label": "奖励模型", + "info": "PPO 训练中奖励模型的断点路径。" + } + }, "cmd_preview_btn": { "en": { "value": "Preview command" diff --git a/src/llmtuner/webui/manager.py b/src/llmtuner/webui/manager.py index c8f797a4..2d5a0a39 100644 --- a/src/llmtuner/webui/manager.py +++ b/src/llmtuner/webui/manager.py @@ -12,12 +12,18 @@ class Manager: def __init__(self, elem_list: List[Dict[str, Component]]): self.elem_list = elem_list - def gen_refresh(self) -> Dict[str, Any]: + def gen_refresh(self, lang: str) -> Dict[str, Any]: refresh_dict = { "dataset": {"choices": list_dataset()["choices"]}, "output_dir": {"value": get_time()} } + user_config = load_config() + if lang: + refresh_dict["lang"] = {"value": lang} + else: + refresh_dict["lang"] = {"value": user_config["lang"] if user_config["lang"] else "en"} + if user_config["last_model"]: refresh_dict["model_name"] = {"value": user_config["last_model"]} refresh_dict["model_path"] = {"value": get_model_path(user_config["last_model"])} @@ -26,10 +32,12 @@ class Manager: def gen_label(self, lang: str) -> Dict[Component, Dict[str, Any]]: # cannot use TYPE_CHECKING update_dict = {} - refresh_dict = self.gen_refresh() + refresh_dict = self.gen_refresh(lang) for elems in self.elem_list: for name, component in elems.items(): - update_dict[component] = gr.update(**LOCALES[name][lang], **refresh_dict.get(name, {})) + update_dict[component] = gr.update( + **LOCALES[name][refresh_dict["lang"]["value"]], **refresh_dict.get(name, {}) + ) return update_dict diff --git a/src/llmtuner/webui/runner.py b/src/llmtuner/webui/runner.py index 3a28dae6..afef4736 100644 --- a/src/llmtuner/webui/runner.py +++ b/src/llmtuner/webui/runner.py @@ -91,6 +91,9 @@ class Runner: lora_dropout: float, lora_target: str, resume_lora_training: bool, + rlhf_method: str, + dpo_beta: float, + reward_model: str, output_dir: str ) -> Tuple[str, str, List[str], str, Dict[str, Any]]: if checkpoints: @@ -109,7 +112,7 @@ class Runner: overwrite_cache=True, checkpoint_dir=checkpoint_dir, finetuning_type=finetuning_type, - quantization_bit=int(quantization_bit) if quantization_bit else None, + quantization_bit=int(quantization_bit) if quantization_bit != "None" else None, template=template, source_prefix=source_prefix, dataset_dir=dataset_dir, @@ -134,6 +137,21 @@ class Runner: output_dir=output_dir ) args[compute_type] = True + + if rlhf_method == "Reward Modeling": + args["stage"] = "rm" + args["resume_lora_training"] = False + elif rlhf_method == "PPO": + args["stage"] = "ppo" + args["resume_lora_training"] = False + args["reward_model"] = reward_model + args["padding_side"] = "left" + val_size = 0 + elif rlhf_method == "DPO": + args["stage"] = "dpo" + args["resume_lora_training"] = False + args["dpo_beta"] = dpo_beta + if val_size > 1e-6: args["val_size"] = val_size args["evaluation_strategy"] = "steps" @@ -176,7 +194,7 @@ class Runner: predict_with_generate=True, checkpoint_dir=checkpoint_dir, finetuning_type=finetuning_type, - quantization_bit=int(quantization_bit) if quantization_bit else None, + quantization_bit=int(quantization_bit) if quantization_bit != "None" else None, template=template, source_prefix=source_prefix, dataset_dir=dataset_dir, diff --git a/src/llmtuner/webui/utils.py b/src/llmtuner/webui/utils.py index 152df6e3..362fa008 100644 --- a/src/llmtuner/webui/utils.py +++ b/src/llmtuner/webui/utils.py @@ -63,7 +63,8 @@ def can_quantize(finetuning_type: str) -> Dict[str, Any]: def gen_cmd(args: Dict[str, Any]) -> str: - args["plot_loss"] = True + if args.get("do_train", None): + args["plot_loss"] = True cmd_lines = ["CUDA_VISIBLE_DEVICES=0 python "] for k, v in args.items(): if v is not None and v != "": From 5feb2eda8914736198323e1858fb642251131206 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Mon, 14 Aug 2023 11:13:25 +0800 Subject: [PATCH 26/45] update readme_zh Former-commit-id: 2391a84e26d7acb3afc18617fefdfb1b3ab6f45d --- README_zh.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README_zh.md b/README_zh.md index 0b8ce714..5664c4ec 100644 --- a/README_zh.md +++ b/README_zh.md @@ -57,6 +57,7 @@ | [InternLM](https://github.com/InternLM/InternLM) | 7B | q_proj,v_proj | intern | | [Qwen](https://github.com/QwenLM/Qwen-7B) | 7B | c_attn | chatml | | [XVERSE](https://github.com/xverse-ai/XVERSE-13B) | 13B | q_proj,v_proj | - | +| [ChatGLM2](https://github.com/THUDM/ChatGLM2-6B) | 6B | query_key_value | chatglm2 | - **默认模块**是 `--lora_target` 参数的部分可选项。请使用 `python src/train_bash.py -h` 查看全部可选项。 - 对于所有“基座”(Base)模型,`--template` 参数可以是 `default`, `alpaca`, `vicuna` 等任意值。但“对话”(Chat)模型请务必使用对应的模板。 From 307c814f388cd400a8a994ac522dfd6ab1860032 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Mon, 14 Aug 2023 11:37:01 +0800 Subject: [PATCH 27/45] fix webui cache Former-commit-id: ca08e5efd3ccf155c6a0baa0a08bb7879f6b9b9b --- src/llmtuner/webui/components/top.py | 2 +- src/llmtuner/webui/interface.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/llmtuner/webui/components/top.py b/src/llmtuner/webui/components/top.py index 8611e280..1f5c47a5 100644 --- a/src/llmtuner/webui/components/top.py +++ b/src/llmtuner/webui/components/top.py @@ -15,7 +15,7 @@ def create_top() -> Dict[str, "Component"]: available_models = list(SUPPORTED_MODELS.keys()) + ["Custom"] with gr.Row(): - lang = gr.Dropdown(choices=["en", "zh"], value="en", scale=1) + lang = gr.Dropdown(choices=["en", "zh"], scale=1) model_name = gr.Dropdown(choices=available_models, scale=3) model_path = gr.Textbox(scale=3) diff --git a/src/llmtuner/webui/interface.py b/src/llmtuner/webui/interface.py index 0ae59224..1a5c0c19 100644 --- a/src/llmtuner/webui/interface.py +++ b/src/llmtuner/webui/interface.py @@ -59,7 +59,7 @@ def create_web_demo() -> gr.Blocks: chat_model = WebChatModel(lazy_init=False) with gr.Blocks(title="Web Demo", css=CSS) as demo: - lang = gr.Dropdown(choices=["en", "zh"], value="") + lang = gr.Dropdown(choices=["en", "zh"]) _, _, _, chat_elems = create_chat_box(chat_model, visible=True) @@ -67,7 +67,7 @@ def create_web_demo() -> gr.Blocks: demo.load(manager.gen_label, [lang], [lang] + list(chat_elems.values())) - lang.change(manager.gen_label, [lang], [lang] + list(chat_elems.values()), queue=False) + lang.select(manager.gen_label, [lang], [lang] + list(chat_elems.values()), queue=False) return demo From 2f70f964636595de9370f68391e8d2a6f303f22c Mon Sep 17 00:00:00 2001 From: hiyouga Date: Mon, 14 Aug 2023 11:38:42 +0800 Subject: [PATCH 28/45] fix bug in webui Former-commit-id: 20a29297b1c55678e7a56b2610b35edec063253b --- src/llmtuner/webui/chat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llmtuner/webui/chat.py b/src/llmtuner/webui/chat.py index d0eb61df..e73ea402 100644 --- a/src/llmtuner/webui/chat.py +++ b/src/llmtuner/webui/chat.py @@ -53,7 +53,7 @@ class WebChatModel(ChatModel): model_name_or_path=model_name_or_path, checkpoint_dir=checkpoint_dir, finetuning_type=finetuning_type, - quantization_bit=int(quantization_bit) if quantization_bit else None, + quantization_bit=int(quantization_bit) if quantization_bit != "None" else None, template=template, source_prefix=source_prefix ) From 2aa2c363adfcfdb4141a07ac928ead38e09faaf1 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Mon, 14 Aug 2023 14:14:48 +0800 Subject: [PATCH 29/45] fix ChatGLM lm_head #494 Former-commit-id: d0199568081f46e5d338ea511266eb420dd43594 --- src/llmtuner/tuner/core/loader.py | 4 ++++ src/llmtuner/tuner/dpo/trainer.py | 8 ++++---- src/llmtuner/webui/components/eval.py | 8 ++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/llmtuner/tuner/core/loader.py b/src/llmtuner/tuner/core/loader.py index 8de98387..e480d44c 100644 --- a/src/llmtuner/tuner/core/loader.py +++ b/src/llmtuner/tuner/core/loader.py @@ -153,6 +153,10 @@ def load_model_and_tokenizer( if "GenerationMixin" not in str(model.generate.__func__): model.generate = MethodType(PreTrainedModel.generate, model) + # Fix LM head (for ChatGLM2) + if not hasattr(model, "lm_head"): + setattr(model, "lm_head", model.transformer.output_layer) + # Register auto class to save the custom code files. if isinstance(config, PretrainedConfig) and "AutoConfig" in getattr(config, "auto_map", {}): config.__class__.register_for_auto_class() diff --git a/src/llmtuner/tuner/dpo/trainer.py b/src/llmtuner/tuner/dpo/trainer.py index f0da9eaa..458e99db 100644 --- a/src/llmtuner/tuner/dpo/trainer.py +++ b/src/llmtuner/tuner/dpo/trainer.py @@ -32,11 +32,11 @@ class DPOPeftTrainer(PeftModelMixin, DPOTrainer): self._stored_metrics = defaultdict(lambda: defaultdict(list)) Trainer.__init__(self, **kwargs) + if not hasattr(self, "accelerator"): + raise AttributeError("Please update `transformers`.") + if ref_model is not None: - if hasattr(self, "accelerator"): - self.ref_model = self.accelerator.prepare_model(self.ref_model, evaluation_mode=True) - else: - raise AttributeError("Please update `transformers`.") + self.ref_model = self.accelerator.prepare_model(self.ref_model, evaluation_mode=True) def concatenated_forward( self, diff --git a/src/llmtuner/webui/components/eval.py b/src/llmtuner/webui/components/eval.py index 72d08a1f..48372b4c 100644 --- a/src/llmtuner/webui/components/eval.py +++ b/src/llmtuner/webui/components/eval.py @@ -45,7 +45,7 @@ def create_eval_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict with gr.Box(): output_box = gr.Markdown() - input_list = [ + input_components = [ top_elems["lang"], top_elems["model_name"], top_elems["checkpoints"], @@ -62,13 +62,13 @@ def create_eval_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict predict ] - output_list = [ + output_components = [ output_box, process_bar ] - cmd_preview_btn.click(runner.preview_eval, input_list, output_list) - start_btn.click(runner.run_eval, input_list, output_list) + cmd_preview_btn.click(runner.preview_eval, input_components, output_components) + start_btn.click(runner.run_eval, input_components, output_components) stop_btn.click(runner.set_abort, queue=False) return dict( From ee7da14f8169eb4c7958825dd6591264483c3940 Mon Sep 17 00:00:00 2001 From: codemayq Date: Mon, 14 Aug 2023 20:42:59 +0800 Subject: [PATCH 30/45] add template match and stage in webui Former-commit-id: 79c68e552722079faf2ab0858870b481844d66ae --- src/llmtuner/extras/constants.py | 30 ++++++++++++++++++++++++++ src/llmtuner/extras/template.py | 3 ++- src/llmtuner/webui/common.py | 21 +++++++++++++++++- src/llmtuner/webui/components/train.py | 9 +++++--- src/llmtuner/webui/locales.py | 10 ++++++++- src/llmtuner/webui/runner.py | 18 +++++++++------- 6 files changed, 77 insertions(+), 14 deletions(-) diff --git a/src/llmtuner/extras/constants.py b/src/llmtuner/extras/constants.py index 8ee997bb..ffdc8827 100644 --- a/src/llmtuner/extras/constants.py +++ b/src/llmtuner/extras/constants.py @@ -10,6 +10,8 @@ LAYERNORM_NAMES = ["norm", "ln_f", "ln_attn", "ln_mlp"] METHODS = ["full", "freeze", "lora"] +STAGES = ["Supervised Finetuning", "Reward Modeling", "PPO", "DPO", "Pretraining"] + SUPPORTED_MODELS = { "LLaMA-7B": "huggyllama/llama-7b", "LLaMA-13B": "huggyllama/llama-13b", @@ -54,3 +56,31 @@ DEFAULT_MODULE = { "XVERSE": "q_proj,v_proj", "ChatGLM2": "query_key_value" } + +DEFAULT_TEMPLATE = { + "LLaMA2": "llama2", + "Baichuan": "baichuan", + "InternLM": "intern", + "Qwen": "chatml", + "ChatGLM2": "chatglm2" +} + +# huggingface model name prefix 2 template +DEFAULT_TEMPLATE_WITH_CUSTOM_MODEL = { + "Llama-2": "llama2", + "chinese-alpaca-2": "llama2_zh", + "alpaca-7b-wdiff": "alpaca", + "vicuna": "vicuna", + "BELLE": "belle", + "Chinese-LLaMA-2": "linly", + "BiLLa": "billa", + "Ziya": "ziya", + "aquilachat": "aquila", + "internlm": "intern", + "aquilachat": "aquila", + "internlm": "intern", + "Baichuan":"baichuan", + "starchat":"starchat", + "Qwen":"chatml", + "chatglm2":"chatglm2" +} \ No newline at end of file diff --git a/src/llmtuner/extras/template.py b/src/llmtuner/extras/template.py index 6724dd46..e8d228a4 100644 --- a/src/llmtuner/extras/template.py +++ b/src/llmtuner/extras/template.py @@ -273,7 +273,8 @@ register_template( r""" -Supports: https://github.com/ymcui/Chinese-LLaMA-Alpaca-2 +Supports: https://huggingface.co/ziqingyang/chinese-alpaca-2-7b + https://github.com/ymcui/Chinese-LLaMA-Alpaca-2 """ register_template( name="llama2_zh", diff --git a/src/llmtuner/webui/common.py b/src/llmtuner/webui/common.py index 04b0774b..4e1ea0ae 100644 --- a/src/llmtuner/webui/common.py +++ b/src/llmtuner/webui/common.py @@ -6,7 +6,7 @@ import gradio as gr from peft.utils import WEIGHTS_NAME as PEFT_WEIGHTS_NAME from transformers.trainer import WEIGHTS_NAME, WEIGHTS_INDEX_NAME -from llmtuner.extras.constants import SUPPORTED_MODELS +from llmtuner.extras.constants import SUPPORTED_MODELS, DEFAULT_TEMPLATE_WITH_CUSTOM_MODEL, DEFAULT_TEMPLATE DEFAULT_CACHE_DIR = "cache" @@ -48,6 +48,25 @@ def get_model_path(model_name: str) -> str: return user_config["path_dict"].get(model_name, SUPPORTED_MODELS.get(model_name, "")) +def get_template( + template: str, + model_name: str, +) -> str: + if template and template != "default": + return template + if model_name == "Custom": + model_name_or_path = get_model_path(model_name) + # get last dir + basename = os.path.basename(model_name_or_path) + # prefix match + for k, v in DEFAULT_TEMPLATE_WITH_CUSTOM_MODEL.items(): + if basename.startswith(k): + return v + return "default" + + return DEFAULT_TEMPLATE.get(model_name.split("-")[0], "default") + + def list_checkpoint(model_name: str, finetuning_type: str) -> Dict[str, Any]: checkpoints = [] save_dir = os.path.join(get_save_dir(model_name), finetuning_type) diff --git a/src/llmtuner/webui/components/train.py b/src/llmtuner/webui/components/train.py index a4d593c8..76f8ff94 100644 --- a/src/llmtuner/webui/components/train.py +++ b/src/llmtuner/webui/components/train.py @@ -6,6 +6,7 @@ import gradio as gr from llmtuner.webui.common import list_checkpoint, list_dataset, DEFAULT_DATA_DIR from llmtuner.webui.components.data import create_preview_box from llmtuner.webui.utils import can_preview, get_preview, gen_plot +from llmtuner.extras.constants import STAGES if TYPE_CHECKING: from gradio.components import Component @@ -14,6 +15,9 @@ if TYPE_CHECKING: def create_train_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[str, "Component"]: with gr.Row(): + stage = gr.Dropdown(choices=STAGES, + value="Supervised Finetuning", scale=2) + dataset_dir = gr.Textbox(value=DEFAULT_DATA_DIR, scale=2) dataset = gr.Dropdown(multiselect=True, scale=4) data_preview_btn = gr.Button(interactive=False, scale=1) @@ -62,7 +66,6 @@ def create_train_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dic with gr.Accordion(label="RLHF config", open=False) as rlhf_tab: with gr.Row(): - rlhf_method = gr.Dropdown(choices=["None", "Reward Modeling", "PPO", "DPO"], value="None", scale=1) dpo_beta = gr.Slider(value=0.1, minimum=0, maximum=1, step=0.01, scale=2) reward_model = gr.Dropdown(scale=2) refresh_btn = gr.Button(scale=1) @@ -101,6 +104,7 @@ def create_train_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dic top_elems["quantization_bit"], top_elems["template"], top_elems["source_prefix"], + stage, dataset_dir, dataset, max_source_length, @@ -122,7 +126,6 @@ def create_train_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dic lora_dropout, lora_target, resume_lora_training, - rlhf_method, dpo_beta, reward_model, output_dir @@ -142,6 +145,7 @@ def create_train_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dic ) return dict( + stage=stage, dataset_dir=dataset_dir, dataset=dataset, data_preview_btn=data_preview_btn, @@ -170,7 +174,6 @@ def create_train_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dic lora_target=lora_target, resume_lora_training=resume_lora_training, rlhf_tab=rlhf_tab, - rlhf_method=rlhf_method, dpo_beta=dpo_beta, reward_model=reward_model, refresh_btn=refresh_btn, diff --git a/src/llmtuner/webui/locales.py b/src/llmtuner/webui/locales.py index 0c7abae0..d95fde29 100644 --- a/src/llmtuner/webui/locales.py +++ b/src/llmtuner/webui/locales.py @@ -546,7 +546,15 @@ LOCALES = { "zh": { "value": "开始导出" } - } + }, + "stage": { + "en": { + "label": "train stage" + }, + "zh": { + "label": "训练阶段" + } + }, } diff --git a/src/llmtuner/webui/runner.py b/src/llmtuner/webui/runner.py index afef4736..00918297 100644 --- a/src/llmtuner/webui/runner.py +++ b/src/llmtuner/webui/runner.py @@ -8,11 +8,11 @@ from transformers.trainer import TRAINING_ARGS_NAME from typing import Any, Dict, Generator, List, Tuple from llmtuner.extras.callbacks import LogCallback -from llmtuner.extras.constants import DEFAULT_MODULE +from llmtuner.extras.constants import DEFAULT_MODULE, DEFAULT_TEMPLATE, DEFAULT_TEMPLATE_WITH_CUSTOM_MODEL from llmtuner.extras.logging import LoggerHandler from llmtuner.extras.misc import torch_gc from llmtuner.tuner import run_exp -from llmtuner.webui.common import get_model_path, get_save_dir +from llmtuner.webui.common import get_model_path, get_save_dir, get_template from llmtuner.webui.locales import ALERTS from llmtuner.webui.utils import gen_cmd, get_eval_results, update_process_bar @@ -70,6 +70,7 @@ class Runner: quantization_bit: str, template: str, source_prefix: str, + stage: str, dataset_dir: str, dataset: List[str], max_source_length: int, @@ -91,7 +92,6 @@ class Runner: lora_dropout: float, lora_target: str, resume_lora_training: bool, - rlhf_method: str, dpo_beta: float, reward_model: str, output_dir: str @@ -113,7 +113,7 @@ class Runner: checkpoint_dir=checkpoint_dir, finetuning_type=finetuning_type, quantization_bit=int(quantization_bit) if quantization_bit != "None" else None, - template=template, + template=get_template(template, model_name), source_prefix=source_prefix, dataset_dir=dataset_dir, dataset=",".join(dataset), @@ -138,16 +138,18 @@ class Runner: ) args[compute_type] = True - if rlhf_method == "Reward Modeling": + if stage == "Pretraining": + args["stage"] = "pt" + if stage == "Reward Modeling": args["stage"] = "rm" args["resume_lora_training"] = False - elif rlhf_method == "PPO": + elif stage == "PPO": args["stage"] = "ppo" args["resume_lora_training"] = False args["reward_model"] = reward_model args["padding_side"] = "left" val_size = 0 - elif rlhf_method == "DPO": + elif stage == "DPO": args["stage"] = "dpo" args["resume_lora_training"] = False args["dpo_beta"] = dpo_beta @@ -195,7 +197,7 @@ class Runner: checkpoint_dir=checkpoint_dir, finetuning_type=finetuning_type, quantization_bit=int(quantization_bit) if quantization_bit != "None" else None, - template=template, + template=get_template(template, model_name), source_prefix=source_prefix, dataset_dir=dataset_dir, dataset=",".join(dataset), From 4a4623cf2d1c87c52ce8ef8e9c4823814f6e367a Mon Sep 17 00:00:00 2001 From: codemayq Date: Mon, 14 Aug 2023 20:56:05 +0800 Subject: [PATCH 31/45] auto match template when change model_name Former-commit-id: 0bf892ff1a4b9253ee569a7b0dc5270762af13d3 --- src/llmtuner/webui/common.py | 3 --- src/llmtuner/webui/components/top.py | 3 ++- src/llmtuner/webui/runner.py | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/llmtuner/webui/common.py b/src/llmtuner/webui/common.py index 4e1ea0ae..728fbd6b 100644 --- a/src/llmtuner/webui/common.py +++ b/src/llmtuner/webui/common.py @@ -49,11 +49,8 @@ def get_model_path(model_name: str) -> str: def get_template( - template: str, model_name: str, ) -> str: - if template and template != "default": - return template if model_name == "Custom": model_name_or_path = get_model_path(model_name) # get last dir diff --git a/src/llmtuner/webui/components/top.py b/src/llmtuner/webui/components/top.py index 8611e280..caceb1e5 100644 --- a/src/llmtuner/webui/components/top.py +++ b/src/llmtuner/webui/components/top.py @@ -4,7 +4,7 @@ import gradio as gr from llmtuner.extras.constants import METHODS, SUPPORTED_MODELS from llmtuner.extras.template import templates -from llmtuner.webui.common import list_checkpoint, get_model_path, save_config +from llmtuner.webui.common import list_checkpoint, get_model_path, save_config, get_template from llmtuner.webui.utils import can_quantize if TYPE_CHECKING: @@ -39,6 +39,7 @@ def create_top() -> Dict[str, "Component"]: ) # do not save config since the below line will save model_path.change(save_config, [lang, model_name, model_path]) + model_path.change(get_template, [model_name], [template]) finetuning_type.change( list_checkpoint, [model_name, finetuning_type], [checkpoints] diff --git a/src/llmtuner/webui/runner.py b/src/llmtuner/webui/runner.py index 00918297..07811258 100644 --- a/src/llmtuner/webui/runner.py +++ b/src/llmtuner/webui/runner.py @@ -113,7 +113,7 @@ class Runner: checkpoint_dir=checkpoint_dir, finetuning_type=finetuning_type, quantization_bit=int(quantization_bit) if quantization_bit != "None" else None, - template=get_template(template, model_name), + template=template, source_prefix=source_prefix, dataset_dir=dataset_dir, dataset=",".join(dataset), @@ -197,7 +197,7 @@ class Runner: checkpoint_dir=checkpoint_dir, finetuning_type=finetuning_type, quantization_bit=int(quantization_bit) if quantization_bit != "None" else None, - template=get_template(template, model_name), + template=template, source_prefix=source_prefix, dataset_dir=dataset_dir, dataset=",".join(dataset), From 02a61b08b10a6c573be7fe0f069266419e12e224 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Mon, 14 Aug 2023 22:45:26 +0800 Subject: [PATCH 32/45] update webui Former-commit-id: 9d0f6214b68a653c0a67632437b227ab8f589bed --- src/llmtuner/extras/constants.py | 36 ++++++++++---------------- src/llmtuner/extras/misc.py | 4 --- src/llmtuner/extras/template.py | 4 +-- src/llmtuner/webui/common.py | 20 ++++---------- src/llmtuner/webui/components/top.py | 5 ++-- src/llmtuner/webui/components/train.py | 10 +++---- src/llmtuner/webui/locales.py | 30 ++++++++------------- src/llmtuner/webui/runner.py | 16 ++++++------ 8 files changed, 47 insertions(+), 78 deletions(-) diff --git a/src/llmtuner/extras/constants.py b/src/llmtuner/extras/constants.py index ffdc8827..cd22943f 100644 --- a/src/llmtuner/extras/constants.py +++ b/src/llmtuner/extras/constants.py @@ -10,7 +10,13 @@ LAYERNORM_NAMES = ["norm", "ln_f", "ln_attn", "ln_mlp"] METHODS = ["full", "freeze", "lora"] -STAGES = ["Supervised Finetuning", "Reward Modeling", "PPO", "DPO", "Pretraining"] +STAGES = [ + "SFT", + "Reward Modeling", + "PPO", + "DPO", + "Pre-Training" +] SUPPORTED_MODELS = { "LLaMA-7B": "huggyllama/llama-7b", @@ -23,6 +29,10 @@ SUPPORTED_MODELS = { "LLaMA2-7B-Chat": "meta-llama/Llama-2-7b-chat-hf", "LLaMA2-13B-Chat": "meta-llama/Llama-2-13b-chat-hf", "LLaMA2-70B-Chat": "meta-llama/Llama-2-70b-chat-hf", + "ChineseLLaMA2-7B": "ziqingyang/chinese-llama-2-7b", + "ChineseLLaMA2-13B": "ziqingyang/chinese-llama-2-13b", + "ChineseLLaMA2-7B-Chat": "ziqingyang/chinese-alpaca-2-7b", + "ChineseLLaMA2-13B-Chat": "ziqingyang/chinese-alpaca-2-13b", "BLOOM-560M": "bigscience/bloom-560m", "BLOOM-3B": "bigscience/bloom-3b", "BLOOM-7B1": "bigscience/bloom-7b1", @@ -41,12 +51,13 @@ SUPPORTED_MODELS = { "Qwen-7B": "Qwen/Qwen-7B", "Qwen-7B-Chat": "Qwen/Qwen-7B-Chat", "XVERSE-13B": "xverse/XVERSE-13B", - "ChatGLM2-6B": "THUDM/chatglm2-6b" + "ChatGLM2-6B-Chat": "THUDM/chatglm2-6b" } DEFAULT_MODULE = { "LLaMA": "q_proj,v_proj", "LLaMA2": "q_proj,v_proj", + "ChineseLLaMA2": "q_proj,v_proj", "BLOOM": "query_key_value", "BLOOMZ": "query_key_value", "Falcon": "query_key_value", @@ -59,28 +70,9 @@ DEFAULT_MODULE = { DEFAULT_TEMPLATE = { "LLaMA2": "llama2", + "ChineseLLaMA2": "llama2_zh", "Baichuan": "baichuan", "InternLM": "intern", "Qwen": "chatml", "ChatGLM2": "chatglm2" } - -# huggingface model name prefix 2 template -DEFAULT_TEMPLATE_WITH_CUSTOM_MODEL = { - "Llama-2": "llama2", - "chinese-alpaca-2": "llama2_zh", - "alpaca-7b-wdiff": "alpaca", - "vicuna": "vicuna", - "BELLE": "belle", - "Chinese-LLaMA-2": "linly", - "BiLLa": "billa", - "Ziya": "ziya", - "aquilachat": "aquila", - "internlm": "intern", - "aquilachat": "aquila", - "internlm": "intern", - "Baichuan":"baichuan", - "starchat":"starchat", - "Qwen":"chatml", - "chatglm2":"chatglm2" -} \ No newline at end of file diff --git a/src/llmtuner/extras/misc.py b/src/llmtuner/extras/misc.py index b0a7365c..b3e0e4b1 100644 --- a/src/llmtuner/extras/misc.py +++ b/src/llmtuner/extras/misc.py @@ -95,7 +95,6 @@ def prepare_model_for_training( use_gradient_checkpointing: Optional[bool] = True, layer_norm_names: Optional[List[str]] = LAYERNORM_NAMES ) -> "PreTrainedModel": - for name, param in model.named_parameters(): if param.ndim == 1 and any(layer_norm_name in name for layer_norm_name in layer_norm_names): param.data = param.data.to(torch.float32) @@ -112,9 +111,6 @@ def prepare_model_for_training( model.config.use_cache = False # turn off when gradient checkpointing is enabled if finetuning_type != "full" and hasattr(model, output_layer_name): - if hasattr(model, "config") and hasattr(model.config, "pretraining_tp"): - model.config.pretraining_tp = 1 # disable TP for LoRA (https://github.com/huggingface/peft/pull/728) - output_layer: torch.nn.Linear = getattr(model, output_layer_name) input_dtype = output_layer.weight.dtype diff --git a/src/llmtuner/extras/template.py b/src/llmtuner/extras/template.py index e8d228a4..bb2886d5 100644 --- a/src/llmtuner/extras/template.py +++ b/src/llmtuner/extras/template.py @@ -273,8 +273,8 @@ register_template( r""" -Supports: https://huggingface.co/ziqingyang/chinese-alpaca-2-7b - https://github.com/ymcui/Chinese-LLaMA-Alpaca-2 +Supports: https://github.com/ymcui/Chinese-LLaMA-Alpaca-2 + https://huggingface.co/ziqingyang/chinese-alpaca-2-7b """ register_template( name="llama2_zh", diff --git a/src/llmtuner/webui/common.py b/src/llmtuner/webui/common.py index 728fbd6b..965a690b 100644 --- a/src/llmtuner/webui/common.py +++ b/src/llmtuner/webui/common.py @@ -6,7 +6,7 @@ import gradio as gr from peft.utils import WEIGHTS_NAME as PEFT_WEIGHTS_NAME from transformers.trainer import WEIGHTS_NAME, WEIGHTS_INDEX_NAME -from llmtuner.extras.constants import SUPPORTED_MODELS, DEFAULT_TEMPLATE_WITH_CUSTOM_MODEL, DEFAULT_TEMPLATE +from llmtuner.extras.constants import DEFAULT_TEMPLATE, SUPPORTED_MODELS DEFAULT_CACHE_DIR = "cache" @@ -48,20 +48,10 @@ def get_model_path(model_name: str) -> str: return user_config["path_dict"].get(model_name, SUPPORTED_MODELS.get(model_name, "")) -def get_template( - model_name: str, -) -> str: - if model_name == "Custom": - model_name_or_path = get_model_path(model_name) - # get last dir - basename = os.path.basename(model_name_or_path) - # prefix match - for k, v in DEFAULT_TEMPLATE_WITH_CUSTOM_MODEL.items(): - if basename.startswith(k): - return v - return "default" - - return DEFAULT_TEMPLATE.get(model_name.split("-")[0], "default") +def get_template(model_name: str) -> str: + if model_name.endswith("Chat") and model_name.split("-")[0] in DEFAULT_TEMPLATE: + return DEFAULT_TEMPLATE[model_name.split("-")[0]] + return "default" def list_checkpoint(model_name: str, finetuning_type: str) -> Dict[str, Any]: diff --git a/src/llmtuner/webui/components/top.py b/src/llmtuner/webui/components/top.py index 76ead7ee..7f3c6faa 100644 --- a/src/llmtuner/webui/components/top.py +++ b/src/llmtuner/webui/components/top.py @@ -4,7 +4,7 @@ import gradio as gr from llmtuner.extras.constants import METHODS, SUPPORTED_MODELS from llmtuner.extras.template import templates -from llmtuner.webui.common import list_checkpoint, get_model_path, save_config, get_template +from llmtuner.webui.common import list_checkpoint, get_model_path, get_template, save_config from llmtuner.webui.utils import can_quantize if TYPE_CHECKING: @@ -36,10 +36,11 @@ def create_top() -> Dict[str, "Component"]: list_checkpoint, [model_name, finetuning_type], [checkpoints] ).then( get_model_path, [model_name], [model_path] + ).then( + get_template, [model_name], [template] ) # do not save config since the below line will save model_path.change(save_config, [lang, model_name, model_path]) - model_path.change(get_template, [model_name], [template]) finetuning_type.change( list_checkpoint, [model_name, finetuning_type], [checkpoints] diff --git a/src/llmtuner/webui/components/train.py b/src/llmtuner/webui/components/train.py index 76f8ff94..6aaeecbb 100644 --- a/src/llmtuner/webui/components/train.py +++ b/src/llmtuner/webui/components/train.py @@ -3,10 +3,10 @@ from transformers.trainer_utils import SchedulerType import gradio as gr +from llmtuner.extras.constants import STAGES from llmtuner.webui.common import list_checkpoint, list_dataset, DEFAULT_DATA_DIR from llmtuner.webui.components.data import create_preview_box from llmtuner.webui.utils import can_preview, get_preview, gen_plot -from llmtuner.extras.constants import STAGES if TYPE_CHECKING: from gradio.components import Component @@ -15,9 +15,7 @@ if TYPE_CHECKING: def create_train_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict[str, "Component"]: with gr.Row(): - stage = gr.Dropdown(choices=STAGES, - value="Supervised Finetuning", scale=2) - + training_stage = gr.Dropdown(choices=STAGES, value=STAGES[0], scale=2) dataset_dir = gr.Textbox(value=DEFAULT_DATA_DIR, scale=2) dataset = gr.Dropdown(multiselect=True, scale=4) data_preview_btn = gr.Button(interactive=False, scale=1) @@ -104,7 +102,7 @@ def create_train_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dic top_elems["quantization_bit"], top_elems["template"], top_elems["source_prefix"], - stage, + training_stage, dataset_dir, dataset, max_source_length, @@ -145,7 +143,7 @@ def create_train_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dic ) return dict( - stage=stage, + training_stage=training_stage, dataset_dir=dataset_dir, dataset=dataset, data_preview_btn=data_preview_btn, diff --git a/src/llmtuner/webui/locales.py b/src/llmtuner/webui/locales.py index d95fde29..7a58c4c7 100644 --- a/src/llmtuner/webui/locales.py +++ b/src/llmtuner/webui/locales.py @@ -87,6 +87,16 @@ LOCALES = { "info": "默认使用的系统提示词" } }, + "training_stage": { + "en": { + "label": "Stage", + "info": "The stage to perform in training." + }, + "zh": { + "label": "训练阶段", + "info": "目前采用的训练方式。" + } + }, "dataset_dir": { "en": { "label": "Data dir", @@ -343,16 +353,6 @@ LOCALES = { "label": "RLHF 参数设置" } }, - "rlhf_method": { - "en": { - "label": "RLHF method", - "info": "The RLHF algorithm to adopt." - }, - "zh": { - "label": "RLHF 方法", - "info": "RLHF 阶段使用的算法。" - } - }, "dpo_beta": { "en": { "label": "DPO beta", @@ -546,15 +546,7 @@ LOCALES = { "zh": { "value": "开始导出" } - }, - "stage": { - "en": { - "label": "train stage" - }, - "zh": { - "label": "训练阶段" - } - }, + } } diff --git a/src/llmtuner/webui/runner.py b/src/llmtuner/webui/runner.py index 07811258..49fed19b 100644 --- a/src/llmtuner/webui/runner.py +++ b/src/llmtuner/webui/runner.py @@ -8,11 +8,11 @@ from transformers.trainer import TRAINING_ARGS_NAME from typing import Any, Dict, Generator, List, Tuple from llmtuner.extras.callbacks import LogCallback -from llmtuner.extras.constants import DEFAULT_MODULE, DEFAULT_TEMPLATE, DEFAULT_TEMPLATE_WITH_CUSTOM_MODEL +from llmtuner.extras.constants import DEFAULT_MODULE from llmtuner.extras.logging import LoggerHandler from llmtuner.extras.misc import torch_gc from llmtuner.tuner import run_exp -from llmtuner.webui.common import get_model_path, get_save_dir, get_template +from llmtuner.webui.common import get_model_path, get_save_dir from llmtuner.webui.locales import ALERTS from llmtuner.webui.utils import gen_cmd, get_eval_results, update_process_bar @@ -70,7 +70,7 @@ class Runner: quantization_bit: str, template: str, source_prefix: str, - stage: str, + training_stage: str, dataset_dir: str, dataset: List[str], max_source_length: int, @@ -138,21 +138,21 @@ class Runner: ) args[compute_type] = True - if stage == "Pretraining": - args["stage"] = "pt" - if stage == "Reward Modeling": + if training_stage == "Reward Modeling": args["stage"] = "rm" args["resume_lora_training"] = False - elif stage == "PPO": + elif training_stage == "PPO": args["stage"] = "ppo" args["resume_lora_training"] = False args["reward_model"] = reward_model args["padding_side"] = "left" val_size = 0 - elif stage == "DPO": + elif training_stage == "DPO": args["stage"] = "dpo" args["resume_lora_training"] = False args["dpo_beta"] = dpo_beta + elif training_stage == "Pre-Training": + args["stage"] = "pt" if val_size > 1e-6: args["val_size"] = val_size From d15fe288dff4c5523eda1286aa0ff0c8e8f32d9e Mon Sep 17 00:00:00 2001 From: hiyouga Date: Tue, 15 Aug 2023 00:07:56 +0800 Subject: [PATCH 33/45] alert pad_token source Former-commit-id: 80b4053602c02aec724ecf980f8a279ffdf9f975 --- src/llmtuner/extras/template.py | 5 ++++- src/llmtuner/tuner/core/loader.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/llmtuner/extras/template.py b/src/llmtuner/extras/template.py index bb2886d5..62153b0d 100644 --- a/src/llmtuner/extras/template.py +++ b/src/llmtuner/extras/template.py @@ -204,7 +204,10 @@ def get_template_and_fix_tokenizer( logger.info("Add eos token: {}".format(tokenizer.eos_token)) if tokenizer.pad_token_id is None: - tokenizer.pad_token = tokenizer.eos_token + if tokenizer.unk_token_id is not None: + tokenizer.pad_token = tokenizer.unk_token + else: + tokenizer.pad_token = tokenizer.eos_token logger.info("Add pad token: {}".format(tokenizer.pad_token)) tokenizer.add_special_tokens(dict(additional_special_tokens=template.stop_words)) diff --git a/src/llmtuner/tuner/core/loader.py b/src/llmtuner/tuner/core/loader.py index e480d44c..4bf767a6 100644 --- a/src/llmtuner/tuner/core/loader.py +++ b/src/llmtuner/tuner/core/loader.py @@ -154,7 +154,7 @@ def load_model_and_tokenizer( model.generate = MethodType(PreTrainedModel.generate, model) # Fix LM head (for ChatGLM2) - if not hasattr(model, "lm_head"): + if not hasattr(model, "lm_head") and hasattr(model, "transformer"): setattr(model, "lm_head", model.transformer.output_layer) # Register auto class to save the custom code files. From d37be06aa03720e34aeaaba934940276def401cc Mon Sep 17 00:00:00 2001 From: Yanyi Liu Date: Tue, 15 Aug 2023 11:13:45 +0800 Subject: [PATCH 34/45] Add .gitignore Former-commit-id: 448478f9384a65f48895d5e0983a39a1296ebc36 --- .gitignore | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..51e9d59e --- /dev/null +++ b/.gitignore @@ -0,0 +1,160 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ From 603cb30887c4486fafddbe77df674062680567e7 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Tue, 15 Aug 2023 11:13:46 +0800 Subject: [PATCH 35/45] Update wechat.jpg Former-commit-id: a7dd9611dbd53f8cc4bb471c4f335558a349ea52 --- assets/wechat.jpg | Bin 145701 -> 145075 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/wechat.jpg b/assets/wechat.jpg index 35932dd202142e5d6b88acacc360cde9e055dec3..da80faaefc155f603d5cde05430135b87ed9e6ae 100644 GIT binary patch literal 145075 zcmeFZ2RK}ByEnS@PV{b)AW)MZAQ&UM zm{A8aocaIX{l4$D_xY}C?{mKEJKx#w_g}7uS+kyHJ>`Dx-~GGq`&pOYFPDKU57ji) z00II4Ai)0sm-E1VfRvbol!Ta+l!TOwjFg=63MC~41tk+L9rYDfCN?%!CKeVBZhjC4 zCodNZ%T%Vrs zRjQCM>Hq7M$KUw&cj?a6ncb>u$1q2_Czn88F152j{@bws!a4*vHg;?!=G6Ktgx{Cr zgfA4IVPP4$R9^b3*CPJaM$5qkhTh28OI&qPtFCRw9O|C*?@JNHt1=m0(N|>x{$0_` zlvJToz2P{JOOl^*JuQS%ApdV=Y4Q?4_KEeMW_Fb0#QsknFFgXVm+gd6#nGLbTGN{b zL;YMF+TWclzt>!UeF@OW7>VCFz0KsUoJyLrLZvXsu3z_=9XKh?7X4-uM)aI+&(gY0WB%VmKnWNlM#g{;rRzc2baN<4~VWoVWtv+&P{-~Tr zZ1jLr{P!tz?4i{-3}QL<@Llg2HQg6i9j2$FRBmc}vEGG~@8GM`Vcv&Vf|q{1|5sOun!TPP-Ti_(pLrkl?roK`6bYw4{HM_m2-^F;Mdax zcnLHxPAbi$|LCqNlOBPQyVSh4MqhgA*OHeFch<@cTz!c9nxjv8AHkz~{PyBMJ(*Z1 z9hYbu*P-#u48rxC7%nWPEs~p@aIM-*HjTyT)kIGUdr}iz0*kAV_giKS9R6QB+`M+g zYYr%`@u4zIosoY0*A{Bf4q^1Ab*)4=0IX*GgM(G*D109;0al;Uhwv%t#IY_7I* zAWG3dWb@i&Dj2!jWH8JpKD5m~pW5;1RBWVUA^Dg2>5TD5Up~D8B+Yxq-A4|hWvB5a z!_RfF43F1mGwYXe#w%U8@42{6BHofur+YHn8hZl+BI47te#_A3{OEhG4;+6pMJ?Ph z-qoh(b98RI)zDmjS{Q_H`H##)UCPlDWuDKOY9hOAeA#km5V@6zsl&d6pQ5gP-v*zA ztTnmQ>eQQwW_1Y|K@UR27i+>B$MmL{YQoZL<+}b*|NjuB&;JxKN5Y>>`WjFF80dec zVmh~k^}l(JJmr}9wCjGM#E3&<;{hAITJQN|^)N@R1nKN)!57W%U^`5rc)m62XI#}3H)_Uv-jrYKE}uKkH*X}@3AStyt3@9w_WakA6!W|@LchwAt99@> zrL^tZAQEVC?;dSY>$i~=`51TF7e97@9i=i_!;c#Kcb-+pUC}*>quV~pUk+-;9{5BU)s$>ar9P|xll3fsTrf%ddli6I%H2g zRU-tmL4GdY4q|EV8qaH)M;mP#U2hqE{UlRg8$=U;ct`cFaTrZsG;m?rq^f?v#XYjvOh>v2k;GN%)rmC;j_>}Qwq47c6`3`h zc0Urg)bOcT6#m=Jr-9YQz)VD?0)!leos$9ATZO2tT6X z`1bs8IKZ2YJ{MHvm;Op5A#bHtg8CDY-&y97M?YajMymdyzUuQQe-3oTd-_au$)6&hHY#gTcBxJ$q) zt5nU?-)pR3@e$hDoX`DDNC8%O+KYW;G|5G>?$~P(X65o$etPHSBAbDEBN*qrb@=ho z%oPnhT-b{=?zcDZLLLp-b!)0Je|)pvCYf58?e{O?ldAJ(gM!9SHA(EEql|C`a@2#QgDwt?0pTcpgsk zJsVcQMm^Elm%was*IZ=P?d;4b$f#@aZV(au8ntGknKfh2jN}Nb$--XT8OJc|Jxe9> zJ}Tcrg|vzz&eJuM6`#`!gI`UQN0$IW=enaN@g*RYRAPOy-TNUanLe>i!e#n`$+_%h zRdxMW$kYDkzBmCPiK_8_?)PWYJ~wXjk$Hx-7dgAghRw+F+4VR!>W>Err^fckawPV= zsjsazPFSL}B}&_#X{LdxzcZ+9T)227BH6!4Hd+0vS=NX-kppeq?CBlE^k|KLi-`x4 zIX-#xlq>B(lUIWX=-;%ks`B7}KYIgFuVa#LGyXy_O+Et-45tS^A(%GWUl=r$}v8YGZA{>9h{-~%rS#AkBMM7TuY}RCihL5k5uQQdw9ZA|l2_taUwTuIC1WmD1=OhpDR)%~ z3-O%)58nS*`D+aR|1AT#tu1v`uSNnqXj<-v9o$jHjsUu<&rG28-I)=C^`FtCN!~AL zmxQRk|E%5&`BC2VpNn+qEaW&Xq0HNxSfu-^=2ZiAq_HC&BH(K)R3_NrjDko-q*ol1 z!efF%d(zs+DfSIOzw|wyu_+rtm{MBuL zL1w8!-Yb^^&n*Fg61R%oa%QvND{RaSr0SG(>jtXVwKxVD%L=H=1P6G(j}w*rQLR!K z-QGt9rU|@1)gnm~yTv&rJ9!W3UBxThe?NlcE!UGPo^v0uW|%Kh?ooBYd?@LWgxusU zE!#;gP6?agq-Y``&s6J~5T!8q+HQ+Y0gbNKM5Q!2@2pt)By{(-?;Rl>b+-PYpXU(P z3ar-jZkwD_HrbTx^P=i(K3Rr=3OhBSNg49zHp4_=^6%Gc0smemh%}nBXCJE2d2+U3 z_WUfSPA~AS2HP0t+apSa*Aztc__&N?g%|>yC~|QXYApJ2K?IVNBeee=bYx&te}1zB zJk7D<4VqKvk`K=Fc96-csHxj;xn)59Fu5>1Zg>g~9G41r!w??=xi0~gu`95pXc%S} zgql*Oy##U{qQQGTV60Dw(hz)Ik!aY^FB#c68!nt!OYLFmOx=4hNt0Y1nj z9EO=+v2^KDCTg4sR7|T>Wa#5Re_+?u*YBo6{F1HGBF+I0>^W9|miuFi(DmKBVB=<6 z*;7ZiI)LnLF?+{mQVnvk`40`yn8*V~s-i^WYnP(!G6in&iC;^&ehJ)W-%yGGybd9F zl<2;PA-aH7!ca6Dmq26$iVTaVk(aJe7zLh%O?LxIocY4u!33RBJWrF*4iJi}C z)85(n`OHF6iduwbDhPa^lv3;tG7)V3=}$Ghc|a}UM?yTW)3uyRlOUP!ZN-{YS;WQa zCVHk8(azFo=Mn(8Usv!FVn#mua&3?=JL-bak!a!1^;+Su0*(_^q(Uf^yPe(4dUlOB zf|mM=>`#kjViLbvcaw)q;{8k6Tdhb_F`aHYAT~LU5kF# zx(6vjB;M+oU9TczU-uMaUe7^IWz+n-xtoOVTayO*q55M3wQce?>*T*eeB*{W$EY8M zM2Nh6@aoWTt`w_{DJX+-u2_W^Z^;->K+SfD_{WD8!uPAj2zq%tfXb8|lld822>zlkgXm^zZVIP%W)iG))W3Tu~2|$aoj| zESMV{GA6Z|#!7ZP5rgPG!?@oIurnYwkFyK)}`d@#oKm z1F{eb7T8|ClB#Br3x``JeY)nf$X-6T)tp_b`byzA37+f!GZ^!~=<^+LT>F(L7(aws z8+pnWg!)-^Xd*S{S7K1995@6iSD6(ELaq0K*(>Ox1GUQrT|a2@`g!V5rL8AX`vGEX zqbkUD>4J0J5!qZ-oPKdY;Ye-^{^ zqO<_eBO5i_+iAWsl~E&hWx)N7E&sw*^=pSi? zOZ~z0jSX-r7?Y#Hm@sj|og?y$te6gfbdc{jmo^!`tgPfbI|u3t^3|VoE2?RY8rWZp zsr#}9onAfA<%47&6^jeGJKU55o`m=Mr7pz>UkiMO7G29({`g_? zFxn6IwN0&Ouv<&u^vid!0P_2CCU7VK$ z2`yX%uG|+FzmD8_cM13=e)-)8UR-O7#cQX~6yDpU3A(gMDe5E3ZePBpTB zT52%xTA3VclYe@R*hwbW{`(UH81Kc1Ij#f?!-XR{5v>xgP1z+;W47*@oWW7(V8~`u zh@u#>J<+`1N-AkLD~m#l8v|_cHmVpGe)SR;{xccrr zN~LXrTLm6(KjkTLJPJZy3>_)A&>sDqQHR%zuo_PMvSye!TX33LwP>GX6?muYx)cc( zNr((l_QhBt-qzqiW@z=e-v}PTS+Da(FU&0qkv@s2z;`;z_5&T!l*3gu!flG3QU>lD{TahbYiXk%hMC2UYB^n zd+ey+cIafrB|ycwypCf$y#!D^Vi&hUs6Z@^i`Q{^Eu0@Wea&~ur6#B+<)xmoUwd1> zNEAZ8UgX)vJQL{f3HxZa#bvpbURrL^;nC2$G$zkiYzxH-te`AQG&oj~b%mQJNEk62 zexnLaGxVjfi@ck>E=9ngLgyhVw;VBi6YQWB6Ugm}20i>{KAfW!zDt{nQp}N3psRr7 z6aij2#BDdB^Zh(G9FI7ui1P1M)U&co&{rKNhx3maCdtM49Pf>9n8Nv%J-zYfXJ z5KuA(CSJ^HBMLp8u9&pSBYYW;v z@&hXWK4~ITsW;!ni0WeYvy@JYoOIuZyMfwBP}JgWlq`H#QS#|?Y0jWq=H*L2x~{{E z9>4y+oz9HRRzkPGI$C0a!t};l#N0nP9ZQh5)S5f$yFHe#Be$Xh5`tXnrY{7cyb#oJ zV-eK7Gij3};yBBLbuOC?~dX=CD2F5}=d*$*SK{ zS6|0}>uRJiebucIPKogFutHB9!fJD+y&4~6S}r;~9;j$aNIxz~sosXq%d_SeFu{ADP}sQEfq=`lu?7`x`2GtMV?JCYF}xf1@2OZN5* zLTzp9yjjzhM}Je#ze5d1?;ec?I!sr#+(je1F4!l4Uvp zyq$YJA^Z}s9=QbaM*y!j0AskErPUG4+183WDx8JLyVgt&d_DDbOnsa4uJJ}o;&BYh zEfi77g3+0MFmNpjVGpF9=9~|Mpo%Ob5YC)C9qhVCSuY3<Z5Z8&TsY_%bMjx9L3To+l3u( zjXGXUeOsc*PFcnvp+-T*n|WG&!Q{|$37m00Z%5gA<0WHz%OAZLcL{KKEs>g!d~p17 zKWOC!i4Reeg7t9@x9&MOTOkCBTk6*3n1iNGb)P6JPw~#&Dv;=YK36nuuYUT0Dz~Wvak2Qd)jbjnlOH+8T`ShBwBZnr>zvwWGv3oXVlCSWRT}VH27~ z_0a73B$52SxZ?1)7aq0Hel9QO!^rv~Qb8h|Jn3pDZZ%&RrdBuiU3@fT^@C>=l6`mj ze7!3Xo(b-u5>1krbD_Vr`Ki$T-B0|p7|xHlJ61vzET3;C7Pq$5xzeOguA3#w;mIp12ih+;u&pc|D1Qk=#3H`C zK5b7PJ)ZbFb1E0H5cjlyDx^CpWtI;@f|Bgzk*!Aa&xT?lAGBXSzbYX*T^<>sPR@QN zU)5nC5uE#ipck`;AejwoQSdC=23>JeY``R3BihRtd!WB|1b)3e*VrBjrtn^hkq>Oj z`duuVkj4JPU8zf|&wiBiiHNd(9AkEiXE|}hVxuD)1NMGLH9>T=f+eqPZe1{_wmB{svCq#$pD}rPLGTekr-8%eH|@* z2}B*{#4ywztKs}N(6)|>cp8ldG+ z#?##X@U*>G-nU1|x0kH9?t;2?LYh1=)3&NQ^SY_uqR}9K)pQ8Kq2lah4&lZ1`W_Hf zO?}$r{ZdnUnkn)DxLQAT{8ZAQRl&yHtJIiUG;dcMZQGZr7NbH-XKg996>;twL!r3T z3mG;=ALavCM4&H1NpfYeenm-LBRhx^ZO3x#;=(9pm+=rA5f%sd^Bf%}_PJldNOny) z%`Qr!R$S;_n6Yv0++L6%SxsD|4;^zpEkK;awXhaK=X)}XV-)3%cZJT>U4*5p!i++s zB0|3JFu!PEvlu6hSn5fnuI$4J_s-d8_&Md9sn_lz>*M)Fe>EjD$t->X!)ulKq3`;0 z=v@tFV1UJNp}ObsJ3+N{FMjcZdQaikzJl!iJXxhQgn01Gmd54Qkd9-)?k;%`;~Bp% znD!(!lNa*6olaF;UY~1??E!IP`4N`R2lpDLq;q6-Vbw|Q?sRWt(67FRCwAbu5#zR% zFghnjYWsVj!i{2F1lMi#;!YPuR8MrU(QCI`FYgZ85B4cQrop6&)<|o{vC_);7BDU$ zZJWIw{4{&%D_`B-QJiO-n64S#mRU~h6=m$mT#6BsjgY3w*g3|hlLjR!gcq0P!XG}JHVVY+tDxllJ zeccx~FZl6BuVee6q*WvOr2hcQ*hN0)q+hm0`=s_6!F~w4({1P-VuIh@B`Yl{$9Nfi zjduiWFN)!)XDW9y>|V@dv$pGLe{%OA${yOGPd^}EIvD|;1j=K$OQ3r?){M}0v&L6j zzz7@B*Gv_Eh3Xd)WJKBGQ$>$4iKsF&jLv6FaaZO@Pu=((Q+^}*VfTg**(ZqC?}?6p zaBB^$=!{5hd(;{8;=AiD*Cz!s?yku`pd1M5WF8Bi;P{r1gsL`_xTCmE$f2WaysQ>fHHlxkUL}NB$x{@u`m)2y;N>0aSN_FAL z57{$Y6UO9~a7jFsCk~;GcT@8)v?4?!_6?a`x^4* zGZasNuD6hNqn$4SHf7oF6;9!64t7o+Bs~c~1gZ5UQVo9otQz;v?g~*_KTgH-G{F_{ zxeuPFy)9!r)}0b94`z-1p0Dri=PRsr(`U}7Ursd zP&uOx{?JOb0*TU%RV4eg5&c-pn}D9>4$rgKgE_84wFmV(XtdB+$GRS>IL=Iqymt^< zl%#oO@We{C|Eet^-J^9Wf}>l-cBDlgewzHuO>Sq`{HlA*+4Ca z^nIR1!RU)CLp{Mzn^Q<$pg!gYqFk(-^#vxtFv{@T?`Mv==CF)sd^Q2~cjFGXbXQzB zk2O$5eHn-m^&Zx$8i&WWT2B`2`Nl>PeQu)k0>;VkLm-Q{zTCm*4%UXVgCN$m1{B>c zz3YnK6F<=#juo%PILFnlC*2*h;;by$wZiAZu(gmk-I>;nc9miNxf++zwwCo zqefd}v#CKxmjIpx7os7#7vDkq+EPpBRQ-6P&c2duyak`^NfEUR`rwk!NNDAp#D;V$ zg%jQgIxZP&4FK=rr6>(5|j<1yh1L@N475o}4}lk)=Ko!h_$5V^3~ zSlC9lwW)oZHm<6D^~E@BySM%DX(iqz5rIP;T!c%)mbsR&+JOJZO)Keh2y9RYj2~vY zedqE2P~*wPq*-ltGwR{g<0(FgAC{J#B07&NeqHmSqryr~)C9R0Cez%TA3d-!cLH&KNa`0V_`?gX>`DR;@lDPDd+QlvvEI7CE2U+w*hUToHNDiTo@vVQr3@;s&rgOZ8Xn^XGfDj}9*XdcYr?)2^6$JH zslnebfqj7u@DXcg^}FJDnA zz6;C4Dyw^U*4Y>ca5MeOFNMp|MOY5&SKjaD>*k4NlB>BKFuI_al@LYsV{rDJK=$&C z!pAfv*KZ-?s#F2Gmo9HH(t*eFiM_4%a{?a%giU|vA3$ER8cJ5ETX^hR=yqn&nY1L; zt~X^4cUy72*{aqY9lQ~Lmz)eOPD!vG0-FO)K-G(}ekFmoFj>Bonx38|bD9p6A*QQu z?q1_n8k8spOi{%>y6|j~Dcd&GUPO)Xw#Kj9im`wm7ogGokWLNn<{5ACF2Niu&-PHY zTFvT2nk%>_1tl|rs0-h(<~;1jn8VPrh{aHk!p#ff?B9YFnHw$WJ5NlFJUTb`=|*#w z!89()92j2o4JFv4rm59TU?OJ94aJloKs1HdtBI$4Ea0O9@I|CEczFBaH9D%q2&eN+6dtagUT`YVioEz0n0E37qiy%M6XR)P1azY ztiFhT-s`3~+vLZAjbn0({=iFcwRevdD<%V3Nw)w_C8pw)6kn$Dd$@|%G8Q?bg}AKc z^gb}Fq9M{H^#``(oey>>55foq(sads@H zPD=ol6E&XHuvkSjO)Piutaa?(tWf%y$lQB$pfK)!;PBJu}kL=p{ z&n?Abg%OrYslWS7Dxgb}rB{`seu2aFNZjdyCqL$IaM-7_zVhw2ab^Bef1E8#tdffy zQqKO+0D>A65MoOeRQEli9~oV z8}othu0FLUGLg9SL3FVkWiHYAbS?!L@$t?W_S#Z*@g*?lGFGAJibqzwCQYQ+wtm6^ zm5+#1R?k_({YcN6hs;j4O|ztR7uDRq0EBvUg%BGL*T4@ zT3$j{sGGDUs>7PF21JcXJ27ibs#OSoF=?uPXUP1coW*L^Z*U7t^*(JnJ&ZM4VywT7GiEf)SNS};@198c$wc%8JE_LWSZ>AA ziflhO&n%*~Ee|mqk#6+unQa&s_PDs9I-ysWXnHv=ZWfGoK&Hi%ZOR67qxv$vKeQMU zjd*a1sAQA&o`3z($$k5UnoIvLOaPLO)XZs7a5_+?`ul?w-!QuaLJ~Qimx4o;u=Pz9 zo=f0dGEm8tta}O*ZdTv-vFrmgzjda9=KvY*f`TVBV6CZ@3_%xJBgUh(5+uPAsTLQ# zOLkUb>&EfmaDdMycd-At=OPI%7kjhvKDGRmOjK~NLA4#?=A6nM&>jJ1w$jAf%$a4| zEhcSl zkIBBu!-8U||K!$_c0BUSGjXwgCId41%EP5}&5cF7sm-)D?A!Q)_eXDQK0mL% z0$a!>buk+)%&CohS5#5p-{h%QRBr4;4?6Tw{NQucxoLoDxB9l*?$l1VX?#|M^|!6+ zv8~pMGO-pq@?lw2u)d2sv&eIryRPuMZ-xb3;m zE5g#QJ8J6eTvbZ`nZV|S{NhFvr28Cq-)!ped^>s~|Fik9_dCXhu2gEe>2tx#Ol3ys za7Q-FcttMW4-BrWTx*aJNpv9Yl9~hbY~{9-gKP12JeMNHCn&Nnn6sX7Ae%Fi;zN^g zN6ecr-R9fZ)cl_&mcM{iv%(d{b1@Dku|1io5%2dc%kmdqQ&@)B2H1zl>jHt=7?)CL z|D&q$7DkqLA9b&pxb@|@vcBC`_e~v1E_R~IQTk7*C4fpv9j`q#kv>7{rSk4x=s|x(8?6)%GlH2 zH{obD^I>kLW$n)ATUMT&jVnqcOG&Tqu%FHTux3?sr3=Bb`%9NcHYw)d#@YVkfVAUWI$wM^`)wd-`KQ=}S7n?g zA<3$22Yian!6LedP)p|j54HkX(8aaUV-$Mpb$vfNxiBAOjd?ov-Spi0j!0}Io()n3 zpo=-@@=%V+^^v#E=`qbO-~qX;oBKlVgQd6TZX^~vntAzfD7|4Z_E>+emup0Pq`Z3e zZA*ZNx3`UZ3JXDOx3Ze3C--f;zb*NtIfv-y{i&+HyhpX!c4ZtnDP^*nFeK|>lr;R> zWOd)g4Gug+w0NSb@qVcWR{7DKx|hixYGaNr`RzRrIe8GmaTLTEy3>k`zGma_48cDL%!M1`YK$Ufr6-y=!o_hgAv4Z zE;RERb;NaDQNpX_cL1SK_zLVf-RX@?cU%M#Zy-5Y&m*TOz93nbHMUKzA5Q^pBJv ze|$<12A>SJY(86oPd|@(b-|5+bv5x66>gx$xYKgUv#g%2{_=UxI0d%`uu9{KN7^?H85E>8X0{f0Q7@>a%2 zbrW6zq7t2^q9O>B>&C7@O+ruq~1sEiw ze{~EPCcXFfWha{t=E0~9cPcYgPk0@)Jdo8Ew_q;<`wi@7cYg+aDw5&Aeqt<$+J2@* z(D&(bTK%M(ySwVhzQFhTkZj-2?5COwWI8Rj@aWxJaAFo=m@ZHb``H1-jDJEg0QLdO5G`I}R|+oo3-dSz+viiT;9dW>1jw0DV7 zfJmTZk0$x&k9!S8Ck$WPxtTaLa0w`fH46z4Qel+8*?G9PA`c22PYRgr2Kw%D(*z>G z9q!!D;aTwfq2#b#9$vdZI@rh??)nbm-ot4H8z(-VgArFx$-B z{q|Pe$bi5|Kkn-8wv{&`=T&BpHOF3y^@_{3%l3<159bL&ikC8_Uvir0{a^ZvDY-1* z_h+`GBSBrb`~AV!$E7(r&$Ubr7xpy687=|&dN!VK+ju>ch;_sGuH>*g&$+HgNH-jQ zizJ16C2yJB&-!7YSSz>Xe-2SXO)aYx3SiD`QfT zAL06t$~+c2A(nss(YHB+^di?y#3MnSY_c^C4j}PiSHf-tem-Y)YuuH88}KzZ35QGK z6a-cYaGIY)eG#cM#puLG=u+p~{Un*!-x;!t%-^SLeGg;Zw93On(NgbHczw1w+Nd(R zM$~K5EKV;v!Kmq@f~l#7kY8sRh^&oa0V>?X5!qV4ebe|`Mee@ruKOE?q8NL=D*nd~ z31qGQznBPU7VKS|^r80m3ee2UIkYf`Aek|pW?k-H*AgqK+^%DYp-`z!9>Q;IrY#g7 zmOkiSBE>QzaL!Z4lZS)P+G>N)a!sjW?``s)^U(Pp%Hu_p3qy}OF-I9UuLP7oHz%(p zy-${M>mX!Q2a4RIJjT}`%#d;s(dCRQBP>Q2Pf`L%MH19}cNzsp{^zuNiNT>T{jf62hVj0|9q$8gNgPnMX>gYICK=6Bjt zHJfG>zeN`c>lr?F2X?3GsR3N?8Fa7GWpQVGuV&C(#mAaUO$($?P4Vxv0hRjw4?cN8 ze%Ub*oE57E8|&k%;7?Oie~m;eK#XM>%`JL-)unFfkDoy z=x6pL+oY;#l1?J7Y>K^5u}PBJ*WIhAeG>~L> za_NdTD%0CUE+*#IBLjUuZe)Wdz4~fD!>+BinsTqc4qB0E3TXwnvL&-$NGX#CkIRq6 zxA?gre!{e-R?MeU1~LaNDdl9aLroLgsVp@mM7 z!@3Ot_f9_Y4(zM-TDC#-Nbh!RCj=~efe9{@o!b=9IauC{tCKrV1EMpvoIc$zF;+1R zkFp=&%_Dx25G4nI9!yvZVDIBTDBjP<%$iKrXoDV}Ge->1MYd@2s5^cylQEhGH14o% zT0%O+66WfA=vc<`T+Zy`ZlT!A*SNGzR6k(q zjXqCE1@W1fElAP7t4aFh8s)@S7CJ~Ann1wq(twZm-Eq#LSJVo~cbRjIZ`pKndy@85 zzJfW#?#b5$Y&S7aUx?E2Kh^9mrxO zmv1nK#JCfD-caR{wxs!#t7~Ps4XgNwQ=^UJKGR3zXZHy`-!F%c+q|Z8$8X-*va74j z^dxyLG3jxAiW_0=NuIWl&)0?@CCTgEwgYkT(mZ_c{BKSx6c8uj#y5q9jge|Z-lePM# zCY??noxZ5AaXvql;Cpv`g@TX1DwOPd_$WYDKA~!ld1sucf?6#5q|G_ZlH(*g-a z`gfHg*VvUamJf4jv*DPA;BQt^dxe;Q3+xEqpY1Yt2#(i=p>FD<7tRdIe`hb*XZ`@4 zxXan<4e4H^NYbI>O-hM-O=q9qCJL^#j;Hk~#CXBx+1oL@0Y*7}8T=S}aKh^3>@F&& zTDrmJm(+O}Dc8Ea372=Dnywje3>U^bv@p(N?67g(?xmA8_X`E9DcQal)@8+D1xrC# z4IkLv{Mk|y<8Q%+gRBfBky-Ou=VG*tNfM&WO0vRFemh?^KqS%ubH;{-=4ITf$va|(=wR8e`Sws)9lcA*SQ`Q6PWg-m+qc~ z{63vx5DDO}uNwH{TsP3Z74>Tql@nnf;Hq+6Gr+&y|7!QkzUT1>&L&VOT$$7>&LIvuO>_roE4}BdYsE+ zU1wYabsZ36%uBi-o#tM}60@?>TABNqAcAd%1#c4bWDwJb(S1MsPqzr;UtIG)Q-|Qx zPhY4^YUx zx=Al{+xnVNmD9(ho*`7?+$P8rb0&h*r>old^y5PO+y1n9{(jRI-cj&BcR?KK)puw& z_9zarmFic#OM$Qy?txJqZ60yHaI4uCbQg8ILcr(Fk>0@vdb8Wf-Kj)N4q%Tf)|XwF zG3^L0E(iVS;M#782MT=g@Z=S2ho9~uLIqUt2G2-?VHcDBI(ZK0lpY3)xkpJqHBvf$ zL6apyNXZ(8l8#6}T@0UT<7WFTX;&5}9m2j2OZSAns49N5MFHNENbGC1L6Yq>tgi-pOWyamkmrmg0HlC*o~RX-T&agoo((~@`-(igS$?f(6sBfy(RUKlpC#nNciU}UL3%kW zKU=ZJp0!!2Egx2bUhxHtmxcvtZpgo99Ov?BX8=37(>rF%&UnR>X-=x9<#_Uc*q%<- z8F;9mmS4Q-SwzMOe*$gWa3zc-Z}#RyvzB$QNhx>{HJt`0YP&*P#QHFgKQnwU&uk zp;6F@$X*yBt`pi|s$8Vzo|nVJZXcZmieUewXXN@N@CXyW!fC#(iFj}Q=$u_nXw=kv z<8c^WtN+-JLy>iTPXJDRr<#gQ>LgMVjxhQ;Ub;RV;Xc$hhIa%CuY#B^rmX~O(L4pN z1)Cf~PN>m|2e%5+G&Kz4s!W+)-c_WPOz@x04;}+^N?S)?T$}cC4bZ6yTj4bHrJi}X z(QNdM-9%D+)Z)tB9Y>lhCqfx3Rs+`LJ4iflh9eT!~Z;z`WC& z+{4GeVimUKmYYJqzUF z8~>`WSY&|Ukr=7Vv5d!QIz&FGNBoA$!Y(HXyCSW|wmIIP^{aL!$Ir!szjdUjN3y3+ zjyGAxSdENCgZFCUeQU@?kH2!BLlLytpt&ZEQ+T#6VG+W{@D}^?Jm9r#$=IV+Z!(a! zv3pFd;~|LFxv6KOrpoC!`Dcss3k$V~X!buW2BXnHjW3PUZ9JIlzOEaYzqhrT!r0Qw znjZ|6Di?-Y3+kRf#(e#{Cd%7g#{Nv7hy88I4h2J8P9R-T0H_Nb&#HV26R;BRYc_Qa ze$b6-?HP7_*e_4)tCtre^x_p)%J-8F025}e@V3x4ZPC`7-_(@+YC`Vp_na!X^Zkv zLFq`95(E?l0qLCpN)wSLy+jXPq)7`kfP#P&0YwiWT@Wde-U(6#l-@x~0v2i_5F&(l z7w37~^StjE_do8v?-=((J{Z|MYp=cbUUSXgoO4~*R1yfJ`Beyi6DraLOHy#SNV3Pm zSvSr*iG}8uwN}lgRSo@-Vc+tUU2%Ce*MS7#pVtlp(h7htp7J#tJ%Q}W@8%v?AhgI- zq|^X{Sf}Or*g|K9H~VisG`!L<%J@bVWvnk0efo@Q0%Y%R=jLw8oQQt=6osCY)~8>e zwoWLFHIJ3bxW_x%ayLlDJQ*s&#Vz-Je~@fMu)^y`$$2wpIr>kzWnK8v;HUCV!l>Bl z+$IAg;=$A4-;i&Kxd;8|64fg!;SVT%IYM>kormYpUNQTv7q9))sMhG|-0z)PNHLa{ zrX5xRAjKS)JZBkuVq`*5)DSnrmv0d;RYpGw%a~$zC@RLk!V(5b!+TAuUm&96+tK16(m_KU^D+>XpO|Lw?Nd zO$~ag9*tRztOb>^|JjDu`v^_l(ST)RTpB^XuQY1uG)4pCvL(N(Pm)|2w7B}|2etT^J2xSe55}8Bl^c_8bVbccmvqyM>S4GJS6)8UC#&X(h;pbd1LQBMkzw^ zH>4jy2s(c3O!24c8c*fF{@B9t`)T*OLxv+YlBGU=r;G1&xcscehDmko&-Il^X}zD9 zAD)4P6$U~!p?+x^aCrM5oQzMWkYvL%Kx0HeWA^0}Amr*J*`?i1fR2E&5ayCaLF$8H zkc&r8%w4AbIk-8F8U|1yox&EL>3wq4PgEzy%q@>;P_pI(DglXHyAjER=#KgJ7!1?j zkh8~z1(EQp{8xmykzaHh1^+^nL|nyx{R`W6_M6_+RvLCJK#1m#k23~{zB?mnd5Lc9z3WsP{}|NjOV{+}F6^~=(99@X~=v6J%6<`<}9w)EFn?sDD-jDDotM`egB;-)nUwWLosSZYnTG$hosT} z`j6?gEkH|v|9=C9-pzmf!Q@ke4cpGnv32f&;~fc&nL{i_+@qDmU9t2%m%a7cTtHX1 zL>;ZTh{o+%p)`#|uAr58?(aTs)O!w1l24a@-VAg64Y~UibIbEb2X*)pgiHb{v(^$?_N9Qk^YH#a*sK1AHlR zTx^ouI=y(u7@~ZVe+XBLP(V7`R*@>Oe(Em*Ildm+zO{CgsJ^jned5}N;+3E@EcPOs zRV$y}+a-TAM~zF24Rl^v#JUSzu6hzP8m!oVwJR!pVvi=J2^7D;OCvFYdup@&3bJJD zy!|rg`J|qSTU8vE3HsclQQT00l>CpX(PDMS>0xT+sLt8wYDoJ!?LN*?<~gL zal#4bMEZSDqpHlp>TX@cCh_zsPrb;Ward2dKQOgUsqOu#Qv1OC)w6-qdOwoI3Q1=O zOAZ7~vZV%rAvuQ?%ZYTU)k*CANXM+{@=+l4&q(!9QqxMs{b4LBfg@Z3AKaXHz>>;x zceFKepd&GnSre^woT{o;CfUO|Aw0hASW{Q?%;0J&@C|e(honF1*i(PeK%fJPncFEi zPY;7p|E)_ZVmzhdmRnM)$-VNTR?n6n>i8yXpj>y7Lv~WaoF!tgJbY@`=W9m>-IDk_ z+peE>8G5KDmApr_=gj^SnuKys;jlv1SX7T)m3>w2>E%E>g%wHDVtyeE&ZMa()_j~3 zA-|E!tZErtfQ%jbKwGD9ZSa2LtGR)*&#b#)QbcI zhWyrqP;DoOSOL59pR*!JfoNrz4dj$(nz==A}=wT$yie$ zSv&OQrt8WVhowH{UbJ7yf@X`P|19U1~olB)7w|Bw`44zAh!M9RO7Xv(;>$s(kU!D_hipTb4IO2lV>~ zqZvc_FHD+CX7((~rY_7+!n z_Q@w18yDX?>*y|AyOZ|tY>wYj2^-bc$pVvon5;DpvN))aFAc}ByJ$(-!7`-K0%ust zInl&4NWV~;ul*@!Qi+8YP@kL*Oe?`H*IU~9(2Rgf|$p6=_5*h_4yo>i?tYLDffO4Dp524OJ7XlkT>QnJV zoz)kjPA-mAXIH-T?hHdQf}WRm9z(L6g;fnDy>&-0$z2KH(f3UINgjm0l7DHOP=u?L zrX`ClmgSP7u#%)3WbU$!f(1Ld#M9<+^&{W%XpRjb{<4)fth= zUApz5Wz)%5IJgK+8A^qz?^RyE>!VIjq)$5)Hio(n=L@VEfgZPj3BONlmMlZ4+%+aK zl_M8-4IZy6J7GWPCw)w|J`*RF_>=QsFf}d0Y*?0x5I-%M_*|0@M&B;dDi$JpIbrUCmevAGFO}$cqa-g?>Sa1$Uz=0Os`HO!fBrh*lMi>~YSfQZuoc91S?_O%2Lq4E zl=?ZnX7i$HZ;xR1Po=Ee&WWc_RZT=Sx^j2)e?Nmh1FG(C2utK&-(e&MNgzW+zoW1s z>k+(UwJ}vqU$6S{FGBG`W-sWIKk5-L>i0bufqt_j%9jFy@1*NabQ>tj@Of=Y4Bopd z@O)c&#>;r#YFTN=hfgwf?UMUEu6$T^g+c|}I9fMwecg1qPxztswnnuH>qP922P@~! zRdK(V_oIr|VaC(0g6x@5H*`E|r8Er8@ai^D3N>)v^oh-pZ3#ICw@94%q^T~$M@QGq z|MIlpepTxW-%(KD5{~%3>=eENl(S3PVc_o>3~-oVyCZP?c?3lXVM|sfTp*yL{gZ+# zdTJ0F7u~LV(LU7V-ualvnEcO(G~iGUk&WR+t)fXSlunRwp$u8s*h^Xd4I!tYp}!$B zg5$p-H!32$EPud00O!a>2PRBX@;T-2`ojxj^ZI61Wl|1kfl zoqcq|;w4X=l{Jp$$HZs(A`g6f*Vry^bw-EZHiSfgH-MKreDBI_{3eiB-D=F3+lI303O~3L&8RE%15q+}XUDJDdRRiW|DNsx z|9)dbhz)v>2SYl{Iwn#A4qqcOI8lUsg`+L<_di6B@1O^okMI1imn4}6nlt7p>VE>% zj#5r|QxD?xUtyMDLy>T^7IP*b@A*h=3J~W>S6LqY%NH83mqoa!Ut^~KwqZyB3JmMj zQj!X#OCEKoCic7%y#gn{fJ0F;F2lbex^Ey6&;J!oHqWiLOQQO(5K@k#B|xf)nKATh zPY?_|>Z@p^E~V2LI1|jfrvE4MlFf1e!HscaVk3ED`AZ7im}joL-W}v{dHUI%$L(TG zYI0*=ogw}@ZYd$moN&%)B!KkbQe8V^RDNRbXmz2Y+U19%xcd6YE&U&JJ;Ll&4fP zgb5|d>6!$34$~fAy4HsuxZ?|)O#2dFcOB;?IHWmjzatJti;KKn&fk|$zJU8a^0h;}dPDW12Qx9g`dX}zS= zDP@=Ov0ric_WokTQ0{qEZQL-&qFat&?B|YJk5|P}^v?3t(X`)`7SyCbb^*HA;VeNu z7u#kthtr&B?P+@U74(Qeb~HDDx|-OwETR&=x1ofzYdI;$An|jo$A7wh7qsK6PR6CP z)OT}OQuw5XO%Nw9p3Frd5KAK4=0zOX)tJaYI^UfapPktKK%W<__5tm4oJ1C@v_dXf zP3|*DY>$2L|5~@}CG?*sO4jJWscGNcz|>AB*;=(KKT!63lbhLj*#Rb%s@ZX>S~?sr zHi2;&PHf&uA?uccD{8297pzrCwX;RPtQ9L@6C3ht1zSWwE0K_2ws-Jw&=ehP?}5g| z6c&1UMSONzX!JR=ZlkazCZdm@Yie(YbtAL5@XePwt1Qh2)eAa~UoHfA=JB5E7y>Ps zYBIDW<`HTSle#k>oOgbcr6i?+|I3>5y?AQl(Q^2ykZ+swgeP{Sn6mrLmT`Ht((|1X z1&s}6u))SFTCLwI{Zg0EcbQP{=CX~{vx3;J`=@EG7f!qoFwcx7qN-=@?AX7o>5O>} z$wXzlM8aj!s_a+~mHw?tSq5|Gm``4(3g6T4@@sq`i~T^%^mS#nr;Eg+1Jsn)hvovJ zxiYab+<~TRkpE#SX7;d#?&R}KobW#U5gFAIyl%+W1hctl1CCYoE(z+u9QSsCaH+xh)~`v^=lqvza0o zd|4^u5vuOIy|T|uyWbr@e_c4PQa0DlNOqbGGr}+R%uO{oJ~&w9kJ^?wBURD)%WFmN zoBJ=RoRDP2Rq9plunSnd*Qt99R?^ulL?va4`96BnFYkV{OAP43b(dcMBdKg z?yMXO%<;`pV#kev-&1#Wgb{CE5ux5}>exG)+=A1oOW$t>fd(mT$fs6S^)HP_CYKI` zdux(np0f-s`0r@&@7j6y8eTfEBO$PA3OA!FC0*;p*lub_XhNygNa*w|Viw_7py-@2 z4PJc^O#l4o!ru^A@3@eZZUofcVZ-=3-`4BVhTsc47KrE9R6@fy1HhY{QQOMVq zOU=G6Q;YZU9rktTvqSYPu@5h&Jh2&$^AyK5HrC!?>ATRm9n5jf=)GiiP_N>K24508 zewr-1)XlW>15N^y?5yR)5_OnI5N_#7eaO%o8so*_6qRPokbrUpWjdxWlbsv;n>3c9;1m=1qddqX=*b=04^eP$AW1M)h}S>Eryc&~W^2hyFYFYuClMKF?YAjz6r*(0$mA;-uA4 z+{l^9V|t8PVJCo)u{s2qI-M-G$GKde8k!#_j{o}loo!v+CP$vZIow0m?&aki9}jSe zBzJTiY-tRGKL_Ga(eER8kqJf|Bp#htu3oAc4x&wRoaL8{P;UxS1`%FW-9 zr1PKnFuRmuf{KTg^p!Dgue)8WY=_JHpm0nNzc0 zbxiXDjC~$5K{Kn46p)-f97~-3o?2kiE8i?{ops6Fo?S7fzg2iDvVV~ARCpI~De)1e zJJiLz6BaKt)#Hh!0Ukj<)6Abe?(Yf-`LAh0j`%$siOygm7gv}3asD;sQK{9;Owo?) zbl}d}$dTsDJdq1Q*Oo&wk6aQUBu*T>Yl)+zhl$mY>4}_eS!m0wSAOQy zv_ninZ!6P@f8s?F#3RIiWLD)o-+m8?Ns1|A{Z;*?VGy$#y02X*F7>hH``Fh2(!okTunEQFGv96Zlmi^9V{xX`? z9f-4*%qI41kLbia^jTJ0qVfmfXE}X%n)zRgV!Bi2ID6-UlIuRhwR6UXItR85tZ>(^ z7X5l~r^ha3C-n}qG@v-4K5k&Jf&0&-#DH7@3 zE%_uzvVkzvjKL?}-z{4l6xH{37k)eN$y(2uhM#uFA^%92q|j|+*-f`)WVn|hvG!I;Vt@$v^K^3ZWHQa$~IecyfBjbI3KFWG3AswO#F zy} zZE&x$aGW|#J?Ua^Qnl|psticn44%o-Zhs?`WD-N z;5xM$Gpe~SkWgp5WJI(Tdm5Sb$)q;RFLBuwXl|Oq@f*DsLFw~`E8*@%F#}S`1Nv;K z-v?-g7I*=DSOw_AFQ-}!!YkZ^Lc%!3=uPO}Cf@!O)8F|X3cL30O>jj1(M=@9V|J~s zrKUb+;rU~mLfUCn3BCTlQnV{j%t?B*OO1xzSrksD`)e=m)R+M?3pZQY>&H|nz5fUQ|N%y>#&@JGl3|Al0ZwsC$z zi9e}mN+rlwG_IX}H7xY@UPrGU^y9fOHA13ktLKVm&_gM+r)Ts&?p^Rfojv4ShDNFC zd*D;Bd~b*^eO>)3tlQe2D~PSBrmWq}F1!17p~DH=UJOb!vbn%al4$amQB1(ton@TS z^OWP$?N3M|%Lvx%c(J}fg^)YMhRjy4dLKI`30*RuF#|6Iv1-A+^B?AX42D z*E&Z=&HCJ}&-ay!{1mo{EtkJTv!x3w7YkJ(p_Ayopk>sP^TiFtJ-iK7n+cLK+l4Bp=yk(f6?YOK z+uzZT;VVTEK+5xATOFWa-`U1RO@>7qmWt6V{s)J`}yr*T>O{rXes&I^-4-e$ZK+6{~<89;VY6Hv!z!GeN9 zSA2rYcXl3Ssu82`U0ux%6-=q&-uF4I8mQl=-9E$Xnz{Kl?~nfv3C4|G1a_MILh=M{ zxagye&d*glU2$RFc)4F(UmTi*pS5+48h zRivclTFeqT+>mmFQa(0957PY`3FuG79`Vj{%|7DY|N5qb&^3Dl&)*Q36xd+$wf28h zu{B_&U2il?ZFxScf1Q!TEtH3^*dmuGkAFj00Kr;~qFhQL zSx^)}`YF5{MY@`MGK|MUz=UN>Ved-oWsc#8l9ESw?1^Nmb|Xq{pc3A&k*+hFz~udGsD4-XaFYuUR+uKFV*Y`s$W(1 zeI0;A7Fz^OdH)=K$nLYh5XJ-!Yg>UGodL)--x&IR?LTzLK@vaT{DRii3&|9M*dZI;|5s$8L;>NCk z0589;u?PA%g90O=Z zt*J<2*<~TxJm#RFy*#F3H}n(oy`$?$@HSu#H+Ii_t{k3br|L8Jrd*nK^7iPia+-dx z{;;VJq=P^A=o;CcppZm10al31IVvL=EhCKR8om0rS+W{SR5F%OP zlHm63b>3$;EKgst3a+m={d_KQl|8_e7StSg`Nif?PVhgFFSQ8C73CY5YG1RQiKlB2 z^_?RvAIEflLqy-xL^7}LtyPFA9YfwQW{3h=1f9!yc?pb!)3~#{* zr+3VobB!jj<6FYdUR9V*anl&g21&E_P2`lk|KZRNuG5A9OO{h}y-84gzgSlb^GI0x z(<+=QuTkw8T1>2jCdsdJRejYzC;DyTQ3A=){J1be(Eh%{x!Lt+ z);1s43hNE@>~6F@m$~4WV(KvqB6QGC9Rvvpq=f129rn!(X1c}_tFcRc0=-(1QoWkJ z!D`43=%;B6y{eyUxLSD*%XAUaE+1^$n#u#^wlKf&Bp-UZ?TCoL!{YthsCz$`xhvSX zPgI$xE#$`LA-vlS;AL)c?H?}us&RaxJK_8BGWcXBf7vb}&SvB^B zGl`hlY3x!Q;OR*ft+z%N7u=bjHWuHpvYsegqcuLQe!CG=7c`LKG)6^d zQ?Afx%`L=jpvq&IZj~tp5jx%HJ$thocD$ZxKa5o}diizxBJD?5E7!2yd4dYi1Y&PZ zvkvmt(VX43{xf-iwJI8EzEHI6&nfW>NSZ4Z_Wg zw~{5g@-+PoFX}=@#eN9b^o=BlBgT=^g?EHQR~0i9a--YQgVz+c;!L z?MQ4o$Fhr1y()#c)`i(iZm|%=R|D+>FHgo_;OPB>bH@1$`VHL0J1%p$n~CneBvy#6 zp`P;($=U)M=`x0{hmjDW5{Q#y;_5S|B0P~aBI%;;XPq`$e9oGMLqw^A`t~FFQ zQ;zN%1Z>@rOx69W1DAM^$CQ9su>%st$2+X3+btsc z1E1ZL66|$M(%D}xxr|iZ`y49nyTqkx?zfD7a()WqNN;98S3sL)_Va`q?Bml|0^Fdq zOeSR04IP!TMMsdyCA}4b5pmwXA>Edfn40NiIT$QV<*C`!nB*3%1pk<|AkU2+t!HZ? zS1!bA-~>`5eIRPmt@FgV5jja#@}f0IX* zcOEat!sD9kioE!5NXL9P+U|$o&+ut{fE@mjK;ogC=fNWWvza_-Btf^=^Zqn3XjB#9 z>gmbY@NVdV!SQO$#K3vuBEMYWXC;wVu7OIB!_)tHv>4E`%7cowSKGH<3|GLs(d>>U zAtKk?)1!QSyrNJ#=?5K?g5SG(aQHGWF32odLp`#f{WOpX#FAcuV4So6)=50*+IDVa zvNtD^?#8s&ax&f1d0*kw?%N%+0yx#E)NEdy8ZavT*w}rEOCi4i^C@aZ2k{M2X#US! zW*#H|zw(sRU)Lg1$uNL~%mJ!DqOn1Jf04)7-p)o^!Dsalb6M&J=NZnKOg@kk>qp76Zx=&cRBzx6_(Ua8kNb?d+$V1^2?=J^IB5PKrX^xu$Eejpw~7S-8Az#N}x2e;t^ z*t~*l81dW%q@H}mki~LO)UsJvBQiUHj@_gGe()vIzaK1jXmaAme67w$(#2JHTQ*c7 z=Hj4{aC3#=bL~|r0WyB$GnA&g1BQ6XHWOw|}XN&mP zvmyTHv%UPMv+a7PAh^h49?J|yH%9{u#9d856`}S<&1)yC7tq?Sk?n^EukmfgiqEKVA1i69gs>lr^QcR^gh{55=x_2+&Vv(<|2U|;Py;xi34afB4 zM-bmWzosMAFn7Yscy-~~@9G!ZpPJTSk~O$1aPj$0Nx2Vy-ESINVD?*=0*`L>Kb*Z+ zNV$ZKzWNB&=?Ar*HfrjfLquDvJOe8ytiqMXntb7GC*s!@*lY=o>1miXuBq0D4WavX ze)z#y?^jx^o3)y}=qhvYPzb$ac4RP9w|7jtd;_7kv5Mqs-V$rj?~)v9V3{eRds6D| z(~?%a9qvV) zCHuN#Kig2PyteqEJy<>Let%b6uxjCKb0RwU)>e*vgH|iaJX&;$KDc2@3Zs@p| zA+JC8WK{9R)F#`gxRoyl#D`vX)#_U}1nS5pu)oQo!jxRNNRNWl5|;p{iQTU&=g^gWY>;9`o$?NOaH22Y=$In}-v4-5L z=D`&|g3dn(3hW%BX-z5!iqKcl8(P%;Jgx?s@>Z1R*XO#V?)8?;%d?$_e-od>;dpeP zMbI<{dPU94GG>4?dO%<30k5;QCcPRhP$Ryi@FUZ2j;Oj{swpun<};nJp1+8dy=^77 zmXP`kqxfwj`NbMwyJ~g2|JrfQoVQONgFfu13AEU(Dh2R2CXP=@c)BfO5Oyw17uP-g zfNbK+w>qVMr)nWCP5#0GLy-VoRD)7)uq@TjwVlpkzBvaYPm#v~(@6V5arVSCA!gqf z&NSC>(PyA_;Z#TRWHo|B)-oK{Rpws(qsAk!U~EjK$1S_MPddX{NVMriaG#>w{wWty zuBj(aS4e$vYI%~gyZA>PML^iz&FzeYt9nInlGf+GS_$K0n;k?h_o`eG*3$d{bja@k z-VZ&0NDa(ho>*I0>=JXuzQMT?J7o07S!w&IiR_nbm1jtwMKG z<;65Ov+&t%D{a1{rW44&@OasOHGSPMobKpq*v;uyRI$etj zJ_C7@{0L(x;=wbf=anZd;$Dq!y@2M>5xr@pxAE`1^9Tk);YDV4t%#(E%c&`CO3H2M zi-WKaxuSm3e4M{FC&kf^^WCnV54iL+t51 zPbzbh)s&3j`vnEj$R<8T>O|KZJ!lP3ad}*C1Kb^o+5Nn!(9##1YOUlC*X1>Pji?p- zRKvw8Djl)jabBudmc_m8suPsF9#mvnjoEF9cX0Qa47pJ+Q{$)m-~c6nx$0C6iXcbi z+^ksfbObwqtUW^1qz$b9q!`pj8{deFRUGj)JJ6R(Ptg+ldhbXx>^6K?h6 z?ZwAgt$t<5gAUdupoq<&Ozm%-chbmlqfO?Diews2hVU9g%Pdb3rn@qqBv9Bk4%L&+ z>%TSR^=5l8AN2f%uqab0t;R67Q0i369F`)DEZ+ElVhCtM-A+*Q7B`iPcRtF`xsfQv zN5ClVfNd}U6@V{4vDav!;!t>dz+jz2I8i>Svrm#m@E^qMj?CPH0s=11%{TqR>D)QX zi=qo_nxAlTg$jhV0EOf!0*K=ECO@kK<=cS$C!0GsPqV&UM#qW$r7LwO5MAHVzQFTc zk&;P=NRVR3$7ROnR6pvzf@e|TNq{69S!7D~3oBDC!bK^AIl`58B@SU0>7%lT)~kf# zauasQocLk$DgP+W`NE&r_#&QYPM?;lk<{!+Brs{kqE@U)8(;|nG=0m>2(Si8Xad4H zm*W=~Mq+dNY?8gVsGZ!Q&(VYy(7osY_r8 zm@YL*>&b4E_e1;uA*nzs(J}%G$##nB4FQrY5Cs!*nEp^wW&)8=9(Z zsd;N>-5sQ7lId5a0h5W6Uehgf6yYWSPSOn?zqBWVT8%*iD1okSXF$H&>BTVk+oMdA zFYidCb{9ynRqKsrP}c{#^3?$T53t&GgyG{ei+~^h@Bjp>hw~7qS4!gNK|yvZ>eQ1t zxeC!WZwXHUZz*D~ifH4}C)LT1{7+~Ixy2p>V2WYly}w9J3g^hrll4V>ad?yY={s!T z6yM+}foN1vvW`+76L9a_kiLPN!-86__XhXofTW%80P+dzql)fV6$KINKe*iRS+Pp< zP5sat>bs9lM6KktivaLE2=F=w20RIqq_z0&(9+3IUZqNS4Cd` zJjR0mPKm!p@oyE^k$SM*jY)-pZNU()^%-Y)oB&0Zs$+T{1))eGEp|GT9n#C!GeXqg zys_1F`w=YNT`ejx>F?5^L@gWuou?t|1A|%`=%GPSa$!{G13i=oC!53Y)no>+Y)N^7 z!aFkkhOi^DtPhF+P(_fe9sU6=F(j!c{{X6%e?!Y13jMu*0;(_mhL$QPKoxZYRGpD0 zu$K`G-(J{%!M*?ObpJrA|8%-D1avR@6w(`xyfPO)>u^9tFr@w8l0g60WAu35S&m zQCP(7aAOOZ$L9grt^{8(Jt0S9_#A;={xb|;s)_Z?A|Gq^mQ@R9l7$q!Tnc;8M; zjtquWTCr~9@F?i5)nfB7+tgbpJ5OrpXp~vs_*C(6jyfl@?>4ET=zeDXlb{kStN4o< zwzX1^Ud{f2E*)f4qbkegrN|+dv`K%JyPxNH*Bl=6wEPNhAfX8a)^#_hr?>p*C~b$3 zT?myJ0^DFUO!Hl3{=G2aqzpYFtr(MR>E|Xxmb|NXN1!uoU{Mh!Nk~}{Nm|0X#(9Pj}cEvB(r zgx33SRkG`i?oxeIJpHm~IN3p^iu45Sekfnw9FP>VkdbKn@oZ0JD$x?twpUSM-is6v`a$ zYM7pCu-vuRRx5YWn-zYD%Qfbq33+5cy;+B!@5zL9TgxT+={EgcCy<`LY22a?p;g%v zK8z4-!o=tDl0#hy)ZH957S;9g@s@1?W`2lnuOLngBbawE! zr|s%wP49E-x%Z~pyWCzf@mdgUZ+hJa|1;$Styke8bc1j`-=8A3!!Au{uq_lf~W zOR`Qp%V@?8!@|3uFyNXxV+#`#SEKGh@^HQs_aN`f_*7MlIC@F1^>scW+CG@16dp zj0TW|s3}^IdhncJ`Uop6H~Nt`#tj~Kpinb>y1718Z!L{>>w*~9<_YzEaH*|~ z=t3&NqBu~U`W{%@+KKZ63-(=NH{N!=y&MRU>QIyE{~Dx#iYPGzyr%WIc&1zqalpfEPD?8mIjgBigA*C6+mP(BdHS8gHMy^t z%5Na1RB4XbuDWrRiinMbt8c3_lQp7)1=Bl2O8x&VDpHw9{oW;z;^T`ji1^rkYMLxm zj7&c04m7-XTqt~ohLs>8xT_!|c{i*Bs-$8BxtmMXNIE85GKd#W>2_fcyeed%C!Z&x z_&2L<7|wDe8m2>lrpN*jtt}}BtJ1XhEvm4I<(Pp*{CVJGUCA z$Sh!deavfaAKw=LQ^KcZQQjnd#wlT;90WF1e|KP*t_$_I%<1e5eLG3nkkHwl8iU^(f-nv|PME+oY^)P^@d5NY+md zp3Y?-hJGXDOcSrb1sp5u?#Q+TJOp&>kF2i`B?%uwVK2bKLlHD3W{~%S^K4D zuJ3Cf0p9{TnB+)s?G8!lNMT2&n5EHucGPjzdxPwZS2q`Eu7vWmIKF{|efj&94{ATD zMpkg*=H!0gX2S}fV<(JJq=9g%w6>)MleTpi)gI@V1o55uD((AScdQ-MUSkdjGL+b0 z6rPodqJS`u_{=Xqr5b?$3BV)s$MhweC4D#7J7=AZQyYaDWsW}iKs7b^tL!BEU<^y7 zmKBG#g6|tVOGBxxdRw(h$#lEYTou^Qlb-*RY7~sG>B%S;owY4xkgQ!t>T!(^^rILrcIl%aBZE8u|)VS>+ z>ugMYs4$ovNOJI&OyeK2rpGiB?N|ndP{w)#HP{!M_BD=%aY0%=iDK>e%*J zg_97uteEevfWxH{2jKHdc)*c5vc(K+^KPJKX6Lqwv36=myP?tU(s>#S2HJ-9FTy(<4~6?e(PlZqlM+sIJd}&|KUGc499a#&!229qwp4Ku;TEj&_nF}eP&&ufw=i-&KIj^ zjova+^>IUKl09&_|D|&TPO2$iT1`M*G;paVFbX?p=E>1i`h|yE#OkNeoXcr#v((04 zLY2CokUunFI+iJviFVd0RRn&D$D7HPr=>-Ov^__2v>hd^#T=ycj5maO>Cw*}vgB|) zYES0h@2poFt`E-9s_%NFObY4=WbpQ^xZfb=E?mmL!mql}T;}BT>w2Zef*bYM9nzh} z6Nq%(8bG8#bc;I6cZEeRlK09n%))BwaBAl2$D~FvR$K0E9UtFbT^isvL#>4WU1Z2X zkWc;nsMS+AkkK1G2qu4VZ)3f&?Vk(!mlN*=IYsMEbLTO>Yqcdt1C+zUs%ER5A?D38 z-z#|9MNlm6gNVmn-fR6`jx&U4wPFCa)>}wwgws>&2EnRVN^5$3Y%Y_#;X0<8WQObD zIepo;1dth=L_c|`0H&*lsLnTp0|3Q_Db#WR{Dp;|fWI0rv_B&XfpP7d2w4;XLjkl0 zfV7Os|Mm%}0n^bBLF!ud?>7kkjXpEmArZp|4!o1g1d*iHx(V_5fH#j#p)3l9Kc(?T z1<|?>Lz&(H;m?Wd|9|x(_SI;v1{;*13f%i*I{3x><6JMI*0#Q&hEwWaU*yyLVyI*~ zc+;m7k&7{eX)JpV+Fi9>AY)rL)nI<1p!Ol-`V0j3T{Djf^SAg14PG7hQSlT}JSORZ ztT*F*&ysn%i%o&?rw?3$9Q21F0=;U6!MTwXdE^o0oEnG9=MdXLcQ0J5o=DP7<(5-Q z9Z(D}Sg5yNMnA{6gOyQ)IDR-~Wwcf8o&0Ne_JW&X&+W%#zNy3y8@4*~Z9F156H5Bh z0n*o~!%V+vt8HmZn6vU?xmo>jMSqz(H9I+E1p4I!!LV6=MAf2tFkEhkb7+4D%6AS|o*QK7yu#&p5DU5R#8CtGzy!fZ89{NXx)y|)P5OtQvkF)5 z?Y@!PN8_=}kz|)~mGQO}1!4}5LUE~jzY8-N_5bW>lWttq9vH1xqTO*yf1yRA>kmw6 z9yM;bQy_vc_Y9f|XweJ2K zbWGCL!i{$oT;w(0Q7I|ijfk9{z4N#33fcwgW`Gu0$6lHo?X?E}#_#pcV)eRL z*;b>uTxlY#x#UJ7hTvyf9rMY?@2B=ZU)I!i#Vra}j|Vhey;_bgu8HMAPF%M7^6XqAs})Z88~PTbSlMxA`&A^S z8^$U)8gOi0$HUVo{HI7#kj}?9QKos0BVg;lUa}EM4p$m+0U7(vXvC$xwxvCDoqKEc z=JV7+5OvASNW0HIPx%C+BipYG$C-L4Q=T7sKIcGl?#y_l=5n1q?U%^Aw}r3*aWN;* zn;KcOoYGC(YWVIdKP>0xIiKzH`Rdw-V!Y931onjLfLx^nKiuQMM#v~FN2VBhs!sse zeYISnr8c!*gL|2F$f$8+NVTjN#v37^k4-Y3+xR)#(IAof!TUUowprw9O*N>WL&eb* zvLV6psjB0xTV1ldmF|`iUG=$W>O$_?aznNZq_&TsE!8oq0oi1L|~NLiD8S7Jyg6(OdwC&m&6W6!=53ehHHnPlJhJ^Pk*m{F2#CfmfA&-3>A{+{JL ze?8|s=l6%xaZc|2e&5&ix?W2Pm`CQ<=2K~1n71{hC5c+xjaewnVUQGE-oKl74gD50 z13S?`!WTk(&>(QP+j4v`Qn3tYvN*88KL;rbGH$aNOqz^%YBrUaMCLE?U zBum#bhj@nq9TdMRyofwU$e>zgOUT!S(=4GpiLshpU(vDU@0WfY=*Mt)d50?Dse{%VVS92mM%09q~CrG(p!GuHd`so;{V!_GL-q1+%OW@we7sGK)IC| zza=Vzd?7RCx-VbywiQ!Y3qB;iqJcytBzfpT+{}fN_8Jqt+ttYFj(xStM?u}Cdc*AU zJp)&RuIiygmBE-V=BvTB#$9B=tC}f;Hl9tICF&r_(W*G7a{GwdBNR%d= zm!s`y2pc3=nbI!Qn@5FbIk_O< zgdLL6LGr*40T#9vmuthtkW_S!D^5r=FmVT3FJ*e-9HE`LU9 zuO#NZDew9MH&n=Cq)H3SMGKtpEI8q)63p>WZSuwDgAr_DZ1QHOCpNl1 zvbwMEn04XRU&)^m2+>a@!De|-?56;E*n1M#Xy;1g_M3M%DlyQC;V+r(DVO_!p@ZwF zCmcXp9h<~N07BkBJlO@mvDuz@5=^^Fj%7Qsk@fM%oD>gJ>(FH5Po09R>J0@bkJC8|_q^)4m(_--V(pOs_BBR9R2a5l!b&BzuinR-?Hd21+vxHGECk`&A?_oYC=_26b zIRdK7jtye$e@>0?@2MSPTjPT-MjW`{596eN)J9uR$s{J!o)uc8p9udgAG+2Lo{(3| zOjjtD;rN1oiQdH_e+vOH3%WL3Yox7s-ARsy;!2J+(p|AxV%>eMChk@y?eM_mUl06C z@)r2ndQc2xE+=rXyogr7$@1gC;0DgmC{*yd#ljx8olO({lm7dw*KyU7oStVROGdD-JpA z@q`0}7u>k`|D4^Qd;qt1<3GTg2(ZpKl$MjE%0Rzof_A)HW^E}30+oPBVyVZ04XK7D zDUMJRVYjpd8aTZ%HryZISjc=XX{0v=dQ#v~F{>Bsk3L;gKDU9*-$8nKhZkKtB2^#y zh5EQA2DbCklm&=#SxldQI3UVxGs0WZw%7lb@n1K-OK6IdQc?(3h`Yp$mDTn#$9ypbclFS0(_6WtXG2P)irHe~dD+~0|Va$-DIn|8_BDkN%WDEwj1?x2+OxrA#F z850jx@j?LH$;6TVej%A8et5x^if6`UjH7-gEWEZOwPu-GzWV))}s=pL_! z2ld{G&=KrBzD<%KIK?-)IFun>O?e|*zh};liQPcX+RTf4@=$3%+e0hiW!um(3^)N^ zH{BabN-2xI3bkwx0j~H!ZskGx1V7WKmi70cTIMI8TG)_{-NBmCR`{Q}iVT)+WgF<_L_4V_WR~l`8BcR;0VF|L=X76U>PEg%*h=6wt>L-W2<^v${^Mu*(*vnGfC&bFf=n*t@^xE>?Pe`aWmfGf-3b*w^Qr<%stvQybH3 zXdY}uxqFANwJV=-4&!?0caT+!pBI!{>42V%n8Q+r{B-@h;E`AJQf@|_X& znAg!47w6`GQmyR*kF%8-*Sc)$JSS731voeCM!a)xA_sfQzpd2|KJtYy$*1{az)Hu3 zLWp;vnXTX(Gggsrwl>YZuldf8egrMa#5wsCnCGzmHOTLOAkHBXE%F5BZbl;;Jo!~a zV&u{Fw%)535$K*!u$0A$!<5}U8_-rcSYYZF>kCcr`~d~yC>1!wX3+ z7)zdU&+&;*#oCQbj2D9G#AW2*Jusbcv1+OJDS80+Pc`D0Kv1$&M!|J6_>b6hgq+6U z=Rw9%1SQspAcHjR(eC_H;a;4+j^|?1Rny|lE3}r!S4k!W_e#Q50WRxlcST8t?@*~M zn7_WBRB3dP#-jt_y*?^P5bDy~|9Hs=(GnY%WxK=(TEz#_=a%LbJDdE@FWlhNvrEx& zr1II8oN9H*j|`T;`^EbhyLL@W7Iqv+JMo)JG&U-vwyad8Kv;0;3lHn!h%MhQ4nIROOYu8@$RICJNNTLUC;A|Fh`14{6Zd*bFB^` zQGyrojKX+_o2%IBJ*g`< zQ`qK3IsWbxqnrpQ`&-@p1f_TG4qjyArX0~*;Om>z20DvDZ5EU< z8Xf1RxOLOmP-;tWmDzh&tyZ{vXFHckTgrZvHff0jAtodI6y%UW<($eAVo6x(B#Prs z87AgBn&#F6526J&c4Jw*E5_X+Rzqz*-se%x}BxkQ0Vkw)o)2kJb$^rFV}t-)p>{ zD}z3Jo9i8F{4B1UP*b86xjYnNQDw07v(vP$G1h_V9TMkA5h{!mcA^5D=m``RF`Yjt zqSMTPBW5Y<%F363gceV@0eMh}893XVaaNlkW-qB5?w|c2Hy=ycAVI_Pq@I5pM>R8; zCBz*pY%Ez%a4cewd%|h+Azz0Ea)AB>I!g@y2KmaUVx0yo0FiH+t$op-c89)?JHu|_ zOq1Vg0uBOHh~D`uRYu7yL@t}L%{+zr=E^j>(;%Y72(dC(5tHIWePP4{>Pc_Xj$^tl^U+fNoA4?EBtq38ZI|T&B*`~V6<}1)` zE#K>L-|aBe$tya7V|pAtCZ|W{mF612 znw<24z4PNS=b1vVt{1|A+1t*b1{*lO9cD9Nd6 zW7hlOMD7*Co2xwn9hq>Cv+Zx00c^i=g9JM*vEIcu+!Qm zA!>3$u6XZe{W*NT7?D&r67Y9~%z4U_RH6)`Wo3)i#A2p$JU8%+ZE0qdhs-Z` z$6LTN9obBvBu5QdkpF>LjA{X*CpJdgQI-jr#!&Qbdf%w>vF11|ioQ%`scBjDe7T9- zt`YKLKxVp>`O=!zc)9tuf!VFI6uV#JOlV-a zYRdwJb1k0#*ByosBCuXl4|2WNV67hiD&3V@(AN^CXSZ4&==B}+BS=5e zrI1+op5zE%GhGQG_#9w5(9DZOiw1z3lR8{A&1bJ90LpV-XCMP8hRm zPsr$oV3v);mPM09ys=dH2w(QjvYdY|DmJV7W)3xM@M;05b(`Da~ft;|$M@Q_nuWa;u%|80o3ndVQ@7sL8J1>q7 znGV%*g@@*|4nk1!BH^CtJ~Xu8RrE%(8RYBWZ6iP0G$A}6+fkP$@`xFUP(z(+Iq+9e zkBFg3r5e_sbNN>a`p_*X>dyi@BiYZ!Hfxc92s^w2#xADShK4+q7Mi z1zgGJ$5GlYD}&Qt-1H6STx059(vg}Z^4k7JYdD4V@la7>HriXCjzk9w6Q-i0%QfVm z)uy|QsP(%G-1%9(f5Hb8RcNT3A2Yj-GSoaPQ<=y zHTtY`L&0267FW&fhkX^{0O={!p-NB4zpEoeKTo10rYaC_Eb%*MEL=`AD)Rkga@AvX zIgk?Wj|}MFTVyc#lA5tJJ*UEx^-kiQp-=`K{ifA5Sr8fB;j%I>#PplhWy62XNZ||N z!t57n#_yCEb6kcBB@N9*DF*6+h#B?|I1Skz_X_i z?SI#gkRo{!ezxf@4$k2cfQj4^ZN2f8)2n?AYRY5b$C&kqPRmh6mHQAafk$s16BtQ` z;3MShOjtjNS8J-hy4bP7TMT@02ibaPXwB4^Tw71dQ9)QY+8#BN#CJ~*t=#gza}tI= zCbIQyL1TBXs0veY3$CHL!RtgrdO#S;kE?o}99wPlk?T?!_0-@Hdt9%Jxw(oc)p61X zDoP!pccO*sMj(!2XF3b8iPyHI@zLE&GK5vNnJ6jINw;c=jTU@#SQRt7u@!F)R>e~!t@e!p{}bPHN%K2);$E_-6KF()Nj!o)%YVkA@Y z2Um-1x5Vc6H#vvRV;WUeW$yiG`PEyf^{ELgck_I-(+Tl7i2;@sl=>O|XXU59A@m;j zDnnLT7MNzKC`VhJ5#eNzrqmVK9N1|t_f#ostT)3t2Ivb!?{%K#@qSZJ<%AKy2eYAQ z2#e8OnhbYl6#A;>85ru&(AV4VvivevYN%nLYg-FD;t6qSjn$H#2)?}ZYtE!L@YDJM z%MH<_0rMC2$f?=f;z9lz+DEjM(DWe`AF&X3hoIb9Gh-_N9G)LoU3Tatam;hpSkw4YEy>>jS{daSmm1!H>!~mYdEG{op{RU@w%lOqCggBf z86Y=tf(jvVYSeGmVtg0@scOZ|Dg40qHNEO;Xm1q%d6`0HEpn80daqIn?Dc_g2@$!P^0+YsE0HP(_=8)z3pWMeN| znIrSAd=_==QC<@lkW3`56V!X|knYTsZld&xzFW>dR4hGjX)^j&Z~J;`CN#}(tyTvz zee#+NMK<0hR(^6mDsK!bb~y^amDU?5Z(M6HEAo|7`|<$A_Su6r+PQzpYnBAlW!Yo| zun;?>Y&L}8-ee`CJWD#0eFV(P5-KLYN znQmiay4m%>mS}`crXuFwohIFN;|T9}oc6T-+b>z~1e1OF1i~kmu(~#%|FP&TbA%#d zb^@!I_d$cxO2Oh_tp36Flcq4v`{rDgr@m0_L zqM=QT!;{r_613bKAgTtqO_-_9ea!1rpupP}fYdBl&7{nQ>M^^fT9~9jmtTs+K=Uga zk4~)@7FEGR@UtZ2<$X}B#cpB01RjI!F=waMmjAh(n&g?V7SVf)^rM($2~q}&78Yyc zs$}&)(yQNG^pqm$J-A`F8uWqX&l-x>0lA$Q!S>>>Cz`EZJjJ{n*t-o-}DquY{ECkY z&?P8dzy5<&U+MzfvY!fZ(f73T6DZj|GL5rU_qQ2|uO5Avc>!ThDLzUWw#Tuj+zyWw zyx2e#!Wo0E<+kgh?hRPlICkSOd4RK%?J!hRe(x6qBB+L`Tea*%_t=&W2z1MoYq}_UU7O%M+g$qsYNmtKq)34hny-Zs`pJd=a+--w!xY0C#rWY z%Wk7>2`h;a{uffuUwE8iy1m=We~32!uk~nION|K5w+C}>-ZOILY`zRTKVK%lVLFsX`7&nohwiBj^#QkDRzbZ=x-kJvqgX*lmU?E1`%@r!DbZj z-cR)e{AhGA71HQ7-lEe+9yWb0#Qpl8fz+Di$nP}^dr&7H{s4CE{kqdE9gJ| zgd_%49%~@u%?PlLL{YQp!ehMy`^cZ7KT||AsGF@J_J_dCJj2%E_y$t)9s$!CTQ$Tm z;C7wwMMKhMKIbgwN4Mpc*%}iFzhPE;b0BepndpQ8`UWZBN_g_`0r?Uv+DFbWl84op zUq~%YyLsQNR~|YaRC3u)POgL>0(&!w_dOU2VgsyY3cw9JCa9Am^GW%qS2SbCR*85G z%hx)K=_H?@Seo9j8h6*5??G2Phz}1)D$#&HUKVJsgkL|s9YAHRjWPj^uhTye@vT)1 zABp`h=d0rRZk8&&DeaPh*%~Yhk}ST?L#A0Qd?pM%GZf+mf+;V$ZfjGmvl2tv=Qxu+MU0g4?Wju{ zoLsL8o9PF7!t>S%uwECD24btNn2G+zIvwenisBJ1fJpAu&uE-oSu`iUYiya=+IGBj zrC>?XF6_JgD9s5Hv1NpxhZ7Dm-i@rhdf!k#Vf*NyOr&RADi1F4?KmsC=6nVQZ7B?b+y7|ZR!&$;kE{3?aEb7Cwp z_&_lrYzC|7b_Ki<+q1`Jz+9gzS#;E$B!>`KsL^`nW&PSr>B7OAwt9xJO73BQj-8C% z1b2&9#!;;+YrhpU->NX z)BSJ$7ts9XB38s>NeFC^tTn#5$)a7VJGbWNz1Vcu#^}K>R6S>`T=zdr|L**tDQm(>0k8P1_T@B(1dvEw|Oe3BTUU*cS zcyKwJ%b(Zq{I-K|%9(Rax!D8^9mhx^qk#ypn2kE9=f7(w5KDf zaEiCgqeqgf=(+h`+lyl;|HmJGWltTvw$Hrm8Gm_>)6dVt=xT~VM*?Nr&!)$oN z;IO3YM9{DF;ah^Sb@~ND#{jA9Lh7rCc5U5oRglM_T~*t@!-;I|!Mo;hRmI;9w|0m! zAQ3?$p#El)g4U0FPjxF#bOqfeBshoMz1}>n&<9vj>V4$}ueaZ)$9&fsEm~d038+u^ zZdv0-*j=<)9*sW_^1gj44Pe!?mW&Q<)be`pj=JSnPk`@l*AX%o%9v0Z!lI$hza&1j zBMf?{r3W(LJe6S{rSuh|D&n*iZ<#GlK9CuawcWN_-EFb;+-Gv_A^YZdc*b@j!#DM$_ zvc!azxK?_B>s-fZ@(o$)mY( zuYIZQ%7trGf#Eb1DnfMRGsvHvSV1sannPJR<`*vX`a^-6MnO}}IhOm}xoL9gp){s% zwH?ENGvg{|j%_(V0cA*#IELe=a;*~c-loc5%2UavF__jY3_Q2yculZwYZ%^+4ii)! zCyRn9Q|n`iFnz6U;p56c#b`-qsip5m1gEooEJNik(Zk%!$Z3AOhed}&1m^siBQ z=Y|y@Yogc)$x$t0-(AUKU*k4hf=^kiS zNQR$5vtr`*Hhf@xYwS+Yb(TzMZbkprC`7TFo- zwi4uf5WwF4i#0I|C|fF9^M<*l%2&e`lT>-Qeq5(e;ZN^Z{2n|Qa$e(p5y>>(V5)i% zX7;72Hl<%+zjLJOeWqDtzeJGdq+q}~NKmpKik4u9bxN4WTEsr7B`8%mA>4{gUC(j) zrCsBNdR>*_cyMmnDk36ASaCro)B6WGVVQ3*{(kbAjLgS8$(IdLSK7bV&^JZ_VtdkpV>9!CJrRaQ(-1q3 ztqFR$0jTR^Wly4q4Xw;JKjx>#K%VVv*j^^EVG$tI#Je1r-;~bj39MGYs0&t8Zp0&GpZm$R2vr3E~9@p~`Sdfc0SC1ap=4Q!dNqW1SIt0`=t@x~N!LtPY;xgi=IZ2K{ zc_+rY*J3WpYO1IY=OKRx5&a{zT9i21I6>uRf_s@ZNlb01NLi+Yv0yW$D-LvcacxYH zBhcZ^d?EJ%#)(WV&c+%xy`QsXGI*?6-q!r)({rCRMLx?|;m5-;lb00xK^%W4u(EN% zs*^tR$2A1=YIpnBF;U|O51w4hrM_nlfk4Pk;-@+rU2vj4Biv8tWa>+8pZdZdxppa6 zDvZNK`gu{MT`6?lsT0DdG)42%87khf@K_C{Up-m=sB#S3T$6OYVxeGx?kn1newc3L z9mke-rA0>w3sFm!Wr6tqQYmy&nA1}SYM3K%>%|9-UKL8v4B@o(?z@>d)l9grCG%k; z7riGg7=kT-`T+Vp{o3X{J~v*zx;q0O2}?R9A`zi&@==iecF0T2yYU0c4iKR?3O zDe&=d>EWGusd!Op<6eIUG5^H`Ck@`ej-cm`PC_6G8`8Vy_7L)~>2*V-Jj+cyK9`$`F`AE1-gc;u1qy@u}?9~Wp#*QabUc!;4q5sdwTLq&v_7Pb9DRp`>^q^D0qlc z#)_uv?W*~Mc%#ePq6=4*q0c%+CqzOOHzd0o3};A}%bYi^gjF+KE~6^&quLd<@Y%8frM8=FbxNR`Dr}f1p$+Rkp07j z(7r@*e1t71-8zN1*R77*9g2`~i(6^u!Ph%k#-LNx>|PpN#SBTAn?^f&iouSPM}%0% zE$)xnrQS;sK)j`B?s>=`3zXG&E!m1V)dEE>#@gY8SnZFVdV`Am zoyC|Cz19U}Hhgxi`)FvXKy0b-qk6BakN5E`MB<~n^qVd&mEk}j72iAI_*)(>lj;F(9)MKOgb6x3ZFMW4?~W`uyGJ%D0@5rH*V~{ea5hDeL(u zzN5mX#C>#bt&Vo`p2g34Vj>Pu7Uh#;{{90g%EgfG2fYR(yFv>BykoCnW_#|>_Vl)q zUY?1~*nK*gkl2mPFU%Fzy=j_`{O==j$Y4235(p;;{fl7EyB*#3 z_vHH4T$%3upcTz^4Ao5gpSuVF#yg=0%?+o1|-WgdM za7qk;=T)i*EVK*?bN_C2 zYqYX&+@MhEBkPrj1Y8+1DjFcqbHNo(enN3R#d(+SH#Nr3UQDcCy(%Z1Tm}geJvK%O z15?T-(@(C!Je-GGHm@qPmkc>Ya%>h<994w>zObuV`imPRT|QPt;)&_TYHzCFB*vK} zEB4nLDoNz#O5~>ZK=x1h%3A}MD1VO3!IyVpn-JIy0q@Ssi0AqC)|QX_%`YaD$kPn+ zpZ6n!F_i{hdvgm{qyhi1@N{}QQ|ZdXUWLk>mnlX1jG>>s40~v&Tc!cU%K`Kp=ZGJA zY?UJ(;wOC%JqDkB8Dtx%P`LGCnbb>lKJa<_!3Y?eCQMZ}N$oC(uCuS=BgiT!xy9;=xyV>^q{Csi#Ktyx?2JwCB1wf7$N7HRfeGHI;oO=M1lqemPyfwn7&+ex2NL5wq)lTZZ8(_4pbt7gEdjj&i z1Q2&eKUB4RnUt|5@PDhg%EMiuZ?1U_YVV=X%pX>Zr(Jf6BgqnYN4f-|oYTH@C@=Oz zF-t2y{?e;nJkuB9a)U1= zdOxS>2QCZBhnRmL4MJ~^4Sc6hu!muC8fG7a_;1t%us zXo*=^XJK&bToEosBd+I^YQ1!MVf+c7m5M1<`11hubJn{z_|l}-CEbFj0o(729xToe z*vI`@DQv$XRba$cwKjncfM`LVa_|^E?@c+IHXLL z3JY!bC}6$t%GxA%4ZG5Z>q-Y%HOgFOrtBDJgMOy&FZYwK@$|0Ph8-)C_zBwKsK&yJJynJ^Gtpt0G?;ssg3ZNU!2DXtuRPh&>1a*KaKsr=`ba9b!dln$j+f-5)5T z|47ls@muICEV0R`1a+->ygJDJAIP1rY29m={nc;XA4@q?5Gxv`sWwWhiN(xz_J-io zpCSt8XEBzB>ivvu^#+F}{0Sxe;qu{{Fd#t%(g#OS=Rxt}vHQk|u0e#`PsJk^uu*=Z+qq?R7 z^$LO?I1sh5vS*0N_hvM1xoyoE={hi0nTW~oj16YeLKs6S`c*Zr$nP1mL#lu_kAr%@ zb*|K1`taHA2j@dOmA)R&y8uf)3sN5P&%bTXlXR6-f5kHJanLsodK>wSEj3@)b{)9= zO3$R_bm)dqB|3UkN&y>Rt59f*+v#f=!`8kwKKla;PiQ z!2%#QfGmPE+r5j_sfmsFYsg7rU0%+-DoCqCtFavD_856+RzF5!z-pRwXUJ?;&F8$b ze0hZ_RsOQ@{wh6W5d__AgS$EGVyjO;#3;*is{8P~v_FD;7rJ@GwoIFhGWNlzV+Dra zeO|C#_%)62c2Jz)vDcToxlrlVd5MlzI|CAA_&`f@^dmt#La~gMXL`x{*id@f;$fuJ z$1|{k-~b~6bB~$2Iv`zP^{B@)>J(u7&>{!FlpkX&4_)hS5pD;w|4$GyU&#h~RyO)|vhd#YLBT2tF#jaUXLW^v^wSbk5@S5rnFb5q+v>|nK4^VtpDO#-9JQd; z7n#uf(#K^*-_#;j6TS>9KUZ19xJDBf%P>Um6?lw~jbKP6rky^f0Kyvi@jle4g&P~H zrKepP-Srr3dGJ45UeJ)lJ6TkprP7>Z*`^}^P)3i z5$#4yZ$frWiB3W>z!ruc2%_4)xAwFYpX8$$Lh#2cn*rt(3RmGH9*15ZAC`)Rhvu}# zgnoc}rs?$YXfuU$v=cH-N%vbWtdZZ}1$vMJ#AYSd*t!eD5ZTih2!fufS2K$h3T5o> zUsqN(*Opt|)e&rcDBiO}2jJC}mg4s=X}toQIb!kOj?4Sn!_((gdIBx{0A3{k<`*jj zA##{+2$7HLbk;9G18F;Sb-E#WI?9hS1CI zC|K7&+g{DSr12|B;C>RH%kM&gUeRhuK!Jbj7Ui;=E|#{lzN(D(ff<=+{5SN~ih~3< z`yvS%r6QgX%0$sebR~1rCba%?BQTTC0g?>1WIKO$=iwwu4S0g%5iGEXN~`{c})HeN}V0K%w%Bn#Ir#JFe5yfngpXr9`5laO%9AL>G% ze4Alwgr~=(Xi#%Je+6M7}jmra@6@jq1&JD_EN zK8m)Obe$L?nDeelggi}<6-~NZW%S~?WFyf8I&At$eH8@*<2lM6_?{9m8gOz>Z^mI( z+oIoXf_O(h^V0?Zd^)%0aj_2QP!II=o$Wa9Tr)yKu)c5a$97}_`_yruim`)iSdmERgVyNd1G%oF{K*{&FFnnZ2S1l+pXt`Ow z^YDtzsm--zl^4bNy1V=a4_Q4va)-?Y%B>{`y#)l%7mrSIf<^i@oR5MM48F1V&BWZN z&@?#<2v*t0ew|iM2jbBRWs<|YouERr2>GsTq`dA@Rw` z^(mREUpv`9)?6*mxs%};RqouvsI4{)0x%)~E%P*n1?2*|4gwKvBg+?k`|#A?+uy8< zWmBIKtfQt#OqZ`94_;)wp?WH8vUF%_Voo*kO$Ur*6iy4$@YaE!!M!{198Ne3$;HKo zvCCFsh6n5M`z!qBZv)kK^Cxr%q8vMzYQMxLy@JjaNjGuxrU`6gmGWIa!&_22Z9iT{ zB$*0aqWql=TB%N~Q(`INQA2!p0Io@fA38JM_af3m4Z`USd3K`Z=Sz{?v}b zhRd^|Z{g$Sk#7z;e!L9Vr@aN1lF#p3l@&%}Ta+fM83OB2_sa~SG6H6Svto%Av#GIE zfh_Qk&;Nh)KmRX(ORWZ-rkyNW#y>tGX2;q>7lf`IUv&{JGnDXde=O zSjleo;#_=OZ%jH&lx}{D7<%KldsEiyyq)Jk-%;FYwALkb>OYWYfMw8tNP7N8(qzhg zb5lP%OUtI|lSbe8z{j*Y@fUX@+DOL8-WMouYz{Nqx*sR`!jy8^z&S&&?T>8X^cBM4 zXSsprBJ5w8Kd|%qn*)p+00ozaxCN%9OoI*z%I8H4*~k5j*@PKpQreON{Yd^HQTdhV z1cg>X=YUVu7xP^m3YYYdTl_7q+Lr;rt9}KpW!aZ9PYuU!{}Uy0lCNR&j-)fTpXg=8U@dtza*+GSuI0d< zj!I8Zpk3=tVDSV_I;zzrgc}(rl)yWc*iv0&J!cv7BwW&ePE1cuG><(Yw?b88%5-+4 zCm4!|&!#S&`}sk$dg0UA_jxM?7S})G&Y7rErVc>@n0wHnT9QE9p?UY=sKb}K%2tOg z*1;bNZlUzcYnt-;z-brJ2IoLpV`bi;k>N&sfkqUfk#TUv0x(KwvJ*n)9tX}$or*9} zEQF1o7APW)EK-~NaPo2Z`09KoI~ODCds&?`De8Fv+0!SlP19K|^nhkzsMpme2U*B7a6g7&G;7^UrvlcyqB6T2N_tWBr@{Bo`htZm@ zr~FN(E=MzEws5-Nn!hMvSlP`DoV01L+RuWITKV1%L4MK;2fP};B-Q&1VFQZ~o^K9baVA-GV(tw(b=`^XHGnlrsZl_80;8a5@1>sMW7 z%q^779>PS2ekcjVKPslBauNu%@IO`|aS^z}G~j;a$Rul(nawgc_AA=29#&q4=E)^~ zm{C1Ie<*rO{k~O2!wHwnzC=Wu=Y^bq8aDUyTFkbsB18^CZ3f|{e2aEGNkZK(|E;Aq zwO0na-_%s$rdZz87<=ngszdBG>aQ@S1t#X@OOzYg{|kNqaja;X96tpZD~zon*NN(k z9>nr}tNb)%Yv;oh5J8jktwMJrg=l#iYv|HIU&wDOb z9(s8$#wd;DE&f1Yw)OI~9L~Zviynt`%=IL$o#Y?u54)PG0}NaC+x489RVSX|t6J5? z;5)CZy*Y^6%e=W0yG? zkQ6aUb0gx1#90mZ5nDBj<{3%CU9-lq7Jg*eGApgV`JWz=;^n z9me#kbJFG?$bQMX(CpyK&qDl8`;2eE!f5l>kFh%El^=i|6V_P&*PA%gCElYY2Hhqw zees?Qs<{=Sc1(G29kj}5l=h^BMROj07Q_A6B_~jV-Mk0aznWJ?v0Xigx`Xd(k;gMt zzO{bX>!!JS%`Q_<>Rm=go5~thx%|9p`#NAlQQ+GF<4-vGuU!G))IR_O`-4^n62}xE zg*a^?+ASI~ngYs8JYUvOL($e&X zo*qRkbA`#a2old|ir=q`a$PSM{C$T`{fQL&GpdtKYW`)fpszuKr#^>God;>t`;3$; zOcnkg7Y$vXTU|nZALf?qd*=@$3D7!=j;MeXk|Ec<#;1zTgJ^?KNSZ=y`ly>`#qcBCF~9k z3hA)HnjUcj_d-Tc&%~iWfEt`1nHpkW#$e7{-SOMcPk+F*K=|fp?8V#4OxHRt^{wL2 z7elp*(DES0kRph{)n-_*u6({T$kjJ1RjTvH%g<`;(j*N76ORD978r;`$U>%*qfR{- zDeX_o!5!fEZ#}7@hY#tT%d7;b@;J1j=^MoHto-{m0h1~IeNEF-jx$MKxl8sh?tk95 zqn#Ct$WM59=Luiup@rPSh!fjcu|xy2Z=0*3>ITM zj+JRUW=V4vku?>kB_Z>j0a?-UP|dG#q<&!0-Pjefcg0nR$Oo`)4)|L*^}g$t-wGmH zQQB&y98p+JWBKY_{W*OT^<{d<7Pz6b2b~0(lJ`hiShQhlUOz&X-sF*6!azwKV`u8A zzs8APuzg_y%9uYaz00ai!b^JsoG$MP8_}(3@##MhW|U&lZ`QxHSpjZMyN034jrt#R znN%-^s;QkWCIt8#e8sndAlRv!)wyfUP^S2k=In60$N*c)V$2^PbMw2C6!aOqu)Z?~ z4urid7AVdr>Y|6BX|??>W~*&V@M*Z}P^FS&?!? zdUE{)2F;wHL*&8hRr8#_izANBM9v4$&`C`|MU)%id46&wWZEhns|L$KsvVQ=wb zw}XotSL!)4_Ipe3UM<@}^Vaepo073aRqPwz5o}iE3*PEq)`>Tl=I*=1m-IqEmw)7s zNHLu#`WdRNTXgFD3M#RurmPz<+(q;wAb_#_{*h(AlRuL4%BcR<1drIO+}ylHNU3a? zp!ke*i!{<*#m9Ov%fis@sz&Js^qI%NwdLeh9nn-B!EQqBGHt8|oIvvr1U@SJ{AXWl% zDW$tqN~EP@R2rnaOHx7x0YORuX$GVlq`PbAP#R{4VSr&g%m3c{I~U(`o^!P?c(_}$ z)|xdl@9+J+F(#sh@&PvLG`-BEKby+;pLy~qNJ8UC#w?Fp6*kw!$N5fRHlD3@msC1_=o zpDKX%gV?bnZ4YOqUCa02{9g-(Y>Lc=e7>!(h&^LVtpefwuoa9J^2O5LMZU?N81)3}3vC_oElWkh z1_qF9D{xLg{exV$-vGMGxv;I!n4+S0{>?*a~icF z7wfsW%7hMc$TB|9rhp(hUt0f9&WPqall+1@EeseQ^xgub}UdTPZ0xV~af z55g{)JH*Q}wjiYDLC?l@BKe-suEEuFl#s^c^V1i|MtzB{hdMZPeL&q0Gs+FkSB{ZF z^5>QNgq;j*WsEQM+$|Lf0|-oN77Kb%FR3ns*Jr9n^62Zvi22^BK^xS&=_3Uv_Y)Ej z$ORBmfC0FXI6u}cSv!~L8PC71)tKFR*4y}G@Vf8wkM5E#=>*0oM)xs=5Yozjf{|gv zS&*I;mYG_fFV{ELSd-EyK^3g~L-s425O5`kWabQfV7I|%zTX|hGI>->pMD_QgZfH5 zYRda{#+&$TZEdpx-;WS<1^?O_ekkhR+3fs;0rC{v&%`#%Df_slVcN;2E^OFLnW4Oey(PX&;s9LLkxSxriZVf#n7>R- zYZ9K_+frs5-WhIOOPP03IZQU6xfTN&liKL{tKBP>;cA}2zj~`oDE3OeB&d-|NHtm1 z2D}N}2=qds97@aIVpV^;vo&T#8fGSUp2NPkzist?HBH|`O*3~vBl__UXM%)jTc6{4 zG*|Xh7^8SDX_4(enbCkcFxoGEG--{QVo#LfQYDQfO9-lQw)wM=W#JMY9e1zgF9Jpu#i~8zs?T>p~OOwM(R@VUNr4o#U)dX8I+Gx+p z(wGI?o2z*^iby!F+nKnkU>d$S`6V^ZpYA7wXo2e|6n*Co@0P9ZFoOe>i|oW6JNU#< zItcqLeN)X->XadweUsEbs&offy;H|x+OW$r0P6V&;3+Jg9C~gtn+Ew;cTF6z!KhGc z^1ZFPiCXl6cmXPIY)DyTF}9r4AtTR5+tC4@sqMyCAw00sX#Zkc{WJn+chLb>Z#o@- zaLkc+jYGl4bSr?Ha7NWGX993%_phF5AiY}Jf80I1KoyKFzHPWB)NH=^K#*i$ebnxe zl%4CE{SX%jN{=*09%C@J!Dvc=4|ZxT*<9=W7HqSFACrEtY0?!kdd4WK zBfZU>TCduoog9K+f!rq!s{GEZbt&tPWfPTehq7}S^ThWACGW{I5drtEd9(fUa=abE zt%((b7zS`5lF{_*sKoW%3jIBY=kDw!%?dV2`LAU{-EfX$F?-mh89-mb6$s1{q*#%& z;5dxK2Imd5g{Mfg-0g8K(WZr`OFl33XSvI*R9qR>I0^}I2`(-cW}~?;0YT_sUnG6U z#ICW~u;@kIoSiRC)<-CnflhwhW)zpW49}YL;j#&Ee^&o>dtLz1BvH}KC~ZV)F1&Vb z@tmlqrm2A#58B-pL|F+uzNxCo)0uR=|Z^z)K2#F zqsqX!IBxdM4sI>%;mx-odV6LH>Bnyz^2|)S0_>9(1EhDfK&S+z6LXk8dn6iX+$Kj^sf^+a)n zpE;wI19}tYSJg#l`>Xv#)qgaipJ>^>7a`!HRf_iOcv+$&{bXwkui#~(XVZ>qnCw|GC#wd}a;0{QkcShO2oWL!c}6LYmDe9yWvJX6k4D5xU) zA%ljldw30nG8e8~dM?R}K9mvi%SuQ6+!e2AK}V{}cW*1xlc%5PWEZGVnX13KV=@mx z*6o5o-WKIP+!I5Sn$d&tej*MPJDp#TVp+>%{`xni^FeS}MqzinyT+_A-;2SOJt9{-Ua^Q2LVO$IvXVXtwtg?HwXP7VHtBI4PAEfN__ zn{2!n#XoViaj>F)cIO>84VNp(TS{5BYqDi?owL4p7ZB_O2=HZ{cWYe5kx7tfZ23}| zsYsJ4u!hJcp^*rB6Xa^VMtiQk-@CWAIuc)7ZPX(`pklpuVKT09-eU}_U5N{Y-5Ff* zXJ!!7nVL|m!ewPI{ZUoRB)BMXX=J=SUTAX8&xT|8rt!2jx|;99${0$D$M!v0)KBHs zX96H^E;<<>++5lXS)%=n?^#HbpYb-quH-p7^|fgvDnRY0_B3#1_pZqM@k8VkcVH1f z#OsZ>P6N8LXkIPQ=?0eG zDCAuXYtqa=7lt9ZvxO_q1jNgAp@QcE95%1p$pOE{6ou4u;%Myo)-(EVycTw^-i1*z zxsEyrts5MyZvYVrr>a1+je+VlXU@Y00?QMX6Um&EAWJQ9@%DFtQRV4rV7>Ub7q)N= zL8f&BU(sYc_p?(!uJSsv8^G8d=}YiB;PFWj;Cf>i;seSHNg5#?_x+vJ3V{q@B}OEYfn-wigO5iSht^Y5ejGQcJ!DEJyUmp3tEGCaFYfC;2s zR?b%4LAxE@x*^ik+K}Yvq+Y{qx*y$+njms?lf2-1WMRAF&|5mKV1 zEgMn|QFpk*FQ4#mspMN|2Z*#As>zKI@a@IK%4%yUn{}^U)x18@|hh;f|RPvHlTX}jx_9TjDHk>g3X_sLbKMn2Ur_U5DdneAGKq@}Q2>$lhScF#_ z9L2;6xZC};E3I zH=i)CGEzDwJ+mlGK->NP=^P06jF0lHWR|CytrBc^P=qzt)E8S*xWSr|!~@Vp{2gr6@dECFjMLuA6t zA>}{u!#GCS4=3++Gu@x5@wKwGnC9cCv7@xiO(KMXi$?5#H-tw0n%if@+LZ*hJ{Ntj zHrwt~()>qOaoGitBj6*|_j710(wP5yM(s`O?AM|f@vMtZ0!qaV4~aV{G&VGGr?Ge?0VH1TCFcs^rq2WZ6|JAnNa3kztH1c}`Pz7jJ~@%PrsP!OD2 zxm%|8RrJ@FveOrLq6Sr;DRnCO@_hbe13J+Fzd!+Uz>Rja6$D89A2;X)T)gRgMdafQ0BC?D1+MwHa}{50?J>v>ez#}R%=B54 zs-^tXV=vyP+fW>!*g`hEAjsq9$2K+y*j2QR1Rh=s*n2m@I$Q4p;6W|@o84=Jk6Z7R zx$|T@aL|AI$Z(MD9qxcKfE~`4wd9rdL2#+#BuqO?0mp2jF zkk|RIoEqjXwXv8W+8@=EFvmmZvI^;)p3!ysFwsg51-1lbFd%sF%L+KXwzaRHl?6{6 zzB?)iBO02lC!lwvh%g%@Edqm?asiWMdf`FwrsE#7K4R_V$@5bvcxn)4iLOQ%ANS;t z1n}kB!ZXQNcF6L{Mdo=J_Q zp!#7jj6nYP@bz*oJR1j@hHon5t20u(y z-6QXYo-27Q-?2)1*$PpNO!mpQH`)L)$K zRUCKAbx+Z+?~n*#qJ#e6pTBpXB+tg#(}r}xoM(A3E}fTFu#|B@y!VOwv;}w>@WI7< zv@dA(XcjHT8yHToR`N^#u7etU;tKo+>?#JP00HBFL&pD$e>m%q8o5q&LeZ79qNAvO*Ic?X_w*nHhddA6!{wU}^*{He5tks;e@t#`9R0WkftKIS>`6N$5Dw?U# zc5K|>O8{GY^HdNg+T4LCh9%{k_JQ@YFzqcpPuU(-@V-2=I>rZ0REj?C<$?M5zp9M+ z9%IoEd6{*K67=Y4>_Yz@$rEMWY>BZ*AdER$SdL-ms;#xu4)SKI!lIeT@-_d8pH~<;$K#D_Fb|duz+hSK5MM%XjkOT&WN)<~-aDVn6^tzMASguE$*`@kBpd(znr z2Z--)?*Jdh=q6L-_@2+H&MZc*)b8! zv-YYzA(1JLQvl}oAE-T?k0adLVj>mqqmz=m^>-U?(a9tc)oso?BYdfz>BRT7%H}W9 zS4&guAnXI#u%r6qRLC;~{;szF@82b9PtK3+7=Dau(b7)SXu_4plyK#j`VL;|T$--1d^<+u z;k&$m=$Qm_9m)6FL!OK>ioSfShiYrK{7m9yp8M~0LwUWB5zekn^1)AdwwURB^7H_@ z)V<81o=;|}uTaXuyg%RcIk);UDn_Df) ze?URNle;+`+@*)+!iJi&{Q~Wr`#DKlKBQ54v1B?fl^h2wVbQl zK8aY20^o=(-2h1I|Mt1fh!h^Guh|_@NW81PwzLT6twT~l-0PkOvp8%36UEt7XEt!d zZC+nw(@%eGjd{ZUO5A5)RP50&_wcy$&Wf;h0Sx^{yg}#HODG@NlUF<@> zU)7%+gxe8zDYYLDpy+@{lIbF zokr0+`Lq1Nz#S-+-W8BO^D{)|?LS20#b#mG96EW;J>SHfui$`&$ot(1>2ghMSu+Im zF<;6}0t^Pz%0>VpA%lN_eDD<^`hS4@VYUF88(!GS$JKFVUGi=JMT*m##s>9b-kg>t zTH+Ml-*p1eCz7Y;6XrD67JFi;%!GW5%uB|AslsH?=h{0@8 z;5n|3k~_u#Oul_vErL0U4UrgrR*ugT*{F8sxw$+4CCy#aAo2EK<18FV&>l za54f0w>#jZgiEG8;Ofk10F3&KHO4cTq=Z6@D&wvEap*5%?Ax|hL`6JvRDe+a&iLSz zav{9O{)c#{ODqk$|3>X!rZx=~f!6gzN~ul)bri?zHPbcQ$%7`D(fLNAPQ^pAeEZuJ*l`fa*1_?-d`i8PKtAxCS)Ta$7J z`Glng3Td~O2c_96y0mzkbxMJX{-nL_VRK9(h^UCO5h9&PqVijhtDiaxQrHeEpdk1m;Ybny?OT6TY zou!NsoP!<9o&ma)9Rfyo*Om}-2T44y?~149k2t+wjd8r{{hA;YqB2&r4|!v!uljx0 z%S%8=*sC(1aAZ0{3r7~CS8{2CTAAkGWTKjy^raqjmbH5T{^e~Js>;|;yqX0HR96f# zHZn6cTCeh_+~0LugDVRiE>!vK2AIh`-6Wh2u`HiRc@celJ* z1aPOgfb7neZ|!^@i~FrYTJ^0{N9=Vi^{(u?O7p-~-4VHpf7esK!Rz+omgc%V#eWfk z{s-RTY%te=JJoVxjO)IX+DYb%defrjW`EnafD`%!H&qN2ba8ov+lgfADy(uM&M#~D$ zC{>Flumy{?C-rilI?K4ql2njlRJHfCXsp&JIQ(%%%_{ZIgm0*6m6uOJMc6 zZ$N~w#_nsP%h$zzG^B#lUe$#?qqp#I<}Q77jz@7Pm$U#YiXEH7N+4_69!!XQaPV%5 zr~Xaf^Nxr0{cXbVPCYvCSG=w8&_u)(%61wfw;9M~G$+#hh)?)(cK2=d-8NOSNJWlM zphi%3AucW*AdChi%u}0?gUceH%{~KJR^XT>?tV!hqMf<|Dx!-BslZ_+Elii&nZ&CR ztJO}W>p6^e#w)eu3u=yq1E`4D3BwlX<7K=`5Wg>1aI>gh$}#ui)%C!bc!SI z=@du03CWgYKCU=!djiPQ(kMo@%xcJ;-(9-Gmi5j67HW3&pw!>f5n27LK5WBqty%4T zw#Zv*Jwx`_wBB70{|3131IN21RFWwK3LGKqtgZ<^6S?d}W@C@F(6EiUwuV%%53d^Q z$jR-Yy8vU5Q>C~iud8uPI`ay_Q-r0 zpX{33U90Sg`5AOVD9r3GC>BlMM+&g3*M_wq^FVU#k*%d zlovp)_Bb>nD&+S}`jIF8^~-wO9M)kv#;3*GuTRDqPJE?paMu~K1NV1fg!>sK*gjc~ z&-P+Z9ZY&^Lc60pT+$tm#3jIFchAiP;Umt>$q+%wxm_+7k1Rk@qn?DO z=Uj}Ds+*a9*|nGHu~#M=zw1jhfiMVaqvIncwFRhDsvUt4ciDS<8HAqS6(Hf+9@adD zZEL~?J3IULA^8xnvy&%t#0pJwd$!t#^fFdEj-+~_tX9<{Tihz3HV1}+w>Q@#=AwAl z8Z)F!N@HFk*~oqz-Z5}F4pZH31uW>l3om9{U_g<&-sA2Y9yRLwVMg|n9#CO(7tTi% z^3CC|Et!*4*p@6Z6GOixeM_>8NoRjbXQXk5?JIt}n(Y1MB?v|mQTyv)OlGDx#X3Kl_ozLmORul48eDixor*ua##L-Pp$jw4Y3SK+s7o&nSqy(U!uG23GAaQ7DU6(C9(XbL_k zs1W@MMkPiI*Zx?M-UPXG4xiRg;fkNbU>16@BBls@iNd-5;JTTcaimz(f$Y@d`LYq^PHNg9`rV zhX@Dw@%V52;Th08F?r~ao)@9oA^1c~b5pCU*hrm4&9U)e8!O zL#&JPKa~jGLrg-UV6JmmX;JPSC#UkmurKKw?*Y|f#MriWXVHQtci-(_HBd1{)mO=@ zxgyB=!>^uF0WYV@Gwg`T?UI_F8y@Q0u@lSh5WpL+2$6q4Q5R{V<`Uyv)!8c6COh&z z^TnVBJews7V8*TceFUF=)YK43w(33X(s*T^7q0!I;iEF}0za5yp{4iGxDYDrd|L7V z(#$bGTR)7RHqJGbL#ys!&1=NB@Mmf12f3IaYUnJG&RHvEJEYX3s-NH;aaNjk)x-xP-s?F zKkepRID`;8bCG7ieBaaGKjs&d$hLg)&O(gg^v}4b2@7vE8AsfLZ^QV@u)IF%Wk(#L z`O}B%?(|g4^!+7+uG7F7w}OJ=OjqFWkNi##-X|sf7B|IuEIM4P74kT`;|=4xGK40` z_`u!=+ka{PkQm=|Af(CragndZB~O6o{uiJ52*yxru7s^w<_@*e50E$}YSHQ;0_Zs_ z@ES{TE`xyzN5Bmi+(6CFhq}8Hv&V(9hq}q#S991m`S%N`B*^zM0pW#^+PgD7eZB2K z5cZ@hV|y~givyMTfKTrp9tf&lCBF)`kt+S*9Jg|xdPt#H}}&>W68 z0m=y%}ihO@Ii*kdZXI=bgF2IhxJJzZ>fesZ~5IXl#v{Ha=K)cB3^FNalM`A6+yQR%V*r z!2~*9jbjdCldA-&2=c7s^zB3H1#)nNP^ocwVIMv(?#f*LYaW?~)3 zA#=>60S5fd#rp#0FDq$Z$F2yLo(698w1)KZtW*JmckKp1*SlT3Ldq5v*=4iUCrloB zXX$L<^A{v+5SWv)Z^D}&heB}wHnOX=I%v(ZwKe#=J5stRX+N#H{lNwrq}MC6zXXgM z&;X-rVLCv8nt>Tj&r@zew}(uLB&Xa?Omj)KjYW>({xv_) zlf912`8h_17O&pVpqey}`vWSF#~V+|v~05E52Odf8!~QmlBl0sCOu=jMW@owHa-`D z0SaF|oT+)?X%VT6%q9}ndUz&F%&1R+Q`pG_3}7%In=q&?=e~Y63ksUy zJ1Ls~ainaPcby(DnVFQWq$Eo^RvXB%?r5R~nV;(+sjq*q)@EY+`Gs4OaNYVx21LFT zvBxEl+w%(ed9iE&V#gMrViEztY&$sM9!*F9fz`JjKj$xe(#avWs@n(_uwyTSJTH6x z0$Oix8VI;tc1jp}DWq*`?DUjoA{BVR4q$5>kJ9^2;zrK89nD zHs;pv5&8a#uxX2>d;ZQ~_-Tb#j`l}!R4(Zo?99|3&^C4o3)ue9bIiz`^)m~sV9%R6(TK#rIRuNE-MXiiM3N0RQkZyYU|1o?k^A`*`>mc1%v!7%_%sfkB`Ni zv@u*G0U$S7a}AQf;9GH8;C^Pr0DSd^818(7_B%gj2%ru(N2}-gNcQPL>4YPV_>QdQ zpU2_cZ6OIcdS_9{=rHf91cZD(Mq3^_U?a_d?L7|gHr>Da@bgL$_CA2?`!0{0@tkHT z%e~R3skm|3U7U6M+j5KMdp<2Rxt+u(`9hE04Bg(m`kHK^?BX-kN}k) z+}m=o+5U4CZFI%)p3GkEb!$~hengg7?|KL^Es1*vOX5&w;#kK)93hmJA&gYyN*ht} z+kZ7Oo2s!n<#$7xS}m|>`XE#lqspG055QQ_o@>rM?AyyWu1fMPr$wi&%{B>G@tGQt zCNbJUeTu@3_iW#=oGo=dghTu3Ba4oKj)eQlipeAbLBSHxX|R~-r|kR z)|l*Sr2oQ{E{t=QVc+E6^bGap+_KF#V)ati`40wv8N_U=?z{H*uIciNQ&aWtCaUZS3pN%M(C!QN z%yIB=-Rh5^VpMe7)Q0~9eB^K1!=<{V)3{6lAmZWo2ov3RZzOVXyAWs=(o8R22 z%Eq1dn~hnlzg2v{$6r05^xAoO6pGfEu>NS=w4{Q>e_#|EcT3p~NBk-S)C0J(3R16@ zxscf(5jC-lukrc~q$39Q6H?C4vzp+>3eI#K58^F!mQ_F`!Q2>t#c*(l-mXvC$Pgt- zhRSsog9KRNu&F#(@S&ve%6 z6D^jh{e2I91ikmO$gu`~jb8v1t>xl+kx7<8cU^C{_-RB9FFViDBPW~-mYchQ4*%U1 z_TMizoQ>cb@J~LezNW}8rDGek9%>D&*AM(Z-j}$?+W|6i>8SSJ3gj7X5xW-MIoY38 zb>Cc;y&~t_uB(22PX)~WXk~tP4jeZdd8q-FjNY z)i$vUk=r#8TCmqo(|1?9JuFz-$E%_D&m5z0L5Xvf{1*?z2DqT_%d+pI{CX;?Z*n}T z8tRfPqehgpx{GO9!c*U!ADY^{2l&Rq$rjZ@dmz0pbpt-@ne{DfI!{9PqZqaL7D->+ z+|;xdI27ZD7Ao|a>z-{|YI|5W!OujFTL3TR4JEzpHq^g7X1>e=Mf+dN>>3Bhot0i7 zdvl6!Vm+HoOcb@*evox#9rntPG4jOTR5@`5$LhNoKfTsF}S^ z<;0dsDx#`KSm4sd{E!YTl7zTGSux#5My8kBo3mY8dfnq2c2RKrMGfqUe|-=eO6u>E zojHrA#94#TwA&OQx8o|LpIN|yZALtz`B_s}N9dENaCB&2J8E~1i72nb4(5Q;n8LWT zLm=LRW>KdHv$Gz#ILOCx-N=#1G!Od*V3N!rVGQw9i}vP+cn@^bm~zIYc0m|Y?}y$~ zD_N^eLK)vN5y(2YBT%SoMe4__a$H$$3@`4>)LGk-#im=UQUNX5%PPNHAgJ7iROk2= zR@DNiVpP9MSJeZW{8 zY@v5pV^;_1vj{1=tNP)62@CSDbI*s$fA zfu8H7xo756YMA}oh%^1@7ax0^(dT0s)qV5DYsw{!cJlKNRv8NKuGIRG_)>JKwqaF_ z1UR2@7hQpvnd>|mMkJ5QIDlf zHnPN?O&N&MRNv|HQrsI2Oi|#PH`qB2mj*tP&${#_Ig`lLOkTlBKsL@BUgzv5>H$^P zl(sRR8?D}k9(PgnmZ9|0r7ybAt{%WDcW%{v^>r>ZG+kL4tTJBgog8BG(9?znKQQN5 zTZJokt*{~UjVUv%e#OxUes*-Wbm?4_<3GoJ)Vw#(ZWEVuc>gHfx!krMZnl?N+Y);C z3$&JE1?-+BFHbum)eMp}@qC_U%4Rf8fuDZ*IL@wGsC1=}cr$=pr(m@Jw`2r_lO13r z)~|0YbZktd9va(;5?A3?G8N`t&3*)2a0-T4fpNYTz4bt~XKlW0b#3o|9@AZ>$=n%h zdx$$EON$-%dz=tp*hD^gRI{+Xj8f%DF|%Uhaw4%DX9K_rxWZ8`2`{OiF(m6B|`8%l?LTC!sbili>q`k=(R0_l&5ZZuu>e=R*N&nC$gbxK^33uiDWkxtmc!y(Xo}H6SYN)w zV=`+)ju!J3?xa#l;(7^{D_~Tc*d@)gxo( z8$>(Ct1ShszRvR)zL) z2?{k!i7|c<=r|CVZ5P@b&R~uZ%aw|K;S_n5CsGx3gtq8h<6jf-WynHjC3_Rd|id5WhPn0 zpROCZtQJl-Hux+|S<7e39dHn1_IDpA&|D-3jRxP1oAag!{7N>`q$F!c?qZVdx+sie z{&=D9rJWXY%zYlKke^D8vRxOo=Lsw`5`A20xz=jny{g@N|08y##?aBpzH)&L_qM7mY4q_yyCCGZ~>Tk?;m9+ZTmJjzG z?z>AdmXvzDPu`KJVBReJ86EU+x5@sl;@S0~%u?3_O+i6ey^qz}_LeD`&vu2wDblbM zUq=DVk}z{+g!sAP&>p!$+0c}#dc-m5$PP84t(KzIN`33g4%M*5-8Knc;NH@tYe2r^ zWbE=$qoA$u?S;_63g5k%!U*LWE{F`8%r7V~mbsa#l%AACm?np25>CN@iQh>oJ+BVo z*rdi1rrhiuEpcb~8(DtB`}mRY#lJi6gb&>ryi@E?_TT}~=G)KJK5@jXfrJKN5;wVR zH1n9JKPHd(Yv*f>4j3mmGjZ?nY;r5G<$SWpF-AY4OPZOe`;i$&a!2IM`_RJQQ!KKL zK7UTAKiTe3_-j79%JqZGFVnz&=EN2R42Ras+>T1{N3sugh4T7KCgh{pT{M>=D@>YB zcLQywjBGPJhSt0F5TxV5UEHpBvpTE z$N>=3P7V+wpLjq;x%<05{%xsnIOklwc^-U}_zPI;%m2G&=s$L-|H6N1T_A-@Hx~^* z)tD7=rc_uTDzdm{$=-KRr80%NG)wLKLEz~P&e6t$8HJvf`nD~*+)?IW5`(=Dmm`}&yi2uz$@?@Np zQlI2!6Gzl{Ax2a0Y^+GCmX_IH8n9d9vuv`Q9@u##lI=82LzVOPt^zSh@uPM1j~;37 zJxz|q+@MdT>zQc-^r!ky1Xr4F9cWO##yJClWK$Zic}94H83JUJ)L7X|-Jsl6IMXKm z^Um5Sfcl+j8s~zubi<5Pxq-|cKKjK%LTf|nOMXmjW{68SgNrY!SU50Pc{W3D;@pG? z6^+YM+o0-Y^W7^sZVjtd5cixqTQUW!;)Y?HE8dRWSAyQt;9_Ep7JfeqWb4cciyf_QEwK$bf2rQ zpOB}$%83=e%e@2N%lMsQREDa0DtWwvkzo5n-qabUDLm+oR-e?&9VA>72?Y^ znKocLKx8n1G`F(>%7nMGl~ewJYAe#*tGI}GKoSQ)+X~?sWd6$N-o{BURI-mFZgE-w zrwW+vPDemqE3#^rtg4J}0|j+tl#p{}?FYWves^>dq zkGlU5=e7^{5ZKJKH>>@Hb&xAozpGnq!G9$HY5$P`XaW*|34kUzS3Zz(rx@7S*Fk6X z)Wo)xw7up!1*9)~gBa}1mlivka9K{HfxyQp-|Y$C9T{fdbG@X!#>bTnNrtz}+x}yc zExC`XdXsBMBbg0zOPv+%H&-=9fX`*aU~^+Dyh0drbURlBg-!td`gbEw`S_lmQ5A9u zi9K42x;bEHpiTnYgv1%V!!k8DB4D9nA0Ll9wzletOG#YfNNo9eU)L_7dDg+<((DgX zyOhEg`K>Q(w<6Nz5_%8!i_UX#i*eV z*V{qpv}+RVly*zYbA!+DZ;o+K`su9c#5)0@!7LT%@Oe^xk(f!C04Rjk&ipoFWVEqD>Vs{xVgd`%;P$tN?3UU7XLzVw5}rOe z9BI;x&&%sm785X)pJRm&qj8UEFG;sZTLU7H7VG-$h!p_JWbloq^G5K&*1GZV4S>%o5_)C1eDlzW)!#?f#Fo_DC z5W@e(X$KfU?1OsbPSiXh*Th4>w8sK)mEafKZ7k@wL%rsAr_UI53?e5_p4@-MLOWRL z>EyHiiTNim^0c(0G8!}H*1Ti3>M~R;AK_W$z0EH*RVr%)7;Zdoyo58HwP3^;_8xG| z)~~^nN?o>t*{FiIe;qzwEjY}0h4kCaa>jVz`^gr^JM75`kQ(chW-1w z9)*_OW5#ZGj>p?J7Be|F&GG@CkqvGZhFNj}H`6`2nc)DL-r5xhT_aJ+(tb`YQF&$H zqvoLGEcLo_UPlRC$<1w9>;5k*J4qUGd~fmqoPz7WcXYks;?`4G=yDxz|6G)@hrkPF z?ft~K55=%M#VldJdq9YhBjy5$C4;zKzqMRdmvJr2Zo#;u_SGx@0qJ=kKGvqf6~*0x zts0iSo+QIMR_o>SVL{ii%vw3kP^8GqhFwlQrxgI6-CRikGy^VesbC4SzaUB0!nzW| z8xkd(k#yIvXBx6hjM~y;Jd88$i=Kh_8ojP;e>uez5}uBx3_lxTn(`_-*mf2!ln3|(UPx}1ID>D zMp0-}`Vr5cw)-8ho2#YU@7GJ=K~tNIH;NRS1h+q_HlMj96B0)3NMT@u{n>5|mzE@n z=d*6r+i971dNA(z{qjg|PWF3(45?vCMZM+G@RVQro~G}5nrc`zCrxqQ^||mOKXeQ0 z-OxbA&D0ZoEJS?BKSsKW|2V`9FII`R={})9K7WkT26Gpo>}$~+F?4mZFGH9r4Rl7d zHYm2k80+XgWm1-74<$Z4OCR1i5|62Q+j~agBGZimU1x8RjoxJqVG7%yWI41@DKY(7 zhNeX3RTz=3TPH5yk)Lo|135-ue^%5Ync7{l{R3tavlSD=9lizbTED4Il%=~O6uFpt3-hjEev!{P*-Tl5CUoQqn^s(u z`o)-!5o$aQ*a2mlk-IFq|6;aZ#D!@qX@Yn>+rs0h^{=%)n>9$mmYfRd7T&~p8LT7M zFT2X!25c77+pk$`Qab<81}D_PfAYsosCCje7Rj=iCrgp5lWueU`@tEcP`CD_&Z`f; ze4>(JiSUR}o8`r%dUfnwcW+7W%AbjI$TN?Cm-QMR&x}}kx>4A;)+(jHnb{p^x`?aRRX_Al2bt&ARdj?u4{ge02~`nk7NsEFtk8S%!^Hj6nn7lk|JpU2KXX1Qlscffdrm;z$>O)wlO^0+o{xymxR`p1!7 z-^~TP*7fSZE@_#tI98-47~)o%+g)Teak00Q_G|h(Ff9Bw5yTUkJ0Us9gInz< zaTcZJkErH^|0FQp(?*0k;;83iVZn6_RsyK8mAybCZK&;?l<-t4zcnk$omk-8XQU%m zA1VJq{e`sj5q*bDqiw(3|}0*6i+r^K*{H z5>62uAtC!2R!QRcjq101RhMyTHU=UA8o^zA3JJn|Y$E?g`E=y|q7D!$&P-#PY@wQ6 zv1oI^l)$LgL0U;(BV3C_zrYs;{h>99k(X~5{sSEWfo>;N&cV?Pa_x`hEF*{6YMIKV zXdSuCpGnZ-Bh_t>qVmrb(6Fm+-ST|2IBJ|_F5*2|;zKjL;!b@2uNwQZ_A;EM;h&GW zQU{~1Kbk4pOb!jIKogWCz&1ittDD@DHU@}uC6n|fHqiA4e~_QS*3Q#aoqpqd0>Q7# z(W(9qkrw~Hv5tpeyIKW8p3(O`UT`uA28HU6RTafL7AYt^sJEoVJ`6#36Ot^y%(Q(N zF|c&XF}b{;prn7}ye9bPjy(^q@Gw8B)IRl{VyHc`&{N|^g1Zlhp+=u* zKA?q)(btT=iqMto;Y1L+jX!Rg%UCg{?Pt*nzc|*m5XaD`&BrvE?~+`+*odV=A)Dn6 z2g7G|VCN^)sr}W1Lc|Nva}`D~!7@U^8~fV2N5ou#X!JdT#qCXgke@M5_r0S&#vA4h z@nT)VeJ2$Owd~w_`^baSFH4?2G|h6*TL}T0gD6StlA)!xL0*@wFVK~3|k{3J5w$Z)o+leQ;h@d|CQM}yfJdJ(c>zk(|x3uqvME2}r zBjKK6(O@vAq*6%~&y88JHUToBdMMwkHChYDDlud5jB7b6)&%beh;<@4!&{~DH{5pG z^zxyxxIy!XV9c7~w)lp_OxUefw^f3UgnzE}VS>}SBIU#%cg`hw z#|WLl$-*Ckn|(2eva}ZPsMJwPh*jzq7%C&TJZM+Byh4CJW3k$j;S-_?N`*wO$iaRd z_CQBix4{Yj{|#zG42EIF2CYjjI<^REVi{_Bz~U4aZJUz*v?_)9Yt*(9W$OlX;%E{! zFzBfKd+a(sq(k%_G8;I223AB_?bk@+)5dNtqeQ#>wfxA-l@%XPx9cegWeaWpawEqb z-9#(YRY#o}6f7M%V%GU!%_^{%#mCLK|6P?gF>g}h)3-@vdwSF$jgW|v|AXOU(N-W( zdN@fodHj0f>gG@?e%rd>Wn}rakgL+Vi^OQth1^*r)#?THU2g*BeXyxVVbGF=JEXvV5{6()5$4GUf>qe#fEPdyIcLz~^1rd;kVD9uJQxqktgY3HWdM!HiDT>A zJym?mvHeFw%=_M$dy3r7#!czqO~jI<AZwZLySp0jdCZ;eg=>>ty* z`Xa^~=%~U|5QTc~sMortfQ{#ACKwxcD*w!;W4Z#ge%~BnPJ!rph-PQPhrYpFrO@R3d|=%%Ymp-Ed()VIX^RCWkmFYkwyH(BW6vpSDdC= z?N2qSn7VAYnq>Dg*S?8Gky!iCLzbhmjRiCJATfndFe~90GEUYk%v$#MZu9lQ z!fdz8agCRRSB%0T9`W&D!d6$3mKUp`*lWeKsv7M}x&LB-p#v`-P3=Q~`vdgz`F{ZY zeE-=rJRPk*lzgcdVl}Fmo;@(p5xtzXvUF)>t+EuO9L7bxK(k9H*L~hL! zM0EC*9c$g1R5*zA>MzyJ;xeEt14Q?E+_WYUXgj~G@RP^eKt2>08meRI5d*J7E#g)` zyvg##xnLPldvm2IPi+A_1p5<2*d8aRxp~o}?$5t{dvsa4O^D(%1rc%@;!f{Y-j+;h zH6e$88g4ph-V^oXMZB`c>$*n*5oz)-^=?{HE^tTgs6->>y+)<0fUK3p(u_m@?$+Z zezP*Es*kPvMAz?M#z}pSJ)ucyTx3WrMBRm7{0C*io0UNmjT2%lD{gRL?K<>=1@h7- zSxtio9$vuzUbEXd|xV~h67I19Jy0Nk5ep>I3(6D}NY5wvP)*O@7_{6X; zuQuoN%0JPZm3f+&@|_Z-i3|_T?>y+B%NDrTap~NTAC8Ys+}uKYy|MZP%K&pXo^KcI z*VDt~I2rCK--FI617*k#(Wb&YfHf}$%6+Qo_|La(R2SY!DO*3z&-j`R?vSuo=nDsa3(ZG^L+e9e&%xIkK3(7pRQ29R`fOu`Asj^ zrgHwb@AK}6I5p=Eb&+OORNzMob@ej7< zJ7<`2ynE;$cqeN8D35~Qn$mB0%8^04885lkokp~5iMKCzEf`xtJdLxzRDLA?j`Ptx zN1?eRHI#?Y%?VvP`%mZ-%;eu-*yIEZ8?nC@oF8*6W{9H*Y|koj;6OPT*IciX3%nMp zF?Yq8HGR!lrFUT3FyXZVHV|iH#6wmfhMN9~IbD<`q@?-ht2}Q)6o$nRL1`2X?5^*E zWv(c`vvG84kmuh@Va!nx@#=O*hQmz}f&7C7*G4~lyzj)}eW&2ZsQ}Jr;U9(DN^j!3 z_ull8SZ9vzy4%^$K8Wg(QKRv`!FJ;+M?{-E6=5|zb^p}^b8ohjp5BxCfRYF%gDtCw z5bRS6p4fg;d{*att%sVb=@-K7V=UDvw>Ei!*$|3!{FkXSF;k4^3u-UtJLi}+aS0Y$ z)x^9j6#1!YQL!#ShnGfy=sgfM=$D7;Y`P#m`^1*_Qg5Ebz!@+pMxDjmohPq;V1zyR z8tfcAJJt5d%QU?Ab7Q571!2Y;Cmi-Jwj1{0^|fSHxVdRu;Go2iz@m=~G}>zL<5 zF2vpp|Cf4u`)BK6HSi)w3?Jq!WM?yI@=OiXb=FgVZ+nI}F=cH0hy9E1mGPIBHn*h? z(&&A)<@s^xE(nMU2NBVva;f%r35KNR@OScHHK#=q)lUd1w-@o8hR5q_b566UVRr>(!;~Hriz?qk_PKO3+bE_d2THuU zR1=qRg!uEWnzQni)Kjev0rxixRan1d%96=|k>7)P@o9%KJ3R-~-RvK~r}C9kglS)N zQmh!-J*BER zPU4b8>L>TB&mvI#{OJ$BdMi3`5f_`ymzv;PoOOHR_wKdC&hstcwgS%dRT*Kody1gqX>2 zv~`y4P~at&Lak>Hw1NdW9?$L8ckBuz(9KldeyFW_+B5s;{9j0i_;1Xbj3hbGw@&nb z;#56o4`up!hL8XB%$VSsH|dwX#PBM)X{+Uk=Y>%SsSQ{EbLW-(qEPjGEJ;$P>Tc}o z#{8OiU8CWj>FMPU{Z7E79yAEk7)5jj<_rul|KQ3%XZ%|b59RT7$?P=I&B8j<=4xHI zEk$A}%}b<&>ZH!-JP|_YVqIs zV^G%^J}Ob4gsUPyuc9tiG&I1z>>g4aUDet`)8RX{*4977baE%q#;JlTRuB3a(2^;aWrNjG1DY%NyUMp(V(hBD1H@0E?KHE+qbnf{m z*!nl{5fXoEjBSYWf=(b>a9&JpFN^&>yX{eg5SOi7*cRz6dq8v>)x zQ@MDy0IH&v^i5gpI@4Epxs> zp1r&@T>x#as8$xv@-Is(~-0SZeAQjwR!U` zmGGA*-DS`2X#;Yp{5bkr1N`M|ivgDUsp*5>$8pZ>RNn!G3QH{jSt7_LBn|OH;|0Ma zY+loJwH?y}r(5n94$HRndeNe3#uDE!pdiKPj5hDP z(q0Im6WMU?sNd~oJ@7+nc>Uhin&2W@SB{r2hy038NQ~I>JOE+ec6EFx#g!FNTO{ie z%h>H1`I+$h{&B+z5Xh@2U7Kl~74rQAC&54IliQ3gQ^RzJok$Sng1a{o%@jyv&?>Qpp6(OKpD3r=Ek#>(xj ztRn#yRV)JG$aIk}DS>XN82y4Mn?cfvzFQHkmwdOb=qB^epoQG#dv9X|UNiFfDkdz3 zpsB+MMMYBjVEjVJh2y*B3IQ@JKoha=L%g8BH2R<{`2m6F_j=mvGqHc{-kI5iPmgg& zFuqo3yW@gQKiR1N10IO~c}=+Po*y3Si`Mo`U#Sx(FcZB97T0@!ZV9ur(%4lS&We~M zgl{@0NiCY4C92~KbXk{uC);{$wrTtXgYRD89DdEtx0towu_T&!T*?9Vo!-7rLRP(B z`7onyt4$;ot)ZPh8Y+`!HP~h_*A{Fs}Rl^pY$T z@_EL9AgpX71MV2iApGA(A!clCaVUL&nIl~TBZ?m|a+6tUC>tV&9MOu>8$TmD@(uVm@c^usX z;m})t-oZAXymOOvN{%Zv(bOX;*Bbld;?a2ZzW7zZ~vzyGA$o2jNZdhtMem@K@ zHKWv4(o;IFNS-%v3!ZR!OS|fWJnPkq*m?p7@*NVWP$}Yu$8molbLB(}a@Ad+FbaVF zwD!nhI<%PnI)PZ%eRb zWi98PwCZ|1Fk7_FlSPR*fhbwy$d12|j8Id_wW1a;1(XMsxBeUqvtvyUao=n~_`~QH z30>K4Ij9-&v*fLt&dSk0-{pmG%b?r%odmy+!kv6Tj|v5u8wI^dQ0@ZB3#^%erJ|^} zIcXh%tVOh}54$wE@hTNVgB&^ohA&lkpfO$Wa>c zR+gKwY)lS#NSu9KIY4q{`+#x2Qc+PHWjLG`4zOvMhIW^dWnUG}8^J)LNkN6}Kf>dJ zzY*9{&tHNI1O>7Nb%Yrn!Qk1naKpx;7PLTm4u(dI#F_19&> zd-R}VJO5<|{Xal|fN%bPo2X8>XD3;%0o81e*Exz5qL3@aX5;s&Evu3q@3_&x@*jWo zz7Cg}5l1#2rn!gtWSJP6rgET+xdNO6csM+`{ft3!fGdUoH7flL`Z%qy=B37#D2h{e zPa5-PH{YeFRX{Dlk~!sWoOE411ZYrdsE3!WC$C0o zdX=92wt=yz@Vom^^Pj34y4ebdP@8{G;c>*UdvRJLS+3a{E8m-$>GRO0i`~Dv^-!Mf zY!Wpeqoe9#mh$|0itSej&?!@N@l&(=hZMe|Ks{z9Fq9#+B=q{IR$pGpxC%m~tBb14 zSGlFEHJDXHTVRT!W1#>{MmF;#_)XhK6O?od-#@IZD5?DZ)=J{yTo&5lL8dRm?|qKL z#U85^#xLu*7mSSQ&ANy{7X@?u)3Z!pH%zuH0ztYH&~7VbkXo?vs#Md>Yxp^CR}HGK6#0)Xqyk_gua2O$IgA!}NcKwVrUf z|DhiaFA>69pJ`$71;XWA+f2cx^B=livGYBja*>}E8gn01i6rROAGW4DJj)<{(oNc$ zZg#rG?Yrhq5jn88E4vLl(MklBfDxk*jyY7c!7J$!58of}lHXA5L)U4haPJS-7d~a9 zCe1t8fj(YX}ta&?Ub9IqFp2=eD~B`omgMXr_hDp_V4OjUI^rTkO_PI z`W$bHBcrm?klc|CH|arNA&T7k;V(q9+l&VoliOWEF@pUJs)viJu(Uc6Lgst;WxKY( zT@O>`OseK$ISJ?k$YSkFtK{=&)&iRd>k)&%H36@db!oALAf>;+Re3(AR#E;2TrtL$6;!fFvJba51pW3B_T%Hsb zUy4?zHre$ZJ!ll^E|F!r8;0^P&8@CJ;#y{UVDajQzUjBKT2CESAx>ew#c-A*d7^RS z#O0zv|GjjK@|U30u(yxZBhEeU>Y-@>`Z?$%QHMC22@w|kYee0^ktSQM#FfqR(=Z+L zxxgub;SY36mhrs`Kk8<4)#v^a$#aGiNa;_87HAoYA;_%!s?VrO48dXjmKt$+=6=HL z+T`I~)@Nv7;)$xA=EE%Uvu~#`)__WwvN4Ih&KPmdwoG5{PSVq04W+U@0gATUmH~B_ zh?>oZpZ2``u)`A*Ytqyf&J|fJs(hCDXx*bbWnOZ`swh({*~%j#`Uhw!>K|47$xYrkab>iCW8t8#oI~_Z*&7*G^$&X^8yp zVwtjyE-eZ`&N`8rsQ#vr`NZ9y)(h9}%l%{rjY+Q}4~7~*z^EIsVWvO%AW$20(NDLv zAx|E-n;Zqep%!s=?=`+Wm~_`8Uv@A3neuGh%dqj^k!eC=lUD^S3l#Okn~cy{?XJMa zsEA=Y9uhurV_r>Qmi7xq_W;(48cGM}T5TIS*ydl%83UPFXEssa)1vjk@`aCEaRqk# zk%j`H+fwt|RM82RwJw-qkT{^iV@1A*8-R1o$PKv&r&6Ok&OFr+5)i(hFh#c=!uaGs zZpLSvAk&hm(3OwEY{?9L^=e0K8BT+@l@qjqLp*K4_l(yM%I?mzspBs!uk~J!y=;D) z+Y(BNEwv&Vv?g&AEXIW1%YL}4wq7rtC;o#nftgW$2B(Mywk>{KAZCr<=`ZBlg<9J^ zz#v4Gg8w|N#O=s0QLf}$%!K>CvAZ{`J3!LTZ1Auj6%4Et?T23cvq> zZHnluUpk=DrTX#4ScY?mU$;CW#><`_Rczp~_jv z(F35Eb(h6r{MjDd@{gK)9H322W|jI;iTEH)vYp6HA^^QCA8tL(qoam%kPxl-kyq`? zk?^|UjE1A5Q)E1Z^z&;u+;ZB}pkacqvUj)B`Sh3&7T;buJ+S|9)$q;#3cdcfe;bS< zzlYWoqOa6OJ$j)Ns&CCNMEt19Jm)3SgvUkzBc`W8>xJX8@KoctjRgdrW2pN3+P6w< zuLFemWT+vDss9ZZ+azn6+LIen3kvheJVn~_DGY&cvI;gX7MI2^tULl;3f2O#H~rNq z1%uWgoY}TNfIEO!?oON)WeA|g?&Hgkp)R;CN%E!Iwnko_{u;sQY92=Q zps$6+H@*j$H%IBnFnh!bBx7xczy3q67ndG8+{N#G0@K_knqF8iQ7pt1QV2oxgRqHz zA$H*hLL;zae<(RP%3GPA%r4i|eRyGK^B1nMdg(=&Rg|IW^PmA~MeYD-gxZGaRuxX8 z4$4j9!-pUHeI-Al80-D7K8JRKT+kZ_+F|j{Ko>4gmEQ>(MR$hB+7cM%@U~`k`p1<) zlntu9jH8%6e~5=mdCMlmWK5mPOr-x#RH6FmAHLf4b0Lh`1uHmFQINKe+`7Dk*qw%w zKRkg9=jom&=HA4o=gFyD8dxs@vtA{x$9=E;o&Zr;Hg?&PT(1Rhs1P_mSNj}}=>U(Z z4`V~qWSKQsTh4eY>I98xUU1-d=7n@{6g&j%fUA!zai@Bd+t%)@iN>9)CITtfatAW{ z7*vH6C_{GV3>qKr$gO{M2C@e|_b%|l?tRlclN_MJPU5H{FeFo{D13Stx$xLnLGY2$ zDE#6@ip5N-3x_i}(bHbpJ^zWkq5t)o&_wh@;>~Gn5WBwXlRvfPHD$V2?8VX^y$u(5 zXZNGtTU%MCW1*6sf6p9$Ju!RKOu4Jly-*%gJT|5|-x2n!OjiDo$!r;P(0y8`n8pMg zCJx4Uf_kZNqt<+kYyr^ib>uv^<^pvwM2?$^ms zo=zO|xfH9m|0r4TwQ~r4lMrRX)HbpVONtQ}CD-?2mJU{%;Y#2uIRi>;U!aNin-K{!9Mg>Yo@%2g%^c|pU=Q<0c?8ThfFOOvXi`qVVhiu zkNU|w(YM~HDc~1Fbs*ZMp*kk*sIY8;SqHs;g67@i22ds~b=bC_j11<_@Bzqiko&ebG9( zP3cQXd}UR*&n(aIZ8%aXlBykwj0=xGs znH+u_a*N~`k9EW1Bf)*{%sQQ=fkdbZ6)>jeOt2Hvr?BT&2+Qtl zI6Idtt-OviZ8xSh?v4MDR_&-?ge0}rDIRBox|z1K8G8K1;aDiF68TPuERp#Ru_g&x z9KXeSt8@{=@uH1MDg>5Q_XN<3Lki3mHM$)vI08BC_w6%i3?ud+p6;Cs1^OtFJ?<|`&gHv9R7=&kU^im`UR4shFo^9zVE%NhKhPu(& zkTVy1E9=3fL=X@(1Rw5OqkX2*LM7MD&7Ltz^0J23Frk7f)-GE4E>tq!ORt+s>!&yeC!_wvJN%?v%dNlqWvO;5tjw( zcS1OaS631}K{IgEC2m93L-a!jUB9OFHS_Bc3B}KP0|mC+T5S!cGaDGsl2isK4f@gs z>^FbDl%K1O;ram$7-2g9JWSeoJD}|AbV7WFw)y<3wI5JFHG%T*DiTEW35*zp> z#)=`m-#Hb8l6Ff$v5@Ic=Cx&6iN949`g<+%Ku2&bi~Jy|`o`DYS%vO2p<~aB3bF>!wlD^sglKeA%KS!8y5lkt3p-TnApPRu@7T~hs{6^+{ z*Z|vMCBVp3YM`Oh7UhsQ4_2C)R~vB*qfi7XnXaPe9NE~Y)AWk zaLyEzq^>Q3e!1|E263BH!|cwRv9{P&UF4Ic6MFmy0r`FhWPuXhkJJaBZRbg{JP%}G zq&lazrUnUjdQzeX?Oxn_jMtU_jn)L?U_d5%&L(nt(vPHs&(y=$_I-xS&0i~b?v~(= z43I8f-i@;Nw==$dW{ji|@uftF&DmV9gtjDzEScl+X}{n1fE_tzk^Zrxn=VdDx+%B4nRH=$n3B}6qWbCS<>-&-qi4UJt2Y2h1oA&*>(pYd0 zIuNA_d94l64@EJqX9GM{tn*JN(`9$a8tC(OM_&h^EMt^R0)9{s) ze?rjV=wTgaw?G?Gh#sv1K^{p12STPN5!X4+3AS0^-j5?Ev9= z8Keh`ID}Lo{op!ylFqEMx?PDXVN4A}^-bhgW6AR~^bu{}+YzB&u0y>rR?OVsiKICM zOw~PtDbP$`6$mp0VWa4tM+B4{Jv1P*GQo~#_g%|K+8foyAD1{aIb7aac@)BD^1MzH zZW)r~J+zSM$wDY6-|e4vJpwev*DT5q= zUG!<^A267I;T4U(2zHW(Q=3OrPcTa{DGXI7MvR)`J#YNJ&n}k1@D~AkKl+aEh@9k$r$n%lLwjJ3YTX$5uubDwDahdf`m)qtik4ozlR5HuD{0rOSX;`Mq{6 z7aQoFH=?7?uW9G>iWsvc-BE5a@6P-d@6--PFAVh}OZN{a!Iw2G_7`$3g_g{NN7U>f-5=Wxa-of-#h4E6)$O5HjBM52Fzac~x&s6<7|J3BbR%}hS8jaooq zH$=ym{%;6hDLv32uUn@#&0|{PWE16e64<)QVF+7501#&VJqGk;$z`JJ=&ibpSpV zvFAYF0O@^6_u*kUcv*p}^M0Kvg(Qg^cvB6&f?tD?SqFEybU1f_oA zBgCQflPyLnz_u->V1{o@0+vi1;+1gHW(WY%I&^yT-F_1P_iDmMx$C!;ts9z$XG|B= zLNnBvIznDkG%iMVO(;yhOJXNpN`m*lz)uF1@)#Hf)r=b3sTuK0OI{3kcBc?T_`I5$ zsp;G+{TI61?i&HOQ4gN3JI{@NfOj|!09bejBoY7$m6=S9dN{*S7GIY&;-8dSs3}$^ z{nc#>!j5|WRErW4;?&S}My7`4NEs#9sKQ@5n4k7raw9*C_~6iRoIm2+P46t+)%7S% z^z&27Aa{Ef{(^vLn4lfF^qp|IoHcPSXn|UvQ}AhR5L2#Q_p4c1WFwM|#5gnl>`gu; zGGO62qUr{|lg3dhB12uTEdjK$vxHD0dA$ZOTc&8RYuV!tby%N~=)s?Xn}!`xgHRvJ z4I~HYA>Pu@MYg|2Gr!H+T~B*1j~Pth%h(h*w)bS9R|h5a2NfDZ0QUIP^!i(+FIxfX zK~u5J^%hEZf>V;*8JwbfE)Yle;=xttXE6KV*ZWX8$!q&y$4hQZ-rd9OoB@j2AyCZV z@7t1#_x(tgGdiL6Tc!_MH>M~Rhkph~AzUx^7B)ZSe(IF)JjxC&M`WKyKv3ScPmEU# zJ}voQ^jN;%tmH%YNJLVAS=zZlrF7-r){~R4r(|OCtdMt&R9<(wtr=e!7m=E|Id)s8 zFfxJd7Qf1$_IyT4k`6vR%--G({F0`JlYQ!3V2i-rlDX$JtU3$|{J^jzEjon=0tNd6 zl8GYN-6u8yi>vG|x#o+RA>5D|{DGMhrmP}1D9D{U5^yNnc{ebas8alJec|Db)i z>zhGx(Tikvxos@!IQXP+(0RnqZM6j|BBC(m(zwO!`=)%@qssnGk~Z`Bs6yD|utB%S zhAv!@XA?YlOM8j@ZC)1$Ew#-+kNS!;cBK({hZ?8hr26JPtQ>aLQ5DYZWz7<$oA1eT z#DZx*E(kvaApB7ZW06(LZ)IDu>d;@v?xqmg*NU=xmoaRTzT{~2gHke!=3)cC2H7-i zOJd5=v6EAucPi3U*AMP6-F;zsdxB{BD0puIx;3xFd;Mm}RskhN7_nioXK2AkK|ukV z3VI1P4=705;PW%bEXn9W>r6pZm$kK;~HNC$1nD~pnf$kz-EoE9QYVblV=zlVs3 zRxe&c7+^Q1YwwAUYJE-%WBn!-A+s&&t;zcpCnLHP{s%+WUTm2>I-N-lu1aA2F3pI>RLbe?hp-(EpeqsrADIPzOv_VllNT%+gB!};g}q!k17 zDL#d{foW(43r1MXaROp47HtI{^eXsf*&k8t@U*pU1~}>pNY1>Gi!9(;(d34^aB{LEing|CfRXo z7l3}KD+}@XiGz_j)%m}n61DY3ZvQbUY~Q&AXW9_0z`qYJ(dDpO%|SWng&nrUMZ4!- z(T7q=7t&?cQFEVjXF`7dz55rkcFTF%ff=j~$w3PhnG?gOQZe<3j3To?*VuIVPfE1`(RSV;!(VcLIzEr1VQbpojPZsX-QWIp||%23P$04L^avAHeqfg*@J+9ko+z^%y;v zEidt*i~1#c`jMWrwopng>pZ5E4KuBQ`qbkI^pv@uk06*PRgz3MDWrloqZK?(=#a5v z5;yVFl=UU;uP1%P+zvtC$If{^{_QQ#&ljelA-a7hVQ3WhJ-fTns4XK~j_kt&0a!HP zF>^GPWtwo*Sh#GqkHd7}Q*kGFpVzkI;xF;A=VKHc99?h-J-4gZ1MjoeX2MUzQjzT~B$-a}oV8rB)fcW;xp`reNKgiDc< zbOqs7vAt;D#%w?5E0y3|F@uBWZo>X3k+m{n{z6PQ5IeSdXP_i$tS@5e%8V|F8t@b$ zL!~I)rbAbMw35YFtDb}FY}Q4xLIQJ9hDmc#+A3*-`Qi}P7WA_|(v=({!y$tAPT9yc z!;fQ&jC6h%pQzAGc0eG`QCFRV*KO-DcDe_G?w0>f-|B&W1QLSekus)de+GGUa%g`* zs-YH}CK~a&kMP>DMSKiVCz}DPEs{;O184oBy zUGjL(X$%pZ{+7vyyeBWE7Yyi$wv%K5qQ`V6NwBPFXd|@{pO_VzS70YN(YvP~=zY{d zwfD+bw-!x-R6m)&6K!~6vP1HN0Z_5tBAI}rv&?TIi(;9Q+&N4bj|H*m;GmjpOuCMj z4e%3qaqYtk&BFNB`&F!zeq2C}tl{>Ha2}%adSkG(SigB7paO`V!Z%0&x>gW>jO*K1 zer2OV>-l1AKRZseF}gZ?vyRyL%iwLkK4LecMdar1>ljp`4HVSlltz4Ctx z4!+HkavGMVMgJ zAS&kb4p-u-kfZpWcv4<>{{IDH_JpK`QV`^(rU zj+xAaLe2=T=Py*V4j9A|KEKfub*{$tMdOZ`UXwSTsTx`<%8bgYShKI*6ekQT z?+XIU)Tei7w}Ma$gRrehJz@S>9fez7j+AFjSQYr5TJ}&3Kh~u}Q{s_+Bz1>;Bf;bG z`HIU-9@14BZNx@@&ZjaVb99TGkZ?m_c5o%mrjod-2;X#P?Q9nB4n6lr&wXbYt>@5> z5VNOzO3}q2wf>k)YlS;)M{>54^xN&s*D=)^8*T9_;(ItA{YHz{CrSDqjr=S>kZP>4 z2NJwOV9R0zL~1s|XD$QOIv|b<^6%smCCj<+v&})Y7{IbmHeDzMIY83a$=QPDCww5^ZVSPziGvOF+mkBHA4{@M=6lR| zCBWj=R+O7RPQbTc3$A#`7p^dZNMf zLbg-3Rko}0&i8{GwjFFYnfGb@Il4LFNlMPin&8tnAO@w7prG{a*0-~0mK#)zzVl>Z zqW(5M?cIw){mYzP+7uN6VTuN}M=Hx0T5(ys+nD#DpCC4UUgY-Bm*(%Sy7)7<4zwu+ zD0@5%+LD0Q6*=3C++(T$TT8xK>CpvDhY@)4LX*iuX+_APfiZC$zkTbs#GCb-%})8_ z)d#Qh-uC~<8E>7tk;&VJWi6k=1lF+$2ocTtz3RUYOG*R_A(iigu1xXqs2|6Wzw6D=tQ4ZX3pIE~U$)^0}B??i;4E z0Gbe*K{5Ccw)Yf(C0Bw6xdCk7U+uF_wPsFl{uy`Sict~yJ$*`p*M#<3WTue6!^Lvp zHCOJi#e5IT20PK|e4MYWVGWbhnQv((Y^Jwu8;&~It+`$@M&>a}6BC++5d6G{}8ll(>ckf;% zB#AByb;Q2%O&8RE%x5QXdgKfZ|0XjAA-bwN>`Ycmk^rvP!O26qj}*UgYq%+mm^jP9 zUhVeBRd*QeAIdIc7;2!Yz|YEc2frgN_FC&jy!97!(f1|8DF!G=_T){A{te7gFHuSK zBCAa!?|3h4qc#EX|888eL&dD1LpqV7c9cI4=Ypne6psyf9W6--*dmSW6tprJVP zI6x4*P3QEWxItK$_#3538k<P6N{GlQf1m=0Qk z+;KH#`OYH>P{QNG$z8Y|xmDc$iUU~_`>l@m?iA)M>8kH`otJ>V~NWpKa`OmvzZPhFtvRL(h&5At@0w`XAp2{hmVG>46 z&no9JX-_`t3Uu5G5AZMtWRCf&+NEkR2KmSaJe4RAZr5bk$$?4U@a`kZJ)o_mR)f77 zCxh8i_UI11mK=b^zaHr}Na`DHxG!L5sazc^JhpDtPWN+BJc&l()#7Cw!geV<5VmDm zM+uf;HZa;$L6AgEoTbAdSLx)@HUelfVBy{9^WxIM$N%VWW@j5rV)D1R&VD`5DEcVl z5~U0?O*fsEK+;0pDb^j`7KZ~_hxdrx9mEbz76fdyn17zi1U%J4@Kl~ko-+>AMD_-E z&$<1*SYBSO*?``!^p}ce&z=(&8*{E#?$|_rVcpSe?LLr0`r~$gVRjxvJo?ZW;`5Ch z_#FxhpD$by2xg1=Y!$gtG-43VVv7jJ&X)JneGp8XqkCf7Ms|BeXDGc3VG7}`5ATjY z6y19V-eN&e=QJ#Xa|_=?6`RC+oOt&qKbg7q+18X@jL>6ycNsTI%7HmB(}-sl`JR`R zuo>`XT}H1|{d@7_>(awTss7i!*{(xE{cnU=K+n2+YcBG5eLOjBql~8}k0^}*Bk?YU zQQmLwDW2+K8-HD~bngE{+j~Ye)oxwG!GJ+2QIIMS6c7~^5$PqOQWOO&fYPE=Ap#;T z)KCNjDFOm2NKjBjgn%@up%)QDHA)Ww>5xzZBst&3eV_B5=R41j_s2WVj|@h1jGeu& zeU-W9nrp7T3bnlvkKmV{z+k_^mn~7^YpAH37-PfmwvrDi_tBCu4U4xwCkAF6io0=V zvEC}~tFX;Wfq8)y{2~#wjWA{su#2@2+u2}o=9{6LrO+1t&&}V$zkR)uBs&>cIC^#Q zR`;7G=+}7^YEW8Xurc+S=+GyQI6KI36IG~~op4L=9rIaI7-8~yw;FL9@XbJEFjy!x z;oF4ZW$1-mi3PZnT`RP7T)&w`YG(f z4?W|zYlYa$^mXdyodMU<9c$;L383tJ1um^35mLg;>rzpt?Ll z9@~P?;?~!NSdqt}>%1UM!7J5^z zwkn;gS$&`|CD&z1{*0yl#Q@*vyVYm@KT9+|)A?}BXp$T*T8?K5bU_8Cz= zT;6Vmk&s;ced#PzwrCl3I`}7H#X%obR<*a1>5$m-DrV> zf_;|BO*Q&-z6)!*vb+I%a6e+o9`<1|Yf<_!+hUg)HK7#;#gte^UFlVN?EV4vEgt;J zH0WRmsmPi`PhtlXKx#aiut)-_aof+xP{PU`O%Q3{=Olmzrr8uiSRD_oylSwu*!fY~ z(x)$1T;*YdUEZ>L8jft5#c$L6sLZE=PyHMePJD4hr&yecnie5%Vs_T{%% z9j02Ls-WwA01#tjQ=Z9(AgRE5dr-x<*k)^*cwN)r9v@b4KG^$grl@gY9?qZjjYyiGKj=Sas{5IZW!j(XgE&H zO>zW0i&~Z5N4lq#CMC_A!#xcZZ~43QKWV=v!ag2^E~6%ZV1FM5-ei#yk8^MrOn)3p zTCowps-Mj{D5t`)Cv}|4=6)-)w-WUXv0@nL0O%t$k$GT^ZB<|qx3Ez07>LmBLj5L= zDCiKWj5l(ltUXQR!hxrO0A&B5ZtB2?uD*8TOjL$ndfh#RO$@Y9tt&Wy^mD9enGsfF z3E0O1!kWl&=#k9vwl%B_{d!tDB0=(QUcJUh z@~^J&tVe`EiwZy0^lc=9twCl2w@pE?;;%wFk)=*e;4u{fa11sO)I}G5SZxm8Ps23@ zFt2WJd|PcSx!5@ShkQ$z96Dtsp2K@s!(duqs|j_1uE@GZX+v&^?B*#;vbYd-%r`(G zUWgr2#L@(ow#5leNcv6l1Ha1BF=CCaQ^RjszMLcC(z`|~#2dKc!wAUv8QgxbR$tPq zS&abpWfwev?8q+612b`P&lLdNpW@%u2zW~d0{Q)r&(0IaNoa#>y=&#p^Jo8oV(Ozg*bKNS#{KFB$ zNwRaC3;LjqA79hf9c{HM3|bG0LZoqv#8*QP(MFNL|;qd_3AtlC4}aTXk@+ zog@YjmqJ6t z1se${aQwR(>FmJeLlNlE)bzFLdieLYZe)WaT zPNMtDMdj&=kqvxE{tR}|mvw~*2)G?~0xP;Ki_5|lw=fUbWFR=^F(vrdSnYe_l-Tqp zoNK;)qOP_?aN-A><55tlcll^**UK#*O6*_ImIR;VcQsBoVv5i@wE)ztnZ{?*M#`o(xq zGN?*GFwRjc5@gELn_v6lJlx((y;c)d8Om6cF_5-TVw<_LUKpTDhk;y)!GLQSm#cVY zfG^)sqK9y%*c)`2o(`IR#$q<1}Q`Ljve4#%V`pR`I#(QjuK#Ct640$Mc7Fd+sx77hR{ zJ)AU9>k4T zV+LiYRzeEs(Ob-nvE}K6^v+>}kqRxfR`fJ+5WzCkk0H!YVb?4MaKCd|hEWlO`JA!s zqgNrD@Yq|70}>jw5+@_)u0K5a>_gw?lQAN^Gz29~Bxib>v-V!6dek^1KwC8ZX%RKa z!B)jq;w-a?VAskYYD1a7@#%FyW6*Jr=FWT~&GP;Whk8*-%o-q2+XbS&&w|y#fibxL zBjMv5zhS^bpYNydpZn}S!o{ls+A@x>aOT(Tp|^}Li_P=ApLzWx44kB1k$kgAMCvUb8_hB|~W;R`@eLmWp z>6Gjt68$D11y-oR)CI(~KIy2nhU{_oY0Y0GZ8<%Zs^N@1U|Y*TD<(8I;&R zppAN98rcpt7f$}}F7bXUT(x>+TKJ3h(uz^nkZ1gk=V09#nmi*`J(n2-j?lNSHweG* ztg9aY5V+@zT?;(Kwk%3qeZYX8zh`+he!=?c%oS6tof+dgj<_85u!m98s?VVl-4EFQqG;a zdL;gOF1=pMT+`l5%Oer@<0P;QI|f+B9UCxPoLB=useUZ+g?h^U6e;$b@h?nZi6bl` zlDBYa`fIYmYvq*A7cp~}bvu3t=+sLzRuMTENGd+WtM;O}V5=M&{oH2GFzTF}iMpZ+ zH8fNGF}mn;0sz77*#!Wq$Bu2E>V|#uf77Ghx=v6a&q4Rux}^^vi&K$ zsv>e}&@$j-_Ulo5g^oipz=N>iCY=3X>&dIfq3yEFH^E|^nn`btO&J!u=KD$BNbcsQ z%2iY4!@S^7XZQQ$eD=~v{V^%QGb<{#-~Ci)wB&Mt7!UvPuBD5z;_opX@s`gswy7uf zn)b&Y&;>atO$_S?me*)u)?7+UAwV8c;Iq9qf{cp{=FimNB=@cb+#~UKN+qv5+I46_ z7!Uwkfw#yeBatWo2H_RJ6{#U=mv#&Twb&=7Zvc#^$Wr>PPeJU(bdtMRCBEKhWF)t{ z`1D{Jn?h_h-efor;`xn|B)9s)yaxeCP7-T^z_K@vpN zm?qjV{s2j8{!9X7HW&(8kG8K7xGjdPFlJNSk1yzq5W+?sgYQd9ie>sAY?WKBs~cv< z5hjz2!F^mItZ~jjEmn3LqFfcpUewRT5$MakizJMvqaE5y6KB=hc;( z1xE!cqBeEaY=2KF^tW3|##eR)`;dB6P%DmtxLt{`+DGUwB>8=?1eW+C_aBguIF{1b z2;(xfB{$TL7Fd;o`t>;L!5Vr-~#mn7AElb^HS*?JPr%_$bE{D=)t zRNn*|c5FvFMhG-^#m@M?_~*cOTK_$;BMc{%rX$qHJ!SVDWW%1u-aTD3Nze%V9N1_~ zz)kGz5Mt^e_;;FMtse^*m*3fsV^(Kztb$~{`xfn=<6%Z=1hou=kW=T|KQErCIp33$ zYWpkYHuUYqv$xk_1Zj!&t!DJvrHw$ajVh9jx7Wa88Vos$BxeMRVY^QPAPNO}0nzmW z^;XigqKYqliH-Kkl_nd? zkf9K{oy&cHnvwjk-Ds0}lG;_IFVR!+&1)vYqkcR@izC=wq6~B%#j&n9g<}`EK&Idw zUx;cu(g_=-a9s@dTZs2YxNAU%f$D;upMXl62lY>9lZ6%HKmkSY>C~ws0dJ}5^I;Z*}7akzlgH_mF`m#^8006 zUfeakQx8uhq`9fKD#V&kr37ct%Vc8KD_~GnZ$W;kQKSJ2K*tlg2^@1;H7$t4+ZG^(=LLJ6FS0~a~uZGGxu(A`^0X}sAuq^ zTd=O~TPLcFnV}RwSoWER41$(w-%-o(X<(bSYwF>**-Ur_1hu|?Xs5zXPnoGkk;{U` zQTEry742j9JcbqWc#euN-v#pE=gTc_pL0=8wr)QfZ}?F_irarrL;Sf%+8=5TZ*+kP zTns4IdmpiD_GOb2`@ooX?v7~$ffZ{3VZvyHCIlyabc2h)H@nZ*bN`FGX6Di5+kCN# ziy4&HT~tsP2*LQ?DIYjrz-Cuh;o75_rg&AL)~7l#@fRg#&Ehz;o~7-A<17d?bcQ8( zb*%F^-|N`nUB^&lr}zZCe)!c(KR<_Icgm#S`pn=;Zd11p7V9~)pp=Jj%^3_$%w9Df z;i@uY>mVDck3*B>I+1AP)@k(wW&og4W{RzljqY0~gL%OX|6TdT1PzalL%*|*Fwg)} zDUB@z*`O=eIbyGz@=4sM`P|QBvZz5S!@B|YwF|}0@S~!hF)q2k`*l6Q)z2dlK1k+F zQrU#=MJh~#0{QqHD45{7AR-_&k8J?1A*a|(7D%4t>cDD70FZlSufzY@InujH&WT7fIn^Dp_$&YT$Kr5ldpU@l{W!4loQgN!4( zuclLNv(|@dpTf%Zl}3P#o)W|Er}n-}lwyg9zNv?jm?m# z&xqxLhgwuLbmD|dCHD5Zoo9NJ?f6k?j^5ByQu0#d;v|o-3tFN0*DMX}KOu7g?zbEruh}0k*<5aryOr= zMs=PHtEXb-;DMwYROl_bq3^_DdL6Oada4^&m51~j(yazbqrQ>GY{H99)t_x;${zCqJ4eb&)X2NONdc3~|&oi2al zg{?e>e07>>6uI`!)m^e@dLbUQj+#g3dgns_VrMJ+|?6=p$moz?#!86DhR>-q1ZF^V18q4PC&i zb12{Gy)&qG=-k-`*xN&Mp!ud73&K#Us!E+e@p2@YpJ~+S=y_~pbVwBv0D%SbEf%EK(xe7%#F=Ved%%TbyYEvvDI=jc1t!B#L`8kBv!NwWR)vn(6|1e zm7yq)t-an!8N&+#^{gY6p$(gm9rJgf2l?C`Fb?UD`QojRrM-`GWe$o9Ley6TFe;;%KeuO!PV;y$E;4s^OAjqh8g zdKqB&@U4J)0tmDRenG-Rb`d!)koZEsKou5gY1*(kwQ3VOz8oDaLIb=lLpOKKPdz9T zbh2XRJPZiRMyhs<$LlF(Y)`_w=C6?ubid5dW1+~rBvs#m6)_k8T9)PAKs?D9fAo2r9aZ~G_(m}j*tePgvs>U(* zoP;1NK#pKr0Hn%yR6wYMe-|v!GH!f;p(L0IFAl9yQouNtr1*+6-0oiDGqiK=kPXZ6 zh+!=4`cmSz!2JHFf4T|mCf11^eVZ1SCQT zOeSCf6G*)h0=*1=3Ou6RKRC|L-Gi+0Qdy>$im7D?0y z{o&W;Wd(B9AQa(Vr*^U;eu9`}2gg#gE(FEMye>BUDDIJ2W#Zd+?1m=QrjVK2@usy6 zMA@HJCyztHPm?q2M6lgeV{`GTpiC7 zTjA8iS6=JOXBv1vg^r|(a5U{)=M%2hSPiS4->FUEP z2c<1g0*2j0w)FIMI({f5SnX$w;@{ROV>_w>PyYk*2s`r$vi_c#%h+Re;<|&5>M2)q z=vWlq5X=FF0!^r?ym($Pb-OU_tYx~NK>K*eC8<1idw&VtVCUCNX*v>2gzSc~4NkDm zdJHd!eMgooH>tkABGlw}ydflDC=xWv>j=||^CBG3^aGDJc)Fmq;z;C)!yV02)46*0Uf&SXHm6RW*qL_7{dTBpoah#c}36-X`N&Y-ycJG6JDTfJv|Dx?9 ztx)ZO5*o>z{$-< z!?C{r_TLo-Tlaa7{qA>B&cQgDMe)5|JtOKArzTdl)s-UN%ByeJTUS^9z-I7R*@MB6 z=fdCZ1?1v6+kg_noHRQI$fil7Zo)1P325vRkeg<+s)*NQBPWQpJhK91nV{E@S#86^vB{*G4A-i+(h(px)H6r>mrdw=f%aBC2ssVXRcpG$X> zsV?`BzJB`q>dB%RpXwB8ZxJyuiL#lszx-}tvJ`BT%^_OT5HjXG2JcY8t}B^jkOA#? z)4Qo(JW*Vu1v*Cj0}{3V%=MNbb zL67Y#(7fV+rquE+oByYMU(7S97cp$U2&5FjKjhI>SWRZw zZQ%dD25>0o9@mQF3Or1)*3$qf{F%g&QN7GNuN;#E<$fu|rTJ($seaT1N}u{szMuTJ zyU%kLEcaZ^A!?Q!BHnzbcQ3bGUsc+Podg)b-Gctz59lJ3-;Cq1rA_rqoT84t%}0Ca z<#}pnSSWETu4o^NRon%8oFbGxV4Z_)U9yVyY>sAHTff$4?29iWwN{Sx)e1ZFAq#$;UOa&cou_n} zYU+~XZr%DRmE2if+4nn1IT3R|^xU5MSpJHSbLc!~rV=pOQK@2OqsMvpRt*L+1ssJY ztGk3{k1C(L5^_$3yYO+XN82~#A?)OPOa-fP6T7W85B$2}Tc^OgBE|hs>yG@WF~y3k!j#foxl_933Y6%v+y8{g9hC@+#qtZ?2*~J2ABK#lCLu9|kv) zlYcx8Qrz$%)rq*kZkN-&-*@Gp?p^V4$6U!YXocKs89TnO75d0n(w?8XxXB0}#**|{ z-phz$6eC64oK+9BdVdwIb)m+wyJG&ze)$>|erqeWB(wNA%!}eVpX>;c4S^nvY<;E( zRZ|G4;;+QiTb*^b(r8}}4dJRh9s0`&DoshYRyyat?#i0Yg7XgS9^QL?xtJ>_4xxSX zxg$7QN)HO>w9!sDvq=qyTDLWh#bk=plX=M9al=A_v6@5Z=G)26GZggMlScYhlaKf6 zVby^-{(GdY{FZ1SfHpSZ9G&rETVLNrl$U~(YHL%PH}PUV#jQle_6xcf&b5>biF956 zU)XR9WlGauSQ~slgl!ZmG~zA{9CF0G3pV~9y%8~(yW5|nXx3((3N@z+=8^+Gvc&F` zzj5dOT~(Ta&=M~x%Sg4Y4|(K!FhpNiGC0@={|Rt&_^mhC#WqmI0(w8h{&s5ldcY?NwQ`kV2jKAE!h)44QVh~5+4F=pCyo8pV_$u_ zPnrIq8;PNdp{R?2@LKAz%JCDD)MFW^y+WlEt$q!En7yR@Sf*2%Ss%;SwKDDz3n#h& zJ>?NF`7E0W>svys&x) z`CY2T^g8N#$SIe!rI##qh!b|aaY8`GnCDoeKnm?I`*rrfaA`YltEx?Wa1*6PLKGJ68iyshc*DXmp{Znex79= z>2XzZ6`eX$x>LG(yD;HA?LTity)7K zDYK3v`h5pvrT{etY3KcCzNI+JVd+?ipw6pYdx!Mu72zCU|@Gn>f(V$;csE@ z^*<<}QU|uLQ=?c{%)4l@YXG(k ze`x^roln@k`lsJ#sWugEW?tIfotnk^tMFHSi#(P3Hr5OK<>><1ivL=V&(pc`Ji3r26c3Gq*h1^@R^i@M_h)$;*SHFp1SRLc5x1bKN2GCQ`uj9`Tw zhhF?IrvCT*|F3kYC zN(@s9vLzZT4-O<&KEEtm8HPN)Z}#iw*bA~yRV}~zKQ-u$en3U$z6aA^RGx{@!bC*@ zK&ABo9M<2l+Xq0Ww5z+tHJuZ_tvFErF_6`#gjqjaJu9_pA$L5nrflI(^~dQ9J1q?} zSs?9vu*^YEZWgq-ti0Wov6;kao3zB)9MI92cS7o5a%kVKAP3O@GLgpHR1gn3;#KHQ z;47jLw;@;x7IMc0L{{cGu#Xsvj93oS({#hOC)gF*PB_IiCcnvf%O1N1Q|)Ly=aLYq z&5uDeiPl(rh$8O8i+h{^Fe*)PC?C!am<=?q@%$fUw zOnjaL-`Qu6xZgfgU(tcZQeARG2@i~6n5O2`Dw!Phf|QY-AugN7n0RLL@dX{NFAz$h z2ks@(MIJyjkV33LF=b+kSRlb<1AO0}*n&jYN9Y3bDNaIDX59E-$2*rBE@^2!CrcZ@ z9ddYD)NXcW{s*U~)5niB96J{1YQL)tsFg z#!Bo}6YFD11o~6c;%lx5M&(}mba(99=Wb@XwCVHEq}|_PUyYBfGi1KQPL^WwS#{>S zqL@3(*VxGl42o3+4)%BUS@6=pThxjM8@Yk>TckBEboHjLe!6Gt57_mgJNA^=%tw$J z4ns0LvhE-?h*42@xaagj;iU1254=l5o=I$usy|>xUkmGiw0lgH)y?9j;+`(8S-$i} z&*$r{{0RU6wx{iOXB9Ak;0{>NALC)EV+`8{={=>T{h!xi7pZMQe3I#q)crSxp0lZ{ zjt7{xfL77S$$WYftC57-R?7d#OvO%CVLWF+B%agT4J!(~L&G(g(tf@diq=%X=FcBc zN%r=3OgCvKoVc~q-+AV&k%pbDKzAUNX5N^-%y0c0!>?1>Qx=`ILrR?b6X)lkw~7$1 zm$r9;7OHL;{s&M7rl;ec#TDN>>iS%R@XHH!-JX%sM08{0NmUQ|k{z$Rg+*B9x2ppS@a5j3l z`Pcq+cV5e`phv!jM?0khKxY|&5TaOyr$rq%6&Aq|lKGw~+%sO3G|rK#>*#Y&ox4~X zG_C~h9~0V=%=e6g*=Y0E9_2sr7K4}gjnVER(Z9S0Ep%l8=3i{pSLzQuO>Y1Wc`6mD z7NV%3QA_>l^FqZZ74@HUo%wn1f;6;UGlmXt#;qv009Cm>D-u0K0EE*?e>^i3>b!xD`sZR;QCsrSe zqp07_)vo;K@=c-RXHI85Z8@fq=X@w}eNQzqVob0`g?0pQ+s*pz?)?DT;T|BG{Q}vl zT(U>8%__l2533)S-NE@)=EQ)Ht{i{o z@l_J2JE@Wb;$5IAW2pCgEjl6~&Ylk@_VQaddA&>|3B#)cru3ym#-~FwaN!9SKtlkc z$pnyI#Qr*qRnCIntYv;=@VNSE?sLEo=eU_%=c%!jhA^i_j)ScgLh_^zO|(U_B%KFS z{v?rnvW*TG+SbP1=s9bEO?l}`uAUBW3HAod5r}fZj?3|HRj$Na@10v1QLemqhVTPM zPp8c8EWR6(ge~**hKKjtL+3br$9P$C7<3zGt)4e~(`x9_2Od(ipRj(!*=DuDJFZ78 z-?I2oZ;sVPF~QJIW(J}_9CQ;qll}<;x>Dd47~2t@yYnxx(}w;(+uX$FCW}(rfvA(QB%L8$)lipr5RwnR(AvwFyZ*j z+xzXSn8s1lu7Y75`vkSt@qIUiq1`x8*Q_!>kJ_zD3;uUi+MF>}mR$X9X;i3!Bi`Wd zA1IZLD)*_+Ym7HggZid%cB6aNUnZ%;^GsJ){6cd^38K&lA`TJgA?>D1c`|m$Vf~3SVQ>s(qIwy5* zYCPA$cYWHC-;f0mp9=_!ig2vntB@sPJvK6nAL!4TrC6h2{!Gm0?gP}<=>AlLi73Nv zubJ<$#d)q-xaJbRppIiz{;S4=`YeNl80>s3h=-3uV-RKLVT%8NNaFdhC4L!D7I&sXMLfGMM1LWs# zU_KB0@J%sNtk7U-Kt5oQ^mYH`kU+Z}%zV=$v_Jb7t9NYpE(4-R8EbQW++UYwq^QIQM6mPB{ zTC9%iYv{emmiwJ*?4f*xm`Ck??G08-!d=0^q#kV$UL~KU;+YW$z-m}^L$Ty@OdNLR zB8h-x&Eh|vzoU7Ak`Sf*=#GV@4aRI`#4hGnTiKo?^;X_DKYyh>H;-Zb!gs@ed$J6S z|Mpe9`W~pHsqeH!!NFeO4%l*jEX}){KGfn5Ycl3+!{+I^mj2prF*Iax`J55&FN#&j z*-w~u$o{$cdZa4~R3@7LZ9c)j`&2xpppPgA1}yL0l0(YC%;*X5mJ@g}qQsUo6@IH( z-)h~DaAe;afXEc#H-k&V@lVs@s(LO84DCy*n)Y`5pJ_ z5fdGgt0BOzPO1+tu+@jU%<9IiT&_Ea{iTIm%M^vI(FrbC_A5tE^abjQ7DK8nn<6A~ z`H~Z|lzJIxntRiXCj9*{X0U%=-7KfW<32}~TN3I8LVxVG(^&Jbu}@cqr=u0VM5JnACrKL}#WK20=rkCssn zsX??<#_^&|Ci2|*t*Gyv8RII6uEO-yp?0-t~VJ6fh|Vsy=xnWm3olW7B_~>+@3!XREz1sgpl+wh!o9(%;i= zHGw%{`$c`uhN$#g`?jD*eqGN%{2!COkJP7Sb1jz9lg2|>mL8HDOUfZ^3unPE744od zzCj!{ss4+fu9CS|hg!a9g7eDtc?SF*dSoE{xPxS#2)mckmL)3hXSi#Q+)NDeDrC3I z_muwPi+8tS zjbj`btZDeo9)^|!I%w}T&*Rc>r9?zzGej5v{gAw<78INzH&H!<2QBF>P}Y|-EjlHS zgiU7HA52WbD&7F05+R(S_=(5xB9)o)W+hMe&7o8ie~L6kDmK13e*I_91u=X~umr}q z#dkJnLY%jEd+~st%<}_7I?~)>iv9h-2G5<0;C4X`it>g#IRq579@CWx%gnOR2o@j# zEr1Hckv82}jS#cCL(gqYM*G*6I*XAGUe0#Ec_3*%iA`)LH1ni;n6^6oE|&6OA@Bs* z&r8epkF0^?YbEV_P*2GtL$LkEZYitNi$LWdliPw?UmdfyLBMcjiGE zNO0J$`CB_Cjf@YkG5n;RU5N2-UD@iF`!RRvtQhxmJq$&*2wG-LHfF=18qIH6(LFDh z6n%ZAS&=Fu6Em&x_=+SjdM|`!6@qjGrAC)ZY^akOu?i1j>N+nP2>y2AJ7d)Bnu6>09(P!hD;-1vWxo7BG?5LZTgaMElgg)SV;M=H_`Cv+?>Oucv z`@OFEQ>yJdV;1z1=CKupIl}tpU!WAb3ra2iCn%MV#&Q&D-pK3l9e=fMnfj)t^Vd7z zL0uhUZ7i$#T#-}@a`BrK`KZCk?GJCpT@S8l)W4fR`$@5V&~02E=Gt?p{H!s}Ym(Gd zF&=ku@~mXEr6luu0BOMt&N#)qJwE+AWlOH}IcWJUD>m*WqWz)bK^8CnO}g&5 z)>YQT#%hyjV47lOl6ljaKbpxQ7Ydg5(e-txai2F>hkJpYcdm!@I{`HxC{%hf!#@Cb z%d*r21`D8u*9%o7k66)B#(sZ1rQ;$+Y#$r3)lc_U1R}{}aE#QIYHNPu^1f4g^U;j= znq)t4b8MFD$rH<4ht~1iE4aT+4|4MZ_31~>z0)GGpT-;dQD+S-Fib*ORTXI~ z0;tI~wna~d7(GC9rAs#A{K$%e&)|E#D;@PPNC2tMxXitSJ`0~Qg6Qvc_f!lB}I89a65+^Q&~9o`;KBA zQy0H-B$#P+%$y5=sIvk8SGH@frC-a&*qg^Sn3;*N``?<$f@>i;SQ28>jjyrfY6iN9 zx)lDN?rxZ11S0M)Ut*JrFP}YUbY)$3_-D!?$Zg*Px}NT*gcPK^ufCU#*X1tExfcfX zw1YqvtGU1sq+=8l_W$x+0_V1MFpkWWGw#-lcFG;n&Eb5F_`=zidZVP$V2RhrlO(H@ z4@gupU7ory%{pPo8#D&GmKKcI?C8*4$L|)hex#~Pq;L-LRC#qmK4n)r-tSm?Y<$aF z>3=8Lg~0J(3F>n8pb4AbQ4DKe5@?otq<|q+O*49XD0zmj)i(3zgD+DZTvG@8)Fkc2 ze7l1ENj(-=#;f35z=bM+%s5CR@3sx6B3aQb)65kd!>6{_U6jrl$RpZNWJY~v$$aHS z2Hg;cCKqR`AAvNc+A@mGyvH01G^W@MfN2N2F7SXWL{l%ZqPzaSLR|(m9b?x9`X-t+ z8CRq?38glkFG-aYFg5Cp2oP}4jGuq*FUlCg69^8(ts|KLp;q9SCsIR{kYqy!h?(9R z8v_=V&|0SHInl*MP7BW_^h=$cr5-9RFDs9Ai0>;uFUA&e(@*j~D86B1ma!qZ&VON} z+BO#bw-ohc-JF-RAUCMQT>B)-d}lr2ZO zAJK~xin8TERqdfwxGA(@JP4*ex$0dfF^%s z!aJ-zTGX}d=S$_q3j4;wvFZwOg}(SLomFq54KiCHjqsTIv9#|O^x)OCoO@P$++Gk2KHd0FJSBB_Y z+H#9FH+4Gl;UdEuaC9z1BiGZ>hY~y$kDVJ&+Ox>J_c6RH{xQ0bhLU3q*KY-LNs2jc z%CZGI#EY zu^qd|RE|m3R!CCy1>V|*t-3O*QV@LSI$-cscSQmBKy2BgT*~Ht9XPS;Y3U7+$m_$0 z9WMRp;8SmF--_9alJsunMb8guyu_cDtON;X{-eP1J2uB2(N3C5MXymBAPIXPK-O8r z3UDR#g~O&%6NG&;+NaARhnoGZ>)vw9|Iw2X%eI5DKUUoS3A$W0I*)PIaO46a<2S~( zQ6t@#?=s!4EVNx!R$!#(-{;W3lD7Yizkwv$4uwgI@^)sZjN?vwbNLMUVo%*~1|Cf= z!~Ap22Y+#|X#0bmH{o|Qz^)bMB5D(lIXo&zo?|w{)}vSZtcDGGJEbzxeAJ|OlCFF_ z4h0V%QAPnShlk4&7@X&^jf1p*K$tv(Z7g=t36RPjV+oQHK*Z(t6G@c>Sbz%+X7!p1 z8bLpRe)=v%153BG0k7k2^&JrYh3hj;;}IZs8TpJI*C{+216c&x6<5qZAgstmJCFqA zK~T$Uu%H^$rx*k`d%uE2^Z)GzR{AJH&4(>tPA9ayPFEKTJ(X#T`&1;!I$HOci3>iT z+pId->;08nP7~vFXg+z__h8uGsSefqi77-aeGw?xe>r%MRTmlvHWS>X^t$|ulWGS- z%@7y&A>tsxF}ql1)weYv8p~6`C4zaP2_ zaGL_@6l|n&n1^)ExR=DW7i?=4&G13_Ce{I(>7U5+oy?19#VO(`-5X{`b1IKL+K{ZO z3MzrJ5l$I9)RNVbYcso9lC4zvGV1QtJVz`1rLrs2@me0ZWNmdh*;cqE^-M5;~ib^R;FrTIBg19WkLMPa;9PY!+EEmQcepp-}+jAW>1I zrp-@be+)eiNCe)C7^}o=8M1{FyITF)nzoZP{Ug2^e2)L})!}{^r`>bi0OG=}!?@_d z(oo^nD$N*6u{};vP;ELg5s=Uiq#;*kj(_N6<*_0|v@!iy7d+3<*zhIicP{2;w8}fv z+#jW(^svke+6+=wpd`IIn{i!*I=fM!Y@UkojSN(t)ZELhI-eL{wnc47d1ZB={<)5@ zB&ioy%vZsXW*rO4eNYnXBOAY(Q^oe-nz%a2xC}rU%hrR25;+vYo-z=Le3~1KC{KKEGiUK6)AUV- zyoYAGp=;cs5;5-N5IFR8nN?fMd1q~5dacyWAA?%srZIziBW# z%T^#ZF*d=~eSbP$Y>JH2-6h-37g5;u;=!UAUFo^3|27^_k+ z_IokFy2d+Rk1kJhw^bX4q0+w=9h9j=5MM>m$&H{P*nh- z4yWTAMDfu#+#W8jWpxE`KfOzV@Nu^BJl6QIPK%lV|_0-JW^*( zu4VC(2`)@d1uk;!^)ymfe63s~LReE{0vWZP@XTk#;_mGG)FlzAQ?%!75WC2Bxmf?z z7{=P9c@L74{G8QE;Ny&IcYcZQB<+*%xFBA^P)dyeoX<~iG-I>z_H-0wL}fxYa&Jja z+xg=qN;Tczv>!}D_!PUT-yUlPJ(gR2L>j~u+ZNGH^8{}~(R@I*Bymj~Db@`mn90Y2 zZd3G2O+wpCMN8#o4@4NHr@k9 zGOm8l1869+EI3S^?tUA9*&b3chO6bZO7qxW?1MqelHXQt<&|ZX*B0;Xoz!}HFJ7M= zVHLVniE+cI?;MwsZ@4b| zIPujIXZxJy&n(_tmH=?Rn7ILt462wZP8^e~OLrK@FLLGk#J3K))|M5NVuqW=Ki0mu zCt(bMTR}Hgjuz))MbsLz0LNw%F#!w+MtRf7 z>^8>-PUCKLdtcKLc=6mJH|_Mxb}2~s;T6o5s;m?em$HV4efuJ~O#;RoimR%w4$O^^ z_YDh**Vmp10g1E-JaAfyeu&y^HeCunPY)mes?GZw6S>{AbE(Nc#4x~BtDt^#Oj&9W zV_j$I**7(wsYn$M5~A%rfg~pc?t3{l)!&q<4&C_7zu3-bfvB(q+Zv6xWx&&pDVPKA zsh{UZuubZ2d2eYStQrg4>QHHA`iFfsS{33mJWwx9w`F#;rDPj$`{nY?c8)#LQ$5pc z0()!DPqUj)PNNR#MBNy;pE)(1_APAm;Hui3pC$yRG-Td2Rz8>v?77aehyH);y=7D! z?Y1r41b2504Iy}fYd5YzLV^Vi4xPr`C6I*Rnh-R2g1fs04IbQsJ52)(@2$LhpYxsX z+#mP;ID6bbJ7X|17}O|=>Z<3NYp%KG^uHF{y=?-4?@FW~Ch|zHm%3~ZmfzT-&r)9S zeJq~eei$@z#8bU}Bb z>^WaHHK`RzH&@4#0WnB_8sN4(NgT2B69qZxQYk5GGARNUXX1o(I?!k>Qh!xl{ZnE6 zNkLqqLg&x6(LxM{u(4LpU=Z+60@zqU`d?7y$i`fhfC)reZe|;Cc9EjO(sd|1{gFvx z)uNTPP2sK{XfSsvuSImu!`W&3X_p_PS61A8LkUYCkeckIC6^GbS*16LMR~m;(v-#w zpuk}vaU~4Y`&!-fjnl?57&Q2({Y5Df2!5$({}Igg6)=AI7k{CjRb}A$Bz(1{|3om! zW%QqEnm4$sW1(%hKvn7V+9i8;K7Zi4pt-fq&{VktBl_2Ti*s(sC0oV{QZEn-fMZaA z>qGJb<;sV$8l7=$;HAbJ>sYzqKmy_ZU#OH8hm^jdl$;r ze(^#ZdwU5WV$p*(%K`g|uBSl~Yu_7@K$XYt*9F*Ge*EKgwFC&k01nI+S-olk?x%jG zSH9|}MQZlztFrL)@N;V;`nm@@svy#_V(6>H)zn@mbXcHptm;n`x$Ro3+}R@)N8Yco zS9yfJxC%O06j_?wzkx!OPc(KzD^jY*ddaz@IYL0Hwv%ZZuuY2IL@um-eLqaPWy4}? zcV=vLL!=1ua{_j?kC_i9{XP5&_5v}hPbn|sNHl!h2n-1X)HvPQ!pBU-N5wiNn9(6z zNU+K2r=K-Yta)#z=PluHUl?^WAJ;uNhtOt`Kb5hN!6~;&6bh*|koU{V6meV)&9L*4`nW8VFX*w$huXKwE`K+~r>Y-oWKL zKY88NOO+4E0Q2DouSo=oyNfVYJIs~*RyU%^t4|U)W)e?{d!loID>1Q8EhSBPaE7a6 z(o&TGnwQzM4GS9(!`>wRSgA_gYerL2G|+F*Y))goI^4sYgF$)#tGi1Cdm$$as=xyI zwcStAC6!Z@v9bs(fyIAzKycx5N*bvplSoIX}c zfiX3rE1829!*4@)3SgJk@=-5bI+3Rinb>>DiJc#3=}d@TKD!3vvlDZZCP%G z4pi^ipQ>~zCa}sZ(x44+V30@vek}gjE);R9Y=V8KL-Z8x&hp$uI4l>!7g`6Z^jQqv zp)ygHCSu$WF^nG#7&qz61LN3}H}ATSvG=GGmR7ut zS3GHr?%KJ5r+l_kO?z1rVxc3m_5S%_#~t^pZ!kO~l{Q_B%8(B9_8)fWztvafyHz63 zybq-WeWaVj4YpwU@~mOq@OhW`Q32RwAOY&tWE;oA9@MHbORKrk`kW=XJ~TR`ga#xL zL4&v|AM?_SQPRgW(Zm5`Fst2!A()i!$4}pc(+@p0di=&EeXuXU4t<{v5D?*g|L#CF zuaxXp>_FzD=jq(qa|Y+F6Ve%W7SIGq5jjk|K`B@hf+8|`BXE{gttR+>lA`epzjg+p z7XvY@{16d;(S$vF=-P{2Hz!yBLDqVLYiX6UF^)ahd>bh+5D`;jsv^|8WLp;rs)f(gIy<~EX+1unzeY;0xme#A+fb> zO!SAe*09(WQwnP<7!3Hm>}Myv3el@72Y{OYqP>GVSUZuvR{~ik4!2c(NQ# z6^&U^N^s+<^qs-Fs-tY2A_7|)Tl^+#EEI>0G*lwY%>2HmQtYJseV&zhv=5CQI8@FJ zSYbg3Go;=!_TSsY3X<>7F7Z9B=7u`NpFY6zO?K7KHxGSGmnW8VT^6|r2oeI`NzKX| zQ}=&bHVeDwR*BDuPGtNh;LVaX5e#twpw#3EFnC234_G_{)jo3CuRa85jcIDV6$K(C zFAx*%aGsVIbFw(YI)r(wm|Ypm7Um}qN0rY04h1(eC4b4f&+S&kj25&+cZzw&oLeuA ztlw44|AO>S1WRNgVd}&;6lLuv;z7vBOG1wIm59rgw`s9aN7Rgq#pClbV z;QIsz&U?`vJ=bk{zNtUnhF{y@G`G=rYo2sGt@pBv`7`CA=#xtzI0-Qy@EBm?PMQMg zgMPA3K#!N&{{qpM7eGjm)e5JnAtklMgujApe<^5G8{%}~+ZtPg%#xx=WEtPDGK5^W znmGsdol5wFlQU=)($a_Xq8#ZhX_<0aVmrpMoAmilMSFbp!~IE%_nPkN=MTWKLw@iO z)cS8bIbs^N)x=&8%FUo!9jPo#kKo8*g}MW0!C-ddG|(wC(gaEvv=eX7e6_doCvc%v z_SC35EvU0W%GTPNO~OKnC8Fzb7iAJ-=);g;G-kg7ESLFq$o|ek(Ie){@baTP=F_JF z0h3q$i0ih@3$*E=Zo|2t@j?%PX8HanP^%fKZae{DMN&<^jG4BbxD+$As%wgRvYPB} z?k#4noYNa!H( zQkcB6?}Y|x>2XbXStp0p1_k3(Qca#ATRXwScE(640T?tJzktc{#&s%VPET z%!U>c#zqWap{mzTwdeXU|Bre#(` zRm6yu@OZS3 zel3Rory=T|hkTF=LLL80Mo!D8`Df%&tK=_qiAjS7+KU0TX-WGHS~l@m7OB7SX&!+7S;Z9x$u>XVOUIACpD}jm%NZXKGRa zuWJ6W{ElLJRv&yCcCV@oIMtH^@BP=bV5kV}|A&-k2~B`1;F^0Gu$K6Hk{znF1CUO= zGcBBJOP*Vf9;O$6BFy=G$CoIvV06E7v${Hl z%6imUEm)=Wn;NKR2FN~c^*nXFY$x8Oi=N1i((tim7^NVS3;m%fpvAPEH;#ImZAUi5 z7oM~0Yn2dOC7hAxoQj^!E;CT-3uI8Pyl<~*eHSie81&Wto+=bAOgRrZL8<)ctp zrv)qL9F&%FC(G~F&YzCE!v&uS z9-asG!WbYniyNNff>G(VQ!}L$XlL!c#L*D^y3@Yzwk{_t>Zh2!=>;?Dx6>a?mLPh} zLOjkmEM$KAy0;M2%ai^ODEWX~dnUrllh(zG52**Tc#CgG<&&eI=zA);O*eU6Yps{) zbe>A~#*fkW0Ch>dM(tE_XYzY7>Gv$LmZq_{OucMb)CwQzYh31rO@i6@JVO!}(m=Pw zFHiKtYyEclJ)8)4>Sq%y{jWrxsvU-eq*$|^fKXi9@79*cWyqrOl_%XhMF>KFOg~(S z`8<#1n^{{7jGWD`$Ich@1J`~R@p&kF=S}faV+L%tQbY$0~EjZ&h;`txxDVvlO z`mBacv^FC+BVU|y8+^8O!?QaBi@m5d7{LWZf|QjP5MW;Xj}I%uQO+u0g0Ek->;R!2 zFFV?n%*zab&@zq{TQmyif3@?~410r^XZmbeu+V%RO_|XoS2Bn0f(PON5!~X91HjL^ zXV3{FQO$+H!6Zg77)t|EystKvyYiLO24Hy65;P}en8C2WK#czQE+xyu5DL4dV4w7l z%~|Z$Sy^qX9djJTn|H8ZfJ;o!dkFJsL2~he9TR>1$!3bq_aR#c@*n0K?=YWZX-?qu zzaA_PvsR8&j?uO95c|V0@8OgK%ox9Z}S-! zbT(hSg1mcqOJDnJnd3gBR3{Ia4R#oL?R`V*D22Z+2H)_pNz`am0GM1snol6mp6a0t zv$RRz%*>FRz`Qra9^M^KKUnnE#`r|-{oDg3vBCc0ebXGEg&-2U5sL>)8=k4QkN&D; z+a6r`iOt9)>^mlXRb@TR086Y~AP5YzjJ%;oI8?MWAdOCg25K9UjCTVS*ufklak6en z#zaQHHL;;jE-64jw~eudQ2MZ^a1HC7OPi9DgcEo;k>mKu88L8&&KGAJ{F#usYZ-oP zh|;3nd5ImWG(1(|rSKNmR?jCNQRT{)B65{rJIU$;txo>*j1|8I;R~~a-}Y{zo#h{~ zxP8(!%ujlBanBiyM$XEMuTw+DhNbNu;Frf_VkT_s13Q;=_DJL4Iop{i6zYAydggZ) zSbM?TVaBin1Qvz0zq>G~VXI8)<;!|d6v^6C@mTjIiCbdFW>zr@$@Ma>BUFq9QC|KR z$l|dzpvOp->mBq& z9{|eaCWPVPnHiRpDOvVTFk7<27#uJz9kEQdIbJnzc-Bdo6p4hlWOo*lJM0hV5;3b; zRWmu!H8HV_Poc#N--y-|);bDD2l?rKdyJk0B}9?6tD)Vl#SK z885546k=Z5Kthev&&HI&-CT}wSMxAMD_p{_m%d5yd(RoAjvRlYz~&7>1??qxCRi%# zo;o%pXeSEkbq@T|@%uYkwEnMuwuqk$X`F_aX7p~gw0oR-{QHP+@Z4lHW5KsmA+Dg5_(aTR@$At0I>5`EOO0obe zN~O{heOeTwg2+7%*z0s=bbg|#as^&ZyWvM9RW{cnUz~)E)n-0)%D*N*jw(-n7`lS< z>$da^ik+2oLkAK%j#^UJ*Rk~RG^c?C*?=BF>}(I%s8vnMB)2p` z^tBh^U3Bf%cc=P>XzS?8sP6<}u{q^KTz66@?mDt-(p0qZxe1bwN#pzQ;^{(h4(!k^ zsxMo~)n-d|7K|r(JhYBpC z`h_IiAMbQGm^WhYny~Z!!{hqTIO4zX3+-B8XFjNZ3VK|AUi9t1@V8lp_pHEkAM^s4 zKQs)wKz~Jg@DquMf8fA5q6@SmCdggE0ZMRv zL`$*qWU49BKyzloSo%1=NrBxM^K2nlmUax1Tz%rTahKHtrC`L{kV{o-2F!ey!pG*R zG_q5$H%$uB!DT+XE1Ts}dgt>fz0y$kuQ_%4U>bVBjaR`aD?aY2esAt z`(U`Nk;*FYLLb_faltv-ss{oxH}Nt|iKpBfg>Mf~uy1o?C;J++kE%YGTD7*=B`?Jt zg0VQnFi6A?=bOrdp;Rcz^>#8-J0SM@4NBNUh}9Y<5LNvTJgIafaVaf{%0D&5g|~5d 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 literal 145701 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 Date: Tue, 15 Aug 2023 11:19:20 +0800 Subject: [PATCH 36/45] fix ChatGLM RLHF Former-commit-id: af6c011fcb8ea9e5cf2eb4699da33d8668df04b4 --- src/llmtuner/tuner/ppo/trainer.py | 2 ++ src/llmtuner/tuner/rm/trainer.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/llmtuner/tuner/ppo/trainer.py b/src/llmtuner/tuner/ppo/trainer.py index 26a8db99..cc73854f 100644 --- a/src/llmtuner/tuner/ppo/trainer.py +++ b/src/llmtuner/tuner/ppo/trainer.py @@ -182,6 +182,8 @@ class PPOPeftTrainer(PPOTrainer, PeftTrainer): replace_model(unwrapped_model, target="reward") batch = self.prepare_model_inputs(queries, responses) _, _, values = self.model(**batch, output_hidden_states=True, return_dict=True) + if values.size(0) != batch["input_ids"].size(0): + values = torch.transpose(values, 0, 1) rewards = [reward for reward in values[:, -1].float().detach().cpu()] # use fp32 type replace_model(unwrapped_model, target="default") return rewards diff --git a/src/llmtuner/tuner/rm/trainer.py b/src/llmtuner/tuner/rm/trainer.py index e69d48a8..55790c07 100644 --- a/src/llmtuner/tuner/rm/trainer.py +++ b/src/llmtuner/tuner/rm/trainer.py @@ -42,6 +42,8 @@ class PairwisePeftTrainer(PeftTrainer): """ batch_size = inputs["input_ids"].size(0) // 2 _, _, values = model(**inputs, output_hidden_states=True, return_dict=True) + if values.size(0) != inputs["input_ids"].size(0): + values = torch.transpose(values, 0, 1) r_accept, r_reject = values[:, -1].split(batch_size, dim=0) loss = -torch.log(torch.sigmoid(r_accept - r_reject)).mean() return (loss, [loss, r_accept, r_reject]) if return_outputs else loss From 2ceaecfb422176ede45a3923efb2ac1721079f22 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Tue, 15 Aug 2023 11:38:21 +0800 Subject: [PATCH 37/45] fix baichuan template #481 Former-commit-id: 273135f59500a36cc30333ef2dd3689c6030e2ef --- src/llmtuner/extras/template.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/llmtuner/extras/template.py b/src/llmtuner/extras/template.py index 62153b0d..8ad42ac8 100644 --- a/src/llmtuner/extras/template.py +++ b/src/llmtuner/extras/template.py @@ -195,8 +195,14 @@ def get_template_and_fix_tokenizer( template = templates.get(name, None) assert template is not None, "Template {} does not exist.".format(name) + additional_special_tokens = template.stop_words + if len(template.stop_words): # inplace method + if tokenizer.eos_token_id is not None: + additional_special_tokens.append(tokenizer.eos_token) + tokenizer.eos_token = template.stop_words[0] + additional_special_tokens.pop(0) logger.info("Replace eos token: {}".format(tokenizer.eos_token)) if tokenizer.eos_token_id is None: @@ -210,7 +216,7 @@ def get_template_and_fix_tokenizer( tokenizer.pad_token = tokenizer.eos_token logger.info("Add pad token: {}".format(tokenizer.pad_token)) - tokenizer.add_special_tokens(dict(additional_special_tokens=template.stop_words)) + tokenizer.add_special_tokens(dict(additional_special_tokens=additional_special_tokens)) return template From edc15c62fa798fdd1d9c3aa970f8e0192e61c3a2 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Wed, 16 Aug 2023 01:35:52 +0800 Subject: [PATCH 38/45] fix system prompt Former-commit-id: 7407d9daa16bf6b3cd5002e16b2c53e402d2bc39 --- src/llmtuner/api/app.py | 14 +- src/llmtuner/chat/stream_chat.py | 16 +- src/llmtuner/dsets/loader.py | 9 +- src/llmtuner/dsets/preprocess.py | 20 +-- src/llmtuner/extras/template.py | 208 +++++++++++++---------- src/llmtuner/hparams/data_args.py | 18 +- src/llmtuner/tuner/pt/workflow.py | 1 - src/llmtuner/webui/chat.py | 8 +- src/llmtuner/webui/components/chatbot.py | 6 +- src/llmtuner/webui/components/eval.py | 2 +- src/llmtuner/webui/components/infer.py | 2 +- src/llmtuner/webui/components/top.py | 4 +- src/llmtuner/webui/components/train.py | 2 +- src/llmtuner/webui/locales.py | 4 +- src/llmtuner/webui/runner.py | 8 +- 15 files changed, 170 insertions(+), 152 deletions(-) diff --git a/src/llmtuner/api/app.py b/src/llmtuner/api/app.py index 47b7661f..41a7fe9a 100644 --- a/src/llmtuner/api/app.py +++ b/src/llmtuner/api/app.py @@ -47,15 +47,15 @@ def create_app(chat_model: ChatModel) -> FastAPI: @app.post("/v1/chat/completions", response_model=ChatCompletionResponse) async def create_chat_completion(request: ChatCompletionRequest): - if request.messages[-1].role != Role.USER: + if len(request.messages) < 1 or request.messages[-1].role != Role.USER: raise HTTPException(status_code=400, detail="Invalid request") query = request.messages[-1].content prev_messages = request.messages[:-1] if len(prev_messages) > 0 and prev_messages[0].role == Role.SYSTEM: - prefix = prev_messages.pop(0).content + system = prev_messages.pop(0).content else: - prefix = None + system = None history = [] if len(prev_messages) % 2 == 0: @@ -64,11 +64,11 @@ def create_app(chat_model: ChatModel) -> FastAPI: history.append([prev_messages[i].content, prev_messages[i+1].content]) if request.stream: - generate = predict(query, history, prefix, request) + generate = predict(query, history, system, request) return EventSourceResponse(generate, media_type="text/event-stream") response, (prompt_length, response_length) = chat_model.chat( - query, history, prefix, temperature=request.temperature, top_p=request.top_p, max_new_tokens=request.max_tokens + query, history, system, temperature=request.temperature, top_p=request.top_p, max_new_tokens=request.max_tokens ) usage = ChatCompletionResponseUsage( @@ -85,7 +85,7 @@ def create_app(chat_model: ChatModel) -> FastAPI: return ChatCompletionResponse(model=request.model, choices=[choice_data], usage=usage) - async def predict(query: str, history: List[Tuple[str, str]], prefix: str, request: ChatCompletionRequest): + async def predict(query: str, history: List[Tuple[str, str]], system: str, request: ChatCompletionRequest): choice_data = ChatCompletionResponseStreamChoice( index=0, delta=DeltaMessage(role=Role.ASSISTANT), @@ -95,7 +95,7 @@ def create_app(chat_model: ChatModel) -> FastAPI: yield chunk.json(exclude_unset=True, ensure_ascii=False) for new_text in chat_model.stream_chat( - query, history, prefix, temperature=request.temperature, top_p=request.top_p, max_new_tokens=request.max_tokens + query, history, system, temperature=request.temperature, top_p=request.top_p, max_new_tokens=request.max_tokens ): if len(new_text) == 0: continue diff --git a/src/llmtuner/chat/stream_chat.py b/src/llmtuner/chat/stream_chat.py index e207ee0b..bf602dd5 100644 --- a/src/llmtuner/chat/stream_chat.py +++ b/src/llmtuner/chat/stream_chat.py @@ -16,19 +16,19 @@ class ChatModel: self.model = dispatch_model(self.model) self.model = self.model.eval() # enable evaluation mode self.template = get_template_and_fix_tokenizer(data_args.template, self.tokenizer) - self.source_prefix = data_args.source_prefix + self.system_prompt = data_args.system_prompt def process_args( self, query: str, history: Optional[List[Tuple[str, str]]] = None, - prefix: Optional[str] = None, + system: Optional[str] = None, **input_kwargs ) -> Tuple[Dict[str, Any], int]: - prefix = prefix or self.source_prefix + system = system or self.system_prompt prompt, _ = self.template.encode_oneturn( - tokenizer=self.tokenizer, query=query, resp="", history=history, prefix=prefix + tokenizer=self.tokenizer, query=query, resp="", history=history, system=system ) input_ids = torch.tensor([prompt], device=self.model.device) prompt_length = len(input_ids[0]) @@ -68,10 +68,10 @@ class ChatModel: self, query: str, history: Optional[List[Tuple[str, str]]] = None, - prefix: Optional[str] = None, + system: Optional[str] = None, **input_kwargs ) -> Tuple[str, Tuple[int, int]]: - gen_kwargs, prompt_length = self.process_args(query, history, prefix, **input_kwargs) + gen_kwargs, prompt_length = self.process_args(query, history, system, **input_kwargs) generation_output = self.model.generate(**gen_kwargs) outputs = generation_output.tolist()[0][prompt_length:] response = self.tokenizer.decode(outputs, skip_special_tokens=True) @@ -83,10 +83,10 @@ class ChatModel: self, query: str, history: Optional[List[Tuple[str, str]]] = None, - prefix: Optional[str] = None, + system: Optional[str] = None, **input_kwargs ) -> Generator[str, None, None]: - gen_kwargs, _ = self.process_args(query, history, prefix, **input_kwargs) + gen_kwargs, _ = self.process_args(query, history, system, **input_kwargs) streamer = TextIteratorStreamer(self.tokenizer, timeout=60.0, skip_prompt=True, skip_special_tokens=True) gen_kwargs["streamer"] = streamer diff --git a/src/llmtuner/dsets/loader.py b/src/llmtuner/dsets/loader.py index 7588443f..6e293c78 100644 --- a/src/llmtuner/dsets/loader.py +++ b/src/llmtuner/dsets/loader.py @@ -92,14 +92,13 @@ def get_dataset( if getattr(dataset_attr, column_name) and getattr(dataset_attr, column_name) != column_name: dataset = dataset.rename_column(getattr(dataset_attr, column_name), column_name) - if dataset_attr.source_prefix: # add prefix + if dataset_attr.system_prompt: # add system prompt if data_args.streaming: features = dataset.features - features["prefix"] = Value(dtype="string", id=None) - dataset = dataset.map(lambda _: {"prefix": dataset_attr.source_prefix}, features=features) + features["system"] = Value(dtype="string", id=None) + dataset = dataset.map(lambda _: {"system": dataset_attr.system_prompt}, features=features) else: - prefix_data = [dataset_attr.source_prefix] * len(dataset) - dataset = dataset.add_column("prefix", prefix_data) + dataset = dataset.add_column("system", [dataset_attr.system_prompt] * len(dataset)) all_datasets.append(dataset) diff --git a/src/llmtuner/dsets/preprocess.py b/src/llmtuner/dsets/preprocess.py index 64e0d8b1..3cc5a483 100644 --- a/src/llmtuner/dsets/preprocess.py +++ b/src/llmtuner/dsets/preprocess.py @@ -27,8 +27,8 @@ def preprocess_dataset( query, response = examples["prompt"][i], examples["response"][i] query = query + "\n" + examples["query"][i] if "query" in examples and examples["query"][i] else query history = examples["history"][i] if "history" in examples else None - prefix = examples["prefix"][i] if "prefix" in examples else None - yield query, response, history, prefix + system = examples["system"][i] if "system" in examples else None + yield query, response, history, system def preprocess_pretrain_dataset(examples: Dict[str, List[Any]]) -> Dict[str, Any]: # build grouped texts with format `X1 X2 X3 ...` (without ) @@ -56,10 +56,10 @@ def preprocess_dataset( model_inputs = {"input_ids": [], "attention_mask": [], "labels": []} max_length = data_args.max_source_length + data_args.max_target_length - for query, response, history, prefix in construct_example(examples): + for query, response, history, system in construct_example(examples): input_ids, labels = [], [] - for source_ids, target_ids in template.encode_multiturn(tokenizer, query, response, history, prefix): + for source_ids, target_ids in template.encode_multiturn(tokenizer, query, response, history, system): if len(source_ids) > data_args.max_source_length: source_ids = source_ids[:data_args.max_source_length] if len(target_ids) > data_args.max_target_length: @@ -78,11 +78,11 @@ def preprocess_dataset( return model_inputs def preprocess_unsupervised_dataset(examples: Dict[str, List[Any]]) -> Dict[str, Any]: - # build inputs with format ` X` and labels with format ` Y` + # build inputs with format ` X` and labels with format `Y ` model_inputs = {"input_ids": [], "attention_mask": [], "labels": []} - for query, response, history, prefix in construct_example(examples): - source_ids, target_ids = template.encode_oneturn(tokenizer, query, response, history, prefix) + for query, response, history, system in construct_example(examples): + source_ids, target_ids = template.encode_oneturn(tokenizer, query, response, history, system) if len(source_ids) > data_args.max_source_length: source_ids = source_ids[:data_args.max_source_length] @@ -98,9 +98,9 @@ def preprocess_dataset( def preprocess_pairwise_dataset(examples): # build input pairs with format ` X`, `Y1 ` and `Y2 ` model_inputs = {"prompt_ids": [], "chosen_ids": [], "rejected_ids": []} - for query, response, history, prefix in construct_example(examples): - prompt_ids, chosen_ids = template.encode_oneturn(tokenizer, query, response[0], history, prefix) - _, rejected_ids = template.encode_oneturn(tokenizer, query, response[1], history, prefix) + for query, response, history, system in construct_example(examples): + prompt_ids, chosen_ids = template.encode_oneturn(tokenizer, query, response[0], history, system) + _, rejected_ids = template.encode_oneturn(tokenizer, query, response[1], history, system) if len(prompt_ids) > data_args.max_source_length: prompt_ids = prompt_ids[:data_args.max_source_length] diff --git a/src/llmtuner/extras/template.py b/src/llmtuner/extras/template.py index 8ad42ac8..25907382 100644 --- a/src/llmtuner/extras/template.py +++ b/src/llmtuner/extras/template.py @@ -16,9 +16,11 @@ class Template: prefix: List[Union[str, Dict[str, str]]] prompt: List[Union[str, Dict[str, str]]] + system: str sep: List[Union[str, Dict[str, str]]] stop_words: List[str] use_history: bool + bos_after_prefix: bool def encode_oneturn( self, @@ -26,18 +28,18 @@ class Template: query: str, resp: str, history: Optional[List[Tuple[str, str]]] = None, - prefix: Optional[str] = None + system: Optional[str] = None ) -> Tuple[List[int], List[int]]: r""" Returns a single pair of token ids representing prompt and response respectively. """ - prefix, history = self._format(query, resp, history, prefix) - encoded_pairs = self._encode(tokenizer, prefix, history) + system, history = self._format(query, resp, history, system) + encoded_pairs = self._encode(tokenizer, system, history) prompt_ids = [] for query_ids, resp_ids in encoded_pairs[:-1]: prompt_ids = prompt_ids + query_ids + resp_ids - prompt_ids = prompt_ids + encoded_pairs[-1][0] - return prompt_ids, encoded_pairs[-1][1] + prompt_ids, answer_ids = prompt_ids + encoded_pairs[-1][0], encoded_pairs[-1][1] + return prompt_ids, answer_ids def encode_multiturn( self, @@ -45,13 +47,13 @@ class Template: query: str, resp: str, history: Optional[List[Tuple[str, str]]] = None, - prefix: Optional[str] = None + system: Optional[str] = None ) -> List[Tuple[List[int], List[int]]]: r""" Returns multiple pairs of token ids representing prompts and responses respectively. """ - prefix, history = self._format(query, resp, history, prefix) - encoded_pairs = self._encode(tokenizer, prefix, history) + system, history = self._format(query, resp, history, system) + encoded_pairs = self._encode(tokenizer, system, history) return encoded_pairs def _format( @@ -59,15 +61,15 @@ class Template: query: str, resp: str, history: Optional[List[Tuple[str, str]]] = None, - prefix: Optional[str] = None - ) -> Tuple[List[Union[str, Dict[str, str]]], List[Tuple[str, str]]]: + system: Optional[str] = None + ) -> Tuple[str, List[Tuple[str, str]]]: r""" Aligns inputs to the standard format. """ - prefix = [prefix] if prefix else self.prefix # use prefix if provided + system = system or self.system # use system if provided history = history if (history and self.use_history) else [] history = history + [(query, resp)] - return prefix, history + return system, history def _get_special_ids( self, @@ -88,7 +90,7 @@ class Template: def _encode( self, tokenizer: "PreTrainedTokenizer", - prefix: List[Union[str, Dict[str, str]]], + system: str, history: List[Tuple[str, str]] ) -> List[Tuple[List[int], List[int]]]: r""" @@ -101,8 +103,12 @@ class Template: encoded_pairs = [] for turn_idx, (query, resp) in enumerate(history): if turn_idx == 0: - if prefix: # has prefix - prefix_ids = bos_ids + self._convert_inputs_to_ids(tokenizer, context=prefix) + sep_ids + prefix_ids = self._convert_inputs_to_ids(tokenizer, context=self.prefix, system=system) + if len(prefix_ids) != 0: # has prefix + if self.bos_after_prefix: + prefix_ids = prefix_ids + bos_ids + sep_ids + else: + prefix_ids = bos_ids + prefix_ids + sep_ids else: prefix_ids = bos_ids else: @@ -117,8 +123,9 @@ class Template: self, tokenizer: "PreTrainedTokenizer", context: List[Union[str, Dict[str, str]]], - query: Optional[str] = "", - idx: Optional[str] = "" + system: Optional[str] = None, + query: Optional[str] = None, + idx: Optional[str] = None ) -> List[int]: r""" Converts context to token ids. @@ -131,13 +138,15 @@ class Template: token_ids = [] for elem in context: if isinstance(elem, str): - elem = elem.replace("{{query}}", query, 1) - elem = elem.replace("{{idx}}", idx, 1) + elem = elem.replace("{{system}}", system, 1) if system is not None else elem + elem = elem.replace("{{query}}", query, 1) if query is not None else elem + elem = elem.replace("{{idx}}", idx, 1) if idx is not None else elem token_ids = token_ids + tokenizer.encode(elem, **kwargs) elif isinstance(elem, dict): token_ids = token_ids + [tokenizer.convert_tokens_to_ids(elem.get("token"))] else: raise NotImplementedError + return token_ids @@ -147,7 +156,7 @@ class Llama2Template(Template): def _encode( self, tokenizer: "PreTrainedTokenizer", - prefix: List[Union[str, Dict[str, str]]], + system: str, history: List[Tuple[str, str]] ) -> List[Tuple[List[int], List[int]]]: r""" @@ -157,10 +166,9 @@ class Llama2Template(Template): """ bos_ids, eos_ids = self._get_special_ids(tokenizer) encoded_pairs = [] - assert isinstance(prefix[0], str), "LLaMA-2 template only accepts list containing a single string." for turn_idx, (query, resp) in enumerate(history): - if turn_idx == 0: # llama2 template has not sep_ids - query = prefix[0] + query + if turn_idx == 0: # llama2 template has no sep_ids + query = self.prefix[0].replace("{{system}}", system) + query query_ids = self._convert_inputs_to_ids(tokenizer, context=self.prompt, query=query) resp_ids = self._convert_inputs_to_ids(tokenizer, context=[resp]) encoded_pairs.append((bos_ids + query_ids, resp_ids + eos_ids)) @@ -174,17 +182,21 @@ def register_template( name: str, prefix: List[Union[str, Dict[str, str]]], prompt: List[Union[str, Dict[str, str]]], + system: str, sep: List[Union[str, Dict[str, str]]], - stop_words: List[str], - use_history: bool + stop_words: Optional[List[str]] = [], + use_history: Optional[bool] = True, + bos_after_prefix: Optional[bool] = False ) -> None: template_class = Llama2Template if "llama2" in name else Template templates[name] = template_class( prefix=prefix, prompt=prompt, + system=system, sep=sep, stop_words=stop_words, - use_history=use_history + use_history=use_history, + bos_after_prefix=bos_after_prefix ) @@ -201,7 +213,7 @@ def get_template_and_fix_tokenizer( if tokenizer.eos_token_id is not None: additional_special_tokens.append(tokenizer.eos_token) - tokenizer.eos_token = template.stop_words[0] + tokenizer.eos_token = additional_special_tokens[0] # use the first stop word as eos token additional_special_tokens.pop(0) logger.info("Replace eos token: {}".format(tokenizer.eos_token)) @@ -229,8 +241,8 @@ register_template( prompt=[ "{{query}}" ], + system="", sep=[], - stop_words=[], use_history=False ) @@ -241,17 +253,18 @@ Default template. register_template( name="default", prefix=[ - "A chat between a curious user and an artificial intelligence assistant. " - "The assistant gives helpful, detailed, and polite answers to the user's questions." + "{{system}}" ], prompt=[ "Human: {{query}}\nAssistant: " ], + system=( + "A chat between a curious user and an artificial intelligence assistant. " + "The assistant gives helpful, detailed, and polite answers to the user's questions." + ), sep=[ "\n" - ], - stop_words=[], - use_history=True + ] ) @@ -263,21 +276,22 @@ Supports: https://huggingface.co/meta-llama/Llama-2-7b-chat-hf register_template( name="llama2", prefix=[ - "<>\nYou are a helpful, respectful and honest assistant. " + "<>\n{{system}}\n<>\n\n" + ], + prompt=[ + "[INST] {{query}} [/INST] " + ], + system=( + "You are a helpful, respectful and honest assistant. " "Always answer as helpfully as possible, while being safe. " "Your answers should not include any harmful, unethical, " "racist, sexist, toxic, dangerous, or illegal content. " "Please ensure that your responses are socially unbiased and positive in nature.\n" "If a question does not make any sense, or is not factually coherent, " "explain why instead of answering something not correct. " - "If you don't know the answer to a question, please don't share false information.\n<>\n\n" - ], - prompt=[ - "[INST] {{query}} [/INST] " - ], - sep=[], - stop_words=[], - use_history=True + "If you don't know the answer to a question, please don't share false information." + ), + sep=[] ) @@ -288,14 +302,13 @@ Supports: https://github.com/ymcui/Chinese-LLaMA-Alpaca-2 register_template( name="llama2_zh", prefix=[ - "<>\nYou are a helpful assistant. 你是一个乐于助人的助手。\n<>\n\n" + "<>\n{{system}}\n<>\n\n" ], prompt=[ "[INST] {{query}} [/INST] " ], - sep=[], - stop_words=[], - use_history=True + system="You are a helpful assistant. 你是一个乐于助人的助手。", + sep=[] ) @@ -306,17 +319,18 @@ Supports: https://huggingface.co/tatsu-lab/alpaca-7b-wdiff register_template( name="alpaca", prefix=[ - "Below is an instruction that describes a task. " - "Write a response that appropriately completes the request." + "{{system}}" ], prompt=[ "### Instruction:\n{{query}}\n\n### Response:\n" ], + system=( + "Below is an instruction that describes a task. " + "Write a response that appropriately completes the request." + ), sep=[ "\n\n" - ], - stop_words=[], - use_history=True + ] ) @@ -327,15 +341,16 @@ Supports: https://huggingface.co/lmsys/vicuna-7b-delta-v1.1 register_template( name="vicuna", prefix=[ - "A chat between a curious user and an artificial intelligence assistant. " - "The assistant gives helpful, detailed, and polite answers to the user's questions." + "{{system}}" ], prompt=[ "USER: {{query}} ASSISTANT: " ], - sep=[], - stop_words=[], - use_history=True + system=( + "A chat between a curious user and an artificial intelligence assistant. " + "The assistant gives helpful, detailed, and polite answers to the user's questions." + ), + sep=[] ) @@ -344,15 +359,16 @@ Supports: https://huggingface.co/BelleGroup/BELLE-LLaMA-EXT-13B """ register_template( name="belle", - prefix=[], + prefix=[ + "{{system}}" + ], prompt=[ "Human: {{query}}\n\nBelle: " ], + system="", sep=[ "\n\n" - ], - stop_words=[], - use_history=True + ] ) @@ -361,15 +377,16 @@ Supports: https://github.com/CVI-SZU/Linly """ register_template( name="linly", - prefix=[], + prefix=[ + "{{system}}" + ], prompt=[ "User: {{query}}\nBot: " ], + system="", sep=[ "\n" - ], - stop_words=[], - use_history=True + ] ) @@ -378,15 +395,16 @@ Supports: https://github.com/Neutralzz/BiLLa """ register_template( name="billa", - prefix=[], + prefix=[ + "{{system}}" + ], prompt=[ "Human: {{query}}\nAssistant: " ], + system="", sep=[ "\n" - ], - stop_words=[], - use_history=True + ] ) @@ -395,18 +413,19 @@ Supports: https://huggingface.co/IDEA-CCNL/Ziya-LLaMA-13B-v1 """ register_template( name="ziya", - prefix=[], + prefix=[ + "{{system}}" + ], prompt=[ {"token": ""}, ":{{query}}\n", {"token": ""}, ":" ], + system="", sep=[ "\n" - ], - stop_words=[], - use_history=True + ] ) @@ -416,17 +435,18 @@ Supports: https://huggingface.co/qhduan/aquilachat-7b register_template( name="aquila", prefix=[ - "A chat between a curious human and an artificial intelligence assistant. " - "The assistant gives helpful, detailed, and polite answers to the human's questions." + "{{system}}" ], prompt=[ "Human: {{query}}###Assistant: " ], + system=( + "A chat between a curious human and an artificial intelligence assistant. " + "The assistant gives helpful, detailed, and polite answers to the human's questions." + ), sep=[ "###" - ], - stop_words=[], - use_history=True + ] ) @@ -435,19 +455,21 @@ Supports: https://huggingface.co/internlm/internlm-chat-7b """ register_template( name="intern", - prefix=[], + prefix=[ + "{{system}}" + ], prompt=[ "<|User|>:{{query}}", {"token": ""}, "\n<|Bot|>:" ], + system="", sep=[ "\n" ], stop_words=[ "" - ], - use_history=True + ] ) @@ -457,17 +479,19 @@ Supports: https://huggingface.co/baichuan-inc/Baichuan-13B-Chat register_template( name="baichuan", prefix=[ - {"token": ""} # user token (a little difference in the first turn) + "{{system}}", + {"token": ""} # user token ], prompt=[ "{{query}}", {"token": ""} # assistant token ], + system="", sep=[], stop_words=[ "" # user token ], - use_history=True + bos_after_prefix=True ) @@ -479,7 +503,7 @@ register_template( name="starchat", prefix=[ {"token": "<|system|>"}, - "\n", + "\n{{system}}", {"token": "<|end|>"} ], prompt=[ @@ -489,13 +513,13 @@ register_template( "\n", {"token": "<|assistant|>"} ], + system="", sep=[ "\n" ], stop_words=[ "<|end|>" - ], - use_history=True + ] ) @@ -506,7 +530,7 @@ register_template( name="chatml", prefix=[ {"token": "<|im_start|>"}, - "system\nYou are a helpful assistant.", + "system\n{{system}}", {"token": "<|im_end|>"} ], prompt=[ @@ -517,13 +541,13 @@ register_template( {"token": "<|im_start|>"}, "assistant\n" ], + system="You are a helpful assistant.", sep=[ "\n" ], stop_words=[ "<|im_end|>" - ], - use_history=True + ] ) @@ -534,14 +558,14 @@ register_template( name="chatglm2", prefix=[ {"token": "[gMASK]"}, - {"token": "sop"} + {"token": "sop"}, + "{{system}}" ], prompt=[ "[Round {{idx}}]\n\n问:{{query}}\n\n答:" ], + system="", sep=[ "\n\n" - ], - stop_words=[], - use_history=True + ] ) diff --git a/src/llmtuner/hparams/data_args.py b/src/llmtuner/hparams/data_args.py index 7d1c982c..374d03c6 100644 --- a/src/llmtuner/hparams/data_args.py +++ b/src/llmtuner/hparams/data_args.py @@ -10,7 +10,7 @@ class DatasetAttr: load_from: str dataset_name: Optional[str] = None dataset_sha1: Optional[str] = None - source_prefix: Optional[str] = None + system_prompt: Optional[str] = None def __repr__(self) -> str: return self.dataset_name @@ -86,9 +86,9 @@ class DataArguments: default=True, metadata={"help": "Whether to ignore the tokens corresponding to padded labels in the loss computation or not."} ) - source_prefix: Optional[str] = field( + system_prompt: Optional[str] = field( default=None, - metadata={"help": "A prefix to add before every source text. Use `|` to separate multiple prefixes in training."} + metadata={"help": "System prompt to add before the user query. Use `|` to separate multiple prompts in training."} ) val_size: Optional[float] = field( default=0, @@ -100,12 +100,9 @@ class DataArguments: with open(os.path.join(self.dataset_dir, "dataset_info.json"), "r") as f: dataset_info = json.load(f) - if self.source_prefix is not None: - prefix_list = self.source_prefix.split("|") - prefix_list = prefix_list * len(dataset_names) if len(prefix_list) == 1 else prefix_list - assert len(prefix_list) == len(dataset_names), "The number of prefixes should be either identical with datasets or 1." - else: - prefix_list = [None] * len(dataset_names) + prompt_list = self.system_prompt.split("|") if self.system_prompt else [None] + prompt_list = prompt_list * (len(dataset_names) // len(prompt_list)) + assert len(prompt_list) == len(dataset_names), "Number of system prompts should be equal to datasets or 1." if self.interleave_probs is not None: self.interleave_probs = [float(prob.strip()) for prob in self.interleave_probs.split(",")] @@ -126,12 +123,11 @@ class DataArguments: dataset_sha1=dataset_info[name].get("file_sha1", None) ) - dataset_attr.source_prefix = prefix_list[i] - if "columns" in dataset_info[name]: dataset_attr.prompt = dataset_info[name]["columns"].get("prompt", None) dataset_attr.query = dataset_info[name]["columns"].get("query", None) dataset_attr.response = dataset_info[name]["columns"].get("response", None) dataset_attr.history = dataset_info[name]["columns"].get("history", None) + dataset_attr.system_prompt = prompt_list[i] self.dataset_list.append(dataset_attr) diff --git a/src/llmtuner/tuner/pt/workflow.py b/src/llmtuner/tuner/pt/workflow.py index f7bf6448..865ec218 100644 --- a/src/llmtuner/tuner/pt/workflow.py +++ b/src/llmtuner/tuner/pt/workflow.py @@ -56,6 +56,5 @@ def run_pt( perplexity = float("inf") metrics["perplexity"] = perplexity - trainer.log_metrics("eval", metrics) trainer.save_metrics("eval", metrics) diff --git a/src/llmtuner/webui/chat.py b/src/llmtuner/webui/chat.py index e73ea402..154efa5a 100644 --- a/src/llmtuner/webui/chat.py +++ b/src/llmtuner/webui/chat.py @@ -26,7 +26,7 @@ class WebChatModel(ChatModel): finetuning_type: str, quantization_bit: str, template: str, - source_prefix: str + system_prompt: str ): if self.model is not None: yield ALERTS["err_exists"][lang] @@ -55,7 +55,7 @@ class WebChatModel(ChatModel): finetuning_type=finetuning_type, quantization_bit=int(quantization_bit) if quantization_bit != "None" else None, template=template, - source_prefix=source_prefix + system_prompt=system_prompt ) super().__init__(args) @@ -73,7 +73,7 @@ class WebChatModel(ChatModel): chatbot: List[Tuple[str, str]], query: str, history: List[Tuple[str, str]], - prefix: str, + system: str, max_new_tokens: int, top_p: float, temperature: float @@ -81,7 +81,7 @@ class WebChatModel(ChatModel): chatbot.append([query, ""]) response = "" for new_text in self.stream_chat( - query, history, prefix, max_new_tokens=max_new_tokens, top_p=top_p, temperature=temperature + query, history, system, max_new_tokens=max_new_tokens, top_p=top_p, temperature=temperature ): response += new_text response = self.postprocess(response) diff --git a/src/llmtuner/webui/components/chatbot.py b/src/llmtuner/webui/components/chatbot.py index 6fcfc652..928a568c 100644 --- a/src/llmtuner/webui/components/chatbot.py +++ b/src/llmtuner/webui/components/chatbot.py @@ -17,7 +17,7 @@ def create_chat_box( with gr.Row(): with gr.Column(scale=4): - prefix = gr.Textbox(show_label=False) + system = gr.Textbox(show_label=False) query = gr.Textbox(show_label=False, lines=8) submit_btn = gr.Button(variant="primary") @@ -31,7 +31,7 @@ def create_chat_box( submit_btn.click( chat_model.predict, - [chatbot, query, history, prefix, max_new_tokens, top_p, temperature], + [chatbot, query, history, system, max_new_tokens, top_p, temperature], [chatbot, history], show_progress=True ).then( @@ -41,7 +41,7 @@ def create_chat_box( clear_btn.click(lambda: ([], []), outputs=[chatbot, history], show_progress=True) return chat_box, chatbot, history, dict( - prefix=prefix, + system=system, query=query, submit_btn=submit_btn, clear_btn=clear_btn, diff --git a/src/llmtuner/webui/components/eval.py b/src/llmtuner/webui/components/eval.py index 48372b4c..cbc71daf 100644 --- a/src/llmtuner/webui/components/eval.py +++ b/src/llmtuner/webui/components/eval.py @@ -52,7 +52,7 @@ def create_eval_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dict top_elems["finetuning_type"], top_elems["quantization_bit"], top_elems["template"], - top_elems["source_prefix"], + top_elems["system_prompt"], dataset_dir, dataset, max_source_length, diff --git a/src/llmtuner/webui/components/infer.py b/src/llmtuner/webui/components/infer.py index 40e0323e..14aef162 100644 --- a/src/llmtuner/webui/components/infer.py +++ b/src/llmtuner/webui/components/infer.py @@ -28,7 +28,7 @@ def create_infer_tab(top_elems: Dict[str, "Component"]) -> Dict[str, "Component" top_elems["finetuning_type"], top_elems["quantization_bit"], top_elems["template"], - top_elems["source_prefix"] + top_elems["system_prompt"] ], [info_box] ).then( diff --git a/src/llmtuner/webui/components/top.py b/src/llmtuner/webui/components/top.py index 7f3c6faa..62c1f9c9 100644 --- a/src/llmtuner/webui/components/top.py +++ b/src/llmtuner/webui/components/top.py @@ -28,7 +28,7 @@ def create_top() -> Dict[str, "Component"]: with gr.Row(): quantization_bit = gr.Dropdown(choices=["None", "8", "4"], value="None", scale=1) template = gr.Dropdown(choices=list(templates.keys()), value="default", scale=1) - source_prefix = gr.Textbox(scale=2) + system_prompt = gr.Textbox(scale=2) lang.change(save_config, [lang, model_name, model_path]) @@ -62,5 +62,5 @@ def create_top() -> Dict[str, "Component"]: advanced_tab=advanced_tab, quantization_bit=quantization_bit, template=template, - source_prefix=source_prefix + system_prompt=system_prompt ) diff --git a/src/llmtuner/webui/components/train.py b/src/llmtuner/webui/components/train.py index 6aaeecbb..aab512ee 100644 --- a/src/llmtuner/webui/components/train.py +++ b/src/llmtuner/webui/components/train.py @@ -101,7 +101,7 @@ def create_train_tab(top_elems: Dict[str, "Component"], runner: "Runner") -> Dic top_elems["finetuning_type"], top_elems["quantization_bit"], top_elems["template"], - top_elems["source_prefix"], + top_elems["system_prompt"], training_stage, dataset_dir, dataset, diff --git a/src/llmtuner/webui/locales.py b/src/llmtuner/webui/locales.py index 7a58c4c7..c4032f39 100644 --- a/src/llmtuner/webui/locales.py +++ b/src/llmtuner/webui/locales.py @@ -77,7 +77,7 @@ LOCALES = { "info": "构建提示词时使用的模板" } }, - "source_prefix": { + "system_prompt": { "en": { "label": "System prompt (optional)", "info": "A sequence used as the default system prompt." @@ -455,7 +455,7 @@ LOCALES = { "value": "模型未加载,请先加载模型。" } }, - "prefix": { + "system": { "en": { "placeholder": "System prompt (optional)" }, diff --git a/src/llmtuner/webui/runner.py b/src/llmtuner/webui/runner.py index 49fed19b..ac74a4c7 100644 --- a/src/llmtuner/webui/runner.py +++ b/src/llmtuner/webui/runner.py @@ -69,7 +69,7 @@ class Runner: finetuning_type: str, quantization_bit: str, template: str, - source_prefix: str, + system_prompt: str, training_stage: str, dataset_dir: str, dataset: List[str], @@ -114,7 +114,7 @@ class Runner: finetuning_type=finetuning_type, quantization_bit=int(quantization_bit) if quantization_bit != "None" else None, template=template, - source_prefix=source_prefix, + system_prompt=system_prompt, dataset_dir=dataset_dir, dataset=",".join(dataset), max_source_length=max_source_length, @@ -170,7 +170,7 @@ class Runner: finetuning_type: str, quantization_bit: str, template: str, - source_prefix: str, + system_prompt: str, dataset_dir: str, dataset: List[str], max_source_length: int, @@ -198,7 +198,7 @@ class Runner: finetuning_type=finetuning_type, quantization_bit=int(quantization_bit) if quantization_bit != "None" else None, template=template, - source_prefix=source_prefix, + system_prompt=system_prompt, dataset_dir=dataset_dir, dataset=",".join(dataset), max_source_length=max_source_length, From 048f99354faa2a5a26ae2140dd1a7e2591e61733 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Wed, 16 Aug 2023 22:39:54 +0800 Subject: [PATCH 39/45] fix generation Former-commit-id: d9e62711a3349d7c6fd3512fb25c709bdfbb311a --- src/llmtuner/chat/stream_chat.py | 2 ++ src/llmtuner/tuner/ppo/trainer.py | 2 ++ src/llmtuner/tuner/sft/workflow.py | 2 ++ 3 files changed, 6 insertions(+) diff --git a/src/llmtuner/chat/stream_chat.py b/src/llmtuner/chat/stream_chat.py index bf602dd5..00b25b45 100644 --- a/src/llmtuner/chat/stream_chat.py +++ b/src/llmtuner/chat/stream_chat.py @@ -49,6 +49,8 @@ class ChatModel: top_p=top_p or gen_kwargs["top_p"], top_k=top_k or gen_kwargs["top_k"], repetition_penalty=repetition_penalty or gen_kwargs["repetition_penalty"], + eos_token_id=self.tokenizer.eos_token_id, + pad_token_id=self.tokenizer.pad_token_id, logits_processor=get_logits_processor(), stopping_criteria=get_stopping_criteria(self.tokenizer.additional_special_tokens_ids) )) diff --git a/src/llmtuner/tuner/ppo/trainer.py b/src/llmtuner/tuner/ppo/trainer.py index cc73854f..fa4170f6 100644 --- a/src/llmtuner/tuner/ppo/trainer.py +++ b/src/llmtuner/tuner/ppo/trainer.py @@ -74,6 +74,8 @@ class PPOPeftTrainer(PPOTrainer, PeftTrainer): # Keyword arguments for `model.generate` gen_kwargs = self.generating_args.to_dict() + gen_kwargs["eos_token_id"] = self.tokenizer.eos_token_id + gen_kwargs["pad_token_id"] = self.tokenizer.pad_token_id gen_kwargs["logits_processor"] = get_logits_processor() gen_kwargs["stopping_criteria"] = get_stopping_criteria(self.tokenizer.additional_special_tokens_ids) diff --git a/src/llmtuner/tuner/sft/workflow.py b/src/llmtuner/tuner/sft/workflow.py index 10f7aafb..f2d72fc6 100644 --- a/src/llmtuner/tuner/sft/workflow.py +++ b/src/llmtuner/tuner/sft/workflow.py @@ -52,6 +52,8 @@ def run_sft( # Keyword arguments for `model.generate` gen_kwargs = generating_args.to_dict() + gen_kwargs["eos_token_id"] = tokenizer.eos_token_id + gen_kwargs["pad_token_id"] = tokenizer.pad_token_id gen_kwargs["logits_processor"] = get_logits_processor() gen_kwargs["stopping_criteria"] = get_stopping_criteria(tokenizer.additional_special_tokens_ids) From 3021a01b7176aa0e4acb735df9a5540c8a9bcda8 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Thu, 17 Aug 2023 01:27:20 +0800 Subject: [PATCH 40/45] fix baichuan and intern template Former-commit-id: 892fd39373b816cf079e0decc9cb57dfb5565242 --- src/llmtuner/extras/template.py | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/llmtuner/extras/template.py b/src/llmtuner/extras/template.py index 25907382..5d5a03fb 100644 --- a/src/llmtuner/extras/template.py +++ b/src/llmtuner/extras/template.py @@ -20,7 +20,6 @@ class Template: sep: List[Union[str, Dict[str, str]]] stop_words: List[str] use_history: bool - bos_after_prefix: bool def encode_oneturn( self, @@ -75,12 +74,15 @@ class Template: self, tokenizer: "PreTrainedTokenizer" ) -> Tuple[List[int], List[int]]: - if tokenizer.bos_token_id: + if ( + tokenizer.bos_token_id is not None + and getattr(tokenizer, "add_bos_token", True) + ): # baichuan-13b has no bos token bos_ids = [tokenizer.bos_token_id] else: bos_ids = [] # bos token is optional - if tokenizer.eos_token_id: + if tokenizer.eos_token_id is not None: eos_ids = [tokenizer.eos_token_id] else: raise ValueError("EOS token is required.") @@ -105,10 +107,7 @@ class Template: if turn_idx == 0: prefix_ids = self._convert_inputs_to_ids(tokenizer, context=self.prefix, system=system) if len(prefix_ids) != 0: # has prefix - if self.bos_after_prefix: - prefix_ids = prefix_ids + bos_ids + sep_ids - else: - prefix_ids = bos_ids + prefix_ids + sep_ids + prefix_ids = bos_ids + prefix_ids + sep_ids else: prefix_ids = bos_ids else: @@ -185,8 +184,7 @@ def register_template( system: str, sep: List[Union[str, Dict[str, str]]], stop_words: Optional[List[str]] = [], - use_history: Optional[bool] = True, - bos_after_prefix: Optional[bool] = False + use_history: Optional[bool] = True ) -> None: template_class = Llama2Template if "llama2" in name else Template templates[name] = template_class( @@ -195,8 +193,7 @@ def register_template( system=system, sep=sep, stop_words=stop_words, - use_history=use_history, - bos_after_prefix=bos_after_prefix + use_history=use_history ) @@ -208,7 +205,6 @@ def get_template_and_fix_tokenizer( assert template is not None, "Template {} does not exist.".format(name) additional_special_tokens = template.stop_words - if len(template.stop_words): # inplace method if tokenizer.eos_token_id is not None: additional_special_tokens.append(tokenizer.eos_token) @@ -468,6 +464,7 @@ register_template( "\n" ], stop_words=[ + "", # internlm cannot replace eos token "" ] ) @@ -490,8 +487,7 @@ register_template( sep=[], stop_words=[ "" # user token - ], - bos_after_prefix=True + ] ) From 327e14d3ea34b1072e01c4a24ed1f4ca68881fb5 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Thu, 17 Aug 2023 11:00:22 +0800 Subject: [PATCH 41/45] update readme Former-commit-id: ff0aa793b6750830b3865c439ef64ed129ec9406 --- README.md | 14 +++++++------- README_zh.md | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 1124ade2..be43a481 100644 --- a/README.md +++ b/README.md @@ -64,13 +64,13 @@ ## Supported Training Approaches -| Approach | Full-parameter | Partial-parameter | LoRA | QLoRA | -| ---------------------- | -------------- | ----------------- | ---- | ----- | -| Pre-Training | ✅ | ✅ | ✅ | ✅ | -| Supervised Fine-Tuning | ✅ | ✅ | ✅ | ✅ | -| Reward Modeling | | | ✅ | ✅ | -| PPO Training | | | ✅ | ✅ | -| DPO Training | ✅ | | ✅ | ✅ | +| Approach | Full-parameter | Partial-parameter | LoRA | QLoRA | +| ---------------------- | ------------------ | ------------------ | ------------------ | ------------------ | +| Pre-Training | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| Supervised Fine-Tuning | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| Reward Modeling | | | :white_check_mark: | :white_check_mark: | +| PPO Training | | | :white_check_mark: | :white_check_mark: | +| DPO Training | :white_check_mark: | | :white_check_mark: | :white_check_mark: | - Use `--quantization_bit 4/8` argument to enable QLoRA. diff --git a/README_zh.md b/README_zh.md index 5664c4ec..2a84e697 100644 --- a/README_zh.md +++ b/README_zh.md @@ -64,13 +64,13 @@ ## 训练方法 -| 方法 | 全参数训练 | 部分参数训练 | LoRA | QLoRA | -| ---------- | ---------- | ----------- | ---- | ----- | -| 预训练 | ✅ | ✅ | ✅ | ✅ | -| 指令监督微调 | ✅ | ✅ | ✅ | ✅ | -| 奖励模型训练 | | | ✅ | ✅ | -| PPO 训练 | | | ✅ | ✅ | -| DPO 训练 | ✅ | | ✅ | ✅ | +| 方法 | 全参数训练 | 部分参数训练 | LoRA | QLoRA | +| ---------------------- | ------------------ | ------------------ | ------------------ | ------------------ | +| 预训练 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| 指令监督微调 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| 奖励模型训练 | | | :white_check_mark: | :white_check_mark: | +| PPO 训练 | | | :white_check_mark: | :white_check_mark: | +| DPO 训练 | :white_check_mark: | | :white_check_mark: | :white_check_mark: | - 使用 `--quantization_bit 4/8` 参数来启用 QLoRA 训练。 From a46f27747772f5baa5b279212a0ae3e01422fdd8 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Thu, 17 Aug 2023 17:59:26 +0800 Subject: [PATCH 42/45] fix streaming in pt stage #548 #549 Former-commit-id: b0ed0dec5e6788a0344c09a6cc58d1116265fd68 --- src/llmtuner/dsets/loader.py | 39 ++++++-------------------------- src/llmtuner/dsets/preprocess.py | 10 ++++---- src/llmtuner/dsets/utils.py | 31 ++++++++++++++++++++++++- src/llmtuner/tuner/sft/metric.py | 3 +-- 4 files changed, 43 insertions(+), 40 deletions(-) diff --git a/src/llmtuner/dsets/loader.py b/src/llmtuner/dsets/loader.py index 6e293c78..08c35f27 100644 --- a/src/llmtuner/dsets/loader.py +++ b/src/llmtuner/dsets/loader.py @@ -1,48 +1,25 @@ import os -import hashlib -from typing import TYPE_CHECKING, List, Optional +from typing import TYPE_CHECKING, List, Union -from datasets import Value, concatenate_datasets, interleave_datasets, load_dataset +from datasets import concatenate_datasets, interleave_datasets, load_dataset +from llmtuner.dsets.utils import checksum, EXT2TYPE from llmtuner.extras.logging import get_logger if TYPE_CHECKING: - from datasets import Dataset + from datasets import Dataset, IterableDataset from llmtuner.hparams import ModelArguments, DataArguments logger = get_logger(__name__) -EXT2TYPE = { - "csv": "csv", - "json": "json", - "jsonl": "json", - "txt": "text" -} - - -def checksum(data_files: List[str], file_sha1: Optional[str] = None) -> None: - if file_sha1 is None: - logger.warning("Checksum failed: missing SHA-1 hash value in dataset_info.json.") - return - - if len(data_files) != 1: - logger.warning("Checksum failed: too many files.") - return - - with open(data_files[0], "rb") as f: - sha1 = hashlib.sha1(f.read()).hexdigest() - if sha1 != file_sha1: - logger.warning("Checksum failed: mismatched SHA-1 hash value at {}.".format(data_files[0])) - - def get_dataset( model_args: "ModelArguments", data_args: "DataArguments" -) -> "Dataset": +) -> Union["Dataset", "IterableDataset"]: max_samples = data_args.max_samples - all_datasets: List["Dataset"] = [] # support multiple datasets + all_datasets: List[Union["Dataset", "IterableDataset"]] = [] # support multiple datasets for dataset_attr in data_args.dataset_list: logger.info("Loading dataset {}...".format(dataset_attr)) @@ -94,9 +71,7 @@ def get_dataset( if dataset_attr.system_prompt: # add system prompt if data_args.streaming: - features = dataset.features - features["system"] = Value(dtype="string", id=None) - dataset = dataset.map(lambda _: {"system": dataset_attr.system_prompt}, features=features) + dataset = dataset.map(lambda _: {"system": dataset_attr.system_prompt}) else: dataset = dataset.add_column("system", [dataset_attr.system_prompt] * len(dataset)) diff --git a/src/llmtuner/dsets/preprocess.py b/src/llmtuner/dsets/preprocess.py index 3cc5a483..1fc146f8 100644 --- a/src/llmtuner/dsets/preprocess.py +++ b/src/llmtuner/dsets/preprocess.py @@ -1,25 +1,25 @@ import tiktoken -from typing import TYPE_CHECKING, Any, Dict, Generator, List, Literal +from typing import TYPE_CHECKING, Any, Dict, Generator, List, Literal, Union from itertools import chain from llmtuner.extras.constants import IGNORE_INDEX from llmtuner.extras.template import get_template_and_fix_tokenizer if TYPE_CHECKING: - from datasets import Dataset + from datasets import Dataset, IterableDataset from transformers import Seq2SeqTrainingArguments from transformers.tokenization_utils import PreTrainedTokenizer from llmtuner.hparams import DataArguments def preprocess_dataset( - dataset: "Dataset", + dataset: Union["Dataset", "IterableDataset"], tokenizer: "PreTrainedTokenizer", data_args: "DataArguments", training_args: "Seq2SeqTrainingArguments", stage: Literal["pt", "sft", "rm", "ppo"] -) -> "Dataset": - column_names = list(dataset.column_names) +) -> Union["Dataset", "IterableDataset"]: + column_names = list(next(iter(dataset)).keys()) template = get_template_and_fix_tokenizer(data_args.template, tokenizer) def construct_example(examples: Dict[str, List[Any]]) -> Generator[Any, None, None]: diff --git a/src/llmtuner/dsets/utils.py b/src/llmtuner/dsets/utils.py index f816649e..bf337014 100644 --- a/src/llmtuner/dsets/utils.py +++ b/src/llmtuner/dsets/utils.py @@ -1,4 +1,7 @@ -from typing import TYPE_CHECKING, Dict, Union +import hashlib +from typing import TYPE_CHECKING, Dict, List, Optional, Union + +from llmtuner.extras.logging import get_logger if TYPE_CHECKING: from datasets import Dataset, IterableDataset @@ -6,6 +9,32 @@ if TYPE_CHECKING: from llmtuner.hparams import DataArguments +logger = get_logger(__name__) + + +EXT2TYPE = { + "csv": "csv", + "json": "json", + "jsonl": "json", + "txt": "text" +} + + +def checksum(data_files: List[str], file_sha1: Optional[str] = None) -> None: + if file_sha1 is None: + logger.warning("Checksum failed: missing SHA-1 hash value in dataset_info.json.") + return + + if len(data_files) != 1: + logger.warning("Checksum failed: too many files.") + return + + with open(data_files[0], "rb") as f: + sha1 = hashlib.sha1(f.read()).hexdigest() + if sha1 != file_sha1: + logger.warning("Checksum failed: mismatched SHA-1 hash value at {}.".format(data_files[0])) + + def split_dataset( dataset: Union["Dataset", "IterableDataset"], data_args: "DataArguments", diff --git a/src/llmtuner/tuner/sft/metric.py b/src/llmtuner/tuner/sft/metric.py index 663b037d..812896ee 100644 --- a/src/llmtuner/tuner/sft/metric.py +++ b/src/llmtuner/tuner/sft/metric.py @@ -25,7 +25,7 @@ class ComputeMetrics: Uses the model predictions to compute metrics. """ preds, labels = eval_preds - score_dict = {"accuracy": [], "rouge-1": [], "rouge-2": [], "rouge-l": [], "bleu-4": []} + score_dict = {"rouge-1": [], "rouge-2": [], "rouge-l": [], "bleu-4": []} preds = np.where(preds != IGNORE_INDEX, preds, self.tokenizer.pad_token_id) labels = np.where(labels != IGNORE_INDEX, labels, self.tokenizer.pad_token_id) @@ -49,6 +49,5 @@ class ComputeMetrics: bleu_score = sentence_bleu([list(label)], list(pred), smoothing_function=SmoothingFunction().method3) score_dict["bleu-4"].append(round(bleu_score * 100, 4)) - score_dict["accuracy"].append(float(len(label) != 0 and pred[:len(label)] == label)) return {k: float(np.mean(v)) for k, v in score_dict.items()} From 623a34b16f7961c0f742f1fcdf1acdbc27159433 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Thu, 17 Aug 2023 22:21:34 +0800 Subject: [PATCH 43/45] fix generation bug #532 Former-commit-id: be21fc83f9aed0af1e5a2f83f5d5eeb36f1d283c --- src/llmtuner/chat/stream_chat.py | 7 +++---- src/llmtuner/extras/misc.py | 32 +++--------------------------- src/llmtuner/tuner/ppo/trainer.py | 5 ++--- src/llmtuner/tuner/sft/trainer.py | 12 +++++------ src/llmtuner/tuner/sft/workflow.py | 5 ++--- 5 files changed, 15 insertions(+), 46 deletions(-) diff --git a/src/llmtuner/chat/stream_chat.py b/src/llmtuner/chat/stream_chat.py index 00b25b45..b6d71fcf 100644 --- a/src/llmtuner/chat/stream_chat.py +++ b/src/llmtuner/chat/stream_chat.py @@ -3,7 +3,7 @@ from typing import Any, Dict, Generator, List, Optional, Tuple from threading import Thread from transformers import TextIteratorStreamer -from llmtuner.extras.misc import dispatch_model, get_logits_processor, get_stopping_criteria +from llmtuner.extras.misc import dispatch_model, get_logits_processor from llmtuner.extras.template import get_template_and_fix_tokenizer from llmtuner.tuner.core import get_infer_args, load_model_and_tokenizer @@ -49,10 +49,9 @@ class ChatModel: top_p=top_p or gen_kwargs["top_p"], top_k=top_k or gen_kwargs["top_k"], repetition_penalty=repetition_penalty or gen_kwargs["repetition_penalty"], - eos_token_id=self.tokenizer.eos_token_id, + eos_token_id=[self.tokenizer.eos_token_id] + self.tokenizer.additional_special_tokens_ids, pad_token_id=self.tokenizer.pad_token_id, - logits_processor=get_logits_processor(), - stopping_criteria=get_stopping_criteria(self.tokenizer.additional_special_tokens_ids) + logits_processor=get_logits_processor() )) if max_length: diff --git a/src/llmtuner/extras/misc.py b/src/llmtuner/extras/misc.py index b3e0e4b1..db91b337 100644 --- a/src/llmtuner/extras/misc.py +++ b/src/llmtuner/extras/misc.py @@ -2,9 +2,8 @@ import torch from typing import TYPE_CHECKING, List, Optional, Tuple from transformers import ( LogitsProcessor, - LogitsProcessorList, - StoppingCriteria, - StoppingCriteriaList + InfNanRemoveLogitsProcessor, + LogitsProcessorList ) from llmtuner.extras.constants import LAYERNORM_NAMES @@ -33,37 +32,12 @@ class AverageMeter: self.avg = self.sum / self.count -class InvalidScoreLogitsProcessor(LogitsProcessor): - - def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor: - if torch.isnan(scores).any() or torch.isinf(scores).any(): - scores.zero_() - scores[..., 0] = 1.0 - return scores - - def get_logits_processor() -> LogitsProcessorList: logits_processor = LogitsProcessorList() - logits_processor.append(InvalidScoreLogitsProcessor()) + logits_processor.append(InfNanRemoveLogitsProcessor()) return logits_processor -class StopWordsCriteria(StoppingCriteria): - - def __init__(self, stop_ids: List[int]) -> None: - super().__init__() - self.stop_ids = stop_ids - - def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool: - return any([stop_id in input_ids[:, -1] for stop_id in self.stop_ids]) - - -def get_stopping_criteria(stop_ids: List[int]) -> StoppingCriteriaList: - stopping_criteria = StoppingCriteriaList() - stopping_criteria.append(StopWordsCriteria(stop_ids)) - return stopping_criteria - - def count_parameters(model: torch.nn.Module) -> Tuple[int, int]: r""" Returns the number of trainable parameters and number of all parameters in the model. diff --git a/src/llmtuner/tuner/ppo/trainer.py b/src/llmtuner/tuner/ppo/trainer.py index fa4170f6..4474b5bb 100644 --- a/src/llmtuner/tuner/ppo/trainer.py +++ b/src/llmtuner/tuner/ppo/trainer.py @@ -10,7 +10,7 @@ from trl import PPOTrainer from trl.core import LengthSampler from llmtuner.extras.logging import get_logger -from llmtuner.extras.misc import AverageMeter, count_parameters, get_logits_processor, get_stopping_criteria +from llmtuner.extras.misc import AverageMeter, count_parameters, get_logits_processor from llmtuner.tuner.core.trainer import PeftTrainer from llmtuner.tuner.ppo.utils import cast_layernorm_dtype, replace_model @@ -74,10 +74,9 @@ class PPOPeftTrainer(PPOTrainer, PeftTrainer): # Keyword arguments for `model.generate` gen_kwargs = self.generating_args.to_dict() - gen_kwargs["eos_token_id"] = self.tokenizer.eos_token_id + gen_kwargs["eos_token_id"] = [self.tokenizer.eos_token_id] + self.tokenizer.additional_special_tokens_ids gen_kwargs["pad_token_id"] = self.tokenizer.pad_token_id gen_kwargs["logits_processor"] = get_logits_processor() - gen_kwargs["stopping_criteria"] = get_stopping_criteria(self.tokenizer.additional_special_tokens_ids) length_sampler = LengthSampler(max_target_length // 2, max_target_length) unwrapped_model: "AutoModelForCausalLMWithValueHead" = self.accelerator.unwrap_model(self.model) diff --git a/src/llmtuner/tuner/sft/trainer.py b/src/llmtuner/tuner/sft/trainer.py index 6243928f..1ddaec1f 100644 --- a/src/llmtuner/tuner/sft/trainer.py +++ b/src/llmtuner/tuner/sft/trainer.py @@ -50,9 +50,10 @@ class Seq2SeqPeftTrainer(PeftTrainer): loss, generated_tokens, labels = super().prediction_step( model, inputs, prediction_loss_only=prediction_loss_only, ignore_keys=ignore_keys ) - generated_tokens = ( - generated_tokens[:, max(prompt_len, label_len):] if generated_tokens is not None else None - ) + if generated_tokens is not None: + generated_tokens[:, :max(prompt_len, label_len)] = ( + self.tokenizer.pad_token_id * torch.ones_like(generated_tokens[:, :max(prompt_len, label_len)]) + ) return (loss, generated_tokens, labels) @@ -72,10 +73,7 @@ class Seq2SeqPeftTrainer(PeftTrainer): assert self.tokenizer.padding_side == "left", "This method only accepts left-padded tensor." pad_token_id = self.tokenizer.pad_token_id else: - if self.model.config.pad_token_id is not None: - pad_token_id = self.model.config.pad_token_id - else: - raise ValueError("Pad_token_id must be set in the configuration of the model.") + raise ValueError("PAD token is required.") padded_tensor = pad_token_id * torch.ones_like(tgt_tensor) padded_tensor[:, -src_tensor.shape[-1]:] = src_tensor # adopt left-padding diff --git a/src/llmtuner/tuner/sft/workflow.py b/src/llmtuner/tuner/sft/workflow.py index f2d72fc6..5b0f836b 100644 --- a/src/llmtuner/tuner/sft/workflow.py +++ b/src/llmtuner/tuner/sft/workflow.py @@ -5,7 +5,7 @@ from transformers import DataCollatorForSeq2Seq from llmtuner.dsets import get_dataset, preprocess_dataset, split_dataset from llmtuner.extras.constants import IGNORE_INDEX -from llmtuner.extras.misc import get_logits_processor, get_stopping_criteria +from llmtuner.extras.misc import get_logits_processor from llmtuner.extras.ploting import plot_loss from llmtuner.tuner.core import load_model_and_tokenizer from llmtuner.tuner.sft.metric import ComputeMetrics @@ -52,10 +52,9 @@ def run_sft( # Keyword arguments for `model.generate` gen_kwargs = generating_args.to_dict() - gen_kwargs["eos_token_id"] = tokenizer.eos_token_id + gen_kwargs["eos_token_id"] = [tokenizer.eos_token_id] + tokenizer.additional_special_tokens_ids gen_kwargs["pad_token_id"] = tokenizer.pad_token_id gen_kwargs["logits_processor"] = get_logits_processor() - gen_kwargs["stopping_criteria"] = get_stopping_criteria(tokenizer.additional_special_tokens_ids) # Training if training_args.do_train: From caf4a61e21d04bd26564f4f42a9d5a457d8c5bde Mon Sep 17 00:00:00 2001 From: hiyouga Date: Fri, 18 Aug 2023 00:34:59 +0800 Subject: [PATCH 44/45] fix ChatGLM2 ppo #527 #528 Former-commit-id: 9f4c2adc9a9ca8e458d3868805e077182e0d336a --- src/llmtuner/chat/stream_chat.py | 2 +- src/llmtuner/extras/misc.py | 6 +-- src/llmtuner/tuner/ppo/trainer.py | 70 ++++++++++++++++++++++++++++-- src/llmtuner/tuner/ppo/workflow.py | 1 + src/llmtuner/tuner/rm/trainer.py | 2 +- src/llmtuner/tuner/sft/workflow.py | 2 +- 6 files changed, 72 insertions(+), 11 deletions(-) diff --git a/src/llmtuner/chat/stream_chat.py b/src/llmtuner/chat/stream_chat.py index b6d71fcf..0d22bb5a 100644 --- a/src/llmtuner/chat/stream_chat.py +++ b/src/llmtuner/chat/stream_chat.py @@ -49,7 +49,7 @@ class ChatModel: top_p=top_p or gen_kwargs["top_p"], top_k=top_k or gen_kwargs["top_k"], repetition_penalty=repetition_penalty or gen_kwargs["repetition_penalty"], - eos_token_id=[self.tokenizer.eos_token_id] + self.tokenizer.additional_special_tokens_ids, + eos_token_id=list(set([self.tokenizer.eos_token_id] + self.tokenizer.additional_special_tokens_ids)), pad_token_id=self.tokenizer.pad_token_id, logits_processor=get_logits_processor() )) diff --git a/src/llmtuner/extras/misc.py b/src/llmtuner/extras/misc.py index db91b337..b57b1c8f 100644 --- a/src/llmtuner/extras/misc.py +++ b/src/llmtuner/extras/misc.py @@ -1,10 +1,6 @@ import torch from typing import TYPE_CHECKING, List, Optional, Tuple -from transformers import ( - LogitsProcessor, - InfNanRemoveLogitsProcessor, - LogitsProcessorList -) +from transformers import InfNanRemoveLogitsProcessor, LogitsProcessorList from llmtuner.extras.constants import LAYERNORM_NAMES diff --git a/src/llmtuner/tuner/ppo/trainer.py b/src/llmtuner/tuner/ppo/trainer.py index 4474b5bb..f929b6ec 100644 --- a/src/llmtuner/tuner/ppo/trainer.py +++ b/src/llmtuner/tuner/ppo/trainer.py @@ -7,7 +7,7 @@ from typing import TYPE_CHECKING, Callable, Dict, List, Optional, Tuple from transformers import TrainerState, TrainerControl from trl import PPOTrainer -from trl.core import LengthSampler +from trl.core import LengthSampler, PPODecorators, logprobs_from_logits from llmtuner.extras.logging import get_logger from llmtuner.extras.misc import AverageMeter, count_parameters, get_logits_processor @@ -35,6 +35,7 @@ class PPOPeftTrainer(PPOTrainer, PeftTrainer): finetuning_args: "FinetuningArguments", generating_args: "GeneratingArguments", callbacks: List["LogCallback"], + compute_dtype: torch.dtype, **kwargs ): PPOTrainer.__init__(self, **kwargs) @@ -42,6 +43,7 @@ class PPOPeftTrainer(PPOTrainer, PeftTrainer): self.finetuning_args = finetuning_args self.generating_args = generating_args self.log_callback = callbacks[0] + self.compute_dtype = compute_dtype self.state = TrainerState() self.control = TrainerControl() @@ -74,7 +76,7 @@ class PPOPeftTrainer(PPOTrainer, PeftTrainer): # Keyword arguments for `model.generate` gen_kwargs = self.generating_args.to_dict() - gen_kwargs["eos_token_id"] = [self.tokenizer.eos_token_id] + self.tokenizer.additional_special_tokens_ids + gen_kwargs["eos_token_id"] = list(set([self.tokenizer.eos_token_id] + self.tokenizer.additional_special_tokens_ids)) gen_kwargs["pad_token_id"] = self.tokenizer.pad_token_id gen_kwargs["logits_processor"] = get_logits_processor() @@ -183,12 +185,74 @@ class PPOPeftTrainer(PPOTrainer, PeftTrainer): replace_model(unwrapped_model, target="reward") batch = self.prepare_model_inputs(queries, responses) _, _, values = self.model(**batch, output_hidden_states=True, return_dict=True) - if values.size(0) != batch["input_ids"].size(0): + if values.size(0) != batch["input_ids"].size(0): # adapt chatglm2 values = torch.transpose(values, 0, 1) rewards = [reward for reward in values[:, -1].float().detach().cpu()] # use fp32 type replace_model(unwrapped_model, target="default") return rewards + @PPODecorators.empty_cuda_cache() + def batched_forward_pass( + self, + model: "AutoModelForCausalLMWithValueHead", + queries: torch.Tensor, + responses: torch.Tensor, + model_inputs: dict, + return_logits: Optional[bool] = False + ): + r""" + Calculates model outputs in multiple batches. + + Subclass and override to inject custom behavior. + """ + bs = len(queries) + fbs = self.config.mini_batch_size + all_logprobs = [] + all_logits = [] + all_masks = [] + all_values = [] + + for i in range(math.ceil(bs / fbs)): + input_kwargs = {key: value[i * fbs : (i + 1) * fbs] for key, value in model_inputs.items()} + query_batch = queries[i * fbs : (i + 1) * fbs] + response_batch = responses[i * fbs : (i + 1) * fbs] + input_ids = input_kwargs["input_ids"] + attention_mask = input_kwargs["attention_mask"] + + with torch.cuda.amp.autocast(dtype=self.compute_dtype): # support bf16 + logits, _, values = model(**input_kwargs) + + if values.size(0) != input_ids.size(0): # adapt chatglm2 + values = torch.transpose(values, 0, 1) + + logprobs = logprobs_from_logits(logits[:, :-1, :], input_ids[:, 1:]) + masks = torch.zeros_like(attention_mask) + masks[:, :-1] = attention_mask[:, 1:] + + for j in range(len(query_batch)): + start = len(query_batch[j]) - 1 + if attention_mask[j, 0] == 0: # offset left padding + start += attention_mask[j, :].nonzero()[0] + end = start + len(response_batch[j]) + + masks[j, :start] = 0 + masks[j, end:] = 0 + + if return_logits: + all_logits.append(logits) + else: + del logits + all_values.append(values) + all_logprobs.append(logprobs) + all_masks.append(masks) + + return ( + torch.cat(all_logprobs), + torch.cat(all_logits)[:, :-1] if return_logits else None, + torch.cat(all_values)[:, :-1], + torch.cat(all_masks)[:, :-1], + ) + def save_model(self, output_dir: Optional[str] = None) -> None: r""" Saves model checkpoint. diff --git a/src/llmtuner/tuner/ppo/workflow.py b/src/llmtuner/tuner/ppo/workflow.py index 243468cc..12fcdef1 100644 --- a/src/llmtuner/tuner/ppo/workflow.py +++ b/src/llmtuner/tuner/ppo/workflow.py @@ -60,6 +60,7 @@ def run_ppo( finetuning_args=finetuning_args, generating_args=generating_args, callbacks=callbacks, + compute_dtype=model_args.compute_dtype, config=ppo_config, model=model, ref_model=None, diff --git a/src/llmtuner/tuner/rm/trainer.py b/src/llmtuner/tuner/rm/trainer.py index 55790c07..99b4b152 100644 --- a/src/llmtuner/tuner/rm/trainer.py +++ b/src/llmtuner/tuner/rm/trainer.py @@ -42,7 +42,7 @@ class PairwisePeftTrainer(PeftTrainer): """ batch_size = inputs["input_ids"].size(0) // 2 _, _, values = model(**inputs, output_hidden_states=True, return_dict=True) - if values.size(0) != inputs["input_ids"].size(0): + if values.size(0) != inputs["input_ids"].size(0): # adapt chatglm2 values = torch.transpose(values, 0, 1) r_accept, r_reject = values[:, -1].split(batch_size, dim=0) loss = -torch.log(torch.sigmoid(r_accept - r_reject)).mean() diff --git a/src/llmtuner/tuner/sft/workflow.py b/src/llmtuner/tuner/sft/workflow.py index 5b0f836b..b28fa1dc 100644 --- a/src/llmtuner/tuner/sft/workflow.py +++ b/src/llmtuner/tuner/sft/workflow.py @@ -52,7 +52,7 @@ def run_sft( # Keyword arguments for `model.generate` gen_kwargs = generating_args.to_dict() - gen_kwargs["eos_token_id"] = [tokenizer.eos_token_id] + tokenizer.additional_special_tokens_ids + gen_kwargs["eos_token_id"] = list(set([tokenizer.eos_token_id] + tokenizer.additional_special_tokens_ids)) gen_kwargs["pad_token_id"] = tokenizer.pad_token_id gen_kwargs["logits_processor"] = get_logits_processor() From 66771352bbe4e8d2321a5938808bd5b3abd8dab1 Mon Sep 17 00:00:00 2001 From: hiyouga Date: Fri, 18 Aug 2023 00:40:32 +0800 Subject: [PATCH 45/45] support bf16 ppo #551 Former-commit-id: d125218cde893c7c8527ab27b4d2dfb2474c384d --- src/llmtuner/tuner/core/parser.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/llmtuner/tuner/core/parser.py b/src/llmtuner/tuner/core/parser.py index 7dda0a5c..e039513d 100644 --- a/src/llmtuner/tuner/core/parser.py +++ b/src/llmtuner/tuner/core/parser.py @@ -151,21 +151,19 @@ def get_train_args( training_args.optim = "adamw_torch" if training_args.optim == "adamw_hf" else training_args.optim # suppress warning - if training_args.fp16: - model_args.compute_dtype = torch.float16 - elif training_args.bf16: + if training_args.bf16: if not torch.cuda.is_bf16_supported(): raise ValueError("Current device does not support bf16 training.") model_args.compute_dtype = torch.bfloat16 else: - model_args.compute_dtype = torch.float32 + model_args.compute_dtype = torch.float16 model_args.model_max_length = data_args.max_source_length + data_args.max_target_length # Log on each process the small summary: - logger.info("Process rank: {}, device: {}, n_gpu: {}\n distributed training: {}, 16-bits training: {}".format( + logger.info("Process rank: {}, device: {}, n_gpu: {}\n distributed training: {}, compute dtype: {}".format( training_args.local_rank, training_args.device, training_args.n_gpu, - bool(training_args.local_rank != -1), training_args.fp16 + bool(training_args.local_rank != -1), str(model_args.compute_dtype) )) logger.info(f"Training/evaluation parameters {training_args}")