From 5091356a18517abc5095979a3acd1472b030ed0d Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Wed, 23 Sep 2020 17:09:04 +0700 Subject: [PATCH 01/31] Remove dead code --- .../templates/swaggerui/oauth2-redirect.html | 67 ------------------- 1 file changed, 67 deletions(-) delete mode 100644 mlchain/server/templates/swaggerui/oauth2-redirect.html diff --git a/mlchain/server/templates/swaggerui/oauth2-redirect.html b/mlchain/server/templates/swaggerui/oauth2-redirect.html deleted file mode 100644 index fb68399..0000000 --- a/mlchain/server/templates/swaggerui/oauth2-redirect.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - From 92918c3cecc4ef55933fc1539e59dca49144e33d Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Wed, 23 Sep 2020 17:09:19 +0700 Subject: [PATCH 02/31] Compress swagger html --- mlchain/server/templates/swaggerui/index.html | 61 +------------------ 1 file changed, 1 insertion(+), 60 deletions(-) diff --git a/mlchain/server/templates/swaggerui/index.html b/mlchain/server/templates/swaggerui/index.html index 5fa9952..eb68bff 100644 --- a/mlchain/server/templates/swaggerui/index.html +++ b/mlchain/server/templates/swaggerui/index.html @@ -1,60 +1 @@ - - - - - - Swagger UI - - - - - - - -
- - - - - - +Swagger UI
\ No newline at end of file From f6997fbad5018334e8c3bc27616116cd435a4181 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Wed, 23 Sep 2020 17:09:55 +0700 Subject: [PATCH 03/31] Detach base64 img to file to reduce html footprint on mlchain server homepage --- mlchain/server/static/mlchain_fig_1.png | Bin 0 -> 112716 bytes mlchain/server/static/mlchain_logo.png | Bin 0 -> 44148 bytes mlchain/server/templates/home.html | 832 +++++++++++++----------- 3 files changed, 456 insertions(+), 376 deletions(-) create mode 100644 mlchain/server/static/mlchain_fig_1.png create mode 100644 mlchain/server/static/mlchain_logo.png diff --git a/mlchain/server/static/mlchain_fig_1.png b/mlchain/server/static/mlchain_fig_1.png new file mode 100644 index 0000000000000000000000000000000000000000..bdbaeea2e8bb061a616f83c7fd9427677f9d348f GIT binary patch literal 112716 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

|OC;yaBQ_dt#hN#q7<3dh-}(6;VI_>{O`#;s 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 Y5{V-F(M^0;3kYc1n)58gJhY5)KL literal 0 HcmV?d00001 diff --git a/mlchain/server/static/mlchain_logo.png b/mlchain/server/static/mlchain_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..125743f7d2ce49129e77e720f59d8cee9b65d27b GIT binary patch literal 44148 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 z zzcj=nTm~|Ui7kmCSWc&)pSM<4dFQ^qF!fQw)n=DrQr{7={RCT?>)QaVCzfmAL+rUZ zGnR>JkDv8OL5gh^OP53H-J-MC{|7Be)tUl%L{s70L-)a7c_|RvfdWsi+0a6$;8Y_n zSW_3vg)egPkjuJ%q)o}BRL&kcMf~y`8}VPCe{QZ*SffP8*Nd3bTf(4{PC#zxSr*_2d^-%P(H3iGMy5J~BVVC>ydGP}=iw(%N< zY4%=bvhF}7Yu{PFcaJkgosoRtbvci=)65l|HnU473%z1e_h=u`ZS~Y#!b?d|?7bn` z`62V$9_vaVql8qy8!Kn(+0lJjw9`es?FkT#2Defv2!L|^-UoWk`fJw0(?Bxz4zV)P zGhWhFrvBNBbaDeM_CTOUANx1nVEA_Zv~a+Jq10|FGU zP~Wo`Elh_dElx&~^?B=_+yz#fwa=*UGr*!ywwgI9M#P5ohSv*Z9OSc#Grn#eX}o%- zDmHpDiJFNU`$yFi$Oe@sCmd|?C66j)= z(>vsFE9R}Q^5MZpOZe6sSeG;7UQ|-9Z8ecCi<)fM__aWOEGnqt;{jf*iao!BOgK9z zOao^9X1>D?hb5e^ip*H75BV6(=q#!r(EFj@W(UtdMa966B*TpGiQB$z`%yb2Vnf(R zc#~Pi*+~ya{f6qo-3Ml7LXXz+l$g7)?HR)HWaFN9M(m#slh%-i(!Uuu|6;Lp$&^k% zC4tk+lV@HY-0ocRi-P{`gkn2AMjqNf5rS$-DN&a!6+(^<3G1un)U@~wuZTZvd_zQ) zJa<2*zSa^*8e{T{2EKC4xYAF+burSoXQ}}WC$ox%)$>5EAhkc&XQm&4Hj4#K$m$#x z4u+-5^QH#C<0Md>s$%m6@vNF0);-OXWN4zf7L{=gf1Q_A!)p-I8q%38a1as)Fpc|d!#?mC z^-CSt`h+jxLW)=C?`my~fxNf7PiNiPMEpIKdDvpP{n~K_}5`G+l;lrU!oOZ<&)lgg8lE-~NiYKUaZG&E%sM3eJ zn5?#7Y+k^n0q1u&b=EdamlzB`Pn?_4`1Wtd7;izSX_4Or%KmoBGj*aJUFK(H0U0;+ zm&mI&)%FDB`nA5N`6(%w&iW8I`0nme)b?EA!$fJ`V1W_#)ex*-?nSh5nHk%>$)KUa z7UC-c8pyS;SkN;BGFG{$|Gi;Tg?((C3#~`4cs57!J#s7;NDfa2tXCv5g!0 z)u=u)$*+Wo<#>ytaAM*G7kR$v7A72Ef+C?abhW230zpyTkDC&1sqvP_=0pY^AT50) zO!O2U2)Ht>5fyOz-A=$}LrqWp1XJXYp!ECugwJ;e4&IM-_%n7I|zl~Ff(-Uel*0ccz(oGZQ&LGP2caLw+{5N zWU6^hO0($0Mksb9!bryg%N)tev)tSokG@0_9deMnOxsIa_BrIH! zQ_iw=v)8;&EzyyjgNE0S^l^#Xtr!4ro(NrU-$q40lSQy2+w+bEcE)uiir-d(xJCp9m95`jqbJXpC!ic28_ zYlxX+KJ_%qxXY8WUR4DAA1dKp9iip{FWeB-T>g7mwbnwELyr(F{J#x0!O^=


