From 9701ea3247d76b1bb291e8be0d88d2fdf7f4c671 Mon Sep 17 00:00:00 2001 From: yuhan Date: Fri, 25 Jul 2025 09:26:58 +0800 Subject: [PATCH] modify config and del mindformers build --- docs/lite/api/source_en/conf.py | 2 +- .../api/api_cn/API_sample_and_requirements.md | 8 +- .../beginner/accelerate_with_static_graph.md | 2 +- tutorials/source_en/beginner/autograd.md | 2 +- tutorials/source_en/beginner/dataset.md | 2 +- .../beginner/images/fp16_vs_fp32.png | Bin 38727 -> 0 bytes tutorials/source_en/beginner/introduction.md | 2 +- .../source_en/beginner/mixed_precision.md | 321 ---------- tutorials/source_en/beginner/model.md | 2 +- tutorials/source_en/beginner/quick_start.md | 2 +- tutorials/source_en/beginner/save_load.md | 2 +- tutorials/source_en/beginner/tensor.md | 2 +- tutorials/source_en/beginner/train.md | 2 +- tutorials/source_en/index.rst | 1 - .../accelerate_with_static_graph.ipynb | 2 +- .../source_zh_cn/beginner/autograd.ipynb | 2 +- tutorials/source_zh_cn/beginner/dataset.ipynb | 2 +- .../beginner/images/fp16_vs_fp32.png | Bin 36113 -> 0 bytes .../beginner/images/mix_precision_fp16.png | Bin 47705 -> 0 bytes .../source_zh_cn/beginner/introduction.ipynb | 2 +- .../beginner/mixed_precision.ipynb | 581 ------------------ tutorials/source_zh_cn/beginner/model.ipynb | 2 +- .../source_zh_cn/beginner/quick_start.ipynb | 2 +- .../source_zh_cn/beginner/save_load.ipynb | 2 +- tutorials/source_zh_cn/beginner/tensor.ipynb | 2 +- tutorials/source_zh_cn/beginner/train.ipynb | 2 +- tutorials/source_zh_cn/index.rst | 1 - 27 files changed, 23 insertions(+), 927 deletions(-) delete mode 100644 tutorials/source_en/beginner/images/fp16_vs_fp32.png delete mode 100644 tutorials/source_en/beginner/mixed_precision.md delete mode 100644 tutorials/source_zh_cn/beginner/images/fp16_vs_fp32.png delete mode 100644 tutorials/source_zh_cn/beginner/images/mix_precision_fp16.png delete mode 100644 tutorials/source_zh_cn/beginner/mixed_precision.ipynb diff --git a/docs/lite/api/source_en/conf.py b/docs/lite/api/source_en/conf.py index b9ccde4eb6..9c11fa8f29 100644 --- a/docs/lite/api/source_en/conf.py +++ b/docs/lite/api/source_en/conf.py @@ -310,7 +310,7 @@ try: ("mindspore_lite/converter.py","del decorator", "@set_env","# generate api by del decorator set_env."), ("mindspore_lite/llm_engine.py","del decorator", - "@set_env","# generate api by del decorator set_env.")] + "@set_env","# generate api by del decorator set_env.")] for i in decorator_list: with open(os.path.join(base_path, os.path.normpath(i[0])), "r+", encoding="utf8") as f: diff --git a/docs/mindspore/api/api_cn/API_sample_and_requirements.md b/docs/mindspore/api/api_cn/API_sample_and_requirements.md index d1ccc6f405..dd0995371d 100644 --- a/docs/mindspore/api/api_cn/API_sample_and_requirements.md +++ b/docs/mindspore/api/api_cn/API_sample_and_requirements.md @@ -269,8 +269,8 @@ - **Error2** – 异常描述2。 教程样例: - - `自动混合精度 - 损失缩放 - `_ + - `Graph Mode加速 + `_ ``` @@ -283,8 +283,8 @@ xxxx 教程样例: - - `自动混合精度 - 损失缩放 - `_ + - `Graph Mode加速 + `_ ``` diff --git a/tutorials/source_en/beginner/accelerate_with_static_graph.md b/tutorials/source_en/beginner/accelerate_with_static_graph.md index 3315bb8992..cecbf71c56 100644 --- a/tutorials/source_en/beginner/accelerate_with_static_graph.md +++ b/tutorials/source_en/beginner/accelerate_with_static_graph.md @@ -1,6 +1,6 @@ [![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/beginner/accelerate_with_static_graph.md) -[Introduction](https://www.mindspore.cn/tutorials/en/master/beginner/introduction.html) || [Quick Start](https://www.mindspore.cn/tutorials/en/master/beginner/quick_start.html) || [Tensor](https://www.mindspore.cn/tutorials/en/master/beginner/tensor.html) || [Data Loading and Processing](https://www.mindspore.cn/tutorials/en/master/beginner/dataset.html) || [Model](https://www.mindspore.cn/tutorials/en/master/beginner/model.html) || [Autograd](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/beginner/autograd.md) || [Train](https://www.mindspore.cn/tutorials/en/master/beginner/train.html) || [Save and Load](https://www.mindspore.cn/tutorials/en/master/beginner/save_load.html) || **Accelerating with Static Graphs**|| [Mixed Precision](https://www.mindspore.cn/tutorials/en/master/beginner/mixed_precision.html) +[Introduction](https://www.mindspore.cn/tutorials/en/master/beginner/introduction.html) || [Quick Start](https://www.mindspore.cn/tutorials/en/master/beginner/quick_start.html) || [Tensor](https://www.mindspore.cn/tutorials/en/master/beginner/tensor.html) || [Data Loading and Processing](https://www.mindspore.cn/tutorials/en/master/beginner/dataset.html) || [Model](https://www.mindspore.cn/tutorials/en/master/beginner/model.html) || [Autograd](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/beginner/autograd.md) || [Train](https://www.mindspore.cn/tutorials/en/master/beginner/train.html) || [Save and Load](https://www.mindspore.cn/tutorials/en/master/beginner/save_load.html) || **Accelerating with Static Graphs** # Accelerating with Static Graphs diff --git a/tutorials/source_en/beginner/autograd.md b/tutorials/source_en/beginner/autograd.md index 44758b6299..1f5589fc07 100644 --- a/tutorials/source_en/beginner/autograd.md +++ b/tutorials/source_en/beginner/autograd.md @@ -1,6 +1,6 @@ [![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/beginner/autograd.md) -[Introduction](https://www.mindspore.cn/tutorials/en/master/beginner/introduction.html) || [Quick Start](https://www.mindspore.cn/tutorials/en/master/beginner/quick_start.html) || [Tensor](https://www.mindspore.cn/tutorials/en/master/beginner/tensor.html) || [Data Loading and Processing](https://www.mindspore.cn/tutorials/en/master/beginner/dataset.html) || [Model](https://www.mindspore.cn/tutorials/en/master/beginner/model.html) || **Autograd** || [Train](https://www.mindspore.cn/tutorials/en/master/beginner/train.html) || [Save and Load](https://www.mindspore.cn/tutorials/en/master/beginner/save_load.html) || [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html) || [Mixed Precision](https://www.mindspore.cn/tutorials/en/master/beginner/mixed_precision.html) +[Introduction](https://www.mindspore.cn/tutorials/en/master/beginner/introduction.html) || [Quick Start](https://www.mindspore.cn/tutorials/en/master/beginner/quick_start.html) || [Tensor](https://www.mindspore.cn/tutorials/en/master/beginner/tensor.html) || [Data Loading and Processing](https://www.mindspore.cn/tutorials/en/master/beginner/dataset.html) || [Model](https://www.mindspore.cn/tutorials/en/master/beginner/model.html) || **Autograd** || [Train](https://www.mindspore.cn/tutorials/en/master/beginner/train.html) || [Save and Load](https://www.mindspore.cn/tutorials/en/master/beginner/save_load.html) || [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html) # Automatic Differentiation diff --git a/tutorials/source_en/beginner/dataset.md b/tutorials/source_en/beginner/dataset.md index 2388cb71de..bb36f2c8da 100644 --- a/tutorials/source_en/beginner/dataset.md +++ b/tutorials/source_en/beginner/dataset.md @@ -1,6 +1,6 @@ [![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/beginner/dataset.md) -[Introduction](https://www.mindspore.cn/tutorials/en/master/beginner/introduction.html) || [Quick Start](https://www.mindspore.cn/tutorials/en/master/beginner/quick_start.html) || [Tensor](https://www.mindspore.cn/tutorials/en/master/beginner/tensor.html) || **Data Loading and Processing** || [Model](https://www.mindspore.cn/tutorials/en/master/beginner/model.html) || [Autograd](https://www.mindspore.cn/tutorials/en/master/beginner/autograd.html) || [Train](https://www.mindspore.cn/tutorials/en/master/beginner/train.html) || [Save and Load](https://www.mindspore.cn/tutorials/en/master/beginner/save_load.html) || [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html) || [Mixed Precision](https://www.mindspore.cn/tutorials/en/master/beginner/mixed_precision.html) +[Introduction](https://www.mindspore.cn/tutorials/en/master/beginner/introduction.html) || [Quick Start](https://www.mindspore.cn/tutorials/en/master/beginner/quick_start.html) || [Tensor](https://www.mindspore.cn/tutorials/en/master/beginner/tensor.html) || **Data Loading and Processing** || [Model](https://www.mindspore.cn/tutorials/en/master/beginner/model.html) || [Autograd](https://www.mindspore.cn/tutorials/en/master/beginner/autograd.html) || [Train](https://www.mindspore.cn/tutorials/en/master/beginner/train.html) || [Save and Load](https://www.mindspore.cn/tutorials/en/master/beginner/save_load.html) || [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html) # Data Loading and Processing diff --git a/tutorials/source_en/beginner/images/fp16_vs_fp32.png b/tutorials/source_en/beginner/images/fp16_vs_fp32.png deleted file mode 100644 index 83f965ddfa7b2bfed024e774d554f8fe15e6ab3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38727 zcmdqJbx>9B+dc}?pdcV6unFnz-XMZ>35Xy_3QBHLx)G#7kS=Ki3F%fE>5!1vAl=Od zHgO(4@xI@AXU-q*nR8}-bJmRR#o}4dUh9cFuIs)C)lieahx-s01qJ1vqJpd@3JTgf z3JNMJHYT{T=x_g_ ze)%)^5nPNh*HyGoRYhR~=h!HisF)~d;0zVz4)~AgpL0}j{t)H13vh;_gG%{d=Z2^( z|J^>s5(WLAHWuI$1vUC66$SPA^M5~4(6UhfyT`0M|F*t|k%ji}IhxMxomA{{4^U9< z;8|+xI_s*ch?&7`xlCTeOwGC6Z0&Cwph&ohfm2&^XA@dCTN^tkF*hjvUoFJI`R!$H zdfLC5I9o&MbyYQJWnhlxv_f1wTs-uWxU{si5{|De#585){<$6e1f_rL>})T_&F$*y z%H_(>1#^7E%_}M@%FV;a&BwMJ}m;d|Q{=Q4y(b60|@9k}py#L(tpV$6pdl{Imy`#C4(`|dff7<`& zwg1^(<1Ne?2FBXa(oE6L+1wG_{Li=j`+)!VE&l0Cg8O#3{$u$5o}0g}g2|D@mEiub ziI&72$K7N>L5XKol$F+YGu)ZO@O$u!25TSg;^0a}%UVSHk)HmuE-ec^or%A*u!54X zLWnc=hj>3)+7DTp0nVXHfzD2^kiPI*{_bzH{;suszW#ey-RV;^8_9@N#41!coL=_t zSifetu%7 zlsV3=^G4QGS^ZKHvYUMyQNQ%vA8j;GnT%DpJPT6#yf~q*zJ6{jd2I1LnPCi{`A_i7 z$lb=hT<49^!=oW7N;BC8mn|lKi~iv&My2?e^P{ysKUB119;o5~ zzFGg=#qmbYP{myeJ_URGa&%10d6L&ls91wJ1F6E4W*-xze0^9A>dJW;#L8jQ-|`F^ zoD~T|f`WRGd#zR<_Xrn94>;r^ZCItUirrTqum7gTkL6Ucq_RbELBI($v%G@4raNJxTMVA=V zA7;#2E{9279gj88tOYcKsZqYUzG8gU;QZ}%FA)Xb>knKG0kq;05(d8ALqqDm7iVYd zLr7Nrnvz|WR3Y1sig8T6@A1fv?OT1Wj^D&FsU95^xPa*U#Qx^4o{2%Gq;~|Jhk=02l*Zmn z$h{-4o$ASm&mlQp=ZCIe*`wavop}dlMIe9PM6I&gc|#M5KSQwZNent?g3XN&>~woN&#>8}D~80;zNxvH_9q4w)I8hJ6p3b633oz=6y_)Wk!kM1sFkR zhMSlCE#@R-WXvRN+6rg*j@iB!8_Z^3dV=p!c8rZ_4W@}c`o#8J>CA9Qi&ilg&ISxHsa}RVd>1;!Z7mA`=lv)jM7JCcLrHv(0NKnsYhL z^xS@1C5cCxZ1KI3@743Nz7K?tj`zd4Tascb<)bB+9~P*l>a@0?h|D`sb$4{EA31>e z$qvx)?q8tt^S!xxk+{nn&FCy>JuyCJ^BHn)<_L50^Iq$Xp*p4bJDWD%8uLCDd}LBh34*s>4rNNgRH}a_@#b)GMN_#SdG_=Q8IAFLHEO*s-P-Bn zZY?Pzq!xcS-iag*G;r1Mue%ml{Dh+0l9Z$Z@&S)TYT}JKnC(TA@bDLm5y` zQOD)sb~bXJ7W0+8y|V6NzmCxsZ_hrbA!y=$ZNARemy8kZLR|=LQ$qqWE`zDFiF5;) zv!K;@xq$Tqhlwr*!-cqV0*4}bNU8hLDk;fbhP!B8$=v};!}^D7L$K*uSY}4BgRWfM zxo032K}}(nA!4mJZY?8Cie!AMI-i~A^B=f)7+&kHW8%4j6PJ!gh&j53E!W*(giL90lB}#Z%ZMAVg?t_?fJz*A0 zD=^0Qy*%hnfIvMM(#$@wznB=4#+bu_w+mvgMTth3*^XpC#pxy=w52i|D^Q>G4R@%U zPu_1_h1b|jYZ?g;Eau2ZKZJj~PRH#zSp$a8cT&Q2cebcCC%_3R;d|``wHay({+%fg ze97bzSU^@0_3aXw-}|M7#h3krt;ShQ$VGSav$ANtp;!i689o=5SJbmu)f}NN$TBp5@aw{xC|n6viVCndMHh_5+XTru{?<24`-Blwo8v`skXF|{ zLnsvqNnS|n<)Je4F3Vw<1NMUISN+t%MgdJ@kMa+zo}{tp7_VlGMqIqfpkTEOxii%?2I`dgYs;i6vV!o4E5~{C=!gtK}PqD}9KFZW);wtPnTs;ElDx zbp9^gMG_Ju{L!sB?V#U{rmZC6df+Q}ud6^kbE5t2ONAY+IoMt*tYsvV4Yfc@wXhs} z`=-=-vQ#dUBzwA;!`jWSsc&cQd+ZdfLt1QQknZp(bllkQlIXx^{QzBuu zsr@Mh1Ai8nK21$zuELTt!$~&irFj*v_bP=nXk-(H1!hlXWqRL~^A zZG1L>T^r7P`xEEs0qQ{Rw8zna@JT^EOk)7d-_hKpJz zjbd1aN>wHz33p$k_EwwvUHK-uG;1Ki9m3dUqj~@9-Kn->YLPW<9?ut%M=YAa!46T% zeAG~G)H_IVpH1o9ies;^b~atI$N$}SDT&A-oFeyxUT%#XlL$0L*F*hs=DN*)Z1Fu?mec3ByTYB%#Kl7}@*$btS@-cu3 z6W63ts3c3@PZ$z1=1rcNl&HC8=P&=!czk?T30uY6(|m-|jT{r{8fiZ0qVz~{Z^`Nv zD!=zf)vZ-bbU+>={!Ya=Wv!X>=(5&!O{&5=mop9NhnS9Q_d2^zK~W@SJ1sfOGqlt( zF-H}$CGD8BMm2AJ8}Lqcph~&r z`&9t+MIgEq?c~EbFh0&9J_3QSQ#~U)E_UY{U2dYN#hoil*bFz;8SAm|QV8bDH?itoD$ly#t~TJg%S5Y^(-dItvFh!)lu}P5R`3CuewQnI5%dm zFnCv)tK=AEa%7;id8rtd9G1#Tjp8Saa zHk`_4C=e_C&8mYZNDQvdjp){BwrAA31JRsU1v>>?cMWp(@Q;2a$7eWMP;P>CDCRoiBrO6K5j+KdwN`e zoadOws-gCIi7qd+1qN^N(8V}vm=-+R8_QQs9R{h&t1D`)K+JnY`R*PbOvkB5=;N0W z4kjihV0N5t-iL%xnsK-aj#UFVE&{fNkfPqK4?oh1rm9I%hx$;GfGvHV#aM zT;7WLT-HJ4;-YFi5WDI2DpQcPx_67jYYbC04aV?kzSOreAqkWyS2b&kwQ!%*ed?LP zQx6>S7cE}yX6yJ7!upSZsU2>w;iR5=QcRc>WgP{r6vRN{t9B&!TYth`-8+Xg9IXve z!mD&ag5dI|t-9^BF)QHRT=Y@Yt&z?Q!Bx5Vk}3=})lej|5|JBZa}0bILHu;?`JchF z;OeOYrCg>5>9V|P+jh&jSu~z>q~gblIQXI=WbNCuk8Zc>@(Rdx^m-PMir)=L4WF5cEhuq z&mc7pkq-rr9aEnU9L%$d^^<+-N$x+Gnxvzn^GL%DKJls;)RohA48ccIK3#L@H_eA#7n2?{dPv<|Iz3TF^|Q?MIt=Bqi?9ta!=FL_)bFxB{NpUaMbyj7>)0`?%j@w5 z=A};WN5(vhfs_mHWsvi2nSFa2PI@7J?DpLSqqB8@6xTj&!KvMS^e^twLL@tvTEz+g^y)-;x zsZLlK`?Ks_rJ@A``CW-9sRz}y+;UMHBCXrXq$U!j^(;>Vwy;Vc6}H})H1Kp|MBj=! z5rV%EHhER9CK7EgnN5100rg}W7a*v!F!pvRH5Jbq#9VHA)J;>Cxge}khi~k;ba|&l zyoOupaDnQnl%e$#R;sFnSdflg0i2EA@s%ChqJP2GanekqYnd8PHY*=Pkg6LNH7e~L zo=VmlW(uN7>|tAL7oRj*7T9dv0d$}R%E2-p?&|RD^Jl%FjP+-MOJq;So(ZEt`0Ds1 z(7(IP*W|nX)$`rqOj-;4U68jqM{xzbTmFf{#-hAEcfx$nv2uhVMbCYH$pQqNqa}L$ zuf%I?6$3&rW=QKpPWSSNp;r4`B932dw_NN6-G)Cjh-$E{eyyG7>jKzPEW4TCHF~|* z`8Tc$+f?z0KYc86wmM$NxiSaO;#nT&DMhnCkdm)3Mc*PIW~+PBX)l65@GdzN^1RT7 z`02cQhD5RkPEN73eH4|?@)IE@wHQ7u{pTgfT){W7BAX78a|4;C$lFln$ zVj3E52n5nK+`eq#B}TkT$i4fg=$hsY^@^;Wl^Q9OMxxts*V1%wYw>GpYKl?Qrqgvp zGE#MRe6781wyyZRqxjsoCVJ-AfI)3{Y`vX&o0z0p|Is#GsXj2EQ#IlMrKkap#bPjB zoO$}2c^rrl!lR?3@u$)|;c%mT^;EhwSbBVPgHB9O`CGHFCAu0Xgma=ObV4clAqL}~ z@-(B+Z+HKag4z(OX$Q?3ZgKiZ`DSLq+Vna*HWNx>>PL83Hu1HT%?x^nxrueUYdgZ+ zM(XEg116%!eXN#z4c~&`VSM=_A-*xuDqH)3O-2hCMJJ|;p&vqd^F=ah3qrQVyfv9@ zE)?^}?XqgVHi{e(C3a1|xF|JXsIVeMD;`f6?oj~Gb?)Zg`@0>vGBY=`oI3PU>23Vc zD#i~VA5GUm2G+PEJbfMRfl@t%I5h$9n*e70^t^K1zJoo1~h)d|J%|-mJa|d#_dq^ z>3E+FDt|}j9mHa^Pxk%f)i>{r^mkku1+a`$?f^N9;Mi%r^e1cOXaY&XP;6oF&bUnz zyK{7VDpX7fI7fu%p(4D)ao=fKClOAe32xKluJIpm`O?7@ z>;KBp{qRm~s&E93nqNVd{h~Jh7xp+qW=^RZ0xJ!qJge3 zJWMcv<`>QN{nZd6krB6^kaNaEYIzr4k5?t#if$2Nh%^bQ67`6e+^^btdS`f_TuH8C zdE7vQTx7UT+eMgiBH$s|)$l)QEq1Z4gQ#GsbU*mtVA}uRAm#t3_lmeT41fSOJ3G6Z z`ankI1O~Bz7UV)8!7}ir7qHy|fd3x0;c+Yc2*6kY0c+QkC$)(E<1jLApGgU&Pi%}K z_|$wY(tjK6<%V6#EG!HR3h$frva+%fSKqz_&NzTH_kjQ|k~fr+-y&jrrdA!FMv|kV zqM~c6F_K2gFzf*Ds{Op)8@)^Zw_FJHY(LA0+t`IWn&TG-Fg8FP!@Qg zUu(B4PrTP^qerTKSm%Blm3;-kL+d`pI2RV zMN-PasaZVitidQ;99^CteX|&N2w=Vs5T6(j2WhpnwMEcvd9K&&+h;kg4UQIRF}ojh zl0{bhJ({wm%zCI|cMg`n4fU!;BqJeYWCc<;#Q@!-@TNaMTp7y*q3uTydnlC|HZy4D ztMGZ9*;4?Z-0OHm-b3u~;frNg((!8n78dt6B|vOk86 z7smR?H-T}&dG+hdbC<+;F!UQQC*&g^GNNJLjd7iKmj|hqxk|OwL`m|9Yb};w`@7YC ziX8RV06cfx7-a-ubQ99fXqxKpUSo^FBxMl2{d2dvWC?1oJzn!}=cQTLug1L=_Ijr^ zq2Q0q5)!lPl}{>dZ+VA7Zx9Ss@J@U&>yDD6`KOE9d5%KV#fHy=XAdd`2)*K}pOnJU z>VP=_@c>CMT|4G;erWD~I{n7w2B1eo^U5J0O(6IFk1@aKPv$oV{LIDJwnmi~$k4ik zci(6E08)hSbqj|9;Q4So~oVu$BR~##Snmbqxrjhi0-$ ziCml{>^cI$f3NBf21DLx$1}AsN^c#oVdacQ=^s6clq?3jCx`nyJ0~YnlKp{MZ6c?> z&^Z8T0U@{OjQ}X+Lz#bvbE5@S>^CPI;N;u$&H5nsWYYWgnm3=}>y!7mhv1g2*69}S zM(r}gxulO?h3JE)wZnt%riZHo#n$iTDYpt)Ata-b)Z#jmvr!M1{-rACywRMO)e>2r zJ$X^C^F^EW;P_Y|pW&WuTq1{_=FI@u$Q&RS>55;L8Q7|6J)w0I@k{wLlB+*cV;gsO z{oh^&9^K&ovr9&n{80bhFnGp(YX6Ms9rCPyR(w4Q=K4Rc#Pz>w3a|n|$cz@Ka{~+8 zMNY`g&D|SA*ZwLUM2WnDE?#49;YP-PT32=#nfy1dI{UiY$>YQ_<{?B$gK+Y1hx?9` zN7z1Wk6l|(=ey#^j|dK*wXT`p)jL1)RJO<5Y6=+lf;LlC+U@SzT_9$myHIba#2h0_ zVC(OKE^Ms*0|e2Hv5{F1?hIL9)}-p!oM`ym)~w+ z^aq%yk}@xj-_1Ih4oT4tq@VCLem8b-UB<8Sho2B&Ya_J=u+o2*4(6_zH`-Zw(_s2a z`BvKvrjnfwLc4PtkD?U02?zwEv&4^%PWbah5)I{H-3B*trqEW~K{S^Lk*zZj#d|#9 zdF*?Kjz>LJ=<95Qi?ZX|Ag8pnw1-5%5x^(qfr)Z?foLa?%4JhPoSwwrRmbW(9(tj) zr!>Y$yE7N6jJ~$7ck2Jm>?HF~UQ4DXgbiD6;cO57V!4tE&E+vZHcQ#Hr&fxDu*&9Z z%B;rcakWZ*uNIOG=Gk}#lK5pYC(d3nRT<vE*|_DM|CcZtZ~rG%eHG!YyA7mI#T^qN2Vy0u2lapDEFd?)*& zcdV%QKG(vU4FZoFem&o+v+exBK+}?oNwnv~MqVW7o?9pQrL-~ITWk~S{vh@!VZ^1q zeRRqYR@bFu%qOI4cxxa;bNb1CT)kFY(8-gvsG%+z1#O#>_P__18D)vJ@sL^7*@s`w z3wM`_a?(fzkXV?CKjwFKU$&;bO5HG?NWKh|S#CZEWGu9O)qHnwq2SKX=z=IU-Lfa% zzm;ta(zF7c(bp#1o-oRsz>XLdMt7jK<^K))n=Ay>md6K zYA0K_^P;sdH)Lgxb4~rOgQV@R5pdtWa+CJu>Pf?~rG6@B^mRb%gbY5vIq0S_2OJI` z;9^*{@*_F`2e`*T7H~A6eA-v8zS>u_65^a?$8Fp7cthVje^*{3Y4kNkz>%5f;Llk} z>pb6Ty@}W}-d}Vfh;ZC72G~KtO0jo(?vG)mZ_djw$HN7T^vVn(>@eTtR{e_>DXjrS zTF~onOi6@6H1m#6TByqnQ=-1mFS)wLq`l`;-a}Zd`$;n1PcyngBydn(r3!GLlust4YCPEVXTjOpJh4Xtz)v6u!$MSSMD9i5%x62>1Q!#+NZoasr?dG*?M%kEp_46S>?<7d5v z0Y8mNygKzcx`e6QUtn~VMelNpt7pcrx99h?KxE8+l)}w7yJ*sNlos~i`ZO+y;jz>LmD}wirR7U0!V8`n}debw?v}1mzF4fZp_jUT|(@six(-*B- zqb@G$aPsXnu8MW~0=h`6IM>BX9qQRfAs+aNIahLhup6q_hRRkVBW4@rTjUVbMKDK% zgoNAzFW+3YbllHZ5+f^gu;*R(=5HO!_z&?0P{ z{i<4sXgm>nv{;_KA0pYxk7AsYe|c@^Gh+qFp#Qwt7Grl0v*7Le5@>)?j1BqxtAn6} zdsu%Sb`l1;ezQga-HU&Wxx2@Xzu|-4ci=GLhx=nE81_zCVU^ascsIO(1-gp27X6A4 z@c_M|hqcvfwPE{wgT}q|HNIJii%-%!9gOu5q0E@eyxoihO_r!u*LEq#mF;`IF`ObM zt;Ux>2D)8*Q+oxE8+@j6(jfCqZmp1aEF^yYv!~$^7g# zE@pJo4PUa~jT#_YHyaR)uFSnmxqO^q$ak7Zvw~OMio5KglksfEQ6;j0Z!da4mwZVX zI7)R=%yspo!a|lJov$e+hRrYKA|IMZR6oJL0Oa@U_TYQBWha14P5{x8Vu}DOw-SX9 zyJmyWQPHu{FI_{H#248)rje`@#svOHu142vkA$i}@|?_#2YnhL03=I_+xLvu9~?(NLu^XI!e#oXK244wR!bfJ+gl`6f2l+@hK2@{Fe#gx7LPb-yd zA_Vt8X!bp;H>a=^&kLTdBmV+loWI%Pg>rf)&{mN9dpUNS$_Q=48O>X^IYpoF^&E*F zi7=MS#z5YWvRXlv?(Q)zS$XHH-Bk}&T|}$Mr8S;+xd_@d@^&k88!uw8q|`|ye!<$Y2W z7eCjoY)+M#dtB)_p2GRRnQqB#G;WGhXs$eR;S+n8alj^W>Wqka&MBr`Ue=1A@vD~w zYbZ0ejVu>l8EN9KYKCr$7}IqQIrs~prhx^}>T!O4 z@np<$F%S>v6H{&4#K(D!`;sn+!c2-e-0WKh7R!%w?g-RsFF&DEAZR8mMN`o~+p%7Q zg*PTP9+!#f3vvEtPCm*dCV-J}4D)LKG+__FCt}Dq z2BDug@^m&9TMY+&BZ+L)lE9xY-$Y*=x5i{W61!Q|Hkm-6-@qkY$=DO=zV&!+al?|N zX@d12%=zU-SMA)j2C?tZdmj#8@F z7Jd3u4nJ*dZa?bk`ySc)wGhb{g&^WEzemicZC@!HT03j`U#o7}jV`5s8C5wMnl0}- zAn`9c-x2rJ#L|_j*<~xhj39v#sQ3OVPRB*jx_+pvslht?Ldu7m3=0ic!wFMlg_^_~NCiNdgtL-g*422C zmKd#iB3JtOm*>io*JoyW<;MQ)R*u5w7-u~ZrNxZi6UM9uc0TFIF!Y%n>qR0G$X6Ot z5uz}|N4in?(XsV!JbU}i=2i|jDETT@T-CnJstkhY%Q)zgGs$jf(qV4h!bweg~lWz$WcsY};pz07VBXeyAH+;iGEw{wAVer;{- z5VsG;)-1UCrbD`O{Yvea^3h0TLSN{$*)sB~@%8Kl$)B~Lus;GM2B#M$70&LB-|#P} zns5X!nH;MZGh1@%!yiE6>#VAR_XZAUZ7mhoEF!oh7`N-ThE8%2~bF zsQIh^w$a*9SV09xlpo6JpGfObt3{6KQ+MBb@7;*m57=WrY?2=CMTE_0G`2q7Db_pD z4>Lc-r7&2LaYqy{S|LPR9Hq9!U2jm5o81G?YKobs17sNN+JuRSDR=fga3M?__3r7> znltwZX7&jP=24J4Bd^4PmyI{`Q+pUDNdFi%S(+{@UmTRFH2a5mFEb=KSWLorVlR9T zT5PQYGkhCV#U=D|?Yqwyf;m}gVa+pzL-`*1ns3Rq)-4QrXAHR!g2M97@U%VKadY@- z2w9&T4oZnp`we@ z3UG(x5B*;Y?tB(4?%=zTcV{<3g>t@9@UV_Gl7F`LeV3n^LCd&&`DdyTeVNfGgQ3;Q zr?UiU&~Rp=E;8!wnK7+*)bnM?nI^+$rfD&caHrJV`7I`{^u~e}O2lfP4zPPFh}DNu zd3I;aUzo_Z?zMi(MC@p<1vYYlXhmY74$%B)yz&PcNOQzSTtn;nf*sL#QLHo4$A3^& zeXQd1*;#IB9;PSu;Iqb?=nw>5quw7F{G-|m+lJ+hLBqm6)}6wg*6udFQRDdsdLcj2 zvDC*W-^jOO9+cA+%+C#7WFT8A3pxk-lqIxlZ)RDcgK%!z&b&yl6(Ht!hZSX>VDF`I z8?_ja*%E*{u+BM9eZ&T8v4(*e_`L4i`YH1D;6?`Dnu@v}shF!ib6gp{+|MSUxGA2)nEHXA0H6CNcVEXW)B=c4cjH36oaoh>I}ZO-!Q z3Qy?W=#e~hs@0pAcTW#a>C5!tgje}+F`Ql^hE&qsPg8{=tk1v3a9Qms7_!xER$7JT zZjEYF3)DU>HHuR*@@9ptaYr0hbk$O|6Hz|;ghx8&KbJ3669&_GIo;$`oYvy=^b09x zX}w zD?4|du5@)CIkNLT8Ne!w7dh+w*`6PThz?JT&0r@h@^SGgI&bT<8p|mVe&a9V}D-_$JIePR^*scL=%3>W^rBWT&4< zInZpYS7XH8UZ8iOyhSFj+(=}WC)4Y2@dItXQvF`jkuB1aovRBQpDO8FCtt{ytH4az zVA7~KQsOUtU9i)hkPXki+?u|XxqL>(Xw|3gQA8w!bbYDs;%SYH9IVe{>#8qgrIvL^ zn&MJcr@rGowT63Exdx z-B~tI&%25u!BjW|v~4o5jg-x&E^Dy)n99krB4YmWMQKB4whS5*PBwL5ykY2bTk@eg*B#+Ey`M!t*sbK8o9W?8vzQ_<_YNe<|H6ve+q2^2H?3wRDw&Y3kMprs#(5F8SeB4s* zOI6RCxDL!D7(JxXGacusmY)51mBAG@@n?@K``)^lXP37yVW|71eNO+ zA2AIAg2o%4$H&|R;e0q4iS2)u? zn8>UA#mc1H!H<4SaaXu{H}Z{2j5(HT->(BFhRX?6v!A|!i1}u;JB%-P(5T{m&}}dp z4zTmZy0kBeNJ)X^fBl)Ga8gs!>-;&6dROsXkIbT#Uu0}Ea}TIl7oQ=nqgr2<9=3b- zRu?Kv&msFBP{%RZFo#B}I=aWU(~wdyZZryg;@t66?0u7=?0hpH?e3GhCSXVhl7zIW z^GGM-@dlF7lY%`)rg&5dup~2*0yL!AHeum}_jGwxea$Eut}R0&9k7U}+B4nos)M1pmbkQHTn<8*<$z zq{Y(?%bz7+qKZvKT1#CK!#yehiA_41bPw8d;TP5zYfBr zTf3aVp}^V-ZgqhK82+D)rRyc++R2GB?zYX+ZD3hKHNG zLbvA9O5FU)$_fHk!8!LR#pa1PT)!309gcZLABXS!ai&30Xf2Hm+w@UePVS5M8>5bY zunxDwrx}FAR%{{go+BsVwr zI`z@#fpx)8i4xaDoX1CJT8N{jXTHz-9s7FivI?w6yV6Ahe9#|+<^+5wl4H-o@q zuo>s5CnQ`Qf4Q2eM9iY@V#_5M-o#)gS;AfWaoWe*(e2B^F1+|f?%4;!Z+T`k?m}i3 zp`lJHap9pjhbM75M+JSGkFZu|7jPU!No?OseZY-l{NDXy)Ms8d-+M|!lEqL-7;TM1 zgb7Y5rEMoG|8qjkJKaO&k3ZVrTGN%-&rRT&l#-_xMe{Qn-1&5lQ z;KMEAhY#6MQBk|d*V>AJtNFaPwmpWv^$vMz`-*MRB<&-Mp1&D-9tWhW0jQ2b0i9VV z1v1JcBR~*Be%3@pMNMq2udJ9yIAnylt9<$NQ9+Qqge;6pe5PFz%YNs{+Sb}y)hI7h z31#Uk5%}<)jR@0^nHhawvABA;eGBw%-8)d@I7kjC9*@ia&|{U@z6T2k9RF{qwEj=$ zp8uo7=l>5xeRc>F6O-Ka`5KMc`eJBAMEqYuH~^%Jh&ucUnr(6)BX@*$N7Ez@4{HGR z!TL1_PrE>E;L4mUTrl_p1mM(HF92t0b$5=Fg+<}Z^J0s;p&WYOWDPxc1bcxJrs?vq zkMGSOm08$xAn)lI7#JW|dPrn(W(d?)k-YSY+(r|9cUoFn4nfs8TrmB^y2Hu5=iY`j zeFG?$d1#it)%G5*q4JZYx5r?KOLANEw3bsz5oY$gxDafg6sRF0*8nhSVU zkEZ50W_6|axFiffTXM?-Q;67S@pf8)FZ4hTqzLwr$5jCactaqORZQ%qTBaoDvuDpd z$PpRezdxQ+mp!JvRpj-2?YQ@0-Q-F3`fUMO@Gd#jqiV2s9#p$QuD2_Pa)Gwxo8=f& zZ!&)Ykc-f0mKj1VM{`3n@N4bn_%3z{TJaLOUX5mIRK0!H%#jb`cqJh4>M*S!2ZIQa zf_oiB-kMmfu1vrnz4FiDHy=oOj@4KL3gDUKqalL9X=q!akCA}=92fnyF`5?#SZ~GO zRhBM;V!O~&0*_joX?nmfCuI6uDEj&$cIQTmUvOWQPd%WaDU%wYMf%*z{nA(Yu0W;1 zMN5s>xg%7<^VH@l)crmo6dM>B@;kAB&L1PE_i&3@s0cBL2qR$+OH52ulO0GGf8n^? z^Ep}zeeF#44h)dWIMP)BC%^WJQAy_8XierZ3E=HYaWX3gNy$a!tHyU1abVhBOD4e^ zT#CH_icUmClpT_OZ_*(C;ay70AhRk(LG9`@m49IxPhjB6f*6=J_iLP$3pt8KFz#3$M2{BW6ojNG(~Rq9x(zW zY6%)%`0BsAqo|9KKw45->v?r?vNs*Vw9K_+>2+IKiU1Y#Kq2?!K&(;$QPz6>g_s72 z$l`nBn715GuP?T^EywaBGq|G&8EjNUATi}4zSm7@P*0r{LF@eJ&puZd6!81huhmlo z6cL%CPI6ek#ouiYx37M4*_(gmoAQ*9S4#ihLxEvHxtE6oG1YK8PW#?!NJ~hFUdROB z9eGL=OP(g?V)Z2Zez#DR!*_Tzs8T@?6GH7k;c|YU)_1{?y9N&GykppP++JYCHqiK- zuaH@S!f&6eLWiX;u@|Dex1y7$-9WqYbkA~(cG(1kK^Goak>Fhqo5XW`=7P70%c{BYnJ(_$vnW$+j_|y z!++e?Los*j0k&@*PpqJ$Y zg2(YIT?BZ%jlEQa)b=C#Y~;7$M~WD$ZrYye1$G`?!pAuVeR$kW#-Q4JGuV9yF@k}C zq1V*ZbnL1m~!m8OpZuSXiks4cGlp2Ua z)0k8rURlmGAO2*&E%^pouq_88uY>nb8HM)F?Lei;38H`JR%r-Tkv*={kY0dJN;>-u zalLAob>Vyus$7_X8Wd>thR0MzomN$jJpq*Stq=tXP;i9_-w>ap3p`*})}ZjGZ}O#8 z$Pg(&vgbgS%28*j)Iad_fO0E(S*yZx^a!&jgb0%y$7>)gMx!M z!!K{86A=}BFm$Hl8O(R9&PS`5tM_=ER{K5NfTjuuu3usL9)e{N6M~YlySloXUpo-{ zNIrs>v=1mC^Se2L_aHE;v!^p@e6ly+?BWaRB~N&o&R0`$;5Y;X!d)*phNNzqAi|Ez z3Q#W~-wfKLLpAxLTagVxjL6e$EUxq=GJC;pb+=TsBHbeVKm07oxt?VQL4tvMV7%l6 zf(=fSDFghsK%@*o0QQg4tfYII64qpLE5r@HOA$d=d@D*j0EV{`2y%!2vS$Ofn4sgy zrQyXoVGD2izXJgf;WW9s;eqMa>m+ey!QQhS9c%J9FJ?M>y75CT7w7h099*|pT%37-40C6 zB06scl~69<>&q_kaQrD=e1u?Ja<3m&i?O8rD*$9e)P4d%`w8Nqpw;V$dNjnCr1u5G ztW>P12_KrXbB(mruIs9s7I=}phx6qofe^!6^Vs!8yGYa3JNg3)ZB;8iz@ZI47HShZ@m&9{YvIK(nzmQ(JZr zDK5GW>i+n;X8jK=OnE9$=Df;H2$q1aczzq29E`U5`g*6!^fG@44N44$Af>+e4wWPlM6&7wOpQ8XK9#)FWi< z1c5PnOpwahOa!t9h3(n};HVXoqIRzkaN+z}oZ%g159yuX)hAVOAEYV)P!qCHge(G` z@I1NMuUti9==`jOtZe9__${cye_>+ligY@(oxBT#=en(60C@m!;<+oXBld;EKpnI6V^1F0#G zuRO;1#n=SU^fCjGYWV6VkBCO!O+Mq+N_;z-XiTP`^?8`~JAastU>cP^-Io+g zF>FU}SukdY{(`0i$}Ph zVrbX9RPPAi(GEK4qJ$}cR3`#9J79zL>uwbU@b=y7m3%OvQ`Ju~BmsuLzBfVmGdQZP zS>GP&*N~Kfve57Ao;>KKOqHe(q&NEN0F87-eVGmW4^*VLB@*g%J`$ZW6;8sQPb|EO zmWFkuW7==I>Wcbl6@@LF--Q*zjm zja)5^zvnN+#^w$FWCM7x`ZtR{F)vpGXFKkA93k4<+K!nS-bJGwd1OvCW9<8pA$SEU zf^qG3*b`))I)+x;2P)0q-_E&X$m1(ju_8G3ausd;=BG;F0Yp|7(SECyqg-wAMmmcR z6^foreAT~T@}Je4oz-wEZhn*DF6T=xEWmp@pf?TQXK}EI<5IZ4;E!WPC@fwjW34|U zVr3(b{{;AsV;;v6+vHGG2FNyDVp~vtFN$jW6u))R04UUaqH&ew4Jb3|tI#yOnH71} z%|g8vm#qn$(3p5CGK;84y<)M2Bn)H_0R+=ebZ(Z(Vgps*LJeu_LW+N zCG{g|_oQW=r9c=jjXkj+G*dH05pR{?+5U`Y^^j14CiPR+dylwOroT9qB#<#4v%>Eh`2&t7EuWiMJhbN+5^Uk6+CFV}194YDvi;F+}9 zqMS59`i+wscA_Eacd^UYhBC{LwoZFA9UO$lp0FR*Ub==&U9VdP&C9@kxu^tg=wd8r zfg+iF6`qWU0Tm1LaZ9#B$)~r@QQdPDj){)Gu1=hii+1z_>+e81;C_6TF3)daP9P#5 zwpaKundxMk*y70oPz;I(2%D!1L?R4KOU z!L@*6&wznh<-Ma4y~@p@_7H+CbqN+$?ZOxz8tOb+n?>0F#oT*FH5t8KpNb$V3W^kw zCcT4#^d=&`_Z~z*dMA`Xs0t#|dzapO4^2S2^b$JKON7uuAfe37^FIG)-uX5&Yt34d zPkhRqJDeov+I#=@0bW}ELRil*E$YcHAXS56S!U~N36hWhcK(X6(Q zP7${EOC|CcV-{Y1)91^fUG&rKGA1o>rRN_0>nN5uZ{u0X$G;%i-y}gjcf@`*0YJ|I zer=mORjEEX=RJwx4^bCYzc@#tCLVa{2UvCqND)3v-cMs`p!$3urpTV0Pxi++>i2RX zBRzy_c4agUrV6x;EMT6)b;YQ9>Zb+Ji}vJH%@YCcxDzjn+=zM)h|{{`Ngkxb!h;Ku=;MJebwm9=$6)-(F-%lci| z+$!A%;O7qIzL<6xO(ruJL%26t7}Z|*stTXaYUyk_%v}oz$DTsWmZ}M7$+qlF&(N|b zV7|PT*OImIcjrB<4uqeHN5h;a83yf*=KrZr7CpKXQB1bf-u&pp4>}Ig^PR1V!z=r_ z8UyWUtAQAXP$nQ%4H2=G?x}O?xY8v``!lcnytF)>GqJKAvsZCusq>yWJ7O9bns;5; z@8*T7SPMLM$jsdWs|Pk-F9+VkCq8>7GL;_rdH!E^u>eml+e>%rljR1J8DN^(Ibzob zBJU|G)5-NsY5$^F5}bJp7Ht}VInJP#%rn9IO|QOPl-|Rq;xzS_UAH`cmBSNMQO`_+ zjj+45_&X;0+foTyzw_)03NK(B_jGtpg=kp#ZA|Fq7f`SU;P-`%<37l?!oC!TdSG^` z7$ae>aNFY7#H)h|j{(Epo|(}Z{A#s3l*PDmJY_6a3D|}_@5RT*HzMOUwpOlxFG2^9 zTA0j&ATx1pVAqd++Y*Llx?a942XIvbZFL|k|33BiHS!(ag=c+NpunIDEnc3}<>jS2 zfnZ=@peNWGG}6GP@y_9Ri}$DWWcn>AP+;f|d9+@gY27|`N#i$Uzc%@0eq}!`S-RHo z^GP;PcdD>l$OY1tYodn3t85tzQ+ zhl>C0Qh>ABvOMHJTlLsW=OeH>dI3!hqMe;d694VJ3v^?wr3Uy%>`mYoar8@2%YLv3 zms!ku%3AVu&E&JC3p0t#J(6j9SLRkvCo-u^|JUI**GVte!hk$~_5P)NSg{0}DTIRp;f43>+ zm31Rke?Sb-ZR-F)I*E#zZCE+5g?a3kNNQ+FJR1+L`i6aeU#66d2UNCzFT=!KB>(kp zxZOL4CSb-;F8a6c0>l-@KKwMmUUdhhh6w^y3*oasmS!C}e z>}>nd=#$@wgi4iTqti+vAnz285{z+6L_VwQ!@Qn(QjUL)!F+GQc6&2_yU16F+oH2q z5)6xM$g~52K)piS-pPG=hHPQlCtVP4FRvF28QW%A_qOVX*g+G+b@$s!54}7hKy@tDvl%{$~2f_g<^z z=7vg*U$0||dsW;bjM!1xB@#&Y=6QEMJN8@9)T|g80^&91$}VC&v_uzHXq%KN+pmv7 zE6PNDeZolMBFP_6^+f5jaX$!d?jZFhi-y;y-G$;-=vbCFht*0jh3Yk`-9k&mNv|7?Mn1F&$|hCTUO~3 zU)Es|7mL}rMlVU<3HmHictKDp6uC86zdFe%#ynUotg(A6s;wRu5bptuGrt76FWnL$AkD^GhXgo6dWbe7CIz-4fapG*!Dqy-DXnOR(H9dt!hkE zoa^t3A)nu7YQw_Zm;Fu%PGfo){1bK7{gd#LFoURY;5pyRZ@s(NDVESI#UhSDlX{Hw zQ{J6njg^I$%~wr7ifZL=gV&kMBTvSHC$LIzK^6sPS^wR$eJf(flD8Bm%}WPRgWhMq zc3DooM8zMETGPEzXN0O8Qp1w*qu-MfAEJyDfKSYRg1J*-esyM@1)EgaF9n3_MR=pKJUOtNf)lixMQ zvyu9U+4GE=ZM-ofDFFQ;pkjvU{6zNHr>|Y}cy8PM2x4`l`>->nv^{QAkMrpeTvGlt z!Vc(xJ5;5lcSJ2Gbt0$Z4|F8scOGnKtSqzBou9X_>fXq%U4?+QFezq|9u+{ zPEWZ8IOW_7YIC8>6z1^>XL+Gd?z6-4t0&tk&xYcAh$%_4iJN;rupAOTip4QWRchx{ z8*(LmD<^tHmyi@1Y7Fx>;q@OkJUe?qFH^hej;SwQKCNcAp5?fS%tB1rk>i{OTd69p zW{Yo3j19!nsk{X2IZ!~P9ULJIkvDd)vp*2+Du#0tfz2Xy@Utr)oeDG@a66H3(vOdi z0E=oc4=gD^gxvaO842?+@fU(ufSfvbuI#3Pgz0wvXxo*Ji1qbjiVK8cSVpsPj*|#_ zHMrSvQqrC^Vj0rc4Ce+@g8-XBJN+{McSKfUms>cDTNJtW)$OM{l2G$F_hlL5fy-CV z7k@lCGp1M3>(hbXU(s<3fbia{{`<6k%JMODB+Il_|3}=@6W6WFwJN}(z1x}BT%n5i zH^ViK6lw|%tzJ1rQX)c7QzrlA!d|RWu!vZVD&4eKJKBC30d6a61Q1y(;2f%1f5ZIy z%rdT_2$vu=MAeCiy`&f(e6(=CKo~a3ba#x+g{(eu1SE*U>I+`QuMC{LCnPyb00~Z4 zA_)X0sh7-5nHVGg6$t0@q0=Og>8*}OC4Bc>t!QsNspFCh-KDfB{{JHk>HizJ>Hp`? z8i2jOJX9-~|AXo_f++05T%4)3TVs zt!uG$4b)az0$3x)$q&0PXwLZ`zOcn9KmyQlZ2d8KB)A_N0$##w-2KLOYb8WF*ZG`i1wmmF8xxq#PmyPqmH zZmzjb1EhMB8``_*AkaOm4e4vG`A3G6D^R@GEto|Ad0y zHoo9WZWIvw-#A?D_5{mC zQvH`-c0RL|D(J)wzyNW8WIYHd>L@f&{%4_F|5DH~{ko3p7}Vhhz1S_x$^+iU8ap`m zZDZsc84Cb8!aQ%@7WF)sx*97`p#)qqQ}>GItKcA@+=907V3b8DBi-*5x`<4(&x zsg`n}QEpESXg~xiUmQ*i_^ro&?K}^Qh?vge(5slrV&)qYT)pz1+?_0p_}}48YGkNr z@U3gN2yl!eTq_L@X&WOMMp1lo_y27UCQN1lrY_L@)eJ@?jwjWicmJC(q)D{E+j;Qg zcI;kxBG}Tn3{isDWX4BFKLyH(rs^C^fh{Md7U<2xKu>@bvTH`-d>#@8J^KStIeoA=vLC&++41Z-$tO1*bzunS7q#UR*)U2^k zFyUOL`QEaC0py|xi5P&rRl3!b>FK*(FibSNSv7l~6acNPFaNWOjrD-5)QM&q_xGF~ z9gQdSWRsoe;e00Xm(y^c+K>PUIP-th4~`vD_S2o_>vk&yChiJj0O>~Xe@NP_$rY)n z@NhoN0kRFf%!eua#}Qcyw9t-Q=>SbpR~PekmAh)s=S@0HBPIU(+lIpx5^!w_fZ7YG za2Dm{SGQJ;@9_W&F%?yr+n@^GBa&!9tQhEzVTgF6dvI_7Yjc|-$1P+cp#()OR>F@{4)mk@J>^HEDN2oeWa z*w@%72~7VBH^9`JUqWHS_!kmMoSgnQ>U~l0o!m25+~1!=KW!2Li#Va>`o7Fm96|He z`2r9+7(80<13n=f5U)SUZ+ZpGB7rVQcnp6{{MB6vHyE-AD>$SEl(j%R!m$xqS_O%C=k1ZtITWbNTzEk z3CyI*6PDKn7kGw+W)g5BKRU#u*-2{Bru+cRqd16if}yM_r(N?&M*~f1B#RS}>)1PR8}Fk-SRSKM z(+iV{`@#VzHxeq^^QGT^h1@qhaQ(r5fUOV8w8AbjCyKhh*qM3iI zMg9|F;DcShBEWZw{$|+XiGuV{N>ZYCX zx|4miY^&C>m(YL@+;S9sf7s~q=BUPfs*<;U9bMzpt?^JBOK|w=<75uB1~Q1WrS?yvZJ%dv zfnQ}DzcSg+dTVQX3Hune>|{6HaH6v?a~=5P4BonIxA`ZFT&teib3nLzoaN)dg=%)7uO_gL$5GE-NSF$%h3~uao?%46ld#4mc(K z&|T$e6K3P~HaT19g>i;8+Gtrdr6-I*ucK1qWEboIo$uF&q7hd!Hb-zEuQNsW(9XVv zmhfK;Tbln&N2s^CCfcr^c{STWC_65TlgWDhnJXZOGSX2NM{ zIv2X|9WXBDgQjz?G-{PQ?a>l4{1pLTeXrA77+Ope0=Zm1zH(`PY})cZr2GnWzs!)m z+VuMkve5BQ9y3dw7HP)t}gv+=PdBb3m1dZD>CytI@0%*Qd)2oaFe9qv?J=&6) z-8dU_i{k>+Ui(31qmS*5+dC6Mk+k6uc#46l_Gs20EPQxEKT`gAy}sxYdG?ult`o-RZ^4eT6$Uwv{u3+ z_*}W{>Tu!_$*kT$|X4CmK*u8P$g@k zc9nkP%p~+7btH}6s?yYL@Xe>L24kpo)>N9X6s*+eowofSf5^|>RwnwS4FDnqw#uV*3xlL!hZC+z(C`@86!6fttyEAh~M<*p+6O+rviq;X5nu& z5clqOwjVEjGqrHlI^G^x%B*X#vPP%d zJ44AfuI*EdhDU`keap;sx#Z2fi(!PCK~(@g(Y{h-f;V(#cORyYH=;uDSTC@y(60%{ zOZ{~6pQJ_Zd?vZtviwmn)#cLHb@-Ia8x6v159Kb$4};%E$#(Wb-OO)#b0;bXIh!#^ z6>vHz?%FnOeHAy6gDHB}KF1M9hdFAB=x2e$+$*V!mjkG8ufcqZ9GfAiSQz`eu3_t+ zk4nVnr^fx0Vkzma?_*bTQHAX9Za`03l*CEP+C`dL2q)eUF^c(%*U3SEI@t$seAz)g&tY1$Dd}+$1oFduxS(B?nQKKk=Xac(t|9d|%^ZL5ca~m0yY;(@s7BcG zjK;$pvN)@B_E2S=W>RhooQC{O6Wam!M`d3Nb?{r}#7s@BCao9FH&G`esDrO_t^Z zZ5P5a^&#>1c=Y6sC3e{`P}=r8M{uNr_)%keyN6DOPn+d&FMqKp{*FT_n03YEKQGG5kQ;N@gj^t(nxTVQkQFQG@iB{VxMJv^-CU+PK=qX;(M zHX8Bjy%%|_9{O#4^zJVa04*9^G=-PEosey&pg3s7r{0@Iz?>VjGf(qB^z`(XIdmvE z7xs#*Z%AQBgq1#U6Lg}1qbz{BNTeLx&8vw_eul`jpOwmh%o+8mrqb3Mr7INnAUo}$~^X7y5|N|~X$0?}Hb z+=IhI*=&zKY3%(i6&Tvc_dFT;o0U5F7d*U?@bc>>CFyyoOtcxLVZU{~L*Icli>ae6 zlg8?srw6q<`=QyRY*F4uv!E zBPSAx#r_`S&A)y8FrqRtbYuW;Hd=VK}+T+Tu#?3H!qYEFLw;QzqIx*iJM z`_G!g^m<0qXsQp$urDdp1 z1IH#CaGb8FXi6nJJtA)DFGqCji7wHKK#Tv_j2n1(QZgDv-f#hGO@dORW0+Cg%i|Em z+4m)Gq}n-mA65bo>_F;)v}NDefaY~`(B5YWIYtMOiw`Px$Af7#72D2p=uK_5bpDpN zR~{i==ZqljGr#C)asLw-=o;Slcx*lT1owb_)!2OgMX}+A%$$gG>*cI@(Wze}tWHf1+LaDAcXosD4T}kTQ zohfv^++%uJ&4pJG*=c%np+)xAmceN1=p=OBKU9ajD3O7N{KTS5I(MA?fwP^aR!CWG zrrO!XwuDsY@o_XwtT^M9cux^9+y)1-)1}GcIcKxW6A9oDrFVokT$Rj7F?!4sr_AI9 zQ|*f?o@I%0J$q*Ma6weq-R2$&EregP7khW+C+_0(S&6t?dh3brvkT}LE_4L!bz*X* zerMZ8@fDqs!-V`T(B}8i0{X(j#PQ!G`F)RPjk;Nb<3r?3ChTr|)#A=h?skSsnfq{! zC_bgUbBNE-d4!$2|DPY0yp1|~7v<7C1}@Hx#?2lwrj%58*!>pjH0_^YBhEcT@fI8W zYF||O;`blXO#b!?`pj}ix*dWxlWMS=sXQmk&*7t+2-vV??~JLo2puTOlO$cG+NIjn zu1gSO=<2)icrI_mNr?Yr`iIc3yMA(=(1R5va*K=W3|Egauat?J+7HTxKMVIo&XT(C zDaAA1qQUL=FAHWILSd0q+S~67kCD5GBEG+L2Z`O-Q*jziSI`a1o*%H)Fon*(BP;e9 z>8!40nuVM8ULTu(M+z%+^1Jk$skk!G8?Q0{iKEz?Cw=p|0Wd9-RQ#zYD(i%aX=W=W zUDa2jB(RWJn(ZH;(X$hMs0cwP<0p!C=VIAz?nv#w|!*FsTShSTHQI00jw29wL_G!elb@(wSSU@ zg{y7kknQ{nCvqboBV@MCcLGV{^e%`uBb(>hb^Q426|s1@6m6Un$YEMV?%cwzDLBy zA|-i7lLpw{>>)Mj*F54ayhQYQOQAs@r~iycgoh_(NM7e-m9z(WhGee_XtjOaDw0|O z$M^eI=ojM1IM1}i2_pNhDcBc_hAr)n9W)CkmAI0mKZEDP$`c1cq#p|lgv4n;8|>*a z$V#K6?$hAAZel?$RMOO@6g&RsAFcLjeL z?`Fmtr_?HZc_h&@1XJs#*ZD**BM1pst!m^n0?Bw}6VpPBhDFOWgN(=jbauM>_3M3l zL#)6moBs01_Tt3y4}DgGuga$iQ;ic~5tGU|H z5SM8FH0?L^!V7)empoKS{CV4HDVkjdq)DEEAgLnTjlF@@i-32!E@KN~PPivVlv$E|N(Ps7^IjN015nWwxeN1}Lg8 zKWvR@dfWk3a+qYjkiuhskSGYIcohRU+$-{#MaeI`8~+lx+Uzif(Fpdvuv2GQ3^G}; z_?%Ht<8pF8<@gGx-hXJ2B0-%%PYSTsLqZ2+6N(<|g|!AI*bNOoKvZWJJ9ul98xm5k*z%!ZS{F zAEGiCRHl8MC_6&kIDl#zgRhxI$@xbS+weEaO8`Gs^4!y)_?PQXVZj+zJMt8 z^zPXy48fNhGM)A=M`K1HHw}Jt7xX&nBDIcM&E-KEPLy?t*8Kj@&vr2l;*7qh_7sMj z(oim?CuR7q>nNB?I?u&4m`RfwKQ**)Fzhnj@nk@p_lxTc@J-UC&a zOtGHTNWgV~{>~J>RsJZFJQW&TbgkgA1kZtlA94NxU%TH-Xo=SYo10&J_0eu7XDOGS zCUDKzWem^ZYvk_)CD_d*aiu&-MS_``X62M!&1z*g#?TGOTV}m>*`uFshx!a8a;3Eb zjr#w^WdY|zown>e7=!xyx^FrcbIlXFR3C|KAGU4fZ_c*6X^KLfC>AWjrl{35Caj+5 z2D&B#EyX`^UfIzmXRz3H|^l|2b@b-&~~9dfx! z(g~waIp%R~D|Z5IgXt3TG;1ep`*T*nH#G;o0~)X5xbOQ}EU-b#?9&^SMyT3ZyAgkq zdZY#Seo8by#U=L>k2*D(`vr5H3$l3cX2*R<;3Uq`epiCGc7ffSUGAH2N_vHieD)(IbKazM&DgghWo>-{ve1m zg3`yGNq?dIDnpbn^Q!fqZs6v{2=)S0WE&Om%~uAS`SNo%FJ>rd-slzanEw+h7Q9-E z=RBx1IiMttf?aB+dC`X$s)F}V5%V?>BKk^@HQdmji&W5bVN*^2Zav7G*CJk_@mhmL@bJKnl^ImnV$Z1>}H4o2v!Ej7yEM2GV63%`i`2xQ(USdRh3cJ<)h$KKNLZP+p^$EDvv|g$|%(3e7 zlRnhY#Cude)m*hZdT&j)FxFQD%VDrsl;KshskqxNO{i|T;Py*D*f~MJPdaUo-5HEN zO-w6_l5!X#vm7c;Ge53m3b6d(Xz`Mt2b;eB1zIw*Acyyf&4kwI{0RbPumV<@6?8ms zHOS~wD^w{Q1&hykJ@wGYT8UH=Fw&03XhtqVZcIdPD$h$1$Ea{}@W&k5_d?E~0OHqK zttJNFtwy<)9T4A*_FXa1L-8ei1isEl5S$aknNo^fXxCB!f-kGid%mKjIIpfi9%*Wp zry=~Bj*A}$=JN`?gqqIVw^p-F^SipKrif}Ve?e?QRi&JB)dsYEks(;`Vkwh+$1pu6 zz4jm=H}|XgP1BxS>>CFN+k8t~6Mq@A_k>maGVP4okvI#RS6k6cIFsf2_7x*Dy|V9w zRrKET&|MoO87up^3)_%|;-e9())03zcv#rkq}gi$^KoHxVFA*nyX`Ab&*KuIVLCP$ z+jZyap?NzcISoxkcry_N?+5M@%J;yz9gF~@O8f4?TFlAzg9o!uN%DuNSoaI2weNz= zQWosWFKZEHBMA|5&W>@fYnX+8P+Ib?s&zZb?WQ)e)SFZUXTHo>iKcfF%MCtWBRv^7 zRNDshxc1nP(Z}P+5QdMcbBkqCA`L9AHEpMKQ$t--N8?s5rWGF6tWpP|jqNSo^X<>aE|tfa&H%sJ7#ty*YQLD(@rl;M z2PV%zE2K}{GjLdEZcfrocp*lVQ2S4&X01`CgW+Jaj_e|=2Uz(n$9et+YqG+;YH@KN z192CuV<9j8Ev1%B7LUnFdfrN#+C#>_>kJG%l%3Q4?V3&pBtXG_3du-}9R8HN7(?KN zYo*78&or?C9M)o?`A}oyMd6og6;j;nHLk_qH_h%++)vUt$IY@atzDv%B66crIodg- zVdWA^9Wel2uQ;i<9G}SE8A^;3@bOP;YI2}K*EbS*`-^pL=bAhh9}_m+kGZz7^*w#O za}UOz#pj;}1$}tNt~7b__T%`H&L`xY1hxA?&-~1ig>m_)`&+umMU06X)P9BWQ14iw&@;!AS~3zgT9UE`3GhgAF4%2ueDvS$o+u%Nb8XV$e~ zh*Oc`ed`v-9XZv_FY_oSk7N1^RcdS^TR5sN2H`(eX`hFSBigp|XI-Te=8eTFRV?pY z%(JL4s*G5$qEpd$_Udp==29b%m?$76X2{n&cywZ=snZIF z5H5=IeAC{}NfWs)xM@(`{*kC9)vcFRAN@^x!_k~J+rqG`*=~JAqRrD#aTlxw_r~(w z!6GZ{axU<&JO!Fx=1mh!*||n72kCcP-X^SxFUZ5VRZgWfwTz@k zo3Y>NE>-vD70X8)|7x{Is5+Bm+$)*MzuC*@-CUR5qaoSc8Me;<{Ji8q&a00`W+y5t zg=;m}Y8T(7*53ee_;Ze!luevnHz8O&bO7TRyzwnnuT9f(T3Aq(saMnEMime<(oErd z#8hrDLUq1IM=7y)XWDR5IX+t5-V!K3Xvrx$(KxiqKGnUNYKU zILY;%_0 zXe4+Y-)_Gt%I;C~Bg+z_zSD>-^Uu&)ta29cf+V9^+I&7^fB#v(%gg>ifThC z+*c-nhPGx#G`e9nVgW)q#GIs$NaF;6;3Lm+F?+5+Sp%83=lz6VAA&G#K|QAp?y~d` z!+7|{7Y~L#Wv2Xow7DwGw`yoawfJHSQtQ`aS({X|*NPG=6ZFtw&JX2ALKGLt1`?$u z?KQ~ntfv)+o;Y_0ii^N~w;D|ItkYlkb4!iA=7O2&>STtTzPj42CEe2N1Z=#xm#1GfDio6|AbW-(Ebshn7Rn}TpV2` zr2}8@mR7k?eO8ByV(}S@Nr5_L2J`KmP9BU}J_E&8Z};z7Jmg?`aGZYy^vMvmD}-&F6o(D6P{D2xxT;?zOJ z6dMt+rHEEmgwpYVM5X>-Kj?bf*C>C`5OriqKIuqgO2s6xJM^!t60q{XG7C2Oq(mF>5=O}yVn8D2#_s9lZ+ znzt3lyYX9FB6DUREVj4stLt%wIDFB(6X4O^$SqogbtC&z=60m@DA3F}T?Wp2t$;j+ z@z&Sb-t4CSnMURJQ;zN-Gp?{TxcNltLw|GK+H1w)Kx^i4lBV{2Z=Z*5WVN^_#Fzc7prm@CAIPCx@BPGDAUwPH{QAan(Wi7LEAGp=tR5uZJ}dHk!+>w&jQucF>Un0 zEd$A^V9S-+N+wpJjCO;(xuJb6d~7-e8A*YmE9Pbn>mC8fWVOkUy1jL~|#xEw>;w>P6E`%wAaYSbJZ zRI~Xkq=MgbMIX`p+MST2ZR0{Fa&oju+OpCGO1bV_8We--zRc%EaxI6i-+{-SU{-@+ z2c_%xWxD8macHs<@6Gt)6cq>6l6za{1Z@o9U zY@+Z}6@w=#5fFN+i+5DJdW-k&Uo{z@Wr?%VG&Pn$ziAq!-lI*$QOq#WyvxB3k_n4U zXltK3>E>5XlK1&Smqb%ZhGY2rsMn5fkLq1*M5Sb!sVN^a6e!-s?U~^NGXG9(sKnc| zL15o}0NfhKP@fL!C!Gz9JxmgggYa$D49?2%iu^Z>3p*M&E{BPu*wXzVia5j zMCbWJcwYwOFN?1<5SVU6q9#iy!Y+ikJ|m&fwu^jRA}lwfx>6B7%aByJG-PfGDNJ}c zq)~k|1QCuKGQvyfzxpyA*Em2W7;|NPTWeP;_c(V=p$(5OoHLb?t%Iy3NIHK<@#2*XRR^)4)S+=l zQK|)~DtR-_@wgbp&#mU0B=gwZcd`RIjN$H3^VmNJ?S_UV6vb};>^yl2!y{P8my1n> z+=B@}vosoTLzmO&q$M+1x)Hv)O1QoPf2o&rg=ak943hr3HEc?X6@9=@v+tQk7Ny17o$lcS)bhpO7{lKZ# zt3i7Q-K_m$P7kDWBCR2feMOy6n@92;32O0EX~+`cw()JvKfc3XnQhviW_u-)P3Bo& zUEn{VuSa}3cTT72@{wHF>)?knrYP`t@w=X9IqPNchpkRgA10=TDf4>&9%#DB6H&Ce zL~vS<$&#-qmy33$$*{CelzdsS+xvWNd^4Jlg2&}u28_U(D|W%D-hci(OR^_ z_qFlt@fmQqZr^!wYSykfi(1QQ-bvTo+DsKJb0+uG9(?%A=8TNMbhG#g+7vu|suPNi zeIyN2YJLUEyUxL1_p1p6Mx zA72nCY(1u+e)%{%Gm_kOYrN5363po*;geJGe3gPfOOJqLy04O96;&8UD-aEqBb49e zF;v2@ccf?$fNx*8jTFg05fii6U%jU(CP!1>H8S)}#xkBXygd(L?QD0H?c4q_He_{0i-CuJpbG_HXtmL%a*;ULl*e;CK-t$j~=bsl^)_ZPC9ldxE|#7A8;( zS!Ekn`4oQ{s2P2Fj>!il1=+3$9|zJ_n50Y{g`zvcORz>jwMwk#ea}hc>F7n-S4@yO znhw;5{nSIhBx#P2EuL*@Q^)3~A9lkJco@2P44Q(A*J}f~qf)i2K=O zd-R`sct%g?5bUNOd%jGHSHKt94d6Y6H2t`4E7!KcmN+Vw+P2j2LVPHj!CV(7A4CY% zuG#r{xS9#9V*Xw5?WS97>n#}jT9%+i{6%f%1z4G zzwnLaLTb%`IpPg6N0OwrJ^G4PxUz$83^PpO$hU>}ZEZ*6IX#O|?c*qqEqtm0r;@3Clwt)GSZQUUzHDYNX za%r`&sPM%acTaEqMg^FzW}OZm?&fZ4H zrmncLGCh699WkYH*f+Cu8r)xIBW+=draN}cY%NyXDA|-7kr^=d*1-|b#g|R^PLi}D zidHKcb1-k=$&(G^Ep`O4=w|p7r9V;`$R-1Sdq9w2I^Ftt+JQMq+DVD9{^qO%>~r&# z7XHKE_vl04^@}c; zw*+pTHQZCCR&}Cqo`pE`yJrfW?!M=gx@6s+9D7hbz-Ua(R^~6Ik%GB5x1IE6df0NO zUGtc&i1M|@{CJ2zeQP-Ucy~J&0Igxkhw5yJ;)N2Cj9=?l7rtv@srflQ*>2joR|9@N zBYm7Ba6vTX;&M7DLvilMb@lRo(66bow1P7ka_|9NBcYVBwpX$*=vw^Zut!t#or&FP zb248e$#9}Hm+@XCdAfO%AFB9N3SfS|YhX`NR#{1_I+7m!-LF-sDZP@K49C|n$(;>d z)f6JO1ykP5WmH-VuEzV2W3A9-_O|GnM7-FbHsY`AzyXbsn;ZkBFz{Dq|k|?vryl9R8ei z%HX}z?#VM!t+meF+^?nUzF=%7Z*3$hGZ_2pz%e-AF-5QpH6rws#%o<9qCnBb$w#A* z!4;uPQso!9?BuD@hZi}-DP=P)jQkR+^$5g6b))e7qQH;iYJSPiJ1fZ_UnTlgg09b4 zw}c>=!DVfJvODC_O0?1~`>?bn%nW)d-41WKH$#!^->>LC)LYUAOdj&|e1tvGX<~xL zFCY7;ksrw(lyF_%x8-dNUG#E4f5M4RL-^`h<#xh{XEr2&*}I>UO=)qEk{LGhE%H38JKJR>Edxmf@517lzPV`UC>lL39> zTd5K&YNm1P zbxECqnfW+f`(^z(IL_5C;L;Tw_d!$Qtp8pXl<9gN{x_z-#rDnK{Ve^Funw3FUc;sS z-v4R<&VJ5#b}ITijKn+qn|9cPG|JKrSmN*BMOTTxRh|w(&jv{cCOdMe_Job~+$~Lg zI9xZN(@z#MWw=@>igIS#TB;+f_fiwJpHyA5zq1!J58@PUGOCEoVpt`5ka~LDSF+hS zr^*Wco84HS1{~DN@^;b!e}S45@e>q)hcX-t<>`Q|;8H0PoEQD3A^yaCML9cTE7}Q# zbG=d@BtkO5r&f>$SNW>;OGG$I>2?i6QEQlG{Sf>O+-wEmx06Zjc3N{2?Md;zTg~_q zPdl+8*197C*2=SqwzNjtRq0c~_?P>KIzxE~B7z=XgwMkcm*M1Cp}Ks4oc4yFovELU z?T@ZC>GYZB!ETsHe_?W)yt-|950_pZ%On`0%Pa4qc_mRT&-O&au2Llg_Y->({VX^7 zrHX~jiWaFPRJd}{P&bdNVfB@u{f3$Y!S!_QKH!MxIAcL@dJ}(nF$cB%$ySRewNscB zp1FoCNS_%hRswY);^(SHb%Svn1O+cXr#d#gE_Se(Kx9XT{!ZMLT6lJOFL>j^k&6ky zJoV~!ff_9|h{J)d>HVjfjDVsoiH$c4Q;&VOcUV(9|p>0`2Tb{&{*KCe8 zUk=1LJMf*QW$I~SRZLp;MqaQ;(k}CC_m24et><`yX$7!WxC)n@CL#nzLYOJc)Dwb^ zcME1w#00!0ddyB7jIgq|U%Y3xA)CQ$8G1GapX6!_kvyDFc!6m6E&Q`0!Pa2ElAqZa z|I;*7NTu(7O}nL@ckR2?FPbC+fj}A8sd!(`#G^e}`tNo)>1nwslSASNRt;W(--%p8 zUkX&1h!5%|O8p;|oqIUb?H|YM7tgNwh44fP(KB;MR-}bk`-GATrb=}u>AFlhpuJ`BlG7(gK zy;IrNP7;wNwIoJ+Qd>a5Lvdtnx3j{`A;y)B0SmYfREf*kB7m!1rO~Y^T{KQ|A?_nMyZ!e@Ao2f0+NSsyE9jnaE z+o40TeWmW9AQ7O)WYo*Eci%}0kL!)p`g*R;Fiu*5JoejLI{1oj7wvboO{mmnQFhWb z<-+$af9MXZxy|OvuzwvLii<+PxV#3xXsKd~H+p@S!xVxmm1`z8$)7J^g zty_4meYA@O^(Ex)T3(+i6%Uq+aB8hBc^Rdv5YWD5mx9ne?V`76ERk~VYTPUDV079A zOe>E({6R~rB3m6`;RYcUFQ<2|tGAPes0-MCsz&y3KM^i_i%74c?4_W3_jtxite^4S ziHqi-+ER2jL~$Z(GHYKJ2pxWl)5Z9PbK}G3`SfE6)D#Tq70)f-b5s6Dg2I(gy-dMx zbb{GxF%B^jc`%I36QMC`vizr(wlRK<=BZ?6KmSHxOax>cOQuKBLE64n5e$jN)9b%m z9M*}x&|zX5?O@XW%SS)+|3Ojzuhi8TlT8F*igp0IW)8spSX=Km7eUm z@8yW#nGHk6MCi41O1_~P-)0@R%igAZTm6}4vs?}4_V=9}k@t_x2a5Wl8dx}-nA^!G0w)1I<5T&pL`9BT!smeS-CXgR(bF0J4R&k zwUrf7fxogahgs`+|LRWmkt?TpEBcfocd^w2RA`>B&zMlXWPji-Y)Rc$C2pz4a(lrLx_-C11kbQz8zXafSRSIME62GjO*qqc`kW%i#|nkzU)sFE$`^L-c(;ms$YJ z^W^m?ux4bBP$H_o-WjM+YVwI@ehn|Rlc<);aJp}(!lK6rq13#eubaG}gqo4z3w@4x z*s35S%}jcdn`_8On7*vOyMq0*k?U#SSMu+*zsS!H$x>mFJwoH8h9?gxm1rLK%AnQ2 z#PuPCHYJj3%$IGFx5IuwiA*OrZJC?o{3A9qHeEd}QoA@>R{>Zv5E`HVsH{AOUus|t zIygT$1AQaG<=sEw{~$VGUvcFLs2O0m&R^!*&pdm6b#@BOZpAOmugw6t$7AB>C`1A! z=7a*MQ8QNlFoM_`LOi*NXE5-Q?xS@z@1%6jp@JJ&%%{l1cG)hfH3Hh&0Cc8u0D*V@<<$I@?6F389_F zlcl(oIg|9Zu*beI%kn^J{wdi%H&`x9Z3ct|3y4)C&3PgkFj6w~8Znh!+L&{=yKdYO z3jcOf8kvK&DYW_MYOStw0$_>6IHKFHUp^1BX4Q zhrdhTT~9(9*wl3QPqO&sF{uWOo{Kd2H-pd%;*R#pFOAyHALrw3kCYIPqb|W{<}F_q z!OVOpkbFx~sw1*zY88jMy=p3p#{{u6EdiZ3g|9!b|9x#v{HPLQr#(b|!#gvKKNBm? z@x3ooI66eY2IoekpXj~waFVd<_|8#L&<&aly&ixi3Vg0um4Gycs2eh6MO z3#su}WfGnJn#u8w&uYKd!|RyDmzUk<7shRK?*ZM!RoGpE`R70VKR)47oUErg`=7I4 zSroGEJAV)%nc0kFb1|pE#jm*wAkmNU;hZt~%#24?fYs{(@%6%5FHwZ@ZEmD&r<&%u z3Y3L&7?lv(>{b|4g^V81vSOw8+?-ZBja$zkKiHd8HCne9ZJ7f@c~(xg$2w}f`A+qH zkV()Lp=hKXl223R_8#q9b~gcVNsM1xoTO2$73YKu>7isNOG1Lx!Tb(ooE$A`FcsK8 zRY0&@u_nsy=f8gJ(@Yy+{l%rIM8%+VkY&gsvAEh=)3A(9F5z6a)3mX*$)Ex%53XbK zzB7quFBk9Z?50HBklcy!rF%nc{j6Ipk~F#q*xafjyA@ZsjKxu%W%!vQnQV9Nz@KiXa_?`tE9B+U#2uopdEBJp01bx!Fp@|@tcc${6> z!eLSTCX)39>x@Dwc8}L_s^5}+%*(0Uv8%Cxt@wNC(PwX?9FF-=uxGas%A+CCu*%Xs zUQN0e~D&Lb&HWk>3AdVHeQsZJe#^&IkPYHxl;}g#Z8m diff --git a/tutorials/source_en/beginner/introduction.md b/tutorials/source_en/beginner/introduction.md index 50885a09f2..745fedf418 100644 --- a/tutorials/source_en/beginner/introduction.md +++ b/tutorials/source_en/beginner/introduction.md @@ -1,6 +1,6 @@ [![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/beginner/introduction.md) -**Introduction** || [Quick Start](https://www.mindspore.cn/tutorials/en/master/beginner/quick_start.html#) || [Tensor](https://www.mindspore.cn/tutorials/en/master/beginner/tensor.html) || [Data Loading and Processing](https://www.mindspore.cn/tutorials/en/master/beginner/dataset.html) || [Model](https://www.mindspore.cn/tutorials/en/master/beginner/model.html) || [Autograd](https://www.mindspore.cn/tutorials/en/master/beginner/autograd.html) || [Train](https://www.mindspore.cn/tutorials/en/master/beginner/train.html) || [Save and Load](https://www.mindspore.cn/tutorials/en/master/beginner/save_load.html) || [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html) || [Mixed Precision](https://www.mindspore.cn/tutorials/en/master/beginner/mixed_precision.html) +**Introduction** || [Quick Start](https://www.mindspore.cn/tutorials/en/master/beginner/quick_start.html#) || [Tensor](https://www.mindspore.cn/tutorials/en/master/beginner/tensor.html) || [Data Loading and Processing](https://www.mindspore.cn/tutorials/en/master/beginner/dataset.html) || [Model](https://www.mindspore.cn/tutorials/en/master/beginner/model.html) || [Autograd](https://www.mindspore.cn/tutorials/en/master/beginner/autograd.html) || [Train](https://www.mindspore.cn/tutorials/en/master/beginner/train.html) || [Save and Load](https://www.mindspore.cn/tutorials/en/master/beginner/save_load.html) || [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html) # Overview diff --git a/tutorials/source_en/beginner/mixed_precision.md b/tutorials/source_en/beginner/mixed_precision.md deleted file mode 100644 index fd9b3f85ab..0000000000 --- a/tutorials/source_en/beginner/mixed_precision.md +++ /dev/null @@ -1,321 +0,0 @@ -[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/beginner/mixed_precision.md) - -[Introduction](https://www.mindspore.cn/tutorials/en/master/beginner/introduction.html) || [Quick Start](https://www.mindspore.cn/tutorials/en/master/beginner/quick_start.html#) || [Tensor](https://www.mindspore.cn/tutorials/en/master/beginner/tensor.html) || [Data Loading and Processing](https://www.mindspore.cn/tutorials/en/master/beginner/dataset.html) || [Model](https://www.mindspore.cn/tutorials/en/master/beginner/model.html) || [Autograd](https://www.mindspore.cn/tutorials/en/master/beginner/autograd.html) || [Train](https://www.mindspore.cn/tutorials/en/master/beginner/train.html) || [Save and Load](https://www.mindspore.cn/tutorials/en/master/beginner/save_load.html) || [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html)|| **Mixed Precision** - -# Automatic Mixed Precision - -Mixed precision training is a computing strategy that uses different numerical precision for different operations of the neural network during training. In neural network operations, some operations are not sensitive to numerical precision, and using lower precision can achieve significant acceleration (such as conv, matmul), while some of the operations usually need to retain high precision to ensure the correctness of the results due to the large difference between the input and output values (such as log, softmax). - -The hardware acceleration modules are usually designed on current AI accelerator cards for targeting computationally intensive, precision-insensitive operations, such as TensorCore for NVIDIA GPUs and Cube for Ascend NPU. For neural networks with a larger share of operations, such as conv, matmul, their training speed usually has a larger acceleration ratio. - -The `mindspore.amp` module provides a convenient interface for automatic mixed precision, allowing users to obtain training acceleration at different hardware backends with simple interface calls. In the following, we introduce the calculation principle of mixed precision, and then introduce the automatic mixed precision usage of MindSpore by example. - -## Principle of Mixed Precision Calculation - -Floating-point data types include double-precision (FP64), single-precision (FP32), and half-precision (FP16). In a training process of a neural network model, an FP32 data type is generally used by default to indicate a network model weight and other parameters. The following is a brief introduction to floating-point data types. - -According to [IEEE 754](https://en.wikipedia.org/wiki/IEEE_754), floating-point data types are classified into double-precision (FP64), single-precision (FP32), and half-precision (FP16). Each type is represented by three different bits. FP64 indicates a data type that uses 8 bytes (64 bits in total) for encoding and storage. FP32 indicates a data type that uses 4 bytes (32 bits in total) and FP16 indicates a data type that uses 2 bytes (16 bits in total). As shown in the following figure: - -![fp16_vs_FP32](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/tutorials/source_en/beginner/images/fp16_vs_fp32.png) - -As shown in the figure, the storage space of FP16 is half that of FP32. Similarly, the storage space of FP32 is half that of FP64. Therefore, using FP16 for computing has the following advantages: - -- Reduce memory usage: The bit width of FP16 is half that of FP32, so the memory used for parameters such as weights is also half of the original, saving memory for larger network models or training with more data. -- Higher computational efficiency: On special AI-accelerated chips such as Huawei Atlas training series and Atlas 200/300/500 inference product series, or GPUs on NVIDIA VOLTA architecture, execution performance is faster using FP16 than FP32. -- Accelerate communication efficiency: For distributed training, especially in the process of training large models, the communication overhead constrains the overall performance of network model training. Less bit-width of communication means that communication performance can be improved, waiting time can be reduced, and the flow of data can be accelerated. - -But the use of FP16 also poses a number of problems: - -- Data overflow: The valid data representation range for FP16 is $[5.9\times10^{-8}, 65504]$ and for FP32 is $[1.4\times10^{-45}, 1.7\times10^{38}]$. It can be seen that the effective range of FP16 is much narrower than that of FP32, and using FP16 to replace FP32 will result in overflow and underflow. In deep learning, the gradient (first-order derivative) of the weights in the network model needs to be calculated, so the gradient will be even smaller than the weight value and often prone to underflow. -- Rounding error: Rounding Error is when the backward gradient of the network model is small, which is generally represented by FP32. But the conversion to FP16 will be smaller than the minimum interval in the current interval and will lead to data overflow. If `0.00006666666` can be expressed normally in FP32, it will be expressed as `0.000067` after conversion to FP16, and the numbers that do not meet the minimum interval of FP16 will be forced to be rounded. - -Therefore, the solution of the FP16 introduction problem needs to be considered while using mixed precision to obtain training speedup and memory savings. Loss Scale, a solution to the FP16 type data overflow problem, expands the loss by a certain number of times when calculating the loss value loss. According to the chain rule, the gradient is expanded accordingly and then scaled down by a corresponding multiple when the optimizer updates the weights, thus avoiding data underflow. - -Based on the principles described above, a typical mixed precision computation process is shown in the following figure: - -![mix precision](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/tutorials/source_zh_cn/beginner/images/mix_precision_fp16.png) - -1. Parameters stored in FP32. -2. During forward computation, when it comes to FP16 operators, the operator inputs and parameters need to be cast from FP32 to FP16 for computation. -3. Set the Loss layer to FP32 for computation. -4. During the inverse computation, the Loss Scale value is first multiplied to avoid underflow due to a too small inverse gradient. -5. FP16 parameters are involved in the gradient computation and their results will be cast back to FP32. -6. Dividing by the Loss scale value to restore the amplified gradient. -7. Determine if there is an overflow in the gradient, and skip the update if there is an overflow, otherwise the optimizer updates the original parameters with FP32. - -In the following, we demonstrate the automatic mixed precision implementation of MindSpore by importing the handwritten digit recognition model and dataset from [Quick Start](https://www.mindspore.cn/tutorials/en/master/beginner/quick_start.html). - -```python -import mindspore as ms -from mindspore import nn -from mindspore import value_and_grad -from mindspore.dataset import vision, transforms -from mindspore.dataset import MnistDataset - -# Download data from open datasets -from download import download - -url = "https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/" \ - "notebook/datasets/MNIST_Data.zip" -path = download(url, "./", kind="zip", replace=True) - - -def datapipe(path, batch_size): - image_transforms = [ - vision.Rescale(1.0 / 255.0, 0), - vision.Normalize(mean=(0.1307,), std=(0.3081,)), - vision.HWC2CHW() - ] - label_transform = transforms.TypeCast(ms.int32) - - dataset = MnistDataset(path) - dataset = dataset.map(image_transforms, 'image') - dataset = dataset.map(label_transform, 'label') - dataset = dataset.batch(batch_size) - return dataset - -train_dataset = datapipe('MNIST_Data/train', 64) - -# Define model -class Network(nn.Cell): - def __init__(self): - super().__init__() - self.flatten = nn.Flatten() - self.dense_relu_sequential = nn.SequentialCell( - nn.Dense(28*28, 512), - nn.ReLU(), - nn.Dense(512, 512), - nn.ReLU(), - nn.Dense(512, 10) - ) - - def construct(self, x): - x = self.flatten(x) - logits = self.dense_relu_sequential(x) - return logits -``` - -```text -Downloading data from https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/MNIST_Data.zip (10.3 MB) - -file_sizes: 100%|██████████████████████████| 10.8M/10.8M [00:07<00:00, 1.53MB/s] -Extracting zip file... -Successfully downloaded / unzipped to ./ -``` - -## Type Conversions - -Mixed precision calculations require type conversion of operations that require low precision, converting their input to FP16 types, and then converting them back to FP32 types after the output is obtained. MindSpore provides both automatic and manual type conversion methods to meet the different needs for ease of use and flexibility, which are described below. - -### Automatic Type Conversion - -The `mindspore.amp.auto_mixed_precision` interface provides the function to do automatic type conversion for networks. Automatic type conversion follows a blacklist and white list mechanism with five levels configured according to common operator precision conventions, as follows: - -- 'O0': Neural network keeps FP32. -- 'O1': Operation cast to FP16 by whitelist. -- 'O2': Retain FP32 by blacklist and the rest of operations cast to FP16. -- 'O3': The neural network is fully cast to FP16. -- 'auto': Cast operators in whitelist to FP16, cast operators in blacklist to FP32, and the rest of operators choose the highest floating-point precision of operator input for conversion. - -The following is an example of using automatic type conversion: - -```python -from mindspore.amp import auto_mixed_precision - -model = Network() -model = auto_mixed_precision(model, 'O2') -``` - -### Manual Type Conversion - -Usually automatic type conversion can be used to satisfy most of the mixed precision training needs. But when users need to finely control the precision of operations in different parts of the neural network, they can be controlled by means of manual type conversion. - -> Manual type conversions need to take into account the precision of each module in the model and are generally used only when extreme performance is required. - -Below we adapt `Network` in the previous article to demonstrate different ways of manual type conversion. - -#### Cell Granularity Type Conversion - -The `nn.Cell` class provides the `to_float` method to configure the module's operator precision with a single click, automatically casting the module input to the specified precision. - -```python -class NetworkFP16(nn.Cell): - def __init__(self): - super().__init__() - self.flatten = nn.Flatten() - self.dense_relu_sequential = nn.SequentialCell( - nn.Dense(28*28, 512).to_float(ms.float16), - nn.ReLU(), - nn.Dense(512, 512).to_float(ms.float16), - nn.ReLU(), - nn.Dense(512, 10).to_float(ms.float16) - ) - - def construct(self, x): - x = self.flatten(x) - logits = self.dense_relu_sequential(x) - return logits -``` - -#### Custom Granularity Type Conversion - -When the user needs to configure the precision of operations in a single operation, or a combination of multiple modules, Cell granularity often can not meet the purpose of custom granularity control by directly casting the type of input data. - -```python -class NetworkFP16Manual(nn.Cell): - def __init__(self): - super().__init__() - self.flatten = nn.Flatten() - self.dense_relu_sequential = nn.SequentialCell( - nn.Dense(28*28, 512), - nn.ReLU(), - nn.Dense(512, 512), - nn.ReLU(), - nn.Dense(512, 10) - ) - - def construct(self, x): - x = self.flatten(x) - x = x.astype(ms.float16) - logits = self.dense_relu_sequential(x) - logits = logits.astype(ms.float32) - return logits -``` - -## Loss Scaling - -Two implementations of Loss Scale are provided in MindSpore, [mindspore.amp.StaticLossScaler](https://www.mindspore.cn/docs/en/master/api_python/amp/mindspore.amp.StaticLossScaler.html) and [mindspore.amp.DynamicLossScaler](https://www.mindspore.cn/docs/en/master/api_python/amp/mindspore.amp.DynamicLossScaler.html), whose difference is whether the loss scale value is dynamically adjusted. The following is an example of `DynamicLossScaler`, which implements the neural network training logic according to the mixed precision calculation process. - -First, instantiate the LossScaler and manually scale up the loss value when defining the forward network. - -```python -from mindspore.amp import DynamicLossScaler - -# Instantiate loss function and optimizer -loss_fn = nn.CrossEntropyLoss() -optimizer = nn.SGD(model.trainable_params(), 1e-2) - -# Define LossScaler -loss_scaler = DynamicLossScaler(scale_value=2**16, scale_factor=2, scale_window=50) - -def forward_fn(data, label): - logits = model(data) - loss = loss_fn(logits, label) - # scale up the loss value - loss = loss_scaler.scale(loss) - return loss, logits -``` - -Next, a function transformation is performed to obtain the gradient function. - -```python -grad_fn = value_and_grad(forward_fn, None, model.trainable_params(), has_aux=True) -``` - -Define the training step: Calculates the current gradient value and recovers the loss. Use `all_finite` to determine if there is a gradient underflow problem. If there is no overflow, restore the gradient and update the network weight, while if there is overflow, skip this step. - -```python -from mindspore.amp import all_finite - -@ms.jit -def train_step(data, label): - (loss, _), grads = grad_fn(data, label) - loss = loss_scaler.unscale(loss) - - is_finite = all_finite(grads) - if is_finite: - grads = loss_scaler.unscale(grads) - optimizer(grads) - loss_scaler.adjust(is_finite) - - return loss -``` - -Finally, we train 1 epoch and observe the convergence of the loss trained using automatic mixed precision. - -```python -size = train_dataset.get_dataset_size() -model.set_train() -for batch, (data, label) in enumerate(train_dataset.create_tuple_iterator()): - loss = train_step(data, label) - - if batch % 100 == 0: - loss, current = loss.asnumpy(), batch - print(f"loss: {loss:>7f} [{current:>3d}/{size:>3d}]") -``` - -```text -loss: 2.305425 [ 0/938] -loss: 2.289585 [100/938] -loss: 2.259094 [200/938] -loss: 2.176874 [300/938] -loss: 1.856715 [400/938] -loss: 1.398342 [500/938] -loss: 0.889620 [600/938] -loss: 0.709884 [700/938] -loss: 0.750509 [800/938] -loss: 0.482525 [900/938] -``` - -It can be seen that the loss convergence is normal and there is no overflow problem. - -## Automatic Mixed Precision for `Cell` Configuration - -MindSpore supports a programming paradigm that uses Cell to encapsulate the full computational graph. When the [mindspore.amp.build_train_network](https://www.mindspore.cn/docs/en/master/api_python/amp/mindspore.amp.build_train_network.html) interface can be used to automatically perform the type conversion and pass in the Loss Scale as part of the full graph computation. At this point, you only need to configure the mixed precision level and `LossScaleManager` to get the computational graph with the configured automatic mixed precision. - -[mindspore.amp.FixedLossScaleManager](https://www.mindspore.cn/docs/en/master/api_python/amp/mindspore.amp.FixedLossScaleManager.html) and [mindspore.amp.DynamicLossScaleManager](https://www.mindspore.cn/docs/en/master/api_python/amp/mindspore.amp.DynamicLossScaleManager.html) are the Loss scale management interfaces for configuring the automatic mixed precision with `Cell`, corresponding to `StaticLossScalar` and `DynamicLossScalar`, respectively. For detailed information, refer to [mindspore.amp](https://www.mindspore.cn/docs/en/master/api_python/mindspore.amp.html). - -> Automated mixed precision training with `Cell` configuration supports only `GPU` and `Ascend`. - -```python -from mindspore.amp import build_train_network, FixedLossScaleManager - -model = Network() -loss_scale_manager = FixedLossScaleManager() - -model = build_train_network(model, optimizer, loss_fn, level="O2", loss_scale_manager=loss_scale_manager) -``` - -## `Model` Configures Automatic Mixed Precision - -[mindspore.train.Model](https://www.mindspore.cn/docs/en/master/api_python/train/mindspore.train.Model.html) is a high level encapsulation for fast training of neural networks, which encapsulates `mindspore.amp.build_train_network`, so again, only the mixed precision level and `LossScaleManager` need to be configured for automatic mixed precision training. - -> Automated mixed precision training with `Model` configuration supports only `GPU` and `Ascend`. - -```python -from mindspore.train import Model, LossMonitor -# Initialize network -model = Network() -loss_fn = nn.CrossEntropyLoss() -optimizer = nn.SGD(model.trainable_params(), 1e-2) - -loss_scale_manager = FixedLossScaleManager() -trainer = Model(model, loss_fn=loss_fn, optimizer=optimizer, metrics={'accuracy'}, amp_level="O2", loss_scale_manager=loss_scale_manager) - -loss_callback = LossMonitor(100) -trainer.train(10, train_dataset, callbacks=[loss_callback]) -``` - -```text -epoch: 1 step: 100, loss is 2.2883859 -epoch: 1 step: 200, loss is 2.2612116 -epoch: 1 step: 300, loss is 2.1563218 -epoch: 1 step: 400, loss is 1.9420109 -epoch: 1 step: 500, loss is 1.396821 -epoch: 1 step: 600, loss is 1.0450488 -epoch: 1 step: 700, loss is 0.69754004 -epoch: 1 step: 800, loss is 0.6924556 -epoch: 1 step: 900, loss is 0.57444984 -... -epoch: 10 step: 58, loss is 0.13086069 -epoch: 10 step: 158, loss is 0.07224723 -epoch: 10 step: 258, loss is 0.08281057 -epoch: 10 step: 358, loss is 0.09759849 -epoch: 10 step: 458, loss is 0.17265382 -epoch: 10 step: 558, loss is 0.10023793 -epoch: 10 step: 658, loss is 0.08235697 -epoch: 10 step: 758, loss is 0.10531154 -epoch: 10 step: 858, loss is 0.19084263 -``` - -> The image is quoted from [automatic-mixed-precision](https://developer.nvidia.com/automatic-mixed-precision). diff --git a/tutorials/source_en/beginner/model.md b/tutorials/source_en/beginner/model.md index 2cdee88255..0f6a11d6ec 100644 --- a/tutorials/source_en/beginner/model.md +++ b/tutorials/source_en/beginner/model.md @@ -1,6 +1,6 @@ [![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/beginner/model.md) -[Introduction](https://www.mindspore.cn/tutorials/en/master/beginner/introduction.html) || [Quick Start](https://www.mindspore.cn/tutorials/en/master/beginner/quick_start.html) || [Tensor](https://www.mindspore.cn/tutorials/en/master/beginner/tensor.html) || [Data Loading and Processing](https://www.mindspore.cn/tutorials/en/master/beginner/dataset.html) || **Model** || [Autograd](https://www.mindspore.cn/tutorials/en/master/beginner/autograd.html) || [Train](https://www.mindspore.cn/tutorials/en/master/beginner/train.html) || [Save and Load](https://www.mindspore.cn/tutorials/en/master/beginner/save_load.html) || [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html) || [Mixed Precision](https://www.mindspore.cn/tutorials/en/master/beginner/mixed_precision.html) +[Introduction](https://www.mindspore.cn/tutorials/en/master/beginner/introduction.html) || [Quick Start](https://www.mindspore.cn/tutorials/en/master/beginner/quick_start.html) || [Tensor](https://www.mindspore.cn/tutorials/en/master/beginner/tensor.html) || [Data Loading and Processing](https://www.mindspore.cn/tutorials/en/master/beginner/dataset.html) || **Model** || [Autograd](https://www.mindspore.cn/tutorials/en/master/beginner/autograd.html) || [Train](https://www.mindspore.cn/tutorials/en/master/beginner/train.html) || [Save and Load](https://www.mindspore.cn/tutorials/en/master/beginner/save_load.html) || [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html) # Building a Network diff --git a/tutorials/source_en/beginner/quick_start.md b/tutorials/source_en/beginner/quick_start.md index ed25584c88..2abc001ea0 100644 --- a/tutorials/source_en/beginner/quick_start.md +++ b/tutorials/source_en/beginner/quick_start.md @@ -1,6 +1,6 @@ [![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/beginner/quick_start.md) -[Introduction](https://www.mindspore.cn/tutorials/en/master/beginner/introduction.html) || **Quick Start** || [Tensor](https://www.mindspore.cn/tutorials/en/master/beginner/tensor.html) || [Data Loading and Processing](https://www.mindspore.cn/tutorials/en/master/beginner/dataset.html) || [Model](https://www.mindspore.cn/tutorials/en/master/beginner/model.html) || [Autograd](https://www.mindspore.cn/tutorials/en/master/beginner/autograd.html) || [Train](https://www.mindspore.cn/tutorials/en/master/beginner/train.html) || [Save and load](https://www.mindspore.cn/tutorials/en/master/beginner/save_load.html) || [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html) || [Mixed Precision](https://www.mindspore.cn/tutorials/en/master/beginner/mixed_precision.html) +[Introduction](https://www.mindspore.cn/tutorials/en/master/beginner/introduction.html) || **Quick Start** || [Tensor](https://www.mindspore.cn/tutorials/en/master/beginner/tensor.html) || [Data Loading and Processing](https://www.mindspore.cn/tutorials/en/master/beginner/dataset.html) || [Model](https://www.mindspore.cn/tutorials/en/master/beginner/model.html) || [Autograd](https://www.mindspore.cn/tutorials/en/master/beginner/autograd.html) || [Train](https://www.mindspore.cn/tutorials/en/master/beginner/train.html) || [Save and load](https://www.mindspore.cn/tutorials/en/master/beginner/save_load.html) || [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html) # Quick Start diff --git a/tutorials/source_en/beginner/save_load.md b/tutorials/source_en/beginner/save_load.md index c3e1c75b16..c92ba00681 100644 --- a/tutorials/source_en/beginner/save_load.md +++ b/tutorials/source_en/beginner/save_load.md @@ -1,6 +1,6 @@ [![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/beginner/save_load.md) -[Introduction](https://www.mindspore.cn/tutorials/en/master/beginner/introduction.html) || [Quick Start](https://www.mindspore.cn/tutorials/en/master/beginner/quick_start.html) || [Tensor](https://www.mindspore.cn/tutorials/en/master/beginner/tensor.html) || [Data Loading and Processing](https://www.mindspore.cn/tutorials/en/master/beginner/dataset.html) || [Model](https://www.mindspore.cn/tutorials/en/master/beginner/model.html) || [Autograd](https://www.mindspore.cn/tutorials/en/master/beginner/autograd.html) || [Train](https://www.mindspore.cn/tutorials/en/master/beginner/train.html) || **Save and Load** || [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html) || [Mixed Precision](https://www.mindspore.cn/tutorials/en/master/beginner/mixed_precision.html) +[Introduction](https://www.mindspore.cn/tutorials/en/master/beginner/introduction.html) || [Quick Start](https://www.mindspore.cn/tutorials/en/master/beginner/quick_start.html) || [Tensor](https://www.mindspore.cn/tutorials/en/master/beginner/tensor.html) || [Data Loading and Processing](https://www.mindspore.cn/tutorials/en/master/beginner/dataset.html) || [Model](https://www.mindspore.cn/tutorials/en/master/beginner/model.html) || [Autograd](https://www.mindspore.cn/tutorials/en/master/beginner/autograd.html) || [Train](https://www.mindspore.cn/tutorials/en/master/beginner/train.html) || **Save and Load** || [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html) # Saving and Loading the Model diff --git a/tutorials/source_en/beginner/tensor.md b/tutorials/source_en/beginner/tensor.md index 3b552faf53..eebcc25910 100644 --- a/tutorials/source_en/beginner/tensor.md +++ b/tutorials/source_en/beginner/tensor.md @@ -1,6 +1,6 @@ [![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/beginner/tensor.md) -[Introduction](https://www.mindspore.cn/tutorials/en/master/beginner/introduction.html) || [Quick Start](https://www.mindspore.cn/tutorials/en/master/beginner/quick_start.html) || **Tensor** || [Data Loading and Processing](https://www.mindspore.cn/tutorials/en/master/beginner/dataset.html) || [Model](https://www.mindspore.cn/tutorials/en/master/beginner/model.html) || [Autograd](https://www.mindspore.cn/tutorials/en/master/beginner/autograd.html) || [Train](https://www.mindspore.cn/tutorials/en/master/beginner/train.html) || [Save and Load](https://www.mindspore.cn/tutorials/en/master/beginner/save_load.html) || [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html) || [Mixed Precision](https://www.mindspore.cn/tutorials/en/master/beginner/mixed_precision.html) +[Introduction](https://www.mindspore.cn/tutorials/en/master/beginner/introduction.html) || [Quick Start](https://www.mindspore.cn/tutorials/en/master/beginner/quick_start.html) || **Tensor** || [Data Loading and Processing](https://www.mindspore.cn/tutorials/en/master/beginner/dataset.html) || [Model](https://www.mindspore.cn/tutorials/en/master/beginner/model.html) || [Autograd](https://www.mindspore.cn/tutorials/en/master/beginner/autograd.html) || [Train](https://www.mindspore.cn/tutorials/en/master/beginner/train.html) || [Save and Load](https://www.mindspore.cn/tutorials/en/master/beginner/save_load.html) || [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html) # Tensor diff --git a/tutorials/source_en/beginner/train.md b/tutorials/source_en/beginner/train.md index 39c1b0987c..125510f7d8 100644 --- a/tutorials/source_en/beginner/train.md +++ b/tutorials/source_en/beginner/train.md @@ -1,6 +1,6 @@ [![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_en/beginner/train.md) -[Introduction](https://www.mindspore.cn/tutorials/en/master/beginner/introduction.html) || [Quick Start](https://www.mindspore.cn/tutorials/en/master/beginner/quick_start.html) || [Tensor](https://www.mindspore.cn/tutorials/en/master/beginner/tensor.html) || [Data Loading and Processing](https://www.mindspore.cn/tutorials/en/master/beginner/dataset.html) || [Model](https://www.mindspore.cn/tutorials/en/master/beginner/model.html) || [Autograd](https://www.mindspore.cn/tutorials/en/master/beginner/autograd.html) || **Train** || [Save and Load](https://www.mindspore.cn/tutorials/en/master/beginner/save_load.html) || [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html) || [Mixed Precision](https://www.mindspore.cn/tutorials/en/master/beginner/mixed_precision.html) +[Introduction](https://www.mindspore.cn/tutorials/en/master/beginner/introduction.html) || [Quick Start](https://www.mindspore.cn/tutorials/en/master/beginner/quick_start.html) || [Tensor](https://www.mindspore.cn/tutorials/en/master/beginner/tensor.html) || [Data Loading and Processing](https://www.mindspore.cn/tutorials/en/master/beginner/dataset.html) || [Model](https://www.mindspore.cn/tutorials/en/master/beginner/model.html) || [Autograd](https://www.mindspore.cn/tutorials/en/master/beginner/autograd.html) || **Train** || [Save and Load](https://www.mindspore.cn/tutorials/en/master/beginner/save_load.html) || [Accelerating with Static Graphs](https://www.mindspore.cn/tutorials/en/master/beginner/accelerate_with_static_graph.html) # Model Training diff --git a/tutorials/source_en/index.rst b/tutorials/source_en/index.rst index 05e3a933cd..9aea3c9585 100644 --- a/tutorials/source_en/index.rst +++ b/tutorials/source_en/index.rst @@ -21,7 +21,6 @@ MindSpore Tutorial beginner/train beginner/save_load beginner/accelerate_with_static_graph - beginner/mixed_precision .. toctree:: :glob: diff --git a/tutorials/source_zh_cn/beginner/accelerate_with_static_graph.ipynb b/tutorials/source_zh_cn/beginner/accelerate_with_static_graph.ipynb index 0fd1f96ef3..4f80abe32f 100644 --- a/tutorials/source_zh_cn/beginner/accelerate_with_static_graph.ipynb +++ b/tutorials/source_zh_cn/beginner/accelerate_with_static_graph.ipynb @@ -7,7 +7,7 @@ "source": [ "[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_notebook.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/beginner/mindspore_accelerate_with_static_graph.ipynb) [![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/beginner/mindspore_accelerate_with_static_graph.py) [![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_zh_cn/beginner/accelerate_with_static_graph.ipynb)\n", "\n", - "[基本介绍](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/introduction.html) || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/quick_start.html) || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/tensor.html) || [数据加载与处理](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html) || [网络构建](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/model.html) || [函数式自动微分](https://gitee.com/mindspore/docs/blob/master/tutorials/source_zh_cn/beginner/autograd.ipynb) || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/train.html) || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/save_load.html) || **Graph Mode加速** || [自动混合精度](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/mixed_precision.html) ||\n", + "[基本介绍](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/introduction.html) || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/quick_start.html) || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/tensor.html) || [数据加载与处理](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html) || [网络构建](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/model.html) || [函数式自动微分](https://gitee.com/mindspore/docs/blob/master/tutorials/source_zh_cn/beginner/autograd.ipynb) || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/train.html) || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/save_load.html) || **Graph Mode加速** ||\n", "\n", "# Graph Mode加速\n", "\n", diff --git a/tutorials/source_zh_cn/beginner/autograd.ipynb b/tutorials/source_zh_cn/beginner/autograd.ipynb index 94e8e56910..d64ef996d0 100644 --- a/tutorials/source_zh_cn/beginner/autograd.ipynb +++ b/tutorials/source_zh_cn/beginner/autograd.ipynb @@ -6,7 +6,7 @@ "source": [ "[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_notebook.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/beginner/mindspore_autograd.ipynb) [![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/beginner/mindspore_autograd.py) [![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_zh_cn/beginner/autograd.ipynb)\n", "\n", - "[基本介绍](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/introduction.html) || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/quick_start.html) || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/tensor.html) || [数据加载与处理](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html) || [网络构建](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/model.html) || **函数式自动微分** || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/train.html) || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/save_load.html) || [Graph Mode加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html) || [自动混合精度](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/mixed_precision.html) ||" + "[基本介绍](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/introduction.html) || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/quick_start.html) || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/tensor.html) || [数据加载与处理](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html) || [网络构建](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/model.html) || **函数式自动微分** || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/train.html) || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/save_load.html) || [Graph Mode加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html) ||" ] }, { diff --git a/tutorials/source_zh_cn/beginner/dataset.ipynb b/tutorials/source_zh_cn/beginner/dataset.ipynb index 79b5225838..3526f5aa07 100644 --- a/tutorials/source_zh_cn/beginner/dataset.ipynb +++ b/tutorials/source_zh_cn/beginner/dataset.ipynb @@ -7,7 +7,7 @@ "source": [ "[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_notebook.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/beginner/mindspore_dataset.ipynb) [![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/beginner/mindspore_dataset.py) [![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_zh_cn/beginner/dataset.ipynb)\n", "\n", - "[基本介绍](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/introduction.html) || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/quick_start.html) || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/tensor.html) || **数据加载与处理** || [网络构建](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/model.html) || [函数式自动微分](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/autograd.html) || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/train.html) || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/save_load.html) || [Graph Mode加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html) || [自动混合精度](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/mixed_precision.html) ||" + "[基本介绍](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/introduction.html) || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/quick_start.html) || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/tensor.html) || **数据加载与处理** || [网络构建](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/model.html) || [函数式自动微分](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/autograd.html) || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/train.html) || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/save_load.html) || [Graph Mode加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html) ||" ] }, { diff --git a/tutorials/source_zh_cn/beginner/images/fp16_vs_fp32.png b/tutorials/source_zh_cn/beginner/images/fp16_vs_fp32.png deleted file mode 100644 index 8f8e07801600a15f3fe20010f59f5669afad34d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36113 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 P00000NkvXXu0mjf6UtlA diff --git a/tutorials/source_zh_cn/beginner/images/mix_precision_fp16.png b/tutorials/source_zh_cn/beginner/images/mix_precision_fp16.png deleted file mode 100644 index 2c8771445dfaaf320ace866cb14f5ae581164560..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47705 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≦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 Y5$qR`w4CGbD8ThvSxc!_!6M@S08w!FJ^%m! diff --git a/tutorials/source_zh_cn/beginner/introduction.ipynb b/tutorials/source_zh_cn/beginner/introduction.ipynb index c801892b0d..70504f4a1a 100644 --- a/tutorials/source_zh_cn/beginner/introduction.ipynb +++ b/tutorials/source_zh_cn/beginner/introduction.ipynb @@ -7,7 +7,7 @@ "source": [ "[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_zh_cn/beginner/introduction.ipynb)\n", "\n", - "**基本介绍** || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/quick_start.html#) || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/tensor.html) || [数据加载与处理](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html) || [网络构建](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/model.html) || [函数式自动微分](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/autograd.html) || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/train.html) || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/save_load.html) || [Graph Mode加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html) || [自动混合精度](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/mixed_precision.html) ||" + "**基本介绍** || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/quick_start.html#) || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/tensor.html) || [数据加载与处理](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html) || [网络构建](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/model.html) || [函数式自动微分](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/autograd.html) || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/train.html) || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/save_load.html) || [Graph Mode加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html) ||" ] }, { diff --git a/tutorials/source_zh_cn/beginner/mixed_precision.ipynb b/tutorials/source_zh_cn/beginner/mixed_precision.ipynb deleted file mode 100644 index ecbf71dd00..0000000000 --- a/tutorials/source_zh_cn/beginner/mixed_precision.ipynb +++ /dev/null @@ -1,581 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "3fca2d6c-be41-47be-b020-228c6e2acc98", - "metadata": {}, - "source": [ - "[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_notebook.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/beginner/mindspore_mixed_precision.ipynb) [![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/beginner/mindspore_mixed_precision.py) [![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_zh_cn/beginner/mixed_precision.ipynb)\n", - "\n", - "[基本介绍](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/introduction.html) || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/quick_start.html#) || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/tensor.html) || [数据加载与处理](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html) || [网络构建](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/model.html) || [函数式自动微分](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/autograd.html) || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/train.html) || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/save_load.html) || [Graph Mode加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html) || **自动混合精度** ||\n", - "\n", - "# 自动混合精度" - ] - }, - { - "cell_type": "markdown", - "id": "49ed0572-abea-4574-9710-be45d84191b3", - "metadata": {}, - "source": [ - "混合精度(Mix Precision)训练是指在训练时,对神经网络不同的运算采用不同的数值精度的运算策略。在神经网络运算中,部分运算对数值精度不敏感,此时使用较低精度可以达到明显的加速效果(如conv、matmul等);而部分运算由于输入和输出的数值差异大,通常需要保留较高精度以保证结果的正确性(如log、softmax等)。\n", - "\n", - "当前的AI加速卡通常针对计算密集、精度不敏感的运算设计了硬件加速模块,如NVIDIA GPU的TensorCore、Ascend NPU的Cube等。对于conv、matmul等运算占比较大的神经网络,其训练速度通常会有较大的加速比。\n", - "\n", - "`mindspore.amp`模块提供了便捷的自动混合精度接口,用户可以在不同的硬件后端通过简单的接口调用获得训练加速。下面我们简要介绍混合精度计算原理,并通过实例介绍MindSpore的自动混合精度用法。" - ] - }, - { - "cell_type": "markdown", - "id": "518888c6-a7ad-4a13-8b7e-8cef642457e3", - "metadata": {}, - "source": [ - "## 混合精度计算原理" - ] - }, - { - "cell_type": "markdown", - "id": "76ebb0cf-7c2d-49d4-8905-04d928567e76", - "metadata": {}, - "source": [ - "浮点数据类型主要分为双精度(FP64)、单精度(FP32)、半精度(FP16)。在神经网络模型的训练过程中,一般默认采用单精度(FP32)浮点数据类型,来表示网络模型权重和其他参数。在了解混合精度训练之前,先简单了解浮点数据类型。\n", - "\n", - "根据IEEE二进制浮点数算术标准([IEEE 754](https://en.wikipedia.org/wiki/IEEE_754))的定义,浮点数据类型分为双精度(FP64)、单精度(FP32)、半精度(FP16)三种。每一种都有三个不同的部分来表示。FP64采用8个字节共64位进行编码存储;FP32采用4个字节共32位;FP16则是采用2字节共16位。如图所示:\n", - "\n", - "![fp16-vs-fp32](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/tutorials/source_zh_cn/beginner/images/fp16_vs_fp32.png)\n", - "\n", - "从图中可以看出,与FP32相比,FP16的存储空间是FP32的一半。类似地,FP32则是FP64的一半。因此使用FP16进行运算具备以下优势:\n", - "\n", - "- 减少内存占用:FP16的位宽是FP32的一半,因此权重等参数所占用的内存也是原来的一半,节省下来的内存可以用于更大的网络模型或者更多的数据训练。\n", - "- 计算效率更高:在特殊的AI加速芯片(如华为Atlas训练系列、Atlas 200/300/500推理系列,或NVIDIA VOLTA架构的GPU)上,FP16运算性能比FP32更高。\n", - "- 加快通讯效率:针对分布式训练,特别是在大模型训练的过程中,通讯的开销制约了网络模型训练的整体性能。通讯的位宽减少可提升通讯性能,减少等待时间,加快数据的流通。\n", - "\n", - "但是使用FP16同样会带来一些问题:\n", - "\n", - "- 数据溢出:FP16的有效数据表示范围为 $[5.9\\times10^{-8}, 65504]$,FP32的有效数据表示范围为 $[1.4\\times10^{-45}, 1.7\\times10^{38}]$。可见FP16相比FP32的有效范围要窄很多,使用FP16替换FP32会出现上溢(Overflow)和下溢(Underflow)的情况。而在深度学习中,需要计算网络模型中权重的梯度(一阶导数),因此梯度会比权重值更加小,往往容易出现下溢情况。\n", - "- 舍入误差:Rounding Error是指当网络模型的反向梯度很小,一般FP32能够表示,但是转换到FP16会小于当前区间内的最小间隔,会导致数据溢出。如`0.00006666666`在FP32中能正常表示,转换到FP16后会表示成为`0.000067`,不满足FP16最小间隔的数会强制舍入。\n", - "\n", - "因此,在使用混合精度获得训练加速和内存节省的同时,需要考虑FP16带来的问题。Loss Scale(损失缩放)是FP16类型数据下溢问题的解决方案,其主要思想是在计算损失值loss的时候,将loss扩大一定的倍数。根据链式法则,梯度也会相应扩大,然后在优化器更新权重时再缩小相应的倍数,从而避免数据下溢。" - ] - }, - { - "cell_type": "markdown", - "id": "981dd3d3-bec1-4b43-a48e-6563547f8411", - "metadata": {}, - "source": [ - "根据上述原理介绍,典型的混合精度计算流程如下图所示:\n", - "\n", - "![mix precision](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/tutorials/source_zh_cn/beginner/images/mix_precision_fp16.png)\n", - "\n", - "1. 参数以FP32存储;\n", - "2. 正向计算过程中,遇到FP16算子,需要把算子输入和参数从FP32 cast成FP16进行计算;\n", - "3. 将Loss层设置为FP32进行计算;\n", - "4. 反向计算过程中,首先乘以Loss Scale值,避免反向梯度过小而产生下溢;\n", - "5. FP16参数参与梯度计算,其结果将被cast回FP32;\n", - "6. 除以Loss scale值,还原被放大的梯度;\n", - "7. 判断梯度是否存在溢出,如果溢出则跳过更新,否则优化器以FP32对原始参数进行更新。" - ] - }, - { - "cell_type": "markdown", - "id": "81c60159-5242-4ea2-a73e-6015de4a675c", - "metadata": {}, - "source": [ - "下面我们通过导入[快速入门](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/quick_start.html)中的手写数字识别模型及数据集,演示MindSpore的自动混合精度实现。" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "0dcf1b26-3050-42e6-ade8-889f3b3dc79d", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Downloading data from https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/MNIST_Data.zip (10.3 MB)\n", - "\n", - "file_sizes: 100%|██████████████████████████| 10.8M/10.8M [00:07<00:00, 1.53MB/s]\n", - "Extracting zip file...\n", - "Successfully downloaded / unzipped to ./\n" - ] - } - ], - "source": [ - "import mindspore as ms\n", - "from mindspore import nn\n", - "from mindspore import value_and_grad\n", - "from mindspore.dataset import vision, transforms\n", - "from mindspore.dataset import MnistDataset\n", - "\n", - "# Download data from open datasets\n", - "from download import download\n", - "\n", - "url = \"https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/\" \\\n", - " \"notebook/datasets/MNIST_Data.zip\"\n", - "path = download(url, \"./\", kind=\"zip\", replace=True)\n", - "\n", - "\n", - "def datapipe(path, batch_size):\n", - " image_transforms = [\n", - " vision.Rescale(1.0 / 255.0, 0),\n", - " vision.Normalize(mean=(0.1307,), std=(0.3081,)),\n", - " vision.HWC2CHW()\n", - " ]\n", - " label_transform = transforms.TypeCast(ms.int32)\n", - "\n", - " dataset = MnistDataset(path)\n", - " dataset = dataset.map(image_transforms, 'image')\n", - " dataset = dataset.map(label_transform, 'label')\n", - " dataset = dataset.batch(batch_size)\n", - " return dataset\n", - "\n", - "train_dataset = datapipe('MNIST_Data/train', 64)\n", - "\n", - "# Define model\n", - "class Network(nn.Cell):\n", - " def __init__(self):\n", - " super().__init__()\n", - " self.flatten = nn.Flatten()\n", - " self.dense_relu_sequential = nn.SequentialCell(\n", - " nn.Dense(28*28, 512),\n", - " nn.ReLU(),\n", - " nn.Dense(512, 512),\n", - " nn.ReLU(),\n", - " nn.Dense(512, 10)\n", - " )\n", - "\n", - " def construct(self, x):\n", - " x = self.flatten(x)\n", - " logits = self.dense_relu_sequential(x)\n", - " return logits" - ] - }, - { - "cell_type": "markdown", - "id": "b22c0430-ad94-47b5-bd04-278e2c71775c", - "metadata": {}, - "source": [ - "## 类型转换\n", - "\n", - "混合精度计算需要将需要使用低精度的运算进行类型转换,将其输入转为FP16类型,得到输出后进将其重新转回FP32类型。MindSpore同时提供了自动和手动类型转换的方法,满足对易用性和灵活性的不同需求,下面我们分别对其进行介绍。\n", - "\n", - "### 自动类型转换" - ] - }, - { - "cell_type": "markdown", - "id": "8bdf54b3", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "`mindspore.amp.auto_mixed_precision` 接口提供对网络做自动类型转换的功能。自动类型转换遵循黑白名单机制,根据常用的运算精度习惯配置了5个等级,分别为:\n", - "\n", - "- 'O0':神经网络保持FP32;\n", - "- 'O1':按白名单将运算cast为FP16;\n", - "- 'O2':按黑名单保留FP32,其余运算cast为FP16;\n", - "- 'O3':神经网络完全cast为FP16。\n", - "- 'auto':白名单内的算子运算cast为FP16,黑名单内的算子运算cast为FP32,其余算子选择算子输入的最高浮点精度来转换。\n", - "\n", - "下面是使用自动类型转换的示例:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "ead4d2ea-95a0-44e6-a722-0701a3e11bfb", - "metadata": {}, - "outputs": [], - "source": [ - "from mindspore.amp import auto_mixed_precision\n", - "\n", - "model = Network()\n", - "model = auto_mixed_precision(model, 'O2')" - ] - }, - { - "cell_type": "markdown", - "id": "8f89dc3c-e419-484d-8d7c-4e991d85cfd1", - "metadata": {}, - "source": [ - "### 手动类型转换\n", - "\n", - "通常情况下,自动类型转换可以满足大部分混合精度训练的需求。但当用户需要精细化控制神经网络不同部分的运算精度时,可以通过手动类型转换的方式来实现。\n", - "\n", - "> 手动类型转换需考虑模型各个模块的运算精度,一般仅在需要获得极致性能的情况下使用。\n", - "\n", - "下面我们对前文的`Network`进行改造,演示手动类型转换的不同方式。" - ] - }, - { - "cell_type": "markdown", - "id": "064acdb8-8cba-4e60-979d-06e667fc70a3", - "metadata": {}, - "source": [ - "#### Cell粒度类型转换\n", - "\n", - "`nn.Cell`类提供了`to_float`方法,可以一键配置该模块的运算精度,自动将模块输入cast为指定的精度:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "112b57a8-c279-49cb-8069-cc261d92e857", - "metadata": {}, - "outputs": [], - "source": [ - "class NetworkFP16(nn.Cell):\n", - " def __init__(self):\n", - " super().__init__()\n", - " self.flatten = nn.Flatten()\n", - " self.dense_relu_sequential = nn.SequentialCell(\n", - " nn.Dense(28*28, 512).to_float(ms.float16),\n", - " nn.ReLU(),\n", - " nn.Dense(512, 512).to_float(ms.float16),\n", - " nn.ReLU(),\n", - " nn.Dense(512, 10).to_float(ms.float16)\n", - " )\n", - "\n", - " def construct(self, x):\n", - " x = self.flatten(x)\n", - " logits = self.dense_relu_sequential(x)\n", - " return logits" - ] - }, - { - "cell_type": "markdown", - "id": "a169af9b-df4c-4644-8377-833d4cf7100a", - "metadata": {}, - "source": [ - "#### 自定义粒度类型转换\n", - "\n", - "当用户需要在单个运算,或多个模块组合配置运算精度时,Cell粒度往往无法满足,此时可以直接通过对输入数据的类型进行cast来达到自定义粒度控制的目的。" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "d99f7986-bde4-4254-bc97-3baa1c7353d9", - "metadata": {}, - "outputs": [], - "source": [ - "class NetworkFP16Manual(nn.Cell):\n", - " def __init__(self):\n", - " super().__init__()\n", - " self.flatten = nn.Flatten()\n", - " self.dense_relu_sequential = nn.SequentialCell(\n", - " nn.Dense(28*28, 512),\n", - " nn.ReLU(),\n", - " nn.Dense(512, 512),\n", - " nn.ReLU(),\n", - " nn.Dense(512, 10)\n", - " )\n", - "\n", - " def construct(self, x):\n", - " x = self.flatten(x)\n", - " x = x.astype(ms.float16)\n", - " logits = self.dense_relu_sequential(x)\n", - " logits = logits.astype(ms.float32)\n", - " return logits" - ] - }, - { - "cell_type": "markdown", - "id": "42d9a6e5-765e-4c28-9ad4-2c1f59996a0b", - "metadata": {}, - "source": [ - "## 损失缩放\n", - "\n", - "MindSpore中提供了两种Loss Scale的实现,分别为[mindspore.amp.StaticLossScaler](https://www.mindspore.cn/docs/zh-CN/master/api_python/amp/mindspore.amp.StaticLossScaler.html)和[mindspore.amp.DynamicLossScaler](https://www.mindspore.cn/docs/zh-CN/master/api_python/amp/mindspore.amp.DynamicLossScaler.html),其差异为损失缩放值scale value是否进行动态调整。下面以`DynamicLossScaler`为例,根据混合精度计算流程实现神经网络训练逻辑。\n", - "\n", - "首先,实例化LossScaler,并在定义前向网络时,手动放大loss值。" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "9f3abade", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - }, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "from mindspore.amp import DynamicLossScaler\n", - "\n", - "# Instantiate loss function and optimizer\n", - "loss_fn = nn.CrossEntropyLoss()\n", - "optimizer = nn.SGD(model.trainable_params(), 1e-2)\n", - "\n", - "# Define LossScaler\n", - "loss_scaler = DynamicLossScaler(scale_value=2**16, scale_factor=2, scale_window=50)\n", - "\n", - "def forward_fn(data, label):\n", - " logits = model(data)\n", - " loss = loss_fn(logits, label)\n", - " # scale up the loss value\n", - " loss = loss_scaler.scale(loss)\n", - " return loss, logits" - ] - }, - { - "cell_type": "markdown", - "id": "09ca284d", - "metadata": {}, - "source": [ - "接下来进行函数变换,获得梯度函数。" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "95715438-38f9-4476-afc3-5ff655b66966", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - }, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "grad_fn = value_and_grad(forward_fn, None, model.trainable_params(), has_aux=True)" - ] - }, - { - "cell_type": "markdown", - "id": "2ccec7bf", - "metadata": {}, - "source": [ - "定义训练step:计算当前梯度值并恢复损失。使用 `all_finite` 判断是否出现梯度下溢问题,如果无溢出,恢复梯度并更新网络权重;如果溢出,跳过此step。" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "5a3c1cc3", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - }, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "from mindspore.amp import all_finite\n", - "\n", - "@ms.jit\n", - "def train_step(data, label):\n", - " (loss, _), grads = grad_fn(data, label)\n", - " loss = loss_scaler.unscale(loss)\n", - "\n", - " is_finite = all_finite(grads)\n", - " if is_finite:\n", - " grads = loss_scaler.unscale(grads)\n", - " optimizer(grads)\n", - " loss_scaler.adjust(is_finite)\n", - "\n", - " return loss" - ] - }, - { - "cell_type": "markdown", - "id": "70519642-58d2-485a-9614-773e270889dd", - "metadata": {}, - "source": [ - "最后,我们训练1个epoch,观察使用自动混合精度训练的loss收敛情况。" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "0bb34af6-b3e2-494b-afbe-4ff68896552c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "loss: 2.305425 [ 0/938]\n", - "loss: 2.289585 [100/938]\n", - "loss: 2.259094 [200/938]\n", - "loss: 2.176874 [300/938]\n", - "loss: 1.856715 [400/938]\n", - "loss: 1.398342 [500/938]\n", - "loss: 0.889620 [600/938]\n", - "loss: 0.709884 [700/938]\n", - "loss: 0.750509 [800/938]\n", - "loss: 0.482525 [900/938]\n" - ] - } - ], - "source": [ - "size = train_dataset.get_dataset_size()\n", - "model.set_train()\n", - "for batch, (data, label) in enumerate(train_dataset.create_tuple_iterator()):\n", - " loss = train_step(data, label)\n", - "\n", - " if batch % 100 == 0:\n", - " loss, current = loss.asnumpy(), batch\n", - " print(f\"loss: {loss:>7f} [{current:>3d}/{size:>3d}]\")" - ] - }, - { - "cell_type": "markdown", - "id": "17ff0777", - "metadata": {}, - "source": [ - "可以看到loss收敛趋势正常,没有出现溢出问题。" - ] - }, - { - "cell_type": "markdown", - "id": "e307279c-1694-44d6-96be-93a7fbb169eb", - "metadata": {}, - "source": [ - "## `Cell`配置自动混合精度\n", - "\n", - "MindSpore支持使用Cell封装完整计算图的编程范式,此时可以使用[mindspore.amp.build_train_network](https://www.mindspore.cn/docs/zh-CN/master/api_python/amp/mindspore.amp.build_train_network.html)接口,自动进行类型转换,并将Loss Scale传入,作为整图计算的一部分。\n", - "此时仅需要配置混合精度等级和`LossScaleManager`即可获得配置好自动混合精度的计算图。\n", - "\n", - "[mindspore.amp.FixedLossScaleManager](https://www.mindspore.cn/docs/zh-CN/master/api_python/amp/mindspore.amp.FixedLossScaleManager.html)和[mindspore.amp.DynamicLossScaleManager](https://www.mindspore.cn/docs/zh-CN/master/api_python/amp/mindspore.amp.DynamicLossScaleManager.html)是`Cell`配置自动混合精度的Loss scale管理接口,分别与`StaticLossScalar`和`DynamicLossScalar`对应,具体详见[mindspore.amp](https://www.mindspore.cn/docs/zh-CN/master/api_python/mindspore.amp.html)。\n", - "\n", - "> 使用`Cell`配置自动混合精度训练仅支持`GPU`和`Ascend`。" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ff433a1f-30b5-486b-bfc2-218bca91d85d", - "metadata": {}, - "outputs": [], - "source": [ - "from mindspore.amp import build_train_network, FixedLossScaleManager\n", - "\n", - "model = Network()\n", - "loss_scale_manager = FixedLossScaleManager()\n", - "\n", - "model = build_train_network(model, optimizer, loss_fn, level=\"O2\", loss_scale_manager=loss_scale_manager)" - ] - }, - { - "cell_type": "markdown", - "id": "e09b86b5", - "metadata": {}, - "source": [ - "## `Model` 配置自动混合精度" - ] - }, - { - "cell_type": "markdown", - "id": "d5c8adf4-71bb-4061-8801-9a4f97168dc5", - "metadata": {}, - "source": [ - "[mindspore.train.Model](https://www.mindspore.cn/docs/zh-CN/master/api_python/train/mindspore.train.Model.html)是神经网络快速训练的高阶封装,其将`mindspore.amp.build_train_network`封装在内,因此同样只需要配置混合精度等级和`LossScaleManager`,即可进行自动混合精度训练。\n", - "\n", - "> 使用`Model`配置自动混合精度训练仅支持`GPU`和`Ascend`。" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4e855c91", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - }, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 1 step: 100, loss is 2.2883859\n", - "epoch: 1 step: 200, loss is 2.2612116\n", - "epoch: 1 step: 300, loss is 2.1563218\n", - "epoch: 1 step: 400, loss is 1.9420109\n", - "epoch: 1 step: 500, loss is 1.396821\n", - "epoch: 1 step: 600, loss is 1.0450488\n", - "epoch: 1 step: 700, loss is 0.69754004\n", - "epoch: 1 step: 800, loss is 0.6924556\n", - "epoch: 1 step: 900, loss is 0.57444984\n", - "...\n", - "epoch: 10 step: 58, loss is 0.13086069\n", - "epoch: 10 step: 158, loss is 0.07224723\n", - "epoch: 10 step: 258, loss is 0.08281057\n", - "epoch: 10 step: 358, loss is 0.09759849\n", - "epoch: 10 step: 458, loss is 0.17265382\n", - "epoch: 10 step: 558, loss is 0.10023793\n", - "epoch: 10 step: 658, loss is 0.08235697\n", - "epoch: 10 step: 758, loss is 0.10531154\n", - "epoch: 10 step: 858, loss is 0.19084263\n" - ] - } - ], - "source": [ - "from mindspore.train import Model, LossMonitor\n", - "# Initialize network\n", - "model = Network()\n", - "loss_fn = nn.CrossEntropyLoss()\n", - "optimizer = nn.SGD(model.trainable_params(), 1e-2)\n", - "\n", - "loss_scale_manager = FixedLossScaleManager()\n", - "trainer = Model(model, loss_fn=loss_fn, optimizer=optimizer, metrics={'accuracy'}, amp_level=\"O2\", loss_scale_manager=loss_scale_manager)\n", - "\n", - "loss_callback = LossMonitor(100)\n", - "trainer.train(10, train_dataset, callbacks=[loss_callback])" - ] - }, - { - "cell_type": "markdown", - "id": "7e24bdca", - "metadata": {}, - "source": [ - "> 图片引用自[automatic-mixed-precision](https://developer.nvidia.com/automatic-mixed-precision)。" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "MindSpore", - "language": "python", - "name": "mindspore" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5 (default, Oct 25 2019, 15:51:11) \n[GCC 7.3.0]" - }, - "vscode": { - "interpreter": { - "hash": "8c9da313289c39257cb28b126d2dadd33153d4da4d524f730c81a4aaccbd2ca7" - } - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/tutorials/source_zh_cn/beginner/model.ipynb b/tutorials/source_zh_cn/beginner/model.ipynb index 0bc8993acd..bc559fbeb1 100644 --- a/tutorials/source_zh_cn/beginner/model.ipynb +++ b/tutorials/source_zh_cn/beginner/model.ipynb @@ -6,7 +6,7 @@ "source": [ "[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_notebook.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/beginner/mindspore_model.ipynb) [![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/beginner/mindspore_model.py) [![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_zh_cn/beginner/model.ipynb)\n", "\n", - "[基本介绍](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/introduction.html) || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/quick_start.html) || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/tensor.html) || [数据加载与处理](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html) || **网络构建** || [函数式自动微分](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/autograd.html) || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/train.html) || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/save_load.html) || [Graph Mode加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html) || [自动混合精度](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/mixed_precision.html) ||" + "[基本介绍](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/introduction.html) || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/quick_start.html) || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/tensor.html) || [数据加载与处理](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html) || **网络构建** || [函数式自动微分](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/autograd.html) || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/train.html) || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/save_load.html) || [Graph Mode加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html) ||" ] }, { diff --git a/tutorials/source_zh_cn/beginner/quick_start.ipynb b/tutorials/source_zh_cn/beginner/quick_start.ipynb index 82f58972ca..cb0660d243 100644 --- a/tutorials/source_zh_cn/beginner/quick_start.ipynb +++ b/tutorials/source_zh_cn/beginner/quick_start.ipynb @@ -6,7 +6,7 @@ "source": [ "[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_notebook.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/beginner/mindspore_quick_start.ipynb) [![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/beginner/mindspore_quick_start.py) [![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_zh_cn/beginner/quick_start.ipynb)\n", "\n", - "[基本介绍](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/introduction.html) || **快速入门** || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/tensor.html) || [数据加载与处理](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html) || [网络构建](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/model.html) || [函数式自动微分](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/autograd.html) || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/train.html) || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/save_load.html) || [Graph Mode加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html) || [自动混合精度](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/mixed_precision.html) ||" + "[基本介绍](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/introduction.html) || **快速入门** || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/tensor.html) || [数据加载与处理](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html) || [网络构建](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/model.html) || [函数式自动微分](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/autograd.html) || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/train.html) || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/save_load.html) || [Graph Mode加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html) ||" ] }, { diff --git a/tutorials/source_zh_cn/beginner/save_load.ipynb b/tutorials/source_zh_cn/beginner/save_load.ipynb index c6bd427e6a..9badb40254 100644 --- a/tutorials/source_zh_cn/beginner/save_load.ipynb +++ b/tutorials/source_zh_cn/beginner/save_load.ipynb @@ -8,7 +8,7 @@ "[![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/beginner/mindspore_save_load.py) \n", "[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_zh_cn/beginner/save_load.ipynb)\n", "\n", - "[基本介绍](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/introduction.html) || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/quick_start.html) || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/tensor.html) || [数据加载与处理](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html) || [网络构建](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/model.html) || [函数式自动微分](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/autograd.html) || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/train.html) || **保存与加载** || [Graph Mode加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html) || [自动混合精度](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/mixed_precision.html) ||" + "[基本介绍](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/introduction.html) || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/quick_start.html) || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/tensor.html) || [数据加载与处理](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html) || [网络构建](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/model.html) || [函数式自动微分](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/autograd.html) || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/train.html) || **保存与加载** || [Graph Mode加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html) ||" ] }, { diff --git a/tutorials/source_zh_cn/beginner/tensor.ipynb b/tutorials/source_zh_cn/beginner/tensor.ipynb index 9a6696bad5..af801d8418 100644 --- a/tutorials/source_zh_cn/beginner/tensor.ipynb +++ b/tutorials/source_zh_cn/beginner/tensor.ipynb @@ -7,7 +7,7 @@ "[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_notebook.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/beginner/mindspore_tensor.ipynb) [![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/beginner/mindspore_tensor.py)\n", " [![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_zh_cn/beginner/tensor.ipynb)\n", "\n", - "[基本介绍](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/introduction.html) || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/quick_start.html) || **张量 Tensor** || [数据加载与处理](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html) || [网络构建](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/model.html) || [函数式自动微分](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/autograd.html) || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/train.html) || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/save_load.html) || [Graph Mode加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html) || [自动混合精度](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/mixed_precision.html) ||" + "[基本介绍](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/introduction.html) || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/quick_start.html) || **张量 Tensor** || [数据加载与处理](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html) || [网络构建](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/model.html) || [函数式自动微分](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/autograd.html) || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/train.html) || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/save_load.html) || [Graph Mode加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html) ||" ] }, { diff --git a/tutorials/source_zh_cn/beginner/train.ipynb b/tutorials/source_zh_cn/beginner/train.ipynb index 3c5df84a60..414a7284ed 100644 --- a/tutorials/source_zh_cn/beginner/train.ipynb +++ b/tutorials/source_zh_cn/beginner/train.ipynb @@ -10,7 +10,7 @@ "source": [ "[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_notebook.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/beginner/mindspore_train.ipynb) [![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/master/tutorials/zh_cn/beginner/mindspore_train.py) [![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/master/tutorials/source_zh_cn/beginner/train.ipynb)\n", "\n", - "[基本介绍](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/introduction.html) || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/quick_start.html) || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/tensor.html) || [数据加载与处理](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html) || [网络构建](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/model.html) || [函数式自动微分](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/autograd.html) || **模型训练** || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/save_load.html) || [Graph Mode加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html) || [自动混合精度](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/mixed_precision.html) ||" + "[基本介绍](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/introduction.html) || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/quick_start.html) || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/tensor.html) || [数据加载与处理](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/dataset.html) || [网络构建](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/model.html) || [函数式自动微分](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/autograd.html) || **模型训练** || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/save_load.html) || [Graph Mode加速](https://www.mindspore.cn/tutorials/zh-CN/master/beginner/accelerate_with_static_graph.html) ||" ] }, { diff --git a/tutorials/source_zh_cn/index.rst b/tutorials/source_zh_cn/index.rst index 0889bc1948..4493ad4762 100644 --- a/tutorials/source_zh_cn/index.rst +++ b/tutorials/source_zh_cn/index.rst @@ -21,7 +21,6 @@ MindSpore教程 beginner/train beginner/save_load beginner/accelerate_with_static_graph - beginner/mixed_precision .. toctree:: :glob: -- Gitee