From b09b13c635a86c2de5d7fff15341518a20d4df0a Mon Sep 17 00:00:00 2001 From: Yaron Date: Wed, 25 Sep 2024 19:13:21 +0300 Subject: [PATCH] scheduler-doc --- docs/Researcher/scheduling/img/fairshare.png | Bin 0 -> 38487 bytes docs/Researcher/scheduling/img/queue.png | Bin 0 -> 15610 bytes .../Researcher/scheduling/img/quota-split.png | Bin 0 -> 54952 bytes .../scheduling/the-runai-scheduler.md | 245 ++++++++---------- docs/Researcher/workloads/workload-support.md | 6 +- docs/home/whats-new-2-15.md | 4 +- graveyard/whats-new-2-14.md | 2 +- 7 files changed, 115 insertions(+), 142 deletions(-) create mode 100644 docs/Researcher/scheduling/img/fairshare.png create mode 100644 docs/Researcher/scheduling/img/queue.png create mode 100644 docs/Researcher/scheduling/img/quota-split.png diff --git a/docs/Researcher/scheduling/img/fairshare.png b/docs/Researcher/scheduling/img/fairshare.png new file mode 100644 index 0000000000000000000000000000000000000000..bde2ef0ef652a0dfbc54705971604381398df4a9 GIT binary patch literal 38487 zcmce;2UJtr);1hOK}E3AL=@$q6ai6+5NQHIP>_xgse*K(lpq~N5vkH50-;4Zp#%uh zRRkeOGY|+d#6oBxprJ`1@b7reJ@>wMyzl$n@&DiW$4J=8-Ya{pz1CcFK6B1z^323o zpLhT9{U8vC*WjA283@D)0p1*Yxqvf$!LL37hkf_1+4zG%JV)7Y4p3H(5O9*i-%S51 zsA}NE9Pnkgo3@cQ2vnQQv*ol01j<-2(ABnhz_CCMuRJk|oZ0agzIudoC6WKYK4I^J zDUSpm5uZ6jPSbWrKi-MuJsf-?Ezw8&n8!Cq*!JFW0uCax`7K5HPH4{}YU5ly0AY96TffaIk^UVDGkJRI?eIYJ}19Omg;n3I;(2@EspG4dO50EykVNMIlTNRB%U9HOR76?Or~=U1eGX9s~& z^}F^02Q5aa5C?F)c9LJ5eYzLryc;-(1^?gtF>?OQMv1t5%P8eU;LeXU&NTZ-pQZM9 z9`ewQ4XNtLEpeXDxoA>JYdh_08#hylwFn*_H?$`&bIo#Y+{@fH)^V0<&Y~>65GUPi8SfVky#fFV1H% zCQkLMj;X7!k)^7wS!g;o8n#6=4C)iKHVST=hxs&$x)WDL7+1Fl<)pAtifv%F{3cX> z`#TRgax*!brv&||ReSOfgDV)dANZrwBQlkEs1T{}Y1fYbTP|M5Ut7%aS}}vTR*qNE ztsME~Cc!9V%1;5oXP!*Afh_7kj%pu=kbT^$$uoA7hwLWLgHhLp;!GEw?71LRKDCR% z1v(7_l}ZQ5?VZS2yuRb1L((V!#pJDeSV!()dPKA)dPG3w^AfQ1!vQ~@xb0AQwqIJE z5Hp&`6}nhb9iITVO=REJo&ga)Fvcq;#9Zer1v<+wzZD$)UzfkNv@?(`CU3;PB>X3G zVLuc%ydV+3#i`X?KFt9Pl))8M?mWdY@E?gyVnXBP1Bur5!CmU>pZ(M9!81AjpSuJd z7OtvAY`uoIz|q+%uv}%E$W|Kn~uP|p(+bTT4cOD?;FIc3%!upVuseyZ{kKnd8mhB`zB#CBUJ93&%tovZ? zCm?VCInXwIXN^uG*9~gWBE|W|^P4RgG3`Np2-(FiZ==)f$CgHDC#FEuqEwZDu!608 zoT*g;<=LFRb@SBs(7}_V%xg?)35J@QKyS^ zozZz})Cynmr+lJ}hm~U)E|nR&+Es`=nd(-*!cpBFx0@nvl%owfl7~Gf4dWnquL!2x zu<(g+V@d|A(g@YDnmb+n9z`|N(^tQe;X*CW_RU%euDkPrPZOD%QOq%v=QJq7AP7dvC$b}(P7;Y&Sew7MII1?&u(zdP7m|Zo&m|V@eZPq4vxGs@lqOd+Al6aO;s(!d-crsXPZ#%b-(;)M@uu z$_+8LM6i8VI^0NRb3>-dc`8j~g zVC?K&hYw#+&Wf)_zJ2N&i0Dob-d5H8l-=;W6n5{h*F#gy$wJ)>SV66o1gJm7aI(iL zZb5AisLkN#106Svw=Q_#IIo~IBvZE}Pfzf|U82-nSYMLqC(|Q!0=aMl=f%%W8v8ue zHswIkKF=93mT`EzB9cZYkbs8$a|G#`GaIMq-K}D zHFq;|BG1-}CyDQJfZAtBnrTI4>QjyCKT3m1iiWmpxe`J~sHKt3<_oEH*R}k44JU`L z_{=)Cs0JXW`?dK@lC^t9l!v0LbVd}_P(@zlkF}vO2l>TsI0+g_n~pzE_w;G{*)0M- zsVJ!}S>T@ja)INihSxJlq>P8haS5ef`_i%vQokTQT-{t@SC-EqMvR@mBezK~y($rO z=!4i4FS5z3Q5C9@eb5d06yNiD(R)w*@ZvYUwyLSZ_vQg#o#5%2@Qf^D{Op@9<{opY zU0giDoLZJfgCfdy!xx<&-0R*e+Q1Xhav3u}gEQ`Y$a~>6ThV%kOp0~9dKhnsT6ktCJuT{$Nf#`*dxK25pz_>QCxB9T54s3dlll@=d^(<9}LEa2MO4YJK}l z22X)LSt=a_8nN5)iys8~WMBS2+1<^*^sC!{WW@hJ^#yZj{d36gF5mf2jK5&LvtnrP znH|vcs`B8dRu15mUoI3Jb?H9>7UJJ!`G5%k9qAVSUlE5=yK}(Sulwsbnd)CN$B0YZ zCic>RNl4iOJyuu2rhPnFLf3V4}1>WSA7Y_f{u(3STA_8k2 zw)5+ikW;)a02rR6inNFsKxeUFcz;Ah$4Tt%z8CUA@q+Sjtu)Ji&Z)$CN*U$Xi1|&U z6K}|YV|EQQa$k+V3(Eg@ZzQ0=gkbVBu;Z}Z&QM%O-p#=HH;BM;R$ zb;cO<%B0^~rt2CQcGQ&y&JXLKT3wR2YaZE&keH*B8e5{d52}I80V}fr4s=BAPl-5} zaVB3yYAO-_;b@NfuHyY6-IB-lRJsKH5_AZwg*BPJYhIrWJ!gBrvdDr17H4nnY*O+3 z$lKQ7<*m>xNbk*kItD*$Kb%~~pTGTj$Sz`oy4|K8x^^SLdUz(_!bSh-8)NbfYo3#9 zp$q^hX-Ieu2hlEVt}m?{@V;@8n&OpBZod>76Ki;QsO1;~((-+uY)L!k8-v6OAt}{T z3B6~M9i3x4<;P~jjY=LD#9h^pqB_)>_hglXLkzU{nJ%ja%$j_~xF460lQ`Ue)8IOO zx~28mWay8#+&nY>Gsqz0V54Uy9eT^MdaLMh(b|H zIb{RahaYA(ZLE(ztzO^W?V@)lDf-2{Ql^SGUc4L zfziQ+s@ZUf%U-57Sa0I{E4s_I5iN+lflLzQ*<64pSkbPh?3K6ReT^S)IFD9yW=cP4 z{rN;b?ClPukEhuY3g8tV5bpYE*u5(p=_(f|za78!%maXFX}0<#@quS++;n@(o<+&oS+vgm%885;y z3jxt%g|1u|Z1xB1sA`LUB4WIPy@l*Sqktq_&IL7ld3W{922>wOgxHzo-I9najHu0m zyqzqQubD2=Z;5EoTMF8|;l0KpM~FnF0SLtvA*vM&to`rbhIRFf&tBhuH>P-x2^ZUL zO!11@Y0E%<>l_8hvqQ9?ia#>c+j#R;{}mcP?4JBk8ha$2N#3PpGsO$COi_ta{NH`D z)`!AXB5bAT{Pq7QP|oh`n$W))mw#2cZtsiyCIP7X922oJtWP$-sZNa{+Xa!SYYW6n zKRY7U3v`~|Hg`wPryOTM!p-_c;x;k0MU?vR%{5!BK55NVG#I6E0+wHP9I6nq*fjGw zhF9b>0HVo8D&(oWF<@ushOgPEd<-yAw*xCl2uPG4a;@Co*|t6j{@Ic0faK?5B^6zN z!K4>U{`8$}C3aN%RGwn1uY;)QQ>?XSkL(S`i;jh$Lxpav>hapA^vjB9TvxH^*{MV( z@14n>7e!c^HeUt*A79=|C7wafs?63|9^A#>Ny7SMuVmq%q(IZfPZx>UYJKHyer|k9 zHWx=QDgw~P&5{ER{dYSYTpd5CPP8ZbSw-01AoRqgSdBARY2*}f{jk&tjB7l!?rx&P zu%UftPUQ-;gtjhg-#UJ3+yPL-RSx^FsVAg5lEG9!?J<2I+zK`m?U;<0&+E7A=>(%^ zHs4F#Mdww#&M5>f-aaL7Tbz=T@=So{KcM>I+;w!alc%r*?77PP#mMb2hiSDpv3lI# z2?Xr**O+Hx$7Yz5g|A0f)Mib+y^hPG2=SsI@`LY*+bk!|@#;9hO%)25pvWvXzyw8? zOP%x3hlGvXnmD?Q13CKbF+G|c*q}VxQ}l&BX!LBneET@tI%+t1h!0UFegyu=CaacZ zX!Y*k^S0|9HUQn_P(7Hb&?yVWe(VSQv`_U}CAkfU!@u%4{K)IWhZ4R8Q8TQWZtC?Z z#EV|S{0opiH|_$+@=$Afg3>98J>aM@90X6i9Prb>kr5-J8B`zWDhTbYJYW|EQ()2IVCy(bib>ftT>AYPkJ!Ev3qJNDT~M z7=Pb93L8?y=3;1*(}y2nkCN;YB0Add0KT?)apP(wrGoxPwzuw*O;NeK@M^mcH&)JD z-EdoJ(}9{tHl{oF*yAy?n{k9DpHmY_dic@|RWKSyYL*3D9ywO^pljpcq2F6N808U+ z63KXh0E>`_pHupUrBMqrD5{=&~Vm^WIcf2 zA%=|~n@UXU5$SxPGJ)pFNJbdBI=gx&B8X%4mBg?#WHs($i|oR9ZRd_0YqD^E;q)Df zX}vwSLFtv}qpvSPY)vOj(qkFm1FY&q+a+kcO?z_rBSR5frA^%ySE+5?wzXdfU~DWR@6%fD_Z4Rjcw>~X zxvMR!?Ffe*w?-u}t&nOhObepUq)^&1)YQoSZEIC1EeUaxQbD;(io?Aot2Hk5om`ko zL!!+??FO^jOZ7YsrKsHgx}K&|K9hKnao?L}+gHMQ3|!L??R;lLZ(&_<820I{@tWAR zNH4P6!6-&v@5vPpo0T3!HN&a0jv5`?`gMOtUh83H*womQ?SX;oeNKJO89FRjo89@m zW5X~UtOL$vL~=dcce-;Nsqr}9E#YcSe(#b=f_^AL?3Q^x|-S( zv`=wDpq>*p#_*PnnyA81U1f2dQGi<5`%BEJT z0xFgjF#OV9RB$R%r;$3cnHAY`CvHTk%Gre>`%|wzWws#kgK>eh!rV&zt@!I}pj#rL z?U7iYOuD-U(Y!aLs@c5ueW7_Lk@~_{qy%BzF+31fDp5pgI8A)zL`j34{^YT3+ySM$ zfIS-;(0=GeZt>oxr&^p->-P%J@lh9O`1}n1gKn#-R(na@@R8w3!wXrF5y1`O!`M4$ zRbZo`j?J;WANh`nRtplTwZV6x@vC-p<|C+#Maz16RG`)?f$H<&cgN-4`~l0+ot#yN zxd+#E3^R1VaFCZ<8aij0icIvVSUF~CR{2rK+8$$vC>28LPF{Z2IvhGF=}fgdwn<#C zWT4!o8jap^i! z{)YEYK6!kv=Y&f5vgGzW#pUCTo3Fv$>=3CTEfkwTd%g2R4U;1w8RXunGK`spLJgwX z7{l^7753xpyLk0@cmhEdvX2-6i-3AC-ahdG+uo&3U#jd8NlQ^No>hWPRkP+sGP;V# z9wKZ@(NCdY;O~zkl2jPp#Jc;L6s`qtgme^6Nv-bH z9DSk6?!}W3MU3++K+S0sZnDYr^XP_lvPW30RoOz>_fy+Ho>pahpQ*ca64_o7o8f?H*ky@) zF_o6hyDR^TwaxqvTzteuKc@_bJxrT7Q5=s#7MThQN{B(%!enl>J4B`|EG6BKDW3H< z!Cp*! zVgzbJvR)jsU8ZK|H4;RSgV!H!JLZ0z@EUh0Wg?URM#!wcGR6?D(-5zialWB-V-q?a zs}(}#d*u_|$QkG*@u}5EH8GIGTs6JvffatXkp@2X;0wo&?WmK2Wdzg6c3{C>X~WAB zH#9VC*bMg^PpvxgC@~4K)P5w+N1T}iANzJIwSJqd?3^QUiS%%y$3)quQ46<&ITbaW z+BAEM7~2kd)`9SDf&=z+4_{B#Et@m29IZ*A&#eW1eO8XEZOoGy@$F;MXW%Cs`6a;Z zCaQOnO;;Mx@oJcx!gqV4c2R?@469Hm)KOHU`|*}>%B+g(l0V9|cl)GlM}zzLlXxaY zjya-3sh}>wqtHu)B`mUG+OlB}9^pXA_G##Gs4$C(c$#=I&1cUr3@gy$9XUI+0$mZE zcl(?~c#=4IhgzX~xA*#z7r4)tdm}K%jfRT|Y7rS&6OTNU(RT7o2Xc1P=ax-|{%k>W z$+hLtw&DFPi{}3SEts{kRAK1$d@!w-mUoi+vpPFlM zjkng<7O+JO+(AXBv0H(jj>9vRDOm5@&?mLtz6JviIvZ@ibwl4y=WP}Q&kiqP#{KG* zJ$EFTxxRg#9c8#pvPK$foA7q$S5W&h@>8EV*4aP36Dl~ z>~fEI@-O-;N~XIs1JX3;0+_C05m_kBF}QHyBQj`muCIQKQoZ5PZmCJ}MUvF47EnUL zsLyT~%FRj1YVRg1WC=r;cEfIN(3^xsn|`=$gdaDZOIWR2u#V+1={v9ga%pZYJ8p8R z;lx$D2O?e?aLpL+peJ(#bY-Yi{J5YNRHiu59{N{fTXoQr6w!nh(f&=!|C~mX>Fd&}zDPiFJN3V8E?;8B$7@(Yy&> zb|Y_tYvtmIb*RkBpZwwn&LMFPc%0gEH#hRBi~`?$Yxv3;x)8JJ@`+47qmLrx-lY}s z8P zzR!91!AA>vYeuiA_1S0qqLM70t1$6Xtp!v}sPJ5VH0Qy`S0`r=eh?`=3{gu|E1X6wxfBxSIzei z$t`0Jk>s8536B!hl|`akULX)9s?OGoY-cA=L?G3zj5x~Okd1IljZh$U(bPB@(ua)P z-Y}n}Vf!&gAM}NvrWsB?x5s8U^@_Yd;Cjexe=zFQRN}PSsM3i4p!y7)K0%G{lYHab z`V$h=EAisBQ{e2-=~I&I2pSI^2zdl1YcNZptq<;}Z;TljuoDk{P^|ZTcGQYg=ax*d zKlZAS(ip)C>F9S+UmY>uzC>z-1uakaFXL%-A>(d7xgyHmKXzb~t--kUB}zx6p|Iym zMG6ofGyX^e!hHc=V^zq^vmH4=cy2xUV*3_VzC~O==~#Qod(~N*;%;^#F3o##2sVr@ z%(?I}SbS66780I3{i0~K;)L_ELvuixdIY<8Jp@M|T=qDg$6M&t(d#imESPVhqQhb>x` zm4QjG&hjVaim{CJ>5nhJJK*7H>ad?2Fj?Qi`zt;&37A{EE&{odHj6m6!dYYl>yQ$< zD%?ee732CUwFg8BId=*<)qv=i+zX&_l-Nd zVadpq?`Z3@XDxM5#1Du}GMC1@u&k*R6)tN4sM&H@-5F?n zM2oBthW0fn@AeVH-j_6~--Yh3Of>m^-CfT^91ro7)goq~`OCA`vSID2t}hjV=?HIB zj%rzICvmrIH~#U;V<9x5L10`FK4D2gQ%84fBfz4b9QG@${l;Main)fL{G(GoHnOU7 z{m4P2@J?poKj|+lJ6YBDY8RKQnXsCMqz(P8Ppbcj(_>Bkh z7~U-m%vr)Z_Uf*vPuz`@JUnAlv34P7RWklhpXk1s>15BRAWvfb37hC#l@-T#g9Ar7)r73S0Q1F@_P_3BcgE= z%ujbC{Y?u!gAk}2FD`@!naX4jW2C<} zmqGam24@*pla{Qn%4f-uG%rV*5Rw`obC-;05Nmd7W=y##XN-= zkdm;M>J`4;q4YqpZ2RXb#y~Pq6PCVlA{g~D7?se?*PidV01-i+RNG7Fb}YFPSZ=xS z?wxleV2CzoiWpffJ;l6*vMGBxtNPu3Kq$k=Ho~;O{itkp1j-Hw@&EWL)$!K-j`b%K zF{vJ3Ahsjbm&MCP`cb!x$JoZFw&m_ zfS&`nFA6p-txjmHt*_`u$!WS)z&HbPIB>&IH2C`;jBXcXlF9_I%Ghqp1n(j*-Lx}= z$WO&}=E;Odlk|5NeV%XdR@}HZrLv0@rQ^O1?J^#exxCtv{@H?y4mnrXJ|rMHG3<3N z&qr^reu0^Dk{Iz$uLQzxK^~v`d4_KLhJh+SCN&=+W@TmAz7c%PE}%59oPlv2*<_ND z#(PM6nw`P8D>9v1*OZvv5hbryJxO^4X#1(^-efM+s;8jqqt+Dt$;@)Q$)0Vp}sHg#t0H1Vs>FR+@_2iY~cRYJ*H0qqgFErerOKB_Z zS3cl#i&ZHZuAFzH{-GG@$TA$}wQ>>iyG1;4Nm!oqd$DPn-M5i;6zdBDf8?PYu zA8EkM`V-`v575#o1;n6}7ti0%kfmLGIF@wehK7yJRcm2>q_VZ@bXxK1)BfDG(J+j` zxb2ZXUrk^k+|^|cyEb|?blb>eX_(&?+e3rA$>%wjqH-1xJj-;z4HK@E2+U+az(gK$ z9XVAk5G5?|+ru%>=oJZ`N_-2C^AaP2wM1ebb;<1>iShZ~>SkSBjE}3Solq)#Ry%yV z@?euhbGhJCk7)C6^`-+B_yLCiH$e~2$q;$X&lQgxI2=*KvrdBbHb-i$&V<`1d#Bcz zLRUU7K2ps#UV#@_dcRnPU<(b>W6HGN-?P4+-da-_GIrLq|>MOYt zo8FDPpm#|cnDyG8vx+hwF1orK8206FlZezqBHG>UgUnY@Vn&e$4Sx8X@fjeDsn$Eg z3ssRe7hxH&e$fjzo%%%R$NC+p1t|nGt-rJ~kV56sgefwPi~GdR`zFPjl0$eoSADC^%KKG7`LJ`ilGISb$DYd z(UIQQ2-QT$QH<^%$NSG-?@JZsJ==#f@sU z`Fwnx9zEqZ%vg>g@0=$YU90v&&aOj)GMxbI@jf>a|JPNB3ZW~tRpB+HTWQiM+ExGc z?958NL_$PWZ%x#wUwzB<+V&C>W&-Bfc>Z@r!oH)U@#E6$3NfO+<-qlCmP_A08xJpy zdKtRV7d=Ipn}_(=pr2v(QH13!18f1aLBJvQ%j^CA00l(j>y+RYYDdd!baorPq)INU zlOxQBH!b@LC=}A*%$>86cT}v*ckTNbuD4v{WPYbUYQz*GCCZ7Y#cS6!`|Ia--@#nK~BTt#^2}b1{ z3f5VkEy-yaW_0CfI{pqw2%fhup)G4omdWL_E#ztM@tU{ln+tX3_SU=R@9u1~7OPqo z8IkP7@angr0-Z%5PaMe3Lj%;CfM|%p)n`_&rI^bA*giW6e()n--r@QgfIn3PaHV|8 zHav5sU!3^|*p|_upywLGh=WhEG>d=Fq+g#e|v>9e`ATZ-16jn%~Wg!NELD3fiHgePl-A z#8v9UO2Ft3l`lTf1AFi30us=-Lq89OqdDvDc6ri#|n!z{6CQ6^@2z*D4i?v)73 za8iC->Yec#Q@=bEgfP-YBIMt10U6Igh2@yitFNB&<;Znx`Ds>5b3gpYB_+>mMBs+$ zt@%5BQ%`K_?iz(zRm*g*2CG{%%@vbpMqk$jFW==}DIew+mq4D`e-RmB<=DOyzT^*3 zxw5a_ATXV|iJnFe0Pr0q^BA5J;vjo`{~w|Ow8(z_Jcrf?KVR)G8KWyU6^|K@?SgXi zFmo4X>Xy7VR&wp}S8_uaRZlJKpE6#izp(9Ccq2ynR)jHO;IP>8^GbFaDN=94*l7<} zXGVsAYzJ-x&gUwbGJph+4ffeiO!PaH51bN%SqNT&&8k38yzns^prxzm(#rET09t{k z#bGHN4}49gLQ>vc7{f2tuahTBlBl8#a?%x>okx-$-O$c|n)>{t=V=pX%x>q0On|Lr z9586c7%H;@!o!j_k_M8!k}0#Q*`*^4#~r9yA68fL=bYm^L??5Z! z6ceYb-DLA{6(VSreh08{zQa`FT(1aWRF6BIX~#^^faTFtVD7nybKct~!hiGIb7-*|LJWAR)&E;yTd{!f z9^GMKZq&N$v+E%9O0bQ&_RIYW}@-j4VqQu6hO|8YsV>NaMcBi;cUB-oLzw z?Jh1$J@2!98~RwfN2DJo0tXdws)F4|VD*$C*yIpLM!y3$YGZ@b^|?wpHLzUd9W&e%{F1O%Su?Zj6KkVd_*p z4KAL3F*aSj%4MNF>3(;zN3MhK?m||6#EUVU$#Ts`#i}|uGGBxN8E-XJmcP|yO!e;b z;51FQ0R-0a<@x6BegBMMj7T0PB97k?BuYP%B*r!zffu?wFA^=@Wmw{g7KyjLjwy); z(@mC3x=EH|jO7PF#;ByVm@3JX>#wupNkb@+92yT?zousE zI1yr<^2SC+KhK6?LNmiA8uIe{v#puYt|YFM`o{yD7w?S;Nl8f=*icA?h-6GamK8_! zn@@Fo-9QL%hSVz+7>yR-OT0tjX)zi0RnCNcmC_Nk^;A_nh18bPVa1{yDp_1DAh5E; z-Bly2mqZUQORc!nx+C{mG)9=WKLSfQXK6+oc`8!+==Ts}!tG_L%+@L;lfK|mr=->J zjSZ5p&wxMy5La0{zZlZbBYl)kTeXqR)~Fu0Y?m}I8(y)hA`Z$d(iRL8zFxZLmM{`z zZJ;eH##)hRh!;4Z#d&0hu=F4;8tB0EmS+C3-( zHg*ibN9^V^%ie18P%-P%md`KqRFSKvVJlUX)`G!`E<3UdChuU=!o~*e%lvdU46daK zV3QXWl<)g84AvHWGg=+Tj8~b#`N)*}iQk2;CA3G-XF<)B>|av(3+Z0+%e8~+As`s* zaS3YIp~9`GGx%^cVA>P6SD+EB?X|gF&2Q`&Vc5}Sh$b~nl2_k&@Q42+D zetj9=v^@QWL+T7{rG&DS6#nDg+r!Rcu=m+P9erK32d?sj{N}@fxQ5^GwzJUzsNf%l z{=X-x1BB$1?xT$gT^z5<*c43=@G6ytoczz|%#(k!Ve8LJ zDsj4KAv-K%S;NM)4I4yBpHoaM?#Gug)S--gcS{V;2X|-Q%#FF^hf4a$# zWgTuSQCG`58p!Z`SNZ+8LmdtC$_}fIR^;ivZ34WbPH>7B2-!uqn(_mGv;oZj_>hl< zn$JhKkA)QZ=Z_9zk5~@#RZ26sp7XKEzbZ6jq2&Lg#!pzLo#8HbKCLIl2=(LJyfLkgBHqT!lhAoD3*}vUJdSP<7@+(9bTxo54E(v&3uD-f~cVJ%?RF(89pU zkOAmR&i_pfVzV>>vJyUU0*EX#F-Uf40T3GIF<1^?Bf7C#<(sBbt7zSX+G2;-_nf|N znyuJdmLDSr;Ef`hlwp$#S-P%2W>Lw;7QQq6*)uQ9NkNSsmdaUJ5u+V8M>NcMIaf1s z`&FO|P5gRap+3U78n1@GvXWcO5#@9YHF>|BGfH`}nI;!mQyneCLTdI*V11zC2mP`a zfw=MtHv#kD=QlC#YPCa?KmkE@z)LoFmD=}WQy*O3Q+7teHc!oD@KcEOrcG>|srlSG zjEHeHe4@)Q*p`bvQPyfvW%cq{#bYeW!!ijwuskAm4+uWr{750_Bc`k87QhWv^|$qC zUDKw=>OfIzz#7e7YaQ4{K> z7CRP{p^Cb{P7XR}(`)H!LPcTf>Qu@t+{s}xV9LwO(PbA2w5$lgS1=#=R*%AENJ}$w z1~TXT<0^EX@@)j$7D?_1TZYxQ&4O1qOi24d`9eT(ktk7kcOb{7w>FKO-lETGAY*P8 zqkX+?kbJL`*Sz@;kBE7`S941JdE0Y&0s}Xfd*M(sYcSH)L%*+dV;*FYho3=1P1{Mf zMAy+EFE!B~cvjT`ut>fuo3Rotx?uZ4rT;oNIi&PV#ZF*MIX(oxlnFQ^@81SBE{0qA z0#WBkJ*pGGW_B?-Y?+$vV7;+a=W!M3Q-{HQTBm^4{I@z_unv{=gnDs9g z^8m{h&e028>*!5mK6-ima6CSUrm}|N<$P1)Y@r4cEt4S&w*T0((>S0N(0tFH`?aTC zV-=*(FwS)A|6zSX&TpHj0)k@CGq86UQam7k%&qudL(H{|=w&Yc! zZ(lj*khk?&qY`Q(XIQpz-)NsB53{ngu+T7f+GZrMTpEg4c-Y87%5K8*Mqwi>M22MH zdgbQ@F#2H;bIQcwp9_g8dcEZP~)yg1Cm7I z$%=p=XIE!_Ld3@`rM}gx9eSkp2p#N}(D~hNQj{STil{7Pi#+{7Q*~ZJ5y5mUOmSj<|^8Lgoq917>(>!yp zrs)FLe*5S<(VQ+a4pzb=>l3Rdn3b}y7J;2JSsgeXZj!AW4O@iRx@bpMdkGGz+EFLg zg}?>M4rCPJAT*O?c*k{arXIBzmx#kPKbbq9;nMh|FwmP?vCbepVhLDkEhNPE+J8S9 z*KWORS@Z#W2MqSe*lTI*ozFY$S9W3o*;PO2T202~ZeW7zNeH_4OLx)rchYXe#YhF* zLC`#~MGvne3_q-0Vsb})y(2q`w9TS_)WwRV^LYneD2~1@n&5F<)M8qH3+JHgi!Y0R z(SDQrL&*3;yT-cnYFdN#Ct%BsuJwa%2i+U4*vg57kOrn_^Oak|nBiG&E%9@tTF%=Q zS7uvQhQcP0!8MociLTPlu2pd{10QE?1ZS;Pe~qdUU_L6KsBz)yg+K-6iv^a_?;+iN zzC3z%bCuaPa8c4lsGxqRL&pdE`1>X>w}+LVP(EGQz)&kq zslJN2K;{0EdZZNTZ{<;Ce#J``!lf}`5welzHGYA&9yvt6e*@16*BF27e^x!IJ9_z+ zqV2h@)!&Q`Gz-X=oM&1oBKef#n*#&E*FMTWwRC3W^#w`czCj07{o;3uu-q`@IsE-gm$AY0n$%}t-S0BM!bHfYyyvH70zQfHSX zno5P=E5DlksRMCk?>@l<-@`4q%3CL18gG&}42xy&w9xJQ+)#tWka}0blBczTS#W^u z7}B|)pa*B&dI4db40LVqEk<%(1UcMXo)M2ed1T$D)Hr>oMZ@Au)4~OPS!z~Sf zmvUBW4u6f~3qU)&BujH+%5|@eUg9MBriqJ-r%l#Ta+bD>{EmvmO-M%({ptc86%!*u z*FuoSw98QK)XZq^aYr6(4wD=*u)_t7fxA&LV?|GHPZr*)qt;%E(W92oX8=!PZRe@b z3MVM0_msEieUQnU=1|vzm4P*@Efm%Ot9oa(W2=sDFWu3O+g@$ii95LiNaKd@nV%g- zMVwT7eT80+-=giz>};J{kK9?>S>>Ko(`wn--aI$pJ9|E*7_UPf%zf}}-;O#nr+po^ zvj!ts9SSfh_4R-|R>=7SHtI?x4??!W9>3*nqvT*2Qq{4|G{`t=hEe-Fh!+rvIJxs5hdm?E}`W!Ea6Rc zuGN7r+N@@`mIw2MxX6SeLM>URxBWT^AlNs}Rb~?6?c&qOcXcVKxfS*K=3@F)ysfLQ z-R6oaki83@EqJ=+2k>Rj_uRwJ+ZX!{T|sYc(;`{b+u+sgZF&c*al3JTbCuL^V671$ z(PBrndD4qLUEu;WS#;R?CU|r#%XRFj-3LNaSJugifrcAddDu&`*@zEVBbG*6^(}l| zJCs!0E>0mI2AK)e%aGGFRlnp_|LWPr?f76W3dh%j3Ak4xr&WG=Tv(z-Sqj>OiSAiY zw_j;mIMlzUPUt@$iqwCJi`J;%>{|FSu10dK+#~>*?X$98@Oq`}d;>*3$=z{ z4y-u#jQ5_Sw>=yvlPOQ|V%>cz0$b14rQwSEVb*#psu|f4D9gJE1oMolq_ZMk#0`%Y zAV00C?m?<|8mAv9v<#Soa63NlDh*0VXnd{pcMTuMwd_EV`H{kE&dG%~58TJWW{(C` zw616@N!zD~DtW1TE}dR(`Qf5%Q=sj+0zz%SzB3CeO(}4tV`br+N%k5PpIjuO#rpuq z8?ji^CC49oK&I)c572&51lrqsJydtkCp{x=VXipY5w)uCj_pZwh3+LG1YHnRED|lx zhO@s5q;>QOOll>r^$gXVCa#5HU)z&ZiO(oHO zuk^oGMFHVy=0NAc4Q_TH?~edBDZrxn@BAwJ4e6}E7Ox9 zQ_3n4D?eV1x%tZ4`+R^2ONFu88c+I_Ci!?lLK+*Wtkc(@t8k(a|@!nT>_ ziw*}hCf8S%wihzNt0?6 z3F$gMcF>u&+qq(S<-Jwld&0i=Rx@+YWLIPWdsh{}tHOBd&vR7mc{!!y!JEX^9kVfc zXP(T2@m=5c@IVZY`{((A7uMY%ie&ycaOxt=;q9R2gg1 z0dR@g4zeh7nUMV9^RMgN6ZTX4zWmWLYbDq(U{{}`=gmPq4AnYe>CA%!Bpx6lk{Ml= ze5~OCz40ax8R<8^S_@7#6{={ZK@H8eF&Tu!)7J^RpPB6 zZP%G_>~jvER;cTpnDJfZr?F9&V_#114>|R_)J{lOyX6yld%84|z2I8s*>XB4)b*NE zmi^rY7z1F6fKUJWzXEts;4?Ii{2YvejyK2XAz--gZ}=@grvusw;-GQ7rgq+=c)EvZ{<34b&%j^-zK>DiNyEzm* zO8nS-C7^tdAgUP=_HDH*Ua&>Ui}0%>qjL3v;b%4zN9FUq&i4b?o^AbuCZxE-E28`w zUFk1Z<(xR89!pPU@sX9`8%0GWlbGl0X^P6i`?2fVcc6XN?*T+S zrnnIdDp)xRRr^wRYnH$EiBnfZ{P;V^0_TwnOU<5Xofe3CwqJ?`ryB$K=PT2-?;b$D zqI@eszJP-!Y-VAy*`y3mBn9 zv*Fk3PZ(P&-;G5(v%0N%TqS{ydn~-?F1@$9{oX2)>wZU3+<{vDQwsRo7753v>nl{$ zZWKkI?p?e+!YuOTI!k%vD%j-7oo{uK#IbT691SEDHaZ%_O(S919q^MOM#lt8#! zfd}Ace-FAgVdJh}M6E|A%QhOp!h4n4;1?&FJf23U;kpmhT6zyTU$1pW5B=G9tgLf| zsB>`>5aP0m^dHf@q$YaRJdbvzL076EdyDTbi@ACNXOuE3rfMW0W&4)=WYQ-oY51+3-ku1^ek%maHs7U z(@SHVVyzW<*!SRbjvv2z8<5t3qE0Q7N0t>Cwz=t1eSg>nI=HJKr(e(q92J*T{ik2s z+f-yC@XcCNOHk7lvS(8r@*}$r58)vAahC#nv%eR(@WA-~o2b`7-E(*!qWO4fN1g50 z5&a3~ed_{RVaD zIR)8(vviWRHTs*aU!Gu6r;(h?Jza5nwUo$VE(P%`$ zD}l>2K{9NI8usF$Npt@g0wDFn)D?|N=FF_vlIa&KE95M5-kB#RbDucdb_t_^7$!KM z@AOgMN*G1tx;xrrU_@%IlKU}@dTWhK5EW`WWip8abH30~zF+&e$9PZs|IpvpaRUP1lROlFu-Jz!k`B5>!n;-6M56jpciwyxDy~6wBA!zi|i+T3%2|o%ymRNTv z046!Cz$qe>BE1tfuWzjeB4;EDJM)wRcJQ0n-K_Y(s?!AlpWiEVU6m~{Y^)UhZ&mB; zn@k3dp5@MO{Vzt%6xdM!W|_U(La&B5cXosk!x?vY3@JnORfkjlPaVRDn%R3!wb!g< zvMPKHXt2_%|U{r(Bb?kD?~u3Zr&Q8rT%#%)gnPvG`=xmt-5t2P}`uI%~#Q zm4EwJGT&?NlfmzH(C^D$75`zAE~bLEpEHBJECGa36L*ETa)xO-4dO?=k{X^{SsfS- z)Oag3mzbQ8bIthtCS~?ntjZ-X2 z2YqbJE6_W%t?3~ONT`G1v9j5(kK1~fY>83O<1kZCr`Eg;`gPnfuC$%#atO}j92$3D z9Xn~J$|b@jhuUOxhw7=5g7wKE30w`{uaVfWKDO&u)+IUUGtt?G1zRD8FmnWs{WCMTw^cQ@5%KM1@h73h- z!#}znNbYLvYYR9l8x>-#lUUzxa?Uqc@P%zp#@6O?5sXZ-XV--5J8G z0>dO&lF^!W2gMvwG_Fl_eDieYzF()B`Tj~8`iA5*>N2WyP?7N2H_N9AH?HER9InH7Y)1NmM==%$#`}HQTj6vW(#LnX)^)PiX0rCsH?t-{*plk3}VN zwc%x8M|5Jb30@v0#4FviKkh7;?X>l_B0wxGxJ!-6l3j1=?Rmmk^KfP^DO3lKs1dnI ze&;-UXG|KC(CqGpC;e0IYAY*YaubN$VuRsR8~=*{@+nYXY^Of3(pfV`ZA(+Sgp~7i zX@)h+6T@IcxG=fPa%QaDCvAAuCtV9KZg-sz-7CpMyhd9W))$&%>P(WCM%u39PNqtHSTkoL#Q@|Sn`EU6r*eYxd> zTax40xQtYXn!Ai;CbqX)IT2&)%vG8A!rCGHXrm&5P~vOUNocoSu#R1ew2%5gx-q`p zQbC{1Qi1J8^Q!}fi=6p4niH;$zS?K+Fn9{OJ$4dd6O-{4DF@6125+zQ5{h=R`+Y&) z8~gHATodLC=6A5Lq2PHn8yN~E-K2bQpm-sXVcFBcKE|$7Dctf&M_WmdQ0+TMw?4WD zVsQf3BHuvUh!@y6p-=i;_E0P?d8X@&1ar;R?z~|qK6UswlkhW>l`%Xemz}&?XP6&C zD1kfmPAq;bmz>6~E#=OcUdtEYCEoe)+A`)w^We{SD!pROL;MkS%rF&9lHDyzuVg65 zV9u=4$skoi+IK5b!I=VsyJcgB9=aA!dIZcAZ+}p-0kfoF%aMJ<(jDX`UnF)+=6&pt zde4TdyQ?o^=4;$L=BBwl$|?4Txn$scs~s5LuT2?7&ZV&L$g)ozS$c?aL9GdSE=63U z0iw1ubIHNe8A41g_1{@!#u;L@6g`<4}kHr2;W{>O(SEj!1je5eTgeU zel-(FdcrIi{8toYU8%cvqZy|)YAPY0|3p9BtL7}r_b#b-aEY(S`$`D7J{SHUr273D3ytt}r z;I5zKiL1@0m7OrD{Ak{u#K&)nAhb0+7IBl%UD_#FJb8$kSb11@Hn{<>L))m&MRo>s zsnJ;)$1#gO6iH>4Y*@ln2uZ|!RKD4Hg0E&~0PokY=4u`5j9wY3VJwX3R9BEpd(9?4 zV+$JI6by-9mVsLbk4BuVD^Y;18w-87r|(l_9zb$|2gG+-$i>4-MhBL6dUXg3)T&!`zg zUv-p*rn6&<)m0)%r>z_ka-oX#CwUa5f~bPusBN?~PioehtfN8^7!bQ0s0>0(wuRCQ@8n^+OBZRcnbX5k<&b*2i%DWca zl+w=6eX!R*SjbgYrE{4SWFv!Gm7ASCG?O82RYa$7Csy;GP1ptu!2%XZaTk0cyfS~X zL#x2OYLO~E&}trD={lIa59j%Ld2IQBO-}f1o4@Pyb-g9*q#Hd^+J=XCmbSl@fG1A{ zuZ}vm9T86r4bt+LNDSdhiz&z=sv_A?^zyT{ho}U5CX+z`G0}HeV)!~IoDKYgv_{vF z*E)!n*1lN9a~>)_V3jF2r}#sqSsiS)Zw^alZAE%cQl=KpZUjDw@ehR^KtIYgfZ-e8 z({Txxjw@0LQ>A;tg2S2J>UxzUC)_c~qe#|#XXo##zrhG#=UMh~X>)S^&~+B`6g517Q9*4rW= zQ+k`T`Dt9HWU0}mZseM%MtnmBRLFMRNouIz%s(FPdC#qS?}r4lZ7`V-^4>8+zo1mY zM~zqM?^O`plG^G=WY|nb7m5z1dg^!d z(KoO{U006$Iw3iaoDaa44dd~vTN@+TPU>)e<-tsxtQA<~ESnCE(RtFEhq0QfcCeF1 z&!n@i;^W99`_n0%5*tTWbQiR-#EKgDElScirkoIqNNzirG$?udRHOikI=)bFu)ort z@Qz;3{zYloxcQsqU;$tFPzNueLbzUqJ?8j2{pogi(Qy_+5xlxCYERMt)S>Q zB5T!B9B(wyQtknFM8GR85VaBE>}wdTPQTtz&WQWxolX319(E`m+rv@5NXF9!4^lwg zLo0ypfG42(RF16CQE7;m0__(q5QUn3x2C`Hex2&kJ=oR~m00fr^JB;dkYY!127=>v)_g38lKZ)y=$V);iOTbiD+$1}})YQ`*{${yLea8ubuQ6!}Oqko&54*vSoMfFHcT@{E*AX-4%l3<4mPx!J$1&iTBJ{m7%(+RW` zYd+2*M=zYeh;-KSVoZnPQ+$}Q7Pte+stVPyL~;bHE*G6`l}|E_d%Kxk8CMG=bQ~Z z%M)#d`zrK*$m*Pr>`a0XL&Za}tex2r>~$sV*=9Q^Nr2)l_qKQir#~v7rluyRc7uP< zjM7KjMKw6*nZ?aQYOeZG&GN-0^j4(q$wq#7g;Y{>QJUmL4#S%Bpa;F|@AsjHL0Vft zkHh}5rnqWjj1>#l1=JSaiHQ`)Gw2YL zrj}pnJunA>ge5`F$64j14#gQzT5EV34UaSJW7T&flYGAK ze2nACn^M}HFu75fD|TLxr4(oOjA#^l4TpCQcrBeF6|0DWJT?*_l&9}TO4;+h*AuW)wk=K3qvYkCNYemcGfcoM&0*^&mlM)G;3b_~-G zao^cFcSsxkaEX^-@~yv}FHR@x#xVK3L(Dk`x7gUO521hj4<4T$Vo7?!x~w?!danhA zTD8@2gz^UM2LwV3Xf#v1F8H{o~XmVSl^3Rsvg`e$zs}q_PI)cjudVuq@f#3eB z0zyCjvtu}@z^D_o_0$Lb6QQ+z^2dI;r4K1@kdYIlfMz@gs0Xnd$FC~?g*ZPQ@>8EH z1-?zH=w3)6gmk3)r`Pqn`0m2b{5yi&c|34#Z@htJ6E`N=6{*J{8>i8faDwP12nSu>YAbcw!uCw?M+`zuDcWn3eYZ4rsG5GgD0X zfea)M+$h*HeM91zyFBr1qbIPs=Stp%rhG4oMDU$iaZ84Q^3jzm37PcO2K9N^1Jj#M_4=NJ+Xp0cNC^g{VC3># z4ou5U4H;y!CAr7iB^<&BXT~teGC#TqL@Ka6pUfAz2gdsN4Y7P`b0XUlcC|0vY|pgP zBe)0-TNqFRNMIW-RvY-1D?p|=adI_efjupM;0@)RR6ssr*3V%t&1MI{O`z@ z3}G{TZD9t!rR`%qqe*4hD7|8gd)-z1TleE=k?X{EMZt&N!8hC4&JQ35;%9bu?CedA zez-WH8=UB_;05yzqdR^Ik|&Q<95d`5IOkw`1MF-IBbxL}WBdv^pAw|XDJ$2h%ec7S z36aQyS?;?)|Gc-ZoU-;2>0b=;!YgktX*H@a#r+U3NgYjKYabsUzi8qtNNSWCki+Dp z5c1iA$5-+y>e)Y~rB{I#G}0J7!wW`_WF4SNteqWPp(7{q$?Jk(qzJ&#|2ZuX*cC;d zUpU=&gXxKTv{U4F>l%Obx`x`~bMyDDior%QJ{+RlSwQOds{Ivg{IN1YYuT;+z`p~2 z|EF!30kc2gxpZRf93gZ-Y=~o19fYLUy&dNp9vy&uI)yV?zCgGhxC3ei=snHW=P!8n zx0RD=frWFyX=JL1{+uU-ZvJ#;upD)Aevsieb~07AtgOk@s}ztWjw|w{B1m9rqJu;HSiGaE`%?;-jdf-bZ8IjQrnt+z5M($r0EeFA^OPb?CdI? zqXS71^ihm}Dsbs=L`;P|iQrbBNquBEJ4kmK9x6sK%A#?XrJR2Vc>~9*82MOgu1YTi zzp0j*UW#^Ju$~@e8&-iYDyP}<5=B1HJ~ZI`pC6i1!}!5`_VEeg5*2|9Y8G%FZ?0}n z_aXU<@%)p24H}$V#4b5VV&AdeZA71n_{UP`#w9YY4Add}moR~VX*ps*tc zm$MQXHr)r{;spQ({{%|V$t-OllYl!(deiq`#6y0-cCo_qTN7ZkO2EC>WZD&yXCdY& zyey#?U#>7pU%r$BKSQVBV>%(aqKA{2j9c_2_qPGQXuSxFZ@?=$ynif~r5W;8RSViA zgAP=yPDRe8^+p%AqwJ)^-mNnF=VKws@rVVpwT z!opftu!_&+mg=nc`uZuqN<{aAv<`+R3ut}kb>=<5XPaiJf|TFsNA{0ip}HX6?SZeV z?CjebCO5dIJ9JH3=cRz!b4X|AP5Rrrw1$tnlDz<{9``MLp;|>*<5YI`%4#lZXh~;` zL|8<0DoL-#0Vu`PK5N| zFQ_7Npu*8<5#w#gR#&iV!k4QaP#eBEZ9w)`NWX1jc6BtHroP?-I>>%QP*SJzTU|A3 zSz)GGpyECLLo(n|_jMAcnBA`y*5aUc%Wl!L#La6Zqa*j_4Oz8E9eVew+%Ef=)#vDP zpqSIvM0RH}|H@({O+d3$H$;T_e;@+BILW6Rn7u-OsetvPt$~q1+P0KO2*!B2CYV#5 zYn0}X*zI-)zHB6)u8A&PF#ACnp9u6me1qc_7dIG>P6O4;Ov-!@*nEczi{0mr_-#9? zo)jSTNg%QLY07o&5#`(58|!%`zzp?!1FrVf!Pi3mhl?Yl$@{HUUSaIjT)S83Qk}B7 z#MGnRzAZDIHVBYlkc|mF^m}DW2;5hpSy?XQ%{1yt-~O2^I?@oM-WfjYSZqFaF^5Rv z?<(zlR{TPhvt49i0_bgjC#tUStzW&@Cce)UbM@Ey1yDUU5=ZSzztZPMB3>Uy9qhJU zP@)q~cjdb&sB9^OZY$~K8al7|t7c83(p=wPzLJ0BlEh>~0#jHapi2FQ77AzX;6h)% zi!mlhsP__JNqx_7^YzlT8|a?2L^GgYrZQjMlCVE8{;ncmdcT1 z@I3s}RGuf|;`<40SznD`Km5`WP{%b8!q|U=-4MDR)1QyU+HKaxYsPAL@bhM(-P*Xt zxsH}L_T4#WM|5b5CU3hm*~TO=jxyI zo#$wWGgAc$$;i%n5=){87Q!C9?A^|BHmm)E%VW)_VPPSK5pnur7%v@Hl6@(ngNsXr zb?6W`pjV+q(0&O#Ibb*eNTeV(@o}RTaplWS`okPHLjQ*NR|C0kA#xxf?$|7YL^PT7 zf$Ngs1-tKGqrIt~Gm-Gs$Te?FjgSj$?fYf6u`$DE260;H+8A8s`ACHSUn~YTXiz+4 z0!9ke$|G&NtI^vXCh^^uHB<+w9P?zP&6OomnaT1)+*}==Ij3~jueTeg(oOSl9@I9Z zfz+gXXr_xf(gL9~3Rq2tQ!FuzdKUy(Jgb!>F>(vkrrzQKo687HoF~;f)AmEZc>)ul zo7`wSp{6pl6Pn2fT!_>>lac-S6(limG^{13KYSUf{51Pf!L(EP82i1Y-33E2bllBy zl!ZWxG2t=?)HdFPi3L)YALR+00M_`Cv23K<2O}n}*GCO>hI0l<$ty%S$ zG^-b*1O{wW=UZqSw$Ntu=IECi1%sjyU8|Qw2_cM0l~x`p`74Jq^f8pS{FL0{TL`bM zQooW>J0W&UP_A@*?2AgwUCj-0##TVWIQIjt<8KTQG?oPRZXj>{0{kTOzyqI zNU%16nPHqEYuN*o&}=JDh+(H85w|+pasTV=J#{5Cou zBtd=${5s`y5yi<=3mwZuguF}(qthH=%VRn)bnD^;(($wSg&7h<>ID+_F8SsbGl5|| zq3>QMYn|MbTz$BwF0@p5(Xb=*rNp5hn^!T)1Zxq#DJbv5Iz8w4CgpcKLUFC`M|ny^ z#l-t&Z|Ega51}s|-qFZa;e;3$ktMJsGyBk-aNwX5 zu5XY>Y5+c>3iE>-(aWv*uQgrUFn2zEqkBdiohGglLx8j7sxFe%ja4seKB;Aj+A*4m z<>ytPCT*RG9D|<`^$J!t!l+{y1xp$Pmu4Tc!LmlYnrBKKyRXO1GI6Ecd%z7uKbl)) zCm>BLbq#4QRl9?z~Lb|0& zn709zcMzD^UN#MMCwjhr3Q!wuh23gt%wfha2&6!>%Dr2TGVoNh+2~;ZKT!bbo0z%I z{japY`>UcbtzNyx;q-lj7nd#d;E8TMnB`MN zR#nz)G8>Rw@*}N@gYPZe7M=|&6agL`HSSb8vVZUb=T=@_!#=yKfh#W(V9ndOr64Ul>cd>fik zWBGlcqyJ1)49oA$Q_v=|b{Ej!H*0LTmRZx&2w57h_%|~G`0>KJQnNFvUnqI1V~rUA zfk7G&DAXDqJYcxLPOe18d`COD;VIY`hbn}rm}6&F&nIF`+pNzH%I zYTx$eeX!)Tf8)m0A_`gzSD3j@%U(=TeyNp+ReG*Jsp8YiCX3kn-ZrVR>sfc(U00l* z)KVvGk442IVM3Si#%BJI@s*UbB}Y&pMLq%Eo-$|Gh^8+(tr78(RkEh=#o zH<(yVtQ;!P@Z|8Dv-Id-%^g>Kw*fj{Is*Ku(u zRpT?~;Bk;)(I6;@Ok}^^IOg9$9A1fwWv=^Y7>msa2u~1S!y($udzb5d4SZoCoD@+g zP-HawfT)IxF%VQ^d2D5p{y0!K9{8H>(M0ig;0Z7&XpPRb9S|Rfw)UN4@9-QpXJo5< zhj!R&YN%Ru=D&=8(s39ZqIRo0Q27JK)?-o8IQM1o4W@)&3pfd*^_`rSj*U`BRJ5a$ z21VS4&v2!$uAm9`DM*##*T=c4lAMl_0*SN1DyL_R?tk5I*FzpH$YEtrJmdwt(9lP0 zUPOE?7@N6NI*+#Z`Jyx5S}TqYMv>`y)10_qzRHwfN#u;)^YVJP7dfQUsnG^mX54lF z2FcJo$J{ikB0E+wp@EyV1LSgmj+w$3f1Bjf3@t`+v#ts6sk(F+@#gYxnx4V9bAr7F z$-x5Pznp}tROf68e?czYz2O`3LhBOE<)bh?`AjI;UCLC)z9mJr8Y-1F{h~B>UlF{} zJ<(2n#bF9gTtZaeW^T$Ehy;5yJ58iw5BHRRid+CS{?jAk;~ZcbEaNz%S6ymvX=!T@ zX?-!!x+Cnbo~}n`%}!&uqm@|S>N5k}Dr`2WgSN)YtYt@W4eChMH@-_@bmcBxTEC+T z&NG8$Yt40}(kOK8>5B;#r9j)UY5c0~)REgMS|_jZKYtnPIBAtsKW=r~%p)~_<*>yH z^O!CB=nmn*PC_R+7Fc;{lo~4vm1Dn;2^Dv)z7P% zXut60&$yfi0mHVefkRE%PNz*Qwd7;_SpmX2v6+afJ{Qk$GV&CW>g!HFY0Rg#a zV14|XTMKBrR;%Nt8*Sd(e^RG3Ttmy_0l#<-hzZd8osKszIT?F!62O6;yMVp}i26-! zkcZqpgvAQ5d(>r;@ZHgUN~%>ZRWV&1vQWTu zZ^E7;4?RUTVGkL$A28(JZy1B%&TqL0LNtXhU?YxS&vg(?=l+>{wbta@_OkiiS#@y95yIy<=NDFQQgU@N_p7TJwEBFL^Q`8dOwWSVd zgl9igGERcyeLsC-@f2oq-zrK|ymWIxF3;9=7wZWq;zwhvcX>VREMF=XU2C|5D`n*^ zlxDmC1KLWqUjtb`=l$ZQkcJ9)R;XJ#%@+;5uo8Hj!Kw~D{mWejUH(f@0tTGgEAx+{ zfX!z!C091UB}r~Wf)I*R{0s@{3!XdrSITyDh=p@+26SdD?8)a$qvF0;dGBK_+aUX8 z_I3%w7WJC$$qyc)z^i|&7j9pJs-v4|a%KXVPO>ctQeIJ?w zC(2TqhM{9(-Or3djm~qe8s}w`R5*OwNB74$ySFh8knO=1P@A!#udT4P>XX}!RR=H#kTo3F&eTG_UiTJ z!kY4n;oeXa@d1OflV=#FZ%C^9v7h6iRKCvFtWtylb&wxYeB}N@JnD!};vfNEB!X-D zvQSa-H2wQb%d@WI&z8Y^Bmfh{-%6RIwI z%77jLd60Co{mkvbfuxxx*Uc^qPRjsYY=|?TEN+us<(IBdd4-v_LfO;8F(MHM^DR7t z>?qn&TVFYS&Y`=B+Ip2ga(WZ_eavTYPVee~%q5+_g$G@;Ke+!F*})L-sXahu0-yT+ zMz**dlp(z0q6GmuE?@s=+EWgb}kgSGu!!M@7l05g2BZ!RS0Ds*_auu zWXyhic86eo4tBpGKy;jYxBWdR7^D6z;r07Vn5sObd81P~vMq@THy2}iv>var-T#Mj z%g(3Fyi4t)9ZI|Y)xkTF7t?3xrc~G$2$4#k6`Z_FzxC!?aDdqTVOEb zz%A}E(--)?b9?T&D`2A6e5}#^Aq9ebjOU$Z(U8Y|li63<98_iA`fMuWdgdN`jP}8TK@~|3 zqb^+YY$8ZuUW3l|@U24iNe%cAFV;tu^|}ir60r2b-kT7aj2``-V;4Wk`JVvEu79Btp3nN(N9^KH>jUH-?+5O2X!$z+8d{Sd3OD?5GMb_jEqS5v z9TMvPCL=+~uw4h^qkf5nIY0aDA==Q^09TmLfm6S|bAikhv}F_6J|9up$}KBl&3$!t zo9lS~qA5x+{nr_P$RRUE6XqLtc_{AS`@1Ijm)-$yjkDIsZ+rckeP?EcP262zpJpd; zCI164aUtYD)ZizgaA7u%p$LFjbZ*nz?^k2p=}CR%z;I1IokdX7u+vqlA zJ^#pX{&bmzZ8%*0kJ%(HV?_8(iV#{WL)1EHAn-AyA})9oQP(xZ=$R3prK&gFIE*KB zS>>(PJ{YP{a?3OaqFMfh^=}-q{!s!1;oo&#-)aO-$Kt#xM7+~6mp8@>34yGiCL{sP zlT{C->1aHL zLF^rv3bSy2XTCIERYtB_Xi9}|c$fW!W(%LC$7J@>bIHV%^-H6hxX*Hx&b@eXNY!CV zVa)+~mfE&V@ut|iYw@>~Q8bI6rRy!1zc<1k*qC*bxV|2$Frk)fl2x+K07Y9H%SLHu z9gbTaYNYDNE!StSq+B6Bq-cgYv97EHuIcsXShlVN_|3I0q2OhHX6$76+i=0lz^I>N z8A*$;tsC`YKwR<+n`OUIL)QgLVHl`r@SkfaoM(*ArZL83cjRigWf?hB!fjnoBpU=d z%^nU@Y6N!pgSMySJQI(vG4<-%4@$5 z5&nDn;dZu&nYhq*HiAo>Aat7H3-j_CV&C4e^Ttf3S$MfW z&KpTbHGc@|u*1dQb``CKR|8Td7SOQ3R$^uo{qh>6vF$KJ`7*{k(37mJTcv0b4c2|QS} zaFeF<8wV7SN*i*7W*`G!|KH6K`qOt(=E4MK8Gsf5lJF`5Z}K%j9?TZCDQ%Hk6Hy#- z81g8*ihP;)a)89)+gh+`!bv`JWpW3s6t$<@M;5gOu-?DP{i!Og!vybqN00I5@;(KS z+v}5=F)Pe(|6;CaK`txbPU60L7b1dD25yImQbcIfTC((dW-A0!UXR!wUURQ2D) zZOEbiZ!3zlJLumD67rf|LtjkevS~+aL5w)7J(p~ZSm(rTb56{7Ug1GAOs)8tx{%QX zl1G18CZ04YK^AXbYmiiL_ZC?27mLdXrEP;>X)flBv8z19uTLcN?`Q-54m5Yd>|6u^ zI(+y4Kf+>+QkqA|&V_)^RoS&q3;&s9VFlE8F4Oft87}#0ZqN5Cm7&}YR3q>nopkJwQ7Ut(Q8j$(z5(kG^by3+bTJ^S_6-pr@0`mf@HL74gU zqi@Pg{v;QF11JF&omrBhD6T95tM#(A|Mp*!hLByYhL`3nJ6I#Btaz!y{E3B>lYI_z zed-D2`oxBcRBfmS1OPkjM`=Q#2k6hB9wvBAB2-!W$G$NRb+KJi!mRnM8Cs(>J5#z8 zEy_pDhVu1qIxF9P-t9{3QuVy#Kzr!T<21vY&(PnlIK?N zcY(iT)gxs?HvYkx9Tjh}e{R4{d3u-}OYvcF5fo!54 z(x0fM=c7y%d)H9M`e zUV3}@_{J#0{|iykaefElzZ)#%4Fck@O45S2)JS5n3$jlibl6XskcBHT zU){M9$1Z$14&(8RLR!Os!^;_9q6)Qj{U@Tu7!YrYUqV^obm^b#i6d5Pv@{STH%&lo zXLCBHqp4t=88v>)Ywl^ebfkto@F*y(Wi*c%db)lvM0{03%6XaiJ`C1)fG2t-|Lxiu zO^DnOz#u8DiwdTotHV-q>Z$kGZ=Jqw4>kR}lPx_wbO+3Q{kq%ZY+~G96;w0z=kx18XMqGoM@XTeyY$cgendw zpRO>NApa{Dtzrl6o_s%V1U%m3KO!uOPp!L%s6&Km5GG4GU@4$FUE&*~X*ZqfHcmsX zCdEs83Y^xkkFn#|iZsHo2d{8UQ;?LQ~dckDn zH{#Ufr=TZ8(!ZG{yasl>hW|x=kfvNMQ)E39p_*4{2NzP3qpW2OSyo|p#K0N%QWa4K zSzi<|mYOkmr)P4xcDU4D3bOIlXpx}Qs#QU;6#|H~ziSQvM(1bmGg{*Tw-DWz<=IhW z>ZC-`!CRP#+pM0-tFFk2=?is^lrW%qvK!O%byiDu_U!Em4Hdwh@&x1{fJqVq`ip-T zxhL^IjuJ+#r@RBPk6)@8bn9}&u_O6~mXTdShnKU;m+Fg4R|70y&z1k|=& z5>s>R4r*kmEQepTsp8O#|UP8wt~aknlN4OXa>{&imp1tV+s zR%gxPeXy#a0*e_|LyIY9hhBL6w=}<`OehI#mbnS-oC!_{d7CJ2dz}@>xg~#vH`^D&hJC=s@+6?$~pAx zS`v0Y4BIx7A@Cn+wk6?njeb+0>b`V^L8%d1q_!l(>8gS?m) z^I-dKw5UP&rOzS!QvQR9nCn6^-?IijNT=41WGz?>5>;EbSx|kE!tHd5Z67JX(bEvLRa4BIm*5NZrxN z%LdFb(q#)qp^4ZntJ4;wG1!GTnPhq#urk^ck?_dAf|~>VwC-BUb|Nwy~+wB`JE7 zwm;DX$M4F!lQplD9H@4BFr+T*IN70ZblS0l(ak+|W=coIBV^8J?wIplM{A|% z7gyPD8}H~W^6V+uo9RN#ljc_sMOR!!Z>bdh>^yJrj=AXVJ#6ryQx)}>2@c>ziIyc8 zL06rdjd`9&Z;p-H62%Ie8nL7CB79%&UNOt?uDChz>)+g>wMTRcdD2+T`DTkq;dvKj z$MceR>E@q{SMb}Ky55?)u|iy}ocPq*M;aj}gr1!f)v!sH?(y;57bSkz{yS#0{<0&| z82q`t@u=1JRN0q|%6gd^J74R)lRK&xlu*``;ueeI#ilmHb7bzvSZUm}@TTD9m15!EIC~DGRYT6A?GIlWK39q8OY~GFi6)j6 z4_wLT5OY_0^0_kL$|^%Qd9442h{pOgVwNbdiT$!`(UY**N3G_#Ey2z%eK0${y+ruR-B!z&VoD3^_7#5 znZt0Sd$N5+XN_h3aNKaoqhJ13RPqy$v zPjG^r&$aiOBs}bTEmHrk{ouW#>oI*%Tm_7wZw%Wal4d?GeR*C?s?Xc)C8FYU?|s+S z3yz=Hz{TUd?)bu_Ra)8b2f-F@9F0B(uJGMjEsuLpBIU5ADfB2jaTVQkDs|eh01V>& zV_^3GfQaZIYaRe?ugX0Jr13A0CCQJq`fSp2yAOg)3cd6sy%R9{-5=tmJzDaHfWurM zo>@1@?L-1j);-@Nq110!`QAP3DER5~)-a^ka5l2{Whbk>mBEFRF(%+`jw9MoDy?5^ z6dr>=T-AH`;SlJ}m?4l&NksbF|mKsB|d+F1xJSId`w=-VA!qd3<0w z5NlLZj+S9FW|7sErMC3@4mQlaGOB4ddb>wu0CruL+SsXF(S;8v4%PH=JyWtWXOX{@ zL?}JfWVD)yUy2;&Hh@=9d**f;-1dCmoZ))b5aogdhn+5JZ|zqDGJ2q6DLtDA7xzjW&p62%;o{=relnC3-?cL>ax8 zS1*H!GKLw$d3e8buJh-7KhC*Mb6t35&))mlW$m@@b+5G}bhK2cD3~ZfAP|+Bs-i9k zbeS6jBDs0>3Q*EApnM7VckQ*Ru_p*bNqhcF0!m4{4HS}i>Z-_t%KGnY03R;f%W2Ai zK$WqSCst%2kW{RiqMW`j$@XmUYx5P@+O7&UyRwInZ~ZOy6RYHOx{6`rm%NuY@@~EF zrE74cG;&k0ALAd9e7D88J|;>#5xv!$!|IYx$-;}`W&f1S)qSsPHqqn+&UaSnSSjT# z_`@Tm|D_}OE$%1p>TBQYG1si^&k$N*kC)@5a{Yg8|v#{vr4aP7T}K!3XA8dKlDljutq_xwd19b`MoM8&2qz~J*4M|Ubvxc?$~Cf6fdD}}3;kv$L};w&gQpSTkz zqpn#n5xav7XY+`*^>_NC`CO}UV}t8#O~iSu(O*Pd{Ke3|Ns6hNr$$t2d1d93wwSRx z14Ewp!TIh(*Ot>Y25MHX(o$FIh4s0C?YRI9!%jP#@)UI_K6Et!eEHw^=fLS=We$xF zV7bnh<7wl|&IaVf{13O%=DmHq8#1C(o&4D?D5vXPc{co*1N_ajQIEvf?&oVYTp~Yg zO5|ME2^pA?I{SVJtC2~IZ$9eR5D+mllG8btfstp~;dDh;kA7v$x;Z)hv3ysu zxY=`lS7gvhGY9NhxbWooBATXI81H!9zkk21Dd1i3$=~lGsVNyA>FMTf+fxl-O8=eT zzq#0a9t1qQPD9fa&k+tgVlP^qxV`|+rJ|xb?h0VTV8IV|VdIzs)-TnVXv8OOo~!>( z>2A*N0eGJIH=hy==aHHDYn}p~3M8XkAXv_e#EqfHQLeLlf%Y`Cu^#H9r$O~_a4Acj zx=%PO?+bqFHW`z&v~n#JP8~3DH_19ZQmzE}9X$C&JMMi3X%)56Nszx577M?2R9e_T6DU@b$y>&{bqOt55A??*Ay4GH7TI$C#RceK);?ri?hrQ}(Eaelz`*Ynqu zSp@U)@`<=aFwY<3-tb#N4eRm{h6Rd;TImuZXz|^+d(byhZ)&@gEVBfW0UcL@U)-@2 z?dPw7Od=_ROzpXpwW5!#XdEr4IE4ItM%+~xws%)kTTQHc*j{CNisJAZH|H^jTQ1y! zGCp&`;{+jl(=$I$yEYZA+%mlc=G~WaJw}|5Q;yC8q?mONlu5Ktq=!*76N1?rXO9kW z$Uj$^eQe~uz{RIxms_2EKU`-an1-Ju4z1nzSNp-;+LrnsPLH^?rlh9M26}sW+2%c# z_7iN}4|3nx9iEKZD(f$svFYH@woNo{lM!*ynZGt0&DL#j{pZH<%6r;3aHfzV`Rro8 z>UlspofxJZ)q#7zOi5K&R|{cxS0^f>ZABvIGS9G^FIyqX3%^ptV{1>H?9TG|Ez+>Q z9!6ayud0Ttre3FrPa6wCB}L6t*&+7o0+Eo(ziOz#zn{h^@`B9&9EjKG|7(K4CN2K8 z0e}wQcyTj3YUNmW|7Xntn*sPH2KFRl8;YP@`mtqx{B2{4tQy-_KyR+IMky|=$nGi| zrcJ$u7t#+1Rz$|Mv$)zMg=v?Vql@{4w>srNdeoF~Hh(0&0!b{W?>acBIg|W~nr~|1 znChx&Q)m+y#GK$oQhQ0sz_>YR<{3p_u13-fv~~Y8pwQcXOXs07r`?+R`2ItogC{0l zQ}T>t%Tr;P#7n*kn19*iZ!F>#K2c!!=l-PC-So-1E5E{0jD|bmS*(=1>=f_}`SU zWYs}{6oOQhjNa7B_)A_Q%$LgLA3Np z@IYU9Y59aF6D0dRo&1G$(SMO04sMLA5rmo7Qu(n{peGz9Z^j9K!M>b#md&f;kQ_6$%6tN5jfS4$x6@h z=77N7x$$BcpZtmBb-DX+y7m$_V2;lcHWn9tOdMp=8<>6j`_}og=>EGr@;24a9|<^i%slL!Sj_?#oE3inz?T_66rs zz1^7mJAK+T*QGue+l?zfM5t17jciq!u>g_>d3qd%d9KYjH@{%*ToWh%uLfswSgw$V z&=my@z}GTno7T+Y(5QgJgI7%Vl~L$kA=~WxlD!>yBhQ(qkWpr(z;0ie*M zm3DVh22Y^LJ3Xs%9@m2Y^ZitbDxF^8ei&W*01dDr2xTVk+aLI)Mn~SDGG<$8IuEy7 zT9dO`$Kf^DyaA=^jHKAa!3vP|g9p=Hhk*B)QWnx`c)NbW&H3SWH0W9+aiXhX8o_TIl!5rPD0`gb(l))4MK`eZKXsn<@r|a-E zg7ij9JyTY8+xX1Zomc&*NaU03?CckrUt1fMg_RjN1n1ldI<9EDTJNalN*{BHfFs;hW;jU@jT{Lm!?Dxe{n+czR$Jt^u49ol zRE)Z+!_R-7Yjw`Kl_2s*{vlcEQ#^|iGI*cOZ5IBxy&lNHOx%+rIkGd~&j&V0iWckHzb4RV?2ppL;S&C!9!dc+;>6z3e~cyv2KAq# z_x}Xg{~!2D`9Bs8@T@{2&wVox=*D$m`2PzJADzvpdV7111V9BNRj-nzuuHMBKIi?Z z+pG;@3m(aJ=31VnHU+LkUJ6m?H62?v5Edh3VjDbGvSaT6)j}3!TCzGvdBQFfB{d2A7PoIiCJt|5~OY>r3L1&j!Uo3tB z+jZji&q5Lsn*eNXs;u0c-ZVhxy>r%8-OsChHqLJ-xEr+|E+d@r7|AVXt1)(a;-@jGWqB*=jl}80b?s7g@H=17%*aY9X&dTUDn&Zlq^SizjX_E})~i&6#L^rNOT=xKE=<^0Da26-$sIF3aU z+6ZWX6L>=_osrSgC%53YJ11UWd+~IDu{dP_1prL1(JWVE#9v=bo%r-7ta<#bq@uk@ z(!_N7#L!b?)vu4Quc51VV+%bZL1#N5F+Dx)iI(#7n7DAN>B+%hD)|n!&(bWm5U;mo zPLUfM8(HWIV_}o&p#aTw>oyZ*EqhWjDl)a=gMlS{)hUBx3*XSzL<0{7bI_#&-_xYLsIQ=dz@XlI%HiC*_Bi= z@2&LAN?RUm?&YUxHHl#Xjy($^BsPxmFQWQ8z&!&-JaV{(%#&ei!1&$PzNX?OX6%8)eDEg zrQk9D8a6x(U?B+pHL+tD>%fu|E^X${&BM`#Osu=^nW#d-buQbLKMCi0>*{QDW`lnp zGu{tcE7GTEmH_kJNZQ#;;3+ft%-(sFpf@&wYgQ|=d`J{TBo^udC8T}gN8?|zUFap55p(A(-3qI@|6GESBxFDo~E z&y{WP*sd}RF@)zJ0WleF9=kBE&1PD>Xd4&$K@NUThs`z8d7Ep)-W~~9)%SED`4yha zG&DKXN&2JKn5F5fyrAzt^lurAc0=USYaOis4!_7g0uqbGo%8r#;mGQK(p}KUfF8L8V*$o+j zm}3I?(A}q!iFiX7bTz>)NunY+lWlVXOh&tjrem`%V2=nVZ$%TtHv9;O82hW%;6kJr zXoQE7XK}3|3N~l%EN7q(G{xTk@`nN#4m-2do|Bu&c2_`s-!=9Tj9RSe(uPe}j5rAN zJR4$gc|1Ebj># zm%V*b`7c#na9HB7ph;VDMv6yQSlEfzticP!>L87m``7A>g$1iKDUn8tCZE!Iaw@sO z)?eevv4<#(eH||BFt-|QAuE~W@8Qt2%hgH5cXgdSH+K~Bb>#LM6!c`W*0!~~F??#G z@EVI#ZI!hbX&V3ZqxbX`P6HLc?781!=-+BbncYbCjPuWi@e7nRcPJD7({-*X0Ohzh zu70HI+glkw)~7Ubz`t(v+E8F%BAOB(Q_u$ChdobGl#rOjLn~MS-RrqGYbKA@}f z*l|NB)6&sLLl(3og-m_6O-tK{@%>S4x#&VulN3*eDMvXt{}h&BtBQ<*!KpUGtr!US zedOu8Afl*w{gJV1zulpp9yCdTJ$#I7YOKh?bn5ie55w7wPkM#YVgRZQNKa2MMAwWL zC;zbHOWNMIs)lo^4%8h4!lG5swa*k|rwKt=Z>@gg^3Yi60Q?EYCB2SjDx=j|{lF<4 zjATWTyvHEP**wad_mT!1cF4}wa-Uv*@D*{7QTO-6@%|2~4a>)nMa~vDVR@B=avKwL z)X~VbJJjY#=8v1%Co|;fj*}1aTK#xN8ghJ89*ob2Q1RsPPYM51swCipy%V2I+T1r! zH1tJM+L^yZZMxnxx8*1%v;F6F-aUB|rIUNp{0HEBCFa$3V}i+8P1_>2Iu|ZS?$@rC z=+Cy8=udk2Ge`wunaLtdMn7V(y3oGAE-Z#+A7cz?I68__oTYX3XDk-mmz+>?rt|3A zi&rX`y5bIxg9*JR!9Gp!FNf4oeeEt!(1PiQ{T(>n^Vmo>Vu$S0FLnSg%6|RCoDS-C zkX8(yjaCn%1Kmg|+}Nnf$ZU>_nO_+v^PHI+EM|wp?=&K0lVNi)=}mTI%*jZ$*<|nZ zv=;uh?K)95mlEUZF#$tfBk|NydNp(lGVY~KiBq;Nz&$M2CAcVW*4I9%<|E_iR{v;y zaOyg@r&2w(5ngV~Bl9(a?3r}IiXTp%GB0a!hx6Evh(#L5ngi4=zy7#+{nHK^;Zr?^ zE{SJ0yBiO*IW%|Q)YsxIvKYWgsOP&y4oNCf#@U$FXfVhvv9V{2Or$O zGX`5aiI+MSTBU$_~HGsDIT;Da?Ck zEJD@(&&LO#tXW3*3mP4l(^YC^+bnLE);CcZJRf9< zM5?zwfLMGOOK>+GWx8ceyhoRk(=A2_gTOw@WR2%P4d#M4X}=|!4>#+MfLWj0z|4wWm4p0&ly zzRsrpD`7iQ4vdno>&u;RB>spi%mxr;XPvVJNfW3WevKMbOGrpt?0NeC}`0PQ0c2Ae)d1{(=pzx>QW z*h}xnTT)Ugk@eX+SA&P|V-kquH29^M7{6mTt!2Bd-x+K|eM3%)F@j`x7t2d3hirj5KWd+6S$P1A;9ZP5QUM`%@TOJ-!xM z3jWW-k*m}8(rrdZFF9iUT{Zmh6aL2)4}kN=#DeqUh1jf0H$e$DDf|=QKc>}oESQ7l zz(w}==Zi$=@QB-0qwB}^bO2FMqBYi@*#)00PmyN&MIAl)t+I;-rmut8zlmKQcwgU4A-;r@Q@oqeFn+C=>Oas69q^7Em(hvt4MG0w!~f9%@MjKws) zO2z`RlqWWcR_GBQ7uf?=G{(-KwM77g(2Zu&{mtQ{VwPauu=j~@v=nPzThcFzWMY=Y zv{^R$KAHLj#x2Y(4nK&AbRE_c4?s-vS~R_%-(rV}9El zvKu|pU^-jwCuMWFzPr-``0wnkAM23f(!nQ7Y)x!u>ndgFIeuKXwgoz~T#`rP?a(-u z#}NO|Qjg`S#{urdIY_oPJ+qBaM%c2KMcYrPw$hlCWoO@qF6KU7Z9A*CKZyv_`j8Q{ z%82`YKX{$zeht5?1p0Ndbtku6c zJIHp&8`He6wS%fXsc>;}+B=KwURj?%=@JrJ;gwmdUTVS3d5X>XW)mR(Eg+-I2H*+$ z*-qSo;-RxdfLt?slL09@o28{zC?w!*p@g@TekKJ=($-PY(!^TO_V~=O zw(OEy<3`@hK6vizWK9-FIE2q1Q5jN~YWFy19{2-$DC&K35?epN6I<^O+ue_JE^irg zS6O5BZ%rJI_%@b{P>yx}Ma43{1isS9|PUNcGF9;N}I4%7AV)o&{?3V`#fljj$1vn+~1PI6aajc3} z`}(14g9W95(#!Nt@9`h%klM5zljqOv@DA5i81@bW$r$Ke&J8qG=K!?tGcumBbUx20 zYFLnPxSgsef{X|AWmgs^e_!HmioaE!r$ejTqT(;G2&SG27HJy^$Zis^`xqLH+#(c8 zitbiTYgu*qPv&uuj&<_$pWgF@OnO&gcmcyJ`>lx z<9clE)jO(5I#|iIZ-lSxM&0;q@9;{TU|Zf@r&r+TkQeF+-6SBoDEaIm9RB9H&A}$C za0crBN!jduMp$l(wh1+ezGF|@yk*t(i#mm#m>hgPQ~|1*;59!73RW8n;hula*7&r( z>Sv&h{_sTH4LG%<%~RKmL*H_;RBfr!!jVKkp_qR>VnLXV?}<3;;^yVUYwRr2xok9q zVxbKkmoA;g#LY1W#CUHR9Ot|Cq{OLD9ho`@72>oBh`Yb>Zv2OCH+k5(&jc6*@VDx5b{F+O4vm2;wpv zur%%mf^waHZ2BMV!^!EKuA3C)N+m+rzSPh8q!x=|zo7sJ*})9!KW9$m&7d#*x$u^N zPY)Hh%hL!dPtHTB%8cvpRIb2m)L@f!5boqOE?Xz=YD|$6=g54gda*F$(J7irZ zRGLF=?}^qXHx?wd&tb+aOPhn`sz}Z=Q9uac%U}{`=VI3mS*$DPNCl7aL#rii2=cLq z(@#S$&Ibc@_Q!S@J7CDiYAM!mHe*b_~16VK*l_UyFBexQNg08iwz9v#^wzHCEI|1;8(h zj;5p-nhcjECfeoSd_ciJVwz>LC@l;GsH&l=hStmyPi}eZ3V0Lfz4QfLY$Qz827lc) z1cA)D@YqvIP>2Vw=hZ~>r#$*!wHkWdp&TPGUp0Q@4uMRvUeB)*^2BW z!>D*N5F4Ew3HQy`6d9xwSuPPx)p~xhJYD$7w;IjHdD8h`YbXCIp|k^JH5mJ?Fmj$6 z)fa5umsrHTm!h+|AJf@V_XEs7np%dvefw6tjqT2z=jQI(qDH^RW##+0pxaX$sjiXj zSE*|Mwy^7Fxc6}{b+9ywo%pOm2L&Ao$X6MWb)Q7hDo^O;9cC%624SfigX9=?L`(C+6xUG(kQ@2f0{3_Pzr1gjdrv=SC<>`qG1FT;#v4Ou8w*gl zz{)=qFTNpR!-9?94IdAFVzJ9wGtKQhkRr%Q4a~BXiqSqQ!KeywLE=%LhVzLPU(WqY zv;{Ma>wu9_JRx~V*q^0uFeqiND*(3g!A@*2$jPDiV5DaL%o_Q}$Y(4raJc<~bc?)S za5XJVoU@?9;<{Snz+9zGzU0ZCRj`~J1BQaZKOi9c@uKQx9GUsgVhSrD?(zJU(iXIF zz@R+B*HgU@&+dpa1c%loq>Ty5=zZYFFDX3c0`W$!!$rsW#j%C zHN$>@ykCbp9ZXg``ebWvC$(f!JmO6o*oSV-tT2bKGLs5=NYJ)=K`J>eICSBZyyOqX zRWt&`A@f#`PNalaxFy4J<2t`ry#Y7`nh^ctCo8gLLpZcxOKbis z?>LOi`u3_PWro7}BmQ54>AwXAg6!`-C@8o@!9{1_U=-e0^tQs`c68V`hd+i8Cxpbm z(Z1utH3X2t;{83v&V-HPz0xQhz!hoAsb28F3G4+0w5|4vUhHY2@5tz5?Py+PYoWt0 zzALycrdwE5^ zIiaOnm%D#U=aG3E`mmnWrc??pEm*(kp7Q@Dj!pXhfe_5G}|?5$ro~E zcw}T*rjj>4f3M+OF23xfXa}~B7N=a~903LUKQ3a3|LcL8|G7BNd3fgp9j>=ynV&Dn z{B0+GCuL<^0>n9*pmDZZ7U(;9*6eXC2%XJ$+Iv9;WTnZR{QcZS2aC{hEnhmIe-JTj@z^LYFo5k7lQ&5zmfkPV))VV)K7x=l7bR4RzCol0c_tEI~cdnSnig zna2|_;!ZH8^(4~`h$ivojawW$L-8ZAL{#d|8#f^T4|F4~8WTL%fcA^`azrMI=F2`}Zsx220Hv1or{Dy37J#gU`Y{ zGSL4I4{xH+O~>ZU$jBE$YTGe0Zp_rZAtK`1nUSe!Y7?fFFasd!azZ8v2#a)lvbpc^t5=WT=!qAj)ileRTWK7rPfxM?`M zIa*A_^k>RqT8Z24guB^5Ku`MYWMAI^^o*szSO@v;7p@g2jl%_>;ZDD^t5>$|C6s>? zfNf};)9(c%W2L6Bhn?oo*_8~x)#Q=2_1(;qWe%C&N2_9OKz^!Kv07}TZ&m4m2{{?D zMA%fVE~vbQ8EE-c0GnO0z)HcpH|V#)cDBn#sAwmRI+9R?+?H^U9zHHE5?tQTJPVwI z4TzUz6gx!+5+Bn$NrEcqMt}s1+en%h52v+dj%{~3j7Gu1hxWm%JbVZ2cVtyT1+o%_ zRkS?myt(OtBp@9giTW?r4BI|d<#CIBV)JR<)J1dPEcScdHeX}j90rJNejJV#OW$`& zS8HTvXyeLXORQqq&JU8E-v)ixeSt;DtChpzxF=(RZ_LARvpdkBHRuUBk=eZ&5T+5X z^xLfmLmGveJtOAQ$L?&P5ED)V_>KI>=4%C__f;QyDQI=5dEFTquuGrkwjJ1gvDVPY zmA`~wEg$ponk!it?%rPa-nhdIO8i_z4mKD|6qp=)`!g?wR43R=H%DNw&9gXbpgT(| zErv~Y=M0A4p|K(ZArcpd;4{K$Qy4TSI%0G-y&Sgfd}NCzyLcC|ZqSuZ%DBS7zsz|gnt+AS;$G0{O zTVKftAE_`Td=4ygRT*VvO1YK)YILN2z-Lj9hhd5uga|Tg_8kmHL4`{7hlht7GQHEd zaz3Ye)U}zYRGx2W^*?fCA$VJ;vwAYMCc_~Gw^t>bY(rIr0+`Wp5AxDsn&Qc#9xIQI z&PHkb4Jx_HCd1wBobcX)5J9xmjauMuScz0ilcO=zk>d) z*QR%M(c7SB9{_vz<);?uJ~lI=nl{hL%V1pMaAy|X@orhzWitZFO$kwbknfp_^5F#{ z#4LSYx7_WnfQ-y2V!;oRZs{ATn*X`Z4i^>^TMIIHWl_pI;sd&?2*JD{dFg0cX{`jw z(Bnq?W{fc?j53X>mJ9{mo{Eu=tl3^iO~us7%~OG{0x00c*1mCq551kfghCh<3zt4J zNjQ_6npwiQ-v{)v5IEPL+@D*VQ1cMEL-5rDXKt?COMx7ThrYRbtkZkA`QWp(`OY4< zjS_0m!oXTJ96XlE$t6RZ(7wL>_!=dv@QDBy-`xu2+bs1a;iC3x<0=ZH-MpKO1~JtTnVV??%k>scg< zFFiBT$L1})lj#zH)P?zQdX3pP$y8$-+=Og%MBW+r0#Ojy#*F?CIKV2gZ~NY5ibM*O zT8_d@>)o(x-z89^9#eUB_Ie4Cd9e?xb3C504MA0i`-6c?g42$!Ktg76*P%^S@-_6G zQEq{c?eLlkdGw&?=(=&wLjuDFZZnfkmipJFgk_(R_Y!;`wcS+Yo?pnA4xlth-plav zvDbM>4cZtqCYGaRLmp3dn{z4fmTV$Y-sWiir0^CgA5%-wx=L9Z6)y+68XH4HagXi_ z=j%G|r_!u6><4K_HIrE=EQ4j>Ao(p5t+nFD-8`GGtsI$b^LdGS-x17SyNua%QV&+9 zW5Vb+p(ff>Pae(t)R^T)%aPpGhtO~z{3v|)zHu3?!NAMirWcVCO3A``@V59p(=*~g zn=vu9?pMOG*38cx8Dscp;6`|<*yi$0E91oW-Mn~l}Q*YyW3z+E}!eU}5#mq70|*D@q%Y8lfg$hJWt zj{~itKSx8TN!34=dTFgVGK;zOYI0mfoUYH;@-NT(t+B8v&v^9kRi8>1J8iBcS^6Xi zSRQh`?@pGOgW=3^v1doIL4G{mU^0e)!>u=Lfq&ngc{X!>P1tr~oF>m+p=Oa-=8@h3 z_@{c0l|RPQ4X+nM35yJE>t!v6CTHJ5!!D6i)6K-dc^#(*kL(jBrvQ9~RmeoQ9jCUb zjotx`yv<`A)w}d8LZ7h~ikTCSeuK3y{-Ogy=m@IGz5PXQit|SMx}mF9z*0ZM{fxwX z2AAqInTv~Mi$5j9scUCqcK)0Ll7jRUh(5?DMPC!)bk+Quwzf7wogBhh5ZONCHLQ8s zp8yfOO?Is)@Msbhw3?)cK)iBq!5Y-tbWxvuOMD?>(5$O~)_vHqyqr_+J5Yrm@`MzQ zPESjskKuLMu~H%r&XvWc51r1scdn~FkfwERu%EfUctL`=H&!plaI#rb#!Xgi%PFiE zo?(;T)5Ah-H_e;duo_rz)05D6aam&&Fmi|@x_c9WnCl5ZbC3={03#sw!#9f!$wsf9 zm;Cu}pz2@9Qn5br+ZY^?HCYToytsLO*8;&`xKWw%G-D3aOD(?KG!o5NT35%yuNUK2I7QsmH=|@P(fAy%^Tb- zG(U_5-@;_RDGsEl^-Gs^9Z2$J&pY0ZJUz)3fH{u&A55gWw{C>T{syqZ*0>(8QG`G~ z*116*!U71x{&11n!BnS3>~>R;%4gKLXYgKp=JHsf1q(<=18_%HH8~vcx6)lUZ1X=4 znSem_q3sa>9$V#Kk7n}Rl$SP^Mn;{T9}=;p696BHqmLUy&NdC(HUaaVVVW5eLBXR4 z<7>sWV2*Fx)j|!{xfrQ^4!u+=+mKe5Tb?67J&1mBl@@m}tWCh+%>%`^>sfmC0n#i# z(a?beRQn9rESE8&l;7gL&7xLsv;iq4=vmyOM~`NNP*O_*z23czz{^jbXuN&LKjHnu zon5}LCT+}W;XOp1v$x(@twx57#lX)>?!EkJ&7^8Z@TuR~H!^aGLnlU84alwCR|j9W z-^pJmq`Ru1bqnGQejs5VFik9NzzFKJh+62<(bvqN=x7A#Gvh5=Rj+%t5IPCQVYM$i zoP~<|90E~{1{2p3*LN5=fU8cGnvxCN`m1D)Ro5~ z*J^r*>VL4%4m1j@qqTfgdP{*MEGE9&rVdWmO&pNG zev3Ko4JAbwoEzZYon=*%jY9aPq8c3?t5>;E4@(y>fhvT-jV}#8yj=Kh*t!R{l)ixx zu{!t`<0+Ampnz0HJ`3!O1bea$2hll!Qs}uk-|MVD78g$rc#eE)k(q-nA3%=?9>+xZ z&kyf!pQ-_HMv^=(y96v1?^nVP5-uTi*~joq_kyc)80L_TMBq>hOL7gV zC2RG2k$2~XR>y1c*|V!nnTt|#)jSUjEKAf=3Mb=pOaPEO9=jMNfX5vB^Noha$nCmv zJ=MWx_6h5%Ws(;^{ZeE6bX8Bpx=Rrfxc>Djh|)FrQixzqbZk1xQ~lMelE&&aQQ{I0rDr%mgI z%36oNeL>?55Iw+=gjDf*MdZWDHl08H@>g4r`J5g|pFNJ?jtX2#-mY}Ys2~NkzwD~4 zQNN@KHqjgty9eCvxKlawI@sTTD%ddLWtA*ECYs4wm!E23gph+R^mr1@S|4{AR1}S5 z1O2Ir(+k?X%r&Mj!HaOcF>Mr;p^MD^QfuA9x&HYFdx)@_w$bW4!<;W6IrW;-)Ue z!9xQ?&h+ETZSq)$19CGr)-EIH&rhVS42N@qf#pxkbuhR6DCQ3pgBNK%U_Z@-G~q0D zZJOut?+RhA#}%vnyG|rcPwPPnT@mW}6JvOnFs{_M+*%6HhVlsf;fJPF;%AEjr|oTd zzOP>rQ)`GG#cU9Egte@Xw+sm)C}7?D<5 z{#gqRkQ=!+imhDbQI%0gIW@@J5*9hG`6H20%Oz~bbOF-GhaExokQ-`_Jzwyx#*ix@ z-Ulg;q?{328C&n4>lLloKnouDwU5lqY_)Nu!qi&17Pgi-=kNSI{HB$o-qNJ!lIB*L zmw!$#=-dG$?sK795-BA_zu<|{UZ{o5OV{S|ojVVC?((h=>@W6ke;dFL8BHK7E4vqN zGlcS*#!YPNJm!a{<0#`;1*wrE6i@cqk3oeNiZE zPh|ag%8+@V66p5j!Z{!$c@|+%X10;)un}sZz&Qt?K->>I5(s zK4Voy9^dx+C1+7VheB;>?I6AYbZLDf5FbD4s{JS;EL1<^5ke0*vg6l1evaJ`KESm~ zotw<DR`UljLRC%y#r7|MHUQnUqlw`P!7`Jz5r92+@mz1+!xncR{%3|@$=)QKVT(+pZ_%ZoD9tHFUNIpS$5Iy-{ks= zBWkgYHsIPVN@-qH#d2KoqN5Oa?jS2lOhjb+BKQ2F?0@&4-$!SxDhoE@L(s?PuToRe LQY@2y8TwxU6JPra literal 0 HcmV?d00001 diff --git a/docs/Researcher/scheduling/img/quota-split.png b/docs/Researcher/scheduling/img/quota-split.png new file mode 100644 index 0000000000000000000000000000000000000000..edf39d4f3a0249ebfda0c9575f53597a9239b393 GIT binary patch literal 54952 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 100 is non-preemptible and any PriorityClass < 100 is preemptible. -### Departments +Cross project and cross department workload preemptions are referred to as _Resource reclaim_ and are based on fairness between queues rather than the priority of the workloads. -A *Department* is the second hierarchy of resource allocation above *Project*. A Department quota supersedes a Project quota in the sense that if the sum of Project quotas for Department A exceeds the Department quota -- the scheduler will use the Department quota rather than the Projects' quota. +To make it easier for users to submit AI workloads, Run:ai preconfigured several Kubernetes PriorityClass objects, the Run:ai preset PriorityClass objects have their _preemptionPolicy_ always set to _PreemptLowerPriority_, regardless of their actual Run:ai preemption policy within the Run:ai platform. -For further information on Departments and how to configure them, see: [Working with Departments](../../platform-admin/aiinitiatives/org/departments.md) +| PriorityClass Name | PriorityClass | Run:ai preemption policy | K8S preemption policy | +| ----- | ----- | ----- | ----- | +| Inference | 125 | Non-preemptible | PreemptLowerPriority | +| Build | 100 | Non-preemptible | PreemptLowerPriority | +| Interactive-preemptible | 75 | Preemptible | PreemptLowerPriority | +| Train | 50 | Preemptible | PreemptLowerPriority | -### Pods +#### Quota -*Pods* are units of work within a Job. +Each project and department includes a set of guaranteed resource quotas per node pool per resource type. For example, Project LLM-Train/Node Pool NV-H100 quota parameters specify the number of GPUs, CPUs(cores), and the amount of CPU memory that this project guarantees for that node pool. -* Typically, each Job has a single Pod. However, in some scenarios (see Hyperparameter Optimization and Distribute Training below) there will be multiple Pods per Job. -* All Pods execute with the same arguments as added via ``runai submit``. E.g. The same image name, the same code script, the same number of Allocated GPUs, memory. +#### Over-quota -## Basic Scheduling Concepts +Projects and departments can have a share in the unused resources of any node pool, beyond their quota of resources. We name these resources as over quota resources. The admin configures the over-quota parameters per node pool for each project and department. -### Interactive, Training and Inference +#### Over quota priority -The Researcher uses the *--interactive* flag to specify whether the workload is an unattended "train" workload or an interactive "build" workload. +Projects can receive a share of the cluster/node pool unused resources when the over-quota priority setting is enabled, the part each Project receives depends on its over-quota priority value, and the total weights of all other projects’ over-quota priorities. The admin configures the over-quota priority parameters per node pool for each project and department. -* Interactive & Inference workloads will get precedence over training workloads. -* Training workloads can be preempted when the scheduler determines a more urgent need for resources. Interactive workloads are never preempted. +#### Fairshare and fairshare balancing -### Guaranteed Quota and Over-Quota +Run:ai Scheduler calculates a numerical value per project (or department) for each node-pool, representing the project’s (department’s) sum of guaranteed resources plus the portion of non-guaranteed resources in that node pool. We name this value fairshare. -There are two use cases for Quota and Over-Quota: +The scheduler strives to provide each project (or department) the resources they deserve using two main parameters - deserved quota and deserved fairshare (i.e. quota + over quota resources), this is done per node pool. If one project’s node pool queue is below fairshare and another project’s node pool queue is above fairshare, the scheduler shifts resources between queues to balance fairness; this may result in the preemption of some over-quota preemptible workloads. -**Node pools are disabled** +#### Over-subscription -Every new workload is associated with a Project. The Project contains a deserved GPU quota. During scheduling: +Over-subscription is a scenario where the sum of all guaranteed resource quotas surpasses the physical resources of the cluster or node pool. In this case, there may be scenarios in which the scheduler cannot find matching nodes to all workload requests, even if those requests were within the resource quota of their associated projects. -* If the newly required resources, together with currently used resources, end up within the Project's quota, then the workload is ready to be scheduled as part of the guaranteed quota. -* If the newly required resources together with currently used resources end up above the Project's quota, the workload will only be scheduled if there are 'spare' GPU resources. There are nuances in this flow that are meant to ensure that a Project does not end up with an over-quota made fully of interactive workloads. For additional details see below. +#### Gang scheduling -**Node pools are enabled** +Gang scheduling describes a scheduling principle where a workload composed of multiple pods is either fully scheduled (i.e. all pods are scheduled and running) or fully pending (i.e. all pods are not running). Gang scheduling refers to a single pod group. -Every new workload is associated with a Project. The Project contains a deserved GPU quota that is the sum of all node pools GPU quotas. During scheduling: +#### Fairness (fair resource distribution) -* If the newly required resources, together with currently used resources, end up within the overall Project's quota and the requested node pool(s) quota, then the workload is ready to be scheduled as part of the guaranteed quota. -* If the newly required resources together with currently used resources end up above the Project's quota or the requested node pool(s) quota, the workload will only be scheduled if there are 'spare' GPU resources within the same node pool but not part of this Project. There are nuances in this flow that are meant to ensure that a Project does not end up with an over-quota made entirely of interactive workloads. For additional details see below. +Fairness is a major principle within the Run:ai scheduling system. In essence, it means that the Run:ai Scheduler always respects certain resource splitting rules (fairness) between projects and between departments. -### Limit Quota Over or Under Subscription +#### Preemption of lower priority workloads within a project -Run:ai provides the ability to limit over subscription of quotas by *Projects* or *Departments*. +Workload priority is always respected within a project. This means higher priority workloads are scheduled before lower priority workloads, it also means that higher priority workloads may preempt lower priority workloads within the same project __if the lower priority workloads are preemptible__. -Over quota will be limited under the following circumstances: +#### Reclaim of resources between projects and departments -* If a project’s quota request (with or without nodepools) increases the sum of all the department projects quotas to more than the department quota (for GPU and CPU, compute and memory). -* If a department’s quota decrease request (with or without nodepools) causes the sum of all projects quotas to surpass the department quota (for GPU and CPU, compute and memory). -* If a project’s quota decrease request (with or without nodepools) causes the sum of all allocated non-preemptible workloads in that project to surpass it (for GPU and CPU, compute and memory). +Reclaim is an inter-project (and inter-department) scheduling action that takes back resources from one project (or department) that has used them as over-quota, back to a project (or department) that deserves those resources as part of its guaranteed quota, or to balance fairness between projects, each to its fairshare (i.e. sharing fairly the portion of the unused resources). -To configure limiting over or under quota subscriptions: +#### Multi-Level quota system -1. Press the *Tools and settings* icon, then go to *General*. -2. Enable the *Limit quota over/under subscription* toggle. +Each project has a set of guaranteed resource quotas (GPUs, CPUs, and CPU memory) per node pool. Projects can go over-quota and get a share of the unused resources (over-quota) in a node pool beyond their guaranteed quota in that node pool. __The same applies to Departments__. The Scheduler balances the amount of over quota between departments, and then between projects. -To disable the limiting of over quota subscription, disable the toggle. +#### Placement strategy - bin-pack and spread -### Quota with Multiple Resources +The admin can set per node pool placement strategy of the scheduler for GPU based workloads and for CPU-only based workloads. -A project may have a quota set for more than one resource (GPU, CPU or CPU Memory). For a project to be "Over-quota" it will have to have at *least one* resource over its quota. For a project to be under-quota it needs to have *all of its* resources under-quota. +Each type’s strategy can be either bin-pack or spread. -## Scheduler Details +GPU workloads: -### Allocation & Preemption +* Bin-pack means the Scheduler places as many workloads as possible in each GPU and each node to use fewer resources and maximize GPU and node vacancy. +* Spread means the Scheduler spreads workloads across as many GPUs and nodes as possible to minimize the load and maximize the available resources per workload. +* GPU workloads are workloads that request both GPU and CPU resources. -The Run:ai scheduler wakes up periodically to perform allocation tasks on pending workloads: +CPU workloads: -* The scheduler looks at each Project separately and selects the most 'deprived' Project. -* For this deprived Project it chooses a single workload to work on: +* Bin-pack means the scheduler places as many workloads as possible in each CPU and node to use fewer resources and maximize CPU and node vacancy. +* Spread means the scheduler spreads workloads across as many CPUs and nodes as possible to minimize the load and maximize the available resources per workload. +* CPU workloads are workloads that request only CPU resources - * Interactive & Inference workloads are tried first, but only up to the Project's guaranteed quota. If such a workload exists, it is scheduled even if it means **preempting** a running unattended workload in this Project. - * Else, it looks for an unattended workload and schedules it on guaranteed quota or over-quota. +## Scheduler deep dive -* The scheduler then recalculates the next 'deprived' Project and continues with the same flow until it finishes attempting to schedule all workloads +### Allocation -### Node Pools +When a user submits a workload, the workload controller creates a pod or pods (for distributed training workloads or a deployment based Inference). When the scheduler gets a submit request with the first pod, it creates a pod group and allocates all the relevant building blocks of that workload. The next pods of the same workload are attached to the same pod group. -A *Node Pool* is a set of nodes grouped by an Administrator into a distinct group of resources from which resources can be allocated to Projects and Departments. -By default, any node pool created in the system is automatically associated with all Projects and Departments using zero quota resource (GPUs, CPUs, Memory) allocation. This allows any Project and Department to use any node pool with Over-Quota (for Preemptible workloads), thus maximizing the system resource utilization. +A workload, with its associated pod group, is queued in the appropriate queue. In every scheduling cycle, the Scheduler ranks the order of queues by calculating their precedence for scheduling. -* An Administrator can allocate resources from a specific node pool to chosen Projects and Departments. See [Project Scheduling Rules](../../platform-admin/aiinitiatives/org/scheduling-rules.md) -* The Researcher can use node pools in two ways. The first one is where a Project has guaranteed resources on node pools - The Researcher can then submit a workload and specify a single node pool or a prioritized list of node pools to use and receive guaranteed resources. -The second is by using node-pool(s) with no guaranteed resource for that Project (zero allocated resources), and in practice using Over-Quota resources of node-pools. This means a Workload must be Preemptible as it uses resources out of the Project or node pool quota. The same scenario occurs if a Researcher uses more resources than allocated to a specific node pool and goes Over-Quota. -* By default, if a Researcher doesn't specify a node-pool to use by a workload, the scheduler assigns the workload to run using the Project's 'Default node-pool list'. +The next step is for the scheduler to find nodes for those pods, assign the pods to their nodes (bind operation), and bind other building blocks of the pods such as storage, ingress etc. -### Node Affinity +If the pod-group has a _gang scheduling_ rule attached to it, the scheduler either allocates and binds all pods together, or puts all of them into the pending state. It retries to schedule them all together in the next scheduling cycle. -Both the Administrator and the Researcher can provide limitations as to which nodes can be selected for the Job. Limits are managed via [Kubernetes labels](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/){target=_blank}: +The scheduler also updates the status of the pods and their associate pod group, users are able to track the workload submission process both in the CLI or Run:ai UI. -* The Administrator can set limits at the Project level. Example: Project `team-a` can only run `interactive` Jobs on machines with a label of `v-100` or `a-100`. See [Project Scheduling Rules](../../platform-admin/aiinitiatives/org/scheduling-rules.md) for more information. -* The Researcher can set a limit at the Job level, by using the command-line interface flag `--node-type`. The flag acts as a subset to the Project setting. +### Preemption -Node affinity constraints are used during the *Allocation* phase to filter out candidate nodes for running the Job. For more information on how nodes are filtered see the `Filtering` section under [Node selection in kube-scheduler](https://kubernetes.io/docs/concepts/scheduling-eviction/kube-scheduler/#kube-scheduler-implementation){target=_blank}. The Run:ai scheduler works similarly. +If the scheduler cannot find resources for the submitted workloads (and all of its associated pods), and the workload deserves resources either because it is under its queue quota or under its queue fairshare, the scheduler tries to reclaim resources from other queues; if this doesn’t solve the resources issue, the scheduler tries to preempt lower priority preemptible workloads within the same queue. -### Reclaim +#### Reclaim preemption between projects (and departments) -During the above process, there may be a pending workload whose Project is below the deserved capacity. Still, it cannot be allocated due to the lack of GPU resources. The scheduler will then look for alternative allocations at the expense of another Project which has gone over-quota while preserving fairness between Projects. +Reclaim is an inter-project (and inter-department) resource balancing action that takes back resources from one project (or department) that has used them as an over-quota, back to a project (or department) that deserves those resources as part of its deserved quota, or to balance fairness between projects (or departments), so a project (or department) doesn’t exceed its fairshare (portion of the unused resources). -### Fairness +This mode of operation means that a lower priority workload submitted in one project (e.g. training) can reclaim resources from a project that runs a higher priority workload (e.g. preemptive workspace) if fairness balancing is required. -The Run:ai scheduler determines fairness between multiple over-quota Projects according to their GPU quota. Consider for example two Projects, each spawning a significant amount of workloads (e.g. for Hyperparameter tuning) all of which wait in the queue to be executed. The Run:ai Scheduler allocates resources while preserving fairness between the different Projects regardless of the time they entered the system. The fairness works according to the **relative portion of the GPU quota for each Project.** To further illustrate that, suppose that: - -* Project A has been allocated a quota of 3 GPUs. -* Project B has been allocated a quota of 1 GPU. - -Then, if both Projects go over-quota, Project A will receive 75% (=3/(1+3)) of the idle GPUs and Project B will receive 25% (=1/(1+3)) of the idle GPUs. This ratio will be recalculated every time a new Job is submitted to the system or an existing Job ends. - -This fairness equivalence will also be maintained amongst **running** Jobs. The scheduler will preempt training sessions to maintain this balance. - -Large distributed workloads from one *Department* may be able to preempt smaller workloads from another Department. You can preserve in-quota workloads even if the department quota or over-quota-fairness is not preserved. This is done by adding the following to the `Spec:` section of the `RunaiConfig` file: - -``` -runai-scheduler: - disable_department_fairness: false -     fullHierarchyFairness: false -``` - -If you want to change the behavior of the scheduler so that you always preserve project guaranteed quota, change `runaiconfig.disable_department_fairness` to TRUE. -This behavior allows you to go back to the original current behavior. +!!! Note + Only preemptive workloads can go over-quota as they are susceptible to reclaim (cross-projects preemption) of the over-quota resources they are using. The amount of over-quota resources a project can gain depends on the over-quota priority or quota (if over-quota priority is disabled). Departments’ over-quota is always proportional to its quota. -By default, the Run:ai software at the cluster level maintains the current fairness mode after an upgrade. To change to the fairness mode, the Admin must change the `RunaiConfig file and change the parameters above. +#### Priority preemption within a project -### Over-Quota Priority +Higher priority workloads may preempt lower priority preemptible workloads within the same project/node pool queue. For example, in a project that runs a training workload that exceeds the project quota for a certain node pool, a newly submitted workspace within the same project/node pool may stop (preempt) the training workload if there are not enough over-quota resources for the project within that node pool to run both workloads (e.g. workspace using in-quota resources and training using over-quota resources). -*Over-Quota Priority* prioritizes the distribution of unused resources so that they are allocated to departments and projects fairly. Priority is determined by an assigned weight. *Over-Quota Priority* values are translated into numeric values as follows: None-0, Low-1, Medium-2, High-3. +There is no priority notion between workloads of different projects. -**For *Projects*** +### Quota, over-quota, and fairshare -When *Over-Quota Priority* is enabled, the excess resources are split between the Projects according to the over-quota-priority weight set by the admin. When *Over-Quota Priority* is disabled, excess resources are split between the Projects according to weights, and the weights are equal to the deserved quota. This means Projects with a higher deserved quota will get a larger portion of the unused resources. +Run:ai scheduler strives to ensure fairness between projects and between departments, this means each department and project always strive to get their deserved quota, and unused resources are split between projects according to known rules (e.g. over-quota weights). -An example with Over-Quota Weights for projects: +If a project needs more resources even beyond its fairshare, and the scheduler finds unused resources that no other project needs, this project can consume resources even beyond its fairshare. -* Project A has been allocated with a quota of 3 GPUs and GPU over-quota weight is set to Low. -* Project B has been allocated with a quota of 1 GPU and GPU over-quota weight is set to High. +Some scenarios can prevent the scheduler from fully providing the deserved quota and fairness promise, such as fragmentation or other scheduling constraints like affinities, taints etc. -**For *Departments*** +The example below illustrates a split of quota between different projects and departments, using several node pools: -When *Departments* are enabled, excess resources are first split to the departments, then internally to the projects.Excess resources between Departments are always split between departments according to the weights which are equal to the deserved quota regardless of the Over-Quota-Priority flag. +__Legend:__ -Then, Project A is allocated with 3 GPUs and project B is allocated with 1 GPU. If both Projects go over-quota, Project A will receive an additional 25% (=1/(1+3)) of the idle GPUs and Project B will receive an additional 75% (=3/(1+3)) of the idle GPUs. +* __OQP__ = Over-quota priority +* __OQ__ = Over-quota -With the addition of node pools, the principles of Over-Quota and Over-Quota priority remain unchanged. However, the number of resources that are allocated with Over-Quota and Over-Quota Priority is calculated against node pool resources instead of the whole Project resources. +![](img/quota-split.png) -!!! Note - Over-Quota On/Off and Over-Quota Priority settings remain at the Project and Department level. +The example below illustrates how fairshare is calculated per project/node pool and per department/node pool for the above example: -When the Over Quota Priority is disabled, over-quota weights are equal to deserved quota and any excess resources are divided in the same proportion as the in-quota resources. +![](img/fairshare.png) -### Bin-packing & Consolidation +The __Over quota (OQ)__ portion of each Project (per node pool) is calculated as: -Part of an efficient scheduler is the ability to eliminate fragmentation: + [(OQ-Priority) / (Σ Projects OQ-Priorities)] x (Unused Resource per node pool) -* The first step in avoiding fragmentation is bin packing: try and fill nodes (machines) up before allocating workloads to new machines. -* The next step is to consolidate Jobs on demand. If a workload cannot be allocated due to fragmentation, the scheduler will try and move unattended workloads from node to node in order to get the required amount of GPUs to schedule the pending workload. +__Fairshare(FS)__ is calculated as: the sum of Quota + Over-Quota -## Advanced +Let’s see how Project 2 __over quota__ and __fairshare__ are calculated: -### GPU Fractions +For this example, we assume that out of the 40 available GPUs in node pool A, 20 GPUs are currently unused (unused means either not part of any project’s quota, or part of a project’s quota but not used by any workloads of that project). -Run:ai provides a Fractional GPU sharing system for containerized workloads on Kubernetes. The system supports workloads running CUDA programs and is especially suited for lightweight AI tasks such as inference and model building. The fractional GPU system transparently gives data science and AI engineering teams the ability to run multiple workloads simultaneously on a single GPU. +Project 2 __over quota__ share: -Run:ai’s fractional GPU system effectively creates logical GPUs, with their own memory and computing space that containers can use and access as if they were self-contained processors. + [(Project 2 OQ-Priority) / (Σ all Projects OQ-Priorities)] x (Unused Resource within node pool A) -One important thing to note is that fraction scheduling divides up **GPU memory**. As such the GPU memory is divided up between Jobs. If a Job asks for 0.5 GPU, and the GPU has 32GB of memory, then the Job will see only 16GB. An attempt to allocate more than 16GB will result in an out-of-memory exception. + [(3) / (2 + 3 + 1)] x (20) = (3/6) x 20 = 10 GPUs -GPU Fractions are scheduled as regular GPUs in the sense that: +__Fairshare__ = deserved quota + over quota = 6 +10 = 16 GPUs -* Allocation is made using fractions such that the total of the GPU allocation for a single GPU is smaller or equal to 1. -* Preemption is available for non-interactive workloads. -* Bin-packing & Consolidation work the same for fractions. +Similarly, fairshare is also calculated for CPU and CPU memory. -Support: +The scheduler can grant a project more resources than its fairshare if the scheduler finds resources not required by other projects that may deserve those resources. -* Hyperparameter Optimization supports fractions. +One can also see in the above illustration that Project 3 has no guaranteed quota, but it still has a share of the excess resources in node pool A. Run:ai Scheduler ensures that Project 3 receives its part of the unused resources for over quota, even if this results in reclaiming resources from other projects and preempting preemptible workloads. -### Distributed Training +### Fairshare balancing -Distributed Training, is the ability to split the training of a model among multiple processors. It is often a necessity when multi-GPU training no longer applies; typically when you require more GPUs than exist on a single node. Each such split is a *pod* (see definition above). Run:ai spawns an additional *launcher* process that manages and coordinates the other worker pods. +The Scheduler constantly re-calculates the fairshare of each project and department (per node pool, represented in the scheduler as queues), resulting in the re-balancing of resources between projects and between departments. This means that a preemptible workload that was granted resources to run in one scheduling cycle, can find itself preempted and go back to the pending state waiting for resources on the next cycle. -Distribute Training utilizes a practice sometimes known as **Gang Scheduling**: +A queue, representing a scheduler-managed object for each Project or Department per node pool, can be in one of 3 states: -* The scheduler must ensure that multiple pods are started on what are typically multiple Nodes before the Job can start. -* If one pod is preempted, the others are also immediately preempted. -* When node pools are enabled, all pods must be scheduled to the same node pool. +* __In-quota __ + The *queue’s allocated resources* ≤ queue deserved quota +* __Over-quota (but below fairshare) __ + The queue’s deserved quota < *queue’s allocates resources* <= queue’s fairshare +* __Over-Fairshare (and over-quota)__ + The queue’s fairshare < *queue’s allocated resources* -Gang Scheduling essentially prevents scenarios where part of the pods are scheduled while other pods belonging to the same Job are pending for resources to become available; scenarios that can cause deadlock situations and major inefficiencies in cluster utilization. +![](img/queue.png) -The Run:ai system provides: +The scheduler’s first priority is to ensure each queue (representing a project/node pool or department/node pool scheduler object) receives its deserved quota. Then the scheduler tries to find and allocate more resources to queues that need resources beyond their deserved quota and up to their fairshare, finally, the scheduler tries to allocate resources to queues that need even more resources - beyond their fairshare. -* Inter-pod communication. -* Command-line interface to access logs and an interactive shell. +When re-balancing resources between queues of different projects and departments, the scheduler goes in the opposite direction, i.e. first take resources from over-fairshare queues, then from over-quota queues, and finally, in some scenarios, even from queues that are below their deserved quota. -For more information on Distributed Training in Run:ai see [here](../Walkthroughs/walkthrough-distributed-training.md) +## Summary -### Hyperparameter Optimization +The scheduler’s role is to bind any submitted pod to a node that satisfies the pod’s requirements and constraints while adhering to the Run:ai quota and fairness system. In some scenarios, the scheduler finds a node for a pod (or nodes for a group of pods) immediately. In other scenarios, the scheduler has to preempt an already running workload to “make room”, while sometimes a workload becomes pending until resources are released by other workloads (e.g. wait for other workloads to terminate), and only then it is scheduled and run. -Hyperparameter optimization (HPO) is the process of choosing a set of optimal hyperparameters for a learning algorithm. A hyperparameter is a parameter whose value is used to control the learning process, to define the model architecture or the data pre-processing process, etc. Example hyperparameters: learning rate, batch size, different optimizers, and the number of layers. +Other than scenarios where the requested resources or other constraints cannot be met within the cluster, either because the resources physically don’t exist (e.g. a node with 16 GPUs, or a GPU with 200GB of memory), or a combination of constraints cannot be matched (e.g. a GPU with 80GB of memory together with a node with specific label or storage type), the scheduler eventually finds any workload its matching nodes to use, but this process may take some time. -To search for good hyperparameters, Researchers typically start a series of small runs with different hyperparameter values, let them run for a while, and then examine the results to decide what works best. +The Run:ai scheduler adheres to Kubernetes standard rules, but it also adds a layer of fairness between queues, queue hierarchy, node pools, and many more features, making the scheduling and Quota management more sophisticated, granular, and robust. The combination of these scheduler capabilities results in higher efficiency, scale, and maximization of cluster utilization. -With HPO, the Researcher provides a single script that is used with multiple, varying, parameters. Each run is a *pod* (see definition above). Unlike Gang Scheduling, with HPO, pods are **independent**. They are scheduled independently, started, and end independently, and if preempted, the other pods are unaffected. The scheduling behavior for individual pods is exactly as described in the Scheduler Details section above for Jobs. -In case node pools are enabled, if the HPO workload has been assigned with more than one node pool, the different pods might end up running on different node pools. diff --git a/docs/Researcher/workloads/workload-support.md b/docs/Researcher/workloads/workload-support.md index 03c2c0ef7b..e952b1beea 100644 --- a/docs/Researcher/workloads/workload-support.md +++ b/docs/Researcher/workloads/workload-support.md @@ -17,8 +17,8 @@ Different types of workloads have different levels of support. Understanding wha | ----- | :---: | :---: | :---: | :---: | ----- | | | Run:ai workloads | | | | Third-party workloads | | | Training - Standard | Workspace | Inference | Training - distributed | All K8s workloads | -| [Fairness](../../Researcher/scheduling/the-runai-scheduler.md#fairness) | v | v | v | v | v | -| [Priority and preemption](../../Researcher/scheduling/the-runai-scheduler.md#allocation--preemption) | v | v | v | v | v | +| [Fairness](../../Researcher/scheduling/the-runai-scheduler.md#fairness-fair-resource-distribution) | v | v | v | v | v | +| [Priority and preemption](../../Researcher/scheduling/the-runai-scheduler.md#preemption) | v | v | v | v | v | | [Over quota](../../Researcher/scheduling/the-runai-scheduler.md#over-quota-priority) | v | v | v | v | v | | [Node pools](../../platform-admin/aiinitiatives/resources/node-pools.md) | v | v | v | v | v | | Bin packing / Spread | v | v | v | v | v | @@ -27,7 +27,7 @@ Different types of workloads have different levels of support. Understanding wha | Node level scheduler | v | v | v | v | v | | GPU swap | v | v | v | v | v | | Elastic scaling | NA | NA | v | v | v | -| [Gang scheduling](../../Researcher/scheduling/the-runai-scheduler.md#distributed-training) | v | v | v | v | v | +| [Gang scheduling](../../Researcher/scheduling/the-runai-scheduler.md#gang-scheduling) | v | v | v | v | v | | [Monitoring](../../admin/maintenance/alert-monitoring.md) | v | v | v | v | v | | [RBAC](../../admin/authentication/authentication-overview.md#role-based-access-control-rbac-in-runai) | v | v | v | v | | | Workload awareness | v | v | v | v | | diff --git a/docs/home/whats-new-2-15.md b/docs/home/whats-new-2-15.md index 88ced94ffc..c03e0ddd02 100644 --- a/docs/home/whats-new-2-15.md +++ b/docs/home/whats-new-2-15.md @@ -87,9 +87,9 @@ date: 2023-Dec-3 #### Quotas and Over-Quota -* Improved control over how over-quota is managed by adding the ability to block over-subscription of the quota in *Projects* or *Departments*. For more information, see [Limit Over-Quota](../Researcher/scheduling/the-runai-scheduler.md#limit-quota-over-or-under-subscription). +* Improved control over how over-quota is managed by adding the ability to block over-subscription of the quota in *Projects* or *Departments*. For more information, see [Limit Over-Quota](../Researcher/scheduling/the-runai-scheduler.md#over-quota). * Improved the scheduler fairness for departments using the `over quota priority` switch (in Settings). When the feature flag is disabled, over-quota weights are equal to the deserved quota and any excess resources are divided in the same proportion as the in-quota resources. For more information, see [Over Quota Priority](../Researcher/scheduling/the-runai-scheduler.md#over-quota-priority). -* Added new functionality to always guarantee in-quota workloads at the expense of inter-Department fairness. Large distributed workloads from one department may preempt in-quota smaller workloads from another department. This new setting in the `RunaiConfig` file preserves in-quota workloads, even if the department quota or over-quota-fairness is not preserved. For more information, see [Scheduler Fairness](../Researcher/scheduling/the-runai-scheduler.md#fairness). +* Added new functionality to always guarantee in-quota workloads at the expense of inter-Department fairness. Large distributed workloads from one department may preempt in-quota smaller workloads from another department. This new setting in the `RunaiConfig` file preserves in-quota workloads, even if the department quota or over-quota-fairness is not preserved. For more information, see [Scheduler Fairness](../Researcher/scheduling/the-runai-scheduler.md#fairness-fair-resource-distribution). ### Scheduler -* Added new functionality to always guarantee in-quota workloads at the expense of inter-Department fairness. Large distributed workloads from one *Department* may preempt in-quota smaller workloads from another *Department*. This new setting in the `RunaiConfig` file preserves in-quota workloads, even if the department quota/over-quota-fairness is not preserved. For more information, see [Scheduler Fairness](../Researcher/scheduling/the-runai-scheduler.md#fairness). +* Added new functionality to always guarantee in-quota workloads at the expense of inter-Department fairness. Large distributed workloads from one *Department* may preempt in-quota smaller workloads from another *Department*. This new setting in the `RunaiConfig` file preserves in-quota workloads, even if the department quota/over-quota-fairness is not preserved. For more information, see [Scheduler Fairness](../Researcher/scheduling/the-runai-scheduler.md). ### Ephemeral volumes