2q zEW!2d}o_6YO$tUgZ??m;b3+shAe4FzR6w$H;H-C(|xa`B|*kr}D%5v=hAEj+V-P6j_~1c+Db!sEn9# z`SAolSAbfA8-?AFgHl=ds@ovcjVmEoK2&q*67hP+_(8n$EC;oZD<2lAL3T&E! z;bgeZZWrHFE{j98-1M?qU8FaUuP&J5XFLMJts|i=Qx)9o9k5Y{8J%`ko;V=80e|Kz zr#-Ot8Wcj%R=RYaW@(zm*PV&PVWhiYPl?leM&;w^ZasgIJt||iMun2&e5N=|TZ0Eq zud*e0gh~sqDA#xy45F0EH5{IXEUA5eM`z#Mc6rBLK(1J?ipQt9g}M^54ACe+G!JJ~(2eLF-o8rXgms_I^7$>VMBe;751w_HPF{j-E| z68W6b5srV?)CJfzYMpA`!eF#PNw6A!=BLg=cLE_@2d(goi%I+=5De81g{0nfhU`piilzZ(B7sNPU1wKI6#Xmu0l=U(58xLihC#Wr8q<9l0 zAOkmA@&rk8dKw{TdDKuuBTWMl6`JuQ+f#P?w1xvjc;UMCQ?ujeyyqY5CS`ez>F#TS z$iW}u_D<6}_eX-7s>RYLc9#N=0dI5FAvr5wJY$FWz;Yvvu^Jv3mUI$qmeUjY#v5A@ zpCzJc{kAbAnfl&caqJYuzYWK%0hc+BJuFWw&y22;l>h%tl{ADSb_eqIK5ST4`-!mB8fi4nl62DKE5VN zDQ3#tOo+p@MWtZHY1RYR_?OWLhp@``MQ^QN0J#pot6o)rrs|RU8RB|ffw=)hlqX88&M|dud_t$@k8r~nTsEs|D ztt+}}V+toPtoE%f-UiS9TqRC_s>8Jv(!V9W`7QM#u%!cZHfV2^DxPqLL*4Yu&0cQc zGlIPBKSS?2X2%oM?4AGVzxL^`T=eL0R|TH)Wjn8(%Uy@!mLSPX6OFr17CE;ofSH<{ zOX?#qOoxH;@!^;E`%8K&jS=MqgxF~*b{P<&rC?)pV|pDB(W1KWQVnnVh?|EXpR`J=|C=t;B~U@`vvSbjiW$ZCEq5qfpRuaikGHi*ceP;9)1X{s4<*qhQMu} zgt+30l|yj1&EBv5a$RuC_Opv$1GlhyDIvkLT*UN_i{Avkb^f^3C?bB9c++3;IAg)~ zKeL~Y4{{B&XoQH~FeVyaIPkz;zN-!)XYur_mY9I)gCV^`%DAZ?*ZVl z7UfKU2gLzy!M%P03+h@*vDFbgm*gC)76D$QFiiGoDhmr!reFO1sq+!1^v_@@Dl~oU zz2R1KQ;s9gWv**-QG=Fz4@dO{{v<*?h!u__J3yB@XX*_zaveOO=Wr0LTjKzH zp&PP-SsuKn-sUsS;2$7_;pK_GbSd+@8NK)E?}~VPJ>1Ql-;W&|OWR?kqcLY%>t^f= zcSO`&_R?eE+P0$pJgZr z=Xx3-sz+D(wqpMImkc?X^w}2HroSx#`GT5*<5}jM0ttTk8jL$Xh>E<$2749xd1FH^ zw}XPzmFqbON_1Gx%Q9b~U1#r&M>t>I(k(cTkMY|_R@C|*roY{!6fCI_sVndgwTYT? zWkt&G+StZ{qpd~tXeR8cV6^fE&r_C_m^hWJ!YAjFDUb~bBP%kweX)>Ga)(lG_$u>} z>TcY)rz-{8knDol`b242fi0RIB;js+SVfL)7BCso!xNHBX9@Fx_$4kM7ZYyQj2bk} zzIXlp*DpQ9i9}ETFVIXUei%g+CAi1}Fp3duBxjcpMhs4<_yZq5ko8Vz4n|<2^%xMB4nSRNJ2Eg!yQ&JhsIiS zZ&vc6?pdIULdk2?(OG+(ULY#VPjqp=!$E9hFEA4 z`sv3wx#k_S%KeUQ;*y71jlwS zze5@RoxA6)}eksPzTB|RAy-bTH4w+bkb%)iPFeDNU}_g z4_8q=6eU@vMO&5kK23b__KHLw-Uu2M&Ytbb$(x%(k)!x4)Y|h1l^==SG~=nb0pIWI zUenDh98RCQ0MZCS|2hqNxy4rzn%YXb3dStbxiR09!6=Y`LGLLv=*{^qI8jQznmDxv zb1fdVy`B&&(f7wo_P(2``8J;2LjEexXTDC4a#59;LBoKqr+R+WVK72Pi54rJ-epUc z7(zB6Rar4vAZG3w`2|usE8l8qM4h>wZpL*ZtIHS&BEtQri=JqwaIcLuh2H}cedShx1r`gVwWW=S)dZw^$KCf1)(Ot}23< zFbx)Mqb)M!~h~3G3-ATJD>XA8+fF|A_?`Ri2 zODs|(Plf~^{`anW^-7p-i;e|jzzkD`)NT?`cfTh@DliQ$n}pm#QEXRcNI>jfm`yQk z8g3H^UKp!)OqWQMc9?}$kSqu77bRbzwR;IE2Q*8g%@V{!vJ$>5Kk9qN?S4M&d7>e> zUGF%KX=`)CW_DMSGKQ(}ViVZfV&4te6a0ajM)wcbT54qk% z*!e6d>ng16Gzv=$DV`V5wF}gr{QUb%m@ABeb6DrbpPOhV3L*fWa+W`}0{p`yikCTZ zSGF4B`bXgayrQMKYJLiyH60(Sp z{)EG}4&8fldX4isjw%LYFRGqjSbQqKx3$l|$Wjs?jhb3ichwfHSmSq1FZtbaNOf}h zk!>25@sKsFW-fP~9_jyZA(B@ZHx9e;CW6o*gzLJY~QoBzk+Adr6GPHD};3WQ_Xme+U}!HacJej3sTw6w>Z+`nFig2dct zUmT&h2v|L->Lm?}pV7RyjyH8_TYgE(nrJpp^&`O0sWc)Y@RCK6jkzk|YAafjZgZQ$ z#tOe^3P$=lKCKrI2-^)}@)Pd!n|!?@uF3=ezFS?mN+hfisb*i-y!Pp9QYQNU`rnzqQ}Ff1s0TJAUDN{Py>{ z&g?BbKiD$bR`4vED@na*-5=W0i`JGKW|lc_=A~lTT80cTdBC=TNQ5A@FuSp(R)sgG zN$)P_NtU~2>w?ER6q0ZUo}jHE(+NCf^1*z`!j}@8YBbV>O3U$qgls zbHjWKBN%|x05Y{(8d85a>dP{i!%W_=FY>-Ksc@+c|;eS}fy;Otjr zI(v@C43&R;gs72UvE4#5G^XziVT zWkhWo9t(U6NWV3vDvXFaImtxgQ>fBJVf9Br)zW@GdOfkDY+31#Aja*X^sIu$A%`R6s#9b%NmJdmI^4F3@VV=j}mb1*sJ{LCKL{OcDA zql+t403@4@x(6R2rWMN@W3Z(L>7Hye%@jtcFwr8aupL%jETwqV0*&RrPA||s zQ@2H~_&%?519T(TSWLn@R6;#KKU)@o3h99-_hVSDpXst6=hc1B2szZA$G4(gsQ$#x zDyLd@Fm~0Z3Qc1hBHwh=u3kn<1~r&T!);+-rILsr2r88U_OoN~hMU zc>$*U6LVKY}2s; zhn4}y+C>Z#ZEJQ1kAG5E*u%yuK%CpO+4sJ@nScDCW`~`pZr?6cN>Drf1$8O!x5yRV zk5OltUOH8DSWfqod%K_{PkoCgXV$&iHaxF(L=^}pL2Di?q~08_^-Me*Ni=G``DIE> z4?27*d}Q6-v<-EKNX_a4`cvsf_j#CCkivi#fyJs5m%1zQ7D#zeNC_0DtpR0p8RsQ- z%|jt<>zGP;IvnQUXFNoh+k`pB?1h^vP2l7hu+8)rfp1n4J(KzaB56K375WSK}!emJuy1oNrumy(3| z5+=58|FTYQ{*=h6U~Fc=KT{T(vAWt`R)&4X@sPpZO7%jsXAQMYQe zSin|kvv{Q&gCY9!)U61=JgO$Xvdl6&;F-9`EUYU}m^8>PBJ@@amep|rf<{r}s$nL7 z95+UaV;5hfH(;|FldKl94J-bzMjV%@KuzTw@AYZL*Z3 zb>7iX-x4j`x>V($5whM$TW~na9qf1_v38~x7EH^7F_nuI;lzVHgmUzMWvVRz?^QDl za~M@^+ykSB%BGLd-xKFt8$ zDv1HFeSX1_8G?|Pa^8%tcVTfd;C*^Ghz<1w;-|SQ>yLatNuj)JJlA6&w-N$DM4@F{ z3m6Yx7I^6fz+g14|T0iFpfM z1FZ00U%vSjTbl>;zIUHvs>Y0#7`NwS`xhXNj*)u&v{78P1QvUtRLyop??g*L3|4va z6A203^)>{|1kfIo*7B0a8C#P5F9`vMfO_u9c&1FTYW#?WLz`IQ`WDSJqp99ZGNmeK z_+;Rsope!}B_fWNg_>mah5`_42UvnjjD`pr%Up9lE(XB2X?nH|`mo_9Di8V5t2WSz z>IjJeg%xuVg`mtGjIwtfjkdnUJ=s%qRjX1Ka4#D-mHJmCqD7M^f?&AO7iZbl?;s& z5VsuN0D5!&Cf+Re>)}`d+AjR+%Y4apj9)^MaSgu9K0tT%iQz5Igl2i@ZgGTO7RvLc zA+Tm;%l%%SW~m7AOU{GumOvv6f(7iHPx`gTLM+2@(w6hWg-C>yACM}wqaxV+E+d)Y z+@&;-08>r6`VK+x=<)djcdO$+$qpGT-rl;!n@0g>HtrN7>O5`zWKeLZ3HB?_!@wV$ zaNTKWzRNJ+bz@Q$v}#{Mox)5Zyr1*Q=va(c3y*EDe1vQ8h4+MZAWt5juh6gbdAPp3 z+Ab+9^wPtCfn_|4P~SDVcNwZ0diW>c$I>^kE6hN z1U-5V>}U`yk}u<{(S|>y)_p*OF8Lc12X1%W51n_jayH{Ox2k9-KN^)8ZVu)7Q$Nd8 zR7vp8-lxsHv_QCjx(gj&kB(L%SJzo>aM*k(`vj3#l=6m@PeW!FCUUmn z1we#jo6i@Uooqbr6|kypifY;;&sTp^C}cU$P6z+YEW}H$^Okrazl7Kkt`ld=6E#9G z9VY7`^+O$Ri|VpgX}}_)&G4NcG5xVI?CHWg$vy_~k}6{rzNlu-^@E# z?^<$By`GBpdx|F@SnN*(ZU|0PpCNfySqqSo z*=?3&Tt{_XyI&__A`EWhqJ0094R3mA=(VA| z1C1u#JZYd*cxUBZs3S0kQN>()ck9#l@`V9Kv?i5ym8CKFR1gUv!&*135_kdVMO`{h z(Pc7$yP?dk&Y*&n9q4wF?yF%*t(91c(%M7#S`R}FZJ-?yg*xe1iP`WuW5D3$Lryc_6;{*06{vjy{+aM%F#WAdIqM6wkHn#UWZ}wWc`}i^CE%zq;)c1- z(Wy%=_eW|2Vqbi2d9eP2@F;A5G&$U3%}g_>D0!g&_<~VRho)T~eE4GG^+Q-92knmS zdD>rLFm*ILyj>dJJ(faqU|XWf7hP@bA^?6jcr_A=Ad5!1(({7Egs$V}M4eb8ZSAth zzE8B{JG6_=YNFWj^zaUHw41}@I>t`6cSDQsi4C@jFDRejXBlP2z=DqMrtkGWH zOdH)H$FN+ykmxn&Z^2_xt?NZNMzfj$ezv$bSJecGHk}_0o?gZ<@oNRJfdhNXsbv{{ zNE_in+XY3Trq9&$uv)0;PN}0)_H?&(jlzORdpLuJB`m6(T%3cGQHnwM67SJX#lp4@f+a7|r^#r_Bps-rKKib-bT#(iBT9hM{wsm$^Hss>y?135QG-8FnpvwA~ znC3LZ=?rxReL8_~BT-fH^T8!Q$+3Km`c9kRIYWDlgpQQ^6^tltHQGG>3$gIHNMC5% z8)Ck!*tc~Xxp2$g4J4A`5WJVxd@J)^4r?kUSw&%OjES2#tQdKy{z2N?12k#QV6+##TP7CK3a=XDJj8d>6nA^p|n?%T;K4 z+a7I_$|YKEY7Kr=C2E}~vfnx6Hh13e#~+X24bIq2&|_oKQi4_F4^8do?M@1L&shQx zbJS7lM*#g$pw9cEr|Ea|8~uw>#iIjT+l7sDJ=tXkX!!R~(8D&>-%R2cH~BJftJNC3 zws>Z>C%ZO)45g~Quj8l9dlVZLk_=_B0`IfeeOxw@Hf!gad){-wB&{q66WV7#0V|U5 znKb4yt^S$A%atmwp_@*>@pD}~Kv>|4yc}L~g3TL=)k#MZ!Pj85;4$p}_`5(gLRbMD z@QX6zJSdzq69~JKH!aPouT(zf9*UmzEApo6UnoqR+N!NR&a$nyQBH_1xNt*Hq*$r= zDv!$_RV|yVUpfsH<$@x)jI^Tj16I>Za%z>}>jB=)ZkoM>T+&cY*8Oxr}){>0cNjL8<8c0(fE z%UinIZyUv8u^K}G#%+k`J6hISZ@Fhpxf{fKIcLAoz4DdAHZ~tVN<6)WVS*{ZswO9L zSgubS-i~RYv~hj!_|X;F3k0~1fPpKrbqt#QTE>c%47DY>fW*^Ymzn|wlmaq`Bc4JZ z7-)_AOx3_$w5zWEc(1zU^uRON6tA0#wTYYjwF@!`&B>U3O8RWZ;Zui(s*mFnFRsaH z>CA;aExWHLNbK=?8|eri|C3NIo~x>THXmqeFm?&2{lV|S(c#jg$;N}Z^dBm<$9a9I z-ra^TheGbuTh@Rt-R0LW(no%TVCAw%R$nq3c4T3sSzt^_$vow9Ycl7o{OPKxh`K?` zcZ!aQN9HZ#bsb+;-U|y2E1su{r+&8_ku3NNiw732(L6_*bdW488PH~KL$a<%?`?iF z3>a#ky4*{J8ucc89S-n)_9cxE7zV5j%*yM6HPE`Zr2NwpwiCOzxt_RaW51D$%_kYn zpPMzPTdnXOc8Tix@HQ8qte85_J5_ zZ$<296I-$<=%UN6hN1L9O_y@l6{|jkkN6 z3U>5)yX9259;Z;Mvmi$OtbQx5nUMcwlj3*J-_XjaPxc|=nB-KyyXLNAbk&hI=QfUN z{YZ->-=K_8tk}aNreqeqJpOcM^eZfmgDy%%h*j|FM7k4yM&jp4QcRW*%U>}Ty7{A` zopQ^fjVHq9Ta+6(tR@m&6QGsFjw(}nYEOB3+tEb|Jjsk6V<*ff(#8Y+(ykimkP6$T zvbd8Ag2MSXzY4_$I8}ivYk{mzvW=V};l=7?5C~^Z!;ooIdOGnltkEoDM5nzwzZ-K} z#4bAPss1Q;nzi zqilHd6!x)Ri4y(o;Ap6{Lm@mi!8cMtkCs>Kj9(xU;jU-n>ynZmhTUED^z{cY9_?vs zm(h0VVc2j^+VgwJt*4imKDV@NGVFM4;C9by^e&}u%oO>G>jNhW`@B)-b;!b$*_MAa zS&W&GUeU(^N`p zsh5l(zJwP<-t$}sdI;>GRj|2m2DW|_z5FO_tH6zDih^%goXk+yT$q;hPg3%IJM-@{ z+P^nzSptFjGz(Uh+z!$y z>gP|qeUY~szxEryod(~?aQ|zB?wD1txERrYdBhh_xX}%=*jU|*d~5ceBkGpl9-MM< z34erP)(B=v)wLg0pO(rOU$ z6uR~z-M8PpSa+-x=Az+fm(8|)MOQH{_Y3r2^?KlcmLuwyd*7OURC<57g=C((&yL8G zIguj2D;ySeYu4L55#JzvvGu^fFboISL!}k!P~3Eh1Y-(LgkL|#zvvBUHC~>&$y?gU zhxIwXi`4oY*aU>H0OQY9h$G#bOvTw!=%H~S@WwK@z8tzTc1Y;gpg5jD=L+&&WPXA!%i1Jw8 z!j*06SYe;!#$5)8&Ahs<`lhk?iZ3ab7YxMDZWrU1wBsuYpio3EAq`t+fV>gmf?6)z zVR=_OJb=Fh)NO)#MT&&|k=N^YA>u-P*@FiPs2L2bB#vC*UE4D_v=-OIh7vVioo@l; zO&J`LCPl0;B8bfej_7psMF^*QaOHdb`TNC@3LoABv6?>>p6y;CCpD(ruke|s>Xr7V!Pdx@uMZ0g^>NtQyGYbq3EmS@sknmIXP6 zknH{Y?1$~%HqMsp0@xP7l-oUEpUjH9s*7a4(HXI) zUh)^qe;qup^Gkf56Xl{A-G)=xk+CbVT-T2lny;x}v6xk-*l?eAvLUL!vhS&X&mEBc z>7p6x(E;`9@e{7!Mebl8^s|!Rd;!l50gGD?ahKfd3aSbMdmdSdP5OB7mNY=`h@E#NR=d{n8SapL$+0m+7$+^?N(f7$bp?E% zw?*Yz&`M-fGqSCB6UF!hwHvsPkUF039KM7KvmE36A-ZHie!P^L)lX=@AN`$}{RNYK za-Y^)NV+kTaJb;2isYC$SF$R0)(W(C)c)BjNwxw#y;cnKGIv$*V;g%%x+-cB;tZ5k zZ<&jOW5_v2P$H}uopHJo%0z!_X4{gXy(0@GEkW^x2_Ojj*Ugtbs7Q*FWJ0l4Y+t{+ zTNV=fplg|-oxN-7S1!&Z&x?lXk*Hsk)Pf0<(k7_k2d+gv4WF(7P%0yZ(J=qD?*zip z;{=?Vo1}E-619Ze!;HIwsUq}jNEkqBBC`-8vdc9=PsYo2bINw52CqHP!!S8Kq|^QL z)*&M@)4$?y`yDwRdLTPH*0s)!jN!Asoc^Y@dH7tJj0#&yf~gb5Y5OO9Z%{9Vpu)j) zo}gb)Stz)X5);xcKbNGDHR(NeLV_gotQ zDUK=S_cJ5(AXlx#b!Z=;`TCXZF?(Q$Xz6I1rXZhd?>t-yn*#|>BVW*Nt75bmVz~wfoMY!JR|b z9CPA39bfCBB@Au}UBSykpSvQqB&RR5&)#o23U=!)Jo;=kK(gZFwYP3i8^khSPwd9( zvnm(aYv~?$m>H0rY$T$&B~#xNTh0 zqH)JK9$==}Mi*4p2l*@iXw{9^L!tz*J}%mS%b&y;GZQ8i_$@RyTX1?As!1t)yYwN| znLgo*mu&Ul(TRU`^gJ?3C=qD)kQCLV*8UvWwH*rHVCG?S9Kg2yoDUT*JA8Dzd2+_u2O(l&P!#WZWna6-+)GAvf3f^QRtget zbwAX5!!=fA8YD;G1UT9|b$C^NYF2j8ug=){)zd!)nFj+vK+_HZbyi|*!B-Z6`~=D6 zzF57v!Gg#5^wJF;cW{BfbC76}{F$$u4j#w z%~_E-4TV=>)z^EjUB4tmDM@>nf9O|-DE;&ruPq>Q9YyX-T}1e8dfAlyL1s0 zT5~5xK?~T>0rRnzEX)kJv{}hHk%qjf8&*BS|EPD^eT#3wSqkA&X>s)mx4(FGVZ9L|upa_OFi6poQOf(4HxF(z(U<9y;UTFMF0Ww$jpmOOT} zWEo)OU@O&!B{%VHn8xn%V^<+?;qFW&dColn(*cktyKtQFwWh|WWTtH-N`f|mPj|e! zq|!B=VXp+dyO^PLo;W24NR0Fi>IXvyl;*qS%1Rs&o137J2%^;(3yxpVQt2=%wLDh= z4q*ko_Qck+SrHM@A!2*u;&cnX8Y}g?UAp`N!U)b@o`ty!aa8JG+w^=WsD~9ocYimk z#x@DI-!&HiLf-pN1qen9rmnMU**y^m1pCC8>1n&@?YpoF_&Y_ERQ`I1$1S-)^BMqa z0C)&smHTow34Om6ee5cQ^5xAX>O!EeXMOKUE0M{0slL5^=>;a-}cg>aLemA`*X9)ZN`rmDUpwFjn9a8zBa*qV_VjGJGD}jM zHlltT(02s<>#xtmO`p(>iYeC_J+v^MOWC|P+S&G*@}-|D)*vnm`SLvPYJV4oCX#I&609#n2adeU($K}BF%t8jTVjlwwZ0zpiBK?XeTjow zma_AFsfzO0v8$1?Zmg_gq$hM)cv5Rdj%{c@p-Y@uH+1PypszV@+nU&NJlDcNuarhF zxK#5zb8>L^_cu7?<&V@3ZE9Kj0zCjSW3RO2)lSz~G$b^|A?Dp)teqSOu3mDqSxViK@FI$iIfY@qs-5AXCN{)pL^jP=JcO)JXS9mO2!|{baE+Q+KJS76`{!q z0gCEG5OGV_O0(bFhAd<;ag!6jZII}Y{3~kvtlmG2xp6Z04}`Pk`GNeDK~H}E%+*lv z=c4D&+>dnWgVE^5nCV+~rO;UHr-Vq_{7eTK{P5~*3@t-;)U4$smFV^b|2#0z97oiP zz=S3$il8hX-(a@R=hBhU>7JmFW7OkTebvV|T7f=5z(R|08%MLnCC7Ak=mA&sVCEv8 zP(2T9!;eX&4CMLftJy(zf{V_u8+u!Dyk!g9SpJ9z9M!XGB+BRtuhr}?t*Vzj#mvJP zY+t3mA(zrzzt1@9L`iV3Kjd6Cel#OW3b$ewaers4^)f(->QeNRRc( zP!GImI{kA;TIM>s$#rPRONs^nob=ToTVjls+$VCJngI*a65Sey@JUt!TGG1cHHv$h z<8)u=r6$Fd=AS~Gu+=hws}9^Wt}bzZ>UG4guOL$5Q?5yG+M|#jy0ABDB zYzuo};dB#o+`fDTXdYc)19gCOlU2ItEoyl#gCBY>_xe|CAIuJ>ulyZ86}*u-87t!4 zzju-;zGW`n2aN^Ftju`>UQM`*_B9C2hCwF__8h*E}r)? z^Xv5SB2s~u9&))CE=s2&QSG5osZ67Ma6NJgU*<|J+~eT z!IE*jMRExxOM>y&`voLu#G_pYCP$tt)a5cHdtDgx?t?DhykRqn{GQon+MGM!Y^vq1 z{M+SMIosu+X;`nnnL+hclH&ziTuV3c1Ky_Y4GCJ*ch*MO0^ON)+UXcl`O!@uT@c_G zXNymdpdRCi=BMv5#~locpAuXf3?x!t*Pi8p6)S)HZja+73~#IP6h6_oW9c@;?^tYW zzsjBbkP!RBK)1hWO%4MXK^LmuCb7|G{^SBz3yC5rS|UC@g9@9E2g1bs43r&|e7iC= zH&`cSyAZEAE`GnE>a~km5AZLMo)#IlzLhK|emT0J@oVpn(R0JB{RZ=86C|?-FFkkt zpCv0@7zeS}iJtzmy2bb@53cPcP7GUZE=0+kY&|8$q9Et8^m${=w#qkdhqsEKDLGnV z*Bby*emZwwp49zE$!)<772(j0A#;Lm(wjcux4hJ%@w;Gj$x&#Sr2|!K@UW7=E9rg0 zAe15va?3ar8i@Fonj{N@1_h!=x(Z69-P$fr8@c%UwStNwY^NBrx?gtJp->FaYmLrY zb%_%3lFh;T6=}JixAuTQupVk~&PmTsJEuwEP7NMr1a$W6D%}oyB3^Qa8#sh31vO395X)Qj&Aj}?YUUsT zQfBzX`?-ws;lGU}qMzey!qL#{Xf3%Wa@RAcir|W~_2cw?ZaPEE8I^SuTuOsJ;n2(R z26g{R_rq^7Aes=N{dn71ZFMpl=gb>6gte+4iiFQa^F75)JNo?8$_%ht4y! zvx!HA_Twe5AH%1=dTQ^NPgi*=y{5);FryWGvXRwLp*q8=+cpVg7y$sog{uvw=2DEE z9hoH>?Q!5lSRSnS0exWma`;d5&^+AkOMIv|sY=8s0Oj}qeXl69RvlCF$0MUS_HeY% zpu1b2*E-xLZ|K8YbEre3Ri)Tu=ZPzc3S5!-FurtUKD^|`ywm_xqKrmGx zgeoU@q&r_g2p76OzT75Zl zv5UOU-ZcW`Qprg#^|*CS)5C!9i-*Zf@ESh0^`zxYt>$T1hnF53<9XJ3-I z5?LvCg}#xY0+-RReF}+fRnNkx5S~JdpPMKo71tdAGxC^jvRt_Q38NwK#p_6vF&Kq? z(HVc=9HpFkURfka&fX^C4IBl;B4$nUGN_F)J`cU)!})`$kq6hBmI0B}bG~Wo%V8*! zck>sZoKT_>n*qhpqvX|@ylgOf$rFN#Z1l+!t69*DIxlxmna?O)q6+lM z4G_)dk5V>AxLb_-)k}Nwe)P)!E0{2rWR)T*NN6!BiBF6O;^z=H=icgDCkF#$mQ|fn zH<%j(obq&;Dd2_ST1N%raDtnH;*~ndO>qSCbl1-+^btOajhs1g&et_Ua^|?zt}}5oJlCCb z^-o4iFnmt>8TXYRyf9)uS-rFT(dr6gau|%AnN(A>J$F714}kA}WPlKi(0q)VxCcdK zF}iOhNV&~1s3MWaaN**wB4+GyChpV-Cp5kG1Oi4xO%D4^|2GsTd0(bvMUx!4UzQ98T^Yy)(6a7Lxc`|I+5CQEwSoy!)&gn zV>(hy*yGSW)9#`XvkPtp5Q3r5DX>luHwe_Y4c)u=;t))6t)N{O1Bx*VcJ=KCvVPd1 zqs%zNmW__*KRxPJ5(sRLAv}FCiexG5X6kZ&{fMFA6&`{u#b;V9#j;u3?tgZdTjzws(($Er_}KrVy>&-c-g%rs%}pKjd1o)B9>UuIClW+^-Rzjy z=)YgEVAk^ONbd)|>`{CDCL3`?|ANiSA7fp%SwgXz;pWMTa6YCEgL6zhHYqK~Wsso?yCu`#XYfMzYsth5EOJ*D5~Mn;4~d zea@$6^HDbU?krBOZv9eetF^O*S^N1@<#S&%dHn0=EbUcS6n~YcSN1J!(S<}hnV_GW z8UiVw&PQ+y5cPJ?NZ&i^UsakB;$XRrEDoCs_P`d3G*3XEerTlrV`Y*UC-+-J^*SY8 zvzyhc-Z@$3;YSq+-wsxpUFL=yt#iP1)ymm{_i-CLj3!5SZzO#1z~d!tr16BSwgbI2 zL_NNJxfNvxJt5u!VehMak||6#sW)P3^9QA%lzE(ZakU}%<=i=M2P9z8j@`hsF83mu)cH`POkBA= zBS;%0XZCU=2MP|E?chc6?7(JK5-%(+H@XPCX3XDFrcRPN`eo6MQBewQmtWsxT7 zI}oEfdX&YuTC_kij;ED|T_7pe8djQy`uvP*tqJ zjR)+jd|w`7kF%E4|6X7F51oqHb@!QN{1#4nd>R56HPiB7ZO6ad?K6QW#*FWM{*#S@oqz}G=`SrR9OACdPX4CI7 zCf)*b z^}mAOS0T@i50k5859yMJLEQJbOiF74m15(JWWEE0!1Bo>T^fBQCJYD2bGN)p<|?`7 z$FH#Wm8t77#|D2Q*gAzyrY;}9((KL4G)waItn%f5n6%S4sI8&mOR zRUP%DNOzV_)1|5i6#)G@UL@7yKJY>a=91tLDP`ud8WNNeXFKYBe|!xGYw}{^3soyU zf4Uw*6>y}(-}SumN>JsC9E?u(B%HX-;M;X;ZMGEc4R*}j$8UyPD-#~0BWUIx$FCKq z4@;_j$@=*WO3NsmTZmKXNxrEbi5*VaCB)`Wwg+GlpcU9{J@Q8nP;YR~R7LP+Jk#Es z0O$8Og5dx7iUJ{4h!@J10w^)u!+Uq|hJXaUTvg4f>0mB|t|sO&S^MS3xXd_nZH&YUjkMRCnd{jzv?UOorJ9pjv=u@!LG+_7nXP?dirw~ zw~ID_Mc_T}1DqN;5~O~2zZWRs$;|m!mrHrK7J`X<1&wbsHxVbzO^u$=lEVVh~XfX=bJbe+kXo~+ty;N<)f;bp^mK<_4*?-7cKPz_9`$9+hzQ& zh_lwC8#W|;y)k=}5cQ>?6?<^1X;-gv{I=avWp=wR!2UbfZrVe>j;T93bLM!uBGqd4 zYlW?x;K#=TEY1L^Kf&{Afh&PVWS*Y{zUs$^XZ_cmB%95!8o2N|fD4rfJJ3_HqCbP0 zlJ*cfow6*;!ceQj5zo;Vu*V^h22!}y!MrTf5 zUFf(-K}GvXm6llx|GZ$C2W#R_n%>@C3*hOr3vW_?BR5TEmbMKE%m=SS_&XMOz9?RT45x=z|hF7Mo=&UEW@enHu z*FNs&_!Q#^VLIr-a{q^z2bWofRn^Vn)t6l0R5NRAQ`-BeV0j==`A9@Y0Q{<_d0Jl)FzGX$obtA$87M19?RSHd< zFw_TU`pAB;xC^~mh;u4(9>4?PFoWYTnvQMjDxLHJr@Qa|@}=83GAEspp?#f;r$dmB zr$(vew5bd?kJ2?<-t{J?^StLB#f5V{T|(J6*rGv%&O?3&u60qkRfgElva5>8Ai+q| zFeI?^a5x3X2KX5hiWR-Nlry3fX^Fwp!`wPg2sjRCKf{Y9-)9da6DT3-(+)P6$JVRHhXeu%3v zKXWvR9oNhrxr?ElHez;oG@v#Tr`I0KmLSc}w7DCBQD9n?;5!60kT=X(mET;CDDW!M z0;wBrq^yhzC(AsXjV3Vk#R%E#+reK2k<0c%QjM+cnx^?@TE~u) zw;yC1+5^bY8pK?qGd}iAUO-`?f}v_p^mRNF+ONim_e}nVC}`V3*OLWDAxfoVY?(a z6e!?+br^hQ{dgjTMGW1NA9aEn4}g~rzUyo~RM&v-T5J*B%=aYepuw@~C$h-s(ZySg z%Lk;AA<+O{2x-lY+r~5OaFi35bw$)}zkn-WD4?)s5Vqmu9}t=;LuXuVLDgHa-A8U= zNG~JNR(eqD=JJPuIU(u+7c27I3Et9h6x(dZ1Ejq$vLC&$`~Ip` zPIq9fu}d{CUW6EVcRI2N#?_NiQ}ZO)9pk3I4B<^1Q(5>qcmk!OTIRjih+7$dgutqT zoa~(zGPJb4L9IJM6`g7M#)>n*Pq72qz>D=;C?S9_lp1aTS<&nUcNw_|?tViUQft=^ zlH|!B*VkSWb9!9f;ttADA$~PpGP5IqxqjmfZ-DC|Vf|+G?u^*^aLUpY{&I@Bm?;O{ z@k>!pQbPPLWQX9P)KB$k%wAww!^(EUmbj06ETe2%HPQyYl2o`+j{fZyg_UbR)|bsp zB!yyUFPIZ<<;T8s<$n<(qK6jm-s&BG2yMQGq3uHf{ToG+qn8N8xscj14m~%xhpS;5 zo}d7R(1UFVqatmOzLgkr6=oU2Jq(CB0xmMPa&T(sFnPmi&U9l$lW zB*wl50R!8By!~>dFOQZA0+4o`TtpB26m^Bq2t^twe(Sr!d#}f|F+{avwpMVR(WWTA zo=STZ*cHsh{>-}~y+P0mP)aCIn)npJJgjlk7)dYc#*q}h-NO8;<<@n`@Wb%C+Re$$ zfOSK^g+yhf-oV9YJm*n{dpAKOCnmbt*GL{a0P5bf$}NFNO?*Au%gpNfqSvPyxprgl z1-R$!ZC>^uk8CPeV#8uRWo6ty!{H`3s9h$9qM79>ERIRWq?f*h^;Kc> zCHd)6d5EE98Zj$M+BL#ZH#(cmVaKU1n(c@#FwpR=BNH@14oE0R89Pl!91{|4EmU|e z#dqVv6Mpc(L)DTWUgGNA4bhV0tI+ZPjH~A?>3*xin#Q2R`ZbV_L+~C`vloigTiAos zx`qX45iCpsFyKfp}V;=0@S zC!sDo74}HEu{xbc#hjqFg{7Ft2;3ABC7ErdO@4{ZpdRUItN!@d3wa;_OzzMfTTC&X z@p>lPu=NzOAg$ zd4DNT(R}6YXy!&{a!DVHyt78?wwYg38G_vtak&Gh*tc}mIoc~G0|7Nc4rfH(2t+RV z`}@>~<`myiH_VT-0z4C$U67|j<=~YZNkyjW_rMrEEJ}W%@W9xOxeI{9FX<{9o=cIw zxnI>Mf4eQ@n*%YXRMmA5dpd*voqYbockJPTPW#5vX~h}yHOy67O6>8uSxaMoROO<= z(H>+agfm!0q{QA=6Jg>ZunSsm2ig55-*_><#Ap6Hn93J|;Zh}w20+%1zG__ zaNgIDDH^XtrYM!q-OqLOjQEHBw~hVZ2CJ57L$XB5vZB47q360mMoZkig%nJM+TWSZ z;-~|K${|H&#G!sQ4rD7JO`UPW^pJbWjqkH;WyY5ygN+bP-C+0xd0qnd7PEJ^F|={m z+MW%s;o6t~i z0oRg*@7cGB)dwUZ(s_e(`}Wg?QY5EA>R~U&h((VA{otKd*_u{#X_EzwC~g0Vw=`%8>NEYfWN|Fyo@4X)BgO8uYZ^UO3C zIhlL-{lEV{e4TA1fx1Dw#$f?zHRJ(zF`&2|j@lNV@9ngRHiLuG#aTM8%ljsz zfV=aF7hzVR!4^c6JEh%2;#ChUgW;%Op5I16j)~OQ$q~+aLHTY$Xrb{0HPO!6qLU%} z&k-Gds;05|51hE;YY#motxVd_PEo!55#ErGc@WMr$s{J)IVda@RH`TnP3l8dX}Tx* zI-UScshi(tQ2AW+EJt>6e!G|4%&*uI(>y-qV2e>A`Ga32VD`x@Aoi{INfsSR_2RN; z*njTw>Y@N8S5bFB95G4AH$c%Tp+u3ON`<&NYWjY}1B3{M$9#r2V&cn<(nnX2IPcig zO%N%8q@9!P@NLSj{ZTi9%b7cit8HCXp4NVR>>i4yQzjoyQxSexMO*t^0mYV3KufJH zJ4OEZlO0Y)ErwHqYKwQu!7$MH_Up?Ts;<0dU61XEJhU>d#AyU01Mh7T1ocm@7`2ffVzpHf{dMv&M6x@Tz+LfzI8Ib6sZ8FEL zbkZB+{l?g*3d9j2i`&uoinOu-E}Dye zjadtFbGro1eKYb2%lELD7U0DY%fUJH^Mn7<_9A^(GL?#4bK_A7nz>svbM*>RcqG`0 zb505@q^y^0skQ~qPphkxc6g@qSG8%40@PI8m4c41nR-Fz zU@BP+8`8C=5tD?a@d%Ev0Xnm$eZXxh4*6F_lmJ?v<%G z#T1mp_T|aP2`YV`gv>L=##b_-?LHi3kF>fyj=a4;plod2-$A82diB}4Od@3H@PwIM z78H53BIJk>Q)b~?6A=MXXNW#bjY%(r%#B;wI7+5=F;I%ndw4D@>xU3WV@v_2_GYA0 zxjc^67DtfwP~z2#kG0%=h|DY(So^{?U=wh<5;^kx4p1@;ulB!2a#K>__#SB+wyw){29u(xxgN^=9)jp1ljR864KP_oyrkQa_GoTZULY)NuI5-feYC1@ zXN3V^UJokO8AH?CEaPT(`Hppcyx7J9fe^mdGha&L{5$F}OKO2A!8b8#J-q-u<_1{j z^uUgkWwGdqKZKHP18L*3gOT9Fk&%@9Nk@M+m{? z>f<fug8YtQyRDBR3zq!i$tO_!sKpwdFu)67#r9)`^Ty8p z5%DWz5jDQA+@-)aVG7=sQa#FVav80&#$P-C{z|`V_pPx7WvO4e8Lo*GhCMm!TGI06 zVG?6Dl~k9#%xW>G(aZ6u$@=PMWXJrsP&PB&`o!*kCR#H7-11l%>^Kz6y#zh;u?& zd6eSWY#`VdbUjvtpsR-9NB~*hJBwWA2dDF;NVM!aGG5U(N>1qnZ*{p~RYUE#|aD#{R>T*$6&1rOIfm^vft^2Uu9 zuuVJDc!_r_PD^qcSDc>rlU%~s7si*J_Sb;}OTlyCoS0odmZJ6a@}ogfcGeE&9EdEw za84Vv6YTb7`44;>aO$~2h29A0S{-4`vp>?#01tYy;X&*XfR{`)-2==49!yV8DN;5-j>GCQHf+qT zfV?AaC%xeP71xR3XJsp_TJ6o#w>9Qm>s|v8v(^5UlJK zAl)eg19Y}k4KYjzBsq-JC3Q~;s0NixwOV#XX}RuTu)@P=7yEazoNQGk2$f5NTo(OT z#h8OrekdP*02{nL@ZiU5`M%N3Iw&D~aNTiW;opZ5R*%>L9J3C0eB+ioGJ%uTqu{pe zIT_uYp{zT0f7!jW8u~&r^&HN*sbSxOKOy9q(ZBbQ_%>p|{kCvN=@*T&RY|_;?EA(G zQVcAHu7R&myl%vGuvC_w;AXK7y@$$&ChjIYVFQPvenXD? zlaYp|5P7+&E=TT}5j{NIugaS>}?e)V<`Nn7#D<5c5 zzSibHk^N(aFPGoDIetoqXvUx46k|3w;$o|=G!Y9EuI9b(dGlSB(Os`eXDV7XirDTi z^tP$U47@t}6xl*Y3g!W)mU)|mb@b&!gZYR{6vx7WL;Dd-Lx_}Ncd?BW22BZVRur<7 zv56)^z@l8HzpktY7TQV8d7|FLdSm+hq>PzY`v=DWsB(qs!lQqwhK+wEIBA>^9(0e| z!rDWqgRxx0kw@QNXe2=%03n&D=1u)B7rP>3$(y;lk}#eYoS~@FBHewHDWqU_ zV>2$W97pg{&BG&B9eBy|^>=Bv#0kq;G+gQst2Q=FaYlU}Kh_YLzYk6igkUv{;VMzs{g;*}#6)HdD`7)?(~` zaM`kDkBT>aX6|jH>kTQ(+*A^Dp0VEo?{>D&?oI$ThBAl>ft|5g)42+;N0!n`kR3>i z1n;+a${C?m`3=kAT`2blVmoWQ z!D543S;u0C7CqEJji*f2Z>BkreO{teWx6L~M9WNQ8aK95$$@ia@=KEUh%ghP{6N zV_u4YQ|4vP43k*{KY6KkX26MFX`~la_jNh*lb8v-w+zoLPGJn{pvJj;QKx_mkaP=m zhV1cDV>QE)RHk_SHFeY_4lJanDodqGg4r;D$$Dk_vbkipSt5~McRYgrb?V*sD}IEP zl5kCE38Bkk{jr1@VRJoRzN`?gV3#Vzfz@YFny0u|K`kC>4lwX5V61n&NY8I+R-|DK zgCBbqShvP?beDJrR4gPtD8((P97{t_3)cP^wPb+@_?mzU%wZKFfp0zY3#>W>?JFzn zpR&5mN~%+^397J}1}{WH7?K#PgnkQuhsZ$7WziA2#Q+4>LF?-R-CPm)R2IS+#-{5T zN&#i9+wVyw^ zQ-78u!ERlAUdVTF{GB{^LR9bY7f{5jWtVnsVV>!jVRc+nQ25)>L}o@?2h$ z<(^93v>?XQU}|1DunR^8+2wNiaOQBdXU2D>`IguAA0&RNjz<7P9roal7&z*8%4X>% zQ1s865-=YqEcVqgdFDjYf!bBnY95G5BW@Wbt6?b(9n(%p2O0wUH&k=O)it{q4-Ino z;ap0=g@N1U5ew6=Q;z-B9IZTdyc>&XCyUqJfo(f}yIJQQOj^SkBLcKXIH=QR%jlT0 z>791bQZjha@8a+5{k_Sq641i~zoZ~;z+f%gC!tk{Q_T9RBLk%j=xLnG+Q)E7&@x3k z#<)6uiG7XQI`(oL5{ji~TXxXmu~9$9Isyhy0@vQXumthLr8eO1*eT6ds+D_8JnoOg?tmT?<^%;iL7VKe znIdAoXXU8TQ_R?}dKT+*@d{TlWA_1sxi7AVXF~5NtZ}@=*i>nMl#KlcW3rDlb|CJa zZWn`!8B6S)>-EI)_SR3AQF(#Dgss}Nc!^JOn6c)Z4(6U5(p?`c*$1k@x6{p50niOI zZ3Hc}YGC7=LW?OD&wKw=#KND*qwdDx7}|bp(dK`*ee))YmG7W=XhYK6nIuTJcyhy< ze@+a7Ng?X3UL4U4YHtujW?oPH z+_MzuT{j0QHj~C3W5EWp*64io8DJgC@qz;4!VPVsWPbnfsqjW5?joIW#P1&^dI09d0qb*t|=ops~pXaB8s6cC?i6_`Q(}Sr;@yygx6E{LD@ZYgC z6+ZTlmN~e=<4^taLpQP}tIBy@Lla>KA}u6?g)Spp!PG7W8Bef=c|V8D9r|N}%ap?C z%^5{E2*4A5D=gPxNSr47Gy#4x7m+MmVe|y{s;Ln{8Y?A4k#?Caagjss2}H2pBRWK~ zue9uHa|l)3h&kE>=VwR)7Q5|DSPH|lsuoTEE*NX$fzyarmIHU9og_;dL~MdrzbxQ! z`O?6=vHn13WN9Rm?mMAX&)Q6p7M<*CShc4PrC{8o;V5u^Xf#~qMl)jWItO2XE<)sP zLJH&fi!BuA@;4TXYp{&Og%c1*BTB~;lKybp>;=FWzMr?5^?f>{Nfj>Tyc@!kKc}H5 zKs|hwWd8dv$K0i%m_c2*)qAmvPhbX5mogswx^~Ae!*=V$*3@EmO)E4aVhDSurvm;3 zU&@8LkAoF65ysl+zK8|!&lKB0??9{f8=_Ky#s#$ta3!Ms)(QU94fomad~CfvAf+pu za0}$V1$?Ngk@+W#`B+$l0wS;b(n8(f#$^@VCEd3m7l2!1cVUO8aB2Y6eJ*hn%X-Iq zjvE#W=$e7!pACjmzb?Mpt=+Du=%@y7_vt4F2}H;NiAOkY$=vTCkX6mmXe?ngUlgL% z;E3&hbmK}OKU9r4Ls##7^l|{QB`)nA+bIS$XiHnZkBW?464oQoU(;%G{F@FeWSbqi zKvpSQE!>y`woAb%Dj*t?))n3Zn#zjK2##$z7p-~{Oh-{{oZ8}C?*R2P5bWZ4AD%c5 zqi}ArsjUs@3K)_Lo**k2_d4;P7u#YNUkt6W=UM#q&CNiyhk4Ax6Jp?(1JL~;1wC;E zYXFKVjE5Skto8C|tyi94Y9wp5JDip+&1^czTy;qsq%MQ0zEH9GF2r5Wh&jZXTopv2VntCIbOL5)_R1tt6 zU!cu6#(J%RE}H?3I^)XspP*{Z_T;p{bLUc)c2EWv4&0!RrH}>95@F2^?F-Pg7*9i~ z+UT37L#Uw5F$XKa4XAb20}gK7l2h|i99yKgV9?t<+XDB5mKt^!PQn)JL6-xvpC1jQ z0Am(GN+9$@qq@~TEOb%&_s#>{IBg_6+jnBC*I#Oq7^^HLflNd|%ir!VMoin%DEQEf z1S+sn8|nl0VYzLcrI)m(e<&i60~@*LXS~!sIEI8ribX9Bzr|JZB#c3&th+*`Oh7L zsW?306-Ghn?_g+kiBYhCo4>Ht1T_hO#w(cd?u98~VAf(2;lR<4RpLuG%|g=<0(qBN zzbn9s+KJ`fM%hq(@i83HgI8w;rzaCbN`r3!~sfjuWic zL#;pwjbM$eHL=1_wiQCvlkU-jm zb7RCi9pAD`REIv7sLN^$$VB>0t`MCb&C#5^*z143doIwYeP;gqvx)f;?;(|O?Ytu2 zZcA&c*8wenKqz7@V=V&P#48-L=E}UYRK`bW?N1G78t<74OqO@3{pPCB^l7OToq2yR z`SqKpNh-hJUosT+{vmwAFcGK#y+vKOcJo+vzOAVBnX>f+1O<8{U+7%Z1s2hQyxpqd z*^)4;t;1#c|5QtCflUF>vCl`-NOjUR@r9oEycP4)xfMghjn;`1ebyqeN#g?Ants=K z=BCbx&gP72J|CIa(irj&yj<_QFj)vKB2rq~i$*eKvMjaq$=g-1mR5mn?;N$<+8rbP z{W2z)Uo}0x*RKv3nTVXFXWwZbAFa^5{JmFtIQ?Rz`sL=Y+E(77pK-k!v){e5yt>{W z74RA!$+4Pm^rkc34Aau#QL8a|@v81LvphoQfzM$pLf?KaHl2!RA^+DeM zxif5&|6I~a6)XIT^*y-riH@p&?z|TF@IPOJI}1}H+m5x$p?yu;`Olqm1u0fDUpxV@ z|7S38h6HRArA-s-;S!AIjpvrEfjJL&NB`IN+?6(Y-ZJKJ5kZyni+kcKi)4zp-fUt5 zylgIpt?InAJ&90X{h!+fQ-kS@D*YQ6+RkJ3|F3H>!b%yb@i(DPa5wyH$tPm>SoqHa zfzcO6We)$ZODsM1(nS7$evBUW|IZKqXZBfLm~l&<$^U$0wHI3r^R0k|#Kk{XKJ>bj zarFNhxyiv~n4l#+?fMWoe*ZIfl31c0SyeG_@#)^=mNJU}JHw14cqT)?Orr~pacOcK zT*w8}(7^FO)5Fh+EBB)_D9Z9VOP7*{wl^%SYH_K+_hdYdzv&x-bTn~&)q%w?J`acL z*8e`$*cS-bhXDBoN1vx>>86dR$*Mq6{dd`Y@-cPXW&TJ7)A;%S`#m2hQuz0q;4j1F z=J8CxC;*LEnv7pSG5XKd!1pyFtGcapqe5}`_Kx@eRV58>%vrVA|CttW<3pWy0G16q z=G$2HQr!6*PPCT9atl&=c+}_W-V&`mF@)|8>XNcjDda;zEzPTq;X>iwE^*wRjDP z*Z5Xv-^m)Y@^7w)Y%O>rGv9vCT6z3)OTc`icI0g9YOArTd)fxR)9?2WVSJc{p~>n) ze1<~aeJgl01L`Y9Uw=IYCq!chUR`?yy&je!xaf#fshwgKh)|xA5U<=x&Jefa5Xp>JcN3*)NF^rT$@ZUopBd&h&QJd|H{Ua zw?kXU*xDm*5D0Mhf4aS-M8IWKa$~YS9?SV$P6sbY;R4wBaF!W;kD)mtiwc(ZWd78W zt1}L|5$I@;W(u@Y$7;aiq3Y-n6y9-zjjyu*h6J4Z65$_XT?F(OWn^}t;SR$&fAPPe zJugfW;?|)8-QDiz0RM(XTwnE%cTkHV0iPJa;*ghDSaSrO3NKulVp&N(ibs_l6+?n! z%gc+FHvIDm6yL%xBDpX9T>Nib_iyMlIq^apr2Qt?ZZViRVLU-Xabal&poIQT7sI9Y z2CHUcDsxL(z$Fl#O%#vn?$cciZE(jn!aNq6L4gb<@YDZ)4j0r+DD7wiqudQ-CE_;t6)316-Y@P%O9~Wl6^Aj7;QPLY{gcmhS!Lt`3NF$|5v76zE#?|Hv&!2SKd~ zR%O8XDC`&TMZmF(lKtgbpCyuu;4|b!54L@pT~d!b=?wh@5a&TD@F9QHbTRIsI3Qi6 z{dB@~&Yj2`R9`q#K~PIJ8-E$3?j*Uu)ZLw9aXN2sqIG~XTiW!&i6UYMRq6~+48ieifZ~dP!`cSV-L99Gk0GVunN`mQ z)Ug91g$@busk2l2(ogT=nNZpf@9|TlH*0MxdZfCUyKc?Y2-85{ro z)q3XlMO_QIWX~9|{ChpD+r_;1|CC`#;rk^j_@04|pPk+6(rT znTTgXLy{EbF`^7iEEjajv5D;8lqNDBFkK3;4|GD2*3HmQ@FByeueGT?OIp$43c27G zZU&%64dCmpH>>VqC@@dBH?{cC z%gi=WoVyr#?gpv}ID0@Jji%FVKyA?jr- z9t$siUpOzlc$KSXf~n%ynC=~MFO{*D>ciPt6WnKcSJd^211c)e(DCPzd+W_ZV@JDT zNnmX88~>i~SGsL30zC{e&;9cxf@s<=mMEP39TQBA`pfp!_AO}!Nuqns0amL6zv4^V z;G;G67!JH=?m1Xd9fsr3sfW4wHMt~TbVdt2I-ryZFLz+8?_YaNa7t*_5tCXAXA=l1 zDHzOAc}Vwlxaf=n@bd_q+K0aY<{{{%N0cm$12fijXe>VH!sj;@5h}dTY|N`o&U$hI}nib9ms}BCyT_+IusKa+;M*PE*>wwqTe*jn_ z`i@D-5NR%G$bUfjoXHl7ef-us0m~(+!V`YnV_q!ztRM10(j*c33RjCvGCFGSyUAj< z{MutYmvQm+2TbgqQQ;fZCe>qeb+u@6oOjhN%+EW^V#PlAaR5$K`rR!Rd!>8K ziQ?QSq0FOoL*CWuA3Qfwq!o8EF+Zn0|1m1m&$e~7v+i2k_H@&y`F}S%gw!!v(ww6F8IwgXsTh?+)|+w zoFz>b2gvr#eV=)!-L9tB1M%lC4efy0TtTh*Bpr}G+aVFLAjs}GyJJb&%!xuu)cOs@ zGYX{_60q=Z-6)Nf;)xeOGxF2R_U@lK-z9BDoLE>nSuOGI`nicAG*>#u4UT0VIe-2C E03EJ0TL1t6 literal 0 HcmV?d00001 diff --git a/mlchain/server/templates/home.html b/mlchain/server/templates/home.html index b71b5f5..673765a 100644 --- a/mlchain/server/templates/home.html +++ b/mlchain/server/templates/home.html @@ -1,392 +1,472 @@ - + - - - - - Mlchain | Serve your AI models in minutes - - - - - - - - - - - - - + } + + ; + - - - - - - - - -
- -
- -
-

How to build better AI?

-

Less effort, better model performance!

-

Using MlChain now!

- - - - More detail - -
- -
- -
- -
- -
- - -
- - - - - - - - - - - - -
- - - -
-
-

MLCHAIN

-
-
-
- -
-
-

Save time & efforts in training, deployment and scale

-

Fully support with popular libraries and application integration.

- - - -

-
- season_change -
-
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-

Better management

-

Easy to track and organize your team, work and expense.

- -

-
- -
-
-
- - - - - - - - - - - - - - - - - - - - -
- -

Contribute to MLChain

-
-
-
- -

Build and serve model yourself!

- - - -
- - - -
-
- -
- -
- -
- - -
-

Company

- + + + +
+
+ +
+

How to build better AI?

+

Less effort, better model performance!

+

Using MLChain now!

More detail
+ +
+
+
+
+
+
+
+

MLCHAIN

+
+
-
-

Support

- +
+
+

Save time & efforts in training, deployment and scale

+

Fully support with popular libraries and application integration.

+

+
season_change
-
-

Address

-
    -
  • -

    No.1, Thai Ha Street, Dong Da District, Hanoi, Vietnam

    -
  • -
  • -

    Email: admin@techainer.com

    -
  • -
  • -

    Phone: +84 363 568 384

    -
  • -
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

Better management

+

Easy to track and organize your team, work and expense.

+

+
-
- - - -
- - - - - - - - - - - + + +
+

Contribute to MLChain

+
+
+
+

Build and serve model yourself!

+ +
+
+
+
+
+
+

Company

+ +
+
+

Support

+ +
+
+

Address

+
    +
  • +

    No.1, Thai Ha Street, Dong Da District, Hanoi, Vietnam

    +
  • +
  • +

    Email: admin@techainer.com

    +
  • +
  • +

    Phone: +84 363 568 384

    +
  • +
+
+
+
+
+ + + \ No newline at end of file From 8a6ec59c5860c96a39ab11f92781f93b5ef1e1ae Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Thu, 24 Sep 2020 10:59:25 +0700 Subject: [PATCH 04/31] Trying to strip down mlchain dependencies --- requirements.txt | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/requirements.txt b/requirements.txt index e45df0a..91058ec 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,50 +1,50 @@ -aiofiles>=0.4.0 -anyio>=1.2.1 -async-generator>=1.10 +# aiofiles>=0.4.0 +# anyio>=1.2.1 +# async-generator>=1.10 attrs>=19.3.0 -blinker>=1.4 +# blinker>=1.4 blosc>=1.8.3; sys_platform != 'win32' -chardet>=3.0.4 +# chardet>=3.0.4 Click>=7.1.2 Flask>=1.1.2 Flask-Cors>=3.0.8 gunicorn>=20.0.4 -h11==0.9.0 -h2>=3.1.1<4.0.0 -hpack>=3.0.0,<4 -httptools>=0.0.13 -hyperframe>=5.2.0,<6 -idna>=2.8 -itsdangerous>=1.1.0 +# h11==0.9.0 +# h2>=3.1.1<4.0.0 +# hpack>=3.0.0,<4 +# httptools>=0.0.13 +# hyperframe>=5.2.0,<6 +# idna>=2.8 +# itsdangerous>=1.1.0 Jinja2>=2.10.3 MarkupSafe>=1.1.1 msgpack==1.0.0 -multidict>=4.7.2 +# multidict>=4.7.2 numpy<=1.18.1 opencv-python>=4.1.2.30 -outcome>=1.0.1 +# outcome>=1.0.1 Pillow==6.0.0 -priority>=1.3.0 -python-dotenv>=0.10.3 +# priority>=1.3.0 +# python-dotenv>=0.10.3 Quart<=0.10.0 Quart-CORS<=0.2.0 requests>=2.22.0 -requests-futures>=1.0.0 +# requests-futures>=1.0.0 six>=1.13.0 -sniffio>=1.1.0 -sortedcontainers>=2.1.0 +# sniffio>=1.1.0 +# sortedcontainers>=2.1.0 toml>=0.10.0 trio>=0.13.0 -typing-extensions>=3.7.4.1 +# typing-extensions>=3.7.4.1 urllib3>=1.25.7 uvicorn<=0.11.5 uvloop>=0.14.0; sys_platform != 'win32' -websockets>=8.1 +# websockets>=8.1 Werkzeug>=0.15.0 -wsproto>=0.15.0 +# wsproto>=0.15.0 httpx==0.13.3 hypercorn>=0.5.4 -grpcio==1.27.2 +# grpcio==1.27.2 protobuf>=3.10.0 boto3>=1.9.66 pyyaml From baaf1e7332ee23f384b7738a97fb5eae8550a6e3 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Thu, 24 Sep 2020 12:39:59 +0700 Subject: [PATCH 05/31] Still trying --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 91058ec..8b2c122 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,7 @@ Flask>=1.1.2 Flask-Cors>=3.0.8 gunicorn>=20.0.4 # h11==0.9.0 -# h2>=3.1.1<4.0.0 +h2==3.2.0 # hpack>=3.0.0,<4 # httptools>=0.0.13 # hyperframe>=5.2.0,<6 From e084a293ced521c58c3c75f44e7b7ed6c352db6f Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Thu, 24 Sep 2020 15:12:43 +0700 Subject: [PATCH 06/31] turn grpc on --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 8b2c122..c445e26 100644 --- a/requirements.txt +++ b/requirements.txt @@ -44,7 +44,7 @@ Werkzeug>=0.15.0 # wsproto>=0.15.0 httpx==0.13.3 hypercorn>=0.5.4 -# grpcio==1.27.2 +grpcio==1.27.2 protobuf>=3.10.0 boto3>=1.9.66 pyyaml From 0ac03e52a303b677f36c938aac50c6483c051cd4 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Thu, 24 Sep 2020 15:24:01 +0700 Subject: [PATCH 07/31] Minor travis config fix --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index cd5ed41..6878975 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,7 +44,7 @@ jobs: - stage: build name: "Build on Python 3.7 MacOS" os: osx - language: minimal + language: shell install: - pip3 install -U scikit-build awscli pip - pip3 install -U -r requirements.txt @@ -101,7 +101,7 @@ jobs: - stage: test name: "Test on Python 3.7 MacOS" os: osx - language: minimal + language: shell install: - pip3 install -U scikit-build pytest coverage codecov pip - pip3 install -U attrs @@ -142,4 +142,4 @@ jobs: secure: lEK5DTFYmn2vkeP8OrG8CPgUOH/PvhO76OO5F2/K3HbQxJZLH3Vsmzk/mRsY1pIC52XpGLDSg/8d62V9bu2WNReLRQJZ1zIgKSswvf4USrsd0axGwIbJyuX+vr81/x4j4rQr3ohfb2zOIit7JoDrRugwBICSAEukNfXoOZdN6wVn4zpLsW/bdlrNlIsNmhzUBKfurRMPEqsSE1Bq2dDGmyd4KNiZlaJF4PEgNQHfV9qwW2+j/ky4ulCzFgIfxKUpIfvUPFN3Uw3HdaJAaOH6h+S84hvi30xwD8bT8os990fK0zZ/sW5e0ogRckmkGh3jDJcXzyCPetAABMkUjwTrIkehQ2I2QhT49V0+Qqq3A3iJFAGxufl3HEYNY4ZVxo7PXMBIkmA6TdKomhPLh1nKeQTaFomSvoY/Usnc5pF1Va5vhHUz2mGeUgnbR0kQPN2d3yF6hVvl2TnM4Ml0YK2sQa4og4xYOouBGqJsATTZ7OEdG/Iha1KpQRwkHaWs+FShGs1UL0UZO5+FYVSd6va3i1IPxZLoZzJBPscclKBJbrtfup7cWRO2LEeS1uzS0NEKGTmrZLmOW8m9o0Pt+F61pU8meG3O+n0CxYGrytUSNvCrMA0+ZT9DY0hF9Q08w7AASG+zZVarwhnFDakeNq91Z1GLGxB+mD3vIa5mslZGYMw= on: tags: true - distributions: "sdist bdist_wheel" \ No newline at end of file + distributions: "sdist bdist_wheel" \ No newline at end of file From 157ead2f61c33d21429a563244e28f77de21f78c Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Thu, 24 Sep 2020 17:04:55 +0700 Subject: [PATCH 08/31] Set version 0.1.7 for cli --version --- mlchain/__init__.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mlchain/__init__.py b/mlchain/__init__.py index 33dd70d..1f06a4f 100644 --- a/mlchain/__init__.py +++ b/mlchain/__init__.py @@ -1,5 +1,5 @@ # Parameters of MLchain -__version__ = "0.1.6" +__version__ = "0.1.7" HOST = "https://www.api.mlchain.ml" WEB_HOST = HOST API_ADDRESS = HOST @@ -15,7 +15,6 @@ try: import torch - torch.set_num_thread(1) except Exception as e: pass From 8c6a191099f744ba4e63e533a4f24e53f6ccfb96 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Thu, 24 Sep 2020 17:05:56 +0700 Subject: [PATCH 09/31] Fix yaml loader deprecated --- mlchain/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mlchain/config.py b/mlchain/config.py index 71448a5..1020fd2 100644 --- a/mlchain/config.py +++ b/mlchain/config.py @@ -43,7 +43,7 @@ def from_json(self, path): def from_yaml(self, path): import yaml - self.update(yaml.load(open(path))) + self.update(yaml.load(open(path), Loader=yaml.FullLoader)) def update(self, data): for k, v in data.items(): @@ -139,7 +139,7 @@ def load_json(path): def load_yaml(path): import yaml - return yaml.load(open(path)) + return yaml.load(open(path), Loader=yaml.FullLoader) def load_file(path): From 2da43c29e40d0e1352c6df55f5aa1fcc751cd83e Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Thu, 24 Sep 2020 17:06:10 +0700 Subject: [PATCH 10/31] Remove useless warning --- mlchain/client/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/mlchain/client/__init__.py b/mlchain/client/__init__.py index fc18f1b..6c63689 100644 --- a/mlchain/client/__init__.py +++ b/mlchain/client/__init__.py @@ -7,8 +7,6 @@ class Client(HttpClient, GrpcClient): def __init__(self, api_key=None, api_address=None, serializer='json', timeout=5 * 60, headers=None, type='http', name: str = "", version: str = "", check_status=False): - logger.warn("mlchain.client.Client is deprecated and will be remove in the next version. " - "Please use mlchain.client.HttpModel instead") assert isinstance(type, str), "type model must be a string" self._api_key = api_key self._api_address = api_address From f817ad8d30d034a5899c120ee01aef544683c7d2 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Thu, 24 Sep 2020 17:06:43 +0700 Subject: [PATCH 11/31] Fixed parser worker config bugs --- mlchain/cli/run.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/mlchain/cli/run.py b/mlchain/cli/run.py index 8993589..8e1d0ea 100644 --- a/mlchain/cli/run.py +++ b/mlchain/cli/run.py @@ -131,11 +131,10 @@ def run_command(entry_file, host, port, bind, wrapper, server, workers, config, bind = None bind = mlconfig.get_value(bind, config, 'bind', []) wrapper = mlconfig.get_value(wrapper, config, 'wrapper', None) - workers = mlconfig.get_value(workers, config, 'workers', None) - if workers is None: - workers = 1 - else: - workers = int(workers) + workers = mlconfig.get_value(workers, config['gunicorn'], 'workers', None) + if workers is None and 'hypercorn' in config.keys(): + workers = mlconfig.get_value(workers, config['hypercorn'], 'workers', None) + workers = int(workers) if workers is not None else 1 name = mlconfig.get_value(name, config, 'name', None) cors = mlconfig.get_value(None, config, 'cors', False) From 22c7ec29bd3ff1522de14acc8eb5cbbd2ac6d56e Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Thu, 24 Sep 2020 17:07:02 +0700 Subject: [PATCH 12/31] Add missing dep for fuzzywuzzy --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c445e26..ae2716c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -51,4 +51,5 @@ pyyaml fuzzywuzzy GPUtil tqdm -pyngrok \ No newline at end of file +pyngrok +python-Levenshtein \ No newline at end of file From 2922805a3f56eb5822437bde929523d415cd2f8f Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Thu, 24 Sep 2020 17:15:27 +0700 Subject: [PATCH 13/31] Remove dead file --- LICENSE.txt | 21 --------------------- README.rst | 3 --- 2 files changed, 24 deletions(-) delete mode 100644 LICENSE.txt delete mode 100644 README.rst diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index ec95e9d..0000000 --- a/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Techainer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/README.rst b/README.rst deleted file mode 100644 index 4b4a136..0000000 --- a/README.rst +++ /dev/null @@ -1,3 +0,0 @@ -Mlchain helps AI developers to easily run, deploy and monitor AI models and Workflows without having Devops skills. - -This Mlchain Python library lets you launch models and do many tasks with Mlchain Platform. Please sign up your account on Mlchain before working with it. \ No newline at end of file From 9bc7e24e616925d744cad07e71e9011ec6255d2a Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Thu, 24 Sep 2020 17:15:59 +0700 Subject: [PATCH 14/31] Better long description for PYPI --- MANIFEST.in | 2 +- setup.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index 2ea1b5d..8005087 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,4 @@ -include LICENSE *.rst *.toml *.yml *.yaml +include LICENSE *.rst *.md *.toml *.yml *.yaml include requirements.txt graft .github diff --git a/setup.py b/setup.py index b168fbb..119aaa1 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ project = "mlchain" def readme(): - with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as f: + with open(os.path.join(os.path.dirname(__file__), 'README.md')) as f: return f.read() def parse_requirements(filename): @@ -21,7 +21,8 @@ def parse_requirements(filename): version=__version__, description='MLchain Python Library', long_description=readme(), - url='https://gitlab.com/techainer/ml_platform/mlchain-python', + long_description_content_type='text/markdown', + url='http://github.com/Techainer/mlchain-python', author='Techainer Inc.', author_email='admin@techainer.com', package_data={'mlchain.cli': ['config.yaml'],'mlchain.server':['static/*','templates/*','templates/swaggerui/*']}, From d7aec6fdc19f17f33ef454647c171879740eb1f1 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Thu, 24 Sep 2020 18:14:14 +0700 Subject: [PATCH 15/31] Fixed workers config bug with quart and hypercorn --- mlchain/cli/run.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mlchain/cli/run.py b/mlchain/cli/run.py index 8e1d0ea..8db7b95 100644 --- a/mlchain/cli/run.py +++ b/mlchain/cli/run.py @@ -261,7 +261,7 @@ def load(self): static_url_path=static_url_path, static_folder=static_folder, template_folder=template_folder) - app.run(host, port, bind=bind, cors=cors, workers=workers, + app.run(host, port, bind=bind, cors=cors, gunicorn=False, hypercorn=True, **config.get('hypercorn', {}), model_id=model_id) app = get_model(entry_file) From 5328f5bb23dd9787be19d9ada8725917dbf39da2 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Thu, 24 Sep 2020 18:14:48 +0700 Subject: [PATCH 16/31] Minor --- requirements.txt | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/requirements.txt b/requirements.txt index ae2716c..afd7095 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,47 +1,26 @@ -# aiofiles>=0.4.0 -# anyio>=1.2.1 -# async-generator>=1.10 attrs>=19.3.0 -# blinker>=1.4 blosc>=1.8.3; sys_platform != 'win32' -# chardet>=3.0.4 Click>=7.1.2 Flask>=1.1.2 Flask-Cors>=3.0.8 gunicorn>=20.0.4 -# h11==0.9.0 h2==3.2.0 -# hpack>=3.0.0,<4 -# httptools>=0.0.13 -# hyperframe>=5.2.0,<6 -# idna>=2.8 -# itsdangerous>=1.1.0 Jinja2>=2.10.3 MarkupSafe>=1.1.1 msgpack==1.0.0 -# multidict>=4.7.2 numpy<=1.18.1 opencv-python>=4.1.2.30 -# outcome>=1.0.1 Pillow==6.0.0 -# priority>=1.3.0 -# python-dotenv>=0.10.3 Quart<=0.10.0 Quart-CORS<=0.2.0 requests>=2.22.0 -# requests-futures>=1.0.0 six>=1.13.0 -# sniffio>=1.1.0 -# sortedcontainers>=2.1.0 toml>=0.10.0 trio>=0.13.0 -# typing-extensions>=3.7.4.1 urllib3>=1.25.7 uvicorn<=0.11.5 uvloop>=0.14.0; sys_platform != 'win32' -# websockets>=8.1 Werkzeug>=0.15.0 -# wsproto>=0.15.0 httpx==0.13.3 hypercorn>=0.5.4 grpcio==1.27.2 From 2935345f6eace6fab0275a8f2a3a333294c253d7 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Thu, 24 Sep 2020 18:18:20 +0700 Subject: [PATCH 17/31] Let user set torch thread for multiprocessing on their own --- mlchain/__init__.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/mlchain/__init__.py b/mlchain/__init__.py index 1f06a4f..d100a4e 100644 --- a/mlchain/__init__.py +++ b/mlchain/__init__.py @@ -11,10 +11,4 @@ from .context import mlchain_context from .base.exceptions import * -from .config import mlconfig - -try: - import torch - torch.set_num_thread(1) -except Exception as e: - pass +from .config import mlconfig \ No newline at end of file From 1c84034c31c373a88e64ae03644f585aada96013 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Thu, 24 Sep 2020 20:30:35 +0700 Subject: [PATCH 18/31] Minor CLI fix --- mlchain/cli/main.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mlchain/cli/main.py b/mlchain/cli/main.py index 2d98267..da865fc 100644 --- a/mlchain/cli/main.py +++ b/mlchain/cli/main.py @@ -17,22 +17,21 @@ def get_version(ctx, param, value): if not value or ctx.resilient_parsing: return - message = "Python %(python)s\nMlChain %(mlchain)s\nFlask %(flask)s\nQuart %(quart)s\nGrpc %(grpc)s" + message = "Python %(python)s\nMlChain %(mlchain)s\nFlask %(flask)s\nQuart %(quart)s\n" click.echo( message % { "python": platform.python_version(), "mlchain": __version__, "flask": flask.__version__, - "quart": quart.__version__, - "grpc": grpc.__version__ + "quart": quart.__version__ }, color=ctx.color, ) ctx.exit() -def main(as_module=False): +def main(as_module=False, is_testing=False): version_option = click.Option( ["--version"], help="Show the mlchain version", @@ -46,8 +45,9 @@ def main(as_module=False): cli.add_command(init_command) cli.add_command(artifact_command) cli.add_command(serve_command) + if is_testing: + return cli cli.main(args=sys.argv[1:], prog_name="python -m mlchain" if as_module else None) - if __name__ == "__main__": - main(as_module=True) + cli = main(as_module=True) From 71277712c45d3be503203d437a49d85820ded783 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Thu, 24 Sep 2020 20:30:46 +0700 Subject: [PATCH 19/31] Dont check coverage for tests --- .coveragerc | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .coveragerc diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..c387873 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,3 @@ +[run] +omit = + tests/* \ No newline at end of file From 5188112a899213dd6d491a097841637cc3114a39 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Fri, 25 Sep 2020 12:02:23 +0700 Subject: [PATCH 20/31] Minor --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 27ed906..f6145d0 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,6 @@ mlchain.egg-info .pyc test/* .pytest_cache -**/.DS_Store \ No newline at end of file +**/.DS_Store +htmlcov +.coverage From 72dcd0c0580d0b46d9fc45d60bd72e149fd03c57 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Fri, 25 Sep 2020 12:03:21 +0700 Subject: [PATCH 21/31] Avoid leaving unclose resource --- mlchain/cli/init.py | 3 ++- mlchain/config.py | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/mlchain/cli/init.py b/mlchain/cli/init.py index 9917024..a29c381 100644 --- a/mlchain/cli/init.py +++ b/mlchain/cli/init.py @@ -14,4 +14,5 @@ def init_command(file): logger.warning("File {} exists. Please change name file".format(file)) else: with open(file, 'wb') as fp: - fp.write(open(os.path.join(root_path, 'config.yaml'), 'rb').read()) + with open(os.path.join(root_path, 'config.yaml'), 'rb') as fr: + fp.write(fr.read()) diff --git a/mlchain/config.py b/mlchain/config.py index 1020fd2..954257a 100644 --- a/mlchain/config.py +++ b/mlchain/config.py @@ -134,12 +134,14 @@ def load_config(data): def load_json(path): import json - return json.load(open(path, encoding='utf-8')) + with open(path, encoding='utf-8') as f: + return json.load(f) def load_yaml(path): import yaml - return yaml.load(open(path), Loader=yaml.FullLoader) + with open(path) as f: + return yaml.load(f, Loader=yaml.FullLoader) def load_file(path): From fa2f2a4916cb3c960ff83d4eb51b89e132f00b53 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Fri, 25 Sep 2020 12:03:33 +0700 Subject: [PATCH 22/31] Minor --- mlchain/client/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mlchain/client/__init__.py b/mlchain/client/__init__.py index 6c63689..51ee43e 100644 --- a/mlchain/client/__init__.py +++ b/mlchain/client/__init__.py @@ -26,7 +26,7 @@ def __init__(self, api_key=None, api_address=None, serializer='json', timeout=5 raise Exception("type must be http or grpc") def model(self, name: str = "", version: str = "", check_status=False): - logger.warn( + logger.warning( "function .model is deprecated and will be remove in the next version") if self._type.lower() == 'http': return HttpClient(api_key=self._api_key, api_address=self._api_address, serializer=self._serializer, From 4b2340a6f63c3d7601f3728cb6eab22e62a667aa Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Fri, 25 Sep 2020 12:04:07 +0700 Subject: [PATCH 23/31] PEP8 old test --- tests/test_converter.py | 6 +++++- tests/test_serializer.py | 16 +++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/tests/test_converter.py b/tests/test_converter.py index f9c54e8..ef1afe7 100644 --- a/tests/test_converter.py +++ b/tests/test_converter.py @@ -1,8 +1,11 @@ -from mlchain.base.converter import Converter, get_type +import logging import unittest from typing import * + import numpy as np +from mlchain.base.converter import Converter, get_type +logger = logging.getLogger() def check_type(value, t): t_origin, t_args = get_type(t) @@ -24,6 +27,7 @@ class TestConverter(unittest.TestCase): def __init__(self, *args, **kwargs): self.converter = Converter() unittest.TestCase.__init__(self, *args, **kwargs) + logger.info("Running converter test") def test_list(self): print(get_type(Union[dict, list])) diff --git a/tests/test_serializer.py b/tests/test_serializer.py index e3e4090..e50e7c6 100644 --- a/tests/test_serializer.py +++ b/tests/test_serializer.py @@ -1,7 +1,13 @@ +import logging +import sys import unittest -from mlchain.base.serializer import JsonSerializer,MsgpackSerializer,MsgpackBloscSerializer + import numpy as np -import sys +from mlchain.base.serializer import (JsonSerializer, MsgpackBloscSerializer, + MsgpackSerializer) + +logger = logging.getLogger() + class TestSerializer(unittest.TestCase): def __init__(self,*args,**kwargs): self.serializers = [ @@ -13,6 +19,7 @@ def __init__(self,*args,**kwargs): unittest.TestCase.__init__(self,*args,**kwargs) def test_numpy(self): + logger.info("Running serializer numpy test") for data in [np.ones((2,3)),np.int64(1),np.float64(1)]: for serializer in self.serializers: encoded = serializer.encode(data) @@ -20,6 +27,7 @@ def test_numpy(self): self.assertTrue(np.all(data==decoded),"{0}.encode: value: {1}".format(serializer.__class__.__name__,data)) def test_data(self): + logger.info("Running serializer python data structure test") for data in [{'dict':{'str':'str'}},{'list':[1,2,3,'str',np.float(4)]}]: for serializer in self.serializers: encoded = serializer.encode(data) @@ -27,7 +35,5 @@ def test_data(self): self.assertTrue(data==decoded,"{0}.encode: value: {1}".format(serializer.__class__.__name__,data)) - - if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() From 1c0ab5b639837a5a7b7ae8b3a58b7f980d41ac29 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Fri, 25 Sep 2020 12:07:10 +0700 Subject: [PATCH 24/31] Much more unit test and better code coverage --- .coveragerc | 5 +- .gitignore | 1 + .travis.yml | 4 + tests/__init__.py | 0 tests/dummy_server/mlconfig.yaml | 22 +++++ tests/dummy_server/server.py | 43 ++++++++++ tests/test_cli.py | 64 +++++++++++++++ tests/test_client.py | 74 +++++++++++++++++ tests/test_server.py | 74 +++++++++++++++++ tests/test_workflow.py | 134 +++++++++++++++++++++++++++++++ 10 files changed, 420 insertions(+), 1 deletion(-) create mode 100644 tests/__init__.py create mode 100644 tests/dummy_server/mlconfig.yaml create mode 100644 tests/dummy_server/server.py create mode 100644 tests/test_cli.py create mode 100644 tests/test_client.py create mode 100644 tests/test_server.py create mode 100644 tests/test_workflow.py diff --git a/.coveragerc b/.coveragerc index c387873..e912e97 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,3 +1,6 @@ [run] omit = - tests/* \ No newline at end of file + tests/* + setup.py + mlchain/__main__.py +concurrency = multiprocessing \ No newline at end of file diff --git a/.gitignore b/.gitignore index f6145d0..12db4de 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ test/* **/.DS_Store htmlcov .coverage +.coverage.* \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 6878975..e2d0dfb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -78,6 +78,7 @@ jobs: script: - pip install . - python -m coverage run --source=. -m unittest discover + - python -m coverage combine - python -m coverage report after_success: - codecov @@ -93,6 +94,7 @@ jobs: script: - pip install . - python -m coverage run --source=. -m unittest discover + - python -m coverage combine - python -m coverage report after_success: - codecov @@ -108,6 +110,7 @@ jobs: script: - pip3 install . - python3 -m coverage run --source=. -m unittest discover + - python -m coverage combine - python3 -m coverage report after_success: - codecov @@ -125,6 +128,7 @@ jobs: script: - python -m pip install . - python -m coverage run --source=. -m unittest discover + - python -m coverage combine - python -m coverage report after_success: - codecov diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/dummy_server/mlconfig.yaml b/tests/dummy_server/mlconfig.yaml new file mode 100644 index 0000000..eb360ce --- /dev/null +++ b/tests/dummy_server/mlconfig.yaml @@ -0,0 +1,22 @@ +name: mlchain-server # name of service +version: '0.0.1' +entry_file: server.py # python file contains object ServeModel +host: localhost # host service +port: 12345 # port service +server: flask # option flask or quart or grpc +wrapper: gunicorn +cors: true +gunicorn: # config apm-server if uses gunicorn wrapper + timeout: 60 + keepalive: 60 + max_requests: 0 + threads: 1 + workers: 5 + worker_class: 'gthread' + umask: '0' +hypercorn: + timeout: 200 + keepalive: 60 + threads: 1 + workers: 1 + worker_class: 'uvloop' \ No newline at end of file diff --git a/tests/dummy_server/server.py b/tests/dummy_server/server.py new file mode 100644 index 0000000..a32a17c --- /dev/null +++ b/tests/dummy_server/server.py @@ -0,0 +1,43 @@ +import cv2 +import numpy as np +from mlchain.base import ServeModel +from mlchain.decorators import except_serving + + +class Model(): + """ Just a dummy model """ + def __init__(self): + pass + + + def predict(self, image: np.ndarray): + """ + Resize input to 100 by 100. + Args: + image (numpy.ndarray): An input image. + Returns: + The image (np.ndarray) at 100 by 100. + """ + image = cv2.resize(image, (100, 100)) + return image + + @except_serving + def dummy(self): + pass + + def get_error(self): + raise Exception("This exception is expected") + + +# Define model +model = Model() + +# Serve model +serve_model = ServeModel(model) + +# Deploy model +if __name__ == '__main__': + from mlchain.server import FlaskServer + + # Run flask model with upto 12 threads + FlaskServer(serve_model).run(port=5000, threads=12) diff --git a/tests/test_cli.py b/tests/test_cli.py new file mode 100644 index 0000000..d29740b --- /dev/null +++ b/tests/test_cli.py @@ -0,0 +1,64 @@ +import logging +import unittest +import os + +from click.testing import CliRunner +from mlchain.cli.main import main + +logger = logging.getLogger() + +class TestCLI(unittest.TestCase): + def __init__(self, *args, **kwargs): + unittest.TestCase.__init__(self, *args, **kwargs) + + def test_mlchain_version(self): + cli = main(is_testing=True) + result = CliRunner().invoke(cli, args='--version'.split(), prog_name='python -m mlchain') + logger.info('Output of `mlchain --version`:\n' + str(result.output)) + assert result.exit_code == 0 + + def test_mlchain_init(self): + cli = main(is_testing=True) + runner = CliRunner() + with runner.isolated_filesystem(): + result = runner.invoke(cli, args='init'.split(), prog_name='python -m mlchain') + logger.info('Output of `mlchain init`:\n' + str(result.output)) + assert result.exit_code == 0 + + def test_mlchain_run(self): + cli = main(is_testing=True) + runner = CliRunner() + test_breaking_process(runner, cli, args='run'.split(), new_pwd='tests/dummy_server', prog_name='python -m mlchain') + + +def test_breaking_process(runner, cli, args, new_pwd, prog_name): + from multiprocessing import Queue, Process + from threading import Timer + from time import sleep + from os import kill, getpid + from signal import SIGINT + + q = Queue() + + # Running out app in SubProcess and after a while using signal sending + # SIGINT, results passed back via channel/queue + def background(): + Timer(5, lambda: kill(getpid(), SIGINT)).start() + os.chdir(new_pwd) + result = runner.invoke(cli, args, prog_name=prog_name) + q.put(('exit_code', result.exit_code)) + q.put(('output', result.output)) + + p = Process(target=background) + p.start() + + results = {} + + while p.is_alive(): + sleep(0.5) + else: + while not q.empty(): + key, value = q.get() + results[key] = value + logger.info('Output of `mlchain run`:\n' + results['output']) + assert results['exit_code'] == 0 \ No newline at end of file diff --git a/tests/test_client.py b/tests/test_client.py new file mode 100644 index 0000000..d2777d7 --- /dev/null +++ b/tests/test_client.py @@ -0,0 +1,74 @@ +import logging +import unittest +import time +import os + +from click.testing import CliRunner +from mlchain.cli.main import main +from mlchain.workflows import Background, Task + +logger = logging.getLogger() +cli = main(is_testing=True) +runner = CliRunner() + +def test_breaking_process(runner, cli, args, new_pwd, prog_name, wait_time=10): + from multiprocessing import Queue, Process + from threading import Timer + from time import sleep + from os import kill, getpid + from signal import SIGINT + + q = Queue() + + # Running out app in SubProcess and after a while using signal sending + # SIGINT, results passed back via channel/queue + def background(): + Timer(wait_time, lambda: kill(getpid(), SIGINT)).start() + os.chdir(new_pwd) + result = runner.invoke(cli, args, prog_name=prog_name) + q.put(('exit_code', result.exit_code)) + q.put(('output', result.output)) + + p = Process(target=background) + p.start() + + results = {} + + while p.is_alive(): + sleep(0.5) + else: + while not q.empty(): + key, value = q.get() + results[key] = value + logger.info('Output of `mlchain run`:\n' + results['output']) + assert results['exit_code'] == 0 + + +class TestClient(unittest.TestCase): + def __init__(self, *args, **kwargs): + unittest.TestCase.__init__(self, *args, **kwargs) + + def test_client(self): + import numpy as np + from mlchain.client import Client + task = Task(test_breaking_process, runner, cli, args='run'.split(), new_pwd='tests/dummy_server', prog_name='python -m mlchain') + background = Background(task=task).run() + time.sleep(3) + + # Test normal client + model = Client(api_address='http://localhost:12345').model(check_status=True) + input_image = np.ones((200, 200), dtype=np.uint8) + result_image = model.predict(input_image) + assert result_image.shape == (100, 100) + + # Test client with exception + try: + model.predict('abc') + logger.info('This is supose to fail') + except Exception: + pass + + # Test Swagger UI + import requests + requests.get('http://localhost:12345', timeout=5) + requests.get('http://localhost:12345/swagger/', timeout=5) \ No newline at end of file diff --git a/tests/test_server.py b/tests/test_server.py new file mode 100644 index 0000000..875173c --- /dev/null +++ b/tests/test_server.py @@ -0,0 +1,74 @@ +import logging +import unittest +from threading import Timer +import os + +import cv2 +import numpy as np +from mlchain.base import ServeModel +from mlchain.server.flask_server import FlaskServer +from mlchain.server.grpc_server import GrpcServer +from mlchain.server.quart_server import QuartServer +from mlchain.decorators import except_serving + +logger = logging.getLogger() + +class Model(): + """ Just a dummy model """ + + def predict(self, image: np.ndarray): + """ + Resize input to 100 by 100. + Args: + image (numpy.ndarray): An input image. + Returns: + The image (np.ndarray) at 100 by 100. + """ + image = cv2.resize(image, (100, 100)) + return image + + @except_serving + def dummy(self): + pass + +original_model = Model() + +def test_breaking_process(runner, port, wait_time=10): + from multiprocessing import Process + from threading import Timer + from os import kill, getpid + from signal import SIGINT + + def background(): + Timer(wait_time, lambda: kill(getpid(), SIGINT)).start() + runner.run(port=port, thread=1) + + p = Process(target=background) + p.start() + + +class TestServer(unittest.TestCase): + def __init__(self, *args, **kwargs): + unittest.TestCase.__init__(self, *args, **kwargs) + + def test_flask_server_init(self): + logger.info("Running flask server init test") + model = ServeModel(original_model) + flask_model = FlaskServer(model) + test_breaking_process(flask_model, port=10001) + + def test_quart_server_init(self): + logger.info("Running quart server init test") + model = ServeModel(original_model) + quart_model = QuartServer(model) + # test_breaking_process(quart_model, port=10002) + + def test_grpc_server_init(self): + logger.info("Running grpc server init test") + model = ServeModel(original_model) + grpc_model = GrpcServer(model) + # test_breaking_process(grpc_model, port=10003) + + +if __name__ == "__main__": + unittest.main() \ No newline at end of file diff --git a/tests/test_workflow.py b/tests/test_workflow.py new file mode 100644 index 0000000..6b0ea49 --- /dev/null +++ b/tests/test_workflow.py @@ -0,0 +1,134 @@ +import logging +import re +import unittest +import os +import time + +from mlchain.workflows import Parallel, Task, Background, Pipeline, Step + +logger = logging.getLogger() + +class TestWorkflow(unittest.TestCase): + def __init__(self, *args, **kwargs): + unittest.TestCase.__init__(self, *args, **kwargs) + + def test_mlchain_parallel(self): + input_list = [1, 2, 3, 4, 5] + def dummy_task(i): + time.sleep(0.1) + return i + 1 + + tasks = [Task(dummy_task, i) for i in input_list] + _ = Parallel(tasks, max_threads=0).run() + _ = Parallel(tasks, max_threads=-1).run() + _ = Parallel([]).run() + _ = Parallel([], threading=False).run() + output = Parallel(tasks, max_threads=2).run(progress_bar=True) + logger.info(output) + assert output == [2, 3, 4, 5, 6] + + output = Parallel(tasks, max_threads=2, threading=False).run(progress_bar=True) + logger.info(output) + assert output == [2, 3, 4, 5, 6] + + def test_mlchain_parallel_pass_fail_job(self): + input_list = [1, 2, 3, 4, 5] + def dummy_task(i): + time.sleep(0.1) + if i == 3: + raise Exception('Job failed') + return i + 1 + + tasks = [Task(dummy_task, i) for i in input_list] + output = Parallel(tasks, max_threads=2, pass_fail_job=True, max_retries=2).run(progress_bar=True) + logger.info(output) + assert output == [2, 3, None, 5, 6] + + output = Parallel(tasks, max_threads=2, pass_fail_job=True, threading=False, max_retries=2).run(progress_bar=True) + logger.info(output) + assert output == [2, 3, None, 5, 6] + + try: + output = Parallel(tasks, max_threads=2, threading=False).run(progress_bar=True) + raise AssertionError("This is supose to fail") + except Exception: + pass + + try: + output = Parallel(tasks, max_threads=2).run(progress_bar=True) + raise AssertionError("This is supose to fail") + except Exception: + pass + + def test_mlchain_parallel_in_parallel(self): + input_list = [1, 2, 3, 4, 5] + def dummy_task(i): + def sub_task(j): + return j + 2 + all_sub_task = [Task(sub_task, j) for j in range(i)] + sub_output = Parallel(all_sub_task, max_threads=2).run() + return sum(sub_output) + + tasks = [Task(dummy_task, i) for i in input_list] + output = Parallel(tasks, max_threads=2, threading=False).run(progress_bar=True) + logger.info(output) + assert output == [2, 5, 9, 14, 20] + + def test_mlchain_background(self): + x = [] + def dummy_task(n): + for i in range(n): + x.append(i) + task = Task(dummy_task, 10) + background = Background(task).run() + time.sleep(1) + logger.info(x) + assert x == list(range(10)) + background.stop() + + background = Background(task, interval=0.1).run() + time.sleep(1) + logger.info(x) + assert x == list(range(10))*10 + background.stop() + + def test_mlchain_background_pass_fail_job(self): + x = [] + def dummy_task(): + raise Exception('This exception is expected') + task = Task(dummy_task) + + background = Background(task, interval=0.01).run(pass_fail_job=True) + time.sleep(0.02) + logger.info(x) + background.stop() + + def test_mlchain_async_task(self): + async def dummy_task(n): + return n+1 + task = Task(dummy_task, 5) + + def test_mlchain_pipeline(self): + def step_1(i): + time.sleep(0.001) + logger.info('step_1') + return i+1 + + def step_2(i): + time.sleep(0.001) + logger.info('step_2') + return i*2 + + def step_3(i): + time.sleep(0.001) + logger.info('step_3') + return i-2 + + pipeline = Pipeline( + Step(step_1, max_thread = 2), + Step(step_2, max_thread = 1), + Step(step_3, max_thread = 1) + ) + # inputs = range(4) + # results = pipeline.run(inputs) + # logger.info(results) \ No newline at end of file From 342d69a13d062c0633cf85c3207f6b3136c997d1 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Fri, 25 Sep 2020 12:15:56 +0700 Subject: [PATCH 25/31] exclude other lib from coverage check --- .coveragerc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.coveragerc b/.coveragerc index e912e97..f0da052 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,5 +1,7 @@ [run] omit = + */site-packages/* + */distutils/* tests/* setup.py mlchain/__main__.py From f1e90cd78b054126d32515493d3d1d468e036fc0 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Fri, 25 Sep 2020 12:19:59 +0700 Subject: [PATCH 26/31] macos test tune --- tests/test_workflow.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_workflow.py b/tests/test_workflow.py index 6b0ea49..e0e90d4 100644 --- a/tests/test_workflow.py +++ b/tests/test_workflow.py @@ -89,7 +89,8 @@ def dummy_task(n): background = Background(task, interval=0.1).run() time.sleep(1) logger.info(x) - assert x == list(range(10))*10 + assert x[:10] == list(range(10)) + assert len(x) > 10 background.stop() def test_mlchain_background_pass_fail_job(self): From 48873283c9548f43e1ae1d32521348b011792e77 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Fri, 25 Sep 2020 12:29:20 +0700 Subject: [PATCH 27/31] oh shit --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e2d0dfb..36a4761 100644 --- a/.travis.yml +++ b/.travis.yml @@ -110,7 +110,7 @@ jobs: script: - pip3 install . - python3 -m coverage run --source=. -m unittest discover - - python -m coverage combine + - python3 -m coverage combine - python3 -m coverage report after_success: - codecov From 042d02ae1fe9c60f30afae2e169f5d17957f0abd Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Fri, 25 Sep 2020 12:42:59 +0700 Subject: [PATCH 28/31] Test more serializer --- tests/test_client.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/test_client.py b/tests/test_client.py index d2777d7..97a66c3 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -56,11 +56,19 @@ def test_client(self): time.sleep(3) # Test normal client - model = Client(api_address='http://localhost:12345').model(check_status=True) + model = Client(api_address='http://localhost:12345', serializer='json').model(check_status=True) input_image = np.ones((200, 200), dtype=np.uint8) result_image = model.predict(input_image) assert result_image.shape == (100, 100) + model = Client(api_address='http://localhost:12345', serializer='msgpack').model(check_status=True) + result_image_2 = model.predict(input_image) + assert result_image_2.shape == (100, 100) + + model = Client(api_address='http://localhost:12345', serializer='msgpack_blosc').model(check_status=True) + result_image_3 = model.predict(input_image) + assert result_image_3.shape == (100, 100) + # Test client with exception try: model.predict('abc') From 5d319af376351ba301dc66836ed3bd86853b0401 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Fri, 25 Sep 2020 12:46:12 +0700 Subject: [PATCH 29/31] Auto switch off gunicorn on Windows --- mlchain/cli/run.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mlchain/cli/run.py b/mlchain/cli/run.py index 8db7b95..a8c5c65 100644 --- a/mlchain/cli/run.py +++ b/mlchain/cli/run.py @@ -131,6 +131,9 @@ def run_command(entry_file, host, port, bind, wrapper, server, workers, config, bind = None bind = mlconfig.get_value(bind, config, 'bind', []) wrapper = mlconfig.get_value(wrapper, config, 'wrapper', None) + if wrapper == 'gunicorn' and os.name == 'nt': + logger.warning('Gunicorn warper are not supported on Windows. Switching to None instead.') + wrapper = None workers = mlconfig.get_value(workers, config['gunicorn'], 'workers', None) if workers is None and 'hypercorn' in config.keys(): workers = mlconfig.get_value(workers, config['hypercorn'], 'workers', None) From 24e547c5e508bd19442c8ddeb1492a4102d874d3 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Fri, 25 Sep 2020 12:53:20 +0700 Subject: [PATCH 30/31] Turn off some test for windows --- tests/test_cli.py | 3 +++ tests/test_client.py | 3 +++ tests/test_server.py | 18 ++++++++++++++---- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index d29740b..4a0be3c 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -10,6 +10,7 @@ class TestCLI(unittest.TestCase): def __init__(self, *args, **kwargs): unittest.TestCase.__init__(self, *args, **kwargs) + self.is_windows = os.name == 'nt' def test_mlchain_version(self): cli = main(is_testing=True) @@ -26,6 +27,8 @@ def test_mlchain_init(self): assert result.exit_code == 0 def test_mlchain_run(self): + if self.is_windows: + return 0 cli = main(is_testing=True) runner = CliRunner() test_breaking_process(runner, cli, args='run'.split(), new_pwd='tests/dummy_server', prog_name='python -m mlchain') diff --git a/tests/test_client.py b/tests/test_client.py index 97a66c3..20c29f2 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -47,8 +47,11 @@ def background(): class TestClient(unittest.TestCase): def __init__(self, *args, **kwargs): unittest.TestCase.__init__(self, *args, **kwargs) + self.is_windows = os.name == 'nt' def test_client(self): + if self.is_windows: + return 0 import numpy as np from mlchain.client import Client task = Task(test_breaking_process, runner, cli, args='run'.split(), new_pwd='tests/dummy_server', prog_name='python -m mlchain') diff --git a/tests/test_server.py b/tests/test_server.py index 875173c..4bd2fd6 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -3,7 +3,13 @@ from threading import Timer import os -import cv2 +try: + import cv2 +except Exception: + # Travis Windows will fail here + pass + + import numpy as np from mlchain.base import ServeModel from mlchain.server.flask_server import FlaskServer @@ -50,24 +56,28 @@ def background(): class TestServer(unittest.TestCase): def __init__(self, *args, **kwargs): unittest.TestCase.__init__(self, *args, **kwargs) + self.is_not_windows = os.name != 'nt' def test_flask_server_init(self): logger.info("Running flask server init test") model = ServeModel(original_model) flask_model = FlaskServer(model) - test_breaking_process(flask_model, port=10001) + if self.is_not_windows: + test_breaking_process(flask_model, port=10001) def test_quart_server_init(self): logger.info("Running quart server init test") model = ServeModel(original_model) quart_model = QuartServer(model) - # test_breaking_process(quart_model, port=10002) + # if self.is_not_windows: + # test_breaking_process(quart_model, port=10002) def test_grpc_server_init(self): logger.info("Running grpc server init test") model = ServeModel(original_model) grpc_model = GrpcServer(model) - # test_breaking_process(grpc_model, port=10003) + # if self.is_not_windows: + # test_breaking_process(grpc_model, port=10003) if __name__ == "__main__": From 3941555690281fbeb707a61cd01635e33d2de3f9 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Fri, 25 Sep 2020 13:34:06 +0700 Subject: [PATCH 31/31] Add codecov config to turn off coverage check on patch --- codecov.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 codecov.yml diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000..24f3088 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,9 @@ +coverage: + status: + project: # settings affecting project coverage + default: + target: auto # auto % coverage target + threshold: 5% # allow for 5% reduction of coverage without failing + + # do not run coverage on patch nor changes + patch: false \ No newline at end of file