From faeb5b8f19a5b8669f5302e8959217131b6ac0a2 Mon Sep 17 00:00:00 2001 From: Alexandre Strube <a.strube@fz-juelich.de> Date: Wed, 12 Mar 2025 17:29:51 +0100 Subject: [PATCH] Update course materials and scripts for March 2025 event --- README.md | 6 +- index.md | 66 +++-- public/README.html | 8 +- public/images/FSDP-graph-2a.png.webp | Bin 0 -> 38936 bytes public/images/slides.png | Bin 652 -> 457 bytes public/index.html | 384 +++++++++++++++------------ public/pics/sabrina.jpg | Bin 0 -> 38594 bytes src/distrib.slurm | 6 +- src/serial.slurm | 6 +- 9 files changed, 270 insertions(+), 206 deletions(-) create mode 100644 public/images/FSDP-graph-2a.png.webp create mode 100644 public/pics/sabrina.jpg diff --git a/README.md b/README.md index 26fee92..9df2e38 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ --- author: Alexandre Strube -title: Getting Started with AI on Supercomputers +title: Overview of AI distribution techniques --- -This repo is specifically for the course described in [indico](https://indico3-jsc.fz-juelich.de/event/201) +This repo is specifically for the course described in [indico](https://nxtaim.de/en/events-en/) --- @@ -18,7 +18,7 @@ This repo is specifically for the course described in [indico](https://indico3-j Please, fork this thing! Use it! And submit merge requests! ## Authors and acknowledgment -Alexandre Otto Strube, May 2024 +Alexandre Otto Strube, March 2025 ## Certificate Human resources make them. diff --git a/index.md b/index.md index c5a5853..dd20704 100644 --- a/index.md +++ b/index.md @@ -2,12 +2,12 @@ author: Alexandre Strube title: Deep Learning on Supercomputers # subtitle: A primer in supercomputers` -date: November 13, 2024 +date: March 13, 2025 --- ## Resources: -- [This document](https://strube1.pages.jsc.fz-juelich.de/2024-11-talk-intro-to-supercompting-jsc) -- [Source code of this course](https://gitlab.jsc.fz-juelich.de/strube1/2024-11-talk-intro-to-supercompting-jsc) +- [This document](https://strube1.pages.jsc.fz-juelich.de/2025-03-talk-nxtaim) +- [Source code of this course](https://gitlab.jsc.fz-juelich.de/strube1/2025-03-talk-nxtaim)  @@ -20,10 +20,7 @@ date: November 13, 2024  :::: :::: {.col} - -:::: -:::: {.col} - + :::: ::: @@ -37,7 +34,7 @@ date: November 13, 2024 - on a mult-gpu, multi-node system - like a supercomputer 🤯 - Important: This is an overview, _*NOT*_ a basic AI course! -- We have [introductory courses on AI on supercomputers](https://www.fz-juelich.de/en/ias/jsc/news/events/training-courses/2024/ai-sc-4) +- We have [introductory courses on AI on supercomputers](https://www.fz-juelich.de/en/ias/jsc/news/events/training-courses/2025/ai-sc-1) -   @@ -47,21 +44,21 @@ date: November 13, 2024 ### Please access it now, so you can follow along: -[https://go.fzj.de/2024-11-talk-intro-to-supercomputing-jsc](https://go.fzj.de/2024-11-talk-intro-to-supercomputing-jsc) +[https://go.fzj.de/2025-03-nxtaim](https://go.fzj.de/2025-03-nxtaim)  --- -## Git clone this repository +<!-- ## Git clone this repository - All slides and source code - Connect to the supercomputer and do this: - ```bash -git clone https://gitlab.jsc.fz-juelich.de/strube1/2024-11-talk-intro-to-supercompting-jsc.git +git clone https://gitlab.jsc.fz-juelich.de/strube1/2025-03-talk-nxtaim.git ``` ---- +--- --> ## Deep learning is... @@ -369,6 +366,22 @@ git clone https://gitlab.jsc.fz-juelich.de/strube1/2024-11-talk-intro-to-superco --- +## Fully Sharded Data Parallelism + +- Shards model parameters, optimizer states and gradients across DDP ranks. +- Decompose the all-reduce operations in DDP into separate reduce-scatter and all-gather operations: +- { width=450px } + +--- + +## Fully Sharded Data Parallelism + +- Reduces the memory footprint of each GPU +- Increases the communication volume +- Allows for massive scaling (100000+ GPUs) + +--- + ## Recap - Data parallelism: @@ -386,18 +399,33 @@ git clone https://gitlab.jsc.fz-juelich.de/strube1/2024-11-talk-intro-to-superco --- +## Recap + +- Pipelining: + - Split the model over multiple GPUs + - Each GPU does a part of the forward pass + - The gradients are averaged at the end +- Pipelining, multi-node: + - Same, but gradients are averaged across nodes +- Fully Sharded Data Parallelism: + - Split the model, optimizer states and gradients across DDP ranks + - Decompose the all-reduce operations in DDP into separate reduce-scatter and all-gather operations + - Lower memory, higher communication volume + +--- + ## Are we there yet?  --- -## If you haven't done so, please access the slides to clone repository: +## You can clone the repo yourself  - ```bash -git clone https://gitlab.jsc.fz-juelich.de/strube1/2024-11-talk-intro-to-supercompting-jsc.git +git clone https://gitlab.jsc.fz-juelich.de/strube1/2025-03-talk-nxtaim.gif ``` @@ -518,7 +546,7 @@ learn.fine_tune(6) - Only add new requirements - [Link to gitlab repo](https://gitlab.jsc.fz-juelich.de/kesselheim1/sc_venv_template) - ```bash -cd $HOME/2024-11-talk-intro-to-supercompting-jsc/src +cd $HOME/2025-03-talk-nxtaim/src git clone https://gitlab.jsc.fz-juelich.de/kesselheim1/sc_venv_template.git ``` - Add this to sc_venv_template/requirements.txt: @@ -558,7 +586,7 @@ source sc_venv_template/activate.sh #SBATCH --partition=dc-gpu # Make sure we are on the right directory -cd $HOME/2024-11-talk-intro-to-supercompting-jsc/src +cd $HOME/2025-03-talk-nxtaim/src # This loads modules and python packages source sc_venv_template/activate.sh @@ -579,7 +607,7 @@ time srun python serial.py ## Download dataset ```bash -cd $HOME/2024-11-talk-intro-to-supercompting-jsc/src +cd $HOME/2025-03-talk-nxtaim/src source sc_venv_template/activate.sh python serial.py @@ -599,7 +627,7 @@ Epoch 1/1 : |-------------------------------------------------------------| 0.71 ## Running it - ```bash -cd $HOME/2024-11-talk-intro-to-supercompting-jsc/src +cd $HOME/2025-03-talk-nxtaim/src sbatch serial.slurm ``` - On Juwels Booster, should take about 5 minutes @@ -669,7 +697,7 @@ with learn.distrib_ctx(): ## Submission script: data parallel -- Please check the course repository: [src/distrib.slurm](https://gitlab.jsc.fz-juelich.de/strube1/2024-11-talk-intro-to-supercompting-jsc/-/blob/main/src/distrib.slurm) +- Please check the course repository: [src/distrib.slurm](https://gitlab.jsc.fz-juelich.de/strube1/2025-03-talk-nxtaim/-/blob/main/src/distrib.slurm) - Main differences: diff --git a/public/README.html b/public/README.html index 35564c4..c57a9c5 100644 --- a/public/README.html +++ b/public/README.html @@ -4,7 +4,7 @@ <meta charset="utf-8"> <meta name="generator" content="pandoc"> <meta name="author" content="Alexandre Strube"> - <title>Getting Started with AI on Supercomputers</title> + <title>Overview of AI distribution techniques</title> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui"> @@ -160,14 +160,14 @@ <div class="slides"> <section id="title-slide"> - <h1 class="title">Getting Started with AI on Supercomputers</h1> + <h1 class="title">Overview of AI distribution techniques</h1> <p class="author">Alexandre Strube</p> </section> <section class="slide level2"> <p>This repo is specifically for the course described in <a -href="https://indico3-jsc.fz-juelich.de/event/201">indico</a></p> +href="https://nxtaim.de/en/events-en/">indico</a></p> </section> <section class="slide level2"> @@ -185,7 +185,7 @@ the self-contained HTML files.</li> </section> <section id="authors-and-acknowledgment" class="slide level2"> <h2>Authors and acknowledgment</h2> -<p>Alexandre Otto Strube, May 2024</p> +<p>Alexandre Otto Strube, March 2025</p> </section> <section id="certificate" class="slide level2"> <h2>Certificate</h2> diff --git a/public/images/FSDP-graph-2a.png.webp b/public/images/FSDP-graph-2a.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..5015cd0698d6fe509f1d1fe1015c55b2712f8fa1 GIT binary patch literal 38936 zcmWIYbaNA!!N3si>J$(bVBy0&gMmT+y~|pLvkrN;JtnaHoLBUZGrZLQy{o{*|C|s0 zUpuC{N^`}6m05gVJ0D!z-(~A-e6I9n_Bs|Br7o=wtu6(=)yjsRJ_o)|mQD&}`FZrM zx#`CvVR37dRjVfdao8CcU-04V#KkeEOY>#A0z@`)T)ib1QnksfR8K9ga#h#+KMT~< z^C#pBpW^11P)Yo8;^EV2;rA*}AJ+QKR+e>p<Lp+BZIkt<F8H^)h&9pg$m0i|LC4rq zv?sm2<y&Yev+dI%%V<k`$^ZY$bMzd$4?kO^^SnY}lZa<nu6BgV*~_oze|u)X>g%1m z>o3-`=H1p<X=2qD{=i<Pc;*}LEj)i^ra$$L7nVF^uer&0L++t%nc^PoYF`*ym7d<d zF^N-{t2e>ZeFIOzL4hq#)K8>LV0O^isNlw9V=2J?C}s|`gXQsK{iU03S_$xfv9a`e z-?{wlXZ7n2JZHLUw<sT6lWTmtYoEK$>};bMybmhg+Ue*R?Ka<C?{qKf&Y?H*S>IQe z?PpVGSDM#Z{n25kD0@}^xuZY38B<;a+VcipO_OYTQ=MFV^G#Y#zCWLhWdv`-Dy?6h zkt#-(yFZ0g6cvPTE7CjnmEm;4G@fY}UvA6YYSwp6yu()co$Je3&-(_)7`Hq)pK&l% z<m9c#J7f+pr1j2B6+1XR^8Z<Ldx!29-7aOngv3}gc!M@^=rK#o(F>M4AdsoaU$BdR z!pg;d`iqxcJ3Yg9zg(#gv%<RdO{Y^{%-+d!`<2vt@23%#Ti0s;KGpJR!JJFX3;3=C zvM+1CC%dA#lVhXb=_Aul9=j&&o;q7Uc-z$6%I&APpU&O0de7r_(b9&4F$Y%NeRwFZ z`t7&r5xe=bzo#XZ@3_&de&yz|-<^wj9nxxDA4S;+Tz?eRapY&1*n`sx<ez<G*cjo( zzxv^q?6hPn^CRY^HzE#ijnG{f6}lp9YrxTYfd@;bxv))F>}t)>I<nfVPru*J?)ov$ z^}WK6yUqI6tv}_imh^ZEx6w@p^8?41m*>h%pM6*EdCDz|YwGv57RLNz*wQF<@7hw{ zd)LBSd>Q6Bu*Y}V-gRVeD3{pM`$S{&!~Uw%;w*xOj6FY-Wm|VKU5)G(?p`)+mCWj* zb*p5u)j6*?afEO<%s5=^D*F6st>v<-+~-~-z3zH+YPO%hXz!yRZfQ$gCaiCr{3~pd zL7Hkf|9q}y--UduIQE^2JlB8BcaIX63a1jsw)S%yd+&WbF`G-F<IK5@`8<!m-H<sr z(WUmvzx748qpJBm7Yj~KovAo6d3oV$laRDH+tjpo@y}z@(vBUjIpuS(XhEssnUrm+ zw>PPHOI^AUr#<WD{<S~<9h-O4c&nXVq<O65%Q(@}#j;ng+xAXfrOs!%Yx(X1>D#Z) zicH!y&mnW|Gat<rD(kxA{QhR#-sUkWH~ReNziICt3Q7icHqV?{>2ZhQnp?D+ew)dX zi~Mp@#-AmQdN%T<ecL}H=XTgu^Gh+$Yw!Q}K6obNlvH|I!>XH?a#)L}&6wE~IBn_w z>h~==x3;w|nRUG6MD-O*wQwDmJ%RF5=H%upTh1yxmpE1L!Ce0b*1wzb7>~wJcIFI~ zt2<|=>9E`Bb8~?8-*Y>y{;WP}e8)7v#-W}0$WrD5J9<@ILr?#7uhMTzyI?kH@e>W3 z`Wbt34hh~i>s#_VHvA3mx9#7*H00jiy!7I>PQN#$Z<c*u_j2#|JRia3OTORhei^E6 z`^(1vjE!dSrRw*4zx!1AtDT*+K(p*@!)c?q>!s7D{5I=9J(*X~FhSpAoj{XRK)|tv z1v_&D107kVGo~;onF(-5I8BjIb`n#$S$Nx|=x0Ex<O4?)kCj?~o;2j%E;jGoy7h`q z<RsnI5z}<c@2t)_z4!Y)?V|}<8p|XM_L?_y%EmBQKj@NvS9EaiLpAZ8;&-}rqNk~@ zzFsP`VPEROs=X@SZ*Gb!rrs9&$XDHd!0B-#&*K)cIZT|+LT!KB9k_(m{Zdc(KWfPl zGD<sceRIplBiplYZ<F<07n=Qg^2*&Qj7zIk4*BMHsk7=b>g}pu`$hXFb6$*3NB6Gd zvv+eBnKQcG)t|GsvPUI)YwqoBHeR>S6z5$@n%EM3$h9e_jd^qGg+;mAInr;#cTe`2 z^Hpy3(Jtj=?#Xo?4u@j5{67D?|GWHq`+N0!{#X3}`0w%G<G;`UU%!U!n^fmi(>o_q zT~+o}M$7UFIrXjHCA=pk@X+j^o1SW|H%v{Hxt7O$W;x4_&6TFXQ+OryiyD5kG3co7 zKcsd($6$j8OLt`1no5nFV`;WIW<rO~yjXrSP%qeb#+41nU-784x!UcnF3p^=M^bJ< z?HY?q8NX^9+W(*1_PKV(l)q(X!xug%<L(Z(uj+ZaLsUqWui)R_Pa8SEsJZ`XUQ*wy zZs<7g>!m{s=l@QxVGUaMf3wFQ$+TI?scS=S{_oon<i9lM<35jB2WIZBUCi6x`{TWn zysm!S^Vh$6B7fa9H}Y9s|1)885RZjN7KiUNt&jY*2KS0~y=mL`<m`Tj&Lxqie&0_$ z6%th2d*Sy4-qbJOpMBaE!uESD|BP?R+iyPi)zkEv@FyjG?c3HqwNkZ>jH$ocU*%1| zbs%`Mam|m}ig#Oo-KaaYvO-03R=Ihu${8Vs2ex0nZt|DUd);SuUuZqUf<0FkZMd!3 zz00j;&x|)S*~6mmY&uc<efHrU!dsrqJ@e*~_O!P%f6l*fSJkd*%KMvhB7ZL4EE(+f zy*7qF_}BY2bI-lhJI`vW{(fs`M*X5!fo6YqtzB{cbVYB4r@`|hP4#;e-yJ{I+U62- zoufg&yep}Qy~J&{uiS~x0*6(NKbA(Sig8%+?>@Od&hpQBGtLXIZ(E+Yt-V}JS!c@( zlcy_0s-@>&nZnihtnTiixa}=^-!@))U6vOYIptu<&aa<TFUo!^zjKo@a?+<1154I7 zL9_BUX@0G#wSAg-NanBm{@Q!bs%)1E86Ve@%>P}qwB#1g?&S3M$HgX8%w1L4vX{&4 z=$1`MF&d>wnTD=!zic+{)!hE=VEC%To~xUp>)y&dxs@`3@#P08!)ooikC{glm$79S zO}J<NZ|$|dGu&$a%RYH5FU$Iw{KEQEb`s;U4bRrh(acePxrr}(dsVdSvI}!1Ha(l_ z`q^%k?X%8FE1!g^EKbX@sa}+6S$*o{^v`+j_t>^c=RP)xnQil|W?RB-gNA?qA77DP zJk#y!dZkYx>sD7S%i6VmZ-vzPeOIO_nO}{r(&0G#@9%uIGn=l;U35A>_r^N=kJEYL zywfud=q5f&->Fe(HznQW?yU!9`IFMlTCT5nWS#o%#mh_iHJvwlzfRlde&j>%jdP1O zDCf0)596QL;!^P;r><e;ucYJ2Q{0StcQLPg=*zeGZI#}v>bi!f|DLjoUuEX&z4cbn zsbZ(xhCDxp{U`6+zI1QntmfXX`a2+d`D_2ZJ6(=+$zLx|3Y1FLVtA0Gs~b9T`(fkT zk^QVbSNXzEzn*nG+xF{)9kMqLL_Rp^{f<+2@|iEszcQwNU)S<sQiym{^ipYNuha-l zf2k|l>7T#;yt_hB{9bzco;mipK2!Mw#3Ekw=tbS#Xsi@x+EBiU@y1>Qr*$eRx0wxI zSKZNSJ-S#mV2@UwoJ0nzL;d&V414%wZmMt|P=0r`aZ~x4;%o9H%(BH-Wkl0kJSPXw z@;2d<aFk6H<Y!-TxAx_MovqASyTf|l80@$Bov|{nU#P$JlBW^(95GIVqtBn*WqI6w zER;dv*}t7vpWT_6e{PQ3(iKmmyZbg-n=;;bUU9H3Zu13wYv#s>4htO)%u8o#oYZ*W zG(%T$dBeTqItAMmHoW$JtGoHty4RM6=5Fw4aQu7B>*~8(kts3zR3v^sn|teL);v+W z>c97RHOvZ6&3LD9vo&tf{I==Ld(Y?ApMJ9<^ju!!o?nmuB^>xPcj}>A4pZOUZI4>B z%GET%ts%&ALiyc-XBR_nmvU@oFt{&uMsLI3%=YECvjX%C9oHJ(-f(<z__pqd$FrUU z9Nt`Z=HWZTb?sZ%)&EYiax|KCqAh>x6y>=()0$_WygebExg+nWOuK%}u}=-<oA2pg zIMew>on^<on@_#@ef_HLc<q`m9=`7X@6-2lKFAgv<!zBu<hcK|@%}394bypT)pP9n zx7=ENMTl4BUvVzascp=W<y%$%GVROTw>?wmim~P{=Q(x44NE_0dKCP7`Jd$s*M*hV z*%4=~zpj#(pDm!toM3k}@A1!5X;*ynT<(dS_#^%Lv`lc;!I1Zpawe7P^|w7<>*6`* zm9+kji%YKb%YS-RSwCCA{oBWYx_MU4d4=MOe0CiB|9NKIAJql7*NZpIdU|J5sn-4j z8kIluB#PJ_-Wfznh6Go4ZE;%1sS&L>pZCn?w-b(4=ST31)ISk6PTjuM{%L;y^pN_j zAIZ9w;juFuo_0vuHQWk&c2cg3b$j*n&u71F>DHSdDHxjkT&yLPHRf+G`wi9Bx9_v< z_c0$>TWYxVUU6i%ZcVQGs`m%?wD2+CTy=fMv!e~ituFm5@i@TU>$NV@{qN4oU}=T3 zNxswL)q+&Ag=Jnb)zq%|-*LsjB;(3OhYzOjQu(CWEDf40k8_mUD6;Au;tBZ5vh8#_ z!?e5qZ+zI1z;JKPr`poFr7YKHYCUWcy1)0!&%;|MTw2?3aOHibT5Id>8Ru*atqe;l zEWXWU{^YDLa#D|F-PSXlcdmT-*v)=qRrERkBlqTpJ+J?+aH)bZrSG-$-Wn}mW4r3v zA9mSaUY&Ste#64=AA*e-nim)Ex6aV6*vD{nI$OdS^A)*4>c9T+99X!Hn<0Epj({My zz?H(@CSSHi;#-5JwqF0cH*l$T(d;J+o@ncae`V>od-mb3>kgJ@UF^(+9TvUgyn0>S zipik1dm6)Xhhzqe1C5@>tL*dmRtm8>oRT}ZUzBC$(wMY(Nrs0fH#e@o!LZ?v(D&@B z$XlE#HgN(!J}-SID*x{Ns?BvlPvm46C5(IH(@oNUF`Ta9KG5<@wnePC*M~#kTdq5Q z_10&n-F`D1$^W|c(d^i}Mbma~bGdH(^{{-){;4}tdX^~`d%H&D7#w(d!jeJZYs~j6 zk=*MX?+HFE3wgDEn_AbN%{p7zm&LSYT#i)T_`URnJJ%W&!G&*6-e!*RdUNQ|zc~Jw z2CFk~I2pD*zEaMb>^k{YPsbs4&Z}IC_Y01R3(U6nv0DHAZ2A5F9p)2?Jc1S8=grx+ zwTo9s|H^q^-p3WQDza=|tFbmbEB*g-j`o2m&84@#rp;zZ*c`T%eg3>~*}Cstthz_O zo;WoBM0<C<kn$_#o1*jHFJrTeS7C@$aCuu4S1J3Y;r>&eQU;07^UUnG{8Qy|sN{{? zA<9tcde3WOfFxIO$0pVAZi_WrOC|^;9np{SnYv%@SJ>@pedC5CR}P`KGp0IJ%F1+m z@i17fz17syIrW@i@U$n3KHR&ya`x=7<sGrRmq~U1<Bu)7RqeC$xYV(~P6sxv3c6bT zrFXmUgUCBgH70^gN8P<$R;bVU82n<B(E21bjl!FfOFtK8={{Vqu<eISs+L7}kcVxs z<-OZ$8|3%!xMk%=^0OE%5((Np$9>`Fov|H74M$dY$#vTAPvg-_W#@>xbZ4<VLyyZ! zn;@m>mHu3ZBXna<vt0I;KKa|)qxAykyj7bU4yhSmI-@gj<}R+9QVBK5BX>o$?pDg* zVo><Pvr_m#dKO2<#Jys>pEc(15*AwV$basw%$HH!6AgT<TKls9H*9LldnA(H?w(b1 zg?E*|*i^d>&W3Aq7TC^M5r1yi{oYmcex1Ag<#37_!;{R2FWlyhQ{Ee@b(Y*+_Q7SY zD6es7%z?Pjz7$K9C6_ply>v02*~lwAy*KUdO&h_^bma+~zfRtFjl1(#(YdE8I;^D! z<V<84_4-z^b#^Z<saU^ugO=X4ptH>_4NoIK1ittzdRA=emw&U)ORcdxsix=Re{ll$ zj`MnnX|d%j<?~i8pE3J-K=awxlY&zvM1p446qQH)pR$n4CfM^W?^P$u*Z=x&EBeoL zUXro+gSXigzbNPTtM$6K%PFLv((jLqt2%#qje??ZtIwgM*&fdxtv>7^AQm^#Y+8`I ziu3X<0{8yRxxMw|CIicj_A$47Vix>;Ir&igeR*+@xf@F69us0~?6p-Cy8f$M{PPiI z1sfj;m1RBGbtVN(*O>dKLO174Lj<Q<X_mS!+fM!mHO`)AbzT^7G$brBTIAREa>1{S zFV0+>V8VY|X}i_*?CTM8#rY$=!ahV~ta^3RaEtZqKe7$kSKj(vSTg4;Yu$Cj&ucnZ zmhx4cwB8(cV(K^jU8|ebFT8hq`l@uP@>-FFF(2jz9Dnpk^~d%u&iZFe4Rspnte$yC zSIvn1ENiu_H$YEXZJE`J=`YsiT~ydIsdd3;tH}M9VO2RhK2KRYAyDokLqMFE(E7-& zdtdHc)a{uTd-Ryq-3Z^-+?y|_9X;xnmhf`-!-=jD+HR8+Cmy;yfpw0{Bxwy-mGX*T z-8yr2{Wm?f*WPkRGUH6u)l;_4QcLcfJW=Jfl+wlx^Fq#>Xco2}`~P6|;yGoz8$NBl z;Cv#Q!~BnX=`I0=fY@_Y?Hni6t{O)!o_gBsg5RB&_Wy&sjkTEH`pUgF_%FopFm$&H zlT%Mz-i*A+26leu48Av3%o@K%ghIpPFK6e!VgK+d&iyOH|0Al_H+M0J?5oNCvPRAQ zOy2*a#+RG!s7C+b3+GB>yFW4TY45>z&kGoq);Ui6aYdW^!=dSqmO84x3iD$KuzquW zhe5`kn|?o!JiKa}6h7(sO3fuTb#ZfE9cNzbvoq23VEm`U7i~{**Q>A?eAd^otDKve zm17zCsN&|HqdZKZW|oy-9{4fD?C@CIzc(qSsK%l1@UpBXAGOCGMX8Ffe<?}0l=ADX zZfObQ?S1!V>B7M7GTwqBHjCdOod*028iM5u7ja+B);b+I|3^g8_5$0C6<c4QdzK~m z^Fh-A`{|kjpC`}lF5m3TJZ-;~=7Za7UH;qWCPeOuJ<P)Pkm1vU{nITI_I;h)VqtKc zf#FG;GxxT)J1&;!=ADhycqYI3fNA2x&9z%&>VMz<UbXnw$6tb<BjcG`_+L6Vw>1<6 z=!MDJ_}>X%_rXwdo8kf<o7t&-(FzAYx5r*sva{yB(1JG>Qmehr-E*$X$ouZ6oZYa? ze$$f&ZZ;3D%nX~_z^ohjRNS#*^XEHPWLHI(wYjRd^i2IcJFH6LdDKeA^?9t1|NnU3 zSQ35r-pQKug=Gfs_U<})t^N3yifJoC7;fr6I&JrI(F|FOrJ|?*K6w*cp}3)NkMBLz zim2qv#}*skH4+zyTKrd8KKi_C@8psNSFP-tdt5^<t`D5_f1TUZwMtg=S4cPfNLpI- z)-6NoOYc$J8%k%cE>66<<>$*U!Zt6Ce%b$pyUO(a$>QjaNBW&N56GV`Ul?U%D)BjM z+v3yHH#2K~X)Q9_J?DwH=g+iz%YWP1FP|nf-*m#OCf3#J)9b~Jw(uTL-hX&CL(H?V zzOwg?&wKwJ;@90ArnT{I=&=nuQ>7US>Q3$DsJPa4BwdPYTT+wLo@uQIo?6%MJ<UE- zTGC}byN0b_v&+?A&967GGJ37I5L9|ReaX*B{{<gxbqjm&GWSu@>WAG<Zw##XLTz#q zmUh=NY!hvt|9OvFR{zy_K223YCFk=G8Ep3M$xv{$zS;Pl>G8r&-yO%xpS@FJe)gG} zC4J&Y={RPG4}3F^hE<5voSN3Kb#7Ewt<jeMIXyaDx#6#u=p9~Sy2D#uRa#@Z=B8zl z@+JJt3*JXYvP`k(WB%=t&vs2lvn#BAn^bwrffdKEoR;14aKXp5?>y6Z^v=CtUsjWU zMC+2iW&Gy~DY*q}3m<>oaOVKifvOX{PZbguFFxANdYCWM%V*EGol|BrI^?zW_uiZ` zbMyI&v4Y3HeU(gNcl55+joP~F!wPlA=})E4wA^de-fWbd?SH`H)$Z*LFE>9GJIks3 zeV2mFB}u+@Uz!EhKY79Rclx=jCShle7{xOlC_Qz3qJm`I-@aKsI&q8jt3rS5+4KF{ z#Z_#VCgrj)uRMBh;slix_U&d#Ki++-wP0i4#%OTge3J^#Uf}~8&o=}KTrX|6D-^gG zSZxxnuwHNF^F#dNJJ!!TmgwBS@7%HEeJiKlFE(58hxLJMX%p{9skQYDN7z5U|7Uqg z`qhfr)swd_o@ZkGtK3q)ZQg?aUR|p~H6H%jX=8Uoc!BYpmD=}Rwtvhoo#|h+%dGmE z_QypBto0TtRJ-lDQ_{HOLH)Ln9TOjOpR=paUn%oAzW3xCo!8#ot*68veX9Pp^&az* z`yu!49on<LOM9lKiOs!B7qup}MDOwQ$TB^YeM_xUWK#MZP0<zh6Yi~FsPjQOBsal! zbC1w-O>T>2xtjZA9`4N3y{+zgeXG{~U8|+6`B&-{n$CU{c$PIUE_7X#e8Z(USFtZG zD}@Y|t-5zzcwoXQD713Z|5*h=KJgzH%vvX1l^wkIiEO=G`al2WmNE+LI*T1w`OI?V z<MnZK4L+-{ewJmC)8b|8)q^iaYkzl^+s9kh_WQNH>h8Brt_5d*^G|m^a^`XO0XOlF zn(E=DMziPgPIkM)5USi$U)IIsAu1#DJ=o7|%Ih;Hm3-L3X8OGS5wCy8d_n5;t3n5s z&v~;r>UxXrVgEE{&cu(Ed)!@XjP`n;Hsv%lIjy0qwuEQekF;=uYnOsj#mqjQW%bz6 zUG~57|Iah^^M9WIeLnr)XUJey`m<FWeN08JB~MrL?AY!4&+4+CQHa>?qtO~G!W!B& z&a73f+2#3nd&2rxAyM!D`LJgFv^&1)@7IFwPd+i(+^@Ou$Nl5ltQGo&mrdS;Z;N4Q zkY&@U+ka)RV(z^?1+4wk1ny6in*M%a;XR4f^{2}ji>jin7pLzwwMt0tv`)Rao7182 zY4dBbccmV!Hy5Xgf6V>BB-s}&7_}?Pr*7@DSF=0T6c{_q6noBJw&u>JaMnJqIiL0} zYFb<~->zHlE5n4}to6pG@1HEWv{L9y-G|!KQvW|hwD#Tfswr1rH`(IwoaHwAwn!bE zcBZT_zBeyq?WgrkX<dunXSaVe-R%FoaSeO*=Ss6Fdx}#7vs_R6R8)V>PoMbxfn2BY z(x|81i$txW0&3jN>yGM2e)T+f@@u?!!^8Gp^}pll)-yg#JeqG^byG~#>Xv_vyxD>0 zv8TSiHEF)L+Ei!#&$VGHmqK&fTaTUp95nIJ^j=fhCF*gWhJUUqy<BeIKlMiRN7jaH z-|kM)9abkiyaFbyytZY|4>o!6{WouIy|;7q`3s?Wm#Re*q#o|uefYGK=B8D8|4z@a z-^cddG<$Jumf$nl2=gfUkoDgtGdze3{nFmS$sjOARV|@FveEk5+P@uBo^Ab{<$JpG zz0$@e>7A!9tgp*m^xbF?AJbyyR->{hRi1oPs@@(tnD$X>fthrhHpAtod5ivQ?mj%T z@I{iW@zpCIzdeoiy5o8_Yj0yqz=B<`FYteFo+f<%n*YpOQVZ0#UvXXY>IiFxC&Pmu zj2xlgSf&^(`2O(p%Jr81`VVej_pz^8l4#OBZ-b7&vn%TY*3Wk9yt9Ev;M=xd>&aPK z@_jGu_if!8w2%Fn(&q(JV{KDvBOL0CfAcWJ=kjd0I5$Zxk->;FeB&Jch96U=8L_@; zbUyS{UFz1aHNp#D)MvQ}mjo&`ypTPAIx*y>iRj8p>x!ZUw#R&YIP=}(XgBSr*_%%u z<x-K}6|Nuo-}L|FI}4uaKH0oMWZwa+#XL-9CR6wI-`wxXyk+l)Z+68ej;=S2e`Q$P zFI+Eb@wIY?s!C`3W7QvLm=`K+&VS1x)3r@=)shRZ|FV9#yS%C3Q)@$aUX5U@>ZiyT zd*yh2>+Po8Gfwzk^E%?e-{Qis759=Au7Az^YQeF;fA53i*A^$bl{~+i!BQ1u6lufL zz!Vzs_F(*$gNxl+MJA@l|M`5?^g`I9YMl?2%r_>l-}ic1_2aKQzWsK7c=AI%v-p3u zCsyU})<3?_$WX$|@Zn|mhvvBgcPj;1cw)R}mcEza`u6SU$Bb{yY*Ah{{fu&48Z&CX z-u*W5_QSvD4^FRJ#K`bvw)kRQyU(4HKW^Om?a16<xkKG9@37(uriRA`KVDvC*zk?< zK;w_3E!*$hn11?V*!<lBd%I#SYj1G1x2RND#mDzYhXwq1x9)tOHs>$*2KD&8*Tw&R zu|8YD(RS|t=FQA24z}n0)ZG(*y1mHl59d2BdAW}DyuOZRcHhJ9-0IN2exIA+-0nop zca8mf`FH%Bv;Faw*~Nl)B^_7=o`@DG-S~Fnz!!6dH#|p|CCA2bu>LqzntJ7W*rRIi z?UPQ1zt4^Sb|m2b=R)xX0(=#W3jFo5|2Ok;-ec51booM$JeR=6k5UJk`v0*oeE6Gw zfOX2_^Uogc-SsX1W1&mwtP4yne}1PwSH8h-cJh+=LykY*F@4n!4+gyH>D^I~d{+KW z(4*?Vdl?wgS8BxD?kJV%zJK`rqwWlrEnDx(|GJsVu_$xaBo_I`=8x|`2;E?`H(`F) z{577}^Xc6m)fPOZ3<hHN|MD%ezQ66kA?;?-#UczFSQwh_a!WH-6lykn=gsQ6D|xN2 zlebvs)#97|VxsYTcZ5C&t5tlqh;9CzU!FTd(i{?-qW{n5Ha3*km1rzXDDnDV>Avvu z>~zUSjeawk;tzWh>=_tlJYe6<zsZoRp7*@#h3V76nDZReG-X#a#+3bC=B9A|+s}1U zHH%u0mH#^ZGmj&@DQrzo)O6|F!s>})b!&7M*0)b(FpK;5_}m1WFvkDhbw+Wl3@*I8 zKka)oA!obUtGZ27kA%PN_qS!Nko%`N<)&;oQ}sr}I~tGO9F`TDN!CVQ{qrYRLDX|= zyTa9m{MtXliJlvTr0;c#C-NOrcye3)eiQ2_eum6>D>JrvYfno$?B1qV$?)w+8At4~ z^}hVgb!PL}%=i5%dcwr8;aS3iH6jeQ;p>+&e5ktcCrxWw*30FOzkmE1`#~mWCWo=! zoc8|zFP=uU+Gu<av0<oAw!c&G@$JX6R$u;EzhS;3Kbs-p^GQzsyE~-Hrl%}lcX;{w zZMv-?JT7qyx*g(F!Vdjb**;}YM#lc#_YWVf=kNU?#>RDVA@h$v_Qzl5dVKh4Q7eDu z$jXRX#fJ5DWu^>wq~d0txVCb4)u+FQGrzQ(AF57P4f^j;|GL1pfK9LC^!mKe6Umd# zC3c_c4mzPbRVub=>$4m77A2<&bT8ZASkL<{`)~7KN#89CuAJ1IroV4b(S}o(G{u80 z_ep3yp0?(}zFcvBURLvi%rotLr8!Qfc}TzD-l?|Kd9z?_uEOHAm$yuKICDWt`>!Z( z5B8~olO{zty}IygOXJz7`C_&5b`=(8bH85>HD{iB<5$9*nXFqJv-E3{FSG6txG=wI zf44RxgX)j#;^DUGJaYT9jRp5Mo}Z-@;JGG*H%@Wpl5+>+IK!4poi$U5mOb+((fGvl zfHfNyt((Ae<Vv-mvNFT}S9>0usbHLHlPB_dW55O7<rnY&-}oWv;;${Gw|{MEv^#i_ zCuU)A#q|qjYyG3I%UiXw*D}04w6JH}yG6OPu5Dkp-*jrvHFE<MoqvW;FI!#vBA{|{ zp-xrBm$F-jc~5TJqIK)in!e|0U-zF|%f)YQGROYU88xp=+ZD^1wm4qD{%Y;v$&T^~ zp<dUSXD-=S7U0jiR5_*jQk1nu>X)suB1iu(Ue0jPFlDRV#hc64Ufyz+xptOW!ilYs z(ieVNndWLNNj%4L-;SMEynET#lXqBH;-z`7&3g0fL7BD2(zCZ-MiqE5*G8$CJieS7 z^*iH%@*lQ6Kc2?iv5|@{R-Alt@`4YCGtVDc_~U6McVI{0kBxtVl9tZXNwK`>x_$?T z{(=iUEfdZz3u7=^U;XpplV9h*onf_^d27w`DD@BfV`lTrni8JpvG&e_<&##I{M9#S z_y5hWd*jH_X<MJPpDTO6`GLu&%BeXoO=~Z&nist3)!UmJj8;ropjJD1o>a{2OU|$S zoC6Q*u_-IRO!*|C?tWi$lg{p`>pvWOQxa3rU-d`%=k<Q0_1`Pc{9g5yKeKk0B5z{s z{$;hPvjZ|~nTs}uzTUD={=NLl;7k8!ce8)`G2>1ZTU=2dV~-)9Hs`KgOPt!&uW#FS za(2_Lr@V^SJFiVKdokN-_G{ji!Ry)>)xU=RtzF3*pL<qsi|h5>;Y+_bWaXY@|2pql z%5^@r?a!R1OI^AC>R@lp_IX~dyHo!^_qS(da5#1#ZcQ%tJZZaoi|+m2Z^?UF@uzj} zwW@~=W|EJKb>~<4T<^(m%ilV!njz5ti?rsHi?^o59ca+@_w>&=-J>1I&7imR=&7~s zS2w7KFJm)jHGls8_JVw`t!C#|TbZxD^3_*+^2&o-tFoHAxAtf1X9p*?hJQ8+U9&f4 z$|vCi7W%FmMSQ<}E66?f_RbsOh$w;0pVoi-U|hU*V$4p@>tD~Vye8EA%J2J$a~AQ3 z5@e2fi~oLo&i(VT+|29dB89En>YgzR+7$2BTH0>%)U)<#+m%%hzFBErUa~(w`1RGi z!>6u2JoqvvYNhww)ZbqNC!KC+dvUAN?D&g&ehcHJLN?rBV_+8fDRtEAunI$1__~jI z!H4rWZ!Fr|X&d+R!5!lrW-0r$GM<@bG?i}MS3B=%L`vH2wE0)}mwli6E79u?FGIAz z`VNy{9iRTLJ7`?OTP3SD-Lm}7?Ka8hO<~)+kDI(X{=?+{JC!S8;$O38n*RO!@}JNC zNehZXC3o&$G;QLQdM=MXSBs4k7FWoKx*vMzv2w4mU{Z0w9#M5~Ezbqfs~Y_7v|L#D zi*?rp#l(7@$&YK9ST^pz74P`lNUk?Ew2Cz_>`)?$p`eA-T%LukGTc)aE$<fVTe4~T z*16Z3+PZK0%%8T?;qtFtTlV=BwAIdBpAvQXqQI1M`ddt2KDc6{yVvdX7f0z!A9#yP zCj3pUzj@Hmr>tbc@sO58#aRWx-+f=avpss%Q=-Ucvh$0eGik9KWIiqCF@Al`ko|P5 z(d$cA)=Pgxp18?#FvmbWm2m^#Lg!VwjI%l0dS(a)J8N`qndefz{@&GzuU@?JDO0%F zDPlGGWZxOqncNdzzIM7l%Vf(J*4US(nHl0suBQ|@T4_u*ZR)&t-<0S0tiCDrQWHK- zPYpkKZf#G(FV*fBnbYk1-B&JlR}Ot;vL-~2YfhMd?iI8DC4R2wF8KLsiizl4SwCO# z%z^SYnM4oEU61uTubCXUB+&LGB|$)IWwBP`ge>00JsW1GB%0Se{4;s)-MuF#T&ddK zJjt_cS%H^PReI3%$#bh#?GC^G^_omo>E3An(q+4%FJBDyjQzM#NM+O3uo{u*qqmNq zIxQxmvpO>B>XvO=SH%ho^Dr9n80t41Y!GPgbUh(xaA2>y4x5Bn?cxnbd)Dlgm?D}q zZQcn7PNrM$KR>ROzMpx%y|#XLO|jPO6$_Ma-oATFpj>U?;;+mnww-&ymwQWhwW4KW z_o9c%OSQHb$ZU9VNHt}Nm$R9UT{O=$-L#8$1$6hFn_IGBin%VwYOCzetm)jvni&!Y zUf#Fkp5K16^=NO0)!kQ3-dl@h#3IGEsg^9<X~byw{D;imkZ04H;(sri-0nKNTrPA= zgkSAxJ-um7veq`o`1zmlK7V+*_-@gMg4CM*f91D)-y~yhs~?ePBT*cGbmpF3j~|sU zWrHdL9$8j?HQF^-NBxX{`<wX{0au=VdmMT#DRRS^f4iSL#+A;#c!SY9cE9YN`c<#l z*^B0!E`Qj>CBQd3u5In31ireD>vpf_KH$Lf?Oycvn||$a{hy1LuZcVG=#0#U>e$`; zI;FpCZ@p^x{*Juf>3_Sg8|U4vald$am*Lla)%)0$9FFH`Wt&&6n|H(C-TubPGqLX$ zx3TYC?KkJjH^y$;v$1Jc8k&>*=9!eeIi2&a==0J)+n(5j=vpsei;z+}b<H@ZH>Tm< zr!_}U|1eH7++h^;?&XbhZF8=i{pEf3Z$i=2jI<-ZZQEVfN4?(qcCQVu<(=;)dy1Kr zvyNrj9QRH6)55_qBdd+K{MX?{C+EBt&u@D>JGpK0KZEjj4{G-%EKk~I==`PKoBtkT z@bjahhfQ<;&Wq8NWn1qk%i*~6wW7EOmk}p}Qc=FE-UaX9!jnaUyt>O5m%Hly3w^h{ z#(hO(p4x>U)zSijiJSgN6<N9l>WQtJWOefFjG!<dPu*I>nmDJc;I%0Ffd>@-uC)Ak zpljtcUa{SqC2V$Va@eM<)3?{v|3gAI@0r|~!o_j7EfN;K$<chYvhSUL@$|!4U!oqY zsx>=cblEQJ<b}_>pPsE{op$s5`|kRJ84*>DL3h5%F`TZk7Ac*3VS1hAluJd|_4ZW- zIS4DOd*{8gQ0IGXRHk(;)h%zay-sXlz90LIl@T`<?dX|PJo)1rmdWbVuWZhBw~=|W z<ZG(6Wo*}GKCJ^96RfM2XozRqx4oaR`d+}4?wx)76SA##iab^FOTMG@+<xzcxR52R z!H+pxT6Slg?{_L%V>hwi|JJlEzFBLXo#LdouRM3myEsdbNmYAm|LZrMu2G2xRkBxg zN2bPq&+uP0c}Yv|>U<0P9fyyLbR06<C;OGPwLX_M<kJ%EbD#c&ZH&MD+Iwl8_VM-Q z->SVAm_1%~(fXt<qps+EE?2gbK1waW)+*aue{ff~wfwfZwyxyfEXJ*~{NKLVb1!vo z+TPW-D(|>w7`b}?xZ05AFnwFv-qS1XzGlcN7)KT_b#Zqy5sK$)(`uYCXV>E8Y^%(7 z-LUxFdTh}G<@5V}Z={5%_Q?fWM$NAju+QEfvTk`-)c$K<p2S*th*bS@IUf4?`s}b* zpU!=sz}z6Y?cbc>G}-UsFC9<Lp8jT?ZEei&<u{U&=6>ALxb&Feo9b<^Z<la!#&%`@ zN>IG(u~&*=jZ<*GhPXqK@%7h=QrXwH%u=|0?S#H|{U0x#ZG{Cr(F#vjH_mEQIGNg1 zI{Vq8{gqRe8SUo1wczi!OyRCw8@GIAf68~~`-Tt>*-z1*7cMt`XZGf{WnK1>?Yke% zo;ge1?#u0!8y8zX|NV&L!{Vn`%Pp_B?0UH6d%&lOXEOt<OscMYXt(=R`*pv*XVuSF zmzM<1?vqGXxm@>V%9?f7malfyC-Zz&Z}44f@%>v><=g{(9m1dA<+XiU{JikuS>|JI zdW^IGOb}xGvaGnrtaVDutq-5B?OLPduNt`U>9l>USs7d$yrrw%U-$0G^!l6=d;WH| z%iWCK@3!^}^KIP1wAXB9U$$A{NAp#DlNF|kcBS1vcfsc36Q9~Ohk6(+UatFm&-c&< z)&osu3l_iG@;+tWjg7PY_9riYG0mINR5Jgvl;@W4X*bFmmukH_&9itT!?8<6i+7!t zlD@e4$_m}u)Nko0*L1Tp7%dE$+1NVE(d*y;(9CE*m1esOQ+2tftYgjkwQOd^w_Vd^ zs+R}8-Ss(hv(w9$E2RGIDhzxq5WckOT6)mha~t{(F*?lBu>7&?mixU+&t!c4<vvW~ zY`AC5`uAx!!=8YL2mZ`*%KG)_&oU*ss~)>p7*uCAi*}!3=`j%s%wnA2@RGNEM_i*t z+}YLQGmh<HIB`q&z@nQ>48}JacXBnl6+ITa;O$en$JJ-IfOGi4m=NCMm#^&zO!|<# z?5c%E^qptT`d&t>tds+iXW#0snpN?IsiAnHb`K-N&d1ldR~*;*DXgk&7NEAd=-uM} z1717LH?^ru^nZNCQfI~C4R)tuKePNe5v|q7@^XF43Eo*J?&hAq9OfTot>-VbZ|kjf zwstO8f2fJN=}a&TVwW`+?e5lkJmEw}kwM=T-)nQEX0jdN+R-?LjUmTVX_>R_GC`Fq zuZ$u+CK#v)&1&1pR5`;WdE<o!(WK}-o=R~!$8|H64&MrTu{g--H-G8<|7N>%b2@dh zj;)z>X+;5p7SFHTdrO{JZYUD!pV2vgWpDmxMFj`>_m_`Ntz0#U!G`;c)2yI7o$@Q% ztxqO+sco^k$CB@v|Mzu^@{3$!_Bt-J59$W5R7$kM1Q~q4%-lW4o$<ZikI%7kYhRcB z=$Lge^>Oq{)+w@8AKd5rcBUsbSg4&n>DBVIiAh?`y`GKX&$@SkGK>|RXFRmzD%@@5 z)Etva{~U;JoAhi#b^+IyM86HPOs#pB%`?wub1+R}`=sAIYuh1)FOibjn@gj&e{Qzk zaYb<=myU$3**=DZb$goi)KwQcbx+xILvq^NSq2wdm$YfF`29HRzUB-DR)^(Fw!8`H ze{iUwbs=j=ui2EgbBvV@YaA9{<$1d)j`?L^{;^<2X0xyp8%30(<#xx;p0BB=Y8{f$ zeA{b+lQBo#hi0F~;<M2V{6Y)Lm)!B`T^+vWBL6<d2khamHcJQe-n(jhN;V;D!=)wr zj(op*_(;LVt6jM)lkGig<;@EXlArRWq^SJhQxtT$6m9$WXuQdV+wq4FKKsJ(<wVrF zy?U<?{d8zio#gq|={YaoKcRrX*X4G7Vu@$2V7ud?B%*!LI7{!<(Ir+tUNl|)@v30g zliv@%KVV#WcF(G1Q>}We_inX1)?}_Suas#&L#53I#=}e1J6J!IU&><Yes0pgGB<7U z{jjfp^C!u$ndr|5I+8l);+Cv~o97+k`Ngp2!_@VAdM~XzH&fO}xAUclmQnjJ?$bKc zLK<w_Q@hlkP58q7{r;q=R}*8_#Cxrt+;L#3=bm{^{I>R$tYu6(4Qt*`_+ZewVZt%R zWLxtuntBV*@HXzPtDdU->S<0w>jb@BfA39p_`m<tkH=sC7wt$WV(bidDtxSVG4o^1 zH<bf#Ckb#Ju#+hK)V}HBS?`otS00xaUA(_LJWFe*V1iuQ5sOJb)N^EBPvAaOQ0*}L z2!rr1o6lZJa?bAY7cE3$_V?bs{E?X<Zr!(k+h@MDT@-ij-eJXgQ<h9fPh+{qyrS~J z%41U|u|C}qs93kQY_^-|wJJf4x(SbG%5gK)m)=j5mUOc9nbI5)5$h3l>R9mcYdg#Z z9m)*(-)k1;PnIfMwJl)1`@eg$pK1n8jAXoBCVcv<xN6)+g^5ePcs!nQX_`adB1VRc z?x@G6oA%7^blqB$mM?WtL&!rS>fOSe^N0Vt&(*(P&#k!Vc=G-G=i2LHpZ7_nUp?(^ z#9$ZU(|6Y=Acaq%^{H=3gslJV#fzs0{{8>{`0Xs!(zCg)8_xv!EIT)+y1Dv!@cwIa z7u8Qc*D%Mx_|}(Y!5WII=f@mpRq1|ru0hM`?D2+xZM9Z;r|$SHWAPAYP%%$Vs?a$Y z>yj_klwdQTZ`Sj-`=rxOC0$bKI>WK(;M$z7EW--c&Kh=6&nNOa2hK3@TzGQ3Hu?I+ z_*0)}@7*`$|Mk^>qw_k}w%z}+<d@7}<xHlcC*EGWZ+=)f(b1?h;`jd-N6z#8f75Y( zHsj2<bBiTbbk2J#?%C5>rW)(wyMi(He%s~KE0fA?`Cnw^r)4=_>yz5D?8<@X%5%2= z`()8?)0kxv|Ambq_{{W@Dce5H;G2?j_IMo6O2KP$d6&qUM*Lf{e2>8twJPiNwz^Yi z+3no(J#NbB-M^=q1$ya-emb}1Rvqty`%$&KUp-#<;^b|ujPBI6`#zdqaph*%^TGMH zhHVg=SJKOt-QQ;HTYtf3jYjS#i^3_=EAmgQsEuH~>A^PtnU`Z*t5=HYYe9xHj}M$V zSfY7B%)CD1@+$^u<yApXRD~OQ=GA@FmR#+#)Oc-4|Lj9Ic&)hj%31kxoka7dwHz~K z_RsuW>2Wfq?)4V)H9rq_EQ+}IcmDp}U7ri@&iFn*_RAfy`}tpHKb?CtvQw<;#3cEx z+g7A3R1$5ns*eBMvVE___K^2~1zEmt@j8~WPm+njq<Q(i=g&o-Kc37yQ|D>g8K*_= z5^I?<?ps<VRXM2$zuR_MeeJ3I<^H?>H>d9pUwrrf#k2$b+5Gt%rilIZe)(ES-I23% zmj3awu78gLTy`niR(Sh)T<R0L*537B#b8mI&4!q6fpszJU%s<H)3q$G*GSy|Vcq<5 z+WXt*G*8*^IQE>j<2xDEs5dOnHb03eH7Q=f@?Foz_q1>6d9Q93*}uE)R5*O7kSg)L ze(T)qo>Qw+*LT@==iV%w!`x63^syrGWewZ=htrb8bPUzb9f)}#W4Ta0CS7dy#Emf@ zay>*VO_$AG*r9M^!#;s2XG&BgA2S*~UOIW^w$tzQf1XfOyT0|$?aFUg_l9^mbIp2F z(a;tmvA$%3RbF!W=M>eSXC87yrtC8IP?~&3fwRFd&VoaZHKS<8pR#4A!&<LRaPjyy z?T5FmpLFuh4fZ_&tR2tho7x^Zns)wY=h9Zr6ZH@F%;YO6Em177X)uhdc*c0w^k$6C zJpswbdk(oiS>kQWm{h*)D4WXUCob2Hiwf4<R1H;p5uATe=x4;TS?Sv!3O;_7Cd2<J ziD~DbzjJ1%-Y?28ZCNUM=hau1e)c7jk6WD;o*$6pnz!nlp0{rXuPsB9wv@_OiwiLd zY$_|6FHN?an(6X>$7gkJZn3iwMe|RVwf*z?d^LEI?cc0JcaQA8DDTO?{ejG67XIn= zv6p9??ibv;q}+JjoNXWF7!!=7^NjNqC$7HM`9W&(##BoyuDGuo|Ag1}%=!FbTi*ZR zX2Y3>Zk5|?TYaKC^TNqB6S_}M*_1OU_xuF$%_hZ@*0<_hY1F9QduqF&c9B}Rr&gQe z&((TG`%*=oDsAD(@0nxp@qg0PCy%V}?VQhj<yY<Twz>BOB@-8SI{xqOU#cPg_|=Jh zrRwQf+g;7=gNoD-F6&g<-Vj>0@%x161Hq5(ZkocWY!q=ZR>xUhZrh<{2V=GQY_qNx z@7%x6W%tkf>%MRu-M4VE&yL@1e(o{vG+gGL?f2Q58qP9#!V;z0fQGjZkBc@*UHYo| z|JK83v1O-jlsyt>yb<?)#i4-Z=S}M78#Qm(@<VHikw=!Qo{jGMT+2)CZL?Z0h4d^@ zU8ZosRqE-axhi50+_=1^q<nLGIWN?+Q!Z)y4dshzxkW1rx|d0cv~eEt|G#6O?fl?Q zzV6qN--0SsQ=KM0e&3f@`$-{Vzid@N;t#7|-v1n=BVO6Y80&iq%?O<HdEc3rKNe<t zO?!E#d>upmvUi6SGQ7FDc@i}8xi@Nl5nR>vh4Dbnmc<Iq2~9x)tWH-OQ&T33sw}&? zpP5VP&l4VN@u&vZB_C4Gbo71M6tLvS&7d#rsr@qkvSAaxC|=CBe%Rga?e}+AKv216 z)YFyzk!}03lYAr0=VZw;>Kxm7dasb@^=G25wyusWR+p5~DNl2>vF>Nv%6e^P){+pW zWfyz*&bPN(+sb6xzV?#9hh^(yHr|kv(fU0t#!D@8*~A@UDu=G0@HXYyahmz^$-sLh zqI!SsP8W+&`Eir^?K!6tc5@3t{_Kxvychj*;hNiJzv^=@+ou0dwX9Rsb$c5;zvxr! z^Lc95H!%IUQMo*HO2~4V*h;6fRg<kxPB8D{oDgmFcJ9^(VnOUy0oM-A+_g0zb(7bd zJ#w$aRv%?%sJQjujcK}Q!%~NZoTkT9rm+?pay-;gK0k|jfsya^nIATO4C~<*-?g6a z>f+bITTJ^Nt$Ole+g7`+f2U2dEcqpFy}Ix6yGvcclg+|SY%3>h_c>rKZ&$5dS(6a7 z;^w1gK1;#^85`!k6`Z?M=Umi|!0<O`Ruw4*aNnJMyiKv?n9IsrM~|CjZ!Y!BXysV0 z%qxEV^O66(Jo_X1&rUuQkd#p${M!6-R?TT4hTSih?0)v(i1J#Ge(6=rXHu9d{=K-E zC|la08@clKkt2Ox6TYo-yLFjynpX4Euv?je8ak)v9XmKZMzhhw%kz}fex*Ns%RN(E z>gK!N-?8|R2zQE4{TxTx>y`Ie9L_4<Shvxy*N0QVbxsMxmE5SqcfzU{^xR}RsN{Ii zDb@VRFTR%hX}7(UCyR5|nRPESu{?F3^;UlTm$?0(G#|T2IGt^e`<)v8CG+vAm{6xF zPWL`CnK^whn56jgur|kX<ry^`0W;du7A#H)Yux-uY5)0@wXZuvCPq2jT%uk7DmYYa zqFLC|_PE)OrTsp>BKKN;7?gXT;D31h{{560yhZGLYMB}MufBY$uC)Jr)1u?cOo|O= zMBg(>DYX<{B_qpdBcP>rIdJ}4Yf*_sTlj5M{&DL{^}TsBUF3$r<j0u}0r}1e>lPZ_ zd>ALw^~FxQXq(V25yQz1U%zoapLKnb*Mj%#=Kt)TuJkW-eQ#D^x+Zt06VEaRap8Hp z6IBkq)Ho%3g0W?W`m$YRCKJ!)ivM}XEz8BeYrS6RV~t(K%D*1mpY-fP>T2sFyEXMz z$_k0Ed0%c3`=>U^z@#>(Q1Rl=$?=IyhrV8DwS4;cRnhW2wR;^F>zHqE%Vk`ZzkHs_ zo{sEaObyfPu4M}sy(#>CB#Cu~!e`aVG4WB?oR)YeMe}XgT=4(fiYF;a{O6aN=H+N# zeQWSS#A(;7f4^;4uK8c~Mch04)U-N|h=>geA{~m&R@>(DXB<_%%OvM5d1LdVk4Gv5 zPv<yP$QynanslhOaB67p=f7q$UsO(g@;U!&v3_l=%|eO2KMr>{d1y=5{!WwPW)Hq6 z@$!`Kf$ray+QPm3ZGMhQ(aRSX+~@z}vZ-wMyKSr4`0J8fE{k!h@Jv<z{i3?#@cN%j z2WE?%E<D@f<NB=Sr(bbux$gF*>ft9+H;aE<{<C0Nrc0l|bCD@=Om@$<Ps?g-a<TGu zc=+vl`oS+k2h8uhWxv~KIeliwoxX$V{Mn&CwOwZSW$b5qu2ebmE$i<2kR=oDYw@^n zYTwqsbxDgS!^*&y?OEIOhtq$y7>F&L?kQxjVvVMv!k)VC3fuqRHow$n`mt}>dbc9~ zmu2^zo?co0MAl`0`3=VnyL?hqZ--PZ;b~lTqmn~9S$@qX@rET+E-w{qYL%00HN1I} z@8S2!tHqWu9(esM?dqGoLTMfXD{Bqkrru`=*|4#5zrU+p@_#MU(~@uNG<xnU**)dh z+8(I2AS1tG!hRpkb&{MR7N)_Qlen_2#8z|_T;0F-?^2F>2Cnt&UoEyQo93}5)@}NN zBNuX2Uv$aa3MQ@jGV@J`^4SdvT)ioCJ`40dDk%v6lW}|Z{ot1?v_HP%=qz)WjcB~_ zKrfDcy~mo}Zja_Zzin6<bG+@t&t2*_Pp0Yy{pgufKQqqtDo5~>C6<bsNx#4AXiq<x zd$7HaVdv3+L;mj~FEd&`|73Syljo<X(z6E@wwuHR80h}kIHS&K-N8E|igpn%oiFLN zx@<agmMgVL?EL1oCeH60G=$H(p5BuXQ4$s>He*BYq8V>(c^de9bo3;hH-EkNvN<Y4 zcx97><Ksl%iq1$*-$=nzKX(Va&eUdj!7(BJ*8%-Yr#MgU-JR*9^wmSZKVZsdE@rpZ zmB~6L+v+Y?{uHiyCatD!WN~AC!GtQ!#Sfm}dD{DHucf#+`)}@!qcdbod;N;{7+$>Z zZFYJ2joxzZvj^-RB<xmX78A6|IM4sb_EOaQ^)5zc=WLfLwSKC<lJtyuV#|!=b^UjE z8zOY<zrA}WcDU_a@>0*>3hnIEVb7NCWJyq1T^kV~eP**US0LA##=BXkW?f86ynP_v z(%nhVIbQ6$*2ddEp7-3FeDMM|uY>-UU7nXG`I!CO6_|bcSpM(j6K`$$K3mvX(CtuL zQr#7%%A;uyD}}fJNy?wnRp2;7QZ2}PV_IzLLYWf<FBY?D+%FS;Ja6j90=E_&?NGB9 z<r_s=t9d*P=jLmRO(>35@Dd8n-Qgke&Pn#kQI5YRUpB|RS$QKtRm0?$WHGynYm3>L z`<DYXmMy#+y;C7fQ|*GW!j#I*Gp63V>dyY(Fy3G0e4Lzc@7b~`4cqL@;~C|?t=L{2 zzd&7sgUdgxzgluv+|8+*GuOq>*Hip;ruEGq>&JIwvLpUDJ4ODD{FJn0Uiz-oMo(j& z7UeI$XL7f=p1eG{_LZ#O|G$s3A8CF{GOPKssw3gDpOk7*@go8KgEM?it-X6Tdy03S zpVg5f?QdTXU&uRlS-)%hJ_o%G|2rSP{4XW+`&VJ=%4MDZPII&$JmJRBbW!Q}y({wF zZ<KdD(_VPu>qGnLD;Zg$CjXDvb}VLhQCwonChj{r{a<dZo@97{xz+H(99?$Vt?M=H z6*irGalrV&ocgcn`7%3ZD?ArTc@p*1yw_E`XQGZJ=kLAG-^nI#-!p5f*D=NLn(w)9 z5BF=`P<!7~aqL5%s=AN1t-Gh*J?l65=l6Hcd2g}5#Kk4zM$!c9lird3AM>9rFb-8x zJ9BD6G=l=uh4!5dwFSa2x)t+Pn>y;>7zH%jpPwc%vE}07dkW@PUv6WXanbQa|3azU ztG~k(S-31`25kzf%=dc{xWR3i)a=^JG5;4cToL)lvE6Tb)121@;ZwRVbfkOx-CC|A zdEPe2x!&Z}L*bB?A06t>c}q6TN;|-`_jRFE%bJq{e66!9tD8Oq9=9=yxX`|9ErUWj zd-y)Rso_h6*R_^qn@+nU^1@2C{@jE`hmQBmIx@#Wm!Dhv=|w)fG#<s(QSGHO4IFE< zI6~gmsrf$IYSr2>ah`VFu1v0gr@GPIYwS34LKgNWt_<S&#uQifFxpgck-~e$O~o8Z zOWONVwORUemNW;<PMCPD{GfowtOv(;Jze2Z#b&81C>B+%AjE3B`iN_~oVoqcg;~#C zHnvP}srB_OIhJxeVpa!}{p-|wJy{G-R%y*K_>jH(Wf|vZ-^-hy%jD}YiJXazlX~Kn zcl}Q!m(Y?K>9#g!8a@af|8RKb|4-+CiG1B_qi{?5<%Dw#t12!W^h?;@E%q!cMkSqr zD__}sx!J}`dHg${=*`jpt39LRZRhz73DY$NugY@Y^a!{*kJY2+jTzhAU-#B(7oJ+V zclr)yi<fhv*A;vY-ClUXUj4-6C1zhr1e5N~{jo>bU%J|*^7R8-Z}Y3a7#PGiT-p6E zyH&MEc4yg4DTX<}(|i91SC!RI-jj4A$8C+t$F&a(9+n6^eS5Qy?c6e@Zt0t$`J53E zR$3b*Ec_>^yD^s479Qk^obVv#tAuB_#{0kj)GplD=zgMh@p#$-`#&=mcBXHRb=N2^ zO*-LgvyVOWMaW(Cs>L1QmVbp))@tnUF8#26`h?eO%)`_!&U*Md_H&pg$BpWpPj2Mo zC7sA?`><TE?Be}1GD3Ablu}(dFEtm~nX67*p!$4K$hY6#`m_1>HZbqz?|iiF@lAF8 z-(Gtz%kc8P(J(tAuvh)~w<Q+)9yxZ}o6eY>7~<9|<iqi`{~~AYs+}(tUghuKuXoRP z8>`z#8;_&gb)?+?3cQds2rMg}xA-KZz@a-OPv1PSkJ}Q%p2s0{^mp3pIeRJ%oHI{d z{_eW7HZf`4?z7@2*A%rY{4of2=y;ym?|Vf{SuFH+w|`(`|F&bh=drbVgo@pN7MiHH z=i%YwDx6!aZ{;;Gf9o=H>D;w9=&HLMOa4oR3l45K3s3C(rPj4{*(0g5Vy1p!BC0=L zJlylTSC&(UH#n1hZ)Ed!mY*>TQdWy@3OT!X+y9Go+=(wX-MU-yWR>B!41?ooGySVX z-p_7sk!*Ms$WS&@iSO@TX4Nc)K#uo(E$rMIEz)`lUgR7I|GbZF)s4r24jfBwZ}?xK z6}02kdD+Tyvjj9RT?iC?u=C-Px~k)I*8QCwKF6Lxy8rHlFN&RCE2I@!@3dZ9P`JbO zvH#+$3y*LeaMV9<;?{QYwDDZuf)zUJo+h5;b3C*D{*D`BbMqHv6l}0R=I8g2@xTP5 za?8~d`rRG`ZV}uV;UuuI!@lA)d;OPX<`UiZmAaOuPx+(P=WS(>RzLE;vMiqY#GVhV z`E?pIa#xh(KAHIYZvKyn7t~`b_I}H|9l)4sqB?I&ittO}dYQ%L&sMdmBs^A0FPF|d zDD`#QzV?&HlNPM8`mU$ebmrf`yx`xF0>azpOu2j~YNDv_lwkD?zIBJT)x^|oT#@nq zgz8qyPiYA*(X~qqB$FPmd~5FYH|5D*?NH^Wi@%;Y+L)@P>aWx+d!cWm(B7xIPXD}D zFTd-nKmC6rbNMenQcd+{v<fQ?k@gC^`1AQQkt5Ulr(IuAdh4>E&96DXek{_}RjD`; zaF0v1EHw2ca{_17_nKbWXLpqICxtmKI~O_6lUYDWAo`})ru4&JJl^qX?VNJI&xHI{ zu`ba~D&OXz>%QQq)4x+uZYqc4m!0A5asRhu>y+Ld%B6>Wb1lzI+{QaUs{gdzq<zbN zu>VW9^9cK$%NlOOwQ$?x!|jYOA6YNow|rmFnzvJ!4@7fctkqq~_xi`f2@Ssgi~S^5 zo;oovr-^g*#Y{t~Il=cGZ~O|p{LIfNC3sy5qm$`=-YjmP=~*sXjmu5%F{O0w`FQxo zw#+Sew`gA39uOaLOQq$@ryhM?-)~c682I^?E-(mvHPzv~X4W>fW8XS8xs^)N4`vyy zoiOK{#q>!G1?6Y^mfxIb-Xos%DDbuL)P9+7e7|olh!83Bjr?ovud?j5U7Fv5)qA(i zdfQf5yuhyi4+F!wsx|kXS6=#H^@*ckN&Vl$C(D-#O|X<Th~4yW8<SYjbiK1PPqZ&$ zbeOO;Xa9xEjhn>GzoZ?q`Br|6?ZWEbWzjaKr@E9{?x@Poi7PzEW#Y{!{2^Rebj@=I zIn6J-Z$8mdDoH=Qyw0&R_MO_vM9({4PNc3673^2Lw&arI)|BS|+ca*u?KMtypLcHm z>l0gr8}>+d=j{HKAJ^Mla=Byc1O~2UN{QBg1sZ(VMLzy?TBz22WsSR3xbjKGo2NIO zj(hflJ)$ixM5K%<LGA8^uv3dUH#~dvDPacpLc^6;Cb6fi;C%V{JY$0Ij}ymx1Sd+D zum5;gH<|OrgJP{o6?Znt2MDuox13n+B@vQ6z1Qz@^F~ikuB>l@8lAiaoQiUM784mB zy?CJfa-;sMsE%UhtV^qV)pp9xZ~ggj`m?~#ZOa4dBM!|wc2NBOFUunvnOMEPFx0uS z=-nxOD#*9?PM+_*_x@)eME*5f#k->Bl5zgmlc8~|y)$k#Y`=OwJUDxH?V3En?d=X} zuc~<OUyncZxYhpZNsiSMue5jMH=X%(=FkrJR5`hX$EyV`x4XRVEIPgL+LK1ED?EMC z3(icmceFXRU)rKna?LU6v%;2IdRN>P<xevFxWIHRbFB;8(^(;tw|<je=3#y1$=T0U zDIrriRx@Os*gJVmoJgaf<Rtq&K3_j4&vZQ!&(=}EBRQ34Ip-^@!V8<$o;bN#Pdc^l z3ron2zJE7=nB1S_Q0iZK?xNArOE1+;<C1q@`DZ^#C7|q9_6w)2`|jSD6#4dJ)2_Ju z8QN7M=RYZ|sjXUWHuFo!IZnfS$G2TQ^U3E+#ShQ$NT<#GngSn>_ITQ|m!69ZTJq%P zm#Rrz%nKZhv*lhH$(9D)JUgfOg=waLmA+wXr%U47r!!wnFN`@}6IQNb9NM-ft^3c! z`W3n7w4@5BoZS>D;eTHydkX(&fz)Z~i$dp#%{pVWU0kW8zH#~LyDn3wZoKwjqxaR` zVCmbY%?z889A3#O-deS2_R9Jzg_q_Pgrx?jn{F$7`Caqlp{8qzww1>wd&@<ttz3BZ z$C3qi3U5sO_3hX04G$ZN1h)mR&+Q4+Dq>PRF>7~6tk$ZT4Li5omGg9L(Gy#~tohE` zBk%a6%KcM?U2Oe#Ecmrv#qv+lktz9}?`5lh`S0?-m3;2o9Tp8Q>ElL6I@@>Ie{#6~ zwxQYO{@R;*Avcc;malxjukiKj;^>^hfR>k*b4r_yH$JXcVyl0CeS%-`^hI-)u}+9w z7Tcwil>Ypv`#!Izt>Gz8Zhm;?7{Qn-_j2mI;J^J-SYQ2^&+BokD!n?t=}M~0%A}IB zjVi5qtG_CR%TxwDzrwQRaLK!glZ|4z4sTc|n`sqz>8VgtgjkOE6;1A=E4HxQejCmu zc#-?~NzErAn}fs|9xQi`o*jC4@jlmCSN=r{@h-d8eo&0ZmifcxUG~y~RzGs4`p%GE z)7<Gh=_%8-%0LUdk}q4Lrpug4KcW0m=lmX<YeokG7}jrDd~@6CIj6N)9xmkMJ?!Pc zz;gS<In%eNx|S#$IxgJX&vd5YZS^Ka)qiV#-g$lM{kEE%mfo97qbiCoNV+n2Dz#2` z^V`1nWol`i*}*S?|L2EpIx_R;8cEk6=8k>;u2ctBt*V{CTzc!umgi1?&KzXucy~>0 zLg20bNXZ|oee)If#@$@X&+>3>qS%tRd`pxY!rP8>MNOA2Q#d4)ShrkFBTll+s%`n% zWaZ02GYih|@KKd1R;g?}G<nM5U*~@Ry);w);3<nI%a^sT^SfU(sa^A8`mrTu7xys) z9B9sSeEw89R=YxlIVWoq@4Y~yP}?5@3`Tnwtc#i!czN5?e@>^=lpp$k&Pkf>CgOCk zVR}^I{eAnJyi*zeSPHy)yjDhR&%7p95s}-M%Q+bY79`%%>0cuv-x##W`MmJL?#@?s ztlYLowhDYsSm59P_SPrY2*oQ~o%i#;_E25<`}2Zy9+~ZNJ1VQX1gzewFHnik{xb2_ zjw^NcK_CCbewWQ;@mce~!LIZ{e}E9TZk<Q&(H&d1ZR2{O!1rZxw5H0;r!(s$?gdZ0 z)Vem=zjw3EW_>5~-Ip70N-=ESAn9t!$*{v(UvMM0xw)3PArs?^jazij=hdueS?p?W zz2V6T@l}^j)L+Vz6Tf*oOYG{xJy-TA&y`#=#b&DXG^P%>o)4zWrMy@3D6A}cl*~~3 zGEL|i>rK%UEjK!3JHrlb5mn{7Ew*sa&zIj<-`Ev!G_}ySmcc<(X3gIE58E5HQfGgb zXR`R^(^B<q_Mr)$)2_U0Z`qmlLCJr`yr+_)=T3Y(bLDB=k{9AhZ{K^wH>+tMcrD)j zy@0Q~e9!J(^S9q#msgc8&vxdn?VG;s;lIzkn^2rSRW#ZBmpxB(m&dvddnO3~V)m*@ z;I=duNWbc|`ORHN-<#QAvkvO)wHDvW=6<nCVCmuhBj38_OljAf)U;jdw#T`LJ3Lh{ zSm*!Vl~A)V{`~Sq>GN{!HmqCx{`t%U-_?0q{Hmr@NLwa)?pWk<u0E^sDO=cynd@EI z7B@%ovG1I&cselP%o`o{qauz6PyaUm`u)(mY8jDaw%@4&(kUCFWLSSC73p}dVpwUk zY2TGScdSiHoL*0n=AR(xFTHl}-x|~Ao$aYo1}+Le)66>$MjS}gX<#-8`&AfKVf<_T z$y-*-82+udP|pc=NP8U`llNQJh*#m!yp@TY&t%^)w)f4t<>j`0{*BX<JOvrp%+7yu zUC;U~CQYx*&~n3uFMkX+<|yZEdE?^0K_|rGP3d{_zyl8N_v-d(Ii#o>@0=yJhx>@e z9l@k+>+je7mbCV46q~$q{eG*fSD8y~7A$b+zgtnQc-Aw#@!yfn_A{75&tGkGX1Jg@ z;Z21@_=k$}8@py@o}44cSg?|Paj}?{%$st}Z&ow*tnt3R(N*W*cIk+$xl$S#m9{ta z`O{B!7v69xVynKtHgko|>g#`>Sm|8uf9@!HVe`(4zZ&uT)%|V1u8S_eE-+b;&Afch z9^RsbXFtF8k4wA%Qdsq#Z;k3N^OrxlcFdTxPw~F-E4%K0#^IlimtOuYD44jp^U=oc zAe~<~`P|~pc%J(=cT&uy-C<v1rxY=WEGcq*{BrrL_cin8C_ex8|BtNfs{@_67RU4M zO^RNrA?|Ga%dE)pd8?-QMv1uoIRz*FZ+7<7`<Lwd-qp|N-_}Haf0v_$!3$)c@ceCT z*`4uy{`dK1|6Qe7ytd4~vWvxg&u>@ptm#cE7uw!#G~6PUJ$2`umxmLtuD9ckef{IE zj>1Lrxy1oXAG?24Jfl_oaYfbql^gyxIKK;+?;E@)aBIt=#B8b4Pv5W@Os$%+O1tHG z&GJ3f&MEcvmqNk?goS4x_3O0CzP0d-rI-inW35G7`R=``<6&T!zcDKAtc0l3*^f=v zf||=NCq7?teDd4ORnK<0F9>}mwCepzA*RA-wy8p;Sxh<(TKYC?e7H7F?Onrgz~anQ zE;WtLt$abUa;({A4656_Pa0l5=2Uf=;pr;(5(&p8`l+m|Z<jMn2tB^|+2n2KeuWo? z&Gf#r<BehJ=8G@hyjyc>=8>7-r!+j_Wk|`5*?n`z@9hC|nO1zM6k5;tBO-q1wMREp z%&S${8}>JGH(W4TIL-U|r;wVBVnUNwb1?+<vh$riF0|_K?8|abv$h`VmbUlp74|z? zx6x@YpQspvgfi!pKkvmRe_OHjzvqI`XPd67O}P_v)=%-oyjOBBITN4RvQDv>sJvD` zt^AMMl<Jw@g60ei{=9wH%QVhbb1`T<Na0>0U3r>oP49+<7Z@03bT=Ez?VbECves?x z$F1Qe6(L7lR|a2S`Sr@X-D{V<xBcIdT>g6wOH``fA~WHy_kSurFS$}7=Q8uVNT=bI z%h#rN+~Konnaz9nd~)<kzr0JAC3Lqu|9owJ#OltAWwT$cSR*}mw@B%+xTP1lO6EV9 zx3?}Ysz*9<x>oKo?!GPR`)((5Zax*GQg`ma&;R$0E0-PSk9OQp=`WeOS9+;(`vc`? zSu!WOSy&hrnjO<ss(mt*HR5#V+dF|~{M-)=xkDuN^FQ1@KVf4~a+{UkS9`zKX_wpk zEnbEct6$S9W}FfCeEz(Xv-#|8csoqrYbvkg4^-RaJfl_Xg0V+W^%VcbTP4mvZ@1id zP53YmV`%#ESyGQxWP=|bWc=~=_TNd{XF4QJ+RNL^Z>g28y+6rwP3W^vpMNc9c(6sU zV!GkI3buvMY@fb1{P1(hM(NZ^nWEw;XAS=dp6_xv$>S?FL!-`{L3-_5jkLxz_N<=p z?H6K28#a0K@BX!9l{M%4iqogA?S8dvNx->XkCc@;ww{U+`SNr}qDNkV-oKJtv79Pb z_AEcM&CE8~b^WHVZ<ZaevHooJK|pzfOa7GBNt!d3iZeexJz?1;@5T1@&WgKbz9bg+ zn!j$6IxJot*Uo;QiNXEPo%}bepB`sqIJo3+Nl)zCektF5)3(m4-D0X^%X>HO*`nps z>@S!*W$I)XM!BW$dw<7$n&*;Af6m;Zlf4SXS<G*ziZ4;mmgaxrXySD#OZG>y)Uz8U ze}62`HrHR+;GlHjE?dyjxEuB1hna-K{bn#399d^`;Vr*+*HxdKBcArItNV>g6K6h` zJhb=BQ~nL_ZmY}A{qf}M!;nHyJTM5aEuQ^2<Z{QM(EZETFyA|ol$;#5TU8`t_s-*U zoaMqALbJ|XT&>4EZ?C>d`(OW3|J9zF|Mj1*RKDh@{xNK3_uAAh!|WpQX}O`L=c>6F zUh6-}d%1h_Y4`ohCE8!v1clghPum@tu-1*4VfNxf8E@`wYd(||W-$MW_Uu=m?}jCR zpFdm5^;)XD`aP}Ui6^6K6m=f=tSY=0%;0csU7+tOHj529jk0T>eN}qc$Se3zFpzax zK(0fHn?vizY102nu4SJWnU=sDba(#Zv&U040y4G*IVio?f4+3p>z?9AYmBD5rcPIh zU6ifd*ZTDRtXt1)Q!Ur{6kR*e%q#O@181vZ4nxa<`zodt>J@owpH&__-x<l*wmEXy zp^C?)H!2?&v3zzv7=KPbuh!TjUDmR%cz^J=DPQLJ{n30?AG1>^ZR*Z1D_@`QI$p<a z$uKQR$z$@NqGih}{W%xDyQ8w|iILaI$8)2qwiI4?uX*^30pAkk51R#_w%3S>dp$FF zvgyFBGq1a1gxifaBxE)IIy7(D`$M*VCsYEzFK6pHa`o}!5AJ*COBua<up#u>6akm= zUhemw95=oCaMAhD8l&l<TVLK^Z!=ZiGn4)DEz{);5({$_PVHIFvXI%_yGZ+u(WIFH z8BVXA8MT&bF1mL*rsn0fN`J+<stf{62R>XEm_BpOOh&<;%vs(wM%&i*%J?6-=FN~( zno)PfVy;@*^dwW!WB;P3Kk`#gxnnW6biw0tZ&s%l>aoi+ax~)3PVb*6*SkNN4OGN_ zUA*tM`#IkA!uG~y(z^QoN_~D-UMej!zfbYKdz*!6v(c=u0EG=(k6)K^-8p^dhF`Wv zSy~P5*ko-<5i8gH@M&4@$tbbp+$VR_PnCGSTz7T)!b25@dlv>KFJ?EIw(5y~;RmZX zG8c-nri-y<Oji1B^-DxrX|2)pM~{E(wpu&$>k-}7ok7d)_8)C|`F_@}XSS?v+b(Vs zTCnxX>Z6lfZN64_C5pyOzU(9>F>j-9`#et%`2$g>ck8CCJ(+%dMNDi!@}K9TOJC|3 zg|}+trh6?~YcyTQ>iI<WxG&p|82Bgded{sz^Sn)y=JA)B8L2Q>y!tNkWy(&o%J%=? z{!F%t(zaYT|0=(BK=9$7AQh9eHQks0ot{>@SKz+NhE?AtT74|Np=bJgg?EdU;r3-| z@}(Xf%bs7m_HO%?%i0&-J!){-eegw)y4~To|N6HjeZ08f5%0If=Vm%SnO2n~w%K6H zSA$bLZ86TCtD{=B{P;C9hQZ6@$$Z}G*e6c+^tZGwZCs-IQphq<DpAh$)4xwyl9v1_ zhT3P(Us^6V<DOw-$I*&2TxP;+u1LJ+`}IB5ZQG0<HpBFjllLpBKRcAUiXl4oS<v>q z*$pXC>nDAD!rJx4KmY$_*$*`mRX$-se(8pm&z|g<F|(fMiQu35^Ak3zZ@u~`c>(|7 ztGcW8tGoX3-~Ur{&Aa^m+U|W4kLx}sY~yGMD&yaA!0}yS%H{AANjh3=yLV}to{g02 zTB)+kM)DW;Uugpavk*qt!#jU}jF#s(vc`-*_f^-#2(D9a*>rnmROu_ddoDT8EWwBM zP442ODRt>>R!;9T^8;#k_Lei8os+6w^!@&xmDaXaFH3t*rn;~=?9+AbK51&#t=T9Y zqq09rG(n?Atk`b)(GR<{l`^*f{~Ue9W8qz<Qky@|II4L!EEVZ!eZ(;9`Hxn?9m=zL zk5nH@WVd>M%He{9v(J)U&s27^g??iGIRC=>CI`j`w$+Ezdm|*C%<5V+Pcvs_uGEBL zUJ=p9*~_a-Cw}e`5zJzCKjHaUGCg&YadnN@lc+0GQ+?8|-AOyicA_%+<_3w&sW)}6 zOHSavQpz{`;z_g5EB$_DZJPD{c<9~iy}$Ef4?DgS_0imDec;2lqORs7Bh>``D?77w z`H#k|T(C>i*_UCj3{UrtRf)Xwk4~|w5j*^ndzV)6gai@0YpU}Z%_3Tk?2O21U+H(@ z9gE6^!i>JqVorfMYGRz_7vI@K4!&Gt(GoIQ<9O!ro9)e46%`iTt1OqjoZaMmI!*K4 zBFFrdenJcmP3qhwXExUd3$JOCn|3xiSzzw^M856bsgqWu-sfPMc`B}TN4J<v;`-F5 zW_nlppD{3`L|2}Rc)~kli7ubUiKVOV>gYVu4_rHaMPF)u&|2N=7VL(dT7Rs>tR~Iq znzQk*Nu<oNUE5#X)iD-6Xj$*1cSJ2P)OWjB(k;bo$CziFHvOwBImIXU&TYs}7P-6n zV93!~*#iBYu5YxrI_Q}7s2|aAyD5Lga5j_9VUH=ZC-$D+usQ!aV^Xf^r>l!wBUD$t z(Je}sT$QEc6w`L(T*mSFPq=pUT;`0_O*33M|GB|=_orevyzQ1P`SYrF*#b5vnOn2$ z^EYVTG&Ha@yt?q(w-U+P&}qq!Bai5;tJ_#?Q!`=f+{yV-CV3O{4*ii~II-PpbLvII z)2~<=G!F2Fb*=S_d2=vnk5i}D6v?FNGp?*Jo}-o>WTs`WI^pX#wGH`<4kbKWBsm<C znnSKVR6Urq#_{u%#}<({FMo{GZ3_%NSubxP9oltCyhv{O!EH_DUw`-ZHr;O7XE?1& zx_@!x&F@zC1P*U_wDsKo3Dr8c&u@2m9ba1XWUuS$P^aadqDeZ@{Vi|iO|&`oDe{O> zplY|w1mUIgKmGl;C%NcfZKT`tP1YN)cmI`c6k6SU=4Fdcl2quM_1TK8cGK2MBp18B z?N6M2>eu<5-%<^%MW0>$HRJTn+V|TotZ#gB^S8k5Bj=ajmR!jFH?}+DuGZ^w%QpK} zK5a<o*m<MG=H%R2qOWf#eO_VK?fP~R`%Mpv$YY0dXU+Y(QC#?x!J)_lZD$hw5(FPh z9R0U2?dnDOlqI~uBL5|}-Q0C@np2(OO{Gs)71+AD)t^`$U|?{we$A$E&9buiEPJ!R zuFj(Jx+0&i&)Vm7JxQOuQDXMlHOY(P53bg@kR<=SrLJ8fu%^eOw@<dn?PMJ1>0?P- zn&vz%*u+{dam2>!#`GJ7&zKwDu5Gxws4~93-nqAj>83`2qFQ(KachQzjSu}YWjksY z{hs6R@<02|?`bbCD)2k?DwwbBKl^0E{Eai25BLffb>{duf2&Qmw(o!TpH<`jUX#Gd z!cI$k^SUoScvHB=v5t4K;rZm7b^BN^?w!~d>#h97Fh|XOmB8YkM<+4_B^S@_kI+!t z7%g)^HSnLN>y+Bh85y4sPWb<J!`F?obiREO+I?x->-LV$oc{RhPFh9B3TEouiue0g z>zlDe;hB}zA#Fv0)vagM9>n_1t7Y04=yPh{-ahXz<y-xM1s1%MSQwtJagaQcbIxvF z&KvbJIXzFFN3S!!?((;2ZNl$;3uXPp7~BFkukF7(<A%|<=k`uLDVMzknQi2w{;OHv zPGHE><%{QSxbgN)-<u4vjX@!y&lP_4dwmM3?VZosmcG~Y(58)Zxc@FY>a%P65r#D( zdumNCZe`kVGHz}E(+qppGb&~;9?zV3&V3paYuPtZk2&4>U(9B(-!HxVi^WQ8dCm6> zr(#*<$nC0^4r-WOm$;m1t~l{r=*=nZs-}lFX&HK6FG%>DnX}&F=Z@u%4)WbFyq>y| zWpVIM>(5V26&Fd@$<!ZcKBHk!FXbzj)pGgaqR*eY4(4S(Yi?I{bnlAw7XIy5;IJiA zBW){(KtQc5x1~ja)4GeLPnuuuxLWMl%lPHl_wsV414VlttI18-<Z3ZH^;kuI9y@>D znZ^FeKgAcHS)TFSFlXNnck%mCRXy`&=<fRUU><|_{dwoCHedXl$i5+Z*8Oc!j}CsG zalFY?_{ov{4fFqsu}_~M$oC|QWyAG1*XQ|8WqqQ;y<xHy>&`zVTVC+z->8?*`F-$h z;)>?D;`%p}Udu6^{^!1a?%OmWTX*~NBeufRnu`=A7s-hKd(7RwH*vb0zNPb>zv1=P z>^{0@e5Ct~PwvdxH=SEeJWFRoovMUwV!W@kXF^2O=hHzwt*uL+ZOvM}OpV{g;Xp>J z*+SmGUFH53e?$U`7QAQn@%7X?+;%<nZC=3%S*yPxo?59Ijh!cCZTCj{>8VSzewF{& zw)6j!{aNV=57b$AhUCS)`}2VJFaM0sSIcL-64`L)aC_^5`OG<+rri@gGh0%zD`!@h z!`hkm44cI}I&MT5DLiMtHb-LHuJvl$zfYDHku7SzbHLnX*D;B=2Pdu8Z+{*o;IX1h z+q?JQRnY~qEd{GM=gR!3tCN^p!O{4(L-5QM!3PPI#knzQ{iz3vZfsy*_o&f#`pk6e z4RaR!wWtg@bf@f=W^IJnmDAeS>>oMqd+TypBDBRJ*03o}r|b^5{zdzn_eHMkd^7W^ zWK3`8ypvN5nRW7XdVb06l__Uu)R|{=e)_Ei(?hpqKU$L>o#fef%<hTX*3d~^_g6m7 z;3+CQE<G)TDdW)s`zh60o~i+td44%NHn%izY!JU>FE`cT@2<8v{UT458vhCHa<i43 zQ?UJYaH;COzdDsdZ#_int!7;Oc|PsYr6ot&R)q=b1mwS#)%yGFLep;btbj8r4U;rt zI}I=7`B?7=j<~W)$0Npa-}a7%@78hOFHSot7H(^;y>ES2Zs@vVp<Sm|*7?T@iu2y! zPPg4{GA-ik){Q?@<?l%L$bDO1d~DzDzuPyn7kv5@yw+Rs*hGG*_|so!bT?eSKI6qy z29Yd@1Fhj#rEfggv)W3$@7O)@z3cr}PL^l7v~|Cj|Nj*dH&&Eg_<cX__Xp1tvsoq> zOL9i?+&Uq;G)m{|hG#oJ&rjE=Z;H91_*YKuduZ4<tqH95VLNYViCLeBxww~gfByV$ zZy3%Lq>F8A6}x@G^=C}0%Dij0Pi)(G^%>L0o?Gj5C6_LHtoCuu8`=7Qp@|!BEj`Z8 z+!eAh{qLj1;};ehMK5;{*Ua9>XdUm*drv<!;?Ta|%i4cQZ-`&G_)Kiks_z0zjwSt( zi&!ACv_0YUwMiSMq%1q1SQWbVhNHo{c!NUgj11S!OwMMOLO~j(Hp2PLANKd(dVE{Y zR=V^1`G|8T+P1xqyD2hLiIFR`)1763_bpjdJp+SU@dpfl&bAmVJ9U6-|IMuv{B|)| ziZa}oHkWII8fWk?(*u92cKtq>qa*+5;;Y;r=gT}M3K&aV*|0EmM)T5Y%gGtL@)bQ6 zdv*F%=Xa&K=6hVebt$RjPT!1{*L$qR%eHX5U3Ijk$0u;_+Uzo4HlMkYs#lUeT~_MS zZ}>4obK1&ls#f+dE!XibEq`CmxFnl-opzn!$$1;fws-n_zi^zT^685F-=g)7I)Zb} zyV|SgZ+sh{RrN@8vU#}D!?u6bi(bZ+FW;(kt>7q&b3cpm(zCB#2JLme`+dLfjkK*( z#5xxRZS{y{&iJy%$<)s$cp_6!K$1`Q)pRp!xsr_Q$M@e<R85oo^HKAfU6N$l+mGVO zcee1}QLp``z0u<O9J!x4=Cu>Q&CZB!h&@-a$mPQw`)NK&fh#`CNv_?nCd2Yp?(%c4 z^E}#i&pIx`{A<T17T!g-uf8iyj<}>69$#wKuveee>*nNy=DXI;7OcXHyY+UKeOUT* z9amTQ(eB$l*YxCdmtDyHxcSSxrN7>@Zdms`I8|-h@r?m#fr^H^&c5ZmR(ZZrrZU*b zd-=+}zh}wH9~Ii*fBw?Gh0T{1AD#L5S@#W*%tyN7cgq&VXZ_pbtM~28#p$oYPU#(B zTXBz>VNa`&WpBNd&ei|-USCXUuHujVv*%!V+nZ??&nAf}+>p{;cHwEwiTA$mdNhKi zHkGc?n$zd<sQsSw(>>QUU++C%oAkFX`nj(A&zR=ThHodIJTkTJ?C#8NPd8DUng=^V z{U@re<6_w1X*RtfFYw7BsdwKtyjoJ_-gG=<$%kVHr+-Q03s2TnIri4^sNqi+)zZv$ zdowju7S@??&0mnzRG~HDMHHj$LaX<7()q81QZIczxc9f;j2&5ftn-&_7ID+^PQDzy zd+p<ojVEUAsI|?Uuy*R4j)P8_nMD)ree<-d--ex?<6)IsW4M%YD%1LFt6eUYS3C7_ zS$4Ry?qQ7H{?z~GgA<R;mSt)`bND@<_gtFU^G)A7g!<LnOiwL4sm-z{KI-o6jx_g9 zADPcLqt`HNBs_b>JaHR?_1lj}r!c+UrF{SYv(|gB6-x`2oUXdr;HAD`&G$dc-&^O~ zt^1j^hQ(#|$=F9blk?MsZft*b!s|%VhyVQ|^^*dQ9@F{Sbz;5YBs<orIYsdg=B<1E zv~RY<_Bo|DFSwfh{;_sr6IaEbj4a_5pXIJ^`OffUd-|Q~x8LGSYUar+UMXF?U?!u% z<#qq6YiF?=FE*Xq8(w~y@$9B-^@luvvfKnd<>&1W)t>Xu-gohXXFtx0l|RXOAG+@0 z<kbbU`>)BF9cbCI=Tc>VO40Jjw_z)F<eq)o7oe8T5ZLmqD(6o0*T4C$|Nr05>(*De zkT1P!-p4J?y000za{u3&Vr8ageMjQvG^g3-wSqS$Tvy)k{qe1xrm<hYehKkzKV{3z zH6`QSj7yshd)`&pe#=S|-Y}!+d7t^?iibasbeX4xE^0D3AN1(b#k{UJRn>myyA8LO zKlpv0p<${?n)XB&!=9CXkKXT{Z4lis|LMJ~_w^I&JpWGG_kT%k-{Sv&Kh0Fn<dfYt z{rZQCTs;8`EwaySSFx!6!gFyOgS_LRpKl+Xzh^G@b^rC}`-IOft~zw|?W0BS?52Nr zPmPPJ2+lNKF#A~>>($wO+@`&jX5JgaR$R(%V!OrAn)_z&tI(E&oo<;+)(U7%irW1n zW69jpr?<qL7CjP4c2a(C*R%ik0vUDxAK!OP)o9!L)OL%<+soS}E01{3m*Kk;BDQ%! z@2#SxrqMHhU5qe~pKF}8?Us3yq<gC5ZrLwCPR^{o@$;{pVE@`LEZWO@3U4&_&!6*U z!{^(z)$g;Udi1NpTHO=pZqm$L`sT%sXlLi(UmrFny+}E$T)q3(s)c&qiBi@2%Bicj z9SiSUuX5w{rGkY@D{nX&e7$vIuGG1F6~C(gzw3M6@15VpBKiEtPWO)~K2=L(p6-cw zU{_f7t9teOyT_kTIZ^fY_D^;5xa;eWU+op{)1I*9y8Ql=DW{%&S^4YV_35{_dOv?W zYpvVkW1PnY7hEa*pqs8P@^+%+!$;fvZ}w)_75X1Pw|nQWyQS(IZK^zX?1|kdZM}Yr zk8y6f%?tbW@mD`AJ+UcibFr|?cFU|a%6TSBoL4(dt<IUHVE$^YMMP?%RCT^!tWAUP zs;8kxyFJ^wmL#z`bDdg#(tFXL7d3Kk&#yK-a$)bm)0bp?)<z_ionOg$sgnO*-rGH@ zmQ%bpu3*)F`y+FYaAcTsq}R>a#nM}Jook{dr>;}k667otcg;R9bFOJil85TFL%ULs zl<;bqtPS7^Ty)XYG5n+HS|_Ji<q(}+Kb^LBoO8RHA3eonvAnte_IVPCq55~{ZTv2E z#Mgh-gEdQ(R_=}4YuJ2_TUpdtr6`&yI?8sMLiw|*t4xP8_kT1ty8PApvE*m|!vC-C zZ#!R*czzAPl3Yl$KxN7LS$lt->uG-cjZeJqFlQrs<q4k`{A+(6KmF@t*SnpiE}M#M ze;t|qU`F7MquZvt1TDEYZ)GGK^P&4W6V?iQP5k!l%opPq_UG3NKj^sKYdA6I)G6VV z+Gh!z?^#k;ZrZ!L-7O{I<wpUAmeM!23~t)#D}A)W9$ah76ZzWX;l)06&B=4@{};On z9Skfq`f%Xd`fDf7?z&t5?_ra{W$E_wBA$;E_&!Xv<x!tGEwno0>&7eIyX$Y;oo<ek zy~TX{L`tFk@vL=UPN~}G_B@CS(A%bO%PcW{nik_Z`B>*Ay<6)Ke6%=losBKEvL$HW z3(W)k{lR&23#}(k$t^0|Y{S6yJN?v@v_B6j-WY4MG9*e>`@fo4u}o{_49D$yEUWfC zYV}$e8t^;z_~Y$KIjbKzo?|(=^yBTj_3>i+Z&d}!icR3YaM4it!vQH@wcgk{6HVmv zU%d+6Sa_jqd&;+W23M0!PM%o#?(`n3-5kHa?{)WmqUF_gPuHy2?^&bLb#0C9&I+76 z&*<LxWi^xi)4KFU7k*82c(beh{l3gwoHf&(-n!otI?kOczW0vbgzvHw>T-LP^WECr z_I$skEy=*plKaM%VMF`m;He>J7M%9WURfXhGdO<YWw)zmp2cLQI=uSMf4kxMhs&-? zPtGwj^Jjj3eY)yp=-tb=FBCss8*BWeTkx`TwExWdj_Jqpx1M+VRB0O=wWLf;LHX*Q znfirOtnE+EjK8mJ)*vpD*70a=Ky*XD>_&zyh8r(DsIY3ckf{)ASQKNxe8cbO-OTM5 zS{^Rp`Z`mgQE=0C#X{?2_fE(CyuDF;g@;z!g||O;>@rzrYqx0Up`Q91d|`6u*I5?* z(UI48{rJyx&70+x%?wJ@V$<)h{FQh_|FG$~BR3<o&o-}QXP8|XD|5@JRdb2u6x;Zg zjXU4)ExFFZYLWbDqFTu>*M4>1b$Z<|f1N#fI!09P(<X!7z3D4b6!sNeUszgO;<G?$ z<qv0(%rl$RW^Vcux-vXP{R02|{iaO?r@93+c2+1IK6k2R;<?|4wU_TH*)Al#db{`e z(2BiJ1zPt#eZHe;*6}GP_HKTEbenP9wRAt>C?8XK>(tj@j#yMCtnl0OMGI7#al6Gl zTozd7mo?SFHK>rowaf1E2hW?l#VU)U^xx}R7IsN4R^(KbT`npXTcO^g^!w2gMaz?7 z&o=ModVjmlPsDOo;rFcHIwz)VH^}!BdE}^k%x6{Y#;b1ggBmvU?k)et?8&!kQdd(# zv&j*Gg>TOOoW{~RTccStgZrz5kVbF@^M0XY@)C30qs~l_sdtznrnN`n;kE@XiOs@0 zzndOef3ZU_sryBrWOaY|BDHDvJRc@a4AF6azWm6`y+M<8yCvtTq})B*cSf||W#-`? zaY;M%vk&i|*kk<uPI1zOrGI4nJ&Pq)2Bc-E-<6UOT(>lE$)PIkXa5zyo;N(XW7c-v z2@+geXWY!&=~-Oh)p#qWf#u`s88@puvewuwd~YfdTa;8#VIBPIuZH^5w`ymF|E_o0 zq7oV*ziaC6(iI;LXg5gAO3~u};M^F#GrqL6DZ}V#9q*DqYYx0-Op^F&tre~D?7{TC z41()7gXWLpudGkmy*d3-;HIDL&tHnqU-JLYFOO1H_09i(H>dpndpt`$O=RQk{u5UZ zOA9Vmy{=T#e@lE$$CUMptD?^_{#AX`&h)sAU&c~Jt+T|a_rgbpYZVO=xn`$)wJzK_ zJNsD9lRciC*18dDtCgO=y25BwWpefZkBxE5{@sbLx}Rty`Rt}Ncdg;KrB1HL`p;iJ z@=bTu;{y-Xwl>eYaec4O89$bW3o`@lW88BJE^r!5-{^UA;%t{(|1#g(!p0N(6SabD zjnh|)XDTke9wTZbcR-3?V8z*-oh}=ndPl6QWOqE;p_yVcDM{yVVvCkTcb(YlccHuE z)})^*nz%Cc#m~)g8>%NStJm}s+1VDuXWXr6y(S}S|0>IW61JDW)gG*Qro?o>`pky6 zZI87|*w?&XBedb_)19dmS~m>1t^^i;ePmL9bj#YdkH)#@OoiLBbn+S!|5rV${cXbc zFTpZGq(MsI*PH(z)F)T!{yV4sb$MM<#Q~9k1y5~mscu(JkD3zOGkM0Eg=eqK+vy<p zJbfeAvLAb1-ql#V|Hkw7g93~XB(fs<m-fBcHF5d7*UL@z|81I7`%V3S$I1!DR~US{ zEyb<`e=}(7+9Pp%-LtyysW<l5H-EluyIZzRtkUq@;r8CzJxjReoQU03|K+~T|1a^c z<X6AH-`W)N$M-8Ud(8u->DyOVZsv-+yu*+yv%gAd{^m&~6Jl2>T)i}_ebW=Bs>16j z9UT_R)0h8w=y%R?|JwaO>s`E_^tu0hdG}J=oioR$EJ>2hJM8za`N=cezh(l0k8b7t zu6kyttq`l9{C3U@7ag_B`xGnHyj(I*T}V@lcahk?cyjkip4!Pjm{ug}AJ97euF1dm z!o}?@DR)eFKF@E>6AsA9{^QvoTH|}<_EW#R-WT8guL?eTf3Jwq`*U9ZvhFtawi^bC z{z!Hd>R?pWHBc+Lq5i|g>pg3u%@;O_>$yh{=yI7hz6q;h+nDow=3`-vPdbTqT~gsC z<$u^FbT&w?`a8=ZC$jtZ6g@8etv@dF*f#$8F7}<_3-5vxuOD+a>J?sHZp?mQ=J&=! zeY+*a0w3Gm(mpV2Q(0b)50iMC!=AUxKeQ)_p89p><K_8XB`mpiYr-dqFe`~JKEc~D z-|64n&hp|<EQY6L0w2%06zR;yrJHs$(s@JDoj2Ev9yJ`e6Y1Qx`Pfb6fF{x8SAtJE zuQ_dcw}^9#?)%;AGylk%i~kPUQU6Cs+OG6~ugGrEJ<fM}R2C)tezn_apV-^@+PD*q z4#%=QDm1(9J}LS0R$!w35uIcFNn*wKm%5klo8Kt;HnKiCW(~Jd153%LPnS8xSKYX- z*dX9@MPat4!~B2K7}9%}F1yH{?PoG!YSvVKtt-8p9+z&#Yu>oMBB}efTCl44*V;1I zm^lVcm(x#bcg~b3m*cjS?TFv8lX>+Q)eSDwwcUNUP4+&S`E<#B#+InV43>H|VS5#? zmxkBh`@iUaF+<4eBPE`9Bz<ba*J&4@j7^@Ga@6ACvSfX>h_g%y?$^@Tr!v>;v2n$S z37=(Rn9y^{P$?^E$$6pZ6}LIp{q~*2<Cf$3F_7b>Y6AD)%Vv_CH{Td-H#EB7Zf|?C zj7P3|UDfml><kjCLvr`nPoBc3;=CI)TrpMVtK0z(=7vk6vo9G%|5CdfG(jmTZ^OTN zMdrym+&2R?Z_Kc$`J(E{WZYA%W89}4E41u$UdpNesR`3!YP4n;eK}%yPU@#dckA!9 zYXVL;<W8(ByW--#(1G1_$FI%v9U@Z`j=ssh&NTOrz?*<sK2!gclzQyHr*~Cn${wFB z-i^+Bt|#1>cop)UxF2M3`5)`6{k@NC)kKf`53GJ4eqPA(qww^ex>+ZD7u>(56v%Q~ zI)ibB;Op~C&wSxctZ}~d=FEwcw|36kE6Z-%_2zMa=IagLD!(MIGTIS%iSzY}(oFZ| z>b8$>dA_{+JC@<)#rHcO@%xG~xX70tEX;mhH@#y;tLfY~410F8UTIF>Sn88(%gzzf zD>{?0Ve*d8IY#C^?2V7!@W&rBJaB$m`286joEh8`y8?H)eRzKFrTe*OKDj%iy59Ug zBl@!cx$1=7R-uL5#c`X@^7E~!R8o@IwMmV^LfQJ=>+*Sb3ao{g{@pz3dG?I(y*Zsn z5|7TDSoFMhp4w#t=RMgi!lm=RUrv;pSo0)o*{qBm4P`GsX@|OdFKKw<V6?@o#jLSx z{qtj7qU&aSacI$hq%gPlfmoqZ*ka~0A0!#A-_MCLuH0nKqN5g`J<BHJbh^^l7aH9; zE8`h>Ol-sVyq*)H@|n%+iPV3Sf{l*1UT-|P%!{Feq0LWT$n(hWwLPXrGiS`*E}8D6 z6t`BGe`2+|(?{po+zd8TKNvQYO?>H;>a};$s*@p!3+tR*3~P3-oaDSh?_#(e8_T5C z<-+FYjF+GCJrY}9r;+k}@56Q*-zyaw7V>-#s=3!}UhDHxQ@rzvsNCnT)}Bl+L$}ZL zTCw}iZ-Ea7jdpoHKGU@Nj&P@bE&q>%nRm;21zi6<k&S)Ru>HLX=ai%KE~!pjby2Z_ zci}OSb?<JQZ(Ym4`Q`HJvNN~M862vtyVM&ypUl|)o}uB3#i>Ubz0=w^i836_i9FZZ zJFiLMn#&>vjXPY?S@#7zg+ktFif=v?y{hmbqhj=n=-HiLxMCSJblfJ&>`lJE&zkF` z$Ab4(Cci%1oXk-7<ki=Wjd9AWqyOtga0_PnEL?nlpIp=J^41mWl9pAt*Z<wNjqAoN zozHpaC#8M(yZV^#Oo#p#ix<r}_g!{ZCacvGEzzStHh&9#tQmDctZHMeiR8tJG0KKF zZ>h@Lg+Dr~d!g6n@*AJ`i}>e9Ps}itj0}>wBUSM@*nQWF^7-A1AGWUtpLX*)nfa=Q z+p99(@Sg`{*F0?3pU3jy@wA)eY!$tGrWd^|3t;$|oR($Exbaui?<sdw7YVHXyopn2 z#S91Q?+h;txu57MUs+cx#pEh*&XVa%MftO5GFDRlXN?)7HMEbff7dH>`=n8y(S?r| zzurdkze-~_VRV1LiC^q@jR1Gk)TAe>OYfU<M3xFHYMp5JUD4#jv1-{zkND@Wzj<2z zsW-!m&61j>q4~@A2zYP=>$yF<D{&>JBb-M+Ja@OgOU^?1KP_8XGIhQmI<fRnM!ueU zlIcO2mZC>jm5i(VRYejy#J?R|EN^psmb~LP)iPy4cb#{Jg8eRYmMoELuF&{;D@`$a z#h2A*AMVc42-~^)XXc91ZibfJHG%OKO9f}8GwjTs|0`#+gLAvXX%Q~{h!!u0g?Co8 zn8t~0n3d2JAQZ4cVT!Y`i%GF+nxWhoVWoBUs%HBYvbbAcXFXW7x;iSl=*sQ0U4Qkq zwIr^&$iF=I*p~F^tx`v(GP)L=H7!qZZ~1V)pSyha!H=sP{yfokxc2$l;=VgNlP<~& z`ggdoUQ0<~ic{|S)UjUN^kC>ZJ?&c(l1lfyf|8D}5Yd&h)V?TTDXyEr-THdd)uY$@ zs#nAwc)o6*m$&zpUmM*P>&qRGpB-=g)A95a@w4+*RYy(~(^e|^{r4}=13iB8+pjNu zHnbIaazwEB%k}pmOD3G3YCf@S-Z$0{^X+msTHew*5qQK!>sdO(y*rOy+)Nky$iL>| zncvT18{*FG(muR2&-QR(hs*J5<_XneCw!~7tlX*H&!VGNURyhB-6@xxg-u_lz86@h zeOc{w_yMDkeJqJG*(D0IQnwzsvE}+=!Lpm7E${B?ZTo+_T<e-<Rj!xr!z`nTs?!CQ zPMIWd!Z3b+;Kr{L`?b$=y6kc{yS3-n=~=qEj10-K*EtL)dgQamt_qu}-sxghETxxa z`J7WQI^%Bs_O{n$DXHfe84@M4MH*&YjB7KR#-GP$$tbw3JpT&QfyHTWW<FV`6DhRl zMyUS2zo(P_$K0JUVd>4Pr8}(Vh3!b{Im@*ztm|Id*=MiZI1bD(vn<#$TThmW)A2jc zfdjt}%z1Tx_oI25N3@^SRsVYT!{T4-^v>%}-@e{0eAzO6uhhK%n-)z~IjPK(+{@Ik zykyeKX-yolZ%$vBGqE}E$A_g8jy^fSD{tpsd_;FAcOP@Z;rOzv%UAF8t1;B*R1TPw zwCc{Y#x-{xts7YkJq@2l%sd_RcDZ+3g>FjY+1t0$r^|@X^Ur&5#KT`GQ6gJ};mt;g zXyy6yH=O5Lx=iTp6X}m#krQ8w?$Lc@el1Vi?SdHBam^=79%~DVacMLy<l1ELEVXs- zZ2?!O|G(oNJ*klUcw*Ojq3f5^owiMgoc@2CuG6-F#@oAFKUhZ{TOJi_{q^7qk2Bv^ zzY2YNDJA-E#A4~mjo<fg^RNAL#e3p~^VMd({GWXtik7f?i=;T!Wv3q(3yju~5%>5V zJE!<<SNb(Bo#iXaGB<7fwbAXVL}Batf6>>km{bdNsMN(VfAU-Xq`9_?Pu5v|;VxZ< zo;P*dt3PQUa-43Vvn=KIcNyo&4M*>+e?M7x+W*_4S>C5bm$6sed9E9}$9kvCl25D8 z8r7JXI+ndEly4|Ze^D5JJ97ier%k&Vcut52JX(>v{~uG|kx!LAK|GUV4=W~dm&%9E z6+HcoJGZ^dA+bu1LI3PEo9x-Xr#MTbV|bpid^p{@YTm8SnfX;+i`oCJ)JW^JeD-#_ zlkWksRoCXNHLqOjVq+uayE9%r#ZcM#Op=>gV04D-NBwKNvsoG44c}(G{m1Y3K{DsP zy|8RiW6Z17_pGMvyU#M^ukH)YJzX*9@}|T(m9|Uo+!~-1$<Fsr=aEa7gMD<xgwHx6 zwQ93#c6Z1(%+a5|)@Tyby`PCW=0%MGM{e(Y{-Qd{S@pu+k854tWo=l#MbA0B#PY24 zlY6sEElgNtKFj?0@%YK4bv=S!zxbcU{0e55)KKckxpeQo<v06<`={=7Y%IK;EAetc z{~jeZv-3rIH~)$}*>n1^PV?z!y}xWH6zjh~yD^aWL0gFN_Pd*|vMFZ%<C;1%lBqzM z|AbEGm%{2Q{fRoFlk?t8jXArcy}hVTeX4$T$IJ`UIKHfj{B}8?Wlj`-VQuW%h2l}` z?^G;Mb=w&8|G2@f({J8)UObku^RHs;UAL>wT-TPqF)t3?eQv+p%FOPBA6k42_rCZp zyKs*$N&d3m(;^p_|3y!f?5FSFUlIB1&U*dEC3VwoN_+d+DfY;VcFfuG|Kp)^;WJLH zzVt88m|eWsvOnKQ^mpEkKab@<eDKbka&!e#wL)e4PWw;O*ehRMe<HNIx#LcQE|=qf zoeREikKL0EI`WCXf1kz~&)?3OedmAecQ%)ldAB0hVd7WyXZ|1Kmoyz-$69&guya`# zgT|?M`%kQ%{o;af+SfDu>(ZAgt+P|S_iI%^dC@=j|5`H~e7ZCE+8<0*Q`dRU^j?=I zSayB-_2rftZV_^(MYFuNl=qw55bRl$^o?QXuZLwnehBI>USMha@7wO=cl#^lD^2%* zI_>}4(};EUj?LER6z`wtT)ZpN*2PW2Z=cROJ57rxfBNrfWUXxZ=C#J!()IJwN6#*| zon79tYvSkln&^``dv^R=QSr%hW8M>{>HqJFwtlHTm4E1IrT@ueVMV47HqUtV&@)hP zUfIp#r*BU?Za>p+N9&&VGiGxN3O{=FIHIi0V4u)!W6OzwQ@U@=JMwYnoD1(Ry6<0Z z@~?z3>_h4Q(({%6jZe<pc$8uLiOu8IyBOp5noNRUtGQI}eBK#f_U%XF<Ij`2D*ZJ- z-I|;5%yy}_@~iJ6FZLY?-oO0MmvaH1=P@ZP+;BhG<&w$s1G%lA75`Uzy`P_buF{{= z?EIJg%T<Jxe%n5^b#i+BiiJV$?l!wL)9qr+7cV_&xiZth?TY>1sWq&nvS<5*G$K!C zF4CKSXUQ)Iqie!R_Of&AcyEM--uW7o{Cey5@21<mMWl13<oI`kl>ZA|zi#u-%=dbB zqPw1`i+Wuz4NvF)@?!4sbv@l|X-|Hn?29Yf-ue6Q`Twuw_aBqL&&^;GEBbx@e5Yi$ z6@|a7Y&X<xjM?rh+uL~RaYMTsi@Tl4BQ15dnX4=pac*_v+#+tbnoT3Xxa5KJ!m2N) zo`=SJWp3MP_3_c!j@bfxAEYlcP~GYJbMG(N{aV+j?z`h<{%d7^pKxQyPoWJLm{J@M z@J%gtQQoZE&3HHIKX*VzUuZsqNE7FwlX@37|2Yw|Y@4^v!da8tGChwp=*>I5_058h zQ5+o~lj71^b}Y$u@pJz=D{u1F<c@DTPsPs_y1)Ij{C~qG-EEf+O<QFq`FdJYOWFRU z)wZhcd)pZfxKxLvI|f;p?7S?t^yrMKYFc}QS83*6iE5I#F-xteHJ0N@c<%C6CgwDc zd$&$54lRE<dxEaY4cjz#AN${yClcK)wGQvQt-RR2>ias^TaN8l9#|>cFxx~0Enj<B zURS(-T8h|@=hwAL?^wB;SaTU{Sh(HX#FN48+M_H<J<kbC?oAbRJ>^{+q}^IvbFnNs zBH;kfS!wIaEw6NHh1%pzZFh9%?2gG5FF#w}e965uaPiVtE;$P|RRvh9WP3d~T)pu* z*^$k1*QIC`llEy%eA$c+{%R|Atkfo~X4?JdR-w2pkI1Uu6H59r-rZtc;{1QLkoaUC zpOsIiDrVVy66f)&j-Ql$@~WnIFwY_Lx+^6+n{)K8rzp;w>)w2==~mR^30{j{Y@Q?h zv&>bRAv)^Vp(W|;`}SW`i{QR%x?g&W?d{6ho{uu@eYq!vE}XjJN!x7cd9wwc#Mk%M z+<U%0$lUBI{{lWOu{SsNo~sZ0?l_%=fotWTw97F+6t!om>s)wtD&ADiQ%#_L?;(!& zC6<=vlAlst)ft*1yK@sSA8s^$t<vUNkY}{y=GBZSh7ZBhPu#gQtwMLp(x<xxUT@er zO+#(PYnP-qo3}AtP<K;1rQ6<>qvoHw>Y_=ELv_r*JL!80FO<2Jzj97?bNcu^pE-Ql zc7_YLgl;TIlbjK(#CR)~HE1t)u&T&94zmD-v&r{#_I%!*mcFFWv~SBK-tFgfyDzaN z&Df&2{qg;Dj*ZbL_*ceE^_if}(p37f@ZXspJ}YtQN&fFG9tEx|o_KctnTYc@1L_%h ze0FJt#XjCKx9`>ew+`2=mLHZ|F++LQjNIh)j~katWo*@3*3k9Uxh>`(bEW)j<paSj z<yE<hz4MNr=TW`)LFzJx_Z7>|drs9dOL<ugb+^jD*%uU^@@<y1<m?<d<_E@Q{R&T$ zSNpHpo}=e!yu<46v=7E+F`J%;PFq#%U~zCqcTZ?)<_WPymoKUmzB$P<>xp9RliJiR z4}&-P9a#R6QNw4knD9=~ddv4VMs8CT<@EWxw%hEs&T)L=`b*X2^5UaL8<X$1AKPFl zJT-#z<RqK3uFa-3T&YQ-$=zJKk(<9U&Ger4aozVh@<(>rdF*&!{x9wA=e6}R=Kk+< zc1QRG=1uR*v9T>qH4grs6R8(;+H3bC*`v#CW;V<<pAviXRo|_z_K)-x^`!fkEU`VG z$@6h{@xNai-#^$lx1d|L@bfMQo)!1B_D`<%I=W_4a-Ml4)5Y!IRgPBNG}M2;WRAm= z71#Kp-Hz41QE7>-ia8z;t&se1($kC*x0@4nkGvN0<&g>788tat;~C%AhmUJwf34c~ zPJydK-_Z2W6w#WJ>-}TUGRKcK`1BG^;nqq7QYrPQQOTW`Fsmvw0;l|2ECh<)3u< zb7@@Ov?G>G?@qrD)>C8mzjxPuf7Olb%`+^PAKt!K%-AF+uZ7#`@W<6TOD^m*KCUVB z`b@u`&BFyn>>s-flYSl8#up{EsWrnW=Ioq4i}o~**s`<Bz2oc3KAcWdWANVn&EL%O z`Kvu|d;|ZzKlu9I4DR$;=8TFZ$K5o{civ{)UThdBv*&JikYTS;>~71an&0m*>PM@e zIaT^oyz2N&<_yciuRp$=yv?~?X<k3e%BeSh&DhYtce^56$P<x&JJ<h<oN)8ig64*1 zR#owM%a?QYOp>`T{(2#n>2J}kdUk=6b){y>qqPT_8dNN*cIR1m&&a)ME0()_J(EC= z`u=|p<{h*Q=M3?=9iXSivi#5MyT%pgu5ucC^Sn3IyeiL7a5ux2H6ush;F9H!RwsDB zSG%C_T0T*(`h2)w=8|VpT18y{^Q1G%&E}T8U2-_=;R%hy4Zii$I^?XUC&oKpO3*#B z;>Fw>-(!R>@krgDzLf2y9b>oV#V7Y(hx2)I)mc0&Q|OwsJA*%_P=?{dBhKwCRc%h! zCX|ZzICvKQ&~-6*yW_<wj?%KT!Dc3P*EICJ--LgCWtBbm+dG;0D`cwAi%orfsAc2r z#hV@++F=whHMl}Nc-3RKd4V<z4Kp_CI>$K+FPX7r(?st{_gs~hMVl!~UaWh*#$%6I z(234JGY#w)rBA;TTcWh8*6+H?vSmNc2xaR9zh74W@zh?o;BKD->*swkPt%y9829A) zjCsNvW_W!PuiLq^lOtQ^(y4`ioG%OISS@>WApX+E?;-2B_IopFG(8Jfx4&YvQewLP zpJ<bLzUJbK?i6r5T_3Xhov()STXUAkw|rJ%nI^K)B_SE9(QXIiKVNeBuFLh7%j{#6 z#<JU%$1jUM*JW=y@?Uc5iH240CrdIs4*stAUF)6ERVi)Ot-Fo~n#YT8kdih~R!lK8 zR(bR`%1mzi26yFk&YMHt%vzq$Xzsq%dqL5gz2{fX^O?FVSa*fgbp1cwsToyVMzW$^ zIaL#5KcC*|n{6aAhbwiFh;Y1KR`ngNHok7=+Vf{MdAiossK#-hUEI05{p8HZnFhb# z#MI82eIkU_y7<vM*UV{oa)z1##V-?kr>@r9-G6EQ+9?%0Cq&MiQA{z^S4@a#m|5%+ zAsMktEmBo_)v<fk`$HyMd#40lefBWKXW1!<-K9pMOCEn}ZGIS(TfN#Uu48fe-30<7 zy*17YvTDw1O3x1CRLFd~#zZxad*?=picf-tT^~b#XYM<2!{@=dCZ3@1uUpyf=U!hZ zRo8Vle|GvK&WTMY_gb_~IJ!r9QG!6b(z-JX)?Zf*>Dl|eZmFMJ*qOTO@`WM3%T8GZ zM`>mHJxu&DDcF45S|*2}r#<l<p?ywq^VI87q6*)hU$pH)x6|E84{Xfc>L)R7Sn$@e z-0IjYZO&VF+dEcYRAzZ+dFf5}griH;6x9{`Ok$5*JwAQod1eN!WA}dlxHmn_dZt$Q z*Zxa$4xJ1*(fxUi{LD=|ER{3Qh#9%wQHkTW{n50&M?=pi_iUa&^Q+J5Zr9Xe4UcS2 z>^t&C$X<Jilzn$>x{qDgib-1ySK3IvsCUfyb6+v)?2T%!VB48m-xW@33hAEvQ?j(| z^Vave_8v1XrUf4P;;piLiRt+zM=Lf-1b*>dq9NG*^8JKr*HzUXM;iN`bdo$58n3+_ zx;TCMah_94CWqOC?D=36n*3gK!+Gb%piPD5AL_ns^WXVui?@R8bp1;{$KJj2@8^@A z<yRr7rCPn#dHc7;4+A+^G?&#!CGMWKfjKTZlfg*;^}9#@b8fJf+ea`u@^qw^>uzMu ziwmE$RB!M788OW>XLBYc_7v>g`S_Zke(^cR4^!Lf|FUf2PMa(&cq(Fvt)5?;dECqk zuboRT9bH|tQl|QRG{cb-H$JRpmn-p#U7Ts7(cCph>3p4a(%Y>ME%H1zZ%s_D(Ynuf zr|{?%HGw12&-ruqYOZ`Z<4M!jiy}J<A6Y8%@c1im<gd2hkh)#8nREJVKdbZ?ymLMq zB$_qqORV4btnqE~r2do(+j~m?Oxy9^CVG}~lcaIT?@4+$6J|4gc=J}G+CSBAVtUD* z#bIYz^K!EEDpgf>RJ;;+Bx0;{PD(xRr8ir=#q%?}LsY+~#KzC9v?=EfKJy_!Pfaf9 z{S&#`%QKzlB*hfF?>Q5C?ZLZ~#RqGR3pO5jQ}X0=n1tXtj*HhjdwOg_H&0KFw=BE2 z{KVro?<6O=tXdlW=D*SLH4@^|J74ef*WGgN;<q0M7b}TwzVF+=vf^&o8K=^DxBQeu zjcwmn7ypfEy<7e5_q&i8%fI@Z{rlvhV5;1Cl?K*pJ2$zrXg~d0+{g1P>bJ~4qx#h! zPVsVae)Bvx_vP)o+r=IqW6@4qYI@Qx|L8lrFKMTZ#ChJm5p3MKUwqRHg^tKGi`Ny2 zmGA2Q|7ySJGeM<?eG4*XZV>Qd3SRH)x#pO1rr3@+zFj4bH*1^n^rYYCDNc_n@lVzC zGx-&tDXu;{pG#+{u<WlSnKVw-Rr6$5PB7NheE9d@ncws6=l!&=Uz7JPb()|15`kaN zxBmMm6?sMN7d-RAQ~kx_loK-&g@0+jy~j~HVRDg{;*%+S_F}L6{9f^wIvg<QuH`NK zaQWV<Qzuiz(r&G`e9_Ix@_VJv-vdwntA;A1zmh!5@XYPa+V~&;n&tlg6*pQL-Cww> zX2%&-r6=}>>whvo{KLy$9(i_3ie3A;<*UM3rK+aAbS^*sZ%^czZPm%P|IJ<;&dFRh zXHxx-#<zdsEi}}YukQ?HW|^`jB&>a&vi8*t%S~qJW?Q`2`P{T=Wv7qdw}OacEE7NH zh4VB<e3{F%pU+mTt@mo~iCJHYZolJ5^4D5<=V2F5&@QPjMb?1{f+q_PRr(a2;H~~M z|D0W2l2%BVb&W_}tWVOpNqX8F>z}F@e+}k~=nl+c5T31fs?RvUUo3AG+i&hDz6C1R zEhZKpuSqWF**cdg?`BPJZsROz?t*=s3G;sZ)cfK7fAP1Zw6*v8cU9TR3nu>iUwkD! z>W9SMN$vly7+ml@a_(s1ocfNK1$+&eA1^gMR9?5ZpWWuf)A*X|z}2ok-c{<o@daz` zALpNc@@f4(^W5)?#oT0XybscPtGDR=_bJ;egC}_}efP+9-7UT*bIlV=H<ey5wA45z z%XQ6T|EKr={&(2_aeljL`eD0y9TPr$5LBP<qiY;5lymySu6JL$?>!W)d^Yc@w(80s zuUGzjvU=Xb#ZPP=XFGnp_E+!d`P|C?lhl~*z39)2{g}Cbxrdzbx9|p`*WY%Fc<gvy zUsTpv`a71ZBwppp+j7l2qM!Y5v3#vQwW_S*`|c@6Hr4t6oW0+^;_de-qV4XwPu6-L zJKvzJt;-NuD)ZO(s>`alPdwMoZ#<Yehudt@;yC6Hmks&fsi>Lx#mZTw$X0XCSg+~u zj%#a9g@h<i$j({)tSZ-&ug997T^0LawS4o&S0&EE<wC(*cfNeWes=!R%U(_E7*nIv zuGD2r3DK{aeoiX$!%4UL*}A$DyJJQ7+<$fQ*<XE6^<dS5r~8<9i6ws)y1m+#Er4%& z%-jD3&dNO8_f<8RHaInKM#Wd&Xyj+roHNH~D)Tb?tW)P1E*LBS-ZOWNZ=XhH<OCUW zug0=liy3?hzfKmAy;-YLrFxb7{?n^F6U?8kwVM8pz0b`rYDMw-bG-V>nlfH#w-#+- zP@k%tE2+5R^<hQ_oj)plLeI}A2=Fg&7Z=q$GR^s%*CQRv|Dh^x_q;t5Rn)LJ>5<WP zj$3zk|J&wNGG~$^yPNcnsCmcdt&Z@We|6U#hm|ou^uEpAEy!Lrt$*+4QxCE>@1Np& z{N1gXsr5Z7x#A*kXJzjHv?nX_qeqj2=4Yb=K{qemX1ZGJFU9Ei?D(`I?^Dy;LYKu9 zsh_g@-}sGl>fG{~@hsDi?lI3(niiV3Q0l9Qk!H?!t7k$jFMRc+Z0Ci%z8AjpL+rWv zZc;}sy-?qM*|aHj(e_v8w^n|;zSGPiD;CuMJjt&cY!$2;>&5Wnyu*(S!8<RinRnbd zcj!psgPD>H6_;K+&baZ^zg}p~=Wnm4Rc$Z3XMJ_O?}z6*_PE|yIcq^h=b=lBZ%ub% zX}xuCX}|97#6HHxCC;n;-_)NqYCpvAajVCNRFjK)QYD=)sp@H{>rLogwCJVf!>+E? zcQPyf-dX8owNpLn`P)v#w^NlrPcL70U+XJ(%sr($JD;`v;IN#!w$V_fA?@Z5^-4pv z(wb}M^?dKGxbpOv;`9*x8gcGTifcW!0xDl!@xHQ7`Spix!EYO@Or?uiG$uTols3y} z>JiOkAFX;Hm$J_Av-961%ltfa)m!0Vo5H<MQ|^C$@aJRg-`tDMyQ5pIr!=4F56%;O zr1ai3UbP^MVaKf{8r_fOR#m;cq`r9mGH315U(I?!dq2d^ie-;8^HGo4;uT|UI#+ME zm^@c;&{p>a2i1aAmkQl<(s5g0s}g5w-_ZI^n$h~b^G{>-e6gQzx%MBrf8S%$N~<Y) zJGUHqq*%hg?Y{&=L*4v-wljyE?X*sN1?c`<V&i+Yt750khDP?xU5mry)K~&!laI=; z-gK6?y5aP(>UsZncke%vYWR6ZEY~Bw!earmzinW+P|y|mVD^K4hodW&ZM(C}qjlZK zbKj=UF8@};@Grvm{x?Avo!Ir~JUs=X`KHgA%rt3@@ayL%*g2-|jxn`+!t=4K&^-M6 z>Fc6uDcpPIoS#JAusLITZ;iG1bZ^du(+{7my%lk0`Kq7WPV*m3O!*bt5o6_ZbeD7G zRm0uCGIl#~^Ey?r%sOcC{_@R<4wDTRESixZ{YpwscalZDS?Jaa6Ru>`)aE)CS$aIV zq;R#sBjNH7rs?-*H>t>VwnZ!din^W^rDUL4ouU_PU@rULX-V^{ANGrxzC>E-dmp{O z-6OU<exB2oq)UNf@75hU8@+u04$ICPPV47=-1J{Ov+S7yKezVQ)bHyQ9xvl5I+*-8 z_I-ci*HCGXMZx~LyKY!39XK#!5<|%z;k>!k`jKa^?prT@;E3VPQZ9x`lUK*BuGi1( zG?7_VWVrj{_B9XlfA7ng$9co4{zLljdsVudd}?_UiY;`Oi5>7LI59t_rX$AgRH9*c z`Ubv<@(Xh|oRe8NttZMiocH6u#9tP#%=jg$mcLbuIdgHM`Rub9tKQZtCvn#%-(@tP zn3~1RR>pFA{xJ(1MQKsd`Muvg_8oe9v~S{}O$xu3UrT-;x^8*;BiTJSveWr5y=R$| zzvHLX>yDBYwZ_VwH=XJ)&REp+_o3^{U2e^Wk;<1u#FAE=@N}LjyqQ_lH1e1%JKv`d zLd!zg3T{;RYovUR35<W>ue{D>+UHCi;iQs;Yn>MA3XdP<%~XG+lGu0o?yj(w>^Yq` zoZ>U*na(p=s*zY<5x8aD#cdzIS7|iNk;r4WyU}E#es;;MYX_Wyk6!$o7R!{-Jz31^ z^RFu2$=<C8Wb>t;u?jA`sxKk&FHev!Y0rUkQW0h|mPuH8pHQ5~Fk82bOT*!RW2|}> zccxe1!G9k<JyrI-xXbPK?X!&e<@<L%dUe6uqv(>swm7DQ)y$s*AA1;OPERteJF~pj zSdlZrz;~+X55b=44cGtN2+Ct*HCDTRKJ*9cxvrZ<Pk&YZwUVD)DmsmKPwvLe%HC=U zu6b2XCp>@uR2380(rU8wMM8Z==HXp#;xAjeU(Y{sP;2s&C5bYUM!PS6Uw3Z0<tmS~ z+%n~!)$7`R#lBa2yJvG$YHjE7q%)@0o6VCY9oyeNQe`~(JIb(TQiqQ34Y5m8%J21Z zeQOtA`dW%L!RN(^MmDcmli9eqBeOr<G}M~z@Zi|qeV<-GFbU}~o)r*Xsgrh?!$@kH z=%gb1#F@euj+GoS>U^<Y$Gd6Ug<BUQB~1f3QeR849%yemGiT)q&*lve5=E!Y+_*7f z4dYQA<0bk@b3SuuB#K`zC}Z+EF|*WX!UEkTmaeS74|h*0?e$usZQJXqRn+yQ;!tmO zZcpib;Q}dk{+ACII|}vl@x|`h5`01I(u_sTe;>O3+~rmpT7GsltJAFDC2jL#s`N8k zH@FEOn)rCe+K7|8veoN_`{u~*mU}#FaeVhJr&-2}8vi~_ou(OeeFg6%$N5G<scG?| z`iVN8eiKEuL>VmTiM^)fak5jpf40`dc_y30p2T_WnX`J8S)_T!yKtqo0-~OVmeS3t zL59{#kKVcFG%L7dgZ&<jsOuSrwd?F9l^0!FYI%r#(i|mClYRPE9Oj1~XP$qjax-J2 z1K&L-hFw1AAFO-b|NKcb7v~daTTjD_x|>$_cZ+RmT_<^Qjp$L!`mc+dzO_#`Tbmsc z>NinHq-`EM%VyOxuFS#jPu><dUTYY=y`ibxviNLo;MUu>Rk%|Zi7qZUeKwT8q+ix) zTfq06PDht`iR)JlMW&VZ-jk0k<Z7DnnosrFf$Je5$|29cDl5)Dk*A%O`(pONh>Nit z(+b$%{>%P8<>>axx7Cb%MQwE}*WZaQ)ptMV*tH{&y@*d!yKUclSJ{A+4LQGE&KY$s z_^S4K#S_u%Kd#rl-<JO;TF$KQ3<v9(&%4+BWsfntmv%4pBcmlV|I`Kt?)hK8y<hDA zcT$a^r0(iI*BN&9FS-jg<$c`Dq_6v?pY%K$dQL=g+8e9QcmDicTUdMXzoga4o9RVo zyLfiyxRw;%xNzs4@Owq4CbqeTaspQO){5V$a<rIoFo)}2m;8VI6EmNG7n3-U_B1{9 z=lKS9OYi?HtrVU=*>QUM>iSGqCY4K1S{{oFS{%J+HcPhMdh*$2)2eoCmdVk2F0w&* zC-1b5=A@j=F3BF%{H^SEzfO3XpD%yoAQz>&d}=QT|F5RD?kbBDwU>TNN-xutuVS1& z@%X#Kug-Es^Do>_-|Vxyb_J{cr*jq>X-9HhkB2lizhmd$`MR;A;Kzx}Uq2PdPS!Ok z|8clI*z&_38}AQ7?_G|+nPj|)Gi+bTi<^fgoX($OvAL)~Yv-LsN6fXm`WL>xq38N{ zPN>zq$>I4YBfaK?%7q?XDf1+bZ}s7jCe1a6A0|9(Vam&Cy*uUUwV1<>hOT!+b=Df* zl#=A@I=S@6s#WJWmlqyz`+3Y{p4_|M_WK;0jeU-UoSZ!Q>82S%RUAwQ4=;N+OE5e& ejr%~Vp%{D2u}oH;=|?4aq1)Qu{`<_s%m4samC|tl literal 0 HcmV?d00001 diff --git a/public/images/slides.png b/public/images/slides.png index f50cc5c013ae4fcb841dc075014b5c2ce727e643..83d6d1525a43b8b2a81f29cc8bb5dc037b8d22f8 100644 GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0y~yVE6{Yj0_A63}-XlQyCZ-CwRIzhE&XXJ0q~~umX>Z zZefE==jvh=zJ@1X&p1pvyY5%-YK1F7^Xhe~H^hGK&%SXw{@>F(8&*|+j&ql((v=NY z<?PR&z}&X<`i5TryU!oUURP-EU)+0HOPXI?aOUFFClljYHPe)3<9}{F_w4`k`^#c} zg>_u}xB7qWF1eb0aIvhQ!%G&Qo#*u(em<8y~M|J>9zHL+Sr&zC1-mXP`4JH-VR zWe$)0B9DBE|8--o_l1W6E^U#|yf*sS9LWtmD*4rSo97OxUB+q~Gap4-+&R>jZO{F6 zt=;=``l;(T9C)m~zwG&U_E0BtEjw=e=hAUAR(;X6+g<G0XuGm*k-coC#WAVb%1qf? zKi7WJ*|S3JhZJ{&cHZBk-{u?)tUq#cfv*1M4{nnK+JeQ_<fqMRS>HHAmn}Nv#P50a z)y4K-c^95JwP9HcOU(P#x0Gx*zL{aeeLV22sma|xFYkZb<KO-xVByh(#n+1pr@e@L z{ifndJ4=nh{wo@yYOzx9KL6J>bH8rMJ$>JE2Q_WqGoC-%zkZrtZ~C9{|E>!gqMP{? PKyl>h>gTe~DWM4fAS~T) literal 652 zcmeAS@N?(olHy`uVBq!ia0y~yU{nKPMg|53hUfbk${84#f<0XvLn`LHopmwyumO(? zX9h$6lB=eZ*bNSRdZ%IO$-O0>)g{6}$i3#Df$PL{t7r8R(`~Of+g`B`Y`b{3UDoj8 zTZxY^(`5{{2!+%fzvHUByuEH4L*`nCxnjbJ)59N3N+{kWzF1G9`VWu)kyF){UV&$( zx;I>wY+WIF@y71ucQ^hizLW2%X<RthzVH3d?C`8<f-Z$iR9#GtRjfDI9lRli-O1YF z@TSKu)58`TL_|!PqjO$)i~ZlN+Nq~JXEyAtjSRg0P1oV5)pAzv-sZ@zo8Lc3i5!}F zF5u~vQZGM_Z$ctsF?kE_I9vF)-aZ%C()4Fy#D<k3KCYqC+ZnE2lKj9fEOcO*q}N@h zDa&TI8wI|U`CRVu-goK5n<sWY(=z?y@?A<~UoYQ-W2r9f{GSq+vZ%h)>O8*So!&!- zk8#bD9yQml`r+d(!WY*R<oVE-|0GM9d%@jqsavxreF(I;U32Zrnd5QIv$!$}@-o<( zJUVx>EIs3LF+F#xR3>{{C1aQ3o9R*;&jh_<{#abf{cYKmQ%Q+0Z*5Ym+<k2i+tPw# zX|aX2dS7+C11529S#A|@w(|bg>foxRxTaXH?`8g+r}}Odq^7U-eE96w{aKm$r<Mq| zZRy{<_UX+Rui}~)SqYr*J+nJ}{wA)aif7m5v^1Yy*ZziS$~y_ivvZd8b*QYpd$(z? zX4>L?QWZw$-oAESamDVhm!=9k&(Fm|snb#?ztVsGs``3*wbp(94GT@JUq5!en&)S@ z=<|Jn&%V=N@BQ`s_On>cRJFg`k8VwkjA*Ige0BX}0RPv3|4y}xa^l=xlhj(7K*`M0 L)z4*}Q$iB}A;2;< diff --git a/public/index.html b/public/index.html index a6e10a4..4f51643 100644 --- a/public/index.html +++ b/public/index.html @@ -4,7 +4,7 @@ <meta charset="utf-8"> <meta name="generator" content="pandoc"> <meta name="author" content="Alexandre Strube"> - <meta name="dcterms.date" content="2024-11-13"> + <meta name="dcterms.date" content="2025-03-13"> <title>Deep Learning on Supercomputers</title> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> @@ -227,17 +227,17 @@ <section id="title-slide"> <h1 class="title">Deep Learning on Supercomputers</h1> <p class="author">Alexandre Strube</p> - <p class="date">November 13, 2024</p> + <p class="date">March 13, 2025</p> </section> <section id="resources" class="slide level2"> <h2>Resources:</h2> <ul> <li class="fragment"><a -href="https://strube1.pages.jsc.fz-juelich.de/2024-11-talk-intro-to-supercompting-jsc">This +href="https://strube1.pages.jsc.fz-juelich.de/2025-03-talk-nxtaim">This document</a></li> <li class="fragment"><a -href="https://gitlab.jsc.fz-juelich.de/strube1/2024-11-talk-intro-to-supercompting-jsc">Source +href="https://gitlab.jsc.fz-juelich.de/strube1/2025-03-talk-nxtaim">Source code of this course</a></li> </ul> <p><img @@ -254,14 +254,8 @@ data-src="images/Logo_FZ_Juelich_rgb_Schutzzone_transparent.svg" /></p> </div> <div class="col"> <figure> -<img data-src="pics/ilya.jpg" alt="Ilya Zhukov" /> -<figcaption aria-hidden="true">Ilya Zhukov</figcaption> -</figure> -</div> -<div class="col"> -<figure> -<img data-src="pics/jolanta.jpg" alt="Jolanta Zjupa" /> -<figcaption aria-hidden="true">Jolanta Zjupa</figcaption> +<img data-src="pics/sabrina.jpg" alt="Sabrina Benassou" /> +<figcaption aria-hidden="true">Sabrina Benassou</figcaption> </figure> </div> </div> @@ -279,7 +273,7 @@ data-src="images/Logo_FZ_Juelich_rgb_Schutzzone_transparent.svg" /></p> <li class="fragment">Important: This is an overview, <em><em>NOT</em></em> a basic AI course!</li> <li class="fragment">We have <a -href="https://www.fz-juelich.de/en/ias/jsc/news/events/training-courses/2024/ai-sc-4">introductory +href="https://www.fz-juelich.de/en/ias/jsc/news/events/training-courses/2025/ai-sc-1">introductory courses on AI on supercomputers</a></li> <li class="fragment"><img data-src="images/bringing-dl-workloads-2024-2-course.png" /> <img @@ -291,17 +285,20 @@ data-src="images/Logo_FZ_Juelich_rgb_Schutzzone_transparent.svg" /></li> <h3 id="please-access-it-now-so-you-can-follow-along">Please access it now, so you can follow along:</h3> <p><a -href="https://go.fzj.de/2024-11-talk-intro-to-supercomputing-jsc">https://go.fzj.de/2024-11-talk-intro-to-supercomputing-jsc</a></p> +href="https://go.fzj.de/2025-03-nxtaim">https://go.fzj.de/2025-03-nxtaim</a></p> <p><img data-src="images/slides.png" /></p> </section> -<section id="git-clone-this-repository" class="slide level2"> -<h2>Git clone this repository</h2> -<ul> -<li class="fragment">All slides and source code</li> -<li class="fragment">Connect to the supercomputer and do this:</li> -<li class="fragment"><div class="sourceCode" id="cb1"><pre -class="sourceCode bash"><code class="sourceCode bash"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="fu">git</span> clone https://gitlab.jsc.fz-juelich.de/strube1/2024-11-talk-intro-to-supercompting-jsc.git</span></code></pre></div></li> -</ul> +<section class="slide level2"> + +<!-- ## Git clone this repository + +- All slides and source code +- Connect to the supercomputer and do this: +- ```bash +git clone https://gitlab.jsc.fz-juelich.de/strube1/2025-03-talk-nxtaim.git +``` + +--- --> </section> <section id="deep-learning-is" class="slide level2"> <h2>Deep learning is…</h2> @@ -574,6 +571,25 @@ gpus</li> <li class="fragment">One can even pipeline among nodes….</li> </ul> </section> +<section id="fully-sharded-data-parallelism" class="slide level2"> +<h2>Fully Sharded Data Parallelism</h2> +<ul> +<li class="fragment">Shards model parameters, optimizer states and +gradients across DDP ranks.</li> +<li class="fragment">Decompose the all-reduce operations in DDP into +separate reduce-scatter and all-gather operations:</li> +<li class="fragment"><img data-src="images/FSDP-graph-2a.png.webp" +width="450" /></li> +</ul> +</section> +<section id="fully-sharded-data-parallelism-1" class="slide level2"> +<h2>Fully Sharded Data Parallelism</h2> +<ul> +<li class="fragment">Reduces the memory footprint of each GPU</li> +<li class="fragment">Increases the communication volume</li> +<li class="fragment">Allows for massive scaling (100000+ GPUs)</li> +</ul> +</section> <section id="recap" class="slide level2"> <h2>Recap</h2> <ul> @@ -599,19 +615,39 @@ gpus</li> </ul></li> </ul> </section> +<section id="recap-1" class="slide level2"> +<h2>Recap</h2> +<ul> +<li class="fragment">Pipelining: +<ul> +<li class="fragment">Split the model over multiple GPUs</li> +<li class="fragment">Each GPU does a part of the forward pass</li> +<li class="fragment">The gradients are averaged at the end</li> +</ul></li> +<li class="fragment">Pipelining, multi-node: +<ul> +<li class="fragment">Same, but gradients are averaged across nodes</li> +</ul></li> +<li class="fragment">Fully Sharded Data Parallelism: +<ul> +<li class="fragment">Split the model, optimizer states and gradients +across DDP ranks</li> +<li class="fragment">Decompose the all-reduce operations in DDP into +separate reduce-scatter and all-gather operations</li> +<li class="fragment">Lower memory, higher communication volume</li> +</ul></li> +</ul> +</section> <section id="are-we-there-yet-3" class="slide level2"> <h2>Are we there yet?</h2> <p><img data-src="images/are-we-there-yet-4.gif" /></p> </section> -<section -id="if-you-havent-done-so-please-access-the-slides-to-clone-repository" -class="slide level2"> -<h2>If you haven’t done so, please access the slides to clone -repository:</h2> +<section id="you-can-clone-the-repo-yourself" class="slide level2"> +<h2>You can clone the repo yourself</h2> <p><img data-src="images/slides.png" /></p> <ul> -<li class="fragment"><div class="sourceCode" id="cb2"><pre -class="sourceCode bash"><code class="sourceCode bash"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="fu">git</span> clone https://gitlab.jsc.fz-juelich.de/strube1/2024-11-talk-intro-to-supercompting-jsc.git</span></code></pre></div></li> +<li class="fragment"><div class="sourceCode" id="cb1"><pre +class="sourceCode bash"><code class="sourceCode bash"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="fu">git</span> clone https://gitlab.jsc.fz-juelich.de/strube1/2025-03-talk-nxtaim.gif</span></code></pre></div></li> </ul> </section> <section id="demo-time" class="slide level2"> @@ -626,12 +662,33 @@ node</li> </section> <section id="expected-imports" class="slide level2"> <h2>Expected imports</h2> +<div class="sourceCode" id="cb2"><pre +class="sourceCode python"><code class="sourceCode python"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.vision.<span class="bu">all</span> <span class="im">import</span> <span class="op">*</span></span> +<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.distributed <span class="im">import</span> <span class="op">*</span></span> +<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.vision.models.xresnet <span class="im">import</span> <span class="op">*</span></span> +<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb2-12"><a href="#cb2-12" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb2-13"><a href="#cb2-13" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb2-14"><a href="#cb2-14" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb2-15"><a href="#cb2-15" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb2-16"><a href="#cb2-16" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb2-17"><a href="#cb2-17" aria-hidden="true" tabindex="-1"></a></span></code></pre></div> +</section> +<section id="bringing-your-data-in" class="slide level2"> +<h2>Bringing your data in*</h2> <div class="sourceCode" id="cb3"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.vision.<span class="bu">all</span> <span class="im">import</span> <span class="op">*</span></span> <span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.distributed <span class="im">import</span> <span class="op">*</span></span> <span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.vision.models.xresnet <span class="im">import</span> <span class="op">*</span></span> -<span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a><span class="co"># DOWNLOADS DATASET - we need to do this on the login node</span></span> +<span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a>path <span class="op">=</span> untar_data(URLs.IMAGEWOOF_320) </span> <span id="cb3-6"><a href="#cb3-6" aria-hidden="true" tabindex="-1"></a></span> <span id="cb3-7"><a href="#cb3-7" aria-hidden="true" tabindex="-1"></a></span> <span id="cb3-8"><a href="#cb3-8" aria-hidden="true" tabindex="-1"></a></span> @@ -645,29 +702,29 @@ class="sourceCode python"><code class="sourceCode python"><span id="cb3-1"><a hr <span id="cb3-16"><a href="#cb3-16" aria-hidden="true" tabindex="-1"></a></span> <span id="cb3-17"><a href="#cb3-17" aria-hidden="true" tabindex="-1"></a></span></code></pre></div> </section> -<section id="bringing-your-data-in" class="slide level2"> -<h2>Bringing your data in*</h2> +<section id="loading-your-data" class="slide level2"> +<h2>Loading your data</h2> <div class="sourceCode" id="cb4"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.vision.<span class="bu">all</span> <span class="im">import</span> <span class="op">*</span></span> <span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.distributed <span class="im">import</span> <span class="op">*</span></span> <span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.vision.models.xresnet <span class="im">import</span> <span class="op">*</span></span> -<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a><span class="co"># DOWNLOADS DATASET - we need to do this on the login node</span></span> -<span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a>path <span class="op">=</span> untar_data(URLs.IMAGEWOOF_320) </span> -<span id="cb4-6"><a href="#cb4-6" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb4-7"><a href="#cb4-7" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb4-8"><a href="#cb4-8" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb4-9"><a href="#cb4-9" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb4-10"><a href="#cb4-10" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb4-11"><a href="#cb4-11" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb4-12"><a href="#cb4-12" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a>path <span class="op">=</span> untar_data(URLs.IMAGEWOOF_320)</span> +<span id="cb4-6"><a href="#cb4-6" aria-hidden="true" tabindex="-1"></a>dls <span class="op">=</span> DataBlock(</span> +<span id="cb4-7"><a href="#cb4-7" aria-hidden="true" tabindex="-1"></a> blocks<span class="op">=</span>(ImageBlock, CategoryBlock),</span> +<span id="cb4-8"><a href="#cb4-8" aria-hidden="true" tabindex="-1"></a> splitter<span class="op">=</span>GrandparentSplitter(valid_name<span class="op">=</span><span class="st">'val'</span>),</span> +<span id="cb4-9"><a href="#cb4-9" aria-hidden="true" tabindex="-1"></a> get_items<span class="op">=</span>get_image_files, get_y<span class="op">=</span>parent_label,</span> +<span id="cb4-10"><a href="#cb4-10" aria-hidden="true" tabindex="-1"></a> item_tfms<span class="op">=</span>[RandomResizedCrop(<span class="dv">160</span>), FlipItem(<span class="fl">0.5</span>)],</span> +<span id="cb4-11"><a href="#cb4-11" aria-hidden="true" tabindex="-1"></a> batch_tfms<span class="op">=</span>Normalize.from_stats(<span class="op">*</span>imagenet_stats)</span> +<span id="cb4-12"><a href="#cb4-12" aria-hidden="true" tabindex="-1"></a>).dataloaders(path, path<span class="op">=</span>path, bs<span class="op">=</span><span class="dv">64</span>)</span> <span id="cb4-13"><a href="#cb4-13" aria-hidden="true" tabindex="-1"></a></span> <span id="cb4-14"><a href="#cb4-14" aria-hidden="true" tabindex="-1"></a></span> <span id="cb4-15"><a href="#cb4-15" aria-hidden="true" tabindex="-1"></a></span> <span id="cb4-16"><a href="#cb4-16" aria-hidden="true" tabindex="-1"></a></span> <span id="cb4-17"><a href="#cb4-17" aria-hidden="true" tabindex="-1"></a></span></code></pre></div> </section> -<section id="loading-your-data" class="slide level2"> -<h2>Loading your data</h2> +<section id="single-gpu-code" class="slide level2"> +<h2>Single-gpu code</h2> <div class="sourceCode" id="cb5"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.vision.<span class="bu">all</span> <span class="im">import</span> <span class="op">*</span></span> <span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.distributed <span class="im">import</span> <span class="op">*</span></span> @@ -682,30 +739,9 @@ class="sourceCode python"><code class="sourceCode python"><span id="cb5-1"><a hr <span id="cb5-11"><a href="#cb5-11" aria-hidden="true" tabindex="-1"></a> batch_tfms<span class="op">=</span>Normalize.from_stats(<span class="op">*</span>imagenet_stats)</span> <span id="cb5-12"><a href="#cb5-12" aria-hidden="true" tabindex="-1"></a>).dataloaders(path, path<span class="op">=</span>path, bs<span class="op">=</span><span class="dv">64</span>)</span> <span id="cb5-13"><a href="#cb5-13" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb5-14"><a href="#cb5-14" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb5-14"><a href="#cb5-14" aria-hidden="true" tabindex="-1"></a>learn <span class="op">=</span> Learner(dls, xresnet50(n_out<span class="op">=</span><span class="dv">10</span>), metrics<span class="op">=</span>[accuracy,top_k_accuracy]).to_fp16()</span> <span id="cb5-15"><a href="#cb5-15" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb5-16"><a href="#cb5-16" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb5-17"><a href="#cb5-17" aria-hidden="true" tabindex="-1"></a></span></code></pre></div> -</section> -<section id="single-gpu-code" class="slide level2"> -<h2>Single-gpu code</h2> -<div class="sourceCode" id="cb6"><pre -class="sourceCode python"><code class="sourceCode python"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.vision.<span class="bu">all</span> <span class="im">import</span> <span class="op">*</span></span> -<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.distributed <span class="im">import</span> <span class="op">*</span></span> -<span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.vision.models.xresnet <span class="im">import</span> <span class="op">*</span></span> -<span id="cb6-4"><a href="#cb6-4" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb6-5"><a href="#cb6-5" aria-hidden="true" tabindex="-1"></a>path <span class="op">=</span> untar_data(URLs.IMAGEWOOF_320)</span> -<span id="cb6-6"><a href="#cb6-6" aria-hidden="true" tabindex="-1"></a>dls <span class="op">=</span> DataBlock(</span> -<span id="cb6-7"><a href="#cb6-7" aria-hidden="true" tabindex="-1"></a> blocks<span class="op">=</span>(ImageBlock, CategoryBlock),</span> -<span id="cb6-8"><a href="#cb6-8" aria-hidden="true" tabindex="-1"></a> splitter<span class="op">=</span>GrandparentSplitter(valid_name<span class="op">=</span><span class="st">'val'</span>),</span> -<span id="cb6-9"><a href="#cb6-9" aria-hidden="true" tabindex="-1"></a> get_items<span class="op">=</span>get_image_files, get_y<span class="op">=</span>parent_label,</span> -<span id="cb6-10"><a href="#cb6-10" aria-hidden="true" tabindex="-1"></a> item_tfms<span class="op">=</span>[RandomResizedCrop(<span class="dv">160</span>), FlipItem(<span class="fl">0.5</span>)],</span> -<span id="cb6-11"><a href="#cb6-11" aria-hidden="true" tabindex="-1"></a> batch_tfms<span class="op">=</span>Normalize.from_stats(<span class="op">*</span>imagenet_stats)</span> -<span id="cb6-12"><a href="#cb6-12" aria-hidden="true" tabindex="-1"></a>).dataloaders(path, path<span class="op">=</span>path, bs<span class="op">=</span><span class="dv">64</span>)</span> -<span id="cb6-13"><a href="#cb6-13" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb6-14"><a href="#cb6-14" aria-hidden="true" tabindex="-1"></a>learn <span class="op">=</span> Learner(dls, xresnet50(n_out<span class="op">=</span><span class="dv">10</span>), metrics<span class="op">=</span>[accuracy,top_k_accuracy]).to_fp16()</span> -<span id="cb6-15"><a href="#cb6-15" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb6-16"><a href="#cb6-16" aria-hidden="true" tabindex="-1"></a>learn.fine_tune(<span class="dv">6</span>)</span></code></pre></div> +<span id="cb5-16"><a href="#cb5-16" aria-hidden="true" tabindex="-1"></a>learn.fine_tune(<span class="dv">6</span>)</span></code></pre></div> </section> <section id="venv_template" class="slide level2"> <h2>Venv_template</h2> @@ -718,48 +754,48 @@ modules</li> <li class="fragment"><a href="https://gitlab.jsc.fz-juelich.de/kesselheim1/sc_venv_template">Link to gitlab repo</a></li> -<li class="fragment"><div class="sourceCode" id="cb7"><pre -class="sourceCode bash"><code class="sourceCode bash"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="bu">cd</span> <span class="va">$HOME</span>/2024-11-talk-intro-to-supercompting-jsc/src</span> -<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a><span class="fu">git</span> clone https://gitlab.jsc.fz-juelich.de/kesselheim1/sc_venv_template.git</span></code></pre></div></li> +<li class="fragment"><div class="sourceCode" id="cb6"><pre +class="sourceCode bash"><code class="sourceCode bash"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="bu">cd</span> <span class="va">$HOME</span>/2025-03-talk-nxtaim/src</span> +<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a><span class="fu">git</span> clone https://gitlab.jsc.fz-juelich.de/kesselheim1/sc_venv_template.git</span></code></pre></div></li> <li class="fragment">Add this to sc_venv_template/requirements.txt:</li> +<li class="fragment"><div class="sourceCode" id="cb7"><pre +class="sourceCode python"><code class="sourceCode python"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="co"># Add here the pip packages you would like to install on this virtual environment / kernel</span></span> +<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a>pip</span> +<span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a>fastai<span class="op">==</span><span class="fl">2.7.15</span></span> +<span id="cb7-4"><a href="#cb7-4" aria-hidden="true" tabindex="-1"></a>scipy<span class="op">==</span><span class="fl">1.11.1</span></span> +<span id="cb7-5"><a href="#cb7-5" aria-hidden="true" tabindex="-1"></a>matplotlib<span class="op">==</span><span class="fl">3.7.2</span></span> +<span id="cb7-6"><a href="#cb7-6" aria-hidden="true" tabindex="-1"></a>scikit<span class="op">-</span>learn<span class="op">==</span><span class="fl">1.3.1</span></span> +<span id="cb7-7"><a href="#cb7-7" aria-hidden="true" tabindex="-1"></a>pandas<span class="op">==</span><span class="fl">2.0.3</span></span> +<span id="cb7-8"><a href="#cb7-8" aria-hidden="true" tabindex="-1"></a>torch<span class="op">==</span><span class="fl">2.1.2</span></span> +<span id="cb7-9"><a href="#cb7-9" aria-hidden="true" tabindex="-1"></a>accelerate</span></code></pre></div></li> <li class="fragment"><div class="sourceCode" id="cb8"><pre -class="sourceCode python"><code class="sourceCode python"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="co"># Add here the pip packages you would like to install on this virtual environment / kernel</span></span> -<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a>pip</span> -<span id="cb8-3"><a href="#cb8-3" aria-hidden="true" tabindex="-1"></a>fastai<span class="op">==</span><span class="fl">2.7.15</span></span> -<span id="cb8-4"><a href="#cb8-4" aria-hidden="true" tabindex="-1"></a>scipy<span class="op">==</span><span class="fl">1.11.1</span></span> -<span id="cb8-5"><a href="#cb8-5" aria-hidden="true" tabindex="-1"></a>matplotlib<span class="op">==</span><span class="fl">3.7.2</span></span> -<span id="cb8-6"><a href="#cb8-6" aria-hidden="true" tabindex="-1"></a>scikit<span class="op">-</span>learn<span class="op">==</span><span class="fl">1.3.1</span></span> -<span id="cb8-7"><a href="#cb8-7" aria-hidden="true" tabindex="-1"></a>pandas<span class="op">==</span><span class="fl">2.0.3</span></span> -<span id="cb8-8"><a href="#cb8-8" aria-hidden="true" tabindex="-1"></a>torch<span class="op">==</span><span class="fl">2.1.2</span></span> -<span id="cb8-9"><a href="#cb8-9" aria-hidden="true" tabindex="-1"></a>accelerate</span></code></pre></div></li> -<li class="fragment"><div class="sourceCode" id="cb9"><pre -class="sourceCode bash"><code class="sourceCode bash"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a><span class="ex">sc_venv_template/setup.sh</span></span> -<span id="cb9-2"><a href="#cb9-2" aria-hidden="true" tabindex="-1"></a><span class="bu">source</span> sc_venv_template/activate.sh</span></code></pre></div></li> +class="sourceCode bash"><code class="sourceCode bash"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="ex">sc_venv_template/setup.sh</span></span> +<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a><span class="bu">source</span> sc_venv_template/activate.sh</span></code></pre></div></li> <li class="fragment">Done! You installed everything you need</li> </ul> </section> <section id="submission-script" class="slide level2"> <h2>Submission Script</h2> -<div class="sourceCode" id="cb10"><pre -class="sourceCode bash"><code class="sourceCode bash"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a><span class="co">#!/bin/bash</span></span> -<span id="cb10-2"><a href="#cb10-2" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --account=training2436</span></span> -<span id="cb10-3"><a href="#cb10-3" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --nodes=1</span></span> -<span id="cb10-4"><a href="#cb10-4" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --job-name=ai-serial</span></span> -<span id="cb10-5"><a href="#cb10-5" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --ntasks-per-node=1</span></span> -<span id="cb10-6"><a href="#cb10-6" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --cpus-per-task=1</span></span> -<span id="cb10-7"><a href="#cb10-7" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --output=out-serial.%j</span></span> -<span id="cb10-8"><a href="#cb10-8" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --error=err-serial.%j</span></span> -<span id="cb10-9"><a href="#cb10-9" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --time=00:40:00</span></span> -<span id="cb10-10"><a href="#cb10-10" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --partition=dc-gpu</span></span> -<span id="cb10-11"><a href="#cb10-11" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb10-12"><a href="#cb10-12" aria-hidden="true" tabindex="-1"></a><span class="co"># Make sure we are on the right directory</span></span> -<span id="cb10-13"><a href="#cb10-13" aria-hidden="true" tabindex="-1"></a><span class="bu">cd</span> <span class="va">$HOME</span>/2024-11-talk-intro-to-supercompting-jsc/src</span> -<span id="cb10-14"><a href="#cb10-14" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb10-15"><a href="#cb10-15" aria-hidden="true" tabindex="-1"></a><span class="co"># This loads modules and python packages</span></span> -<span id="cb10-16"><a href="#cb10-16" aria-hidden="true" tabindex="-1"></a><span class="bu">source</span> sc_venv_template/activate.sh</span> -<span id="cb10-17"><a href="#cb10-17" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb10-18"><a href="#cb10-18" aria-hidden="true" tabindex="-1"></a><span class="co"># Run the demo</span></span> -<span id="cb10-19"><a href="#cb10-19" aria-hidden="true" tabindex="-1"></a><span class="bu">time</span> srun python serial.py</span></code></pre></div> +<div class="sourceCode" id="cb9"><pre +class="sourceCode bash"><code class="sourceCode bash"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a><span class="co">#!/bin/bash</span></span> +<span id="cb9-2"><a href="#cb9-2" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --account=training2436</span></span> +<span id="cb9-3"><a href="#cb9-3" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --nodes=1</span></span> +<span id="cb9-4"><a href="#cb9-4" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --job-name=ai-serial</span></span> +<span id="cb9-5"><a href="#cb9-5" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --ntasks-per-node=1</span></span> +<span id="cb9-6"><a href="#cb9-6" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --cpus-per-task=1</span></span> +<span id="cb9-7"><a href="#cb9-7" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --output=out-serial.%j</span></span> +<span id="cb9-8"><a href="#cb9-8" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --error=err-serial.%j</span></span> +<span id="cb9-9"><a href="#cb9-9" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --time=00:40:00</span></span> +<span id="cb9-10"><a href="#cb9-10" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --partition=dc-gpu</span></span> +<span id="cb9-11"><a href="#cb9-11" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb9-12"><a href="#cb9-12" aria-hidden="true" tabindex="-1"></a><span class="co"># Make sure we are on the right directory</span></span> +<span id="cb9-13"><a href="#cb9-13" aria-hidden="true" tabindex="-1"></a><span class="bu">cd</span> <span class="va">$HOME</span>/2025-03-talk-nxtaim/src</span> +<span id="cb9-14"><a href="#cb9-14" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb9-15"><a href="#cb9-15" aria-hidden="true" tabindex="-1"></a><span class="co"># This loads modules and python packages</span></span> +<span id="cb9-16"><a href="#cb9-16" aria-hidden="true" tabindex="-1"></a><span class="bu">source</span> sc_venv_template/activate.sh</span> +<span id="cb9-17"><a href="#cb9-17" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb9-18"><a href="#cb9-18" aria-hidden="true" tabindex="-1"></a><span class="co"># Run the demo</span></span> +<span id="cb9-19"><a href="#cb9-19" aria-hidden="true" tabindex="-1"></a><span class="bu">time</span> srun python serial.py</span></code></pre></div> </section> <section id="download-dataset" class="slide level2"> <h2>Download dataset</h2> @@ -770,14 +806,14 @@ class="sourceCode bash"><code class="sourceCode bash"><span id="cb10-1"><a href= </section> <section id="download-dataset-1" class="slide level2"> <h2>Download dataset</h2> -<div class="sourceCode" id="cb11"><pre -class="sourceCode bash"><code class="sourceCode bash"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a><span class="bu">cd</span> <span class="va">$HOME</span>/2024-11-talk-intro-to-supercompting-jsc/src</span> -<span id="cb11-2"><a href="#cb11-2" aria-hidden="true" tabindex="-1"></a><span class="bu">source</span> sc_venv_template/activate.sh</span> -<span id="cb11-3"><a href="#cb11-3" aria-hidden="true" tabindex="-1"></a><span class="ex">python</span> serial.py</span> -<span id="cb11-4"><a href="#cb11-4" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb11-5"><a href="#cb11-5" aria-hidden="true" tabindex="-1"></a><span class="kw">(</span><span class="ex">Some</span> warnings<span class="kw">)</span></span> -<span id="cb11-6"><a href="#cb11-6" aria-hidden="true" tabindex="-1"></a><span class="ex">epoch</span> train_loss valid_loss accuracy top_k_accuracy time </span> -<span id="cb11-7"><a href="#cb11-7" aria-hidden="true" tabindex="-1"></a><span class="ex">Epoch</span> 1/1 : <span class="kw">|</span><span class="ex">-------------------------------------------------------------</span><span class="kw">|</span> <span class="ex">0.71%</span> [1/141 00:07<span class="op"><</span>16:40]</span></code></pre></div> +<div class="sourceCode" id="cb10"><pre +class="sourceCode bash"><code class="sourceCode bash"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a><span class="bu">cd</span> <span class="va">$HOME</span>/2025-03-talk-nxtaim/src</span> +<span id="cb10-2"><a href="#cb10-2" aria-hidden="true" tabindex="-1"></a><span class="bu">source</span> sc_venv_template/activate.sh</span> +<span id="cb10-3"><a href="#cb10-3" aria-hidden="true" tabindex="-1"></a><span class="ex">python</span> serial.py</span> +<span id="cb10-4"><a href="#cb10-4" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb10-5"><a href="#cb10-5" aria-hidden="true" tabindex="-1"></a><span class="kw">(</span><span class="ex">Some</span> warnings<span class="kw">)</span></span> +<span id="cb10-6"><a href="#cb10-6" aria-hidden="true" tabindex="-1"></a><span class="ex">epoch</span> train_loss valid_loss accuracy top_k_accuracy time </span> +<span id="cb10-7"><a href="#cb10-7" aria-hidden="true" tabindex="-1"></a><span class="ex">Epoch</span> 1/1 : <span class="kw">|</span><span class="ex">-------------------------------------------------------------</span><span class="kw">|</span> <span class="ex">0.71%</span> [1/141 00:07<span class="op"><</span>16:40]</span></code></pre></div> <ul> <li class="fragment">It started training, on the login node’s CPUs (WRONG!!!)</li> @@ -788,9 +824,9 @@ class="sourceCode bash"><code class="sourceCode bash"><span id="cb11-1"><a href= <section id="running-it" class="slide level2"> <h2>Running it</h2> <ul> -<li class="fragment"><div class="sourceCode" id="cb12"><pre -class="sourceCode bash"><code class="sourceCode bash"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a><span class="bu">cd</span> <span class="va">$HOME</span>/2024-11-talk-intro-to-supercompting-jsc/src</span> -<span id="cb12-2"><a href="#cb12-2" aria-hidden="true" tabindex="-1"></a><span class="ex">sbatch</span> serial.slurm</span></code></pre></div></li> +<li class="fragment"><div class="sourceCode" id="cb11"><pre +class="sourceCode bash"><code class="sourceCode bash"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a><span class="bu">cd</span> <span class="va">$HOME</span>/2025-03-talk-nxtaim/src</span> +<span id="cb11-2"><a href="#cb11-2" aria-hidden="true" tabindex="-1"></a><span class="ex">sbatch</span> serial.slurm</span></code></pre></div></li> <li class="fragment">On Juwels Booster, should take about 5 minutes</li> <li class="fragment">On a cpu system this would take half a day</li> <li class="fragment">Check the out-serial-XXXXXX and err-serial-XXXXXX @@ -806,78 +842,78 @@ differences</li> </section> <section id="data-parallel-4" class="slide level2"> <h2>Data parallel</h2> -<div class="sourceCode" id="cb13"><pre -class="sourceCode python"><code class="sourceCode python"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.vision.<span class="bu">all</span> <span class="im">import</span> <span class="op">*</span></span> -<span id="cb13-2"><a href="#cb13-2" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.distributed <span class="im">import</span> <span class="op">*</span></span> -<span id="cb13-3"><a href="#cb13-3" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.vision.models.xresnet <span class="im">import</span> <span class="op">*</span></span> -<span id="cb13-4"><a href="#cb13-4" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb13-5"><a href="#cb13-5" aria-hidden="true" tabindex="-1"></a>path <span class="op">=</span> rank0_first(untar_data, URLs.IMAGEWOOF_320)</span> -<span id="cb13-6"><a href="#cb13-6" aria-hidden="true" tabindex="-1"></a>dls <span class="op">=</span> DataBlock(</span> -<span id="cb13-7"><a href="#cb13-7" aria-hidden="true" tabindex="-1"></a> blocks<span class="op">=</span>(ImageBlock, CategoryBlock),</span> -<span id="cb13-8"><a href="#cb13-8" aria-hidden="true" tabindex="-1"></a> splitter<span class="op">=</span>GrandparentSplitter(valid_name<span class="op">=</span><span class="st">'val'</span>),</span> -<span id="cb13-9"><a href="#cb13-9" aria-hidden="true" tabindex="-1"></a> get_items<span class="op">=</span>get_image_files, get_y<span class="op">=</span>parent_label,</span> -<span id="cb13-10"><a href="#cb13-10" aria-hidden="true" tabindex="-1"></a> item_tfms<span class="op">=</span>[RandomResizedCrop(<span class="dv">160</span>), FlipItem(<span class="fl">0.5</span>)],</span> -<span id="cb13-11"><a href="#cb13-11" aria-hidden="true" tabindex="-1"></a> batch_tfms<span class="op">=</span>Normalize.from_stats(<span class="op">*</span>imagenet_stats)</span> -<span id="cb13-12"><a href="#cb13-12" aria-hidden="true" tabindex="-1"></a>).dataloaders(path, path<span class="op">=</span>path, bs<span class="op">=</span><span class="dv">64</span>)</span> -<span id="cb13-13"><a href="#cb13-13" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb13-14"><a href="#cb13-14" aria-hidden="true" tabindex="-1"></a>learn <span class="op">=</span> Learner(dls, xresnet50(n_out<span class="op">=</span><span class="dv">10</span>), metrics<span class="op">=</span>[accuracy,top_k_accuracy]).to_fp16()</span> -<span id="cb13-15"><a href="#cb13-15" aria-hidden="true" tabindex="-1"></a><span class="cf">with</span> learn.distrib_ctx():</span> -<span id="cb13-16"><a href="#cb13-16" aria-hidden="true" tabindex="-1"></a> learn.fine_tune(<span class="dv">6</span>)</span></code></pre></div> +<div class="sourceCode" id="cb12"><pre +class="sourceCode python"><code class="sourceCode python"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.vision.<span class="bu">all</span> <span class="im">import</span> <span class="op">*</span></span> +<span id="cb12-2"><a href="#cb12-2" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.distributed <span class="im">import</span> <span class="op">*</span></span> +<span id="cb12-3"><a href="#cb12-3" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> fastai.vision.models.xresnet <span class="im">import</span> <span class="op">*</span></span> +<span id="cb12-4"><a href="#cb12-4" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb12-5"><a href="#cb12-5" aria-hidden="true" tabindex="-1"></a>path <span class="op">=</span> rank0_first(untar_data, URLs.IMAGEWOOF_320)</span> +<span id="cb12-6"><a href="#cb12-6" aria-hidden="true" tabindex="-1"></a>dls <span class="op">=</span> DataBlock(</span> +<span id="cb12-7"><a href="#cb12-7" aria-hidden="true" tabindex="-1"></a> blocks<span class="op">=</span>(ImageBlock, CategoryBlock),</span> +<span id="cb12-8"><a href="#cb12-8" aria-hidden="true" tabindex="-1"></a> splitter<span class="op">=</span>GrandparentSplitter(valid_name<span class="op">=</span><span class="st">'val'</span>),</span> +<span id="cb12-9"><a href="#cb12-9" aria-hidden="true" tabindex="-1"></a> get_items<span class="op">=</span>get_image_files, get_y<span class="op">=</span>parent_label,</span> +<span id="cb12-10"><a href="#cb12-10" aria-hidden="true" tabindex="-1"></a> item_tfms<span class="op">=</span>[RandomResizedCrop(<span class="dv">160</span>), FlipItem(<span class="fl">0.5</span>)],</span> +<span id="cb12-11"><a href="#cb12-11" aria-hidden="true" tabindex="-1"></a> batch_tfms<span class="op">=</span>Normalize.from_stats(<span class="op">*</span>imagenet_stats)</span> +<span id="cb12-12"><a href="#cb12-12" aria-hidden="true" tabindex="-1"></a>).dataloaders(path, path<span class="op">=</span>path, bs<span class="op">=</span><span class="dv">64</span>)</span> +<span id="cb12-13"><a href="#cb12-13" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb12-14"><a href="#cb12-14" aria-hidden="true" tabindex="-1"></a>learn <span class="op">=</span> Learner(dls, xresnet50(n_out<span class="op">=</span><span class="dv">10</span>), metrics<span class="op">=</span>[accuracy,top_k_accuracy]).to_fp16()</span> +<span id="cb12-15"><a href="#cb12-15" aria-hidden="true" tabindex="-1"></a><span class="cf">with</span> learn.distrib_ctx():</span> +<span id="cb12-16"><a href="#cb12-16" aria-hidden="true" tabindex="-1"></a> learn.fine_tune(<span class="dv">6</span>)</span></code></pre></div> </section> <section id="data-parallel-5" class="slide level2"> <h2>Data Parallel</h2> <h3 id="what-changed">What changed?</h3> <p>It was</p> -<div class="sourceCode" id="cb14"><pre -class="sourceCode python"><code class="sourceCode python"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true" tabindex="-1"></a>path <span class="op">=</span> untar_data(URLs.IMAGEWOOF_320)</span></code></pre></div> +<div class="sourceCode" id="cb13"><pre +class="sourceCode python"><code class="sourceCode python"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a>path <span class="op">=</span> untar_data(URLs.IMAGEWOOF_320)</span></code></pre></div> <p>Became</p> -<div class="sourceCode" id="cb15"><pre -class="sourceCode python"><code class="sourceCode python"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true" tabindex="-1"></a>path <span class="op">=</span> rank0_first(untar_data, URLs.IMAGEWOOF_320)</span></code></pre></div> +<div class="sourceCode" id="cb14"><pre +class="sourceCode python"><code class="sourceCode python"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true" tabindex="-1"></a>path <span class="op">=</span> rank0_first(untar_data, URLs.IMAGEWOOF_320)</span></code></pre></div> <p>It was</p> -<div class="sourceCode" id="cb16"><pre -class="sourceCode python"><code class="sourceCode python"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true" tabindex="-1"></a>learn.fine_tune(<span class="dv">6</span>)</span></code></pre></div> +<div class="sourceCode" id="cb15"><pre +class="sourceCode python"><code class="sourceCode python"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true" tabindex="-1"></a>learn.fine_tune(<span class="dv">6</span>)</span></code></pre></div> <p>Became</p> -<div class="sourceCode" id="cb17"><pre -class="sourceCode python"><code class="sourceCode python"><span id="cb17-1"><a href="#cb17-1" aria-hidden="true" tabindex="-1"></a><span class="cf">with</span> learn.distrib_ctx():</span> -<span id="cb17-2"><a href="#cb17-2" aria-hidden="true" tabindex="-1"></a> learn.fine_tune(<span class="dv">6</span>)</span></code></pre></div> +<div class="sourceCode" id="cb16"><pre +class="sourceCode python"><code class="sourceCode python"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true" tabindex="-1"></a><span class="cf">with</span> learn.distrib_ctx():</span> +<span id="cb16-2"><a href="#cb16-2" aria-hidden="true" tabindex="-1"></a> learn.fine_tune(<span class="dv">6</span>)</span></code></pre></div> </section> <section id="submission-script-data-parallel" class="slide level2"> <h2>Submission script: data parallel</h2> <ul> <li class="fragment"><p>Please check the course repository: <a -href="https://gitlab.jsc.fz-juelich.de/strube1/2024-11-talk-intro-to-supercompting-jsc/-/blob/main/src/distrib.slurm">src/distrib.slurm</a></p></li> +href="https://gitlab.jsc.fz-juelich.de/strube1/2025-03-talk-nxtaim/-/blob/main/src/distrib.slurm">src/distrib.slurm</a></p></li> <li class="fragment"><p>Main differences:</p></li> -<li class="fragment"><div class="sourceCode" id="cb18"><pre -class="sourceCode bash"><code class="sourceCode bash"><span id="cb18-1"><a href="#cb18-1" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --cpus-per-task=48</span></span> -<span id="cb18-2"><a href="#cb18-2" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --gres=gpu:4</span></span></code></pre></div></li> +<li class="fragment"><div class="sourceCode" id="cb17"><pre +class="sourceCode bash"><code class="sourceCode bash"><span id="cb17-1"><a href="#cb17-1" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --cpus-per-task=48</span></span> +<span id="cb17-2"><a href="#cb17-2" aria-hidden="true" tabindex="-1"></a><span class="co">#SBATCH --gres=gpu:4</span></span></code></pre></div></li> </ul> </section> <section id="lets-check-the-outputs" class="slide level2"> <h2>Let’s check the outputs!</h2> <h4 id="single-gpu">Single gpu:</h4> +<div class="sourceCode" id="cb18"><pre +class="sourceCode bash"><code class="sourceCode bash"><span id="cb18-1"><a href="#cb18-1" aria-hidden="true" tabindex="-1"></a><span class="ex">epoch</span> train_loss valid_loss accuracy top_k_accuracy time </span> +<span id="cb18-2"><a href="#cb18-2" aria-hidden="true" tabindex="-1"></a><span class="ex">0</span> 2.249933 2.152813 0.225757 0.750573 01:11 </span> +<span id="cb18-3"><a href="#cb18-3" aria-hidden="true" tabindex="-1"></a><span class="ex">epoch</span> train_loss valid_loss accuracy top_k_accuracy time </span> +<span id="cb18-4"><a href="#cb18-4" aria-hidden="true" tabindex="-1"></a><span class="ex">0</span> 1.882008 1.895813 0.324510 0.832018 00:44 </span> +<span id="cb18-5"><a href="#cb18-5" aria-hidden="true" tabindex="-1"></a><span class="ex">1</span> 1.837312 1.916380 0.374141 0.845253 00:44 </span> +<span id="cb18-6"><a href="#cb18-6" aria-hidden="true" tabindex="-1"></a><span class="ex">2</span> 1.717144 1.739026 0.378722 0.869941 00:43 </span> +<span id="cb18-7"><a href="#cb18-7" aria-hidden="true" tabindex="-1"></a><span class="ex">3</span> 1.594981 1.637526 0.417664 0.891575 00:44 </span> +<span id="cb18-8"><a href="#cb18-8" aria-hidden="true" tabindex="-1"></a><span class="ex">4</span> 1.460454 1.410519 0.507254 0.920336 00:44 </span> +<span id="cb18-9"><a href="#cb18-9" aria-hidden="true" tabindex="-1"></a><span class="ex">5</span> 1.389946 1.304924 0.538814 0.935862 00:43 </span> +<span id="cb18-10"><a href="#cb18-10" aria-hidden="true" tabindex="-1"></a><span class="ex">real</span> 5m44.972s</span></code></pre></div> +<h4 id="multi-gpu">Multi gpu:</h4> <div class="sourceCode" id="cb19"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb19-1"><a href="#cb19-1" aria-hidden="true" tabindex="-1"></a><span class="ex">epoch</span> train_loss valid_loss accuracy top_k_accuracy time </span> -<span id="cb19-2"><a href="#cb19-2" aria-hidden="true" tabindex="-1"></a><span class="ex">0</span> 2.249933 2.152813 0.225757 0.750573 01:11 </span> +<span id="cb19-2"><a href="#cb19-2" aria-hidden="true" tabindex="-1"></a><span class="ex">0</span> 2.201540 2.799354 0.202950 0.662513 00:09 </span> <span id="cb19-3"><a href="#cb19-3" aria-hidden="true" tabindex="-1"></a><span class="ex">epoch</span> train_loss valid_loss accuracy top_k_accuracy time </span> -<span id="cb19-4"><a href="#cb19-4" aria-hidden="true" tabindex="-1"></a><span class="ex">0</span> 1.882008 1.895813 0.324510 0.832018 00:44 </span> -<span id="cb19-5"><a href="#cb19-5" aria-hidden="true" tabindex="-1"></a><span class="ex">1</span> 1.837312 1.916380 0.374141 0.845253 00:44 </span> -<span id="cb19-6"><a href="#cb19-6" aria-hidden="true" tabindex="-1"></a><span class="ex">2</span> 1.717144 1.739026 0.378722 0.869941 00:43 </span> -<span id="cb19-7"><a href="#cb19-7" aria-hidden="true" tabindex="-1"></a><span class="ex">3</span> 1.594981 1.637526 0.417664 0.891575 00:44 </span> -<span id="cb19-8"><a href="#cb19-8" aria-hidden="true" tabindex="-1"></a><span class="ex">4</span> 1.460454 1.410519 0.507254 0.920336 00:44 </span> -<span id="cb19-9"><a href="#cb19-9" aria-hidden="true" tabindex="-1"></a><span class="ex">5</span> 1.389946 1.304924 0.538814 0.935862 00:43 </span> -<span id="cb19-10"><a href="#cb19-10" aria-hidden="true" tabindex="-1"></a><span class="ex">real</span> 5m44.972s</span></code></pre></div> -<h4 id="multi-gpu">Multi gpu:</h4> -<div class="sourceCode" id="cb20"><pre -class="sourceCode bash"><code class="sourceCode bash"><span id="cb20-1"><a href="#cb20-1" aria-hidden="true" tabindex="-1"></a><span class="ex">epoch</span> train_loss valid_loss accuracy top_k_accuracy time </span> -<span id="cb20-2"><a href="#cb20-2" aria-hidden="true" tabindex="-1"></a><span class="ex">0</span> 2.201540 2.799354 0.202950 0.662513 00:09 </span> -<span id="cb20-3"><a href="#cb20-3" aria-hidden="true" tabindex="-1"></a><span class="ex">epoch</span> train_loss valid_loss accuracy top_k_accuracy time </span> -<span id="cb20-4"><a href="#cb20-4" aria-hidden="true" tabindex="-1"></a><span class="ex">0</span> 1.951004 2.059517 0.294761 0.781282 00:08 </span> -<span id="cb20-5"><a href="#cb20-5" aria-hidden="true" tabindex="-1"></a><span class="ex">1</span> 1.929561 1.999069 0.309512 0.792981 00:08 </span> -<span id="cb20-6"><a href="#cb20-6" aria-hidden="true" tabindex="-1"></a><span class="ex">2</span> 1.854629 1.962271 0.314344 0.840285 00:08 </span> -<span id="cb20-7"><a href="#cb20-7" aria-hidden="true" tabindex="-1"></a><span class="ex">3</span> 1.754019 1.687136 0.404883 0.872330 00:08 </span> -<span id="cb20-8"><a href="#cb20-8" aria-hidden="true" tabindex="-1"></a><span class="ex">4</span> 1.643759 1.499526 0.482706 0.906409 00:08 </span> -<span id="cb20-9"><a href="#cb20-9" aria-hidden="true" tabindex="-1"></a><span class="ex">5</span> 1.554356 1.450976 0.502798 0.914547 00:08 </span> -<span id="cb20-10"><a href="#cb20-10" aria-hidden="true" tabindex="-1"></a><span class="ex">real</span> 1m19.979s</span></code></pre></div> +<span id="cb19-4"><a href="#cb19-4" aria-hidden="true" tabindex="-1"></a><span class="ex">0</span> 1.951004 2.059517 0.294761 0.781282 00:08 </span> +<span id="cb19-5"><a href="#cb19-5" aria-hidden="true" tabindex="-1"></a><span class="ex">1</span> 1.929561 1.999069 0.309512 0.792981 00:08 </span> +<span id="cb19-6"><a href="#cb19-6" aria-hidden="true" tabindex="-1"></a><span class="ex">2</span> 1.854629 1.962271 0.314344 0.840285 00:08 </span> +<span id="cb19-7"><a href="#cb19-7" aria-hidden="true" tabindex="-1"></a><span class="ex">3</span> 1.754019 1.687136 0.404883 0.872330 00:08 </span> +<span id="cb19-8"><a href="#cb19-8" aria-hidden="true" tabindex="-1"></a><span class="ex">4</span> 1.643759 1.499526 0.482706 0.906409 00:08 </span> +<span id="cb19-9"><a href="#cb19-9" aria-hidden="true" tabindex="-1"></a><span class="ex">5</span> 1.554356 1.450976 0.502798 0.914547 00:08 </span> +<span id="cb19-10"><a href="#cb19-10" aria-hidden="true" tabindex="-1"></a><span class="ex">real</span> 1m19.979s</span></code></pre></div> </section> <section id="some-insights" class="slide level2"> <h2>Some insights</h2> @@ -911,17 +947,17 @@ submission file!</li> <section id="multi-node-1" class="slide level2"> <h2>Multi-node</h2> <ul> -<li class="fragment"><div class="sourceCode" id="cb21"><pre -class="sourceCode bash"><code class="sourceCode bash"><span id="cb21-1"><a href="#cb21-1" aria-hidden="true" tabindex="-1"></a><span class="ex">epoch</span> train_loss valid_loss accuracy top_k_accuracy time </span> -<span id="cb21-2"><a href="#cb21-2" aria-hidden="true" tabindex="-1"></a><span class="ex">0</span> 2.242036 2.192690 0.201728 0.681148 00:10 </span> -<span id="cb21-3"><a href="#cb21-3" aria-hidden="true" tabindex="-1"></a><span class="ex">epoch</span> train_loss valid_loss accuracy top_k_accuracy time </span> -<span id="cb21-4"><a href="#cb21-4" aria-hidden="true" tabindex="-1"></a><span class="ex">0</span> 2.035004 2.084082 0.246189 0.748984 00:05 </span> -<span id="cb21-5"><a href="#cb21-5" aria-hidden="true" tabindex="-1"></a><span class="ex">1</span> 1.981432 2.054528 0.247205 0.764482 00:05 </span> -<span id="cb21-6"><a href="#cb21-6" aria-hidden="true" tabindex="-1"></a><span class="ex">2</span> 1.942930 1.918441 0.316057 0.821138 00:05 </span> -<span id="cb21-7"><a href="#cb21-7" aria-hidden="true" tabindex="-1"></a><span class="ex">3</span> 1.898426 1.832725 0.370173 0.839431 00:05 </span> -<span id="cb21-8"><a href="#cb21-8" aria-hidden="true" tabindex="-1"></a><span class="ex">4</span> 1.859066 1.781805 0.375508 0.858740 00:05 </span> -<span id="cb21-9"><a href="#cb21-9" aria-hidden="true" tabindex="-1"></a><span class="ex">5</span> 1.820968 1.743448 0.394055 0.864583 00:05</span> -<span id="cb21-10"><a href="#cb21-10" aria-hidden="true" tabindex="-1"></a><span class="ex">real</span> 1m15.651s </span></code></pre></div></li> +<li class="fragment"><div class="sourceCode" id="cb20"><pre +class="sourceCode bash"><code class="sourceCode bash"><span id="cb20-1"><a href="#cb20-1" aria-hidden="true" tabindex="-1"></a><span class="ex">epoch</span> train_loss valid_loss accuracy top_k_accuracy time </span> +<span id="cb20-2"><a href="#cb20-2" aria-hidden="true" tabindex="-1"></a><span class="ex">0</span> 2.242036 2.192690 0.201728 0.681148 00:10 </span> +<span id="cb20-3"><a href="#cb20-3" aria-hidden="true" tabindex="-1"></a><span class="ex">epoch</span> train_loss valid_loss accuracy top_k_accuracy time </span> +<span id="cb20-4"><a href="#cb20-4" aria-hidden="true" tabindex="-1"></a><span class="ex">0</span> 2.035004 2.084082 0.246189 0.748984 00:05 </span> +<span id="cb20-5"><a href="#cb20-5" aria-hidden="true" tabindex="-1"></a><span class="ex">1</span> 1.981432 2.054528 0.247205 0.764482 00:05 </span> +<span id="cb20-6"><a href="#cb20-6" aria-hidden="true" tabindex="-1"></a><span class="ex">2</span> 1.942930 1.918441 0.316057 0.821138 00:05 </span> +<span id="cb20-7"><a href="#cb20-7" aria-hidden="true" tabindex="-1"></a><span class="ex">3</span> 1.898426 1.832725 0.370173 0.839431 00:05 </span> +<span id="cb20-8"><a href="#cb20-8" aria-hidden="true" tabindex="-1"></a><span class="ex">4</span> 1.859066 1.781805 0.375508 0.858740 00:05 </span> +<span id="cb20-9"><a href="#cb20-9" aria-hidden="true" tabindex="-1"></a><span class="ex">5</span> 1.820968 1.743448 0.394055 0.864583 00:05</span> +<span id="cb20-10"><a href="#cb20-10" aria-hidden="true" tabindex="-1"></a><span class="ex">real</span> 1m15.651s </span></code></pre></div></li> </ul> </section> <section id="some-insights-1" class="slide level2"> diff --git a/public/pics/sabrina.jpg b/public/pics/sabrina.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6abef7c6fb045617c0f006f4f21c7d327873a283 GIT binary patch literal 38594 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 U)qScILvfN_;ICe#iT`f`0O76n%m4rY literal 0 HcmV?d00001 diff --git a/src/distrib.slurm b/src/distrib.slurm index 6ffdae4..9ef2f06 100644 --- a/src/distrib.slurm +++ b/src/distrib.slurm @@ -1,5 +1,5 @@ #!/bin/bash -#SBATCH --account=training2436 +#SBATCH --account=SOME_ACCOUNT #SBATCH --nodes=1 #SBATCH --job-name=ai-multi-gpu #SBATCH --ntasks-per-node=1 @@ -7,7 +7,7 @@ #SBATCH --output=out-distrib.%j #SBATCH --error=err-distrib.%j #SBATCH --time=00:20:00 -#SBATCH --partition=dc-gpu +#SBATCH --partition=dc-gpu # on JURECA #SBATCH --gres=gpu:4 # Without this, srun does not inherit cpus-per-task from sbatch. @@ -23,7 +23,7 @@ export MASTER_PORT=7010 export GPUS_PER_NODE=4 # Make sure we are on the right directory -cd $HOME/2024-11-talk-intro-to-supercompting-jsc/src +cd $HOME/2025-03-talk-nxtaim/src # This loads modules and python packages source sc_venv_template/activate.sh diff --git a/src/serial.slurm b/src/serial.slurm index 53ed537..0400182 100644 --- a/src/serial.slurm +++ b/src/serial.slurm @@ -1,5 +1,5 @@ #!/bin/bash -#SBATCH --account=training2436 +#SBATCH --account=SOME_ACCOUNT #SBATCH --nodes=1 #SBATCH --job-name=ai-serial #SBATCH --ntasks-per-node=1 @@ -7,11 +7,11 @@ #SBATCH --output=out-serial.%j #SBATCH --error=err-serial.%j #SBATCH --time=00:40:00 -#SBATCH --partition=dc-gpu +#SBATCH --partition=dc-gpu # on JURECA #SBATCH --gres=gpu:1 # Make sure we are on the right directory -cd $HOME/2024-11-talk-intro-to-supercompting-jsc/src +cd $HOME/2025-03-talk-nxtaim/src # This loads modules and python packages source sc_venv_template/activate.sh -- GitLab