From cb7891a45868c450cbdd4c85d7325c1702107f9a Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Wed, 14 Mar 2018 17:27:24 +0800 Subject: [PATCH 001/913] Add large model design doc --- doc/fluid/design/dist_train/large_model.md | 40 ++++++++++++++++++ .../src/prefetch_parameters.graffle | Bin 0 -> 10073 bytes .../dist_train/src/prefetch_parameters.png | Bin 0 -> 180176 bytes .../dist_train/src/split_parameter.graffle | Bin 0 -> 7812 bytes .../design/dist_train/src/split_parameter.png | Bin 0 -> 69134 bytes 5 files changed, 40 insertions(+) create mode 100644 doc/fluid/design/dist_train/large_model.md create mode 100644 doc/fluid/design/dist_train/src/prefetch_parameters.graffle create mode 100644 doc/fluid/design/dist_train/src/prefetch_parameters.png create mode 100644 doc/fluid/design/dist_train/src/split_parameter.graffle create mode 100644 doc/fluid/design/dist_train/src/split_parameter.png diff --git a/doc/fluid/design/dist_train/large_model.md b/doc/fluid/design/dist_train/large_model.md new file mode 100644 index 00000000000..f82fa6f81e5 --- /dev/null +++ b/doc/fluid/design/dist_train/large_model.md @@ -0,0 +1,40 @@ +# Design Doc: Large Model + +## Abstract + +We propose an approach to support the large parameter. +For embedding layer, the parameter may very large and could +not be stored in one trainer's memory. In this approach, a Trainer would +prefetch a sliced parameter from different Parameter Server instances +according to the input `Ids`, and then run forward, backward and send +the gradient to Parameter Server to execute the optimize program. + +## Design + +Fluid large model distributed training use +[Distributed Transpiler](./parameter_server.md#distributed-transpiler) to split +a large parameter into multiple parameters which stored on Parameter Server, and +the Trainer would prefetch them by `RPC` interface. + +### Split Large Parameter + + + +**Distributed Transpiler** would split the large parameter +(weight) into some sliced parameters (weight_0, weight_1, weight_2) as the +figure above. + +### Prefetch Parameters from Parameter Servers + + + +- `PrefetchRpc` operator would send the rows index the multiple Parameter Servers, + and then receive the SelctedRows. +- The different with normal Fluid distributed training, we only prefetch the rows + +## TODO + +- Async Update + + To avoid slow-node, Async update is important for distributed training, + we need an design doc and implement it in future. diff --git a/doc/fluid/design/dist_train/src/prefetch_parameters.graffle b/doc/fluid/design/dist_train/src/prefetch_parameters.graffle new file mode 100644 index 0000000000000000000000000000000000000000..067178972219e99add6db5a82db0f104d3517862 GIT binary patch literal 10073 zcmaLdRZtw<@*r^BEfCyo2u^SvEI5O^ySvK(!6CQ@CundD&fxCu?(Qzx@7CS_*4Ea& z+tppw=e(SkemTEt@+c&ze+4Ymxu11fxn$zQ;X`$Eb!U6j8KX#E(cn7AFa)WOO5|wG z^`HhBD-%vy`egU-2TXpMntItyhk?bK5bY{$Djj?9SOgsvN9|2XfN;@pNr7Rqa?bm? z?-R$}JDsqrE9*#5r(ZSeF?q@6-`CB~*W-W$R1@prxe|TslzBSs!9$Yk<5%)<@tRfI z4<~7sVa1!Q+0@(&_AqhTmyg*;WA*b7ev$?E_hkp=+;u_wz z>Klk-Sxf4NeD*;Ze#`tn4~#0-27LJH>hGs`p8;7jsEccOGW&AhIL|0~th`VHB#G7Im(4iSHz@pxfXQptB6~6hoR~F{ z*q!aF-qq)ZRaTQ#XNXF^^?c{CP*C}j*&Yh~w7(DfzJ477d1*vCjdI>V<>o`deMjtq z$)9=SDw1P7RJl?CWuT5r&7voo(t<*HuTH2108nb4OCzF|KW8J0`y8L{d?0VX7m$Q~ z&l9Gz4Hu%FYflb_Z0>tTH71Bl-NTpN2-aoGPrav(tJ-9mxpnP(6lnd>!%sD;+VJKz z(-Gyt%%n6a=gw>}sJb_xk}1TQv_~UNo{C zMNfHZH)1r5Rv**2uZs|t&wH)=YDk^qSS%!uyEC})z0Q5VlcT5qLv=;A7$r!cIuhJe=`7wf3^*zd$PdSWx7$fSj%jOJ2j zt9y2xzY>YPFKbVqg8Cn1&tE1*r@FYO4Q~Q@UZACPNMA=sv!h`$a>$4@Q;r8d0O*8U z&Af;rF7;cYv5;DAJsLFBqioD(VzfXU+xt0yi1%b1T+8c7;rh#3ud%@)0kQ|jKcnDC zK#Bz&4_yT%2@Rz9M!{K(Aν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 Lz57)N1@*rGWhS<+ literal 0 HcmV?d00001 diff --git a/doc/fluid/design/dist_train/src/prefetch_parameters.png b/doc/fluid/design/dist_train/src/prefetch_parameters.png new file mode 100644 index 0000000000000000000000000000000000000000..ee54c35272898e0487c1193a85b204774811874b GIT binary patch literal 180176 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�AbxHKZxMCo&&Ojg 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 Y@u9GY^6=g-i}2r`T^cH>J50R(7s7Yq&;S4c literal 0 HcmV?d00001 diff --git a/doc/fluid/design/dist_train/src/split_parameter.graffle b/doc/fluid/design/dist_train/src/split_parameter.graffle new file mode 100644 index 0000000000000000000000000000000000000000..6e2f13727d082dea7d3deaf99a43189dfaf29f3a GIT binary patch literal 7812 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 W^`*A*;iCELkN+QyFaDe9fdBw2K%Nr- literal 0 HcmV?d00001 diff --git a/doc/fluid/design/dist_train/src/split_parameter.png b/doc/fluid/design/dist_train/src/split_parameter.png new file mode 100644 index 0000000000000000000000000000000000000000..1776fb8c4eb0f86aed1cdd67f54d8a08a4e479ce GIT binary patch literal 69134 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%0Au}eVk~{6{Key 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 Date: Wed, 14 Mar 2018 17:30:05 +0800 Subject: [PATCH 002/913] update png --- .../src/prefetch_parameters.graffle | Bin 10073 -> 10058 bytes .../dist_train/src/prefetch_parameters.png | Bin 180176 -> 167376 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/fluid/design/dist_train/src/prefetch_parameters.graffle b/doc/fluid/design/dist_train/src/prefetch_parameters.graffle index 067178972219e99add6db5a82db0f104d3517862..c1a59b901745d81add42328b9995408d32d8127b 100644 GIT binary patch literal 10058 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ν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 Lz57)N1@*rGWhS<+ diff --git a/doc/fluid/design/dist_train/src/prefetch_parameters.png b/doc/fluid/design/dist_train/src/prefetch_parameters.png index ee54c35272898e0487c1193a85b204774811874b..433ea3d612b51f325c8f87a58bb35216667910d0 100644 GIT binary patch literal 167376 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 h^E{{WRP9UTAw literal 180176 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�AbxHKZxMCo&&Ojg zq|SjjX6xEgKQo9qr>rlRjrMpPjVqm>JDPA%stCUL+n-s~t(!L-pELiO=8OEW^YgHt zKlply$s^OXqxvH{tE~b@jgGX3NR2c(ZshFLqIT6Ii@ohD-d3kHAo6rK&6)6k58s>wbUOq>=;d zwy8p2_O4c(#uUggt#CwLeCU28u-&m$!qLDI+wqyj`C(yNoBdwn)ZY^Ec6m}%Q4RZ? z9Vm+@2}rL9@Ifj0I;S)oelEbL2Ckz2RsxjB+^}gyqpicSW5+-#I*qIwt$4b|-DK~V z0{iZnT!}uJoV}W3@j^t}O1Px&XtrxI6Tx^G5~M(=c5l!Rg>S^ffUU7)DvBWi9KGw- zts^{X2n8FewruE#I;hu*YE{or6a0Cinb8J9$EhBl8ATs=dA9O=9 z(>>++3?R?1^y!HuKf>u138a9ukL*1Oj>E|%ipW?NtxC2C|GTtZwE$Qg*uGMZ=w(sgBUeAzg(Z-xEV{`E5aeR35nOfwJy0RNH!ma- z!R8qS)OhB(slxn~>*>i26=UOY!d8LVSV9vRB`-4`;UQW9rY)Fx?lPo&+|(I5nI*q6 zPoD=1=Ip|!$TH+cX$O^4=;OuhZpCRMvn0uqS0tG9o&NABW_3F)kE==Nt*sK&{hPJ` zhXv$s=_9Q5aJ->-`sCNAe}?1yzBXhsPk~2$#E_Ql*4y~ze39GZNCx^hg$}NFG+Ogu z8g+xa97Db@nU@hR@mVO%cDF-Ag8{;(yp~&>7Hpale`+tAmi(B(kONA+(sM{edITAn z5HWrIRm_K1n8xza#>a<_>H;G%&>33!+Esug-hAV&jL7=X(BkUi&Mvv2rA8&jkgiAJ z5TApMd9z6&r^>;_Fn~_f0ZHZYk6aBKJjn_SLSL(huH;gXU=pcShMnzaigZA1lw9<^ zr)@*jkNFRwJ%^->AwrU2dQG&&+%(*?a6!61;humgfbqlTcL^91!rJQXrlx#!je6}s z>_Mn+%sd@%MIUd9UUy58sc*oomSPVjK0ZE;kl2F@Z^UAp7|xz5?8J8|&TQsG-KrS2 z-L4D(U2P|u|5!5v?JuY393}Pq=E6kKAHLaWgW|msb1^^K)&+0*vPG0j$_u41#P| zzcSk^qEN4R4W$zDyYc}Ku*kvh7Sz|v6^CG-pJnaZ=`ztY1!w`-gA|j2As#&XbfH1p zBB}_218MJnY1!5J`r-;EW)kfXtM_g=klcgcY#Yl3e=dswHvMfm~LY zDHXdHjjS~IzaMb)f42}tr*no(vcz6=j-2}<2NPv!&~;>GWqq&)uKZ6>u@AQ_9=y7U zw3!-;xzpBrt1!z2Oz^yTHQdViFXqWZcL|mNbq+OhLl=!|W=%sVp37eY%LtJ;-BlTp zwj7YK?4H|v;8r`7_=Ho|w?~t}dO^Eo42p!hVl>Dr;oJsp{`Mxl`~~fF6kZhI*UUHL zXPu;PMiMsAO76eL!RV~LK?Livz@CJ-aP_LSw)WH{gLb6zV5`YPXw8NW`8Uk+L6>uT zkbkW_b$1 ziW>;$6wCQ6fRDA2=qU{BiR=#3Fc)2(GXCbyrcitSB2{f-l83>As7iAqRmX)J#}f9o z7zj6gR}4q2k>%|xbCGH&+tV(zJLn@6=^{ON*{1F47?xaE3HYY? ztMk}rIv`*XPO;%AF3)kCeYcG&MNo6s_nr^zwZtj%Uub`_k%fzsGX$8sn@irYkh$5J zB}pV=^cJYEI0|bM1!@V{g@*Zw3oR#p;T#Dq^aP{A33!Pg5(Y~iYb*^0^#zPFSPS!S zSi2JG>2!^b%PaworJDr3Bos5P=saz{M(~%+tB<2&MDcqzzWf>o1%~bxs>2ZK_npBZ zj3XcTknWS_;L!Oi32*S?D#3@<>{>hfR;{dX9=kZEDJgp(GdmLSJld&ax}BNeeBNS! z+ByyS2Qf5!A22|78tH|;)Z5QkBz%OYGMa2~1JL-4beNFuJ8_&#e6Ba|F%b`J z4PG_<>CRaLJ~A)E!+pVam}39|w)DjrygIwA%!M&4UV|-W)E&Fq0fbpK=MLkibx-U( zpc~ddb}=`PJ!O7ofqThEh!d&Z7d6k0CFFfI``p2Khj4U1BRn`aAIa`V_ItdU7p!E@ zspc?mE1CkEqvqkB=)E|h5*77ODLiO+5Z%VA$BU&$2(Q4Z#FAoC0k;&D z)LnSEkmdL`Q9GC_+VB@J zDZY{UOcv)_!C0(R&`+NO6eON(Vn(hAa9y!zEaLxr0akT9W~Oo%dwf!2jVkSU8r58P zV=gV_J%((OFInl_Yzi|}L?%Yb=oT0qmEP~adfV=rNN{h4r^C#vFPC7kCT{};UZT|R zvcWrN2mpfQSML60A^A+1i(cr#_l{_u6;0LKKN0<}m0p)FUw&E5eOgM3>hdWln^G#( zDzz5+K)tw#o#RaInqz+qZ_)&12FWJq*zcRip>UD3s3m~9;BddMt<~ zXn#i(bMrG+-pQN0o-XiN2HblyXk#wUF#7k4&&;unK_l1)6$9doS*UIcKm2Oj+>JTukQyH)HZMBnTRzQu~dAHi;mz>&nvF3Pu)R zL;eRvcXj?Q6vaVOBFL+C>1pRL5Cl^ye&jNdYo#v|4LH(4f~6g@B#X7<203YIplI8Z zy0zEV`^Z8)YB`MCL&#?Nue`6XK`u$?;TG#(j{2)B{fmSC+BpC0gHF#QBl93m>0{3> zfpr)Xr4b^L0CHK=)HqncQalRJca|uZSm`Fe4rUiLZ^<7;4+1lHd2JUyH0pSQSmidv zL|E_8Nl@+g#+Chm^iyiFo&eY98js$DILyc4F=z9UUPLp(*cP*wW9k_;*gK|Tq(2BE z4op!ryo@{NnW7NKX*xLAoKlQ(MWOM9GD11-#7uGS<3Pc9Jd_~ag`}Pao#D~L%2e&OB ztxq!t*z9z}ya6nptj=NVqygy@yV>YSs2CFQVGsvK3anp+g29Og{uOPPTNlYJL#5)W zV6P#Mofs*7S95B9NCn21E}$-P8!FyLQw5({$AU!^b9(dLI@(DtADdk2Ca?~hhV^IM ze|6jtgB=-bN`1T!nZ#iJk_=rYEHM?p3aeRqa&>QO;UwOb*g>0O_mmXbTK*uRyMc2g zWP6L=d?Qz!7a(IPH}wxf*4We|E+HW?cxLC@x#u~a>p6W{26WwlV^D)1PD(<4-h+|Z zv4@G-knDDzo(Jd^(6dC34C3IQNMDovXlQ9MgM3GEWmgPK(*4D4Y~2lM5k2>^Zw*zf zeJ{G;dJD!}elH)xnl3RWzdz5C6K1X;GAc&)6R%7?3n#V18zUH22}`x?El33P&6 za!L+UcN``Ur+|025`{8>rr(Erv=xLP@F%A+v-|~p$4~FS&Z`m+n#QCOj|gtXKcN?) zEYqhQoK8--CzzR3EX}leid7yI)lHzaOvyjKs^6ef(QXIwkIJELck^|I{|j`a&60xsFbWF?(W7kaG7tmg9Yv5P!nw6nrdx*YjaQC5f5?GgCJ3>Xv-@YfG?PGX!JxpUr`DX_*NR0;AA^bOWgEd9lB{tDMxVJn$EktP z5+TF-+!Fepb787WjwCFOGX>wx#em~Nnph4vZlG!_M7rIy_(P^0P6_C%`UqE`z{y>Y z^Tn;g-m;7zprAnj?Q9N819hQVtPS9#N4~%p#~UP%wK8WTAvQyN$taVZJDmTkGmuv* zqh#?Je)(rkrwM})-xkDjEIK)j_Uk*=U4q!uJnjPm04?nbf9CQwzec|aus%Cq`PRHz z11I4Dc?5s7IwYSJBMf@ZpV-6~647s`$Pl=j5_U@m(5zzKf8J zTO?4Nq8$}pij#J?qhWx0KLo>`fucJ7{B}}xrS;)oy-;QVhC?sW0YudW3-Wh;{1iYX zX4gl9MfEnvJ$4<{rix*I-^z{_YQ4P@B210Y$h0#SLS~UlWg#*Kz}%dkq^7q91)!*2Aytxo01Eu}kzDo-z zC>X9`79u@d^b{5>fwtR^EA4+IoU$(dXo1w5*!2^df6e8(*^WKM`fGXB?8BjuIb@(O zT)BFqemeQ5MXFIDr?4vY#M#Q=f<3*6=X!hU<_4YXInMxrg~TkL06R8Et5oGlmKGB` z<|Tqdg$9=iW8byyf%8joEb#F_6p#N(rg$T1kRlbIe7mw@dmp>w=Zrk`N*`kGVO%Qk zZr~{F+o}#AhDnHWpWe?<$bS}9$ADV$uEnT|bX30JJi4CwxvHuP9M+I5UIylefC%1O zu+4w)#HMPu#MQYDcvtbv-OTCbRX2J8>TNl;_;U`3>OP_z{F&7s`vj~a4{*n+2bDp5 zthij0HHyHZx0p;}C`5DJWduT0%*k(7#IR@})*P*S$n|?E|C?+@Kq1lo*#C;(927WY zL%~uFwi=&s*k+x=m>Hvty_E8rvJ4Q@)YmIA*Y^?Aip{D$y_X89*+cjBT4dT7Y2O=> zL-8ixl!L^KjY8QA63Q2LZ?F(tjRDtxRodV(mjRb}(3#s@#PK1#!Y{aCJE|*>`+h_G zaFoGnE$bYLZdXPIG$QAEDSu3?YJ!PMZkh|Z2KsP zEB`_JBE;GA*&#z2gJ^PDL{!qKd85PJtrFnRgsZVw18(zQ{?I?x_sSAOe3a2DlRwW94$mI zMZTtd``%rIBeOcrv3;aYq=7=Td*Bla`y z-izu@<_n+rSuvJGI*Jy1LE4MMb1%x09!xgxRuX00uvzqw$P9e&PR}gv+vFbbPw7PB zMg5`%o(p^S{}5HaX{x~&XSip=CKMdWSJS&Q|9ZYK8KS$i&=+D3^I&(^7WMrnl`?oKZJXI`Avk=&y5K1iS0y^rCCwYBltu^O=|M$fbSi^ZNusi{{f zIeq{73lOfL{p+63`)B$s95`zf_g(qx z#GAJ&|G#?`a=h=WXPWaaa!84SXaWIr5rQu6>u7Onjp@9V%#wbYe3m#zS-zjXv0R*P z-j9CmF+uV{%;kzxattY&e{`a`yu;X~Ck7mfljZlSjXIA@%v%TJS4$B4>JEPI;Zcme zJMRa)Ci0XjOmf7gZaibi^p}yaqW$poa9wl1Jzv(Fp{`SAi zUw}RQ_w9LKEr6^SF10^z>8XkwLE-oV*8h2DIpK6SX%KvyJMWeM+E+trIG9!U5sJ!r z_jvyAm!y)OBB}q06KV8x!}3|$&HwbvXE(4AGkC#sgHOW~wOi}Y^xFPq>9F8Wt%O;U zWhhI`wp+{YSTZj_5+?=iOaNQ0>x7+B&zkvH*r@MW$YAyB?CSqYN%ZpqF*AyfPbI>= zN-uu_$R@>3m(`QIYUR9_m|my(z1rVnB*C{`0DtLMMrpC|S^7Kfwe9V+)W`0LyA{@Hj4@3Wt0TLNu;kH>Pu@>du*Tg1}U+W?oa~{KjL}}(%4gLVk(ljGQy{X}J?kUT?1GOnf z8g%4A-9Z(1I&jMSQ5fhAgwQO&3E3>nJh<_zPr^XD?S-eIeciins!FrBhcht$pFQ#b z1c(toNz=})8j!x>Z9XS*D{fTWN_V2DeyEv9tqXjKZ!~ff@MD~?NcV5BsMdDL_?_( zc=gfI(&tWVx4XtW5y0rA6B}QF%V^@)%xII3pez}Vs%kfe%e+;6DkVMeTDI)x;nAm= z_EQs%(!@Qd`S_&n9oEP3HXfRfFy&f}KexgRq&u^Jjum`#R5gl`IpVI@i8IrCV%m0A zezg6*rtiG`gtS+vlSHb}mz^gcw4It-QMtdeF2ebYs)zTP!R}AF5~@8#U#cxiD}3T6 z3-pT}W0lS{4L?yzOo%hf>UU@_9uPAB0&;(_jQeP_>Xhx1sviAQEeiXS9`)whs7`r* zadJ>iy0D!2iR5ORtQ8qo|EfEUIOyu%9u_c&tXl*lEeFTNg#q_uY>(@m;>In89)@c# zm%pNoY7zrv*Ia}=svu(RnCbx3wXMSjrKXjW(RGVjEd&8E`njFOPw%Yt+ndDDoZ0y^ zcVx^B{8aAAcIRX#cq0Cz-_hIXCeL~I>Ol9vBw^B=e}nkaBr5<6lE$3qoN;Y{ck%<> zo2Ico^LzbUeMes$-VPq+e)(|uq%at$=Jp&g?=HT(IWIAGx_c9zZ~&UydeXQ3uTE7T z`2`5^hMT<04J9DVMKyk{9S3gnd1H}2N*{;+NHdzb%nQ`TU-;9wE=XlaGbF2l@dd4r1G3Ys>B?|J^ucYoYi Y@u9GY^6=g-i}2r`T^cH>J50R(7s7Yq&;S4c -- GitLab From b382747396e11bae1b38f7624550e98e7d58d39a Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Wed, 14 Mar 2018 17:42:46 +0800 Subject: [PATCH 003/913] add note message --- doc/fluid/design/dist_train/large_model.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/fluid/design/dist_train/large_model.md b/doc/fluid/design/dist_train/large_model.md index f82fa6f81e5..96895821307 100644 --- a/doc/fluid/design/dist_train/large_model.md +++ b/doc/fluid/design/dist_train/large_model.md @@ -11,6 +11,10 @@ the gradient to Parameter Server to execute the optimize program. ## Design +**NOTE**: this approach is a feature of Fluid distributed trianing, maybe you want +to know [Distributed Architecture](./distributed_architecture.md) and +[Parameter Server](./parameter_server.md) before reading the following content. + Fluid large model distributed training use [Distributed Transpiler](./parameter_server.md#distributed-transpiler) to split a large parameter into multiple parameters which stored on Parameter Server, and -- GitLab From f839e91b04105565789fc5fb28b5934c2c79de89 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Wed, 14 Mar 2018 23:54:38 +0800 Subject: [PATCH 004/913] update by comment --- doc/fluid/design/dist_train/large_model.md | 52 ++++++++++-------- .../src/prefetch_parameters.graffle | Bin 10058 -> 7340 bytes .../dist_train/src/split_parameter.graffle | Bin 7812 -> 7054 bytes .../design/dist_train/src/split_parameter.png | Bin 69134 -> 78741 bytes 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/doc/fluid/design/dist_train/large_model.md b/doc/fluid/design/dist_train/large_model.md index 96895821307..92daa2b52ea 100644 --- a/doc/fluid/design/dist_train/large_model.md +++ b/doc/fluid/design/dist_train/large_model.md @@ -1,44 +1,48 @@ -# Design Doc: Large Model +# Design Doc: Prefecting Parameter From Parameter Server ## Abstract -We propose an approach to support the large parameter. -For embedding layer, the parameter may very large and could -not be stored in one trainer's memory. In this approach, a Trainer would -prefetch a sliced parameter from different Parameter Server instances -according to the input `Ids`, and then run forward, backward and send -the gradient to Parameter Server to execute the optimize program. +We propose an approach to prefetch parameter from Parameter +Server while distributed training so that Fluid would training +a model including the large parameter which could not be stored in one +trainer's memory. + +## Background + +For an embedding layer, the trainable parameter may be very large and could +not be stored in one trainer's memory. In Fluid distributed training, +[Distributed Transpiler](./parameter_server.md#distributed-transpiler) would split every parameter into a number of small +parameters and stored in Parameter Server, so we could prefetch the parameter +from the specified Parameter Server according to the input `Ids`. ## Design -**NOTE**: this approach is a feature of Fluid distributed trianing, maybe you want +This is a feature of Fluid distributed training, maybe you want to know [Distributed Architecture](./distributed_architecture.md) and [Parameter Server](./parameter_server.md) before reading the following content. -Fluid large model distributed training use -[Distributed Transpiler](./parameter_server.md#distributed-transpiler) to split -a large parameter into multiple parameters which stored on Parameter Server, and -the Trainer would prefetch them by `RPC` interface. - -### Split Large Parameter +### Partationed Parameter -**Distributed Transpiler** would split the large parameter -(weight) into some sliced parameters (weight_0, weight_1, weight_2) as the +- **Distributed Transpiler** would split the large parameter +(weight) into some partitioned parameters (weight_0, weight_1, weight_2) as the figure above. +- We could use `round-robin` to distribute the partitioned parameter. -### Prefetch Parameters from Parameter Servers +### Prefetching Parameter -- `PrefetchRpc` operator would send the rows index the multiple Parameter Servers, - and then receive the SelctedRows. -- The different with normal Fluid distributed training, we only prefetch the rows +- `prefetch_rpc` operator would prefetch the parameter from different Parameter + Server according with the input `Ids`, we use [SelectedRows](../../../design/selected_rows.md) + as the received variable type. +- `merge_selected_rows` operator would merge the received parameters into one + `SelectedRows` variable. ## TODO -- Async Update - - To avoid slow-node, Async update is important for distributed training, - we need an design doc and implement it in future. +- `prefetch_rpc` operator to send rows index and receive SelectedRows variables. +- `lookup_table` need to support `SelectedRows` variable type as input `Weight`. +- Async Update, To avoid slow-node, Async update is important for distributed training, + we need a design doc and implement it in future. diff --git a/doc/fluid/design/dist_train/src/prefetch_parameters.graffle b/doc/fluid/design/dist_train/src/prefetch_parameters.graffle index c1a59b901745d81add42328b9995408d32d8127b..abbb7089829709cb5fdc337b7f9521a34f7d131a 100644 GIT binary patch literal 7340 zcmV;d98=>TiwFP!000030PTHgm!e3w?&q#wk+;9xdu~>zfZ*_+>OLo!6bBR;99FLN zE+zp*P(V?8^?$#?V5S3_R&~{TyWgW#D@A#B#Eyu)ckGBD^ZD{$+lBkIF@w$FqL@S(eyeYCr$iZ=b&WFSdRz@qn>{LrBnjTrE8W- zv_wDkJDeyz!7@rEhX48LXFH0P|0tE>IDSzR)Qj#f5@1;B2maCwqFo0T_6rnvF(Tt< zSWQ;?i8}CG!_lMPKK=A%Zti|ds&jNTg7=jS_NA134{xhMpe7eTeF>ug>i-+8?!{kt zjurUp4 z`$PV^$fM9wG=;uJGYG4gm3WuL87cUgDs$uQBzPF0d8s69#K((jx&lR04K zSs9ZCx}GFgY5U0-ex6SbdWOk&6lZvfn_`fp460!)T-Qi0>uJ4nt*Jz6a#^wt?US{k zV(Sn?g0$Yb(NJb;QUjgV+tuBHC?xmkq)ewW-!X?qXeOj`0q%>&%#M8TZQ<3&+Pfe4tbNlm*z0sg-Em zA?vDKp(brI$&2jLB9%pw6mF%S+|1lzFSXbo?&MJbgiX zJhsIS+e+2SjXLgv#UDzVE6``)KzEIYQ zUP|J>n7f|rpdVqxTpbP4@zXHeQiu3QK5%6mNG#DY|5{r1alo>*HFVWJ3+=B8g8@l) zI{@&yXC36&Bbz0=lrjc#>I3?ez)*KQdhZh;-14J#KYjD~^vTYc*#b!- zdkh=}={b=j1%zz^IUpsU6$NEX4t3UuhYfNvW|!6wC3Trag^^26#|_dN4@pOFByxNV zJIS3lRBKWt{kY)?>V^#ANDA7F+{jHb)+gjHZ1x4CPhw2d0A?yj67yyN%o17WnuIXL zDG+ka*xFIdm>XL5n&LRlwVV~z!8yd5c~n1aC2|ayyOiX&q}ZKPqj_r(|s_?n*2dlNvE z5;=Mq_9Ck)(rdg=2{o5SnEuGBS7>6~593mwevSod02U0>6~+VdnQ4VWBDWsUBc?A8 zm@WJ#*9O`E4xZ`{c7vwRSi0DM4N2Sn6NA2+ip7U%&sd5TNqjJuCyfkEb}bO zq%C+XGnZ9c?67S_-rG{l4mgD;l_5K_ltgZ^9oAVB457U(*!g^@k!qg}xFKq56?Th^ zgn{9*_vy>i%}$ZT4lOX`{{N2pEe&nQoe~$=XC( zUvuG`E?IeQuIE!`TYGL|^QlWdmzvMM#fl`!HDYT)(G1rIc9UW`ZX~CE>x<1EHw~TE zuBC83=LEZs!NvZpNAU}e5N5H{k6UDIE{TI$s~yfUM^5dmC0VXY4M#0qck8>c*Mbq= z-l^r*+VUEd(Q1`_Z?&81ZGiawoxN?hIX{s@sd=L#9?mcTj&b7fa1f z36FV+47+V1PUNsXBX(tfYt0&!?v&fLXRTRx8SYTJ%Xg9Se!B1B-4cVe_XC%2;Rr^{ zQtG!dg4+8L#ZM88-%ob@3dbsvKIbt|_UP%TM+&%1JKbK_B1p-ldZQYV$Zcqk=*`9z zgI?`=>sqxVMM1CPS1WYv^&4_+N$+QUk*kj-%n3!S~Aw@Z=^dtWl;RE978-HW%`Y6{l>cDQ|gcg!Wcx z9#Wdff-CkFK2qAOf+~7zNTU;7S-HbHYA_1X8sV(988*@J4xOvRp_{HB)~w%zm+I0D z&>^B|uCj4Qw4&SYemD{h!(_{?k-aoEwo)I(_32o7PV=5IP%H(bR^$HGmav91o+^$w zZ0q9c$8pZ0)I~dZ=K#O`5+5b~J8agl4zaDpqB*EwM2hrGZXGvF*{8E-kn2s2S_? zXt(sbq>iGgp6jLnoti}UP1!fb3W`I`jAev9H;tiD<#A?Yug&h3XnTv6X&RM*w@ULf zGagjOt+cxMA{_^3T4_(XpzZ9bj_Yq~vqrDG z^O5ar;_xM$Sj@sopZA~5IZy>{Ne}1Jb82U+7B`rCD-kDneqL2&t|hkJzNn0dQ43n% z&?EG=TON+^mfc-+oJp&-NaOrsx>MCwpe&HK77(%SaSOdppmWb?n?kFy_O{s6Axag$ zv9Pc<+w?UxjT5a^d+5jN%vkjoOIDq4D>A-R7mLP9?JPH#r>&;eif#Mb_Po4O7prD_ z)lc<|+kv5OmI1p9kv7T%nzQbx6+76f8>b3D*c`@{fVDzH-HFu>74DsM{DMGmqt*^( zs>60fH`1_eW-ZQO2H2X8W1+@Kt}Fw(nV=R+LiUJ(s67 zva}nQM6bTy5S>!AFKN?Knsa<9y=~W|dpY4!)y<>LoP39##sdcuw6qxDW7Oh5aH67}~5VZCSQvLO1tGnmFhb3&#{d_UD~v-uNS5lo$tXp zUSwKk@EeMMDIKm4a%;yh!;Y`dP2;>CzIRbeidLM^(cBBQ#*BE5=N77EQvMp&8C+^} zp-ji|=GRKURHmz1o*8`&K7?wBwh4t!cL+;w5Z`d7`9|hPgI)gz2LGeQgPj#*e$8li z{f(InUQ_i9*Sxz`ydRnO_dzdkEXTVW-iO0SLc5)ZcVOX%i1ViY8}zW}n&~N$eiZqO zt{OlM-u(4_i}tPPsq3rJv0J{~!I4vMec#^AYH0d_v-dsKg?c+)I*PX{(tRT_`hto` z5bcd-%N-9<#2k_CglqZ$7f68<85`I=86i+@2(x92f}f3^j81H=ski{%rx-$#u-0la zL9v&_rLamB!D=<6R{8u?tz&R!=>s{QNe*Igk_5(V z9YzHLC~-vsnkCfmte0+AM5_8cIm_~lbPjg(3T-c$7*lA<) zL5p^-d5nH12ZP2R{B23=X>E=xaW*hEr<;s^*dhrIQop9;G zMVqd=17F>#>OMyaD$8}E?I)+?x|LgvLs`9lM_Csp92xQ;4mdmlYu&E23&Jpi6 z{~AP7^i_r7Ed8M`EfgcLSKZfrHMvDp(CkCF*5GFhK|cNdI)&B~Y3}P3d7Um`Gzq-d zscx$Gs3BX^668mQCP;FUiB&RBn7JDnZX|) z8uJjkY>}6pkHpEO@-=}4uP4D7g|h*SEoc>g1eb3KF8Cw3Jc7$#CAjp}04}-Vs`*JY zgJgaBFA6ijgV{_Nu4vMMf$>%>`E!2WG~JCEIl6jbYpKJYq_A(v zA&MO(heh4jgiFxd3Z2G{_rOuP2pso@9HKDf^nLi{X}=z&oJS5&M$s2&@}Hl|mFi2C z_~W8K-ht&bf5(YSGdeE%5%G#^No)fI!I?U5HLBw5)}mgL{Th#tJIP=48zm68j`$~%PFK>Pa!y-LI@;< zKp*pH<_H*`=3d|6`~B z+P7{v{FVG8{S~UST24?IOgn|-J%_vyCtY_yTVI6^z6yQzXGgI3$q>c+xI!@e=glY%W$EHp?B?Z6y`*aROgZE6q{0n2q?e4xEL(o4LLtx^XtX^+N zkeh+#5kvk`F{H01&n0_j$ScpE{ROj^+9UG(O(GBW9U>2gmG4;qJtEH|^8E0~Q-4IB zze(gNe}~9}qK};C5qbU^t1aXadHyDm2mcP6z9>?CM4rcv&3DdTh#zvmT~B{Us#eJ! zZhIVWqr~HU`*FVgIN$!d^KH&suA|paoDqKW;r545;KCn|=WmNov>y-PK793VU!D3v z424RXs?U>)Cx00x58=N25ZBG}3$*@tdhXg`@*}-?q!*8nbu(oB$>-*7#V4X#Ndi2zBGn^O-4m&hG*TfyZetn6vE&i8$KG<`$@yb%`Qfs6yX-PBr)H$v z{|uJ;>nDHtL!9>gFH)AVB(_&$Fl5v!o-R%NC3Z)WV} zhq3>A8vF6HZ28|Nc8pU)JO8`k3F6`}B_Fby<96gc7c)OdM9zEv!pqbm$3R}tB6m;& z-F7x-ws#<6`RS*zM~3Q%N4hjE1A(JSAUE2(?YPyPxVpzLHH;W%$X287s0(FgH2F!Z z!S2SGy)+iePN4>fRt6#fjYfv_+j^5CyOX9U_=-4K8^djg3iCD<$2@J-1ZL3EGouO{E(SALni#hA8`}s$O4Aqb9Umq_B%O>?_(*>t?rD6xQM4XLw>|o zoG=w<$b0yTGvqOA@ioTc40(&U_`q45Tk;*u#oug8XAH*2?8O=K9uDL8GCyK5&X7f1 z#^*f7xh>tvW_%x?afUo+HU3`x`4O{mhP;Q1IM?$A!||cq9C-)F@gdS)WlkLxA`IqKI1#ikVUM==Zwb(Ke~_i_&(<240+CfT*Q5xAwOb3zGh3s9LO2+ zm4cd#MnW#*j7xA>4V%sY6IGi1V!{1G#9US|*IYL^ zn-6@=8S)<1<_vk@Zob9aoX7bq?9Io_&AE5n!QY&F9KM)*#NeDEi+G&RIh^wdb|;hb zeO%5N@|@ARh|M`ee#GgV@HuD5dsv~Qp`O=UY%(Mo(*D+;3k_kx~Dad%(3MX>1zt)&>6qnCj%AAk} z4Hg+I36*EQ8_9EKb0;qjJBInr$zfMeDw6d72$~ZtWpkaX-pb*ftKyIIat|coc0k8;w zYo!=)asnBGHUs>aazR@Mhs+-ec5n~_no2eUcLF`22MFJckvT2a_#Qy>+?$qtUKUW5 zR%*Nk&<#C`c}u`r^f=}{3$tl;e7ZKIj#iDEt7}+(1%CbYZQJ{OTljK&|JpAJUvBN+ zL$H=yH2Q0!#i0CK@e%a z8l0VtUH;XBgwgv0$O#kh@!v&A^m!^g1V~wSPh_HCeOjvGnDI5lty2(KtG|wJpMwC; zSsbx)-(p5e5V{lSe%JBn6Vk`Sxk>Hf;3UP1=28t#xr5&ijgSi&H&vVQEXOO-%kZND z#k_ih=ot_zbDkXc)YHc2$%-&Q;xfT-&!5R0u;yW;J z+MT!H=rr%0R{5Q2Ic?HH4WhKa61Mop+A+*9<4C?Bn?GUmdlydpLG^U=D`n--WW2}; zPKNV+Ff-;d$20u+Itx6t4g#okIxO!j)WuA?+4*{K!dL$G5CHP|sha=lb1l8Do}T~b zqkpQ)Q80SDKUlkFa1{VMNK-$$J#>sCCq8<>wV*w@$Uh}jyQ}@VxeQF}gw6b&H=0Nu zfB2=G6ERgQ*ykq#uNQPi!d|SX?)u15kLkaUC!JdkQh4lq@zpW;_!XjX-CryNGYor4 ze4Zcq!kJ0w{&ELn<=iy5MdD{Skg)p56rrZB*{9j-Ky$nFp$|d$F{W@7j_|@-b)9H; zERwYwd5@Y$@Z>4P6J_6fBnwtYuAcYrf0vJ`i_iRi>bNHB2XF$sPiZ?^xM`0`yQO)b zh~w$*+AuFD!;hs89&jwc`(7IAq25_CbG_?bHH?_Ff9_Xnk$5U1chBmc< zDaie$2RUK=b)BJ=`tCZJ_hA2%-TtKooT_kwZ*c5a;hR#o^Hl<^e&eg~eg5n4632c; z3*gilh4*!QsBTOUvaTAj(6oEYM7&6{d?C3G&9^-G`mjM%H?^Fb5Z;f9W6B{~eJL$n SIAQ+w>Hh()#a3&Un*abY(xtKh literal 10058 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 W^`*A*;iCELkN+QyFaDe9fdBw2K%Nr- diff --git a/doc/fluid/design/dist_train/src/split_parameter.png b/doc/fluid/design/dist_train/src/split_parameter.png index 1776fb8c4eb0f86aed1cdd67f54d8a08a4e479ce..d311c414a72517205545649a239882bdce3480c0 100644 GIT binary patch literal 78741 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

o0oqNL~|h~I|13=pNSSXi%P6wpE5H;Bsa40dA? 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 literal 69134 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%0Au}eVk~{6{Key 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 Date: Wed, 14 Mar 2018 23:57:31 +0800 Subject: [PATCH 005/913] update by comment --- .../design/dist_train/{large_model.md => prefetch_parameter.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename doc/fluid/design/dist_train/{large_model.md => prefetch_parameter.md} (97%) diff --git a/doc/fluid/design/dist_train/large_model.md b/doc/fluid/design/dist_train/prefetch_parameter.md similarity index 97% rename from doc/fluid/design/dist_train/large_model.md rename to doc/fluid/design/dist_train/prefetch_parameter.md index 92daa2b52ea..ac56502c280 100644 --- a/doc/fluid/design/dist_train/large_model.md +++ b/doc/fluid/design/dist_train/prefetch_parameter.md @@ -1,4 +1,4 @@ -# Design Doc: Prefecting Parameter From Parameter Server +# Design Doc: Prefetching Parameter From Parameter Server ## Abstract -- GitLab From 5948fd27170d91e2728e9366e9852f32dc17fd2f Mon Sep 17 00:00:00 2001 From: Abhinav Arora Date: Wed, 14 Mar 2018 11:21:56 -0700 Subject: [PATCH 006/913] Refine the prefetch parameter document --- .../design/dist_train/prefetch_parameter.md | 27 +++++++------------ 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/doc/fluid/design/dist_train/prefetch_parameter.md b/doc/fluid/design/dist_train/prefetch_parameter.md index ac56502c280..e8ea7fe67b9 100644 --- a/doc/fluid/design/dist_train/prefetch_parameter.md +++ b/doc/fluid/design/dist_train/prefetch_parameter.md @@ -2,40 +2,33 @@ ## Abstract -We propose an approach to prefetch parameter from Parameter -Server while distributed training so that Fluid would training -a model including the large parameter which could not be stored in one -trainer's memory. +We propose an approach to pre-fetch the parameters from a Parameter Server while distributed training so that Fluid is able to train a model with a large number of parameters that cannot be stored in one trainer's memory. ## Background -For an embedding layer, the trainable parameter may be very large and could -not be stored in one trainer's memory. In Fluid distributed training, -[Distributed Transpiler](./parameter_server.md#distributed-transpiler) would split every parameter into a number of small -parameters and stored in Parameter Server, so we could prefetch the parameter -from the specified Parameter Server according to the input `Ids`. +For an embedding layer, the number of trainable parameters may be very large and it is likely that they may not be able to be stored in one trainer's memory. In Fluid distributed training, +the [Distributed Transpiler](./parameter_server.md#distributed-transpiler) would split every parameter into a number of small parameters that are stored on the Parameter Server. Hence, we can pre-fetch the parameters from the specified Parameter Server using the input `Ids`. ## Design -This is a feature of Fluid distributed training, maybe you want -to know [Distributed Architecture](./distributed_architecture.md) and -[Parameter Server](./parameter_server.md) before reading the following content. +Prior to reading this design, it would be useful for the reader to make themselves familiar with Fluid [Distributed Training Architecture](./distributed_architecture.md) and +[Parameter Server](./parameter_server.md). ### Partationed Parameter -- **Distributed Transpiler** would split the large parameter -(weight) into some partitioned parameters (weight_0, weight_1, weight_2) as the +- **Distributed Transpiler** would split the large parameters +(`weight`) into some partitioned parameters (`weight_0`, `weight_1`, `weight_2`) as shown in the figure above. -- We could use `round-robin` to distribute the partitioned parameter. +- We can use `round-robin` to distribute the partitioned parameter. -### Prefetching Parameter +### Pre-fetching Parameters - `prefetch_rpc` operator would prefetch the parameter from different Parameter - Server according with the input `Ids`, we use [SelectedRows](../../../design/selected_rows.md) + Servers using the input `Ids`. We use [SelectedRows](../../../design/selected_rows.md) as the received variable type. - `merge_selected_rows` operator would merge the received parameters into one `SelectedRows` variable. -- GitLab From 1b4db80b10056be045702fd4a6078bbcc5a36db2 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Thu, 15 Mar 2018 18:48:23 +0800 Subject: [PATCH 007/913] update by lookup remote table --- .../design/dist_train/prefetch_parameter.md | 37 +++++++++++------- .../dist_train/src/lookup_local_table.graffle | Bin 0 -> 11311 bytes .../dist_train/src/lookup_local_table.png | Bin 0 -> 303842 bytes .../src/lookup_remote_table.graffle | Bin 0 -> 10636 bytes .../dist_train/src/lookup_remote_table.png | Bin 0 -> 290825 bytes .../src/prefetch_parameters.graffle | Bin 7340 -> 0 bytes .../dist_train/src/prefetch_parameters.png | Bin 167376 -> 0 bytes 7 files changed, 23 insertions(+), 14 deletions(-) create mode 100644 doc/fluid/design/dist_train/src/lookup_local_table.graffle create mode 100644 doc/fluid/design/dist_train/src/lookup_local_table.png create mode 100644 doc/fluid/design/dist_train/src/lookup_remote_table.graffle create mode 100644 doc/fluid/design/dist_train/src/lookup_remote_table.png delete mode 100644 doc/fluid/design/dist_train/src/prefetch_parameters.graffle delete mode 100644 doc/fluid/design/dist_train/src/prefetch_parameters.png diff --git a/doc/fluid/design/dist_train/prefetch_parameter.md b/doc/fluid/design/dist_train/prefetch_parameter.md index e8ea7fe67b9..952d2bada92 100644 --- a/doc/fluid/design/dist_train/prefetch_parameter.md +++ b/doc/fluid/design/dist_train/prefetch_parameter.md @@ -1,36 +1,45 @@ -# Design Doc: Prefetching Parameter From Parameter Server +# Design Doc: Lookup Remote Table while Distributed training ## Abstract -We propose an approach to pre-fetch the parameters from a Parameter Server while distributed training so that Fluid is able to train a model with a large number of parameters that cannot be stored in one trainer's memory. +We propose an approach to pre-fetch the parameters from a Parameter Server while distributed training so that Fluid can train a model with the very large parameter that cannot be stored in one trainer's memory. ## Background -For an embedding layer, the number of trainable parameters may be very large and it is likely that they may not be able to be stored in one trainer's memory. In Fluid distributed training, -the [Distributed Transpiler](./parameter_server.md#distributed-transpiler) would split every parameter into a number of small parameters that are stored on the Parameter Server. Hence, we can pre-fetch the parameters from the specified Parameter Server using the input `Ids`. +For an embedding layer, the trainable parameter may be very large, and it is likely that it may not be able to be stored in one trainer's memory. In Fluid distributed training, +the [Distributed Transpiler](./parameter_server.md#distributed-transpiler) would split every parameter into some small parameters that stored on the Parameter Server. Hence, we can pre-fetch the parameter from the specified Parameter Server using the input `Ids`. ## Design Prior to reading this design, it would be useful for the reader to make themselves familiar with Fluid [Distributed Training Architecture](./distributed_architecture.md) and [Parameter Server](./parameter_server.md). -### Partationed Parameter +The execution of `lookup local table` is as follows: - + -- **Distributed Transpiler** would split the large parameters -(`weight`) into some partitioned parameters (`weight_0`, `weight_1`, `weight_2`) as shown in the -figure above. -- We can use `round-robin` to distribute the partitioned parameter. +For some cases, the parameter(`weight`) may be very large, such as 10 billion features, the entire +data could not be stored in one trainer's memory, so we need to partition this parameter and +pre-fetch it at the beginning of each mini-batch, and we call it `lookup remote table`: -### Pre-fetching Parameters + - +The processing flow of `lookup remote table` is as follows: -- `prefetch_rpc` operator would prefetch the parameter from different Parameter +1. partitioned parameter + + + + - **Distributed Transpiler** would split the large parameters + (`weight`) into some partitioned parameters (`weight_0`, `weight_1`, `weight_2`) as shown in the figure above. + - We can use `round-robin` to distribute the partitioned parameter. + +1. pre-fetching parameter at the beginning of each mini-batch + + - `prefetch_rpc` operator would prefetch the parameter from different Parameter Servers using the input `Ids`. We use [SelectedRows](../../../design/selected_rows.md) as the received variable type. -- `merge_selected_rows` operator would merge the received parameters into one + - `merge_selected_rows` operator would merge the received parameters into one `SelectedRows` variable. ## TODO diff --git a/doc/fluid/design/dist_train/src/lookup_local_table.graffle b/doc/fluid/design/dist_train/src/lookup_local_table.graffle new file mode 100644 index 0000000000000000000000000000000000000000..180004cec944783468158ebcacd430e14a4fb2bb GIT binary patch literal 11311 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 DP$N6u literal 0 HcmV?d00001 diff --git a/doc/fluid/design/dist_train/src/lookup_local_table.png b/doc/fluid/design/dist_train/src/lookup_local_table.png new file mode 100644 index 0000000000000000000000000000000000000000..e5719f39e5f33fa0dca8d42c9765b3b5b0dd77eb GIT binary patch literal 303842 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

?G?HtU@uzoMnK{Ea` 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%0Dyg%uTGWzXP{sYxt8{&2c6X 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

7L z)XNqA_DXcV%NyIDJtTsKXDR#nHG~u)jaybPC~$Z|5hd#5s{K|q_ns1^Hc=Xk^q!|I z+`sEE<(`!0k~P&=_dcY`z(;l5Fdw(OTF9Z`hw-SOZ`Nop2hi~Ye|qwd1JqElvsY_O zf#SfwnK)USDwh7tjRb!|G)jeaNS#5V`zHgOc^L)Yo`A167zADuTzRE!#onT>MMY|j zZ5d#u*5-Ytpmx_$V)~JJ3is`@&|iCJ19D7Om#i|J1(jHtEfry|!gc)h=d73A_p0C+ zcZSa~RN3&Zo8FNcfMW3n z6`ab>W&^>q25Q;;*4fQrNQFCBaZn*>yW^n`nuo}I{bz3Ts-^qh=nmiU04MnR3GJcp z=D>_&tU#mvg8otJ-LG<#H1>z7y{@Bp#pq*9f6WAqTj%nhX@y&nhPet4Ctbt6J!+-A z^7U7Jl}&Z4tprp@L*MG@F~|6a7#x0f#&~^>O9sq6IpiR{Lh5Lj#aWP5mP^TXMKxM( zz&)(pg$C8ZU2crD2`;8!9(|z4 z%0A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%0D6iTUEKD86mD}1 zJlHc3!{Tup63s*%eV>L{EWl?7I*lU!d}s`?exAow9?)iHcy+g;ZhDJ$kxzg~&E>qA z&MgBuog@`Db@`=)G7vv`^|hx-Q4yobUgzn-7(gyEF#%9Gw@vC4XC8F0+yBMZhnT1?^L(9 zNV^T@3q}hwY-%XoKLNLa?%$Ys!F)2i3Q}3iX_kfw(=3w}uxRDMPTIuP)!*-n?;uz& z6AKjO)t&h)nDj}N$0>5I9pD2w1NC+!7*ylpF47wh zCBYmDaC-GmW3do&Mm^Ypr!#z@X3Xi*2!rZ8krd_DvD20<@QI7-3XEUS(}71<#IbCY zxXls}uLloahQ!P%7|Q_8;j^ojlSCx!)It-lj{IjEKnmUqx*yP&SkRB)yZqVT+IfM9 z9?GGh?8yjh-}@f;bvJDa1@O_6i&&Oz9dxk*a4A^Z@pl4-jhg-R*=_%8gNx2$JdA<; zLP?J9`5vP9FijJ=5DRUPEq5Ih*VNWV&0k-;^fjuX5CNQW|GlDZ%?;K8B@Ij0t;O~& zkA^y5w1tHQn3gs=!!tl}eDd|p>eue(CnB#uASI^#>@7y&`6v?L3T!93Q{+Vn3w1#~ zP@QzL(+6qQ)jgQv7Il;pZY?*Wlb6vj|dS2)@8bXa7eGSeROxQpVbJYgh~r zPw~jK-Jo*Ed;I3@pS5dXMiKnlU?4B$*Ca^`Dq+NBKA0C$Ji&ts$9TA8<0F$=(?Vy0 z1gCcO3s9XMe%5i_GQ50hpbhKjcp-XOhyq2jlcLqPH*_Tz?}^=Phb{n|k&A94`NqnK z0pPa^?vU#Irxok6{of@{+F%NWnT&B;wC9D#aHTLWDh0z|+GIN+as+AyPY@w;z`GNRUYv-n_^4*?5rzf2Lrb9CJd_1-7A`D(*X) z2lHAZhLf^~kHNPDlO}$*y`m6Tz~uT(!E*5rh_lLqztKq%*!AqM%n zt7CbY_YY~$Rbm*#@~y}8`BaM=U%M49bU6Ee>`3V>ONp}W07 z`lQ4jk?bD_1r0%N*Y3Z0@b0RY#H8arx}agihaw#%kkOBYg_W*ZULqO7M#XxYcKi#9 zfmaJe21PFo&^8l`K@(&m)~IxIC5&W~M@m|m8v4(iEbbEYtJ%A(OxUqjq!8`ARzDs< zb)S$T!%MYr-qH{3Kjw+$qQptT*7p<45>lc}&B>_XkW-4HVEHC?uAxgj$o!j(VBof)| z79J&xhBR!>bsNLjNt4Yo5wQk2qhmiBcUd0QVgd|CW>9nQXxDNN6R4d2EfKXP58C0tn;>`eaR}>L4ev?X*kA`lpY) zEwl|1{w7HB(lFtu0V4$jGTUa-mkUU3!=iyHArzSQtWk*jnQF!McmM>xVxz$K()_2f;N$?UDS(debo| z_x%lJFFdlANdB~K#gvD-z#{|%p5{2tH0!7y8gGz9EOWF@yJ`v+Tb< z)kv6M>O3T{{|r@8>~&W&kYv(VtbxN7n)II)tZqdn9-WDPxPtQ(8MZEz2{DwYKj*%E zWC~;G22ZQe7IX*jFdi&VmL0a(m&Bfs8yQ-aBdIz$+BM#gVDnoRZ^Ca*or2c4_B9;y z=q#C#M%xxJDyG`N%uDKSfB5s0XC8Vqca^*;6)RqBN-YLKFE9y7V3zRioEsI7O>&5`tnAy^cJN`HK^XgF;`i{&!vLypl2j$UE zflqo2<_LI^D&y0MQeh0?=US^L zrM~Q%yrs^hR+!n&EiW(2>Mt9v!=nsqK<33In#&Ky-6+gGa$SZNTSId3&#;L3j zP7*}Rn(*?7ii&dEBDgFtR6p&$Is`s?w!H_a(OENsf>4Qh)ASlvlA=$C* zdUclOB^Xn_NJ*+hL%vKmhkasDWYA~?#*>fXqs({q9@fCFpp!c0(MRVycOFK4_$+0} zPC>c+HfY4k1!luMngjIL8r7AdVIz|s2S-2kKsp@ynvpI-E*Lw(n21kXya~xCFqNO7 zxYPGp`?-qb59pFJ4Q8!YC&yI82n;hc!@j#_e0@O;c)=1|2O zP;Y}y2x#Fq%=-e$1z@|w**N(8(bvp%-2z5SFcfe**q%n^dq zh6&h7VHPp_me`NTLUC-^esp7FLva}Z1lFljr97wi4?Arv&08=B@w@jFSw6Ylh>+Sv z5Mf1(+s@BRV)1-6xN!dHFxSzfzJ5I(1ag3c>`6x5sogL%Jb^;#95h+lc>~_B3s;Nz z!WD)^Cw&XWZS?~|Y{lyHxt|_qM&cup#`l04Dl|-CfTZMxbiy3~tAHge9uS632+ChU z?FV4}Ic8vKPErKTI=5B8I4B;>io1D+onXVBGwmI(bpe(JjY!P4t+%bw(=L`yiWsgP z<^h}n?HSaaI8 zGC%~AH+DV23)c$Oi@U4y`$eGI1L~e+r0c)%b#^qV-$Dk$NH_GA5xW6PFsnR*11Cz+ zP~l)D;{zy)8p+$D?NIair(<9JU!(Q0w;mm?VBgp2a8EHXdrt>o$g!-jWuY(QzH&FdGUc%KT)EoClv) zH1stXYKeolJkbcR=Fy)AFV`CAU_>PsF7pic=!=JaHaw(yfT#r{KLuxZcXuYqv_gW- zjZHn!T3Nu`ktxKTvXj|A$U?WX#v&VC1&Q3uweuJVUF|BX=$rE((-W3%!W^RDz3U=D z@y|ub)kK*n7-U-oz3!dfgpv16<;-xk`~I_cNq;13RaUgb;?6VZ?AW{sKuX?Nv`1_U z_$5kRwsQs;DKfNrq0ZQSHg96Tc8X`pZQp6|q-Bm27LRlv_l;u;3{$jGgD)qz7sU8sq)-aI2#<_`i{F>ip380_ zIK&MkPX0eUkb=;ww6J5q>3vB!7bNQim{e(8EQ9N)54c#h1L72*A?pFZM`3dx^Qx18<0+zyMUAX69vh8-m zj)A1RIDOaPYMb2_m^F`#l(APRJVCYoR$wgtmLRn9S;n$*CxOQB{j|B)i6_5I+9`Jr z_IE+!ZlmAf;469J=>7*H1?JBPRsisCJXEv_Bh{=kE>AuohS@E>teF9i6nmTtb zIUVGMAaC#SB9|H~3s8VKE_bU=!*HStEOHxA%zAZh+vyif?e{MoO-L4^>OcI@D`G$d8}3 z0h;YpoG0I~ZsjNUxjR#f>l^v{m{OTV(pHiSg^kTvFbT$h{jGpy*GkeXzP~`cD_^s9 zJk2ij#GRCjU4gyAz;Cu=RhU8bZlD5Wsux4^=m*Rg9UV<4t#}Xk3=Aep=QQS7v1uCT zZ?DyAws6SKE`z)ULw!Lmu16B0#(q!BHDS^M0;MQd7op%Dj8K3&GBE9#45H2R$4vGw<4EFi`K7_Ku-0au%TjL{* z4pp7lz`x^uS|N5dsV>q{>CfZ(xXGFM#oBOETYbERpaVe+&b~I6f2Ov!0FDfpikZ-b z!)y+G1}Cww`j)yjUy;y}2IfoP2*79&S%(O?oR!lJ+GpOp&aNHe-Y8r1Kc`$^XJk7K zNSWaLEoxxoJuNdPGqEt#U_6stmCNowk)t}`So@Ng=hMdu0(X00A8}s+xooYi2euIfsiqBlZjic&O)vA4;~;1s`Rl8zay(Y=u8Ke~ z#6C6H*jewCA)Dy#U3GePrP^P5(FE3RLAi=$*8TobF|QQt_rBj@atvA^d@}{x)0a81 z2+JyEZ3U9Wj})I_xANxqG_T!4PmTvTby3aB>$?*08#(>egsX7qamsCGAM&>+?6B^1 zXSj>cj^C1x;O%+&e>#5Xup~Dg)U9=iYCrf{$uKp2@6YePF5kTfLHCg-Su(_0LHi1< zrsbOM`?k&2ZP9mkIEL)1@k$v=OiJrbIE{Nu;9>b*2E5tJlPYTiK0BkH^pu}fy%}mr z6R|y424Oj{TjFOr@T#YqX+(w68QTlPrG?<^M@+h=&g2E4uZ0crXs~UVjp;+ zL~8?+v^ehc$>CRMUNcydJyH&NNrOrD(5x%D9YWex;AfeU_Sm-x|Li+gTDko4|DF%lja71~1&4_C;OFr0i|Ff&L(XsWrU|iq$(xN)-Kfn~n z=3yyL-i>RQ&!0D7FW`{G8o2Y>Zdrm<^xy9Sa2opx7`aJxAvA1*d%en$jpp#8uF1l$ zgG~nN-ZW?@s;xplixks@$#iw<>*?&IYgCTBav(^juu12geg-M8^QR0jy8H$Z#bMA^ z^`&C9G$crDp@F-ty$svwH`=iYC|(w5xS)0g5oVAwcbE3i-Mu!*L~QDuxi#Y4%CToc z*-_mDWW8e$W+AG)8husqY}G@Mj~lC6k&wRZLZ4_3~=_ zJG|G_ukyG|at%Fk{XsglwXxw>6JlX>_$=zN19#HtwlzVKhgeK_D;>cj70%VZy2M-v zaFmUb@~{#As~5fOO4^wV8cJvNUpV(q8tadT_&UK4%9;_hb7|bD)Zd@% z^5Bgh>d|P=v9U3bX)<9XakFqCn>_V#amXN~{iTq2v%>0D8u7qKhXIu(SnEU3MXGqLIBY>&=Y#9>?AB&NiA-F80jPsI9ihL&(yXhp`~_ zHYh3@uQAoGG@TbL+zO8d{HB+qbg%8nbmqFQ^{H#=0+en8KnOadGjdEWx^XnGr^sr| zuV|QTNk$0_Z)W7X0u2R0axOz>ut%Dl1ExYoPAdIX{)9R`K0S0psk){+a~ZGDU@Gcc zZP%&%393$p&`b~At$zu6m{{uPe$S<4LEF_SnU`4vl|`MZ@tyy@|LgSAksTnINN)oV zoxKAUVh>~z;CB?cN$V}`P{@pFm$r!wf>Nb{Jm>*r9$D!V|Eh{CT!r<-00}n*$%1ij zuZ4FRI(?7Ph4HV@*A=RVm);7Gcj{^D5s${Waw>=LjX`Jd z*ow2|s%5DX&wzxS(hPPhQ<>C!?hPfHqKkJ79+!@G7Hn9cVVt9v;B(@e=Vo4MjSG?* zqFC#qKs4PsDr+|Cw?MagS(5Ye+LQb3-Z(a-Tz?&E{}2p4`-s{&V_;x+YxD(JSW+4- zf8Xru3-;j*7bZ3!2@?cHv^rVO@6rgnSna13(atay8j!u|2)9AYWwj1CMHr+3G@F(% z&eoC_FfcGs%P#_i(IVM@q}WB$6vFej(1Tg!o1qlJ5s};04ex36 zbl}HZD=AL2)VYXdkMAxzUu^w_7Tk395a_A14VCaM^=-9h`}uvzgp;%%9o+!Y)NGj8 z1X7!+&(x5m5(l=Nj|-nXe(6g6&IL;x?4qtdC1I*kPg7$0PytrfDcH6QRZzXHpFqlZ zh6lDsrxu}3l9?2sngGmY>r^pZO2t@#4|Y9NQ3qW}?rUyAel{33)|d)~%63*>$OOT9 z#$tEcr)ZPcB~jeg_Z9P@#~Vpg_RIWa9{l>PTT;%{RlQje>*UEPz@9LvbRr!aDz?@m zDqkEf-HN{ZeBtZqGiMZQHPY;j4}dfFgd+eW3aE3WpnCr-Zkx=w0Q3MloZ%UsjdCd;OUR6_!S}3|0v54ir4^S&BjeDlvW5Tjncw)Gv{a*HBWqUhPY7}$H0^7R$u1cG-Y$px$$N~^^D$vrcmcZ zHnacZgN#W{E6&rp3}(vf4x#T5iwoo4X> zo~I9?pfQnd_l;wN ze83KpYOYo**%|P2yM)a^ljYg*e)G@5e#jJ=@eqmh6_+0CV-XrMKRe6l7hO`^DZr<0 zOArTK;?9AR6Y0L;OM<)y;fh*DVmeNq24A1uL24IL3PHaHy`TWB$Vy!O1yWsuc&n*c zg#$kj>sy-~r`>k)REp3H&%5`L)<3?*%!|Wt>RKG&P)*xv8rfVuDLJkV8neN`n<~H? zBSM8i?}1D?SNLK4?-sNf@eCjqs@4wK9q0I*tFS8(uI8N&<{wkJ&z?u42C)7(#6MHh z+n$D7k)dAv&@myK=R_923bcz;1ecO$88=hDnKjj^lq z*syf^(wjq15z#!#NmXJV4Mb|0Cs$k@HsWg12^TY8$$AZHynlo2nI1v3rE%zQY{DWR z>$rZ9P7m9Q7g3bc@*~zD6?Gke-Hjn;)R6yh(E4771Pig7ov;5__#zKFe1n8n zP$=YDvkl*a&BJN6j$Bc@&X0r^wRm6B`xs}xD7H5U4DJUm`91d0u#y7h%@uDZBQ;iXlw1W~ zKwol}%wO$uNU+eTFw}Ikx8&s#pNIYmPWKc_)i`_bcI{C0Pf>^A+>?lgf(gjFhX`sI zx6O>K_vs6$Yf2uhtgi*tf7Db3(r znn2qeQq>g)WFZ^2JTLLuN#2Gj)&aOdVg+@nnBE+J>^Kx+Nf_6+{S6U_E69sSF30=R z|9jiL2$0ry8|b3$b@{sDzz!QE4gn=k@QO9)7#U>s5f{CB4)3St)wkeX2aR8BL*dRS zzy#^PY2p>1C-@14K81F7YZg9o~e}B;aOE%j4o?@*XG z&Yq~@I_Oy?V7a&%xL*KTFt`CG4y)MPXsn8Zoq5p1XWwsRy#(|;-SDA4|2vEdLob#e zdCll5Tu*R}01uI;M98@HwDeUq5JZR8eJ;Dnj-(onz-$48$L-&;*qz!HFNRkTfsRqB z4D{dgIeN_{U}{1()lJT3Qo-dvc!?})BJEuZQ^N(kBQU`q4;6|98ephFbY@!B-RVeY z&X^`xITdbbJaNGfIa!3XZP^5xVN1vpfY zVIo=go6%2A-6C4Z=pKLzH@x7>8xIe!<4-)oI1WDl?Sx}~C`2HK7bB#kvVk!MQmDv+ ztfDcJc5eZ7N#m$nqw@gSxK5IZf(<06(|)a=vu_feJsTVJYD0e76^2)%4wHV5BGJ!y zG~lHbAY7R}{G`BV4X{+)TN+-S@=Rz9<8N+{M`(b5jt91Vp zEPy>(?~neM;$qDY3=!hddR(HZFGRnL`*j8TQb)pf*raMAQ%sf}2OUlZ7*AO-nz_~w z1=ta)_cnNK?j%-LRthkvO7Z!wf}EL^BnF#X+Pj@j#-_n>QyEmR+PqPNmYV%KfSVOw z_)Sb%(I;Zlubu@axqKgUzo57C0Yqzea29BS5Rl=Ndw)cuw>ism?edP&E@96W?C~aF ze+)7d4t{O$0GAWP!}ymK^H?ws#EZO|996CUySO!bS9dgajkMCkrP!|25 z$AW>MejQoUpGc=W@sO5)2o>@ku?!OBEJlJ%dyn<;Qyq(I$5Eg1fsndI9`e|>dtVUzc}M+@G{6&rZ_j3qq`HS#}cIvIkwJh7k=&{nvr zq$iHer4inv-#7>FW(?*ukBp5h5y}uo&~yE?#Kt${i+m2q0{5uXd`4!~Q9Ab(*O1kU)BoIlOma4{ ztMGjbr7DKi2@}zQYq005DxwRo!hu0dmzEEx$4Jfbm-$-1nwWPC9LKsuDm#~pcQ@>7 z>Qb6e8-ZPX$VF@z@+L3)!xmQpYkrS8#Oz?6VI1na86UQ=<0p?;957$zRkw=!E1N2k zxb=7$JOP|7?qoeFLL(EoS3DhQJ?U}U3jtu+)WGCfh%i{hwV~TfN_u)P92v*BusFU-^@Yb z1Ez_*M$lS-Kl(Fh34q7@BS*mQJ};bhzp!*pk8v;k*-Al@g$uG*=Fgc(gXFEpAohss zmPSxx+h^G0Yr9Mg@*Zlji0p7P?w_3q5Ld!rDpsE1K$cb|XoI|6e)n0g$tKHQ(XCLO zw?Kfo_5&tT(;f`}5NozneO!7gSxA1w#A4eI3zdmZsjx631B$~764&Vnd!3BNt z&|)h{$Tzfsr-hwP?m-SDYw9~H3JQu3NxBPMBp`pH0oRf7{f4E`=IbL)^GtO?`J{Q* ztQ*6*a~o}pDeXlmMEerqHC14OB&KqjXaQ~=%mI{N6l7G=w{AM*6o=@tNP`+AKrm^C zTu?GjpXsL-l?JCiG0ng+*fS2b6Z#AGLyR&uykX(}rvc|coi8}s@q`#L2f&A-MF7J& zeNgWiI`;?7E9)A!xy5ec(#vPS&Nm=INZb(agz5(H*<6DCF8MUJdEECjoN7_k~RdN#}^*g9jV}5~EhL??k*g!PU z;27dVfQ!5d4oFgB%Gu~3&PiELin>@2JWEC~S14?$O(xRLAcsKlN~PZd`1Zu|YB)n8 z7R;G7K}Cex7or%oQHi|OiR^R_ligwSTs+jEd6O-0?#&XP;(zlVw&F6F%E4Iy zq9YI6H|WNIg^dRv%19(z{YLn}Z=ZkfD(T!E10w^geh80k>OucX?d`LkZdZxV9M#u> z)5u{aNQ{)&N@V0ejs8B)EGl!q)Bq=tQP~XX-j52|bQI@{z*q?eg)g8_#IoMfn0$yP zD?r}l;IRr&u!&E>08tQ}n2}dZwugiWTx^VlcaLRHKJOFoumbnRzLf(^@_=)!4;W`P z!;4dhf6{yBNO=^Pf(w94aTDJBk+&%Q_ni|us_3*UfPR(r9aqLY6$5#FKLAZZ9k*dJ z_QJ#0Jb;3|(dIWi!H5~L&LSe@O}=>S(6&bzK4vZ;3(R*+2l4<#cR7t%vfgN!jrFh! zgdUenCkRkd=Jq`_x(XEb7`(nzt;LDxKTC<{3sUpb3OsL&A1ps7E`tmm1)*>N_)b+7 zywXiT83g2q*Li_bvXrenvzoo?GI1pbC+}-N%+lVc=A-l3Y5#8hXH!4k@070m3d;Az zjSH{PqKh@i8toA(jfKJ(JVVwm*ApZJz>V*37pD=9_Y~f>AreN0lV|m`rn(y5f500g zwFGa1glaQsV;8>HfPz=xz@SJPVjfo69;?pxKSNfyz#ibZHEf^%cI|_YMUhuWD72F_ z8%O@cm0D@1oEQMGg5bvmR`d~G6?a3o;eFj)f)1{)Od-5o55%(2%AC9m2X6seyks?| z8gunB2RRMoq*i?X?t~HvqX5$?-M~NNwzZ_eG)=sr0XoQ&+~u1p69$e&-04={(e87_qg8I zb-nNG&TMOe^VJhsW|>omxkW{F#R?$GP5jgC^{A`S>)iyh>_a-9piD2qnD-MO4L2HY zpWPT0ylHCKr=d&D&?4YFACgq*g>c>#r1MPGpa}It{l#iDU zZ?BG(D}Ag*V$=$n2Sh8k z3VfCn_AofrnJepB7GtJ{S}Ym_^}RPvh42Hk$Y_#1@q)%aP!9ghM_vw-+Y?2tXrtKA z>Yp4#!OnKXfVn;2|6*&A)1^nS!00viid^iTln)T*0V%}-#>!gR0d%geH+%m_TfM-l zDQt(RMj4r$ys<@S%}xzw&895H3Zn}Kx8y`(3C5`xSH^K!_?ZpxS?K zq-==!FMBe0L*{LQol)GL8=K_-hLj!<-^bGP?)1k+{?Y%%HA5MoN-P)E+t}&n_s4C(EfV7VEq8;B~ zcPRa_IcaAf-2rn;R~pv}&xwI_+S`Qlj9zT`QwP=h7|>-P4pVP=>0aB>6J4EGV#Mr; zmt7uTP=q=7sJ^|uZ8xg~nhrFknaOWsKkj|89Q=IEo2DlQ{yB|8)ZoM!-Fvz6Ok*j% z++LQRk?o5Q@#F2;2hy=6o|GZ&%g z#T={wC>~!3zF+H_8Wsg;aTcn@l^9yQ@2Qmx=A1zW*YEuSlyHxK_l~=rp#u#WlOol7@`^XX-T>BY`o8?;`0Eu8^=TWXB{P~13f)qt$Ol?#1K;Lb(E&n3R#0a|jx z2x_+?@7`6F|5*k5s{srx9PXCK3zlWIxiaoR zgn(iXHg8Ey-3}jfKC^D#kR$bma#_{@c>uXR^z38g`OlQ|?3Gt7)Sk(D5sJgm5?j`| zMN^kDR$6jHfQ`vL3(xtTFD8`Zww^w*W6AEEZl8d;&(E}VNr@=HMyZ3WK&_O)6K1f< zaLAYZjKNhVdok>3vtE0c!~|>-ySMjDkfIN=hOUr4|Y5 zjvy(~PMI%m>e*fSrXq?!mdT@&Dl)sAKpMZ_q;poOKX z_aN&$0J9e%hVa+n4Eg`qQ1S^VHCTi6&4>M zBU+X}dyev7ITp;9d9M)ka<>(%@7|ye06@|CCb;qC9+0Q?OG;k+bl|%C7Z6Wg7pQim z=e@X=dZg$zI?>JaG|W>M2HM@?^i*0WzaP*pDyHdOen>@|S<_m9o?n4qMJkyy>A5`3 zHg-*xn`?U4+;m7fTy)F(!sPwQ7)zNMn$!=W!}Cg(AHY29%AJ%P$jugO{;L&X)}n?N z6w-63gYJzq#+u*lH->h^-FOZM&OKj2P`oz7R8yep3KKQ^!7TfG_G1RdVg-&Jrc}MK zAW#jsG~qx0aTstQ)8IlyIL{7*Yh?diAzq0o)4b2e#V|RWJX`<#(KGe zCuWh;8K@$^c~+f$5+-%fp;~d$G*a@S0>4mY|C{tyF8nTL3xNF< z-M5o|{qN|4M@~~k^%a5%XqxZWc+vDOfkL(l*@{?5TMQQOhklMEoG+%OS5v$twj&XF zGDy|-NKS|jK)jwr08|chx-fV^@^frgPZMzd_S+{4r(x4doSgoUIq|a^Wu`cQg zhy6mqRP2Inc<#v$8zL@GwmIY-uz<0HdZhEHS;%0acl|G+IV-bRArqlyQQIyrU%U`rjn!-D^?gy&*U`m4}Yr-!m9S#P zR(rl%*Era~v}v!dSSB0%@sakg#$hvyaK{P$t@mZ0-{bEW{KKap`79=qgPTWy#Wzc^ zr8tLGSiOCWYF_oH@VbA$<{#9z_;ajkx40A{TB#z>?A<+B(Od-F7Bm8ap4yY{ta(!} zGYGjnT~sSZ@D3(l<-V&$E+L%~WCywR59cW)bfYx6U1doN&&z z``eCd7=Gch(LTC}R*q;=4ZcjEBQMXsaY;E&W=!Su$G@KURFL1#6#0(*1Qn>#&}`q+ z*&h`GA22An&=^$?w8A!z98h2K<;DKr?wXT`KZYasSo9!#th(Iw;HB0(@Vnll%qfuO zv*mr%#4I@IjymP3U3Jh8f!6#@AkcXn9R&6{&8Wp+{NVkg2WP%j5e_7yVK?u(U3qla z!7*ycIK4FdkK>;$ZydAQRCleO7_p@=YUo|qzE_3k1 zNiOEi!JHBgS4leBH8XjXD_AyBS<$|M2S%#Un+8=gRd4jn)9YMO58|=uV>*B$!2M^5 z{9I+M+y%^H)Vfo6X^YxT;~jW4>SJsGA2Qj&#zH1W*2iW8U!ySw31i{PeuIsJ04mXv zW+iS=LT4^!uF{fc*^2p7cLm!q7Erjs7B%neI~tC4`X8!y`?>1lAp=$! z9(a2fl;CDm6Zcb5of2+fKyNEg>!mY&5S;>J5t7nRF((-*SL}eVLHw!L*`kjYi7=k4 zH8_f5SO0}f#66!hF}nq}-^yw_MROpffL(MhqH7Z}eR@uT{HNwRT4=yBj8Bap2prsj zT57s1`)Ne}2GakH(0&SAh`G?7jtE#849l=${uad!4$-FdynPR5_34tnO<; zP!{gRUskGVC&GZgBhN<@#v^Z*pur2#=n4Q{f}rS7W%x-+O# ze;y;Bu-aX4fnZqPS^=+bS9i4t(nB((>>FFXdU(Dml{xSRrl`T^$#M5Q(ajSwBRcXb z{!^b&+zfWO5g=q(UeXM@!j1dS<%}Np={PO>#=1S9L+YcFks~QBf6e!hb$b-Q#)?|s zo-R0`L^|OW_v^qDUy_-+sIZ=^u{l&h^s8nMP1u`57uNEz-aZnQlvPXEGfzo^g&E&} zCzpsj+%)8uo|x3Ujh5oRHilkRtT8vM()>GZO7#i zgC2agtk(dFfMHek;~yr{UaPze>1|*aX8ZC(-$-(V>0TZE2}jF?@>0?`Q-+ozr{z>j zzE*Nddg`*}D|5o<8J{NbmQF5M4@wZa#vp8bzza`rt^nhqUWKH$_-QmEXuh~l5F>z86v3a>2VZz;<7cc z=qqVCWl~eFJ%!gc?jrM7=D$<6a)|u(b$iZYBT=+1+6IxU7E&3c-ss?@i&j~V?&OAJ z>q+6EGZ=Lj8EWhhc$}&EsQPTn7OAVg0p|}gKFQnHn*69qH1m!3Ez8yX>#{j-j*p>@ zZMkLogZRa#nfYn8`yOu_Oj z>{|~cnfX`XmL@QgwLsahc*xDEi(FKsy?gcDBBY0x*$!tF6sHP)4ak+vdruf&%OqJJqJh`v8hA=PIx?Deo3d!-H^v1JYc==JZAJ^rQlpgypM8i$yj;P z!!klA;HM~>^?75YZ?kX<18c8_Pm*b39r=560yv~raQLq(Q8j;{^DBMfW%;q!GzX_- z?dG!Qy_7>|*HQ8e1P`43+y|)62p6mmRjbal>Y&uvytd}qINp%1Kpsq0qP*IaXcDSk zkbg$x|1kxBOGVd{d>amQtz*!9X;)D?NoZn`0N z`u{oTbW>q|Cd;ZQZ8@bw;1KB7Sb^a=QQZu6Nm>eu>{~f&_6&SY#f5QVrTR8vFlBhL z5G*6U%So+YmbJ|avYE(ChP`{*L;_Hf_LY3Ze1iDqHg8_(vB;N=(hdynjFDrvz!i$&iQ6rd7t;+e0;WBa zn2(I@xlBj4e0ui!n#H<=ie}4E!U4PQc=1l@mmj*$qPx^G?Y~;=>f~7+u{+i}AIiHe zHP2ZR|D|usD>HJ*cZh8nLKTiyK zuZ)ofe)SKlN>@$Gh(5p#!p644a>M21;l0Jc^ROF4;rmx;+4zMnK*B`KW^jCvJo_S4 zvHFNyoKcrw7|s4B6~)Xzs5vFxaJ}oYwgz>NH-aJ2mm|0psPonXlmuNHE)J%M&qN*n z*$veeIlK%B-pp%ItljjE@Cn6;N3;t@6R!yBZqZ)yR`M0yo0qj)-q#yiSAbXr0Ad;{ zlG7I;%6{Kp3!e!t$+I8D@ddb#)4+ZA7EC4W`4c`7hA%1V>$lW=rarvm?@-nGoVv^L z9(>4(DiuBx3K7&~pOR&7$6Az!r2~WmB4mkf5J)h(4x5E#HD(^DmFr}irWr>-z8>lD z+wkv;r+J|zZ?-e?)4<^E&mRkSyCz$y0Ujaz+ID2lxnlB~9HM2hgz|~iTl*U(*=+kHJZ7b5=;!kW42cK5t` z`KARLb71*SpULbfqx8!6iw*K1rZKw{E;Ny5gy;|kSMD0WZjJv{_L}yRBEPfs_bcF_ zTi?*5!M_l%Kj(j9o-BNU(z{!x{$q4z>$&j}xwb7TK|9S#j$dH5$rfwBNbHb!kSrHH zCUI?OulQhN__XW1f2wCAU%~Z3O%~g5R1W=5(;TMUTAsEfHP>sJNa=F7&FZE5>gHUK zwvH@1Wl$h#Yt{!bsI@L)OWxYX15);DQGs{#rkLx2C{_FEJ*N~?s|eo0uPaVN&03SH zi3-)#T-m>|U*kIJM(btVt)0kwby6<~70<%veff(oPMK;>?_uc|SZ*Xd?~l3y>^8FF ze$h2c_zE%92rveegdRg()U+y+9#naapC8D#k7*E);e`cXc38EihZi%<_2shv) zKL8p&h(FV9{{q#fraEOTT^?^Ge6TlY<_-Fas}=W^rj@h`c%pL04ur1JYtacyQ}bw# zRGR)O3|_*-&3Sj=%=e$&Wq^IpGZ}+hXXj|gA@Y#YakMVp*Dh~Ql$?Y9_>_Ou9L##u z3v-V%9Cexe`ehB|WA9X18u$qKI-J_Dj*3=`TvWS$du{9{49@E}%QEv2UB2><(%nGE z#7hM*TX0cHeBh$XZFu2DRAP{l^y+lGQmz_<%?#oY0d<&sH*wLm4YQvE0?MY|xcg5~ zTbj5Uw^+-#$s*$<&a@Bm`?F&QSJo!iljcmij=ndn-BYT-+No4=t1rFFbWcsiTQA+7 zHlSz6zUI2#?UI3t1Jw`Ne4CoL7X>c=x{w(I*Xbx8>uZIhJ9U~2_H^}t**v#70psAN}kwnhr^dNLLaFd^20*G>IVo-&aR-<9(AO7f)ry*6V`0h z%Otunc~5<$MTDcUYw*+gz-;a0pbaaz_KmwND$_poIUtaNr3NTwpoq<-{I)GcFEQE9}85C zM0X_o1<3^J;zEdSW@}j?mE`w}a_4_=O-;n!@*8Zk!M(#*G#Bg>OJ9-K7+EL6-6X5D zje%pQ)y0nKU=_1+`X#bN)2i6~;6etU zUE;PPhJ%UN=4QGxPUz-1r#!2!pJa};z*=&hS?2w^d&FQq*$`YnFiZQi(^DDZ2x97F zitUWBO5~ix)meh;+Lr(%AU{Gpz6YtVB~o)Oo9l3G;+2UAF&V3I*fvtGtAFl>Di@>0 zySrri8CgH4X;(!XTS-Sf8?Ba}<~TTWEEck;^{wvt@c`F&*fk%kwi~3{ugJ6Yn>d6L zOIsd$UKg7MKM#f;-#?>$S4+gkyh$I!{Fo9l_JVUgQ5P8j=JQ3;N)rV^nyh#xIa`?masQ?! z%KQv@CwlGC3k}Jtg?!-f-y31`*JSJ|VHOI9AIDYCn)V>&I3=O?*M5b@U!Qt0DosU~ zAxc+8hu?nNy?ygjdRyxUCqF>7{J07e)3n#2n7!0Q7>@v{4U zH#b;4GWYvghn1ErorW2Zh$YW^fp%B6;oO;LFFt@;5G!sU=}^^tAZ`Amuj-}u!*A^>JDR5ahkp%y&&&90^8H`8u=LcdKg;neR{qnZ5g)RISVVQzU=Hbn z^20EmMMX_rqZ5tw+G{b8Q=>C?C|IN$HSB_gxc+J>k4(WsdYUHhuYC#_teh+GE7F#yu zdDuv<@v~zqm-`=N<~x=XS6B`m9(8dW;lH@5RYxywxk7cUFNY##c$n}JZYzdSi@H&|2Z$`!9Wno1a%i<5fPPvpfnRrCf zoI;!A#BpvgubKE;M?t8yb8K@q{fY(_1R$-D$n-~}H~F(6wvm2Y+yHZobO3`ymA}TC z{dlNAuWJAey)I!h7op^t!Fvrt&)WR@`PGFkA--?LZJX2!c|{5OAli^tNeVKNz)i=; z^O2tRO14d*cn}K!HLBm_XNi63vjOb%`LRyk;9VTUkE^d3JUq@rT{ZJR?7sp8&9~M7 zU}hYW{M70I9Mb41gfE*Z`wqYmL_gb|RMnl)J+b00}Ijv5^S!B`AP0Sb2xa%vcn zblOd$!G>ANpXelQ;w)?i_S=*jRb_4bhMOS;!bf{8B2y%W+bEum&xmQhSU{CIEtjdA zuALDLaK&&3>DV|*^-@5E=vpk_-~NUo$=&eI9I}N?;6(g{l*yrub|DPa>~G+{A-q

wOI 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

_%yJS$tS}dIX!2ejp_5^2&Juge13htAlIzz|C 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

DoUb$;_{O>rWM6so%r(+e@?6(q6z1@NSn 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 x{iZbQFiK-SqE@e!lA# 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≫P@ciP{~0@#0F98f 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 literal 0 HcmV?d00001 diff --git a/doc/fluid/design/dist_train/src/prefetch_parameters.graffle b/doc/fluid/design/dist_train/src/prefetch_parameters.graffle deleted file mode 100644 index abbb7089829709cb5fdc337b7f9521a34f7d131a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7340 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 SIAQ+w>Hh()#a3&Un*abY(xtKh diff --git a/doc/fluid/design/dist_train/src/prefetch_parameters.png b/doc/fluid/design/dist_train/src/prefetch_parameters.png deleted file mode 100644 index 433ea3d612b51f325c8f87a58bb35216667910d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167376 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 h^E{{WRP9UTAw -- GitLab From 282aa96731d2a23f93f8f0f26a5215fbe809a1a5 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Thu, 15 Mar 2018 18:53:39 +0800 Subject: [PATCH 008/913] modify the picture size --- doc/fluid/design/dist_train/prefetch_parameter.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/fluid/design/dist_train/prefetch_parameter.md b/doc/fluid/design/dist_train/prefetch_parameter.md index 952d2bada92..b3e2210fdff 100644 --- a/doc/fluid/design/dist_train/prefetch_parameter.md +++ b/doc/fluid/design/dist_train/prefetch_parameter.md @@ -16,13 +16,13 @@ Prior to reading this design, it would be useful for the reader to make themselv The execution of `lookup local table` is as follows: - + For some cases, the parameter(`weight`) may be very large, such as 10 billion features, the entire data could not be stored in one trainer's memory, so we need to partition this parameter and pre-fetch it at the beginning of each mini-batch, and we call it `lookup remote table`: - + The processing flow of `lookup remote table` is as follows: -- GitLab From cc1e94931e1b4ca18219df2af7e5743882d41f07 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Fri, 16 Mar 2018 18:56:02 +0800 Subject: [PATCH 009/913] update figure --- .../design/dist_train/prefetch_parameter.md | 2 +- .../dist_train/src/split_parameter.graffle | Bin 7054 -> 7065 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/fluid/design/dist_train/prefetch_parameter.md b/doc/fluid/design/dist_train/prefetch_parameter.md index b3e2210fdff..7cea942279d 100644 --- a/doc/fluid/design/dist_train/prefetch_parameter.md +++ b/doc/fluid/design/dist_train/prefetch_parameter.md @@ -32,7 +32,7 @@ The processing flow of `lookup remote table` is as follows: - **Distributed Transpiler** would split the large parameters (`weight`) into some partitioned parameters (`weight_0`, `weight_1`, `weight_2`) as shown in the figure above. - - We can use `round-robin` to distribute the partitioned parameter. + - We can use some algorithms to distribute the partitioned parameters, such as `round-robin` or `hash-name`. 1. pre-fetching parameter at the beginning of each mini-batch diff --git a/doc/fluid/design/dist_train/src/split_parameter.graffle b/doc/fluid/design/dist_train/src/split_parameter.graffle index f020c0291e99f758f532d2611e72003478656750..db1f8dc2c7888d0f71337142bcccd0faeb09efe8 100644 GIT binary patch literal 7065 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 Date: Mon, 21 May 2018 02:38:37 +0000 Subject: [PATCH 010/913] Add an interface to set the number of threads for math function, and set the default value to 1 for inference. --- cmake/external/openblas.cmake | 2 ++ paddle/fluid/inference/io.cc | 4 ++++ paddle/fluid/operators/math/blas.h | 15 +++++++++++++++ paddle/fluid/operators/math/math_function.h | 2 ++ paddle/math/MathFunctions.h | 9 ++++----- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/cmake/external/openblas.cmake b/cmake/external/openblas.cmake index 8af2765f587..4a49a92f2b1 100644 --- a/cmake/external/openblas.cmake +++ b/cmake/external/openblas.cmake @@ -29,6 +29,8 @@ IF(NOT ${CBLAS_FOUND}) "${CBLAS_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}openblas${CMAKE_STATIC_LIBRARY_SUFFIX}" CACHE FILEPATH "openblas library." FORCE) + ADD_DEFINITIONS(-DPADDLE_USE_OPENBLAS) + SET(OPENBLAS_CC "${CMAKE_C_COMPILER} -Wno-unused-but-set-variable -Wno-unused-variable") SET(OPENBLAS_COMMIT "v0.2.20") diff --git a/paddle/fluid/inference/io.cc b/paddle/fluid/inference/io.cc index 65db7c7b500..6b03ac7119b 100644 --- a/paddle/fluid/inference/io.cc +++ b/paddle/fluid/inference/io.cc @@ -20,16 +20,20 @@ limitations under the License. */ #include "paddle/fluid/framework/block_desc.h" #include "paddle/fluid/framework/feed_fetch_type.h" #include "paddle/fluid/framework/op_registry.h" +#include "paddle/fluid/operators/math/blas.h" #include "paddle/fluid/pybind/pybind.h" DEFINE_string(devices, "", "The devices to be used which is joined by comma."); DEFINE_bool(init_p2p, false, "Whether to init p2p."); +DEFINE_int32(math_num_threads, 1, + "Number of threads used to run math functions."); namespace paddle { namespace inference { void Init(const std::vector argv) { framework::InitGflags(argv); + operators::math::SetNumThreads(FLAGS_math_num_threads); // init devices std::vector devices; std::string token; diff --git a/paddle/fluid/operators/math/blas.h b/paddle/fluid/operators/math/blas.h index dabde43850d..b393139acd0 100644 --- a/paddle/fluid/operators/math/blas.h +++ b/paddle/fluid/operators/math/blas.h @@ -20,13 +20,16 @@ #ifdef PADDLE_WITH_MKLML #include #include +#include #include #endif #ifdef PADDLE_USE_OPENBLAS #include +#ifdef LAPACK_FOUND #include #endif +#endif #ifndef LAPACK_FOUND extern "C" { @@ -46,6 +49,18 @@ namespace paddle { namespace operators { namespace math { +static void SetNumThreads(int num_threads) { +#ifdef PADDLE_USE_OPENBLAS + int real_num_threads = num_threads > 1 ? num_threads : 1; + openblas_set_num_threads(real_num_threads); +#elif defined(PADDLE_WITH_MKLML) + int real_num_threads = num_threads > 1 ? num_threads : 1; + mkl_set_num_threads(real_num_threads); +#else + PADDLE_ENFORCE(false, "To be implemented."); +#endif +} + /** * Matrix Descriptor of a memory buffer. * diff --git a/paddle/fluid/operators/math/math_function.h b/paddle/fluid/operators/math/math_function.h index d4b0e17ed44..8b296b6a07c 100644 --- a/paddle/fluid/operators/math/math_function.h +++ b/paddle/fluid/operators/math/math_function.h @@ -21,8 +21,10 @@ limitations under the License. */ #ifdef PADDLE_USE_OPENBLAS #include +#ifdef LAPACK_FOUND #include #endif +#endif #ifndef LAPACK_FOUND extern "C" { diff --git a/paddle/math/MathFunctions.h b/paddle/math/MathFunctions.h index f3d8b1a39e8..854e4baa398 100644 --- a/paddle/math/MathFunctions.h +++ b/paddle/math/MathFunctions.h @@ -12,8 +12,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ -#ifndef MATHFUNCTIONS_H_ -#define MATHFUNCTIONS_H_ +#pragma once #ifdef PADDLE_WITH_MKLML #include @@ -21,7 +20,7 @@ limitations under the License. */ #include #endif -#if defined(PADDLE_USE_VECLIB) +#ifdef PADDLE_USE_VECLIB extern "C" { #include #include @@ -30,8 +29,10 @@ extern "C" { #ifdef PADDLE_USE_OPENBLAS #include +#ifdef LAPACK_FOUND #include #endif +#endif #ifndef LAPACK_FOUND extern "C" { @@ -126,5 +127,3 @@ template void vTanh(const int n, const T* a, T* r); } // namespace paddle - -#endif // MATHFUNCTIONS_H_ -- GitLab From 84246284b5ab6f2046c916ed356b2071e73eccc2 Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Mon, 21 May 2018 16:46:53 +0800 Subject: [PATCH 011/913] Fix dev image build on nodes of yq It seems that the `doxygen` package will remove system includes... It should be a bug of ubuntu or docker. Since we are not using doxygen now, just remove this package. --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index ea39efd00bb..8c742c3fee6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,7 +29,7 @@ RUN apt-get update && \ wget unzip unrar tar xz-utils bzip2 gzip coreutils ntp \ curl sed grep graphviz libjpeg-dev zlib1g-dev \ python-matplotlib gcc-4.8 g++-4.8 \ - automake locales clang-format swig doxygen cmake \ + automake locales clang-format swig cmake \ liblapack-dev liblapacke-dev \ clang-3.8 llvm-3.8 libclang-3.8-dev \ net-tools libtool ccache && \ -- GitLab From b044724db710dabf5bea23195b599eab3ba46bb3 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Tue, 22 May 2018 14:35:02 +0800 Subject: [PATCH 012/913] update fluid Train API param_path to checkpoint_config --- python/paddle/fluid/trainer.py | 50 +++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 7da123dd92e..01c40bb90e4 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -27,11 +27,8 @@ import parallel_executor from transpiler import distribute_transpiler __all__ = [ - 'Trainer', - 'BeginEpochEvent', - 'EndEpochEvent', - 'BeginStepEvent', - 'EndStepEvent', + 'Trainer', 'BeginEpochEvent', 'EndEpochEvent', 'BeginStepEvent', + 'EndStepEvent', 'CheckpointConfig' ] @@ -59,6 +56,17 @@ class EndStepEvent(object): self.metrics = metrics +class CheckpointConfig(object): + def __init__(self, + checkpoint_dir=None, + max_num_checkpoints=3, + save_interval_secs=600): + if checkpoint_dir is None: + self.checkpoint_dir = os.getcwd() + self.max_num_checkpoints = max_num_checkpoints + self.save_interval_secs = save_interval_secs + + def check_and_get_place(place): """ Check the type of place or get the default place @@ -97,9 +105,9 @@ class Trainer(object): def __init__(self, train_func, optimizer, - param_path=None, place=None, - parallel=False): + parallel=False, + checkpoint_config=None): self.__stop = False self.parallel = parallel # 1. we need to generate a framework.Program by calling @@ -108,6 +116,16 @@ class Trainer(object): if not isinstance(optimizer, opt_module.Optimizer): raise TypeError("The optimizer should be an instance of Optimizer") + # config for checkpoint + # only chief worker will save variables + self.chief = True + self.checkpoint = checkpoint_config + if self.checkpoint and not isinstance(self.checkpoint, + CheckpointConfig): + raise TypeError( + "The checkpoint_config shoule be an instance of CheckpointConfig" + ) + self.scope = core.Scope() self.startup_program = framework.Program() @@ -136,9 +154,10 @@ class Trainer(object): exe = executor.Executor(place) exe.run(self.startup_program) - if param_path: - # load params from param_path into scope - io.load_persistables(exe, dirname=param_path) + if self.checkpoint: + exe = executor.Executor(place) + io.load_checkpoint(exe, self.checkpoint.checkpoint_dir, + self.startup_program) def _transpile_nccl2_dist(self): # PADDLE_TRAINER_IPS @@ -146,6 +165,7 @@ class Trainer(object): self.nccl_id_var = None else: self.trainer_id = int(os.getenv("PADDLE_TRAINER_ID")) + self.chief = self.trainer_id == 0 port = os.getenv("PADDLE_PSERVER_PORT") worker_ips = os.getenv("PADDLE_TRAINER_IPS") worker_endpoints = [] @@ -194,6 +214,7 @@ class Trainer(object): # the unique trainer id, starting from 0, needed by trainer # only trainer_id = int(os.getenv("PADDLE_TRAINER_ID", "0")) + self.chief = self.trainer_id == 0 # the role, should be either PSERVER or TRAINER training_role = os.getenv("PADDLE_TRAINING_ROLE") with self._prog_and_scope_guard(): @@ -263,6 +284,14 @@ class Trainer(object): exe = executor.Executor(self.place) io.save_persistables(exe, dirname=param_path) + def _save_checkpoint(self): + if self.checkpoint and self.chief: + exe = executor.Executor(self.place) + io.save_checkpoint(exe, self.checkpoint.checkpoint_dir, + self.checkpoint.max_num_checkpoints, + self.checkpoint.save_interval_secs, + self.train_program) + @contextlib.contextmanager def _prog_and_scope_guard(self): with framework.program_guard( @@ -309,6 +338,7 @@ class Trainer(object): else: metrics = exe.run(feed=data, fetch_list=[]) event_handler(EndStepEvent(epoch_id, step_id, metrics)) + self._save_checkpoint() event_handler(EndEpochEvent(epoch_id)) def _test_by_executor(self, reader, feed_order, fetch_list): -- GitLab From dca0b6d9ccc5b770e78a0903839f2ed89d79be58 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Wed, 23 May 2018 19:50:25 +0800 Subject: [PATCH 013/913] restore param_path --- python/paddle/fluid/trainer.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 01c40bb90e4..24254b4980c 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -105,6 +105,7 @@ class Trainer(object): def __init__(self, train_func, optimizer, + param_path=None, place=None, parallel=False, checkpoint_config=None): @@ -120,8 +121,8 @@ class Trainer(object): # only chief worker will save variables self.chief = True self.checkpoint = checkpoint_config - if self.checkpoint and not isinstance(self.checkpoint, - CheckpointConfig): + if self.checkpoint and \ + not isinstance(self.checkpoint, CheckpointConfig): raise TypeError( "The checkpoint_config shoule be an instance of CheckpointConfig" ) @@ -159,6 +160,10 @@ class Trainer(object): io.load_checkpoint(exe, self.checkpoint.checkpoint_dir, self.startup_program) + if param_path: + # load params from param_path into scope + io.load_persistables(exe, dirname=param_path) + def _transpile_nccl2_dist(self): # PADDLE_TRAINER_IPS if "PADDLE_TRAINER_IPS" not in os.environ: -- GitLab From 85a41df32d2793da5c1c49b9c36a3781567f4a7e Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Wed, 16 May 2018 15:14:16 +0800 Subject: [PATCH 014/913] Init commit --- paddle/fluid/operators/random_crop_op.cc | 59 ++++++++ paddle/fluid/operators/random_crop_op.h | 167 +++++++++++++++++++++++ 2 files changed, 226 insertions(+) create mode 100644 paddle/fluid/operators/random_crop_op.cc create mode 100644 paddle/fluid/operators/random_crop_op.h diff --git a/paddle/fluid/operators/random_crop_op.cc b/paddle/fluid/operators/random_crop_op.cc new file mode 100644 index 00000000000..cb4bdde0eea --- /dev/null +++ b/paddle/fluid/operators/random_crop_op.cc @@ -0,0 +1,59 @@ +// Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include "paddle/fluid/operators/random_crop_op.h" +#include + +namespace paddle { +namespace operators { +class RandomCropOpMaker : public framework::OpProtoAndCheckerMaker { + public: + void Make() override { + AddInput("X", ""); + AddOutput("Y", ""); + AddInput("Seed", ""); + AddOutput("SeedOut", "").AsDispensable(); + AddAttr>("shape", ""); + } +}; + +class RandomCropOpInferShape : public framework::InferShapeBase { + public: + void operator()(framework::InferShapeContext* context) const override { + auto shape = context->Attrs().Get>("shape"); + auto x_dim = context->GetInputDim("X"); + PADDLE_ENFORCE_EQ(x_dim.size(), static_cast(shape.size())); + for (size_t i = 0; i < shape.size(); ++i) { + if (shape[i] == -1) { + shape[i] = static_cast(x_dim[i]); + } else { + PADDLE_ENFORCE_GE(x_dim[i], shape[i]); + } + } + context->SetOutputDim("Y", framework::make_ddim(shape)); + context->SetOutputDim("SeedOut", framework::make_ddim({1})); + } +}; + +} // namespace operators +} // namespace paddle + +namespace ops = paddle::operators; +namespace f = paddle::framework; +REGISTER_OPERATOR(random_crop, f::OperatorWithKernel, ops::RandomCropOpMaker, + ops::RandomCropOpInferShape); +template +using Kernel = ops::RandomCropKernel; + +REGISTER_OP_CPU_KERNEL(random_crop, Kernel, Kernel, Kernel, + Kernel, Kernel); diff --git a/paddle/fluid/operators/random_crop_op.h b/paddle/fluid/operators/random_crop_op.h new file mode 100644 index 00000000000..86a22227f3f --- /dev/null +++ b/paddle/fluid/operators/random_crop_op.h @@ -0,0 +1,167 @@ +// Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "paddle/fluid/framework/op_registry.h" +#include "paddle/fluid/operators/detail/safe_ref.h" +#include "paddle/fluid/platform/device_context.h" +#include "paddle/fluid/platform/for_range.h" +#include "thrust/random.h" + +namespace paddle { +namespace operators { + +template +struct Random; + +template <> +struct Random { + using Engine = std::minstd_rand; + + template + using UniformIntDist = std::uniform_int_distribution; +}; + +template <> +struct Random { + using Engine = thrust::minstd_rand; + + template + using UniformIntDist = thrust::uniform_int_distribution; +}; + +template +HOSTDEVICE inline void RandomCropImpl(const T* x, size_t* x_dim, T* out, + size_t* out_dim, int i, int rank, + int64_t prod_x_remain, + int64_t prod_out_remain, size_t* offset) { + size_t x_length = x_dim[rank]; + size_t out_length = out_dim[rank]; + + int64_t x_stride = prod_x_remain / x_length; + int64_t out_stride = prod_out_remain / out_length; + size_t offset_i = offset[i]; + if (x_stride == 1 && out_stride == 1) { + // In the final stage, copy from offset. + x += offset_i; + for (size_t i = 0; i < out_length; ++i) { + *out++ = *x++; + } + } else { + x += offset_i * x_stride; + for (size_t i = 0; i < out_length; ++i) { + RandomCropImpl(x, x_dim, out, out_dim, i + 1, rank, x_stride, + out_stride, offset); + x += x_stride; + out += out_stride; + } + } +} + +template +struct RandomCropFunctor { + const T* x_; + T* out_; + size_t x_dim_[9]; + size_t out_dim_[9]; + size_t prod_same_dim_; + + size_t prod_x_dim_; + size_t prod_out_dim_; + + int num_same_dim_; + int rank_; + + int64_t seed_; + + RandomCropFunctor(const T* x, T* out, int64_t seed) + : x_(x), + out_(out), + prod_same_dim_(1), + prod_x_dim_(1), + prod_out_dim_(1), + seed_(seed) { + std::fill(x_dim_, x_dim_ + sizeof(x_dim_) / sizeof(size_t), 0); + std::fill(out_dim_, out_dim_ + sizeof(out_dim_) / sizeof(size_t), 0); + } + + HOSTDEVICE void operator()(size_t i) { + typename Random::Engine engine(seed_); + engine.discard(i * (rank_ - num_same_dim_)); + + int64_t prod_x_unsame = (prod_x_dim_ / prod_same_dim_); + int64_t prod_out_unsame = (prod_out_dim_ / prod_same_dim_); + + const T* x = x_ + i * prod_x_unsame; + T* out = out_ + i * prod_out_unsame; + + size_t offset[9]; + for (int i = num_same_dim_; i < rank_; ++i) { + typename Random::template UniformIntDist dist( + 0, x_dim_[i] - out_dim_[i]); + offset[i] = dist(engine); + } + RandomCropImpl(x, x_dim_, out, out_dim_, num_same_dim_, rank_, + prod_x_unsame, prod_out_unsame, offset); + } +}; + +template +class RandomCropKernel : public framework::OpKernel { + public: + virtual void Compute(const framework::ExecutionContext& context) const { + int64_t seed = + *context.Input("Seed")->data(); + auto& x = detail::Ref(context.Input("X")); + auto& out = detail::Ref(context.Output("Out")); + + RandomCropFunctor functor{ + x.data(), out.mutable_data(context.GetPlace()), seed}; + + auto& out_dim = out.dims(); + auto& x_dim = x.dims(); + + auto rank = x_dim.size(); + while (rank-- > 0) { + functor.x_dim_[rank] = x_dim[rank]; + functor.out_dim_[rank] = out_dim[rank]; + functor.prod_x_dim_ *= x_dim[rank]; + functor.prod_out_dim_ *= out_dim[rank]; + if (x_dim[rank] != out_dim[rank]) { + PADDLE_ENFORCE_EQ(functor.prod_same_dim_, 1); + functor.num_same_dim_ = rank; + } else { + functor.prod_same_dim_ *= out_dim[rank]; + } + } + functor.rank_ = x_dim.size(); + + platform::ForRange for_range( + context.template device_context(), + functor.prod_same_dim_); + + for_range(functor); + + Random::Engine engine(seed); + engine.discard(functor.prod_same_dim_ * + (functor.rank_ - functor.num_same_dim_)); + + *context.Output("SeedOut")->mutable_data( + platform::CPUPlace()) = engine(); + } +}; + +} // namespace operators +} // namespace paddle -- GitLab From 98fb8e58fd4fb91423d414d67f2a2684b6841020 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 25 May 2018 11:57:44 +0800 Subject: [PATCH 015/913] test infer nlp --- paddle/fluid/inference/io.cc | 2 +- .../fluid/inference/tests/book/CMakeLists.txt | 1 + .../tests/book/test_inference_nlp.cc | 85 +++++++++++++++++++ paddle/fluid/inference/tests/test_helper.h | 3 + 4 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 paddle/fluid/inference/tests/book/test_inference_nlp.cc diff --git a/paddle/fluid/inference/io.cc b/paddle/fluid/inference/io.cc index 65db7c7b500..98780b6881c 100644 --- a/paddle/fluid/inference/io.cc +++ b/paddle/fluid/inference/io.cc @@ -117,7 +117,7 @@ std::unique_ptr Load(framework::Executor* executor, std::string program_desc_str; VLOG(3) << "loading model from " << model_filename; ReadBinaryFile(model_filename, &program_desc_str); - + // LOG(INFO) << program_desc_str; std::unique_ptr main_program( new framework::ProgramDesc(program_desc_str)); diff --git a/paddle/fluid/inference/tests/book/CMakeLists.txt b/paddle/fluid/inference/tests/book/CMakeLists.txt index dbb81462b82..90357f99d1d 100644 --- a/paddle/fluid/inference/tests/book/CMakeLists.txt +++ b/paddle/fluid/inference/tests/book/CMakeLists.txt @@ -35,6 +35,7 @@ inference_test(image_classification ARGS vgg resnet) inference_test(label_semantic_roles) inference_test(recognize_digits ARGS mlp conv) inference_test(recommender_system) +inference_test(nlp) #inference_test(rnn_encoder_decoder) #inference_test(understand_sentiment ARGS conv) inference_test(word2vec) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc new file mode 100644 index 00000000000..0d6d0adfb23 --- /dev/null +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -0,0 +1,85 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ + +#include "gflags/gflags.h" +#include "gtest/gtest.h" +#include "paddle/fluid/inference/tests/test_helper.h" + +DEFINE_string(dirname, "", "Directory of the inference model."); + +TEST(inference, understand_sentiment) { + if (FLAGS_dirname.empty()) { + LOG(FATAL) << "Usage: ./example --dirname=path/to/your/model"; + } + + LOG(INFO) << "FLAGS_dirname: " << FLAGS_dirname << std::endl; + std::string dirname = FLAGS_dirname; + + // 0. Call `paddle::framework::InitDevices()` initialize all the devices + // In unittests, this is done in paddle/testing/paddle_gtest_main.cc + paddle::framework::LoDTensor words; + + paddle::framework::LoD lod{{0, 83}}; + int64_t word_dict_len = 198392; + SetupLoDTensor(&words, lod, static_cast(0), + static_cast(word_dict_len - 1)); + /* + std::vector srcdata{ + 784, 784, 1550, 6463, 56, 75693, 6189, 784, 784, 1550, + 198391, 6463, 42468, 4376, 10251, 10760, 6189, 297, 396, 6463, + 6463, 1550, 198391, 6463, 22564, 1612, 291, 68, 164, 784, + 784, 1550, 198391, 6463, 13659, 3362, 42468, 6189, 2209, + 198391, + 6463, 2209, 2209, 198391, 6463, 2209, 1062, 3029, 1831, 3029, + 1065, 2281, 100, 11216, 1110, 56, 10869, 9811, 100, + 198391, + 6463, 100, 9280, 100, 288, 40031, 1680, 1335, 100, 1550, + 9280, 7265, 244, 1550, 198391, 6463, 1550, 198391, 6463, + 42468, + 4376, 10251, 10760}; + paddle::framework::LoD lod{{0, srcdata.size()}}; + words.set_lod(lod); + int64_t* pdata = + words.mutable_data({static_cast(srcdata.size()), 1}, + paddle::platform::CPUPlace()); + memcpy(pdata, srcdata.data(), words.numel() * sizeof(int64_t)); + */ + LOG(INFO) << "number of input size:" << words.numel(); + std::vector cpu_feeds; + cpu_feeds.push_back(&words); + + paddle::framework::LoDTensor output1; + std::vector cpu_fetchs1; + cpu_fetchs1.push_back(&output1); + + int repeat = 100; + // Run inference on CPU + TestInference(dirname, cpu_feeds, + cpu_fetchs1, repeat); + LOG(INFO) << output1.lod(); + LOG(INFO) << output1.dims(); + +#ifdef PADDLE_WITH_CUDA + paddle::framework::LoDTensor output2; + std::vector cpu_fetchs2; + cpu_fetchs2.push_back(&output2); + + // Run inference on CUDA GPU + TestInference(dirname, cpu_feeds, cpu_fetchs2); + LOG(INFO) << output2.lod(); + LOG(INFO) << output2.dims(); + + CheckError(output1, output2); +#endif +} diff --git a/paddle/fluid/inference/tests/test_helper.h b/paddle/fluid/inference/tests/test_helper.h index 01b8dc0be66..1f5551567c6 100644 --- a/paddle/fluid/inference/tests/test_helper.h +++ b/paddle/fluid/inference/tests/test_helper.h @@ -182,6 +182,9 @@ void TestInference(const std::string& dirname, "init_program", paddle::platform::DeviceContextPool::Instance().Get(place)); inference_program = InitProgram(&executor, scope, dirname, is_combined); + // std::string binary_str; + // inference_program->Proto()->SerializeToString(&binary_str); + // LOG(INFO) << binary_str; if (use_mkldnn) { EnableMKLDNN(inference_program); } -- GitLab From 602e28bf1c30cd72e7378d6dc1071423086bdc73 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 25 May 2018 14:38:01 +0800 Subject: [PATCH 016/913] use the actual data --- .../tests/book/test_inference_nlp.cc | 48 +++++++++---------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 0d6d0adfb23..27bdd5528ef 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -12,6 +12,8 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ +#include +#include #include "gflags/gflags.h" #include "gtest/gtest.h" #include "paddle/fluid/inference/tests/test_helper.h" @@ -29,32 +31,28 @@ TEST(inference, understand_sentiment) { // 0. Call `paddle::framework::InitDevices()` initialize all the devices // In unittests, this is done in paddle/testing/paddle_gtest_main.cc paddle::framework::LoDTensor words; - - paddle::framework::LoD lod{{0, 83}}; - int64_t word_dict_len = 198392; - SetupLoDTensor(&words, lod, static_cast(0), - static_cast(word_dict_len - 1)); /* - std::vector srcdata{ - 784, 784, 1550, 6463, 56, 75693, 6189, 784, 784, 1550, - 198391, 6463, 42468, 4376, 10251, 10760, 6189, 297, 396, 6463, - 6463, 1550, 198391, 6463, 22564, 1612, 291, 68, 164, 784, - 784, 1550, 198391, 6463, 13659, 3362, 42468, 6189, 2209, - 198391, - 6463, 2209, 2209, 198391, 6463, 2209, 1062, 3029, 1831, 3029, - 1065, 2281, 100, 11216, 1110, 56, 10869, 9811, 100, - 198391, - 6463, 100, 9280, 100, 288, 40031, 1680, 1335, 100, 1550, - 9280, 7265, 244, 1550, 198391, 6463, 1550, 198391, 6463, - 42468, - 4376, 10251, 10760}; - paddle::framework::LoD lod{{0, srcdata.size()}}; - words.set_lod(lod); - int64_t* pdata = - words.mutable_data({static_cast(srcdata.size()), 1}, - paddle::platform::CPUPlace()); - memcpy(pdata, srcdata.data(), words.numel() * sizeof(int64_t)); - */ + paddle::framework::LoD lod{{0, 83}}; + int64_t word_dict_len = 198392; + SetupLoDTensor(&words, lod, static_cast(0), + static_cast(word_dict_len - 1)); + */ + std::vector srcdata{ + 784, 784, 1550, 6463, 56, 75693, 6189, 784, 784, 1550, + 198391, 6463, 42468, 4376, 10251, 10760, 6189, 297, 396, 6463, + 6463, 1550, 198391, 6463, 22564, 1612, 291, 68, 164, 784, + 784, 1550, 198391, 6463, 13659, 3362, 42468, 6189, 2209, 198391, + 6463, 2209, 2209, 198391, 6463, 2209, 1062, 3029, 1831, 3029, + 1065, 2281, 100, 11216, 1110, 56, 10869, 9811, 100, 198391, + 6463, 100, 9280, 100, 288, 40031, 1680, 1335, 100, 1550, + 9280, 7265, 244, 1550, 198391, 6463, 1550, 198391, 6463, 42468, + 4376, 10251, 10760}; + paddle::framework::LoD lod{{0, srcdata.size()}}; + words.set_lod(lod); + int64_t* pdata = words.mutable_data( + {static_cast(srcdata.size()), 1}, paddle::platform::CPUPlace()); + memcpy(pdata, srcdata.data(), words.numel() * sizeof(int64_t)); + LOG(INFO) << "number of input size:" << words.numel(); std::vector cpu_feeds; cpu_feeds.push_back(&words); -- GitLab From ce20dfa236a0bf874d8580a7861b7a85dffdf74c Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 25 May 2018 15:17:06 +0800 Subject: [PATCH 017/913] enable more choices --- .../tests/book/test_inference_nlp.cc | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 27bdd5528ef..c942b43f174 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -19,6 +19,10 @@ limitations under the License. */ #include "paddle/fluid/inference/tests/test_helper.h" DEFINE_string(dirname, "", "Directory of the inference model."); +DEFINE_int32(repeat, 100, "Running the inference program repeat times"); +DEFINE_bool(use_mkldnn, false, "Use MKLDNN to run inference"); +DEFINE_bool(prepare_vars, true, "Prepare variables before executor"); +DEFINE_bool(prepare_context, true, "Prepare Context before executor"); TEST(inference, understand_sentiment) { if (FLAGS_dirname.empty()) { @@ -61,10 +65,29 @@ TEST(inference, understand_sentiment) { std::vector cpu_fetchs1; cpu_fetchs1.push_back(&output1); - int repeat = 100; // Run inference on CPU - TestInference(dirname, cpu_feeds, - cpu_fetchs1, repeat); + const bool model_combined = false; + if (FLAGS_prepare_vars) { + if (FLAGS_prepare_context) { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } else { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } + } else { + if (FLAGS_prepare_context) { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } else { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } + } LOG(INFO) << output1.lod(); LOG(INFO) << output1.dims(); -- GitLab From 400f5e7c3ce21ba63bee62a599a82c4a0bbc299d Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 25 May 2018 21:08:49 +0800 Subject: [PATCH 018/913] add threads test --- .../tests/book/test_inference_nlp.cc | 135 +++++++++--------- 1 file changed, 67 insertions(+), 68 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index c942b43f174..ca02e38ede7 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -14,6 +14,7 @@ limitations under the License. */ #include #include +#include // NOLINT #include "gflags/gflags.h" #include "gtest/gtest.h" #include "paddle/fluid/inference/tests/test_helper.h" @@ -31,76 +32,74 @@ TEST(inference, understand_sentiment) { LOG(INFO) << "FLAGS_dirname: " << FLAGS_dirname << std::endl; std::string dirname = FLAGS_dirname; - - // 0. Call `paddle::framework::InitDevices()` initialize all the devices - // In unittests, this is done in paddle/testing/paddle_gtest_main.cc - paddle::framework::LoDTensor words; - /* - paddle::framework::LoD lod{{0, 83}}; - int64_t word_dict_len = 198392; - SetupLoDTensor(&words, lod, static_cast(0), - static_cast(word_dict_len - 1)); - */ - std::vector srcdata{ - 784, 784, 1550, 6463, 56, 75693, 6189, 784, 784, 1550, - 198391, 6463, 42468, 4376, 10251, 10760, 6189, 297, 396, 6463, - 6463, 1550, 198391, 6463, 22564, 1612, 291, 68, 164, 784, - 784, 1550, 198391, 6463, 13659, 3362, 42468, 6189, 2209, 198391, - 6463, 2209, 2209, 198391, 6463, 2209, 1062, 3029, 1831, 3029, - 1065, 2281, 100, 11216, 1110, 56, 10869, 9811, 100, 198391, - 6463, 100, 9280, 100, 288, 40031, 1680, 1335, 100, 1550, - 9280, 7265, 244, 1550, 198391, 6463, 1550, 198391, 6463, 42468, - 4376, 10251, 10760}; - paddle::framework::LoD lod{{0, srcdata.size()}}; - words.set_lod(lod); - int64_t* pdata = words.mutable_data( - {static_cast(srcdata.size()), 1}, paddle::platform::CPUPlace()); - memcpy(pdata, srcdata.data(), words.numel() * sizeof(int64_t)); - - LOG(INFO) << "number of input size:" << words.numel(); - std::vector cpu_feeds; - cpu_feeds.push_back(&words); - - paddle::framework::LoDTensor output1; - std::vector cpu_fetchs1; - cpu_fetchs1.push_back(&output1); - - // Run inference on CPU const bool model_combined = false; - if (FLAGS_prepare_vars) { - if (FLAGS_prepare_context) { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } else { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } - } else { - if (FLAGS_prepare_context) { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } else { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } - } - LOG(INFO) << output1.lod(); - LOG(INFO) << output1.dims(); + int total_work = 100; + int num_threads = 10; + int work_per_thread = total_work / num_threads; + std::vector> infer_threads; + for (int i = 0; i < num_threads; ++i) { + infer_threads.emplace_back(new std::thread([&, i]() { + for (int j = 0; j < work_per_thread; ++j) { + // 0. Call `paddle::framework::InitDevices()` initialize all the devices + // In unittests, this is done in paddle/testing/paddle_gtest_main.cc + paddle::framework::LoDTensor words; + /* + paddle::framework::LoD lod{{0, 83}}; + int64_t word_dict_len = 198392; + SetupLoDTensor(&words, lod, static_cast(0), + static_cast(word_dict_len - 1)); + */ + std::vector srcdata{ + 784, 784, 1550, 6463, 56, 75693, 6189, 784, 784, + 1550, 198391, 6463, 42468, 4376, 10251, 10760, 6189, 297, + 396, 6463, 6463, 1550, 198391, 6463, 22564, 1612, 291, + 68, 164, 784, 784, 1550, 198391, 6463, 13659, 3362, + 42468, 6189, 2209, 198391, 6463, 2209, 2209, 198391, 6463, + 2209, 1062, 3029, 1831, 3029, 1065, 2281, 100, 11216, + 1110, 56, 10869, 9811, 100, 198391, 6463, 100, 9280, + 100, 288, 40031, 1680, 1335, 100, 1550, 9280, 7265, + 244, 1550, 198391, 6463, 1550, 198391, 6463, 42468, 4376, + 10251, 10760}; + paddle::framework::LoD lod{{0, srcdata.size()}}; + words.set_lod(lod); + int64_t* pdata = words.mutable_data( + {static_cast(srcdata.size()), 1}, + paddle::platform::CPUPlace()); + memcpy(pdata, srcdata.data(), words.numel() * sizeof(int64_t)); -#ifdef PADDLE_WITH_CUDA - paddle::framework::LoDTensor output2; - std::vector cpu_fetchs2; - cpu_fetchs2.push_back(&output2); + LOG(INFO) << "number of input size:" << words.numel(); + std::vector cpu_feeds; + cpu_feeds.push_back(&words); - // Run inference on CUDA GPU - TestInference(dirname, cpu_feeds, cpu_fetchs2); - LOG(INFO) << output2.lod(); - LOG(INFO) << output2.dims(); + paddle::framework::LoDTensor output1; + std::vector cpu_fetchs1; + cpu_fetchs1.push_back(&output1); - CheckError(output1, output2); -#endif + // Run inference on CPU + if (FLAGS_prepare_vars) { + if (FLAGS_prepare_context) { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } else { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } + } else { + if (FLAGS_prepare_context) { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } else { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } + } + LOG(INFO) << output1.lod(); + LOG(INFO) << output1.dims(); + } + })); + } } -- GitLab From 3e7ce5836f74339d78dacf59c6030c775174e04e Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Mon, 28 May 2018 13:42:55 +0800 Subject: [PATCH 019/913] stash --- paddle/fluid/operators/random_crop_op.cc | 48 +++-- paddle/fluid/operators/random_crop_op.h | 168 +++++++++--------- python/paddle/fluid/layers/nn.py | 126 ++++++------- .../tests/unittests/test_random_crop_op.py | 34 ++++ 4 files changed, 210 insertions(+), 166 deletions(-) create mode 100644 python/paddle/fluid/tests/unittests/test_random_crop_op.py diff --git a/paddle/fluid/operators/random_crop_op.cc b/paddle/fluid/operators/random_crop_op.cc index cb4bdde0eea..b9367f1d224 100644 --- a/paddle/fluid/operators/random_crop_op.cc +++ b/paddle/fluid/operators/random_crop_op.cc @@ -12,36 +12,52 @@ // See the License for the specific language governing permissions and // limitations under the License. #include "paddle/fluid/operators/random_crop_op.h" -#include namespace paddle { namespace operators { + +class RandomCropOp : public framework::OperatorWithKernel { + public: + using framework::OperatorWithKernel::OperatorWithKernel; + + protected: + framework::OpKernelType GetExpectedKernelType( + const framework::ExecutionContext& ctx) const override { + return framework::OpKernelType( + framework::ToDataType(ctx.Input("X")->type()), + ctx.device_context()); + } +}; + class RandomCropOpMaker : public framework::OpProtoAndCheckerMaker { public: void Make() override { AddInput("X", ""); - AddOutput("Y", ""); + AddOutput("Out", ""); AddInput("Seed", ""); AddOutput("SeedOut", "").AsDispensable(); AddAttr>("shape", ""); + AddComment(""); } }; class RandomCropOpInferShape : public framework::InferShapeBase { public: - void operator()(framework::InferShapeContext* context) const override { - auto shape = context->Attrs().Get>("shape"); - auto x_dim = context->GetInputDim("X"); - PADDLE_ENFORCE_EQ(x_dim.size(), static_cast(shape.size())); - for (size_t i = 0; i < shape.size(); ++i) { - if (shape[i] == -1) { - shape[i] = static_cast(x_dim[i]); - } else { - PADDLE_ENFORCE_GE(x_dim[i], shape[i]); - } + void operator()(framework::InferShapeContext* ctx) const override { + auto seed_dim = ctx->GetInputDim("Seed"); + PADDLE_ENFORCE(seed_dim.size() == 1 && seed_dim[0] == 1); + auto shape = ctx->Attrs().Get>("shape"); + auto x_dim = ctx->GetInputDim("X"); + PADDLE_ENFORCE_GT(x_dim.size(), static_cast(shape.size())); + auto out_dim = framework::vectorize2int(x_dim); + for (size_t i = 1; i <= shape.size(); ++i) { + size_t x_i = x_dim.size() - i; + size_t shape_i = shape.size() - i; + PADDLE_ENFORCE_GE(x_dim[x_i], shape[shape_i]); + out_dim[x_i] = shape[shape_i]; } - context->SetOutputDim("Y", framework::make_ddim(shape)); - context->SetOutputDim("SeedOut", framework::make_ddim({1})); + ctx->SetOutputDim("Out", framework::make_ddim(out_dim)); + ctx->SetOutputDim("SeedOut", framework::make_ddim({1})); } }; @@ -50,8 +66,8 @@ class RandomCropOpInferShape : public framework::InferShapeBase { namespace ops = paddle::operators; namespace f = paddle::framework; -REGISTER_OPERATOR(random_crop, f::OperatorWithKernel, ops::RandomCropOpMaker, - ops::RandomCropOpInferShape); +REGISTER_OPERATOR(random_crop, ops::RandomCropOp, ops::RandomCropOpMaker, + ops::RandomCropOpInferShape, f::EmptyGradOpMaker); template using Kernel = ops::RandomCropKernel; diff --git a/paddle/fluid/operators/random_crop_op.h b/paddle/fluid/operators/random_crop_op.h index 86a22227f3f..8764bd0bc78 100644 --- a/paddle/fluid/operators/random_crop_op.h +++ b/paddle/fluid/operators/random_crop_op.h @@ -14,11 +14,14 @@ #pragma once +#include #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/operators/detail/safe_ref.h" #include "paddle/fluid/platform/device_context.h" #include "paddle/fluid/platform/for_range.h" -#include "thrust/random.h" +#ifdef PADDLE_WITH_CUDA +#include +#endif namespace paddle { namespace operators { @@ -34,6 +37,7 @@ struct Random { using UniformIntDist = std::uniform_int_distribution; }; +#ifdef PADDLE_WITH_CUDA template <> struct Random { using Engine = thrust::minstd_rand; @@ -41,29 +45,31 @@ struct Random { template using UniformIntDist = thrust::uniform_int_distribution; }; +#endif template -HOSTDEVICE inline void RandomCropImpl(const T* x, size_t* x_dim, T* out, - size_t* out_dim, int i, int rank, - int64_t prod_x_remain, - int64_t prod_out_remain, size_t* offset) { - size_t x_length = x_dim[rank]; - size_t out_length = out_dim[rank]; - - int64_t x_stride = prod_x_remain / x_length; - int64_t out_stride = prod_out_remain / out_length; - size_t offset_i = offset[i]; - if (x_stride == 1 && out_stride == 1) { - // In the final stage, copy from offset. +HOSTDEVICE inline void StridedMemcpy(const T* x, const size_t* x_dims, T* out, + const size_t* out_dims, int i, int rank, + size_t prod_x_remain, + size_t prod_out_remain, + const size_t* offsets) { + size_t x_dim_i = x_dims[i]; + size_t out_dim_i = out_dims[i]; + size_t x_stride = prod_x_remain / x_dim_i; + size_t out_stride = prod_out_remain / out_dim_i; + size_t offset_i = offsets[i]; + + if (i == rank - 1) { + PADDLE_ENFORCE(x_stride == 1 && out_stride == 1); x += offset_i; - for (size_t i = 0; i < out_length; ++i) { + for (size_t j = 0; j < out_dim_i; ++j) { *out++ = *x++; } } else { x += offset_i * x_stride; - for (size_t i = 0; i < out_length; ++i) { - RandomCropImpl(x, x_dim, out, out_dim, i + 1, rank, x_stride, - out_stride, offset); + for (size_t j = 0; j < x_dim_i; ++j) { + StridedMemcpy(x, x_dims, out, out_dims, i + 1, rank, x_stride, + out_stride, offsets); x += x_stride; out += out_stride; } @@ -74,94 +80,96 @@ template struct RandomCropFunctor { const T* x_; T* out_; - size_t x_dim_[9]; - size_t out_dim_[9]; - size_t prod_same_dim_; - - size_t prod_x_dim_; - size_t prod_out_dim_; - - int num_same_dim_; + size_t x_dims_[9]; + size_t out_dims_[9]; + int num_batchsize_dims_; int rank_; - int64_t seed_; - RandomCropFunctor(const T* x, T* out, int64_t seed) + size_t prod_x_dims_; + size_t prod_out_dims_; + size_t prod_batchsize_dims_; + size_t prod_x_ins_dims_; + size_t prod_out_ins_dims_; + + RandomCropFunctor(const T* x, T* out, const framework::DDim& x_dims, + const framework::DDim& out_dims, int num_batchsize_dims, + int64_t seed) : x_(x), out_(out), - prod_same_dim_(1), - prod_x_dim_(1), - prod_out_dim_(1), + num_batchsize_dims_(num_batchsize_dims), + rank_(x_dims.size()), seed_(seed) { - std::fill(x_dim_, x_dim_ + sizeof(x_dim_) / sizeof(size_t), 0); - std::fill(out_dim_, out_dim_ + sizeof(out_dim_) / sizeof(size_t), 0); + PADDLE_ENFORCE_EQ(x_dims.size(), out_dims.size()); + PADDLE_ENFORCE_GT(rank_, num_batchsize_dims_); + prod_batchsize_dims_ = 1; + prod_x_ins_dims_ = 1; + prod_out_ins_dims_ = 1; + for (size_t i = 0; i < rank_; ++i) { + size_t x_dim_i = x_dims[i]; + size_t out_dim_i = out_dims[i]; + x_dims_[i] = x_dim_i; + out_dims_[i] = out_dim_i; + if (i < num_batchsize_dims_) { + PADDLE_ENFORCE_EQ(x_dim_i, out_dim_i); + prod_batchsize_dims_ *= x_dim_i; + } else { + prod_x_ins_dims_ *= x_dim_i; + prod_out_ins_dims_ *= out_dim_i; + } + } + prod_x_dims_ = prod_batchsize_dims_ * prod_x_ins_dims_; + prod_out_dims_ = prod_batchsize_dims_ * prod_out_ins_dims_; } - HOSTDEVICE void operator()(size_t i) { + HOSTDEVICE void operator()(size_t ins_idx) { typename Random::Engine engine(seed_); - engine.discard(i * (rank_ - num_same_dim_)); - - int64_t prod_x_unsame = (prod_x_dim_ / prod_same_dim_); - int64_t prod_out_unsame = (prod_out_dim_ / prod_same_dim_); - - const T* x = x_ + i * prod_x_unsame; - T* out = out_ + i * prod_out_unsame; - - size_t offset[9]; - for (int i = num_same_dim_; i < rank_; ++i) { + engine.discard(ins_idx * (rank_ - num_batchsize_dims_)); + size_t offsets[9]; + for (int i = num_batchsize_dims_; i < rank_; ++i) { typename Random::template UniformIntDist dist( - 0, x_dim_[i] - out_dim_[i]); - offset[i] = dist(engine); + 0, x_dims_[i] - out_dims_[i]); + offsets[i] = dist(engine); } - RandomCropImpl(x, x_dim_, out, out_dim_, num_same_dim_, rank_, - prod_x_unsame, prod_out_unsame, offset); + + const T* x = x_ + ins_idx * prod_x_ins_dims_; + T* out = out_ + ins_idx * prod_out_ins_dims_; + + StridedMemcpy(x, x_dims_ + num_batchsize_dims_, out, + out_dims_ + num_batchsize_dims_, 0, + rank_ - num_batchsize_dims_, prod_x_ins_dims_, + prod_out_ins_dims_, offsets); } }; template class RandomCropKernel : public framework::OpKernel { public: - virtual void Compute(const framework::ExecutionContext& context) const { - int64_t seed = - *context.Input("Seed")->data(); - auto& x = detail::Ref(context.Input("X")); - auto& out = detail::Ref(context.Output("Out")); - - RandomCropFunctor functor{ - x.data(), out.mutable_data(context.GetPlace()), seed}; - - auto& out_dim = out.dims(); - auto& x_dim = x.dims(); - - auto rank = x_dim.size(); - while (rank-- > 0) { - functor.x_dim_[rank] = x_dim[rank]; - functor.out_dim_[rank] = out_dim[rank]; - functor.prod_x_dim_ *= x_dim[rank]; - functor.prod_out_dim_ *= out_dim[rank]; - if (x_dim[rank] != out_dim[rank]) { - PADDLE_ENFORCE_EQ(functor.prod_same_dim_, 1); - functor.num_same_dim_ = rank; - } else { - functor.prod_same_dim_ *= out_dim[rank]; - } - } - functor.rank_ = x_dim.size(); - + virtual void Compute(const framework::ExecutionContext& ctx) const { + int64_t seed = *ctx.Input("Seed")->data(); + auto shape = ctx.Attr>("shape"); + auto& x = detail::Ref(ctx.Input("X")); + auto& out = detail::Ref(ctx.Output("Out")); + + int num_batchsize_dims = x.dims().size() - shape.size(); + RandomCropFunctor functor( + x.data(), out.mutable_data(ctx.GetPlace()), x.dims(), out.dims(), + num_batchsize_dims, seed); platform::ForRange for_range( - context.template device_context(), - functor.prod_same_dim_); + ctx.template device_context(), + functor.prod_batchsize_dims_); for_range(functor); Random::Engine engine(seed); - engine.discard(functor.prod_same_dim_ * - (functor.rank_ - functor.num_same_dim_)); - - *context.Output("SeedOut")->mutable_data( + engine.discard(functor.prod_batchsize_dims_ * + (functor.rank_ - functor.num_batchsize_dims_)); + *ctx.Output("SeedOut")->mutable_data( platform::CPUPlace()) = engine(); } }; +// TODO(fengjiayi): Backward of random crop op + } // namespace operators } // namespace paddle diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index 04ee8ac9aee..42e26dd3665 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -24,64 +24,19 @@ from tensor import concat import utils __all__ = [ - 'fc', - 'embedding', - 'dynamic_lstm', - 'dynamic_lstmp', - 'dynamic_gru', - 'gru_unit', - 'linear_chain_crf', - 'crf_decoding', - 'cos_sim', - 'cross_entropy', - 'square_error_cost', - 'chunk_eval', - 'sequence_conv', - 'conv2d', - 'sequence_pool', - 'sequence_softmax', - 'softmax', - 'pool2d', - 'batch_norm', - 'beam_search_decode', - 'conv2d_transpose', - 'sequence_expand', - 'lstm_unit', - 'reduce_sum', - 'reduce_mean', - 'reduce_max', - 'reduce_min', - 'reduce_prod', - 'sequence_first_step', - 'sequence_last_step', - 'dropout', - 'split', - 'ctc_greedy_decoder', - 'edit_distance', - 'l2_normalize', - 'matmul', - 'topk', - 'warpctc', - 'sequence_reshape', - 'transpose', - 'im2sequence', - 'nce', - 'beam_search', - 'row_conv', - 'multiplex', - 'layer_norm', - 'softmax_with_cross_entropy', - 'smooth_l1', - 'one_hot', - 'autoincreased_step_counter', - 'reshape', - 'lod_reset', - 'lrn', - 'pad', - 'label_smooth', - 'roi_pool', - 'dice_loss', - 'bilinear_interp', + 'fc', 'embedding', 'dynamic_lstm', 'dynamic_lstmp', 'dynamic_gru', + 'gru_unit', 'linear_chain_crf', 'crf_decoding', 'cos_sim', 'cross_entropy', + 'square_error_cost', 'chunk_eval', 'sequence_conv', 'conv2d', + 'sequence_pool', 'sequence_softmax', 'softmax', 'pool2d', 'batch_norm', + 'beam_search_decode', 'conv2d_transpose', 'sequence_expand', 'lstm_unit', + 'reduce_sum', 'reduce_mean', 'reduce_max', 'reduce_min', 'reduce_prod', + 'sequence_first_step', 'sequence_last_step', 'dropout', 'split', + 'ctc_greedy_decoder', 'edit_distance', 'l2_normalize', 'matmul', 'topk', + 'warpctc', 'sequence_reshape', 'transpose', 'im2sequence', 'nce', + 'beam_search', 'row_conv', 'multiplex', 'layer_norm', + 'softmax_with_cross_entropy', 'smooth_l1', 'one_hot', + 'autoincreased_step_counter', 'reshape', 'lod_reset', 'lrn', 'pad', + 'label_smooth', 'roi_pool', 'dice_loss', 'bilinear_interp', 'random_crop' ] @@ -154,7 +109,8 @@ def fc(input, Examples: .. code-block:: python - data = fluid.layers.data(name="data", shape=[32, 32], dtype="float32") + data = fluid.layers.data( + name="data", shape=[32, 32], dtype="float32") fc = fluid.layers.fc(input=data, size=1000, act="tanh") """ @@ -349,7 +305,8 @@ def dynamic_lstm(input, cell_activation(str): The activation for cell output. Choices = ["sigmoid", "tanh", "relu", "identity"], default "tanh". candidate_activation(str): The activation for candidate hidden state. - Choices = ["sigmoid", "tanh", "relu", "identity"], + Choices = ["sigmoid", "tanh", + "relu", "identity"], default "tanh". dtype(str): Data type. Choices = ["float32", "float64"], default "float32". name(str|None): A name for this layer(optional). If set None, the layer @@ -516,10 +473,12 @@ def dynamic_lstmp(input, cell_activation(str): The activation for cell output. Choices = ["sigmoid", "tanh", "relu", "identity"], default "tanh". candidate_activation(str): The activation for candidate hidden state. - Choices = ["sigmoid", "tanh", "relu", "identity"], + Choices = ["sigmoid", "tanh", + "relu", "identity"], default "tanh". proj_activation(str): The activation for projection output. - Choices = ["sigmoid", "tanh", "relu", "identity"], + Choices = ["sigmoid", "tanh", + "relu", "identity"], default "tanh". dtype(str): Data type. Choices = ["float32", "float64"], default "float32". name(str|None): A name for this layer(optional). If set None, the layer @@ -2171,7 +2130,8 @@ def reduce_mean(input, dim=None, keep_dim=False, name=None): fluid.layers.reduce_mean(x) # [0.4375] fluid.layers.reduce_mean(x, dim=0) # [0.15, 0.25, 0.55, 0.8] fluid.layers.reduce_mean(x, dim=-1) # [0.475, 0.4] - fluid.layers.reduce_mean(x, dim=1, keep_dim=True) # [[0.475], [0.4]] + fluid.layers.reduce_mean( + x, dim=1, keep_dim=True) # [[0.475], [0.4]] # x is a Tensor variable with shape [2, 2, 2] and elements as below: # [[[1.0, 2.0], [3.0, 4.0]], @@ -2390,7 +2350,8 @@ def split(input, num_or_sections, dim=-1, name=None): x0.shape # [3, 3, 5] x1.shape # [3, 3, 5] x2.shape # [3, 3, 5] - x0, x1, x2 = fluid.layers.split(x, num_or_sections=[2, 3, 4], dim=1) + x0, x1, x2 = fluid.layers.split( + x, num_or_sections=[2, 3, 4], dim=1) x0.shape # [3, 2, 5] x1.shape # [3, 3, 5] x2.shape # [3, 4, 5] @@ -3300,7 +3261,8 @@ def softmax_with_cross_entropy(logits, label, soft_label=False): data = fluid.layers.data(name='data', shape=[128], dtype='float32') label = fluid.layers.data(name='label', shape=[1], dtype='int64') fc = fluid.layers.fc(input=data, size=100) - out = fluid.layers.softmax_with_cross_entropy(logits=fc, label=label) + out = fluid.layers.softmax_with_cross_entropy( + logits=fc, label=label) """ helper = LayerHelper('softmax_with_cross_entropy', **locals()) softmax = helper.create_tmp_variable(dtype=logits.dtype) @@ -3347,7 +3309,8 @@ def smooth_l1(x, y, inside_weight=None, outside_weight=None, sigma=None): .. code-block:: python data = fluid.layers.data(name='data', shape=[128], dtype='float32') - label = fluid.layers.data(name='label', shape=[100], dtype='float32') + label = fluid.layers.data( + name='label', shape=[100], dtype='float32') fc = fluid.layers.fc(input=data, size=100) out = fluid.layers.smooth_l1(x=fc, y=label) """ @@ -3669,7 +3632,8 @@ def lrn(input, n=5, k=1.0, alpha=1e-4, beta=0.75, name=None): Examples: .. code-block:: python - data = fluid.layers.data(name="data", shape=[3, 112, 112], dtype="float32") + data = fluid.layers.data( + name="data", shape=[3, 112, 112], dtype="float32") lrn = fluid.layers.lrn(input=data) """ helper = LayerHelper('lrn', **locals()) @@ -3922,10 +3886,10 @@ def bilinear_interp(input, out_h, out_w, name=None): Bilinear interpolation is an extension of linear interpolation for interpolating functions of two variables (e.g. H-direction and W-direction in this layer) on a rectilinear 2D grid. - + For details, please refer to Wikipedia: https://en.wikipedia.org/wiki/Bilinear_interpolation - + Args: input (Variable): The input tensor of bilinear interpolation, This is a 4-D tensor of the shape @@ -3938,7 +3902,7 @@ def bilinear_interp(input, out_h, out_w, name=None): Returns: out (Variable): The output is a 4-D tensor of the shape (num_batches, channls, out_h, out_w). - + Examples: .. code-block:: python @@ -3954,3 +3918,25 @@ def bilinear_interp(input, out_h, out_w, name=None): attrs={"out_h": out_h, "out_w": out_w}) return out + + +def random_crop(input, shape, seed=0): + helper = LayerHelper("random_crop", **locals()) + dtype = helper.input_dtype() + out = helper.create_tmp_variable(dtype) + if isinstance(seed, int): + seed = helper.create_global_variable( + persistable=True, shape=[1], dtype="int32") + helper.set_variable_initializer( + var=seed, initializer=Constant(value=seed)) + elif not isinstance(seed, Variable): + raise ValueError("'seed' must be a Variable or an int.") + seed_out = helper.create_tmp_variable(dtype="int32") + helper.append_op( + type="random_crop", + inputs={"X": input, + "Seed": seed}, + outputs={"Out": out, + "SeedOut": seed_out}, + attrs={"shape": shape}) + return out diff --git a/python/paddle/fluid/tests/unittests/test_random_crop_op.py b/python/paddle/fluid/tests/unittests/test_random_crop_op.py new file mode 100644 index 00000000000..e609e2c99fb --- /dev/null +++ b/python/paddle/fluid/tests/unittests/test_random_crop_op.py @@ -0,0 +1,34 @@ +# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest +import numpy as np +import paddle.fluid.core as core +from op_test import OpTest + + +class TestRandomCropOp(OpTest): + def setUp(self): + to_crop = np.random.random((1, 10, 15)).astype("float32") + self.op_type = "random_crop" + self.inputs = {'X': to_crop, 'Seed': np.array([10])} + self.outputs = {'Out': np.array([1, 2, 3]), 'SeedOut': np.array([2])} + self.attrs = {'shape': [5, 5]} + + def test_check_output(self): + self.check_output() + + +if __name__ == "__main__": + unittest.main() -- GitLab From d44dbc4a5217fe1b3721824d83351b776f7d64c5 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Mon, 28 May 2018 15:42:20 +0800 Subject: [PATCH 020/913] fix errors --- paddle/fluid/operators/random_crop_op.h | 2 +- .../paddle/fluid/tests/unittests/op_test.py | 2 ++ .../tests/unittests/test_random_crop_op.py | 20 +++++++++++++++---- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/paddle/fluid/operators/random_crop_op.h b/paddle/fluid/operators/random_crop_op.h index 8764bd0bc78..a34294f5eeb 100644 --- a/paddle/fluid/operators/random_crop_op.h +++ b/paddle/fluid/operators/random_crop_op.h @@ -129,7 +129,7 @@ struct RandomCropFunctor { for (int i = num_batchsize_dims_; i < rank_; ++i) { typename Random::template UniformIntDist dist( 0, x_dims_[i] - out_dims_[i]); - offsets[i] = dist(engine); + offsets[i - num_batchsize_dims_] = dist(engine); } const T* x = x_ + ins_idx * prod_x_ins_dims_; diff --git a/python/paddle/fluid/tests/unittests/op_test.py b/python/paddle/fluid/tests/unittests/op_test.py index 709b4bf2fcf..9f9ee271f82 100644 --- a/python/paddle/fluid/tests/unittests/op_test.py +++ b/python/paddle/fluid/tests/unittests/op_test.py @@ -336,6 +336,8 @@ class OpTest(unittest.TestCase): actual_t = np.array(actual) expect = self.outputs[out_name] expect_t = expect[0] if isinstance(expect, tuple) else expect + import pdb + pdb.set_trace() self.assertTrue( np.allclose( actual_t, expect_t, atol=atol), diff --git a/python/paddle/fluid/tests/unittests/test_random_crop_op.py b/python/paddle/fluid/tests/unittests/test_random_crop_op.py index e609e2c99fb..1c708d0386d 100644 --- a/python/paddle/fluid/tests/unittests/test_random_crop_op.py +++ b/python/paddle/fluid/tests/unittests/test_random_crop_op.py @@ -20,14 +20,26 @@ from op_test import OpTest class TestRandomCropOp(OpTest): def setUp(self): - to_crop = np.random.random((1, 10, 15)).astype("float32") + to_crop = np.array([[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]] * + 5).astype("float32") + self.possible_res = [ + np.array([[1, 2, 3], [5, 6, 7]]), np.array([[2, 3, 4], [6, 7, 8]]), + np.array([[5, 6, 7], [9, 10, 11]]), + np.array([[6, 7, 8], [10, 11, 12]]) + ] self.op_type = "random_crop" self.inputs = {'X': to_crop, 'Seed': np.array([10])} - self.outputs = {'Out': np.array([1, 2, 3]), 'SeedOut': np.array([2])} - self.attrs = {'shape': [5, 5]} + self.outputs = {'Out': np.array([]), 'SeedOut': np.array([])} + self.attrs = {'shape': [2, 3]} def test_check_output(self): - self.check_output() + self.check_output_customized(self.verify_output) + + def verify_output(self, outs): + out = np.array(outs[1]) + for ins in out[:]: + is_equal = [(ins == res).all() for res in self.possible_res] + self.assertIn(True, is_equal) if __name__ == "__main__": -- GitLab From 20c8ff0f5f85b372ca92d7c81558fbe2a187d1fd Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Mon, 28 May 2018 15:58:46 +0800 Subject: [PATCH 021/913] Add comments --- paddle/fluid/operators/random_crop_op.cc | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/paddle/fluid/operators/random_crop_op.cc b/paddle/fluid/operators/random_crop_op.cc index b9367f1d224..d92b8bbbb58 100644 --- a/paddle/fluid/operators/random_crop_op.cc +++ b/paddle/fluid/operators/random_crop_op.cc @@ -32,12 +32,18 @@ class RandomCropOp : public framework::OperatorWithKernel { class RandomCropOpMaker : public framework::OpProtoAndCheckerMaker { public: void Make() override { - AddInput("X", ""); - AddOutput("Out", ""); - AddInput("Seed", ""); - AddOutput("SeedOut", "").AsDispensable(); - AddAttr>("shape", ""); - AddComment(""); + AddInput("X", "A batch of instances to random crop."); + AddInput("Seed", "The random seed."); + AddOutput("Out", "The cropped instance batch."); + AddOutput("SeedOut", "The random seed after random cropping.") + .AsDispensable(); + AddAttr>("shape", "The shape of a cropped instance."); + AddComment(R"DOC( + This operator takes a batch of instance, and do random cropping on each instance. + It means that cropping positions differs on each instance, which is determined + by an uniform random generator. All cropped instances have the same shape, which + is determined by the operator's attribute 'shape'. + )DOC"); } }; -- GitLab From 291f7f8ce5d9b1a7b4d0d4840bee946d9a6d64c5 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Mon, 28 May 2018 16:37:53 +0800 Subject: [PATCH 022/913] fix a error --- python/paddle/fluid/tests/unittests/op_test.py | 2 -- tools/codestyle/docstring_checker.pyc | Bin 0 -> 11769 bytes 2 files changed, 2 deletions(-) create mode 100644 tools/codestyle/docstring_checker.pyc diff --git a/python/paddle/fluid/tests/unittests/op_test.py b/python/paddle/fluid/tests/unittests/op_test.py index b7e62533b33..b611470fa1f 100644 --- a/python/paddle/fluid/tests/unittests/op_test.py +++ b/python/paddle/fluid/tests/unittests/op_test.py @@ -336,8 +336,6 @@ class OpTest(unittest.TestCase): actual_t = np.array(actual) expect = self.outputs[out_name] expect_t = expect[0] if isinstance(expect, tuple) else expect - import pdb - pdb.set_trace() self.assertTrue( np.allclose( actual_t, expect_t, atol=atol), diff --git a/tools/codestyle/docstring_checker.pyc b/tools/codestyle/docstring_checker.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49f07e8e6c0b4d4c7a253c2763e5fb5e7c8c668c GIT binary patch literal 11769 zcmdT~Npl;=7488*kbt;or54N9SSu6>B(->BXxWq~%SvoYHISncEfx%6hUAa~3^+Zo zNn5H^N~tWz+>(Egs#N8a%FUHSeDg8+0m(6^98x(YuH^e(4+bDbJ5t${9Fo)Qe!ahb zdw2F9L&eokcf4O$$xjyl-^8bXg~U~A4ymQwj0!9@hm6T*)LcgLSrueeBd6was?n$B z`jo{MIThqpqhHPSn{uBD22`V<<_e~a(TZxWsNB5zF{ap|+sfwcXa9YsaBoC&+HC$4g<;cEh@D zTAtF#tOwqh{~!F!mNFP7=75)L+DnFs`%rGjexOSht4EMrpGN=CcatWjg8f`?q1Fy! z*RRKQw&q7XUcsmLBe}2CG6u1jd1&#EXsXD}dN&$4-lDH#tX`JvMS3h*)=pGLNo6&u zj0xPlZ?l>_Y68EBkxIxZN%T$R#^2Kzb^Kn1Wn_>oIzY?0b@Yv00!+W>=5#rSX7y~fHYlOoiP5e@-jYs2Z@Ix z$4Mg<8X^T`d8*9hl#6^${TS5Nr`$dP<~xMaPeNg{frL;%P#_XQipr^!ikxB+NxA~N z9@Mn9m%_l+cD&@-ty)Ctz@8Fnu)V+&WQ-MU{GSWoNxd7*h0|#*kDb)k77MU|*t@eV2r*T5ns^7#BSC4T{POPjEE8QX& zdxbUANESO}3d)@77BansY;Pf_rhMsBmBXx*$TG9C`RQm;3x!-=t2J5y=%^ocju*G1 zrjALZPR-Yz76x#5YSOKSZh|9c5TI?wk3-Hqg->&SWep|2f+nE^qKA7*DS>DLb{=F& z5BD?V;|DplR#Nvt7&&DFw31QLR8l_j0AQi)SI}j3pSq1wrNm)pfjOmo(uW}m0t2rp zIF#KBmJHiT)^EDtSfQoB`_K!7(b_y*?SJfTGp=N^MK7+()MHqy<_Re)Zw*>|tfDoX zsS`^)Wm1_C)p_jB2)>7C2^1|u@+tKIOg}^%uJu_!*v$MFL?Y0)41}V(PsLevzmLd; zC|I#n^sZVxrkZ9jX-T~2*=89cBFC1|$CMTK^J*c(q0v66%}ebsDL1yL9gy1JQ-*9& zTa?;AD|g4nT1<^o9aINbaw^JL+@k?y)xm?ym`E0HnMJ$9T+mmvxy?E(1ULekDdLFfe%RFZLKHSAyF^rxNGt97l3mj_Iqs~Ta2PVeUT5tN|Jge2!IqP0 ziDOU}mJF$#o}~VyoU9pLXE&h+dZeWhlI)etwQ;ChQQNcq1?hl+5@D;`^}46^LOTf7 zy8{SWhnOqUqKJhhG#O5o=nNAPR5P8K9O^wSl0>#Q>Fgqa8mF_*Nr&h&d_{tE4zfr! zZ$wSENTwGN5R1}i1%3?02}#8T5E(6J51Sl7Vw%LYDAphO@sbf(lw!43%WJwZS6YSe zsWz3qTFP7KFNZ2vLp<6zVY3WyoCETw;PPLk$>+NdKwTVTC`Dq&bLCPBUxd z2Nitj{ps>tt^Dys`L$|!{>4lz`lMweIyivga>77FWOfY; zuD&GfyBLM-mP5l`w7F5(ROZIyYiu+7Ixk=c)oQcW@Tygj zT-9nLblU-olt$Gmq)@f$3?VNPP-L8Qg2j_eh%<*+>*FSyOeucfV-9Z9m(ub?itDKRqk2I>{D)8GNW{p#)-VENM=H9^nT*fQu(*m z=|FZIQMl1!D~Rh!wQkxc4zyHh5)Hs*y4~flS#E{er@2xK$_ruCsKsUIM&ocE+thT$ zTZjAUKGKe?g~`fhwsOZSCb@UPqSv(z*o~%VQ+soP9k&iH|0VmJfVJ2NSejQB9e)m8 z;19d@M@wGQuGxAijN;zDKm)or;M4o?Ud$N6__tr1m^i1&AT!;W+|bjolVTgTfK3y? zK00>PZh4U(x@Klnlv$xS&)l=#M@Ok8W27^m*RNsb=^(IyP;I7y{p3eBZ4QkE>)5{M z*>q=te{9h2jeBU?DYA}oEeLohTA$y53T^^b9NwH4auZe& z3^ACHM;P@KXi?J543 zIm<{|368d!{>#TmXMa_kw=CAr?+QNsBP7P0qb5eY%J^?gGwJ~3>k6E%Q#5KTgyodJ zCm|y^<>=3leCR`@R2SM!@q-X= zGxAB>ZzZ7APf2LR1o%=nXZjJRNBo*n;^mC71m6evvt=q$GhtnCB_V>X-JPz3V~axr z)&!xwRSR^_2tK9Pti-4!f+s>vbg@~pDDF6Yb`7kv-M@71eso)bWu$cv*xT>Uj zVS%NZt{P1$q-_LxRk-`YUtyESXQZeo=SOd#a zsg(hxFDXb%1A&C3Oogv8FX)BY3O7iw=fc-PFQPGHHG#VRj)x-x#kq(Hh18RJWJvj{vAu|rOb|UO6?)sIGK85H-Cd_iIKQu z=n~BKM2968Qk|M`Vbi?dfHK3DmGcr4idp9^B(o)k;*6HM#+)cEUJe<0Bd!AKx|Z`c zfkK?uk?RJ@%wYRiYcqL~$uT4%4C?I&dXDB@37~Bh>kgfxPw^$%X+-qWU}nfV49#@d z8ZhB*3U+QP%a-d%3|)dke+ECLDAajSs1tS)Kna&4YCLYBIrUR$dGLNl{RBOBs2Mb2 ztGrw!yk{sIaujiHIIRPmfU#=G0|vG;7KMS(A@z{{Ba)8v?9iYI#wJ!#30DmElznmH zG(A1IIA|^2P1nwO0!v9usE)bR9pQ)_-*vwm;RsvKqxa_!#fNj~k za|KiW317lJ1%#AyncY^-I*R{?@ja?Gq1ZZ79kicHb!^J;6g-TFy$p1|N9cn)PzR0x z8-X13vWRc+3#dYrC$EOUGQ8~p%ixklScV!!{{czY#^_<14rfSMpyR*Wr^Zg%T}ppU zUV)2l+!OHJcCd@kJCiYo?tCv1(TgyWbR)4iB9)&*t#}>SpSjt1o9(-Dc`MpMi|t_< zX9gqxjid9PNA*+aK8NoB1TIL1{6GtZ0+$4)e~2U&mA^J2=W9XJpP<^u@j~r`c1SfD z-fyh#{mt&=5j|o6N9+p&>XP>?@IGP4(a7 zVm%8Yq8R{d!!D&!5?BIh-VX0A;|8%yxL;pHW6R3n0fKsJqbV8po{Q`MyyS_rZi>(MVN^^r!?5T3^$Y5Z1N71vq+32LuQ+(@pX*+Z;s9z zKvl>?@$+6RZ}s8(KcLEgVb#5nfF80;?b0-yg-B=(p+Cf~OxysW!!EUaBVz8^Q0U7* z!d4XOIIO5JxrIdTcMMbXP~%Bfe@m!w3TqjKjQ`)%NVUdKWaMsiSu`>dw{6gY(37w* z5x$>aAIc8zn*%)cQI zKTr$TuU|!<({Z~7)A;d5S^XTV#u~+j(*FdKHigf6cmzSUo)Gxvi29Rya9?c#JQi=H zQ+{pXE!Loq-78J0>w5Rvi<8My4QyLa+Rg>QyL=;d9AcWd*(mX*;WW&d7|x|#qT3<& zpc0+o^>2O258TLW_AnQXkZIfyEH-CxDJjZQ z39kv92`03z%-fNw&sTDCv4Bfjy1zGXRIcB;eq(m}o$9++E0yVMSF6`&Bx?5kt9NeS zaAtbI&K(X!yGXA$?uCJvbS>OIMSi?4=x%7d$D>dPTk?*`c>{UpO(xS!7}awwGoj-v z_PbbP4waxo+2e5MU6m`j?QtGx Date: Mon, 28 May 2018 16:42:17 +0800 Subject: [PATCH 023/913] delete tmp file --- tools/codestyle/docstring_checker.pyc | Bin 11769 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tools/codestyle/docstring_checker.pyc diff --git a/tools/codestyle/docstring_checker.pyc b/tools/codestyle/docstring_checker.pyc deleted file mode 100644 index 49f07e8e6c0b4d4c7a253c2763e5fb5e7c8c668c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11769 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 Date: Mon, 28 May 2018 18:52:44 +0800 Subject: [PATCH 024/913] Add uint8 support in data_feeder.py --- python/paddle/fluid/data_feeder.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/python/paddle/fluid/data_feeder.py b/python/paddle/fluid/data_feeder.py index a44e078d0c1..7940dabcfb0 100644 --- a/python/paddle/fluid/data_feeder.py +++ b/python/paddle/fluid/data_feeder.py @@ -36,9 +36,11 @@ class DataToLoDTensorConverter(object): self.dtype = 'float64' elif dtype == core.VarDesc.VarType.INT32: self.dtype = 'int32' + elif dtype == core.VarDesc.VarType.UINT8: + self.dtype = 'uint8' else: raise ValueError("dtype must be any of [int32, float32, int64, " - "float64]") + "float64, uint8]") self.data = [] self.lod = [] -- GitLab From 9f81f1ce57d8cc300f0b856288cc02b50f4f3161 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Mon, 28 May 2018 19:39:34 +0800 Subject: [PATCH 025/913] Add uint8 support in pybind.cc --- paddle/fluid/pybind/pybind.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/paddle/fluid/pybind/pybind.cc b/paddle/fluid/pybind/pybind.cc index 50a1c07251b..2295e83343d 100644 --- a/paddle/fluid/pybind/pybind.cc +++ b/paddle/fluid/pybind/pybind.cc @@ -117,6 +117,7 @@ PYBIND11_PLUGIN(core) { .def("set", PyCPUTensorSetFromArray) .def("set", PyCPUTensorSetFromArray) .def("set", PyCPUTensorSetFromArray) + .def("set", PyCPUTensorSetFromArray) #ifdef PADDLE_WITH_CUDA .def("set", PyCUDATensorSetFromArray) .def("set", PyCUDATensorSetFromArray) @@ -124,12 +125,14 @@ PYBIND11_PLUGIN(core) { .def("set", PyCUDATensorSetFromArray) .def("set", PyCUDATensorSetFromArray) .def("set", PyCUDATensorSetFromArray) + .def("set", PyCUDATensorSetFromArray) .def("set", PyCUDAPinnedTensorSetFromArray) .def("set", PyCUDAPinnedTensorSetFromArray) .def("set", PyCUDAPinnedTensorSetFromArray) .def("set", PyCUDAPinnedTensorSetFromArray) .def("set", PyCUDAPinnedTensorSetFromArray) .def("set", PyCUDAPinnedTensorSetFromArray) + .def("set", PyCUDAPinnedTensorSetFromArray) #endif .def("shape", [](Tensor &self) { return vectorize(self.dims()); }) .def("set_float_element", TensorSetElement) -- GitLab From 2c589f7c574d99b022ae2820320db49b67d8bc9c Mon Sep 17 00:00:00 2001 From: weixing02 Date: Mon, 28 May 2018 19:53:30 +0800 Subject: [PATCH 026/913] add developer's fluid guide --- .../Developer's_Guide_to_Paddle_Fluid.md | 68 +++++++++---------- doc/fluid/getstarted/index_cn.rst | 1 + doc/fluid/getstarted/index_en.rst | 1 + 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/doc/fluid/getstarted/Developer's_Guide_to_Paddle_Fluid.md b/doc/fluid/getstarted/Developer's_Guide_to_Paddle_Fluid.md index 0c0156c8e46..79df6c59578 100644 --- a/doc/fluid/getstarted/Developer's_Guide_to_Paddle_Fluid.md +++ b/doc/fluid/getstarted/Developer's_Guide_to_Paddle_Fluid.md @@ -86,7 +86,7 @@

- +

--- @@ -123,12 +123,12 @@ - 在科学计算领域,计算图是一种描述计算的经典方式。下图展示了从前向计算图(蓝色)开始,通过添加反向(红色)和优化算法相关(绿色)操作,构建出整个计算图的过程: -- +-

- + - Fluid ==使用`Program`而不是计算图==来描述模型和优化过程。`Program`由`Block`、`Operator`和`Variable`构成,相关概念会在后文详细展开。 - 编译时 Fluid 接受前向计算(这里可以先简单的理解为是一段有序的计算流)`Program`,为这段前向计算按照:前向 -> 反向 -> 梯度 clip -> 正则 -> 优化 的顺序,添加相关 `Operator`和`Variable`到`Program`到完整的计算。 @@ -328,7 +328,7 @@
---- +--- ### 编译时概念 :==**[Transpiler](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/fluid/design/motivation/fluid_compiler.md)**== @@ -402,7 +402,7 @@ - `Scope` - 计算相关 - - `Block` + - `Block` - `Kernel`、`OpWithKernel`、`OpWithoutKernel` @@ -439,7 +439,7 @@
-- 执行相关 :`Executor` +- 执行相关 :`Executor`
@@ -798,7 +798,7 @@ class GPUAllocator : public SystemAllocator { - step 1:添加Place类型,由用户实现添加到框架 - 可以将Place类型理解为一个整数加上一个枚举型,包括:设备号 + 设备类型 - +

@@ -824,7 +824,7 @@ class GPUAllocator : public SystemAllocator { 1. DataType 执行数据类型 FP32/FP64/INT32/INT64 1. Memory layout: 运行时 Tensor 在内存中的排布格式 NCHW、 NHWC 1. 使用的库 - + 来区分Kernel,为同一个operator注册多个 Kernel。 ```cpp @@ -876,7 +876,7 @@ step 3: 运行时的 KernelType 推断和Kernel切换, --- @@ -1107,7 +1107,7 @@ void Run(const framework::Scope &scope,

-

+

@@ -1127,13 +1127,13 @@ void Run(const framework::Scope &scope, - 设计概览 - - 重构概览 [->](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/design/refactorization.md) - - fluid [->](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/design/fluid.md) + - 重构概览 [->](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/design/refactorization.md) + - fluid [->](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/design/fluid.md) - fluid_compiler [->](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/fluid/design/motivation/fluid_compiler.md) - 核心概念 - variable 描述 [->](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/design/var_desc.md) - Tensor [->](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/framework/tensor.md) - - LoDTensor [->](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/framework/lod_tensor.md) + - LoDTensor [->](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/framework/lod_tensor.md) - TensorArray [->](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/design/tensor_array.md) - Program [->](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/design/program.md) - Block [->](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/design/block.md) @@ -1152,7 +1152,7 @@ void Run(const framework::Scope &scope, - 支持新设硬件设备库 [->](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/design/support_new_device.md) - 添加新的Operator [->](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/howto/dev/new_op_cn.md) - 添加新的Kernel [->]( -https://github.com/PaddlePaddle/Paddle/blob/develop/doc/howto/dev/new_op_kernel_en.md) +https://github.com/PaddlePaddle/Paddle/blob/develop/doc/howto/dev/new_op_kernel_en.md) @@ -1167,10 +1167,10 @@ https://github.com/PaddlePaddle/Paddle/blob/develop/doc/howto/dev/new_op_kernel_ Docker编译PaddlePaddle源码: [->](http://www.paddlepaddle.org/docs/develop/documentation/fluid/zh/build_and_install/docker_install_cn.html) - + PaddlePaddle 在 Dockerhub 地址:[->]( https://hub.docker.com/r/paddlepaddle/paddle/tags/) - + 1. 获取PaddlePaddle的Docker镜像 ```bash docker pull paddlepaddle/paddle:latest-dev @@ -1183,7 +1183,7 @@ PaddlePaddle 在 Dockerhub 地址:[->]( ``` 1. 进入docker container后,从源码编译,请参考文档 [->]( http://www.paddlepaddle.org/docs/develop/documentation/fluid/zh/build_and_install/build_from_source_cn.html) - + --- @@ -1196,7 +1196,7 @@ PaddlePaddle 在 Dockerhub 地址:[->]( 1. 开发推荐使用tag为`latest-dev`的镜像,其中打包了所有编译依赖。`latest`及`lastest-gpu`是production镜像,主要用于运行PaddlePaddle程序。 2. 在Docker中运行GPU程序,推荐使用nvidia-docker,[否则需要将CUDA库和设备挂载到Docker容器内](http://www.paddlepaddle.org/docs/develop/documentation/fluid/zh/build_and_install/docker_install_cn.html)。 - + ```bash nvidia-docker run -it -v $PWD/Paddle:/paddle paddlepaddle/paddle:latest-dev /bin/bash ``` @@ -1353,9 +1353,9 @@ Op注册实现在`.cc`文件;Kernel注册CPU实现在`.cc`文件中,CUDA实 } }; ``` - + - + --- ###### 实现带Kernel的Operator step2: 定义Operator类 @@ -1420,11 +1420,11 @@ class ClipOp : public framework::OperatorWithKernel { 2. override InferShape函数(参考 [clip_op](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/clip_op.cc#L24)) 1. 什么是`functor` ? - + - 类或结构体仅重载了`()`,一般是可被多个kernel复用的计算函数。 - + ```cpp template class CrossEntropyFunctor { @@ -1438,9 +1438,9 @@ class ClipOp : public framework::OperatorWithKernel { }; ``` - + - 在 clip_op 内也会看到将一段计算函数抽象为functor的使用法: [->](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/clip_op.h#L27)。 - + --- @@ -1504,7 +1504,7 @@ class ClipKernel : public framework::OpKernel { - 需要注意,Fluid中,不区分Cost Op和中间层Op,所有Op都必须正确处理接收到的梯度 2. 反向Op的输出 - 对可学习参数的求导结果 - - 对所有输入的求导结果 + - 对所有输入的求导结果 @@ -1520,7 +1520,7 @@ class ClipKernel : public framework::OpKernel { 1. 在`.cc`文件中注册前向、反向Op类,注册CPU Kernel。 - + ```cpp namespace ops = paddle::operators; REGISTER_OP(clip, ops::ClipOp, ops::ClipOpMaker, clip_grad, @@ -1530,13 +1530,13 @@ class ClipKernel : public framework::OpKernel { REGISTER_OP_CPU_KERNEL( clip_grad, ops::ClipGradKernel); ``` - + - 在上面的代码片段中: 1. `REGISTER_OP` : 注册`ops::ClipOp`类,类型名为`clip`,该类的`ProtoMaker`为`ops::ClipOpMaker`,注册`ops::ClipOpGrad`,类型名为`clip_grad` 1. `REGISTER_OP_WITHOUT_GRADIENT` : 用于注册没有反向的Op,例如:优化算法相关的Op 1. `REGISTER_OP_CPU_KERNEL` :注册`ops::ClipKernel`类,并特化模板参数为`paddle::platform::CPUPlace`和`float`类型,同理,注册`ops::ClipGradKernel`类 - + 1. 按照同样方法,在`.cu`文件中注册GPU Kernel - 如果CUDA Kernel的实现基于Eigen,需在 `.cu`的开始加上宏定义 `#define EIGEN_USE_GPU` @@ -1593,7 +1593,7 @@ class ClipKernel : public framework::OpKernel { ```bash make test ARGS="-R test_mul_op -V" ``` - + 或者: ``` @@ -1613,7 +1613,7 @@ class ClipKernel : public framework::OpKernel { - 如果多个Op依赖一些共用的函数,可以创建非`*_op.*`格式的文件来存放,如`gather.h`文件。 - + --- ### ==10.== 使用相关问题 @@ -1735,7 +1735,7 @@ class ClipKernel : public framework::OpKernel { y_data = np.random.randint(0, 8, [1]).astype("int32") y_tensor = core.Tensor() y_tensor.set(y_data, place) - + x_data = np.random.uniform(0.1, 1, [11, 8]).astype("float32") x_tensor = core.Tensor() x_tensor.set(x_data, place) diff --git a/doc/fluid/getstarted/index_cn.rst b/doc/fluid/getstarted/index_cn.rst index 75af7354be9..3daea71d093 100644 --- a/doc/fluid/getstarted/index_cn.rst +++ b/doc/fluid/getstarted/index_cn.rst @@ -17,3 +17,4 @@ :maxdepth: 1 concepts/use_concepts_cn.rst + developer's_guide_to_paddle_fluid.md diff --git a/doc/fluid/getstarted/index_en.rst b/doc/fluid/getstarted/index_en.rst index 75a43f4af87..fb20bb4f245 100644 --- a/doc/fluid/getstarted/index_en.rst +++ b/doc/fluid/getstarted/index_en.rst @@ -16,3 +16,4 @@ Here is an example of linear regression. It introduces workflow of PaddlePaddle, :maxdepth: 1 concepts/index_en.rst + developer's_guide_to_paddle_fluid.md -- GitLab From bcafb32adcd79dd91a21496ab75b2b30f9704068 Mon Sep 17 00:00:00 2001 From: weixing02 Date: Mon, 28 May 2018 19:57:16 +0800 Subject: [PATCH 027/913] fix error --- doc/fluid/getstarted/quickstart_cn.rst | 12 ++++++------ doc/fluid/getstarted/quickstart_en.rst | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/doc/fluid/getstarted/quickstart_cn.rst b/doc/fluid/getstarted/quickstart_cn.rst index 135beb75d03..6a964d4f856 100644 --- a/doc/fluid/getstarted/quickstart_cn.rst +++ b/doc/fluid/getstarted/quickstart_cn.rst @@ -11,7 +11,7 @@ PaddlePaddle支持使用pip快速安装,目前支持CentOS 6以上, Ubuntu 14. pip install paddlepaddle -如果需要安装支持GPU的版本(cuda7.5_cudnn5_avx_openblas),需要执行: +如果需要安装支持GPU的版本(cuda8.0_cudnn5_avx_openblas),需要执行: .. code-block:: bash @@ -28,18 +28,18 @@ PaddlePaddle支持使用pip快速安装,目前支持CentOS 6以上, Ubuntu 14. import paddle.dataset.uci_housing as uci_housing import paddle.fluid as fluid - + with fluid.scope_guard(fluid.core.Scope()): # initialize executor with cpu exe = fluid.Executor(place=fluid.CPUPlace()) - # load inference model + # load inference model [inference_program, feed_target_names,fetch_targets] = \ fluid.io.load_inference_model(uci_housing.fluid_model(), exe) # run inference - result = exe.run(inference_program, - feed={feed_target_names[0]: uci_housing.predict_reader()}, + result = exe.run(inference_program, + feed={feed_target_names[0]: uci_housing.predict_reader()}, fetch_list=fetch_targets) - # print predicted price is $12,273.97 + # print predicted price is $12,273.97 print 'Predicted price: ${:,.2f}'.format(result[0][0][0] * 1000) 执行 :code:`python housing.py` 瞧! 它应该打印出预测住房数据的清单。 diff --git a/doc/fluid/getstarted/quickstart_en.rst b/doc/fluid/getstarted/quickstart_en.rst index df6619cfd03..680122f2589 100644 --- a/doc/fluid/getstarted/quickstart_en.rst +++ b/doc/fluid/getstarted/quickstart_en.rst @@ -12,7 +12,7 @@ Simply run the following command to install, the version is cpu_avx_openblas: pip install paddlepaddle -If you need to install GPU version (cuda7.5_cudnn5_avx_openblas), run: +If you need to install GPU version (cuda8.0_cudnn5_avx_openblas), run: .. code-block:: bash @@ -31,18 +31,18 @@ code: import paddle.dataset.uci_housing as uci_housing import paddle.fluid as fluid - + with fluid.scope_guard(fluid.core.Scope()): # initialize executor with cpu exe = fluid.Executor(place=fluid.CPUPlace()) - # load inference model + # load inference model [inference_program, feed_target_names,fetch_targets] = \ fluid.io.load_inference_model(uci_housing.fluid_model(), exe) # run inference - result = exe.run(inference_program, - feed={feed_target_names[0]: uci_housing.predict_reader()}, + result = exe.run(inference_program, + feed={feed_target_names[0]: uci_housing.predict_reader()}, fetch_list=fetch_targets) - # print predicted price is $12,273.97 + # print predicted price is $12,273.97 print 'Predicted price: ${:,.2f}'.format(result[0][0][0] * 1000) Run :code:`python housing.py` and voila! It should print out a list of predictions -- GitLab From 514b2427edbd30013ca1783769af18fb96ffb626 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Mon, 28 May 2018 20:08:23 +0800 Subject: [PATCH 028/913] add save/load persist_vars_without_grad --- python/paddle/fluid/io.py | 46 +++++++++++++++++++++++----------- python/paddle/fluid/trainer.py | 3 ++- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index 8e58e5eb794..f626039363a 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -24,7 +24,8 @@ __all__ = [ 'save_vars', 'save_params', 'save_persistables', 'load_vars', 'load_params', 'load_persistables', 'save_inference_model', 'load_inference_model', 'get_inference_program', 'save_checkpoint', 'load_checkpoint', - 'clean_checkpoint' + 'clean_checkpoint', 'load_persist_vars_without_grad', + 'save_persist_vars_without_grad' ] @@ -455,6 +456,33 @@ def get_parameter_value_by_name(name, executor, program=None): return get_parameter_value(var, executor) +def load_persist_vars_without_grad(executor, dirname, program): + """ + load_persist_vars_without_grad will load variables from a directory by an executor, + the variable named end with "@GRAD" will not be loaded. + """ + load_vars( + executor, + dirname=dirname, + main_program=program, + predicate=_is_checkpoint_var, + filename=None) + + +def save_persist_vars_without_grad(executor, dirname, program): + """ + save_persist_vars_without_grad will save variables to a directory by an executor, + the variable named end with "@GRAD" will not be saved. + """ + save_vars( + executor, + dirname=dirname, + main_program=program, + vars=None, + predicate=_is_checkpoint_var, + filename=None) + + SUCCESS_MARK_FILENAME = "_SUCCESS" CHECKPOINT_PREFIX = "checkpoint" CHECKPOINT_SEPARATOR = "_" @@ -491,13 +519,7 @@ def save_checkpoint(executor, serial += 1 cur_dir = _get_serial_dir(serial, checkpoint_dir) - save_vars( - executor, - dirname=cur_dir, - main_program=main_program, - vars=None, - predicate=_is_checkpoint_var, - filename=None) + load_persist_vars_without_grad(executor, cur_dir, main_program) _write_success(cur_dir) _lru_delete(checkpoint_dir, max_num_checkpoints) @@ -521,13 +543,7 @@ def load_checkpoint(executor, checkpoint_dir=None, main_program=None): return cur_dir = _get_serial_dir(serial, checkpoint_dir) - - load_vars( - executor, - dirname=cur_dir, - main_program=main_program, - predicate=_is_checkpoint_var, - filename=None) + load_persist_vars_without_grad(executor, cur_dir, main_program) def clean_checkpoint(checkpoint_dir, delete_dir=False): diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 24254b4980c..b4b7b75b96e 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -162,7 +162,8 @@ class Trainer(object): if param_path: # load params from param_path into scope - io.load_persistables(exe, dirname=param_path) + io.load_persist_vars_without_grad( + exe, dirname=param_path, program=self.startup_program) def _transpile_nccl2_dist(self): # PADDLE_TRAINER_IPS -- GitLab From 5eea5db95fb6eaca2db9a0af63e871a9fc29c6bf Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Tue, 29 May 2018 14:37:59 +0800 Subject: [PATCH 029/913] optimized checkpoint and save_model --- python/paddle/fluid/__init__.py | 1 + python/paddle/fluid/io.py | 61 +++++++++++++++------------------ python/paddle/fluid/trainer.py | 40 +++++++++++++++------ 3 files changed, 58 insertions(+), 44 deletions(-) diff --git a/python/paddle/fluid/__init__.py b/python/paddle/fluid/__init__.py index 859605d0053..aece8fc1490 100644 --- a/python/paddle/fluid/__init__.py +++ b/python/paddle/fluid/__init__.py @@ -26,6 +26,7 @@ from trainer import BeginEpochEvent from trainer import EndEpochEvent from trainer import BeginStepEvent from trainer import EndStepEvent +from trainer import CheckpointConfig import inferencer from inferencer import Inferencer diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index f626039363a..aa039bdfaa4 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -491,7 +491,6 @@ CHECKPOINT_SEPARATOR = "_" def save_checkpoint(executor, checkpoint_dir=None, max_num_checkpoints=3, - save_interval_secs=600, main_program=None): """ Save Checkpoint will save persistable LodTensor variables from main_program in checkpoint directory, @@ -511,15 +510,10 @@ def save_checkpoint(executor, if not os.path.isdir(checkpoint_dir): os.makedirs(checkpoint_dir) - serial = _get_lastest_checkpoint_dir(checkpoint_dir) - if serial >= 0 and not _interval_secs_exceed( - _get_serial_dir(serial, checkpoint_dir), save_interval_secs): - return - - serial += 1 - cur_dir = _get_serial_dir(serial, checkpoint_dir) + serial = _get_lastest_checkpoint_dir(checkpoint_dir) + 1 + cur_dir = _get_serial_dir(checkpoint_dir, serial) - load_persist_vars_without_grad(executor, cur_dir, main_program) + save_persist_vars_without_grad(executor, cur_dir, main_program) _write_success(cur_dir) _lru_delete(checkpoint_dir, max_num_checkpoints) @@ -542,7 +536,7 @@ def load_checkpoint(executor, checkpoint_dir=None, main_program=None): if serial < 0: return - cur_dir = _get_serial_dir(serial, checkpoint_dir) + cur_dir = _get_serial_dir(checkpoint_dir, serial) load_persist_vars_without_grad(executor, cur_dir, main_program) @@ -559,11 +553,6 @@ def clean_checkpoint(checkpoint_dir, delete_dir=False): os.rmdir(checkpoint_dir) -def _get_serial_dir(serial, checkpoint_dir): - serial_folder = CHECKPOINT_PREFIX + CHECKPOINT_SEPARATOR + str(serial) - return os.path.join(checkpoint_dir, serial_folder) - - def _is_checkpoint_var(var): """ the checkpoint will not save or load all the variables. @@ -582,29 +571,37 @@ def _is_checkpoint_var(var): return var.persistable -def _interval_secs_exceed(dirname, save_interval_secs): - dir_time = os.path.getmtime(dirname) - if save_interval_secs > (time.time() - dir_time): - return False - return True +def _get_dir_serial(dirname): + _, serial = dirname.split(CHECKPOINT_SEPARATOR) + + serial_num = -1 + try: + serial_num = int(serial) + except ValueError: + serial_num = -1 + return serial_num + + +def _get_serial_dir(dirname, serial): + serial_folder = CHECKPOINT_PREFIX + CHECKPOINT_SEPARATOR + str(serial) + return os.path.join(dirname, serial_folder) def _lru_delete(dirname, max_num_checkpoints=3): dirs = os.listdir(dirname) - serials = [] + serial_map = {} for serial in dirs: - try: - serials.append(int(serial)) - except ValueError: - continue + serial_num = _get_dir_serial(serial) + serial_map[serial_num] = serial - if len(serials) <= max_num_checkpoints: + if len(serial_map.keys()) <= max_num_checkpoints: return + serials = serial_map.keys() serials.sort(reverse=True) serials = serials[max_num_checkpoints:] for serial in serials: - cur_dir = os.path.join(dirname, str(serial)) + cur_dir = _get_serial_dir(dirname, serial) shutil.rmtree(cur_dir) @@ -633,20 +630,18 @@ def _get_lastest_checkpoint_dir(checkpoint_dir): """ is _SUCCESS in this dir """ - _, serial = cur_dir.split(CHECKPOINT_SEPARATOR) - try: - int(serial) - except ValueError: + serial = _get_dir_serial(cur_dir) + if serial == -1: return -1 if not os.path.isdir(os.path.join(checkpoint_dir, cur_dir)): return -1 success_path = os.path.join( - _get_serial_dir(serial, checkpoint_dir), SUCCESS_MARK_FILENAME) + _get_serial_dir(checkpoint_dir, serial), SUCCESS_MARK_FILENAME) if os.path.isfile(success_path): - return int(serial) + return serial if not os.path.isdir(checkpoint_dir): return -1 diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index b4b7b75b96e..3cf96ac2511 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -60,11 +60,24 @@ class CheckpointConfig(object): def __init__(self, checkpoint_dir=None, max_num_checkpoints=3, - save_interval_secs=600): + epoch_interval=1, + step_interval=10): if checkpoint_dir is None: self.checkpoint_dir = os.getcwd() + else: + self.checkpoint_dir = checkpoint_dir + self.max_num_checkpoints = max_num_checkpoints - self.save_interval_secs = save_interval_secs + + if epoch_interval < 1: + self.epoch_interval = 1 + else: + self.epoch_interval = epoch_interval + + if step_interval < 1: + self.step_interval = 10 + else: + self.step_interval = step_interval def check_and_get_place(place): @@ -290,14 +303,6 @@ class Trainer(object): exe = executor.Executor(self.place) io.save_persistables(exe, dirname=param_path) - def _save_checkpoint(self): - if self.checkpoint and self.chief: - exe = executor.Executor(self.place) - io.save_checkpoint(exe, self.checkpoint.checkpoint_dir, - self.checkpoint.max_num_checkpoints, - self.checkpoint.save_interval_secs, - self.train_program) - @contextlib.contextmanager def _prog_and_scope_guard(self): with framework.program_guard( @@ -343,8 +348,9 @@ class Trainer(object): ]) else: metrics = exe.run(feed=data, fetch_list=[]) + event_handler(EndStepEvent(epoch_id, step_id, metrics)) - self._save_checkpoint() + self._save_checkpoint(epoch_id, step_id) event_handler(EndEpochEvent(epoch_id)) def _test_by_executor(self, reader, feed_order, fetch_list): @@ -384,6 +390,18 @@ class Trainer(object): loss_name=self.train_func_outputs[0].name) return self._get_parallel_executor() + def _save_checkpoint(self, epoch_id, step_id): + if not self.checkpoint or not self.chief: + return + + if epoch_id % self.checkpoint.epoch_interval == 0 and step_id % self.checkpoint.step_interval == 0: + exe = executor.Executor(self.place) + io.save_checkpoint( + executor=exe, + checkpoint_dir=self.checkpoint.checkpoint_dir, + max_num_checkpoints=self.checkpoint.max_num_checkpoints, + main_program=self.train_program) + def build_feed_var_list(program, feed_order): if not isinstance(program, framework.Program): -- GitLab From 3bcb67f1db1619a7435e6eff618f9e461ff16e86 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Tue, 29 May 2018 14:56:37 +0800 Subject: [PATCH 030/913] fix a bug --- python/paddle/fluid/layers/nn.py | 5 +++-- tools/codestyle/docstring_checker.pyc | Bin 0 -> 11769 bytes 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 tools/codestyle/docstring_checker.pyc diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index c337e0f4f20..3f04dcccd6a 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -3990,15 +3990,16 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): return out -def random_crop(input, shape, seed=0): +def random_crop(input, shape, seed=1): helper = LayerHelper("random_crop", **locals()) dtype = helper.input_dtype() out = helper.create_tmp_variable(dtype) if isinstance(seed, int): + seed_value = seed seed = helper.create_global_variable( persistable=True, shape=[1], dtype="int32") helper.set_variable_initializer( - var=seed, initializer=Constant(value=seed)) + var=seed, initializer=Constant(value=seed_value)) elif not isinstance(seed, Variable): raise ValueError("'seed' must be a Variable or an int.") seed_out = helper.create_tmp_variable(dtype="int32") diff --git a/tools/codestyle/docstring_checker.pyc b/tools/codestyle/docstring_checker.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ce612ca2318ccb9b9f28d51cb93ce8e5e1d0680 GIT binary patch literal 11769 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 z Date: Tue, 29 May 2018 15:00:11 +0800 Subject: [PATCH 031/913] Add support in cast op kernel --- paddle/fluid/operators/cast_op.cc | 1 + paddle/fluid/operators/cast_op.cu | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/paddle/fluid/operators/cast_op.cc b/paddle/fluid/operators/cast_op.cc index 84660d042c7..8d6a498dc94 100644 --- a/paddle/fluid/operators/cast_op.cc +++ b/paddle/fluid/operators/cast_op.cc @@ -89,4 +89,5 @@ REGISTER_OP_CPU_KERNEL(cast, ops::CastOpKernel, ops::CastOpKernel, ops::CastOpKernel, ops::CastOpKernel, + ops::CastOpKernel, ops::CastOpKernel); diff --git a/paddle/fluid/operators/cast_op.cu b/paddle/fluid/operators/cast_op.cu index c486c5850e2..657d162878c 100644 --- a/paddle/fluid/operators/cast_op.cu +++ b/paddle/fluid/operators/cast_op.cu @@ -21,5 +21,5 @@ using CastOpKernel = REGISTER_OP_CUDA_KERNEL(cast, CastOpKernel, CastOpKernel, CastOpKernel, CastOpKernel, - CastOpKernel, + CastOpKernel, CastOpKernel, CastOpKernel); -- GitLab From 5f5d6a9dc7eaf2e1c5b069454497d11a28701ddb Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Tue, 29 May 2018 16:01:26 +0800 Subject: [PATCH 032/913] optimized checkpoint and save_model --- python/paddle/fluid/io.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index aa039bdfaa4..bd3c2e3d9a3 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -489,9 +489,9 @@ CHECKPOINT_SEPARATOR = "_" def save_checkpoint(executor, - checkpoint_dir=None, - max_num_checkpoints=3, - main_program=None): + checkpoint_dir, + main_program=None, + max_num_checkpoints=3): """ Save Checkpoint will save persistable LodTensor variables from main_program in checkpoint directory, the directory named by serial number from 0 to (n -1), save_checkpoint use LRU strategy @@ -500,12 +500,11 @@ def save_checkpoint(executor, :param executor :param checkpoint_dir - :param max_num_checkpoints - :param save_interval_secs :param main_program + :param max_num_checkpoints """ if checkpoint_dir is None: - checkpoint_dir = os.getcwd() + raise ValueError("The values of 'checkpoint_dir' should not be None") if not os.path.isdir(checkpoint_dir): os.makedirs(checkpoint_dir) @@ -518,7 +517,7 @@ def save_checkpoint(executor, _lru_delete(checkpoint_dir, max_num_checkpoints) -def load_checkpoint(executor, checkpoint_dir=None, main_program=None): +def load_checkpoint(executor, checkpoint_dir, main_program=None): """ Load checkpoint from a directory by executor, it will find the most recent saved checkpoint file and load it auto. @@ -529,7 +528,7 @@ def load_checkpoint(executor, checkpoint_dir=None, main_program=None): """ if checkpoint_dir is None: - checkpoint_dir = os.getcwd() + raise ValueError("The values of 'checkpoint_dir' should not be None") serial = _get_lastest_checkpoint_dir(checkpoint_dir) @@ -546,7 +545,7 @@ def clean_checkpoint(checkpoint_dir, delete_dir=False): delete_dir only works when the directory is empty, otherwise, OSError is raised. """ if checkpoint_dir is None: - checkpoint_dir = os.getcwd() + raise ValueError("The values of 'checkpoint_dir' should not be None") _lru_delete(checkpoint_dir, max_num_checkpoints=0) if delete_dir and not os.listdir(checkpoint_dir): -- GitLab From c00843f4e8860d7abff0077168942fa99ef37154 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Tue, 29 May 2018 17:43:01 +0800 Subject: [PATCH 033/913] enable multi-threads --- .../tests/book/test_inference_nlp.cc | 12 ++++++++ paddle/fluid/inference/tests/test_helper.h | 29 ------------------- 2 files changed, 12 insertions(+), 29 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index ca02e38ede7..6ff8a18cdb1 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -25,6 +25,12 @@ DEFINE_bool(use_mkldnn, false, "Use MKLDNN to run inference"); DEFINE_bool(prepare_vars, true, "Prepare variables before executor"); DEFINE_bool(prepare_context, true, "Prepare Context before executor"); +inline double get_current_ms() { + struct timeval time; + gettimeofday(&time, NULL); + return 1e+3 * time.tv_sec + 1e-3 * time.tv_usec; +} + TEST(inference, understand_sentiment) { if (FLAGS_dirname.empty()) { LOG(FATAL) << "Usage: ./example --dirname=path/to/your/model"; @@ -102,4 +108,10 @@ TEST(inference, understand_sentiment) { } })); } + auto start_ms = get_current_ms(); + for (int i = 0; i < num_threads; ++i) { + infer_threads[i]->join(); + } + auto stop_ms = get_current_ms(); + LOG(INFO) << "total: " << stop_ms - start_ms << " ms"; } diff --git a/paddle/fluid/inference/tests/test_helper.h b/paddle/fluid/inference/tests/test_helper.h index 1f5551567c6..dd3a7a584ad 100644 --- a/paddle/fluid/inference/tests/test_helper.h +++ b/paddle/fluid/inference/tests/test_helper.h @@ -156,27 +156,10 @@ void TestInference(const std::string& dirname, auto executor = paddle::framework::Executor(place); auto* scope = new paddle::framework::Scope(); - // Profile the performance - paddle::platform::ProfilerState state; - if (paddle::platform::is_cpu_place(place)) { - state = paddle::platform::ProfilerState::kCPU; - } else { -#ifdef PADDLE_WITH_CUDA - state = paddle::platform::ProfilerState::kAll; - // The default device_id of paddle::platform::CUDAPlace is 0. - // Users can get the device_id using: - // int device_id = place.GetDeviceId(); - paddle::platform::SetDeviceId(0); -#else - PADDLE_THROW("'CUDAPlace' is not supported in CPU only device."); -#endif - } - // 2. Initialize the inference_program and load parameters std::unique_ptr inference_program; // Enable the profiler - paddle::platform::EnableProfiler(state); { paddle::platform::RecordEvent record_event( "init_program", @@ -189,10 +172,6 @@ void TestInference(const std::string& dirname, EnableMKLDNN(inference_program); } } - // Disable the profiler and print the timing information - paddle::platform::DisableProfiler(paddle::platform::EventSortingKey::kDefault, - "load_program_profiler"); - paddle::platform::ResetProfiler(); // 3. Get the feed_target_names and fetch_target_names const std::vector& feed_target_names = @@ -233,9 +212,6 @@ void TestInference(const std::string& dirname, true, CreateVars); } - // Enable the profiler - paddle::platform::EnableProfiler(state); - // Run repeat times to profile the performance for (int i = 0; i < repeat; ++i) { paddle::platform::RecordEvent record_event( @@ -252,11 +228,6 @@ void TestInference(const std::string& dirname, CreateVars); } } - - // Disable the profiler and print the timing information - paddle::platform::DisableProfiler( - paddle::platform::EventSortingKey::kDefault, "run_inference_profiler"); - paddle::platform::ResetProfiler(); } delete scope; -- GitLab From e3c041d319b0effb32b240814c507a656dd6fb32 Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Tue, 29 May 2018 19:57:57 +0800 Subject: [PATCH 034/913] add auto_grown_mutex for selected rows --- paddle/fluid/framework/selected_rows.cc | 7 ++++--- paddle/fluid/framework/selected_rows.h | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/paddle/fluid/framework/selected_rows.cc b/paddle/fluid/framework/selected_rows.cc index 56cf6693caf..c9d2388aa43 100644 --- a/paddle/fluid/framework/selected_rows.cc +++ b/paddle/fluid/framework/selected_rows.cc @@ -18,8 +18,8 @@ namespace paddle { namespace framework { struct ReAllocateVisitor { - ReAllocateVisitor(framework::Tensor* tensor, const framework::DDim& dims) - : tensor_(tensor), dims_(dims) {} + ReAllocateVisitor(const framework::DDim& dims, framework::Tensor* tensor) + : dims_(dims), tensor_(tensor) {} template void operator()() const { @@ -153,6 +153,7 @@ bool SelectedRows::Set(int64_t key, const framework::Tensor& value) { } PADDLE_ENFORCE_EQ(value.dims()[0], static_cast(1), "The first dim of value should be 1."); + std::lock_guard lock(auto_grown_mutex_); auto index = Index(key); bool is_new_key = false; if (index == -1) { @@ -164,7 +165,7 @@ bool SelectedRows::Set(int64_t key, const framework::Tensor& value) { auto dims = value_->dims(); dims[0] = (dims[0] + 1) << 1; framework::VisitDataType(framework::ToDataType(value.type()), - ReAllocateVisitor(value_.get(), dims)); + ReAllocateVisitor(dims, value_.get())); } } diff --git a/paddle/fluid/framework/selected_rows.h b/paddle/fluid/framework/selected_rows.h index c27c927ee75..487c7390875 100644 --- a/paddle/fluid/framework/selected_rows.h +++ b/paddle/fluid/framework/selected_rows.h @@ -125,6 +125,7 @@ class SelectedRows { Vector rows_; std::unique_ptr value_{nullptr}; int64_t height_; + std::mutex auto_grown_mutex_; }; /* -- GitLab From ad9dfeb0180b40905d245354e733e750009cc173 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Tue, 29 May 2018 20:28:40 +0800 Subject: [PATCH 035/913] bug fix and optimize --- python/paddle/fluid/io.py | 153 +++++++++++++++++++++++++-------- python/paddle/fluid/trainer.py | 52 +++++++++-- 2 files changed, 162 insertions(+), 43 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index bd3c2e3d9a3..ed560304e25 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -456,40 +456,18 @@ def get_parameter_value_by_name(name, executor, program=None): return get_parameter_value(var, executor) -def load_persist_vars_without_grad(executor, dirname, program): - """ - load_persist_vars_without_grad will load variables from a directory by an executor, - the variable named end with "@GRAD" will not be loaded. - """ - load_vars( - executor, - dirname=dirname, - main_program=program, - predicate=_is_checkpoint_var, - filename=None) - - -def save_persist_vars_without_grad(executor, dirname, program): - """ - save_persist_vars_without_grad will save variables to a directory by an executor, - the variable named end with "@GRAD" will not be saved. - """ - save_vars( - executor, - dirname=dirname, - main_program=program, - vars=None, - predicate=_is_checkpoint_var, - filename=None) - - SUCCESS_MARK_FILENAME = "_SUCCESS" CHECKPOINT_PREFIX = "checkpoint" +MODEL_DIR = "__model__" +TRAINER_PREFIX = "trainer" CHECKPOINT_SEPARATOR = "_" def save_checkpoint(executor, checkpoint_dir, + trainer_id, + is_chief=False, + trainer_args=None, main_program=None, max_num_checkpoints=3): """ @@ -502,22 +480,35 @@ def save_checkpoint(executor, :param checkpoint_dir :param main_program :param max_num_checkpoints + :param is_chief """ if checkpoint_dir is None: raise ValueError("The values of 'checkpoint_dir' should not be None") + if trainer_args and not isinstance(trainer_args, dict): + raise TypeError("The type of 'trainer_args' should be dict") + if not os.path.isdir(checkpoint_dir): os.makedirs(checkpoint_dir) serial = _get_lastest_checkpoint_dir(checkpoint_dir) + 1 cur_dir = _get_serial_dir(checkpoint_dir, serial) - save_persist_vars_without_grad(executor, cur_dir, main_program) - _write_success(cur_dir) + if is_chief: + save_persist_vars_without_grad(executor, cur_dir, main_program) + + save_trainer_args(cur_dir, trainer_id, trainer_args) _lru_delete(checkpoint_dir, max_num_checkpoints) -def load_checkpoint(executor, checkpoint_dir, main_program=None): +def need_load_checkpoint(checkpoint_dir): + serial = _get_lastest_checkpoint_dir(checkpoint_dir) + if serial < 0: + return None + return serial + + +def load_checkpoint(executor, checkpoint_dir, serial, main_program): """ Load checkpoint from a directory by executor, it will find the most recent saved checkpoint file and load it auto. @@ -528,14 +519,17 @@ def load_checkpoint(executor, checkpoint_dir, main_program=None): """ if checkpoint_dir is None: - raise ValueError("The values of 'checkpoint_dir' should not be None") + raise ValueError( + "The values of 'checkpoint_dir' or 'serial' should not be None") - serial = _get_lastest_checkpoint_dir(checkpoint_dir) + if serial is None or serial < 0: + raise ValueError("The values of 'serial' should not be None or <0 ") - if serial < 0: - return + if main_program is None: + raise ValueError("The values of 'main_program'should not be None") cur_dir = _get_serial_dir(checkpoint_dir, serial) + cur_dir = _get_model_dir(cur_dir) load_persist_vars_without_grad(executor, cur_dir, main_program) @@ -552,6 +546,68 @@ def clean_checkpoint(checkpoint_dir, delete_dir=False): os.rmdir(checkpoint_dir) +def load_persist_vars_without_grad(executor, dirname, program, nest=True): + """ + load_persist_vars_without_grad will load variables from a directory by an executor, + the variable named end with "@GRAD" will not be loaded. + """ + + if nest: + dirname = _get_model_dir(dirname) + + load_vars( + executor, + dirname=dirname, + main_program=program, + predicate=_is_checkpoint_var, + filename=None) + + +def save_persist_vars_without_grad(executor, dirname, program): + """ + save_persist_vars_without_grad will save variables to a directory by an executor, + the variable named end with "@GRAD" will not be saved. + """ + cur_dir = _get_model_dir(dirname) + save_vars( + executor, + dirname=cur_dir, + main_program=program, + vars=None, + predicate=_is_checkpoint_var, + filename=None) + _write_success(cur_dir) + + +def save_trainer_args(dirname, trainer_id, trainer_args): + if not isinstance(trainer_args, dict): + raise TypeError("The type of 'trainer_args' should be dict") + cur_dir = _get_trainer_dir(dirname, trainer_id) + + for name, value in trainer_args.iteritems(): + args_file = os.path.join(cur_dir, name) + with open(args_file, 'w') as f: + f.write(str(value)) + _write_success(cur_dir) + + +def load_trainer_args(checkpoint_dir, serial, trainer_id, trainer_args): + cur_dir = _get_serial_dir(checkpoint_dir, serial) + cur_dir = _get_trainer_dir(cur_dir, trainer_id) + + if not isinstance(trainer_args, list): + raise TypeError("The type of 'trainer_args' should be list") + + ret_values = [] + + for arg in trainer_args: + cur_file = os.path.join(cur_dir, arg) + with open(cur_file, 'r') as f: + contents = f.read() + ret_values.append(contents.strip()) + return ret_values + + def _is_checkpoint_var(var): """ the checkpoint will not save or load all the variables. @@ -583,7 +639,31 @@ def _get_dir_serial(dirname): def _get_serial_dir(dirname, serial): serial_folder = CHECKPOINT_PREFIX + CHECKPOINT_SEPARATOR + str(serial) - return os.path.join(dirname, serial_folder) + serial_dir = os.path.join(dirname, serial_folder) + + if not os.path.isdir(serial_dir): + os.makedirs(serial_dir) + + return serial_dir + + +def _get_model_dir(dirname): + model_dir = os.path.join(dirname, MODEL_DIR) + + if not os.path.isdir(model_dir): + os.makedirs(model_dir) + + return model_dir + + +def _get_trainer_dir(dirname, trainer_id): + trainer_folder = TRAINER_PREFIX + CHECKPOINT_SEPARATOR + str(trainer_id) + trainer_dir = os.path.join(dirname, trainer_folder) + + if not os.path.isdir(trainer_dir): + os.makedirs(trainer_dir) + + return trainer_dir def _lru_delete(dirname, max_num_checkpoints=3): @@ -638,7 +718,8 @@ def _get_lastest_checkpoint_dir(checkpoint_dir): return -1 success_path = os.path.join( - _get_serial_dir(checkpoint_dir, serial), SUCCESS_MARK_FILENAME) + _get_serial_dir(checkpoint_dir, serial), MODEL_DIR, + SUCCESS_MARK_FILENAME) if os.path.isfile(success_path): return serial diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 3cf96ac2511..206d582cdca 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -79,6 +79,9 @@ class CheckpointConfig(object): else: self.step_interval = step_interval + self.epoch_id = 0 + self.step_id = 0 + def check_and_get_place(place): """ @@ -132,6 +135,7 @@ class Trainer(object): # config for checkpoint # only chief worker will save variables + self.trainer_id = 0 self.chief = True self.checkpoint = checkpoint_config if self.checkpoint and \ @@ -139,6 +143,8 @@ class Trainer(object): raise TypeError( "The checkpoint_config shoule be an instance of CheckpointConfig" ) + self.load_checkpoint_serial = io.need_load_checkpoint( + self.checkpoint.checkpoint_dir) self.scope = core.Scope() @@ -168,15 +174,25 @@ class Trainer(object): exe = executor.Executor(place) exe.run(self.startup_program) - if self.checkpoint: + if self.load_checkpoint_serial: exe = executor.Executor(place) io.load_checkpoint(exe, self.checkpoint.checkpoint_dir, + self.load_checkpoint_serial, self.startup_program) - if param_path: + epoch_id, step_id = io.load_trainer_args( + self.checkpoint.checkpoint_dir, self.load_checkpoint_serial, + self.trainer_id, ["epoch_id", "step_id"]) + self.checkpoint.epoch_id = int(epoch_id) + self.checkpoint.step_id = int(step_id) + + if param_path and os.path.isdir(param_path): # load params from param_path into scope io.load_persist_vars_without_grad( - exe, dirname=param_path, program=self.startup_program) + exe, + dirname=param_path, + program=self.startup_program, + nest=False) def _transpile_nccl2_dist(self): # PADDLE_TRAINER_IPS @@ -333,11 +349,20 @@ class Trainer(object): self._train_by_any_executor(event_handler, exe, num_epochs, reader) def _train_by_any_executor(self, event_handler, exe, num_epochs, reader): - for epoch_id in range(num_epochs): + epochs = [ + epoch_id for epoch_id in range(num_epochs) + if epoch_id >= self.checkpoint.epoch_id + ] + for epoch_id in epochs: event_handler(BeginEpochEvent(epoch_id)) for step_id, data in enumerate(reader()): if self.__stop: + self._clean_checkpoint() return + + if self.checkpoint and self.checkpoint.step_id >= step_id and self.checkpoint.epoch_id == epoch_id: + continue + begin_event = BeginStepEvent(epoch_id, step_id) event_handler(begin_event) if begin_event.fetch_metrics: @@ -352,6 +377,7 @@ class Trainer(object): event_handler(EndStepEvent(epoch_id, step_id, metrics)) self._save_checkpoint(epoch_id, step_id) event_handler(EndEpochEvent(epoch_id)) + self._clean_checkpoint() def _test_by_executor(self, reader, feed_order, fetch_list): with executor.scope_guard(self.scope): @@ -390,17 +416,29 @@ class Trainer(object): loss_name=self.train_func_outputs[0].name) return self._get_parallel_executor() + def _clean_checkpoint(self): + if not self.checkpoint: + return + io.clean_checkpoint(checkpoint_dir=self.checkpoint.checkpoint_dir) + def _save_checkpoint(self, epoch_id, step_id): - if not self.checkpoint or not self.chief: + if not self.checkpoint: return if epoch_id % self.checkpoint.epoch_interval == 0 and step_id % self.checkpoint.step_interval == 0: + trainer_args = {} + trainer_args["epoch_id"] = epoch_id + trainer_args["step_id"] = step_id + exe = executor.Executor(self.place) io.save_checkpoint( executor=exe, checkpoint_dir=self.checkpoint.checkpoint_dir, - max_num_checkpoints=self.checkpoint.max_num_checkpoints, - main_program=self.train_program) + trainer_id=self.trainer_id, + is_chief=self.chief, + trainer_args=trainer_args, + main_program=self.train_program, + max_num_checkpoints=self.checkpoint.max_num_checkpoints) def build_feed_var_list(program, feed_order): -- GitLab From 486e1e337d05679a22b389840136b9f07714646b Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Tue, 29 May 2018 20:36:45 +0800 Subject: [PATCH 036/913] bug fix and optimize --- python/paddle/fluid/trainer.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 206d582cdca..35bb8ded5d9 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -79,8 +79,9 @@ class CheckpointConfig(object): else: self.step_interval = step_interval - self.epoch_id = 0 - self.step_id = 0 + self._epoch_id = 0 + self._step_id = 0 + self._load_serial = None def check_and_get_place(place): @@ -174,17 +175,17 @@ class Trainer(object): exe = executor.Executor(place) exe.run(self.startup_program) - if self.load_checkpoint_serial: + if self.checkpoint._load_serial: exe = executor.Executor(place) io.load_checkpoint(exe, self.checkpoint.checkpoint_dir, - self.load_checkpoint_serial, + self.checkpoint._load_serial, self.startup_program) epoch_id, step_id = io.load_trainer_args( self.checkpoint.checkpoint_dir, self.load_checkpoint_serial, self.trainer_id, ["epoch_id", "step_id"]) - self.checkpoint.epoch_id = int(epoch_id) - self.checkpoint.step_id = int(step_id) + self.checkpoint._epoch_id = int(epoch_id) + self.checkpoint._step_id = int(step_id) if param_path and os.path.isdir(param_path): # load params from param_path into scope @@ -351,7 +352,7 @@ class Trainer(object): def _train_by_any_executor(self, event_handler, exe, num_epochs, reader): epochs = [ epoch_id for epoch_id in range(num_epochs) - if epoch_id >= self.checkpoint.epoch_id + if epoch_id >= self.checkpoint._epoch_id ] for epoch_id in epochs: event_handler(BeginEpochEvent(epoch_id)) @@ -360,7 +361,8 @@ class Trainer(object): self._clean_checkpoint() return - if self.checkpoint and self.checkpoint.step_id >= step_id and self.checkpoint.epoch_id == epoch_id: + if self.checkpoint and self.checkpoint._load_serial \ + and self.checkpoint._step_id >= step_id and self.checkpoint._epoch_id == epoch_id: continue begin_event = BeginStepEvent(epoch_id, step_id) -- GitLab From 9086043090f80ee7695d043e84fbe8068b2f76e7 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Tue, 29 May 2018 20:52:01 +0800 Subject: [PATCH 037/913] bug fix and optimize --- python/paddle/fluid/io.py | 1 - python/paddle/fluid/trainer.py | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index ed560304e25..2925e8eb289 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -529,7 +529,6 @@ def load_checkpoint(executor, checkpoint_dir, serial, main_program): raise ValueError("The values of 'main_program'should not be None") cur_dir = _get_serial_dir(checkpoint_dir, serial) - cur_dir = _get_model_dir(cur_dir) load_persist_vars_without_grad(executor, cur_dir, main_program) diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 35bb8ded5d9..5ca93821e22 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -144,7 +144,7 @@ class Trainer(object): raise TypeError( "The checkpoint_config shoule be an instance of CheckpointConfig" ) - self.load_checkpoint_serial = io.need_load_checkpoint( + self.checkpoint._load_serial = io.need_load_checkpoint( self.checkpoint.checkpoint_dir) self.scope = core.Scope() @@ -182,7 +182,7 @@ class Trainer(object): self.startup_program) epoch_id, step_id = io.load_trainer_args( - self.checkpoint.checkpoint_dir, self.load_checkpoint_serial, + self.checkpoint.checkpoint_dir, self.checkpoint._load_serial, self.trainer_id, ["epoch_id", "step_id"]) self.checkpoint._epoch_id = int(epoch_id) self.checkpoint._step_id = int(step_id) -- GitLab From add9ed3388d0082fcf26615a0408536d6932cecf Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Tue, 29 May 2018 21:52:34 +0800 Subject: [PATCH 038/913] change order of member --- paddle/fluid/framework/selected_rows.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/fluid/framework/selected_rows.cc b/paddle/fluid/framework/selected_rows.cc index c9d2388aa43..21fd05aff02 100644 --- a/paddle/fluid/framework/selected_rows.cc +++ b/paddle/fluid/framework/selected_rows.cc @@ -34,8 +34,8 @@ struct ReAllocateVisitor { tensor_->ShareDataWith(cpu_tensor); } - framework::Tensor* tensor_; framework::DDim dims_; + framework::Tensor* tensor_; }; struct TensorCopyVisitor { -- GitLab From 167312484b026d771dcd0066707e9d022e2cfddf Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Tue, 29 May 2018 23:53:10 +0800 Subject: [PATCH 039/913] use unique ptr to hold auto_grown_mutex_ for default copy and move constructor --- paddle/fluid/framework/selected_rows.cc | 2 +- paddle/fluid/framework/selected_rows.h | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/paddle/fluid/framework/selected_rows.cc b/paddle/fluid/framework/selected_rows.cc index 21fd05aff02..c05e7be1ff6 100644 --- a/paddle/fluid/framework/selected_rows.cc +++ b/paddle/fluid/framework/selected_rows.cc @@ -153,7 +153,7 @@ bool SelectedRows::Set(int64_t key, const framework::Tensor& value) { } PADDLE_ENFORCE_EQ(value.dims()[0], static_cast(1), "The first dim of value should be 1."); - std::lock_guard lock(auto_grown_mutex_); + std::lock_guard lock(*auto_grown_mutex_.get()); auto index = Index(key); bool is_new_key = false; if (index == -1) { diff --git a/paddle/fluid/framework/selected_rows.h b/paddle/fluid/framework/selected_rows.h index 487c7390875..24c8b64b031 100644 --- a/paddle/fluid/framework/selected_rows.h +++ b/paddle/fluid/framework/selected_rows.h @@ -15,6 +15,7 @@ limitations under the License. */ #pragma once #include +#include #include #include @@ -46,11 +47,13 @@ class SelectedRows { SelectedRows(const std::vector& rows, const int64_t& height) : rows_(rows), height_(height) { value_.reset(new Tensor()); + auto_grown_mutex_.reset(new std::mutex); } SelectedRows() { height_ = 0; value_.reset(new Tensor()); + auto_grown_mutex_.reset(new std::mutex); } platform::Place place() const { return value_->place(); } @@ -125,7 +128,7 @@ class SelectedRows { Vector rows_; std::unique_ptr value_{nullptr}; int64_t height_; - std::mutex auto_grown_mutex_; + std::unique_ptr auto_grown_mutex_{nullptr}; }; /* -- GitLab From fa2079b71a30a55cb2e6ff75cf528a35dd8876ae Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Wed, 30 May 2018 09:45:39 +0800 Subject: [PATCH 040/913] add mutex header --- paddle/fluid/framework/selected_rows.h | 1 + 1 file changed, 1 insertion(+) diff --git a/paddle/fluid/framework/selected_rows.h b/paddle/fluid/framework/selected_rows.h index 24c8b64b031..1990cb1434a 100644 --- a/paddle/fluid/framework/selected_rows.h +++ b/paddle/fluid/framework/selected_rows.h @@ -16,6 +16,7 @@ limitations under the License. */ #include #include +#include // NOLINT #include #include -- GitLab From 56419caa1f46da9f07ec72a6b0d31da04fb80825 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Wed, 30 May 2018 10:48:57 +0800 Subject: [PATCH 041/913] Add .cu --- paddle/fluid/operators/random_crop_op.cc | 2 +- paddle/fluid/operators/random_crop_op.cu | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 paddle/fluid/operators/random_crop_op.cu diff --git a/paddle/fluid/operators/random_crop_op.cc b/paddle/fluid/operators/random_crop_op.cc index d92b8bbbb58..b14b559e31d 100644 --- a/paddle/fluid/operators/random_crop_op.cc +++ b/paddle/fluid/operators/random_crop_op.cc @@ -74,8 +74,8 @@ namespace ops = paddle::operators; namespace f = paddle::framework; REGISTER_OPERATOR(random_crop, ops::RandomCropOp, ops::RandomCropOpMaker, ops::RandomCropOpInferShape, f::EmptyGradOpMaker); + template using Kernel = ops::RandomCropKernel; - REGISTER_OP_CPU_KERNEL(random_crop, Kernel, Kernel, Kernel, Kernel, Kernel); diff --git a/paddle/fluid/operators/random_crop_op.cu b/paddle/fluid/operators/random_crop_op.cu new file mode 100644 index 00000000000..2782911b4fe --- /dev/null +++ b/paddle/fluid/operators/random_crop_op.cu @@ -0,0 +1,20 @@ +// Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "paddle/fluid/operators/random_crop_op.h" + +template +using Kernel = ops::RandomCropKernel; +REGISTER_OP_CUDA_KERNEL(random_crop, Kernel, Kernel, Kernel, + Kernel, Kernel); -- GitLab From 0211c5df0a12de2647b339dc0a8c36d35209a1a3 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Wed, 30 May 2018 11:45:25 +0800 Subject: [PATCH 042/913] bug fix --- python/paddle/fluid/trainer.py | 17 +++++++++-------- tools/codestyle/docstring_checker.pyc | Bin 0 -> 12561 bytes 2 files changed, 9 insertions(+), 8 deletions(-) create mode 100644 tools/codestyle/docstring_checker.pyc diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 5ca93821e22..34db9b39b77 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -139,13 +139,14 @@ class Trainer(object): self.trainer_id = 0 self.chief = True self.checkpoint = checkpoint_config - if self.checkpoint and \ - not isinstance(self.checkpoint, CheckpointConfig): - raise TypeError( - "The checkpoint_config shoule be an instance of CheckpointConfig" - ) - self.checkpoint._load_serial = io.need_load_checkpoint( - self.checkpoint.checkpoint_dir) + if self.checkpoint: + if not isinstance(self.checkpoint, CheckpointConfig): + raise TypeError( + "The checkpoint_config shoule be an instance of CheckpointConfig" + ) + else: + self.checkpoint._load_serial = io.need_load_checkpoint( + self.checkpoint.checkpoint_dir) self.scope = core.Scope() @@ -175,7 +176,7 @@ class Trainer(object): exe = executor.Executor(place) exe.run(self.startup_program) - if self.checkpoint._load_serial: + if self.checkpoint and self.checkpoint._load_serial: exe = executor.Executor(place) io.load_checkpoint(exe, self.checkpoint.checkpoint_dir, self.checkpoint._load_serial, diff --git a/tools/codestyle/docstring_checker.pyc b/tools/codestyle/docstring_checker.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f0255b763c8d154b7cc17d2d525148dfea3b42d GIT binary patch literal 12561 zcmdT~Npl;=7488*kbt;or54N9SSu6>B(+$!8Cn)4%CZuRQVr#(M2iK3m?1gT00T}B zEYg-Lm69vVF}LI&q$*W8rE*K<5Z`=Een4`}DTh=}i7WZO*Mk8_(T-GhiZsb-cE9fF z<@MX&WdAWx{QTCy2Q`)aWbywB9{o!cu2QooE#+oZV5wPDOg*D!Gg8m0Agk&*HJelQ z9yQyeERM*jAg}7ZYPQ$3dsNV;>IF4hFm23MRI^3p=GCWIVux~jmDjHp@M<3+PnEhq zJD}Wx@^S(#rqDs|Wu~-)Tbw{K71ned`HjVEOJ41v7umkHTiSE&IJ9d7+0C_hDQwto zShLN@QyP`Ez#H-ZgP-YA2Ghix@M=|i$uw~f+O60Rbjf1(5Q>|Vct7;rWQghDd#<-o zZ3VIG*WwyS^C2Fu;nDk1JXUHMlUS@gwfILg&B)4nHwHM~qOW7@UbgH-dL-G_PIN{| zXC>*33EX&Yvzt760>6QoN~kF*^a^UD?`zCD8dn>Ok34_$uK9oN{FV8t@3uy2VSRMb zk4G27Q61G-U24q>^iI`v1J9JB$-g)Z13g*`T~F{h3e+0Rws$xJocCeX_RbHXu8C%q zi3=#x&DRLy4?C~o(f3h!pb3xyN+B|mNS4>mN=~_`=hUYl#~$VO2r%EKq+U`IhxH|t z1d0O{5mHpnOsU8v#!;j@uxmk8YkMgSTy4iop53fQBp;k9As5>Vyt>zj^+?giPkO`L zvfS{?sKj!;xLDk9B_kJ}B^g_;!ab89rb{`LPL_jN3vl6}2vCpES}pLZk-0?nYA;yW z7FSrQ_zgdM)5vr;vfYiGn(*bFirn^0iA*;w z*qMwLwUE&D)oQ&NfY5r;=Xh}|YUr3`?o@s4X<;FU*D9}7@tPpf=?7@55$I4joWi5I zL1hgjzk)}hCE|~VPHBmF1p1z2Nl}k86ctZ$YPF;ugS2wW2Iyf%MH5N;$P<8tH(tjp zEBn+vv}Q`2b{eQv$|r>xvLZ0>8iHg&kD$>ou2lVo3o;jK47`uLKv=cK+t>cb-c}=1 zcC+Zk71`Se4x@R;%F0{))*h>94Q6UYBk6>6Dr9*c$2Y?FDMkW^%aFcGJ%L;qAd**m zEMRnM?h9fW_+19Z(cPosta{u->_gf-v{ZCUtsGMgGntI!#pF3=8B!?6k3+Jfpw@%uNM1ZL)!~cSf_XtX-F!bY1NkO zsTrtUs?oQ01Dd8wAR9T%x01Ei zPjxqHdA7eGFJPiXp6gbv=4rjq3WBxH1VZ;A){3+k1Hv_KCHP0N)UrNL|1KI%hkQcAqYsJ#c+ow1^x`)DN2ZFw|eT8<`MRC)1}k;k^> z$;f9snU@$Y^Bc}a79?d~Bb?Um>g_I?oSM6$pwq#IP(?6#p|YMrouC4(KgeBo6eSTv*7Q;$I8;7hp|KN3eJ8(`Do^qhi0$Z57&JGv{_J>+@ipC00yTXumQjZ z1vUiOPJ!(LY`4Jn0Jc|P`v4mj*nYqc2<#wWhXnQ#V21_vGGMO=>`TCW6OezQ^9G42B2PdR5q}-EI*{R%9$}NdMxl6gH1-M(e-;v55<(`qsUge&Z z%0A_mr7}!^a+Jusj$$g*#(GJD12kcpYjnliES4hA39*MPP7f! z?S^O52H^(V{x5kYhGC_m2-Fnkp)4+6Y@!gMgQ!_4#$E z;33e(>CJti2CK9oc5T;Q(;Z#VXE4DnUu(p&h{1$B!lM&+a{ zVTzmHnT6>DxHpmUTr9Y@C{>r9a zmXVs)A#Qz>!Rbnu^l=QjAGWyJR^ZwQBiSD&R`iEN1VT*TlbkCA5{JP-rnT5s7_^|E7biXNHq`AvTMhT8KTmH-ENLPPDT+l4`&*vH* z{Ua2{=A{I%(g2XluNNLJ-cuaGGf0)j2 z<^;ViJT|;VJZG#1aNFDV(?qB_7qOslQ<5WScqQ)8p}FEPanX@qGGZDRAVDG#Pf)Uz zI-*=vIG{B2MQ(04)L+HMev2mwic=UJw~kmoNv%dbMc<2$+`!LJF*g9019*=1q^O5> z1WvQOgQut?Og_sP?$n$k5nNzef}p^Y3B+O$Zsq{Pw)o4aVO~;JMWbJGNxgDOP$n}g zqv{?nyd?hb-?61`+HPym)M!J3(exYR{u|Vt40b4eNdb8W%@a z&TA|v>YaB`OqUq-G^+FlYob}1>N5mMTm@9fP3K(#g?ewI)`>@&$@a0=X7MVEV<<$N z)LIdgF>TNiKwGI=9J+YF$CIegAyJDZH(s zknceuUs!tpC2|50{80nVsh_}Bf%M3zALET3Y6?R*Dlb`|_YLVoR3qmA*Sn7kFmC{f z!X!h+qBs#kr7qNeM9~(|Z6Y;+@x-<(As=K<*cZo6(_e+7hSB1qb*!})u=m6eY#V)@ z8D5C`HZ}Kn{WY2$L@<$i0gq;E2Wo3>F9T-4rV-M>)(@-|k;?77E8i4hxd3VsX$TZ4 zH8Lju8i5HT+5mAOwKZm&xVICFUc*~$MwkD}eHe1m+Xlsz;T*IFJgeT#@0^rB}dT=mSrI5kXLTSu_MV4s<07oQXa#9dmbJ zI;6~m>8P~yA5e4*p)R&-^Ol51+Hnl~)W|8j!z<6pZ3tBuHw|3-|6n-b7#1TA!y4UG zMsLap>-E&+h~R$-z2bf0d?ruzF2{F7|7OI65nIG`&J>pZ8<%HVPxVr+zl7%iWIAYy z97QvVGMyBte~2O$vtxBk2*851ae}4??jNQHh>K*EVYX^zC-cQH!(gP`L4%ojeT{$_ zgwg5L!@fuf5Yhclgvby}-C!#g43WVBC=_7I#rduFY^w7rCBf z_qT;yC$QOJsFD9ouGE}-M9S{QD~m?TA~gy%3snp=7@2~(%bUpBe#E2s=?-jS_;V1X zQ)*>czSV&=hNP7)XmJbBdyof^!)QUuGVt1vug=9Zx6NdU2JZQd`jt} z`tsH=KByZ)rhG4LY=nxBTLrO*_}vYC-oA`ch5WYJ8DYVcjWfoA7M}SUsp9j?O-b?~ zqfRgX&h43-cW>UFo_w!z>-x;h|9;Nfr!$I#*fHeHR}>3_gcy)S+;4c=C=`m)aJ2 zIJ7fEJo#ZM!5`O6_cMHX{Us#ev|_;P?ADOdgWvC1*8PExmkWfRSSb4`5I8Z xXLe5WP2PmumofcJdWFZ@76=ydnJ|fg%Y)ce@_|IZ)sK7#^C11%LeKD>{{o7gqwN3y literal 0 HcmV?d00001 -- GitLab From 77599415ba1b93715fa0626e147865c088970ee6 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Wed, 30 May 2018 12:15:10 +0800 Subject: [PATCH 043/913] enable read dataset --- .../tests/book/test_inference_nlp.cc | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 6ff8a18cdb1..95cdeb4ad1f 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -14,7 +14,12 @@ limitations under the License. */ #include #include +#include +#include +#include +#include #include // NOLINT +#include #include "gflags/gflags.h" #include "gtest/gtest.h" #include "paddle/fluid/inference/tests/test_helper.h" @@ -31,16 +36,37 @@ inline double get_current_ms() { return 1e+3 * time.tv_sec + 1e-3 * time.tv_usec; } +void read_data( + std::vector>* out, + const std::string& filename = "/home/tangjian/paddle-tj/out.ids.txt") { + using namespace std; // NOLINT + fstream fin(filename); + string line; + out->clear(); + while (getline(fin, line)) { + istringstream iss(line); + vector ids; + string field; + while (getline(iss, field, ' ')) { + ids.push_back(stoi(field)); + } + out->push_back(ids); + } +} + TEST(inference, understand_sentiment) { if (FLAGS_dirname.empty()) { LOG(FATAL) << "Usage: ./example --dirname=path/to/your/model"; } - + std::vector> inputdatas; + read_data(&inputdatas); + LOG(INFO) << "---------- dataset size: " << inputdatas.size(); LOG(INFO) << "FLAGS_dirname: " << FLAGS_dirname << std::endl; std::string dirname = FLAGS_dirname; + const bool model_combined = false; - int total_work = 100; - int num_threads = 10; + int total_work = 10; + int num_threads = 2; int work_per_thread = total_work / num_threads; std::vector> infer_threads; for (int i = 0; i < num_threads; ++i) { -- GitLab From 0606818291a9ca5a6bd8e56e8a0fdc1d85f97e6f Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Wed, 30 May 2018 13:28:40 +0800 Subject: [PATCH 044/913] rm ste::move when return a unique_ptr in inference --- paddle/contrib/inference/paddle_inference_api_impl.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/contrib/inference/paddle_inference_api_impl.cc b/paddle/contrib/inference/paddle_inference_api_impl.cc index e7a0b341dda..349bd3b4036 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/paddle_inference_api_impl.cc @@ -141,7 +141,7 @@ std::unique_ptr PaddlePredictorImpl::Clone() { return nullptr; } // fix manylinux compile error. - return std::move(cls); + return cls; } // TODO(panyx0718): Consider merge with Init()? -- GitLab From 7c42e5de1a4db1662db19a1b62c63ce98de713a6 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Wed, 30 May 2018 13:37:41 +0800 Subject: [PATCH 045/913] Polish RandomCropOp --- paddle/fluid/operators/random_crop_op.cc | 2 +- paddle/fluid/operators/random_crop_op.cu | 20 +++++++++++++++++++ python/paddle/fluid/layers/nn.py | 5 +++-- .../paddle/fluid/tests/unittests/op_test.py | 2 -- 4 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 paddle/fluid/operators/random_crop_op.cu diff --git a/paddle/fluid/operators/random_crop_op.cc b/paddle/fluid/operators/random_crop_op.cc index d92b8bbbb58..b14b559e31d 100644 --- a/paddle/fluid/operators/random_crop_op.cc +++ b/paddle/fluid/operators/random_crop_op.cc @@ -74,8 +74,8 @@ namespace ops = paddle::operators; namespace f = paddle::framework; REGISTER_OPERATOR(random_crop, ops::RandomCropOp, ops::RandomCropOpMaker, ops::RandomCropOpInferShape, f::EmptyGradOpMaker); + template using Kernel = ops::RandomCropKernel; - REGISTER_OP_CPU_KERNEL(random_crop, Kernel, Kernel, Kernel, Kernel, Kernel); diff --git a/paddle/fluid/operators/random_crop_op.cu b/paddle/fluid/operators/random_crop_op.cu new file mode 100644 index 00000000000..2782911b4fe --- /dev/null +++ b/paddle/fluid/operators/random_crop_op.cu @@ -0,0 +1,20 @@ +// Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "paddle/fluid/operators/random_crop_op.h" + +template +using Kernel = ops::RandomCropKernel; +REGISTER_OP_CUDA_KERNEL(random_crop, Kernel, Kernel, Kernel, + Kernel, Kernel); diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index c337e0f4f20..3f04dcccd6a 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -3990,15 +3990,16 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): return out -def random_crop(input, shape, seed=0): +def random_crop(input, shape, seed=1): helper = LayerHelper("random_crop", **locals()) dtype = helper.input_dtype() out = helper.create_tmp_variable(dtype) if isinstance(seed, int): + seed_value = seed seed = helper.create_global_variable( persistable=True, shape=[1], dtype="int32") helper.set_variable_initializer( - var=seed, initializer=Constant(value=seed)) + var=seed, initializer=Constant(value=seed_value)) elif not isinstance(seed, Variable): raise ValueError("'seed' must be a Variable or an int.") seed_out = helper.create_tmp_variable(dtype="int32") diff --git a/python/paddle/fluid/tests/unittests/op_test.py b/python/paddle/fluid/tests/unittests/op_test.py index b7e62533b33..b611470fa1f 100644 --- a/python/paddle/fluid/tests/unittests/op_test.py +++ b/python/paddle/fluid/tests/unittests/op_test.py @@ -336,8 +336,6 @@ class OpTest(unittest.TestCase): actual_t = np.array(actual) expect = self.outputs[out_name] expect_t = expect[0] if isinstance(expect, tuple) else expect - import pdb - pdb.set_trace() self.assertTrue( np.allclose( actual_t, expect_t, atol=atol), -- GitLab From 45530c772e484d5033ceee90a034278f09ada6ba Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Wed, 30 May 2018 13:45:09 +0800 Subject: [PATCH 046/913] Fix GPU compile --- paddle/fluid/operators/random_crop_op.cu | 1 + paddle/fluid/operators/random_crop_op.h | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/paddle/fluid/operators/random_crop_op.cu b/paddle/fluid/operators/random_crop_op.cu index 2782911b4fe..6fc9bedc55b 100644 --- a/paddle/fluid/operators/random_crop_op.cu +++ b/paddle/fluid/operators/random_crop_op.cu @@ -14,6 +14,7 @@ #include "paddle/fluid/operators/random_crop_op.h" +namespace ops = paddle::operators; template using Kernel = ops::RandomCropKernel; REGISTER_OP_CUDA_KERNEL(random_crop, Kernel, Kernel, Kernel, diff --git a/paddle/fluid/operators/random_crop_op.h b/paddle/fluid/operators/random_crop_op.h index a34294f5eeb..e0e24a7d1fa 100644 --- a/paddle/fluid/operators/random_crop_op.h +++ b/paddle/fluid/operators/random_crop_op.h @@ -60,7 +60,7 @@ HOSTDEVICE inline void StridedMemcpy(const T* x, const size_t* x_dims, T* out, size_t offset_i = offsets[i]; if (i == rank - 1) { - PADDLE_ENFORCE(x_stride == 1 && out_stride == 1); + PADDLE_ASSERT(x_stride == 1 && out_stride == 1); x += offset_i; for (size_t j = 0; j < out_dim_i; ++j) { *out++ = *x++; @@ -105,12 +105,12 @@ struct RandomCropFunctor { prod_batchsize_dims_ = 1; prod_x_ins_dims_ = 1; prod_out_ins_dims_ = 1; - for (size_t i = 0; i < rank_; ++i) { + for (size_t i = 0; i < static_cast(rank_); ++i) { size_t x_dim_i = x_dims[i]; size_t out_dim_i = out_dims[i]; x_dims_[i] = x_dim_i; out_dims_[i] = out_dim_i; - if (i < num_batchsize_dims_) { + if (i < static_cast(num_batchsize_dims_)) { PADDLE_ENFORCE_EQ(x_dim_i, out_dim_i); prod_batchsize_dims_ *= x_dim_i; } else { -- GitLab From 0deb6f90baa5dab02b5ff1cbc98dcaf7fae9b80b Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Wed, 30 May 2018 14:20:51 +0800 Subject: [PATCH 047/913] annotation optimized and code style optimized --- python/paddle/fluid/io.py | 22 +++++++++++++++++++++- python/paddle/fluid/trainer.py | 12 ++++++------ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index 2925e8eb289..d52c9a88236 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -478,9 +478,10 @@ def save_checkpoint(executor, :param executor :param checkpoint_dir + :param trainer_id + :param is_chief :param main_program :param max_num_checkpoints - :param is_chief """ if checkpoint_dir is None: raise ValueError("The values of 'checkpoint_dir' should not be None") @@ -502,6 +503,11 @@ def save_checkpoint(executor, def need_load_checkpoint(checkpoint_dir): + """ + If the directory have checkpoint files, it will return lastest checkpoint directory serial number + + :param checkpoint_dir + """ serial = _get_lastest_checkpoint_dir(checkpoint_dir) if serial < 0: return None @@ -515,6 +521,7 @@ def load_checkpoint(executor, checkpoint_dir, serial, main_program): :param executor :param checkpoint_dir + :param serial :param main_program """ @@ -536,7 +543,11 @@ def clean_checkpoint(checkpoint_dir, delete_dir=False): """ clean the checkpoint dir, when the train exits normally, the trainer will call clean_checkpoint to delete checkpoint directory saved before. delete_dir only works when the directory is empty, otherwise, OSError is raised. + + :param checkpoint_dir + :param delete_dir """ + if checkpoint_dir is None: raise ValueError("The values of 'checkpoint_dir' should not be None") _lru_delete(checkpoint_dir, max_num_checkpoints=0) @@ -549,6 +560,11 @@ def load_persist_vars_without_grad(executor, dirname, program, nest=True): """ load_persist_vars_without_grad will load variables from a directory by an executor, the variable named end with "@GRAD" will not be loaded. + + :param executor + :param dirname + :param program + :param nest """ if nest: @@ -566,6 +582,10 @@ def save_persist_vars_without_grad(executor, dirname, program): """ save_persist_vars_without_grad will save variables to a directory by an executor, the variable named end with "@GRAD" will not be saved. + + :param executor + :param dirname + :param program """ cur_dir = _get_model_dir(dirname) save_vars( diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 34db9b39b77..6d8d4a3e43b 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -79,8 +79,8 @@ class CheckpointConfig(object): else: self.step_interval = step_interval - self._epoch_id = 0 - self._step_id = 0 + self.epoch_id = 0 + self.step_id = 0 self._load_serial = None @@ -185,8 +185,8 @@ class Trainer(object): epoch_id, step_id = io.load_trainer_args( self.checkpoint.checkpoint_dir, self.checkpoint._load_serial, self.trainer_id, ["epoch_id", "step_id"]) - self.checkpoint._epoch_id = int(epoch_id) - self.checkpoint._step_id = int(step_id) + self.checkpoint.epoch_id = int(epoch_id) + self.checkpoint.step_id = int(step_id) if param_path and os.path.isdir(param_path): # load params from param_path into scope @@ -353,7 +353,7 @@ class Trainer(object): def _train_by_any_executor(self, event_handler, exe, num_epochs, reader): epochs = [ epoch_id for epoch_id in range(num_epochs) - if epoch_id >= self.checkpoint._epoch_id + if epoch_id >= self.checkpoint.epoch_id ] for epoch_id in epochs: event_handler(BeginEpochEvent(epoch_id)) @@ -363,7 +363,7 @@ class Trainer(object): return if self.checkpoint and self.checkpoint._load_serial \ - and self.checkpoint._step_id >= step_id and self.checkpoint._epoch_id == epoch_id: + and self.checkpoint.step_id >= step_id and self.checkpoint.epoch_id == epoch_id: continue begin_event = BeginStepEvent(epoch_id, step_id) -- GitLab From 46f13237dc32c113ec0788fbe4b569ca0b5353b0 Mon Sep 17 00:00:00 2001 From: sneaxiy Date: Wed, 30 May 2018 14:29:16 +0800 Subject: [PATCH 048/913] Fix bugs in framework/tensor_impl.h and polish framework/reader.cc --- paddle/fluid/framework/reader.cc | 4 +++- paddle/fluid/framework/tensor_impl.h | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/paddle/fluid/framework/reader.cc b/paddle/fluid/framework/reader.cc index 76126f3dc64..0b36f1116d1 100644 --- a/paddle/fluid/framework/reader.cc +++ b/paddle/fluid/framework/reader.cc @@ -25,8 +25,10 @@ void FileReader::ReadNext(std::vector *out) { if (out->empty()) { return; } + + PADDLE_ENFORCE_EQ(out->size(), dims_.size()); for (size_t i = 0; i < dims_.size(); ++i) { - auto &actual = out->at(i).dims(); + auto &actual = (*out)[i].dims(); auto &expect = dims_[i]; PADDLE_ENFORCE_EQ(actual.size(), expect.size()); diff --git a/paddle/fluid/framework/tensor_impl.h b/paddle/fluid/framework/tensor_impl.h index 0a1db7758bd..2f19ec0f0a9 100644 --- a/paddle/fluid/framework/tensor_impl.h +++ b/paddle/fluid/framework/tensor_impl.h @@ -39,7 +39,7 @@ template inline const T* Tensor::data() const { check_memory_size(); PADDLE_ENFORCE(std::is_same::value || - holder_->type().hash_code() == typeid(T).hash_code(), + holder_->type() == std::type_index(typeid(T)), "Tensor holds the wrong type, it holds %s", this->holder_->type().name()); @@ -53,7 +53,7 @@ template inline T* Tensor::data() { check_memory_size(); PADDLE_ENFORCE(std::is_same::value || - holder_->type().hash_code() == typeid(T).hash_code(), + holder_->type() == std::type_index(typeid(T)), "Tensor holds the wrong type, it holds %s", this->holder_->type().name()); return reinterpret_cast(reinterpret_cast(holder_->ptr()) + -- GitLab From 30d32035b249c183443fc678f6ed2e32810f08ad Mon Sep 17 00:00:00 2001 From: mozga-intel Date: Wed, 30 May 2018 08:43:30 +0200 Subject: [PATCH 049/913] Withdraw mkldnn mul --- paddle/fluid/operators/mul_mkldnn_op.cc | 197 ------------------ paddle/fluid/operators/mul_op.cc | 39 ---- python/paddle/fluid/layers/nn.py | 13 +- .../tests/unittests/test_mul_mkldnn_op.py | 44 ---- .../fluid/tests/unittests/test_mul_op.py | 18 +- .../tests/unittests/test_operator_desc.py | 5 +- 6 files changed, 8 insertions(+), 308 deletions(-) delete mode 100644 paddle/fluid/operators/mul_mkldnn_op.cc delete mode 100644 python/paddle/fluid/tests/unittests/test_mul_mkldnn_op.py diff --git a/paddle/fluid/operators/mul_mkldnn_op.cc b/paddle/fluid/operators/mul_mkldnn_op.cc deleted file mode 100644 index a5f3a98f678..00000000000 --- a/paddle/fluid/operators/mul_mkldnn_op.cc +++ /dev/null @@ -1,197 +0,0 @@ -/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. */ - -#include "mkldnn.hpp" -#include "paddle/fluid/framework/tensor.h" -#include "paddle/fluid/operators/mul_op.h" -#include "paddle/fluid/platform/device_context.h" -#include "paddle/fluid/platform/mkldnn_helper.h" - -namespace paddle { -namespace operators { - -using paddle::framework::Tensor; -using paddle::platform::MKLDNNDeviceContext; - -template -mkldnn::memory::desc type(const std::vector& dims, Format&& f) { - return platform::MKLDNNMemDesc(dims, mkldnn::memory::data_type::f32, f); -} - -template -class MulMKLDNNOpKernel : public paddle::framework::OpKernel { - void Compute(const paddle::framework::ExecutionContext& ctx) const override { - PADDLE_ENFORCE(paddle::platform::is_cpu_place(ctx.GetPlace()), - "It must use CPUPlace."); - - auto& dev_ctx = ctx.template device_context(); - auto mkldnn_engine = dev_ctx.GetEngine(); - - auto input = ctx.Input("X"); - auto weight = ctx.Input("Y"); - - PADDLE_ENFORCE(input->dims().size() & (2 | 4), - "Input must be with 2 or 4 dimensions, i.e. NC or NCHW"); - PADDLE_ENFORCE(weight->dims().size() & (2 | 4), - "Weights must be with 2 or 4 dimensions, i.e. OI or OIHW"); - - std::vector w_tz = paddle::framework::vectorize2int(weight->dims()); - std::vector src_tz = paddle::framework::vectorize2int(input->dims()); - - auto src_md = - src_tz.size() != 2 - ? type(src_tz, mkldnn::memory::format::nchw) - : type({src_tz[0], src_tz[1]}, mkldnn::memory::format::nc); - - auto dst_md = type({src_tz[0], w_tz[1]}, mkldnn::memory::format::nc); - - auto weights_md = - src_tz.size() != 2 - ? type({w_tz[1], src_tz[1], src_tz[2], src_tz[3]}, - mkldnn::memory::format::oihw) - : type({w_tz[1], src_tz[1]}, mkldnn::memory::format::oi); - - auto output = ctx.Output("Out"); - T* output_data = output->mutable_data(ctx.GetPlace()); - - const std::string key = ctx.op().Output("Out"); - const std::string key_fc_pd = key + "@mul_pd"; - - const T* input_data = input->data(); - const T* w_data = weight->data(); - - auto dst_memory = mkldnn::memory({dst_md, mkldnn_engine}, output_data); - - auto src_memory = mkldnn::memory({src_md, mkldnn_engine}, - platform::to_void_cast(input_data)); - - auto weights_memory = mkldnn::memory({weights_md, mkldnn_engine}, - platform::to_void_cast(w_data)); - - auto pd = platform::MKLDNNFwdPrimitiveDesc( - mkldnn_engine, src_md, weights_md, dst_md); - - dev_ctx.SetBlob(key_fc_pd, pd); - - auto forward = mkldnn::inner_product_forward(*pd, src_memory, - weights_memory, dst_memory); - - std::vector pipeline = {forward}; - mkldnn::stream(mkldnn::stream::kind::eager).submit(pipeline).wait(); - } -}; - -template -class MulMKLDNNGradOpKernel : public paddle::framework::OpKernel { - public: - void Compute(const paddle::framework::ExecutionContext& ctx) const override { - PADDLE_ENFORCE(paddle::platform::is_cpu_place(ctx.GetPlace()), - "It must use CPUPlace."); - - auto& dev_ctx = ctx.template device_context(); - auto mkldnn_engine = dev_ctx.GetEngine(); - - const Tensor* input = ctx.Input("X"); - const Tensor* w = ctx.Input("Y"); - - const Tensor* out_grad = ctx.Input(framework::GradVarName("Out")); - Tensor* input_grad = ctx.Output(framework::GradVarName("X")); - Tensor* w_grad = ctx.Output(framework::GradVarName("Y")); - - const std::string key = ctx.op().Input("Out"); - const std::string key_fc_pd = key + "@mul_pd"; - - const T* input_data = input->data(); - const T* w_data = w->data(); - const T* out_grad_data = out_grad->data(); - T* input_grad_data = nullptr; - T* w_grad_data = nullptr; - - if (input_grad) { - input_grad_data = input_grad->mutable_data(ctx.GetPlace()); - } - if (w_grad) { - w_grad_data = w_grad->mutable_data(ctx.GetPlace()); - } - - std::vector src_tz = paddle::framework::vectorize2int(input->dims()); - std::vector w_tz = paddle::framework::vectorize2int(w->dims()); - - auto src_md = - src_tz.size() != 2 - ? type(src_tz, mkldnn::memory::format::nchw) - : type({src_tz[0], src_tz[1]}, mkldnn::memory::format::nc); - - auto dst_md = type({src_tz[0], w_tz[1]}, mkldnn::memory::format::nc); - - auto weights_md = - src_tz.size() != 2 - ? type({w_tz[1], src_tz[1], src_tz[2], src_tz[3]}, - mkldnn::memory::format::oihw) - : type({w_tz[1], src_tz[1]}, mkldnn::memory::format::oi); - - auto src_memory = mkldnn::memory({src_md, mkldnn_engine}, - platform::to_void_cast(input_data)); - - auto dst_memory = mkldnn::memory({dst_md, mkldnn_engine}, - platform::to_void_cast(out_grad_data)); - - auto weight_memory = mkldnn::memory({weights_md, mkldnn_engine}, - platform::to_void_cast(w_data)); - - auto pd = - std::static_pointer_cast( - dev_ctx.GetBlob(key_fc_pd)); - - PADDLE_ENFORCE(pd != nullptr, "Fail to find pd in device context"); - - if (w_grad) { - auto weights_grad_memory = mkldnn::memory( - {weights_md, mkldnn_engine}, platform::to_void_cast(w_grad_data)); - - auto bwd_weight_pd = platform::MKLDNNBwdPrimitiveDesc< - mkldnn::inner_product_backward_weights>(mkldnn_engine, *pd, src_md, - weights_md, dst_md); - - auto bwd_weights_prim = mkldnn::inner_product_backward_weights( - bwd_weight_pd, src_memory, dst_memory, weights_grad_memory); - - std::vector pipeline{bwd_weights_prim}; - mkldnn::stream(mkldnn::stream::kind::eager).submit(pipeline).wait(); - } - - if (input_grad) { - auto src_grad_memory = mkldnn::memory( - {src_md, mkldnn_engine}, platform::to_void_cast(input_grad_data)); - - auto bwd_data_pd = - platform::MKLDNNBwdPrimitiveDesc( - mkldnn_engine, *pd, src_md, weights_md, dst_md); - - auto bwd_data_prim = mkldnn::inner_product_backward_data( - bwd_data_pd, dst_memory, weight_memory, src_grad_memory); - - std::vector pipeline{bwd_data_prim}; - mkldnn::stream(mkldnn::stream::kind::eager).submit(pipeline).wait(); - } - } -}; -} // namespace operators -} // namespace paddle - -REGISTER_OP_KERNEL(mul, MKLDNN, ::paddle::platform::CPUPlace, - paddle::operators::MulMKLDNNOpKernel); - -REGISTER_OP_KERNEL(mul_grad, MKLDNN, ::paddle::platform::CPUPlace, - paddle::operators::MulMKLDNNGradOpKernel); diff --git a/paddle/fluid/operators/mul_op.cc b/paddle/fluid/operators/mul_op.cc index a43739463c8..51993398bd3 100644 --- a/paddle/fluid/operators/mul_op.cc +++ b/paddle/fluid/operators/mul_op.cc @@ -16,10 +16,6 @@ limitations under the License. */ #include #include -#ifdef PADDLE_WITH_MKLDNN -#include "paddle/fluid/platform/mkldnn_helper.h" -#endif - namespace paddle { namespace operators { @@ -76,22 +72,6 @@ class MulOp : public framework::OperatorWithKernel { ctx->SetOutputDim("Out", framework::make_ddim(output_dims)); ctx->ShareLoD("X", /*->*/ "Out"); } - - private: - framework::OpKernelType GetExpectedKernelType( - const framework::ExecutionContext& ctx) const override { - framework::LibraryType library{framework::LibraryType::kPlain}; -#ifdef PADDLE_WITH_MKLDNN - if (library == framework::LibraryType::kPlain && - platform::CanMKLDNNBeUsed(ctx)) { - library = framework::LibraryType::kMKLDNN; - } -#endif - framework::DataLayout layout{framework::DataLayout::kAnyLayout}; - return framework::OpKernelType( - framework::ToDataType(ctx.Input("X")->type()), ctx.GetPlace(), - layout, library); - } }; class MulOpMaker : public framework::OpProtoAndCheckerMaker { @@ -120,9 +100,6 @@ class MulOpMaker : public framework::OpProtoAndCheckerMaker { )DOC") .SetDefault(1) .EqualGreaterThan(1); - AddAttr("use_mkldnn", - "(bool, default false) Only used in mkldnn kernel") - .SetDefault(false); AddAttr( "y_num_col_dims", R"DOC((int, default 1), The mul_op can take tensors with more than two, @@ -177,22 +154,6 @@ class MulGradOp : public framework::OperatorWithKernel { ctx->SetOutputDim(y_grad_name, y_dims); } } - - private: - framework::OpKernelType GetExpectedKernelType( - const framework::ExecutionContext& ctx) const override { - framework::LibraryType library{framework::LibraryType::kPlain}; -#ifdef PADDLE_WITH_MKLDNN - if (library == framework::LibraryType::kPlain && - platform::CanMKLDNNBeUsed(ctx)) { - library = framework::LibraryType::kMKLDNN; - } -#endif - framework::DataLayout layout{framework::DataLayout::kAnyLayout}; - return framework::OpKernelType( - framework::ToDataType(ctx.Input("X")->type()), ctx.GetPlace(), - layout, library); - } }; } // namespace operators diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index e18b7acdeed..9569abb581e 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -177,11 +177,8 @@ def fc(input, inputs={"X": input_var, "Y": w}, outputs={"Out": tmp}, - attrs={ - "x_num_col_dims": num_flatten_dims, - "y_num_col_dims": 1, - "use_mkldnn": use_mkldnn - }) + attrs={"x_num_col_dims": num_flatten_dims, + "y_num_col_dims": 1}) mul_results.append(tmp) if len(mul_results) == 1: @@ -3929,10 +3926,10 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): Bilinear interpolation is an extension of linear interpolation for interpolating functions of two variables (e.g. H-direction and W-direction in this layer) on a rectilinear 2D grid. - + For details, please refer to Wikipedia: https://en.wikipedia.org/wiki/Bilinear_interpolation - + Args: input (Variable): The input tensor of bilinear interpolation, This is a 4-D tensor of the shape @@ -3950,7 +3947,7 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): Returns: out (Variable): The output is a 4-D tensor of the shape (num_batches, channls, out_h, out_w). - + Examples: .. code-block:: python diff --git a/python/paddle/fluid/tests/unittests/test_mul_mkldnn_op.py b/python/paddle/fluid/tests/unittests/test_mul_mkldnn_op.py deleted file mode 100644 index 42d68ef376d..00000000000 --- a/python/paddle/fluid/tests/unittests/test_mul_mkldnn_op.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import unittest -from test_mul_op import TestMulOp, TestMulOp2, TestFP16MulOp1, TestFP16MulOp2 - - -class TestMKLDNNMulOp(TestMulOp): - def init_op_test(self): - super(TestMKLDNNMulOp, self).setUp() - self.attrs = {"use_mkldnn": True} - - -class TestMKLDNNMulOp2(TestMulOp2): - def init_op_test(self): - super(TestMKLDNNMulOp2, self).setUp() - self.attrs = {"use_mkldnn": True} - - -class TestMKLDNNFP16MulOp1(TestFP16MulOp1): - def init_op_test(self): - super(TestMKLDNNFP16MulOp1, self).setUp() - self.attrs = {"use_mkldnn": True} - - -class TestMKLDNNFP16MulOp2(TestFP16MulOp2): - def init_op_test(self): - super(TestMKLDNNFP16MulOp2, self).setUp() - self.attrs = {"use_mkldnn": True} - - -if __name__ == "__main__": - unittest.main() diff --git a/python/paddle/fluid/tests/unittests/test_mul_op.py b/python/paddle/fluid/tests/unittests/test_mul_op.py index d984393c89f..862b7f8cb93 100644 --- a/python/paddle/fluid/tests/unittests/test_mul_op.py +++ b/python/paddle/fluid/tests/unittests/test_mul_op.py @@ -21,12 +21,10 @@ from op_test import OpTest class TestMulOp(OpTest): def setUp(self): self.op_type = "mul" - self.use_mkldnn = False self.inputs = { 'X': np.random.random((32, 84)).astype("float32"), 'Y': np.random.random((84, 100)).astype("float32") } - self.attrs = {'use_mkldnn': self.use_mkldnn} self.outputs = {'Out': np.dot(self.inputs['X'], self.inputs['Y'])} def test_check_output(self): @@ -47,16 +45,11 @@ class TestMulOp(OpTest): class TestMulOp2(OpTest): def setUp(self): self.op_type = "mul" - self.use_mkldnn = False self.inputs = { 'X': np.random.random((15, 4, 12, 10)).astype("float32"), 'Y': np.random.random((4, 30, 8, 2, 9)).astype("float32") } - self.attrs = { - 'x_num_col_dims': 2, - 'y_num_col_dims': 2, - 'use_mkldnn': self.use_mkldnn - } + self.attrs = {'x_num_col_dims': 2, 'y_num_col_dims': 2} result = np.dot(self.inputs['X'].reshape(15 * 4, 12 * 10), self.inputs['Y'].reshape(4 * 30, 8 * 2 * 9)) result = result.reshape(15, 4, 8, 2, 9) @@ -80,11 +73,9 @@ class TestMulOp2(OpTest): class TestFP16MulOp1(OpTest): def setUp(self): self.op_type = "mul" - self.use_mkldnn = False x = np.random.random((32, 84)).astype("float16") y = np.random.random((84, 100)).astype("float16") self.inputs = {'X': x.view(np.uint16), 'Y': y.view(np.uint16)} - self.attrs = {'use_mkldnn': self.use_mkldnn} self.outputs = {'Out': np.dot(x, y)} def test_check_output(self): @@ -97,15 +88,10 @@ class TestFP16MulOp1(OpTest): class TestFP16MulOp2(OpTest): def setUp(self): self.op_type = "mul" - self.use_mkldnn = False x = np.random.random((15, 4, 12, 10)).astype("float16") y = np.random.random((4, 30, 8, 2, 9)).astype("float16") self.inputs = {'X': x.view(np.uint16), 'Y': y.view(np.uint16)} - self.attrs = { - 'x_num_col_dims': 2, - 'y_num_col_dims': 2, - 'use_mkldnn': self.use_mkldnn - } + self.attrs = {'x_num_col_dims': 2, 'y_num_col_dims': 2} result = np.dot( x.reshape(15 * 4, 12 * 10), y.reshape(4 * 30, 8 * 2 * 9)) result = result.reshape(15, 4, 8, 2, 9) diff --git a/python/paddle/fluid/tests/unittests/test_operator_desc.py b/python/paddle/fluid/tests/unittests/test_operator_desc.py index 8b15aa6822a..c098a5a0cb0 100644 --- a/python/paddle/fluid/tests/unittests/test_operator_desc.py +++ b/python/paddle/fluid/tests/unittests/test_operator_desc.py @@ -63,10 +63,7 @@ class TestOperator(unittest.TestCase): self.assertEqual(mul_op.output("Out"), ["mul.out"]) self.assertEqual( set(mul_op.attr_names), - set([ - "x_num_col_dims", "y_num_col_dims", "use_mkldnn", "op_role", - "op_role_var" - ])) + set(["x_num_col_dims", "y_num_col_dims", "op_role", "op_role_var"])) self.assertEqual(mul_op.has_attr("x_num_col_dims"), True) self.assertEqual(mul_op.attr_type("x_num_col_dims"), core.AttrType.INT) self.assertEqual(mul_op.attr("x_num_col_dims"), 1) -- GitLab From 3cb639568804927b395edecfb7c34ea8f44b803d Mon Sep 17 00:00:00 2001 From: Xin Pan Date: Wed, 30 May 2018 00:01:53 -0700 Subject: [PATCH 050/913] better profiler and benchmark --- benchmark/fluid/fluid_benchmark.py | 32 ++++++++------ paddle/fluid/operators/CMakeLists.txt | 2 + paddle/fluid/platform/profiler.cc | 12 ++++-- python/paddle/fluid/profiler.py | 62 ++++++++++++++++----------- 4 files changed, 66 insertions(+), 42 deletions(-) diff --git a/benchmark/fluid/fluid_benchmark.py b/benchmark/fluid/fluid_benchmark.py index 30b070e4aca..c1d458970a5 100644 --- a/benchmark/fluid/fluid_benchmark.py +++ b/benchmark/fluid/fluid_benchmark.py @@ -98,6 +98,8 @@ def parse_args(): '--use_fake_data', action='store_true', help='If set ommit the actual read data operators.') + parser.add_argument( + '--profile', action='store_true', help='If set, profile a few steps.') parser.add_argument( '--update_method', type=str, @@ -108,8 +110,8 @@ def parse_args(): return args -def append_nccl2_prepare(): - if os.getenv("PADDLE_TRAINER_ID", None) != None: +def append_nccl2_prepare(trainer_id): + if trainer_id >= 0: # append gen_nccl_id at the end of startup program trainer_id = int(os.getenv("PADDLE_TRAINER_ID")) port = os.getenv("PADDLE_PSERVER_PORT") @@ -136,12 +138,12 @@ def append_nccl2_prepare(): }) return nccl_id_var, num_trainers, trainer_id else: - raise Exception( - "must set PADDLE_TRAINER_ID env variables for dist train.") + raise Exception("must set positive PADDLE_TRAINER_ID env variables for " + "nccl-based dist train.") -def dist_transpile(): - if "PADDLE_TRAINING_ROLE" not in os.environ: +def dist_transpile(trainer_id): + if trainer_id < 0: return None, None # the port of all pservers, needed by both trainer and pserver @@ -158,9 +160,6 @@ def dist_transpile(): trainers = int(os.getenv("PADDLE_TRAINERS")) # the IP of the local machine, needed by pserver only current_endpoint = os.getenv("PADDLE_CURRENT_IP", "") + ":" + port - # the unique trainer id, starting from 0, needed by trainer - # only - trainer_id = int(os.getenv("PADDLE_TRAINER_ID", "0")) # the role, should be either PSERVER or TRAINER training_role = os.getenv("PADDLE_TRAINING_ROLE") @@ -295,6 +294,11 @@ def train_parallel(avg_loss, infer_prog, optimizer, train_reader, test_reader, iters = 0 start_time = time.time() for batch_id, data in enumerate(train_reader()): + if args.profile and pass_id == 0 and batch_id == 5: + profiler.start_profiler("All") + elif args.profile and pass_id == 0 and batch_id == 10: + profiler.stop_profiler("total", "/tmp/profile_%d" % trainer_id) + if iters == args.skip_batch_num: start_time = time.time() num_samples = 0 @@ -334,7 +338,11 @@ def print_arguments(args): def main(): args = parse_args() print_arguments(args) - nccl_id_var, num_trainers, trainer_id = None, 1, 0 + + # the unique trainer id, starting from 0, needed by trainer + # only + nccl_id_var, num_trainers, trainer_id = ( + None, 1, int(os.getenv("PADDLE_TRAINER_ID", "-1"))) if args.use_cprof: pr = cProfile.Profile() @@ -348,7 +356,7 @@ def main(): fluid.memory_optimize(fluid.default_main_program()) if args.update_method == "pserver": - train_prog, startup_prog = dist_transpile() + train_prog, startup_prog = dist_transpile(trainer_id) if not train_prog: raise Exception( "Must configure correct environments to run dist train.") @@ -364,7 +372,7 @@ def main(): train_args.append(fluid.default_startup_program()) if args.update_method == "nccl2": - nccl_id_var, num_trainers, trainer_id = append_nccl2_prepare() + nccl_id_var, num_trainers, trainer_id = append_nccl2_prepare(trainer_id) if args.gpus == 1: # NOTE: parallel executor use profiler interanlly if args.use_nvprof and args.device == 'GPU': diff --git a/paddle/fluid/operators/CMakeLists.txt b/paddle/fluid/operators/CMakeLists.txt index e00cc73565f..3f455b791b4 100644 --- a/paddle/fluid/operators/CMakeLists.txt +++ b/paddle/fluid/operators/CMakeLists.txt @@ -272,6 +272,8 @@ if(NOT WITH_MKLDNN) list(REMOVE_ITEM GENERAL_OPS fc_op) endif(NOT WITH_MKLDNN) +list(REMOVE_ITEM GENERAL_OPS reduce_op) + foreach(src ${GENERAL_OPS}) op_library(${src}) endforeach() diff --git a/paddle/fluid/platform/profiler.cc b/paddle/fluid/platform/profiler.cc index 2fb5c6dc6b8..04f450aa3ec 100644 --- a/paddle/fluid/platform/profiler.cc +++ b/paddle/fluid/platform/profiler.cc @@ -38,6 +38,7 @@ struct EventList; static int64_t profiler_lister_id = 0; static bool should_send_profile_state = false; +std::mutex profiler_mu; // The profiler state, the initial value is ProfilerState::kDisabled static ProfilerState g_state = ProfilerState::kDisabled; @@ -228,11 +229,13 @@ void EnableProfiler(ProfilerState state) { PADDLE_ENFORCE(state != ProfilerState::kDisabled, "Can't enbale profling, since the input state is ", "ProfilerState::kDisabled"); + + std::lock_guard l(profiler_mu); if (state == g_state) { return; } g_state = state; - should_send_profile_state = true; + { should_send_profile_state = true; } GetDeviceTracer()->Enable(); #ifdef PADDLE_WITH_CUDA if (g_state == ProfilerState::kCUDA) { @@ -295,7 +298,7 @@ void PrintProfiler(const std::vector>& events_table, } else if (g_state == ProfilerState::kAll) { place = "All"; } else { - PADDLE_THROW("Invalid profiler state"); + PADDLE_THROW("Invalid profiler state", g_state); } std::cout << "Place: " << place << std::endl; @@ -443,6 +446,7 @@ void ParseEvents(const std::vector>& events, void DisableProfiler(EventSortingKey sorted_key, const std::string& profile_path) { + std::lock_guard l(profiler_mu); if (g_state == ProfilerState::kDisabled) return; // Mark the profiling stop. Mark("_stop_profiler_", nullptr); @@ -456,7 +460,7 @@ void DisableProfiler(EventSortingKey sorted_key, tracer->GenProfile(profile_path); } g_state = ProfilerState::kDisabled; - should_send_profile_state = true; + { should_send_profile_state = true; } } bool IsProfileEnabled() { return g_state != ProfilerState::kDisabled; } @@ -466,7 +470,7 @@ void SetProfileListener() { std::mt19937 rng; rng.seed(std::random_device()()); std::uniform_int_distribution dist6( - 1, std::numeric_limits::max()); + 1, std::numeric_limits::max()); profiler_lister_id = dist6(rng); } int64_t ListenerId() { return profiler_lister_id; } diff --git a/python/paddle/fluid/profiler.py b/python/paddle/fluid/profiler.py index 04fd05cc33c..2e87cab88ec 100644 --- a/python/paddle/fluid/profiler.py +++ b/python/paddle/fluid/profiler.py @@ -16,7 +16,10 @@ import core from contextlib import contextmanager import os -__all__ = ['cuda_profiler', 'reset_profiler', 'profiler'] +__all__ = [ + 'cuda_profiler', 'reset_profiler', 'profiler', 'start_profiler', + 'stop_profiler' +] NVPROF_CONFIG = [ "gpustarttimestamp", @@ -72,6 +75,36 @@ def reset_profiler(): core.reset_profiler() +def start_profiler(state): + if state not in ['CPU', 'GPU', "All"]: + raise ValueError("The state must be 'CPU' or 'GPU' or 'All'.") + if state == "GPU": + prof_state = core.ProfilerState.kCUDA + elif state == "CPU": + prof_state = core.ProfilerState.kCPU + else: + prof_state = core.ProfilerState.kAll + core.enable_profiler(prof_state) + + +def stop_profiler(sorted_key=None, profile_path='/tmp/profile'): + sorted_key = 'default' if sorted_key is None else sorted_key + if sorted_key not in ['default', 'calls', 'total', 'max', 'min', 'ave']: + raise ValueError("The sorted_key must be None or in 'calls', 'total', " + "'max', 'min' and 'ave'") + key_map = { + 'default': core.EventSortingKey.kDefault, + 'calls': core.EventSortingKey.kCalls, + 'total': core.EventSortingKey.kTotal, + 'max': core.EventSortingKey.kMax, + 'min': core.EventSortingKey.kMin, + 'ave': core.EventSortingKey.kAve, + } + # TODO(qingqing) : redirect C++ ostream to Python stream. + # with core.ostream_redirect(stdout=True, stderr=True): + core.disable_profiler(key_map[sorted_key], profile_path) + + @contextmanager def profiler(state, sorted_key=None, profile_path='/tmp/profile'): """The profiler interface. @@ -98,29 +131,6 @@ def profiler(state, sorted_key=None, profile_path='/tmp/profile'): profile_path (string) : If state == 'All', it will write a profile proto output file. """ - if state not in ['CPU', 'GPU', "All"]: - raise ValueError("The state must be 'CPU' or 'GPU' or 'All'.") - if state == "GPU": - prof_state = core.ProfilerState.kCUDA - elif state == "CPU": - prof_state = core.ProfilerState.kCPU - else: - prof_state = core.ProfilerState.kAll - core.enable_profiler(prof_state) + start_profiler(state) yield - - sorted_key = 'default' if sorted_key is None else sorted_key - if sorted_key not in ['default', 'calls', 'total', 'max', 'min', 'ave']: - raise ValueError("The sorted_key must be None or in 'calls', 'total', " - "'max', 'min' and 'ave'") - key_map = { - 'default': core.EventSortingKey.kDefault, - 'calls': core.EventSortingKey.kCalls, - 'total': core.EventSortingKey.kTotal, - 'max': core.EventSortingKey.kMax, - 'min': core.EventSortingKey.kMin, - 'ave': core.EventSortingKey.kAve, - } - # TODO(qingqing) : redirect C++ ostream to Python stream. - # with core.ostream_redirect(stdout=True, stderr=True): - core.disable_profiler(key_map[sorted_key], profile_path) + stop_profiler(sorted_key, profile_path) -- GitLab From 47d9f64ff7a756606fdc0e600366178eb96ed694 Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Wed, 30 May 2018 15:11:32 +0800 Subject: [PATCH 051/913] PaddlePredictorImpl::Clone return unique_ptr --- paddle/contrib/inference/paddle_inference_api_impl.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/paddle/contrib/inference/paddle_inference_api_impl.cc b/paddle/contrib/inference/paddle_inference_api_impl.cc index 349bd3b4036..bf510620eb1 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/paddle_inference_api_impl.cc @@ -135,10 +135,11 @@ bool PaddlePredictorImpl::Run(const std::vector &inputs, std::unique_ptr PaddlePredictorImpl::Clone() { VLOG(3) << "Predictor::clone"; - std::unique_ptr cls(new PaddlePredictorImpl(config_)); + std::unique_ptr cls(nullptr); if (!cls->InitShared()) { LOG(ERROR) << "fail to call InitShared"; - return nullptr; + } else { + cls.reset(new PaddlePredictorImpl(config_)); } // fix manylinux compile error. return cls; -- GitLab From 3bce3dbce14a0ec4f65f54ed73cd268e3f5964ce Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Wed, 30 May 2018 15:13:38 +0800 Subject: [PATCH 052/913] fix a bug --- paddle/fluid/framework/operator.cc | 1 + python/paddle/fluid/layers/nn.py | 16 +++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/paddle/fluid/framework/operator.cc b/paddle/fluid/framework/operator.cc index d70f26026c2..30f784598a8 100644 --- a/paddle/fluid/framework/operator.cc +++ b/paddle/fluid/framework/operator.cc @@ -466,6 +466,7 @@ class RuntimeInferShapeContext : public InferShapeContext { protected: DDim GetDim(const std::string& name) const override { Variable* var = scope_.FindVar(name); + PADDLE_ENFORCE_NOT_NULL(var); if (var->IsType()) { return var->Get().dims(); } else if (var->IsType()) { diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index 3f04dcccd6a..ec95efd699b 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -3996,13 +3996,19 @@ def random_crop(input, shape, seed=1): out = helper.create_tmp_variable(dtype) if isinstance(seed, int): seed_value = seed - seed = helper.create_global_variable( - persistable=True, shape=[1], dtype="int32") - helper.set_variable_initializer( - var=seed, initializer=Constant(value=seed_value)) + seed = helper.create_tmp_variable(dtype="int64") + helper.append_op( + type="fill_constant", + inputs={}, + outputs={"Out": seed}, + attrs={ + "dtype": seed.dtype, + "shape": [1], + "value": float(seed_value) + }) elif not isinstance(seed, Variable): raise ValueError("'seed' must be a Variable or an int.") - seed_out = helper.create_tmp_variable(dtype="int32") + seed_out = helper.create_tmp_variable(dtype="int64") helper.append_op( type="random_crop", inputs={"X": input, -- GitLab From 4736281c5ce22ecae663896d56b5158da81328c9 Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Wed, 30 May 2018 15:16:05 +0800 Subject: [PATCH 053/913] restore --- paddle/contrib/inference/paddle_inference_api_impl.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/paddle/contrib/inference/paddle_inference_api_impl.cc b/paddle/contrib/inference/paddle_inference_api_impl.cc index bf510620eb1..349bd3b4036 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/paddle_inference_api_impl.cc @@ -135,11 +135,10 @@ bool PaddlePredictorImpl::Run(const std::vector &inputs, std::unique_ptr PaddlePredictorImpl::Clone() { VLOG(3) << "Predictor::clone"; - std::unique_ptr cls(nullptr); + std::unique_ptr cls(new PaddlePredictorImpl(config_)); if (!cls->InitShared()) { LOG(ERROR) << "fail to call InitShared"; - } else { - cls.reset(new PaddlePredictorImpl(config_)); + return nullptr; } // fix manylinux compile error. return cls; -- GitLab From a6c11a5d95e9f1b62589a42305e5a9b97a4194f5 Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Wed, 30 May 2018 16:22:41 +0800 Subject: [PATCH 054/913] Fix bug in CUDA --- paddle/fluid/operators/random_crop_op.h | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/paddle/fluid/operators/random_crop_op.h b/paddle/fluid/operators/random_crop_op.h index e0e24a7d1fa..f3261cbdc98 100644 --- a/paddle/fluid/operators/random_crop_op.h +++ b/paddle/fluid/operators/random_crop_op.h @@ -67,7 +67,7 @@ HOSTDEVICE inline void StridedMemcpy(const T* x, const size_t* x_dims, T* out, } } else { x += offset_i * x_stride; - for (size_t j = 0; j < x_dim_i; ++j) { + for (size_t j = 0; j < out_dim_i; ++j) { StridedMemcpy(x, x_dims, out, out_dims, i + 1, rank, x_stride, out_stride, offsets); x += x_stride; @@ -86,8 +86,6 @@ struct RandomCropFunctor { int rank_; int64_t seed_; - size_t prod_x_dims_; - size_t prod_out_dims_; size_t prod_batchsize_dims_; size_t prod_x_ins_dims_; size_t prod_out_ins_dims_; @@ -118,8 +116,6 @@ struct RandomCropFunctor { prod_out_ins_dims_ *= out_dim_i; } } - prod_x_dims_ = prod_batchsize_dims_ * prod_x_ins_dims_; - prod_out_dims_ = prod_batchsize_dims_ * prod_out_ins_dims_; } HOSTDEVICE void operator()(size_t ins_idx) { @@ -146,7 +142,17 @@ template class RandomCropKernel : public framework::OpKernel { public: virtual void Compute(const framework::ExecutionContext& ctx) const { - int64_t seed = *ctx.Input("Seed")->data(); + auto& seed_tensor = detail::Ref(ctx.Input("Seed")); + int64_t seed = 0; + if (platform::is_cpu_place(seed_tensor.place())) { + seed = *seed_tensor.data(); + } else { + LOG(WARNING) << "It is slow to place seed in GPU memory. Please verify " + "your program"; + framework::LoDTensor cpu_seed; + framework::TensorCopySync(seed_tensor, platform::CPUPlace(), &cpu_seed); + seed = *cpu_seed.data(); + } auto shape = ctx.Attr>("shape"); auto& x = detail::Ref(ctx.Input("X")); auto& out = detail::Ref(ctx.Output("Out")); -- GitLab From cb01c59481d85113968c809b658c5fa375a39e80 Mon Sep 17 00:00:00 2001 From: Xin Pan Date: Wed, 30 May 2018 16:26:52 +0800 Subject: [PATCH 055/913] add back reduce_op --- paddle/fluid/operators/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/paddle/fluid/operators/CMakeLists.txt b/paddle/fluid/operators/CMakeLists.txt index 3f455b791b4..e00cc73565f 100644 --- a/paddle/fluid/operators/CMakeLists.txt +++ b/paddle/fluid/operators/CMakeLists.txt @@ -272,8 +272,6 @@ if(NOT WITH_MKLDNN) list(REMOVE_ITEM GENERAL_OPS fc_op) endif(NOT WITH_MKLDNN) -list(REMOVE_ITEM GENERAL_OPS reduce_op) - foreach(src ${GENERAL_OPS}) op_library(${src}) endforeach() -- GitLab From d712af25dcee298a1bd1fda1bba6a1f0ed001ab0 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Wed, 30 May 2018 16:29:05 +0800 Subject: [PATCH 056/913] add distribute config --- python/paddle/fluid/trainer.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 6d8d4a3e43b..e98672f3187 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -81,7 +81,8 @@ class CheckpointConfig(object): self.epoch_id = 0 self.step_id = 0 - self._load_serial = None + self.load_serial = None + self.is_pserver = False def check_and_get_place(place): @@ -145,7 +146,7 @@ class Trainer(object): "The checkpoint_config shoule be an instance of CheckpointConfig" ) else: - self.checkpoint._load_serial = io.need_load_checkpoint( + self.checkpoint.load_serial = io.need_load_checkpoint( self.checkpoint.checkpoint_dir) self.scope = core.Scope() @@ -176,17 +177,18 @@ class Trainer(object): exe = executor.Executor(place) exe.run(self.startup_program) - if self.checkpoint and self.checkpoint._load_serial: + if self.checkpoint and self.checkpoint.load_serial: exe = executor.Executor(place) io.load_checkpoint(exe, self.checkpoint.checkpoint_dir, - self.checkpoint._load_serial, + self.checkpoint.load_serial, self.startup_program) - epoch_id, step_id = io.load_trainer_args( - self.checkpoint.checkpoint_dir, self.checkpoint._load_serial, - self.trainer_id, ["epoch_id", "step_id"]) - self.checkpoint.epoch_id = int(epoch_id) - self.checkpoint.step_id = int(step_id) + if not self.checkpoint.is_pserver: + epoch_id, step_id = io.load_trainer_args( + self.checkpoint.checkpoint_dir, self.checkpoint.load_serial, + self.trainer_id, ["epoch_id", "step_id"]) + self.checkpoint.epoch_id = int(epoch_id) + self.checkpoint.step_id = int(step_id) if param_path and os.path.isdir(param_path): # load params from param_path into scope @@ -259,6 +261,9 @@ class Trainer(object): t.transpile( trainer_id, pservers=pserver_endpoints, trainers=trainers) if training_role == "PSERVER": + if self.checkpoint: + self.is_pserver = True + self.train_program = t.get_pserver_program(current_endpoint) self.startup_program = t.get_startup_program(current_endpoint, self.train_program) @@ -362,7 +367,7 @@ class Trainer(object): self._clean_checkpoint() return - if self.checkpoint and self.checkpoint._load_serial \ + if self.checkpoint and self.checkpoint.load_serial \ and self.checkpoint.step_id >= step_id and self.checkpoint.epoch_id == epoch_id: continue -- GitLab From 8868a54d5f52bb444f6beda19abbf78e6619b9d1 Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Wed, 30 May 2018 17:34:08 +0800 Subject: [PATCH 057/913] use flags to fix the compile problem --- paddle/contrib/inference/CMakeLists.txt | 2 ++ paddle/contrib/inference/paddle_inference_api_impl.cc | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/paddle/contrib/inference/CMakeLists.txt b/paddle/contrib/inference/CMakeLists.txt index a4fe10f708e..bea30fb6732 100644 --- a/paddle/contrib/inference/CMakeLists.txt +++ b/paddle/contrib/inference/CMakeLists.txt @@ -13,6 +13,8 @@ # limitations under the License. # +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=pessimizing-move") + function(inference_api_test TARGET_NAME TEST_SRC DEP_TEST) set(options "") set(oneValueArgs "") diff --git a/paddle/contrib/inference/paddle_inference_api_impl.cc b/paddle/contrib/inference/paddle_inference_api_impl.cc index 349bd3b4036..e7a0b341dda 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/paddle_inference_api_impl.cc @@ -141,7 +141,7 @@ std::unique_ptr PaddlePredictorImpl::Clone() { return nullptr; } // fix manylinux compile error. - return cls; + return std::move(cls); } // TODO(panyx0718): Consider merge with Init()? -- GitLab From 109ee924eb60b3d335cb058a0c5c5299a5bacc2d Mon Sep 17 00:00:00 2001 From: Xin Pan Date: Wed, 30 May 2018 17:38:25 +0800 Subject: [PATCH 058/913] add tests and polish infer impl (#11009) --- paddle/contrib/inference/CMakeLists.txt | 7 +- .../inference/paddle_inference_api_impl.cc | 57 +++++----- .../inference/paddle_inference_api_impl.h | 26 ++--- .../test_paddle_inference_api_impl.cc | 106 +++++++++++++++--- 4 files changed, 128 insertions(+), 68 deletions(-) diff --git a/paddle/contrib/inference/CMakeLists.txt b/paddle/contrib/inference/CMakeLists.txt index a4fe10f708e..25b11abf2e5 100644 --- a/paddle/contrib/inference/CMakeLists.txt +++ b/paddle/contrib/inference/CMakeLists.txt @@ -13,7 +13,7 @@ # limitations under the License. # -function(inference_api_test TARGET_NAME TEST_SRC DEP_TEST) +function(inference_api_test TARGET_NAME TEST_SRC) set(options "") set(oneValueArgs "") set(multiValueArgs ARGS) @@ -34,6 +34,8 @@ function(inference_api_test TARGET_NAME TEST_SRC DEP_TEST) SRCS ${TEST_SRC} DEPS paddle_fluid_api paddle_inference_api paddle_inference_api_impl ARGS --dirname=${PYTHON_TESTS_DIR}/book/) + # TODO(panyx0178): Figure out how to add word2vec and image_classification + # as deps. # set_tests_properties(${TARGET_NAME} # PROPERTIES DEPENDS ${DEP_TEST}) endforeach() @@ -53,5 +55,4 @@ cc_test(test_paddle_inference_api DEPS paddle_inference_api) inference_api_test(test_paddle_inference_api_impl - test_paddle_inference_api_impl.cc - test_word2vec) + test_paddle_inference_api_impl.cc) diff --git a/paddle/contrib/inference/paddle_inference_api_impl.cc b/paddle/contrib/inference/paddle_inference_api_impl.cc index e7a0b341dda..ebe4c329180 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/paddle_inference_api_impl.cc @@ -102,8 +102,8 @@ bool PaddlePredictorImpl::Run(const std::vector &inputs, Timer timer; timer.tic(); // set feed variable - std::map feed_targets; - std::vector feeds; + std::map feed_targets; + std::vector feeds; if (!SetFeed(inputs, &feeds)) { LOG(ERROR) << "fail to set feed"; return false; @@ -112,8 +112,8 @@ bool PaddlePredictorImpl::Run(const std::vector &inputs, feed_targets[feed_target_names_[i]] = &feeds[i]; } // get fetch variable - std::map fetch_targets; - std::vector fetchs; + std::map fetch_targets; + std::vector fetchs; fetchs.resize(fetch_target_names_.size()); for (size_t i = 0; i < fetch_target_names_.size(); ++i) { fetch_targets[fetch_target_names_[i]] = &fetchs[i]; @@ -149,28 +149,27 @@ bool PaddlePredictorImpl::InitShared() { VLOG(3) << "Predictor::init_shared"; // 1. Define place, executor, scope if (this->config_.device >= 0) { - place_ = paddle::platform::CUDAPlace(); + place_ = platform::CUDAPlace(); } else { - place_ = paddle::platform::CPUPlace(); + place_ = platform::CPUPlace(); } - this->executor_.reset(new paddle::framework::Executor(this->place_)); - this->scope_.reset(new paddle::framework::Scope()); + this->executor_.reset(new framework::Executor(this->place_)); + this->scope_.reset(new framework::Scope()); // Initialize the inference program if (!this->config_.model_dir.empty()) { // Parameters are saved in separate files sited in // the specified `dirname`. - this->inference_program_ = paddle::inference::Load( + this->inference_program_ = inference::Load( this->executor_.get(), this->scope_.get(), this->config_.model_dir); } else if (!this->config_.prog_file.empty() && !this->config_.param_file.empty()) { // All parameters are saved in a single file. // The file names should be consistent with that used // in Python API `fluid.io.save_inference_model`. - this->inference_program_ = - paddle::inference::Load(this->executor_.get(), - this->scope_.get(), - this->config_.prog_file, - this->config_.param_file); + this->inference_program_ = inference::Load(this->executor_.get(), + this->scope_.get(), + this->config_.prog_file, + this->config_.param_file); } this->ctx_ = this->executor_->Prepare(*this->inference_program_, 0); // 3. create variables @@ -185,24 +184,21 @@ bool PaddlePredictorImpl::InitShared() { return true; } -bool PaddlePredictorImpl::SetFeed( - const std::vector &inputs, - std::vector *feeds) { +bool PaddlePredictorImpl::SetFeed(const std::vector &inputs, + std::vector *feeds) { VLOG(3) << "Predictor::set_feed"; if (inputs.size() != feed_target_names_.size()) { LOG(ERROR) << "wrong feed input size."; return false; } for (size_t i = 0; i < feed_target_names_.size(); ++i) { - paddle::framework::LoDTensor input; - paddle::framework::DDim ddim = - paddle::framework::make_ddim(inputs[i].shape); + framework::LoDTensor input; + framework::DDim ddim = framework::make_ddim(inputs[i].shape); void *input_ptr; if (inputs[i].dtype == PaddleDType::INT64) { - input_ptr = - input.mutable_data(ddim, paddle::platform::CPUPlace()); + input_ptr = input.mutable_data(ddim, platform::CPUPlace()); } else if (inputs[i].dtype == PaddleDType::FLOAT32) { - input_ptr = input.mutable_data(ddim, paddle::platform::CPUPlace()); + input_ptr = input.mutable_data(ddim, platform::CPUPlace()); } else { LOG(ERROR) << "unsupported feed type " << inputs[i].dtype; return false; @@ -213,13 +209,12 @@ bool PaddlePredictorImpl::SetFeed( inputs[i].data.data, inputs[i].data.length); feeds->push_back(input); - LOG(ERROR) << "Actual feed type " << feeds->back().type().name(); } return true; } bool PaddlePredictorImpl::GetFetch( - const std::vector &fetchs, + const std::vector &fetchs, std::vector *outputs) { VLOG(3) << "Predictor::get_fetch"; outputs->resize(fetchs.size()); @@ -284,8 +279,9 @@ bool PaddlePredictorImpl::GetFetch( return true; } -std::unique_ptr CreatePaddlePredictorImpl( - const VisConfig &config) { +template <> +std::unique_ptr CreatePaddlePredictor( + const ConfigImpl &config) { VLOG(3) << "create PaddlePredictorImpl"; // 1. GPU memeroy std::vector flags; @@ -299,12 +295,11 @@ std::unique_ptr CreatePaddlePredictorImpl( framework::InitGflags(flags); } - std::unique_ptr predictor( - new PaddlePredictorImpl(config)); - if (!predictor->Init()) { + std::unique_ptr predictor(new PaddlePredictorImpl(config)); + if (!dynamic_cast(predictor.get())->Init()) { return nullptr; } - return predictor; + return std::move(predictor); } } // namespace paddle diff --git a/paddle/contrib/inference/paddle_inference_api_impl.h b/paddle/contrib/inference/paddle_inference_api_impl.h index a0c7ff03073..c5454616807 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.h +++ b/paddle/contrib/inference/paddle_inference_api_impl.h @@ -29,7 +29,7 @@ namespace paddle { -struct VisConfig : public PaddlePredictor::Config { +struct ConfigImpl : public PaddlePredictor::Config { int device; float fraction_of_gpu_memory; std::string prog_file; @@ -37,12 +37,9 @@ struct VisConfig : public PaddlePredictor::Config { bool share_variables; }; -/* - * Do not use this, just a demo indicating how to customize a Predictor. - */ class PaddlePredictorImpl : public PaddlePredictor { public: - explicit PaddlePredictorImpl(const VisConfig &config) : config_(config) {} + explicit PaddlePredictorImpl(const ConfigImpl &config) : config_(config) {} bool Init(); @@ -56,21 +53,18 @@ class PaddlePredictorImpl : public PaddlePredictor { private: bool InitShared() override; bool SetFeed(const std::vector &input_datas, - std::vector *feeds); - bool GetFetch(const std::vector &fetchs, + std::vector *feeds); + bool GetFetch(const std::vector &fetchs, std::vector *output_data); - VisConfig config_; - paddle::platform::Place place_; - std::unique_ptr executor_; - std::unique_ptr scope_; - std::unique_ptr ctx_; - std::unique_ptr inference_program_; + ConfigImpl config_; + platform::Place place_; + std::unique_ptr executor_; + std::unique_ptr scope_; + std::unique_ptr ctx_; + std::unique_ptr inference_program_; std::vector feed_target_names_; std::vector fetch_target_names_; }; -std::unique_ptr CreatePaddlePredictorImpl( - const VisConfig &config); - } // namespace paddle diff --git a/paddle/contrib/inference/test_paddle_inference_api_impl.cc b/paddle/contrib/inference/test_paddle_inference_api_impl.cc index 2a58f6989d5..096293a4e25 100644 --- a/paddle/contrib/inference/test_paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/test_paddle_inference_api_impl.cc @@ -40,16 +40,19 @@ PaddleTensor LodTensorToPaddleTensor(framework::LoDTensor* t) { return pt; } -TEST(paddle_inference_api_impl, word2vec) { - VisConfig config; +ConfigImpl GetConfig() { + ConfigImpl config; config.model_dir = FLAGS_dirname + "word2vec.inference.model"; LOG(INFO) << "dirname " << config.model_dir; config.fraction_of_gpu_memory = 0.15; config.device = 0; config.share_variables = true; + return config; +} - std::unique_ptr predictor = - CreatePaddlePredictorImpl(config); +TEST(paddle_inference_api_impl, word2vec) { + ConfigImpl config = GetConfig(); + std::unique_ptr predictor = CreatePaddlePredictor(config); framework::LoDTensor first_word, second_word, third_word, fourth_word; framework::LoD lod{{0, 1}}; @@ -60,24 +63,91 @@ TEST(paddle_inference_api_impl, word2vec) { SetupLoDTensor(&third_word, lod, static_cast(0), dict_size - 1); SetupLoDTensor(&fourth_word, lod, static_cast(0), dict_size - 1); - std::vector cpu_feeds; - cpu_feeds.push_back(LodTensorToPaddleTensor(&first_word)); - cpu_feeds.push_back(LodTensorToPaddleTensor(&second_word)); - cpu_feeds.push_back(LodTensorToPaddleTensor(&third_word)); - cpu_feeds.push_back(LodTensorToPaddleTensor(&fourth_word)); + std::vector paddle_tensor_feeds; + paddle_tensor_feeds.push_back(LodTensorToPaddleTensor(&first_word)); + paddle_tensor_feeds.push_back(LodTensorToPaddleTensor(&second_word)); + paddle_tensor_feeds.push_back(LodTensorToPaddleTensor(&third_word)); + paddle_tensor_feeds.push_back(LodTensorToPaddleTensor(&fourth_word)); + + std::vector outputs; + ASSERT_TRUE(predictor->Run(paddle_tensor_feeds, &outputs)); + ASSERT_EQ(outputs.size(), 1UL); + size_t len = outputs[0].data.length; + float* data = static_cast(outputs[0].data.data); + for (int j = 0; j < len / sizeof(float); ++j) { + ASSERT_LT(data[j], 1.0); + ASSERT_GT(data[j], -1.0); + } + + std::vector cpu_feeds; + cpu_feeds.push_back(&first_word); + cpu_feeds.push_back(&second_word); + cpu_feeds.push_back(&third_word); + cpu_feeds.push_back(&fourth_word); + + framework::LoDTensor output1; + std::vector cpu_fetchs1; + cpu_fetchs1.push_back(&output1); + + TestInference(config.model_dir, cpu_feeds, cpu_fetchs1); + + float* lod_data = output1.data(); + for (size_t i = 0; i < output1.numel(); ++i) { + EXPECT_LT(lod_data[i] - data[i], 1e-3); + EXPECT_GT(lod_data[i] - data[i], -1e-3); + } + + free(outputs[0].data.data); +} + +TEST(paddle_inference_api_impl, image_classification) { + int batch_size = 2; + bool use_mkldnn = false; + bool repeat = false; + ConfigImpl config = GetConfig(); + config.model_dir = + FLAGS_dirname + "image_classification_resnet.inference.model"; + + const bool is_combined = false; + std::vector> feed_target_shapes = + GetFeedTargetShapes(config.model_dir, is_combined); + + framework::LoDTensor input; + // Use normilized image pixels as input data, + // which should be in the range [0.0, 1.0]. + feed_target_shapes[0][0] = batch_size; + framework::DDim input_dims = framework::make_ddim(feed_target_shapes[0]); + SetupTensor( + &input, input_dims, static_cast(0), static_cast(1)); + std::vector cpu_feeds; + cpu_feeds.push_back(&input); + + framework::LoDTensor output1; + std::vector cpu_fetchs1; + cpu_fetchs1.push_back(&output1); + + TestInference(config.model_dir, + cpu_feeds, + cpu_fetchs1, + repeat, + is_combined, + use_mkldnn); + + std::unique_ptr predictor = CreatePaddlePredictor(config); + std::vector paddle_tensor_feeds; + paddle_tensor_feeds.push_back(LodTensorToPaddleTensor(&input)); std::vector outputs; - ASSERT_TRUE(predictor->Run(cpu_feeds, &outputs)); + ASSERT_TRUE(predictor->Run(paddle_tensor_feeds, &outputs)); ASSERT_EQ(outputs.size(), 1UL); - for (size_t i = 0; i < outputs.size(); ++i) { - size_t len = outputs[i].data.length; - float* data = static_cast(outputs[i].data.data); - for (size_t j = 0; j < len / sizeof(float); ++j) { - ASSERT_LT(data[j], 1.0); - ASSERT_GT(data[j], -1.0); - } - free(outputs[i].data.data); + size_t len = outputs[0].data.length; + float* data = static_cast(outputs[0].data.data); + float* lod_data = output1.data(); + for (size_t j = 0; j < len / sizeof(float); ++j) { + EXPECT_LT(lod_data[j] - data[j], 1e-10); + EXPECT_GT(lod_data[j] - data[j], -1e-10); } + free(data); } } // namespace paddle -- GitLab From 32c0e82ca00dacdddd074f196c1f8a67d33d7579 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Wed, 30 May 2018 17:41:16 +0800 Subject: [PATCH 059/913] fix two bugs --- .../operators/reader/create_custom_reader_op.cc | 12 ++++++------ python/paddle/fluid/layers/nn.py | 3 ++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/paddle/fluid/operators/reader/create_custom_reader_op.cc b/paddle/fluid/operators/reader/create_custom_reader_op.cc index 4ecbf8ed4f0..331224a5989 100644 --- a/paddle/fluid/operators/reader/create_custom_reader_op.cc +++ b/paddle/fluid/operators/reader/create_custom_reader_op.cc @@ -23,13 +23,12 @@ namespace reader { class CustomReader : public framework::DecoratedReader { public: CustomReader(ReaderBase* reader, const framework::BlockDesc& sub_block, - const platform::Place& dev_place, const std::vector& source_var_names, const std::vector& sink_var_names) : DecoratedReader(reader), program_(*sub_block.Program()), sub_block_id_(sub_block.ID()), - exe_(framework::Executor(dev_place)), + exe_(framework::Executor(platform::CPUPlace())), source_var_names_(source_var_names), sink_var_names_(sink_var_names) {} @@ -60,7 +59,7 @@ class CreateCustomReaderOp : public framework::OperatorBase { const auto& underlying_reader = scope.FindVar(Input("UnderlyingReader")) ->Get(); out->Reset( - new CustomReader(underlying_reader.Get(), *sub_block, dev_place, + new CustomReader(underlying_reader.Get(), *sub_block, Attr>("source_var_names"), Attr>("sink_var_names"))); } @@ -85,9 +84,10 @@ class CreateCustomReaderOpMaker : public DecoratedReaderMakerBase { CreateCustomReader Operator A custom reader can be used for input data preprocessing. - A custom reader holds its own sub-block, which will be executed in its - 'ReadNext()' function. Users can configurate their own preprocessing - pipelines by inserting operators into custom reader's sub-block. + A custom reader holds its own sub-block, which will be executed in CPU + in its 'ReadNext()' function. Users can configurate their own + preprocessing pipelines by inserting operators into custom reader's + sub-block. )DOC"); } }; diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index f049dd6fd9e..3bb9fd04038 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -4009,7 +4009,8 @@ def random_crop(input, shape, seed=1): attrs={ "dtype": seed.dtype, "shape": [1], - "value": float(seed_value) + "value": float(seed_value), + "force_cpu": True }) elif not isinstance(seed, Variable): raise ValueError("'seed' must be a Variable or an int.") -- GitLab From e3c4a58835cf301a163aa977383e46a213ceb437 Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Wed, 30 May 2018 18:42:31 +0800 Subject: [PATCH 060/913] add -Wno-error=pessimizing-move only on macos --- paddle/contrib/inference/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/paddle/contrib/inference/CMakeLists.txt b/paddle/contrib/inference/CMakeLists.txt index bea30fb6732..5043e4e02c8 100644 --- a/paddle/contrib/inference/CMakeLists.txt +++ b/paddle/contrib/inference/CMakeLists.txt @@ -13,7 +13,9 @@ # limitations under the License. # -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=pessimizing-move") +if(APPLE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=pessimizing-move") +endif(APPLE) function(inference_api_test TARGET_NAME TEST_SRC DEP_TEST) set(options "") -- GitLab From b44ede803387c0e292322ba140468599a9136352 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Wed, 30 May 2018 19:26:12 +0800 Subject: [PATCH 061/913] bug fix --- python/paddle/fluid/trainer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index e98672f3187..b4f719855f4 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -252,14 +252,14 @@ class Trainer(object): current_endpoint = os.getenv("PADDLE_CURRENT_IP", "") + ":" + port # the unique trainer id, starting from 0, needed by trainer # only - trainer_id = int(os.getenv("PADDLE_TRAINER_ID", "0")) + self.trainer_id = int(os.getenv("PADDLE_TRAINER_ID", "0")) self.chief = self.trainer_id == 0 # the role, should be either PSERVER or TRAINER training_role = os.getenv("PADDLE_TRAINING_ROLE") with self._prog_and_scope_guard(): t = distribute_transpiler.DistributeTranspiler() t.transpile( - trainer_id, pservers=pserver_endpoints, trainers=trainers) + self.trainer_id, pservers=pserver_endpoints, trainers=trainers) if training_role == "PSERVER": if self.checkpoint: self.is_pserver = True -- GitLab From f14e579cc37f5128b3e675c3aa05a1f3658ecef3 Mon Sep 17 00:00:00 2001 From: Xin Pan Date: Wed, 30 May 2018 19:52:23 +0800 Subject: [PATCH 062/913] clean up --- paddle/fluid/platform/profiler.cc | 4 ++-- paddle/fluid/pybind/pybind.cc | 1 + python/paddle/fluid/profiler.py | 26 ++++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/paddle/fluid/platform/profiler.cc b/paddle/fluid/platform/profiler.cc index 04f450aa3ec..3d8d64e4c27 100644 --- a/paddle/fluid/platform/profiler.cc +++ b/paddle/fluid/platform/profiler.cc @@ -235,7 +235,7 @@ void EnableProfiler(ProfilerState state) { return; } g_state = state; - { should_send_profile_state = true; } + should_send_profile_state = true; GetDeviceTracer()->Enable(); #ifdef PADDLE_WITH_CUDA if (g_state == ProfilerState::kCUDA) { @@ -460,7 +460,7 @@ void DisableProfiler(EventSortingKey sorted_key, tracer->GenProfile(profile_path); } g_state = ProfilerState::kDisabled; - { should_send_profile_state = true; } + should_send_profile_state = true; } bool IsProfileEnabled() { return g_state != ProfilerState::kDisabled; } diff --git a/paddle/fluid/pybind/pybind.cc b/paddle/fluid/pybind/pybind.cc index 50a1c07251b..767c3883384 100644 --- a/paddle/fluid/pybind/pybind.cc +++ b/paddle/fluid/pybind/pybind.cc @@ -492,6 +492,7 @@ All parameter, weight, gradient are variables in Paddle. m.def("enable_profiler", platform::EnableProfiler); m.def("disable_profiler", platform::DisableProfiler); + m.def("is_profiler_enabled", platform::IsProfileEnabled); m.def("reset_profiler", platform::ResetProfiler); // -- python binds for parallel executor. diff --git a/python/paddle/fluid/profiler.py b/python/paddle/fluid/profiler.py index 2e87cab88ec..e2bd1d4c9a1 100644 --- a/python/paddle/fluid/profiler.py +++ b/python/paddle/fluid/profiler.py @@ -76,6 +76,15 @@ def reset_profiler(): def start_profiler(state): + """Enable the profiler. + + Args: + state (string) : The profiling state, which should be 'CPU', 'GPU' + or 'All'. 'CPU' means only profile CPU. 'GPU' means profiling + GPU as well. 'All' also generates timeline. + """ + if core.is_profiler_enabled(): + return if state not in ['CPU', 'GPU', "All"]: raise ValueError("The state must be 'CPU' or 'GPU' or 'All'.") if state == "GPU": @@ -88,6 +97,23 @@ def start_profiler(state): def stop_profiler(sorted_key=None, profile_path='/tmp/profile'): + """Stop the profiler. + + Args: + sorted_key (string) : If None, the profiling results will be printed + in the order of first end time of events. Otherwise, the profiling + results will be sorted by the this flag. This flag should be one + of 'calls', 'total', 'max', 'min' or 'ave'. + The `calls` means sorting by the number of calls. + The `total` means sorting by the total execution time. + The `max` means sorting by the maximum execution time. + The `min` means sorting by the minimum execution time. + The `ave` means sorting by the average execution time. + profile_path (string) : If state == 'All', it will write a profile + proto output file. + """ + if not core.is_profiler_enabled(): + return sorted_key = 'default' if sorted_key is None else sorted_key if sorted_key not in ['default', 'calls', 'total', 'max', 'min', 'ave']: raise ValueError("The sorted_key must be None or in 'calls', 'total', " -- GitLab From b4a9d532486a828587ce381f88788337990e030e Mon Sep 17 00:00:00 2001 From: chengduoZH Date: Wed, 30 May 2018 20:48:24 +0800 Subject: [PATCH 063/913] fix contribution doc --- CONTRIBUTING.md | 2 ++ doc/v2/dev/contribute_to_paddle_cn.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3c36cffcb4e..b1b02bcc2f4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -58,6 +58,8 @@ PaddlePaddle uses this [Git branching model](http://nvie.com/posts/a-successful- create mode 100644 233 ``` + NOTE: The `yapf` installed by `pip install pre-commit` and `conda install -c conda-forge pre-commit` is slightly different. Paddle developers use `pip install pre-commit`. + 1. Build and test Users can build PaddlePaddle natively on Linux and Mac OS X. But to unify the building environment and to make it easy for debugging, the recommended way is [using Docker](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/howto/dev/build_en.md). diff --git a/doc/v2/dev/contribute_to_paddle_cn.md b/doc/v2/dev/contribute_to_paddle_cn.md index d8bf093e09b..add06e42f1b 100644 --- a/doc/v2/dev/contribute_to_paddle_cn.md +++ b/doc/v2/dev/contribute_to_paddle_cn.md @@ -51,6 +51,8 @@ Paddle 开发人员使用 [pre-commit](http://pre-commit.com/) 工具来管理 G Paddle 使用 `clang-format` 来调整 C/C++ 源代码格式,请确保 `clang-format` 版本在 3.8 以上。 +注:通过`pip install pre-commit`和`conda install -c conda-forge pre-commit`安装的`yapf`稍有不同的,Paddle 开发人员使用的是`pip install pre-commit`。 + ## 开始开发 在本例中,我删除了 README.md 中的一行,并创建了一个新文件。 -- GitLab From 211e131525ac3270b8afdd4d40d1f46b7f9dcfda Mon Sep 17 00:00:00 2001 From: Yan Chunwei Date: Wed, 30 May 2018 21:50:05 +0800 Subject: [PATCH 064/913] feature/tensorrt engine op (#11001) --- paddle/fluid/inference/tensorrt/engine.cc | 26 ++++- paddle/fluid/inference/tensorrt/engine.h | 8 +- paddle/fluid/operators/CMakeLists.txt | 3 + paddle/fluid/operators/tensorrt_engine_op.cc | 70 ++++++++++++ paddle/fluid/operators/tensorrt_engine_op.h | 110 +++++++++++++++++++ 5 files changed, 213 insertions(+), 4 deletions(-) create mode 100644 paddle/fluid/operators/tensorrt_engine_op.cc create mode 100644 paddle/fluid/operators/tensorrt_engine_op.h diff --git a/paddle/fluid/inference/tensorrt/engine.cc b/paddle/fluid/inference/tensorrt/engine.cc index fb27c8394c1..a88236ae98e 100644 --- a/paddle/fluid/inference/tensorrt/engine.cc +++ b/paddle/fluid/inference/tensorrt/engine.cc @@ -131,6 +131,20 @@ void* TensorRTEngine::GetOutputInGPU(const std::string& name) { return buffer(name).buffer; } +void TensorRTEngine::GetOutputInGPU(const std::string& name, void* dst, + size_t max_size) { + // determine data size + auto it = buffer_sizes_.find(name); + PADDLE_ENFORCE(it != buffer_sizes_.end()); + PADDLE_ENFORCE_GT(it->second, 0); + PADDLE_ENFORCE_GE(max_size, it->second); + auto& buf = buffer(name); + PADDLE_ENFORCE_NOT_NULL(buf.buffer, "buffer should be allocated before"); + PADDLE_ENFORCE_EQ(cudaMemcpyAsync(dst, buf.buffer, it->second, + cudaMemcpyDeviceToDevice, *stream_), + 0); +} + void TensorRTEngine::GetOutputInCPU(const std::string& name, void* dst, size_t max_size) { // determine data size @@ -152,7 +166,7 @@ Buffer& TensorRTEngine::buffer(const std::string& name) { return buffers_[slot_offset]; } -void TensorRTEngine::SetInputFromCPU(const std::string& name, void* data, +void TensorRTEngine::SetInputFromCPU(const std::string& name, const void* data, size_t size) { auto& buf = buffer(name); PADDLE_ENFORCE_NOT_NULL(buf.buffer); @@ -162,6 +176,16 @@ void TensorRTEngine::SetInputFromCPU(const std::string& name, void* data, cudaMemcpyHostToDevice, *stream_)); } +void TensorRTEngine::SetInputFromGPU(const std::string& name, const void* data, + size_t size) { + auto& buf = buffer(name); + PADDLE_ENFORCE_NOT_NULL(buf.buffer); + PADDLE_ENFORCE_LE(size, buf.max_size, "buffer is too small"); + PADDLE_ENFORCE(buf.device == DeviceType::GPU); + PADDLE_ENFORCE_EQ(0, cudaMemcpyAsync(buf.buffer, data, size, + cudaMemcpyDeviceToDevice, *stream_)); +} + void TensorRTEngine::SetITensor(const std::string& name, nvinfer1::ITensor* tensor) { PADDLE_ENFORCE(tensor != nullptr); diff --git a/paddle/fluid/inference/tensorrt/engine.h b/paddle/fluid/inference/tensorrt/engine.h index b8298c6059e..d9d3163b66d 100644 --- a/paddle/fluid/inference/tensorrt/engine.h +++ b/paddle/fluid/inference/tensorrt/engine.h @@ -92,13 +92,15 @@ class TensorRTEngine : public EngineBase { cudaStream_t* stream() { return stream_; } // Fill an input from CPU memory with name and size. - void SetInputFromCPU(const std::string& name, void* data, size_t size); + void SetInputFromCPU(const std::string& name, const void* data, size_t size); // TODO(Superjomn) is this method necessary given that buffer(xxx) can be // accessed directly. Fill an input from GPU memory with name and size. - void SetInputFromGPU(const std::string& name, void* data, size_t size); + void SetInputFromGPU(const std::string& name, const void* data, size_t size); // Get an output called name, the output of tensorrt is in GPU, so this method - // will just return the output's GPU memory address. + // Return the output's GPU memory address without copy. void* GetOutputInGPU(const std::string& name); + // Copy data into dst inside the GPU device. + void GetOutputInGPU(const std::string& name, void* dst, size_t max_size); // LOW EFFICENCY! Get output to CPU, this will trigger a memory copy from GPU // to CPU. void GetOutputInCPU(const std::string& name, void* dst, size_t max_size); diff --git a/paddle/fluid/operators/CMakeLists.txt b/paddle/fluid/operators/CMakeLists.txt index 52cdc0bd0ae..819d02ae6f3 100644 --- a/paddle/fluid/operators/CMakeLists.txt +++ b/paddle/fluid/operators/CMakeLists.txt @@ -225,6 +225,9 @@ op_library(cross_entropy_op DEPS cross_entropy) op_library(softmax_with_cross_entropy_op DEPS cross_entropy softmax) op_library(softmax_op DEPS softmax) op_library(sequence_softmax_op DEPS softmax) +if (WITH_GPU AND TENSORRT_FOUND) + op_library(tensorrt_engine_op DEPS tensorrt_engine) +endif() op_library(sum_op DEPS selected_rows_functor) op_library(sgd_op DEPS selected_rows_functor) op_library(print_op DEPS lod_tensor) diff --git a/paddle/fluid/operators/tensorrt_engine_op.cc b/paddle/fluid/operators/tensorrt_engine_op.cc new file mode 100644 index 00000000000..83e768b4dc9 --- /dev/null +++ b/paddle/fluid/operators/tensorrt_engine_op.cc @@ -0,0 +1,70 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +#ifdef PADDLE_WITH_CUDA + +#include "paddle/fluid/operators/tensorrt_engine_op.h" +#include "paddle/fluid/framework/op_registry.h" +#include "paddle/fluid/inference/tensorrt/convert/op_converter.h" +#include "paddle/fluid/inference/utils/singleton.h" + +namespace paddle { +namespace operators { + +template +void paddle::operators::TensorRTEngineKernel::Prepare( + const framework::ExecutionContext &context) const { + // Get the ProgramDesc and pass to convert. + const auto &block = context.Attr("subgraph"); + max_batch_ = context.Attr("max_batch"); + auto max_workspace = context.Attr("max_workspace"); + engine_.reset(new inference::tensorrt::TensorRTEngine( + max_batch_, max_workspace, nullptr)); + inference::Singleton::Global().ConvertBlock( + block, engine_.get()); + engine_->FreezeNetwork(); +} + +class TensorRTEngineOpMaker : public framework::OpProtoAndCheckerMaker { + public: + void Make() override { + AddInput("Xs", "A list of inputs.").AsDuplicable(); + AddOutput("Ys", "A list of outputs").AsDuplicable(); + AddAttr("subgraph", "the subgraph"); + AddComment("TensorRT engine operator."); + } +}; + +class TensorRTEngineInferVarType : public framework::VarTypeInference { + public: + void operator()(const framework::OpDesc &op_desc, + framework::BlockDesc *block) const override {} +}; + +} // namespace operators +} // namespace paddle + +namespace ops = paddle::operators; + +REGISTER_OPERATOR(tensorrt_engine, ops::TensorRTEngineOp, + ops::TensorRTEngineOpMaker, ops::TensorRTEngineOpMaker); + +REGISTER_OP_CPU_KERNEL( + tensorrt_engine, + ops::TensorRTEngineKernel, + ops::TensorRTEngineKernel, + ops::TensorRTEngineKernel, + ops::TensorRTEngineKernel); + +#endif // PADDLE_WITH_CUDA diff --git a/paddle/fluid/operators/tensorrt_engine_op.h b/paddle/fluid/operators/tensorrt_engine_op.h new file mode 100644 index 00000000000..fe273d386c5 --- /dev/null +++ b/paddle/fluid/operators/tensorrt_engine_op.h @@ -0,0 +1,110 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +#pragma once + +#ifdef PADDLE_WITH_CUDA + +#include "paddle/fluid/framework/operator.h" +#include "paddle/fluid/inference/analysis/helper.h" +#include "paddle/fluid/inference/tensorrt/engine.h" + +namespace paddle { +namespace operators { + +class TensorRTEngineOp : public framework::OperatorWithKernel { + public: + using framework::OperatorWithKernel::OperatorWithKernel; + + protected: + void InferShape(framework::InferShapeContext* ctx) const override {} + + framework::OpKernelType GetExpectedKernelType( + const framework::ExecutionContext& ctx) const override { + framework::OpKernelType kt = framework::OpKernelType( + framework::ToDataType( + ctx.Input("pre_ids")->type()), + platform::CPUPlace()); + return kt; + } +}; + +template +class TensorRTEngineKernel : public framework::OpKernel { + public: + void Compute(const framework::ExecutionContext& context) const override { + if (!engine_) { + Prepare(context); + } + auto input_names = context.op().Inputs("Xs"); + PADDLE_ENFORCE(!input_names.empty(), "should pass more than one inputs"); + // Try to determine a batch_size + auto* tensor0 = context.Input(input_names.front()); + PADDLE_ENFORCE_NOT_NULL(tensor0); + int batch_size = tensor0->dims()[0]; + PADDLE_ENFORCE_LE(batch_size, max_batch_); + + // Convert input tensor from fluid to engine. + for (const auto& x : context.Inputs("Xs")) { + // convert input and copy to TRT engine's buffer + auto* v = context.scope().FindVar(x); + PADDLE_ENFORCE_NOT_NULL(v, "no variable called %s", x); + auto& t = v->Get(); + if (platform::is_cpu_place(t.place())) { + engine_->SetInputFromCPU(x, static_cast(t.data()), + t.memory_size()); + } else { + engine_->SetInputFromGPU(x, static_cast(t.data()), + t.memory_size()); + } + } + // Execute the engine. + PADDLE_ENFORCE_GT(batch_size, 0); + engine_->Execute(batch_size); + // Convert output tensor from engine to fluid + for (const auto& y : context.Outputs("Ys")) { + // convert output and copy to fluid. + nvinfer1::ITensor* trt_t = engine_->GetITensor(y); + auto dims = trt_t->getDimensions(); + // Use the output ITensor's dims to reshape the Fluid Tensor. + std::vector ddim(dims.d, dims.d + dims.nbDims); + + auto* fluid_v = context.scope().FindVar(y); + PADDLE_ENFORCE_NOT_NULL(fluid_v, "no output variable called %s", y); + auto* fluid_t = fluid_v->GetMutable(); + fluid_t->Resize(framework::make_ddim(ddim)); + auto size = inference::analysis::AccuDims(dims.d, dims.nbDims); + if (platform::is_cpu_place(fluid_t->place())) { + engine_->GetOutputInCPU( + y, fluid_t->mutable_data(platform::CPUPlace()), size); + } else { + engine_->GetOutputInGPU( + y, fluid_t->mutable_data(platform::CUDAPlace()), size); + } + } + } + + protected: + // Build the engine. + void Prepare(const framework::ExecutionContext& context) const; + + private: + mutable std::unique_ptr engine_; + mutable int max_batch_{0}; +}; + +} // namespace operators +} // namespace paddle + +#endif // PADDLE_WITH_CUDA -- GitLab From 94eaf94cf57ec2cc951d046e847b69c348b8f9c9 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Wed, 30 May 2018 21:51:16 +0800 Subject: [PATCH 065/913] bug fix about lru and save --- python/paddle/fluid/io.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index d52c9a88236..8e10b01a4ab 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -495,11 +495,11 @@ def save_checkpoint(executor, serial = _get_lastest_checkpoint_dir(checkpoint_dir) + 1 cur_dir = _get_serial_dir(checkpoint_dir, serial) + save_trainer_args(cur_dir, trainer_id, trainer_args) + if is_chief: save_persist_vars_without_grad(executor, cur_dir, main_program) - - save_trainer_args(cur_dir, trainer_id, trainer_args) - _lru_delete(checkpoint_dir, max_num_checkpoints) + _lru_delete(checkpoint_dir, max_num_checkpoints) def need_load_checkpoint(checkpoint_dir): @@ -639,7 +639,13 @@ def _is_checkpoint_var(var): var.desc.type() == core.VarDesc.VarType.RAW: return False - if var.name.endswith("@GRAD"): + if "@GRAD" in var.name: + return False + + if ".trainer_" in var.name: + return False + + if ".block" in var.name: return False return var.persistable -- GitLab From e44c278e60603c37640a0a352f4bbb7f8363bebc Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Wed, 30 May 2018 21:55:12 +0800 Subject: [PATCH 066/913] bug fix about clean --- python/paddle/fluid/trainer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index b4f719855f4..69577a98fbd 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -425,7 +425,7 @@ class Trainer(object): return self._get_parallel_executor() def _clean_checkpoint(self): - if not self.checkpoint: + if not self.checkpoint and not self.chief: return io.clean_checkpoint(checkpoint_dir=self.checkpoint.checkpoint_dir) -- GitLab From bca4da422582990b4308932d2c20274cdb6c5a60 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Wed, 30 May 2018 21:56:54 +0800 Subject: [PATCH 067/913] cancle only chief delete files --- python/paddle/fluid/io.py | 3 ++- python/paddle/fluid/trainer.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index 8e10b01a4ab..62e3046db64 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -499,7 +499,8 @@ def save_checkpoint(executor, if is_chief: save_persist_vars_without_grad(executor, cur_dir, main_program) - _lru_delete(checkpoint_dir, max_num_checkpoints) + + _lru_delete(checkpoint_dir, max_num_checkpoints) def need_load_checkpoint(checkpoint_dir): diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 69577a98fbd..b4f719855f4 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -425,7 +425,7 @@ class Trainer(object): return self._get_parallel_executor() def _clean_checkpoint(self): - if not self.checkpoint and not self.chief: + if not self.checkpoint: return io.clean_checkpoint(checkpoint_dir=self.checkpoint.checkpoint_dir) -- GitLab From aa4f685b66c2f2246d237794ec6e3e8973b5dff6 Mon Sep 17 00:00:00 2001 From: Luo Tao Date: Wed, 30 May 2018 23:25:48 +0800 Subject: [PATCH 068/913] fix compiler error when do not have TensorRT library --- paddle/fluid/operators/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/paddle/fluid/operators/CMakeLists.txt b/paddle/fluid/operators/CMakeLists.txt index 819d02ae6f3..de6ff29c6f8 100644 --- a/paddle/fluid/operators/CMakeLists.txt +++ b/paddle/fluid/operators/CMakeLists.txt @@ -227,6 +227,8 @@ op_library(softmax_op DEPS softmax) op_library(sequence_softmax_op DEPS softmax) if (WITH_GPU AND TENSORRT_FOUND) op_library(tensorrt_engine_op DEPS tensorrt_engine) +else() + set(DEPS_OPS ${DEPS_OPS} tensorrt_engine_op) endif() op_library(sum_op DEPS selected_rows_functor) op_library(sgd_op DEPS selected_rows_functor) -- GitLab From 21e794cf6731a35c590caeabd83dbeab31182894 Mon Sep 17 00:00:00 2001 From: Haichao Zhang Date: Wed, 30 May 2018 10:29:44 -0700 Subject: [PATCH 069/913] change name debuger to debugger (#10949) --- python/paddle/fluid/{debuger.py => debugger.py} | 0 python/paddle/fluid/tests/unittests/test_debugger.py | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) rename python/paddle/fluid/{debuger.py => debugger.py} (100%) diff --git a/python/paddle/fluid/debuger.py b/python/paddle/fluid/debugger.py similarity index 100% rename from python/paddle/fluid/debuger.py rename to python/paddle/fluid/debugger.py diff --git a/python/paddle/fluid/tests/unittests/test_debugger.py b/python/paddle/fluid/tests/unittests/test_debugger.py index 67b03f635b6..870952f2f91 100644 --- a/python/paddle/fluid/tests/unittests/test_debugger.py +++ b/python/paddle/fluid/tests/unittests/test_debugger.py @@ -15,7 +15,7 @@ import unittest import paddle.fluid as fluid import paddle.fluid.core as core -from paddle.fluid import debuger +from paddle.fluid import debugger from paddle.fluid.framework import Program @@ -51,9 +51,9 @@ class TestDebugger(unittest.TestCase): outputs={"Out": mul_out}, attrs={"x_num_col_dims": 1}) - print(debuger.pprint_program_codes(p)) + print(debugger.pprint_program_codes(p)) - debuger.draw_block_graphviz(p.block(0), path="./test.dot") + debugger.draw_block_graphviz(p.block(0), path="./test.dot") if __name__ == '__main__': -- GitLab From a2c017da9b77ac76359dcb3dc24fccde6d71f32b Mon Sep 17 00:00:00 2001 From: minqiyang Date: Thu, 31 May 2018 01:58:00 +0800 Subject: [PATCH 070/913] 1. merge simple_dist_transpiler to distribute_transpiler 2. add align_var_to_block argument to func transpile 3. remove concat and spilt if align_var_to_block is False 4. unittests for simple_dist_transpiler --- .../unittests/test_simple_dist_transpiler.py | 120 +++++++++ .../fluid/transpiler/distribute_transpiler.py | 45 +++- .../distribute_transpiler_simple.py | 254 ------------------ 3 files changed, 156 insertions(+), 263 deletions(-) create mode 100644 python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py delete mode 100644 python/paddle/fluid/transpiler/distribute_transpiler_simple.py diff --git a/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py b/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py new file mode 100644 index 00000000000..d51e356a536 --- /dev/null +++ b/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py @@ -0,0 +1,120 @@ +# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest + +import paddle.fluid as fluid +import paddle.fluid.core as core +import paddle.fluid.layers as layers +from paddle.fluid.transpiler.distribute_transpiler import delete_ops +import numpy as np + + +class TestSimpleDistTranspiler(unittest.TestCase): + def setUp(self): + self.trainer_id = 0 + self.trainers = 2 + self.pservers = 2 + self.pserver_eps = "127.0.0.1:6174,127.0.0.1:6175" + self.current_pserver_ep = "127.0.0.1:6175" + + def net_conf(self): + x = fluid.layers.data(name='x', shape=[1000], dtype='float32') + + y_predict = fluid.layers.fc(input=x, + size=1000, + act=None, + param_attr=fluid.ParamAttr(name='fc_w')) + + y = fluid.layers.data(name='y', shape=[1], dtype='float32') + + cost = fluid.layers.square_error_cost(input=y_predict, label=y) + avg_cost = fluid.layers.mean(cost) + sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.1) + + optimize_ops, params_grads = sgd_optimizer.minimize(avg_cost) + return optimize_ops, params_grads + + def test_simple_transpiler(self): + np.random.seed(1) + + trainer = self.get_trainer() + pserver, startup = self.get_pserver(self.current_pserver_ep) + self.assertEqual([op.type for op in trainer.global_block().ops], + self.get_expect_trainer_ops()) + + self.assertEqual(len(pserver.blocks), 2) + # block0: listen_and_serv + self.assertEqual([op.type for op in pserver.blocks[0].ops], + ["listen_and_serv"]) + # block1: optimize pass + self.assertEqual([op.type for op in pserver.blocks[1].ops], + ["sum", "scale", "sgd"]) + + print("xxx", [op.output_arg_names for op in startup.global_block().ops]) + # confirm startup program + self.assertEqual([op.type for op in startup.global_block().ops], + ["fill_constant", "uniform_random", "uniform_random"]) + + # the variable #fc_w will NOT be splited + fc_w_var = startup.global_block().var("fc_w@GRAD") + self.assertEqual(fc_w_var.shape, (1000, 1000)) + + fc_w_var = startup.global_block().var("fc_w@GRAD.trainer_0") + self.assertEqual(fc_w_var.shape, (1000, 1000)) + + def get_main_program(self): + main = fluid.Program() + + with fluid.program_guard(main): + self.net_conf() + + return main + + def get_expect_trainer_ops(self): + trainer = fluid.Program() + + with fluid.program_guard(trainer): + optimize_ops, params_grads = self.net_conf() + + delete_ops(trainer.global_block(), optimize_ops) + ops = [op.type for op in trainer.global_block().ops] + [ + "send_vars", "send_barrier", "recv", "recv", "fetch_barrier" + ] + ops.insert(ops.index("elementwise_add_grad") + 1, "send_vars") + return ops + + def get_trainer(self): + return self._transpiler_instance().get_trainer_program() + + def get_pserver(self, ep): + t = self._transpiler_instance() + pserver = t.get_pserver_program(ep) + startup = t.get_startup_program(ep, pserver) + return pserver, startup + + def _transpiler_instance(self): + main = self.get_main_program() + t = fluid.DistributeTranspiler() + t.transpile( + self.trainer_id, + program=main, + pservers=self.pserver_eps, + trainers=self.trainers, + align_var_to_block=False) + return t + + +if __name__ == "__main__": + unittest.main() diff --git a/python/paddle/fluid/transpiler/distribute_transpiler.py b/python/paddle/fluid/transpiler/distribute_transpiler.py index e9b7d9e9d2d..eb7daeffb9e 100644 --- a/python/paddle/fluid/transpiler/distribute_transpiler.py +++ b/python/paddle/fluid/transpiler/distribute_transpiler.py @@ -15,6 +15,7 @@ from __future__ import print_function import math +import numpy as np from ps_dispatcher import RoundRobin, HashName, PSDispatcher from .. import core, framework @@ -103,7 +104,7 @@ def split_dense_variable(var_list, service_count, min_block_size=8192): We need to have a minimal block size so that the calculations in the parameter server side can gain better performance. By default - minimum block size 8K elements (maybe 16bit or 32bit or 64bit). + minimum block size 8K elements (maybe 16bit or 32bit or 64bit). Args: var_list (list): List of variables. @@ -111,7 +112,7 @@ def split_dense_variable(var_list, service_count, min_block_size=8192): or more listening ports. min_block_size (int): Minimum splitted block size. Returns: - blocks (list[(varname, block_id, current_block_size)]): A list + blocks (list[(varname, block_id, current_block_size)]): A list of VarBlocks. Each VarBlock specifies a shard of the var. """ blocks = [] @@ -171,6 +172,7 @@ class DistributeTranspiler: program=None, pservers="127.0.0.1:6174", trainers=1, + align_var_to_block=True, split_method=RoundRobin, sync_mode=True): """ @@ -183,7 +185,8 @@ class DistributeTranspiler: parameter servers. Steps to transpile trainer: - 1. split variable to multiple blocks, aligned by product(dim[1:]) (width). + 1. split variable to multiple blocks, aligned by product(dim[1:]) (width) + if align_var_to_block is True 2. rename splited grad variables to add trainer_id suffix ".trainer_%d". 3. modify trainer program add split_op to each grad variable. 4. append send_op to send splited variables to server and fetch @@ -293,9 +296,18 @@ class DistributeTranspiler: for index in range(len(self.pserver_endpoints)) ] - grad_blocks = split_dense_variable(grad_list, len(pserver_endpoints)) - param_blocks = split_dense_variable(param_list, len(pserver_endpoints)) + if align_var_to_block: + grad_blocks = split_dense_variable(grad_list, + len(pserver_endpoints)) + param_blocks = split_dense_variable(param_list, + len(pserver_endpoints)) + else: + # when we do NOT align var to block, we will always split params + # grads into one block. + grad_blocks = split_dense_variable(grad_list, 1) + param_blocks = split_dense_variable(param_list, 1) assert (len(grad_blocks) == len(param_blocks)) + # step2: Create new vars for the parameters and gradients blocks and # add ops to do the split. param_var_mapping = self._create_vars_from_blocklist(program, @@ -325,8 +337,22 @@ class DistributeTranspiler: # step 3.1: insert send op to send gradient vars to parameter servers ps_dispatcher.reset() send_vars = [] - for orig_varname, splited_vars in grad_var_mapping.items(): + + # in general cases, the number of pservers is times of 2, and this + # will lead to uneven distribution among weights and bias: + # fc_w@GRAD_trainer_0, fc_w@GRAD_trainer_1 --> pserver1 + # fc_b@GRAD_trainer_0, fc_b@GRAD_trainer_1 --> pserver2 + # shuffle the map will avoid the uneven distribution above + grad_var_mapping_items = grad_var_mapping.items() + if not align_var_to_block: + np.random.shuffle(grad_var_mapping_items) + + for orig_varname, splited_vars in grad_var_mapping_items: eplist = ps_dispatcher.dispatch(splited_vars) + + if not align_var_to_block: + assert (len(splited_vars) == 1) + if len(splited_vars) == 1: orig_varname = splited_vars[0].name index = find_op_by_output_arg(program.global_block(), @@ -374,7 +400,7 @@ class DistributeTranspiler: for i, ep in enumerate(eplist): self.param_grad_ep_mapping[ep]["params"].append(recv_vars[i]) self.param_grad_ep_mapping[ep]["grads"].append(send_vars[i]) - # step4: Concat the parameters splits together after recv. + for varname, splited_var in param_var_mapping.iteritems(): eps = [] for var in splited_var: @@ -399,6 +425,7 @@ class DistributeTranspiler: RPC_OP_ROLE_ATTR_NAME: RPC_OP_ROLE_ATTR_VALUE }) + # step4: Concat the parameters splits together after recv. for varname, splited_var in param_var_mapping.iteritems(): if len(splited_var) <= 1: continue @@ -849,8 +876,8 @@ class DistributeTranspiler: program (ProgramDesc): ProgramDesc which gradients blong. block_list (list[(varname, block_id, block_size)]): List of gradient blocks. add_trainer_suffix (Bool): Add trainer suffix to new variable's name if set True. - Returns: - var_mapping (dict(varname->[new_varname_variable])):A dict mapping + Returns: + var_mapping (dict(varname->[new_varname_variable])):A dict mapping from original var name to each var split. """ diff --git a/python/paddle/fluid/transpiler/distribute_transpiler_simple.py b/python/paddle/fluid/transpiler/distribute_transpiler_simple.py deleted file mode 100644 index ea8c27cdca8..00000000000 --- a/python/paddle/fluid/transpiler/distribute_transpiler_simple.py +++ /dev/null @@ -1,254 +0,0 @@ -# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from ..framework import Program, default_main_program, Parameter, Variable -from ..layer_helper import LayerHelper - - -def hash_name_to_server(params_grads, pserver_endpoints): - """ - :param param_grads: - :return: a map of pserver endpoint -> - params -> [param list] - grads -> [grad list] - """ - - def _hash_param(param_name, total): - return hash(param_name) % total - - param_grad_map = dict() - for param, grad in params_grads: - if param.trainable is True and grad is not None: - server_id = _hash_param(param.name, len(pserver_endpoints)) - server_for_param = pserver_endpoints[server_id] - if not param_grad_map.has_key(server_for_param): - param_grad_map[server_for_param] = {"params": [], "grads": []} - param_grad_map[server_for_param]["params"].append(param) - param_grad_map[server_for_param]["grads"].append(grad) - - return param_grad_map - - -def round_robin(params_grads, pserver_endpoints): - assert (len(params_grads) > len(pserver_endpoints)) - - param_grad_map = dict() - pserver_idx = 0 - for param, grad in params_grads: - if param.trainable is True: - server_for_param = pserver_endpoints[pserver_idx] - if not param_grad_map.has_key(server_for_param): - param_grad_map[server_for_param] = {"params": [], "grads": []} - - param_grad_map[server_for_param]["params"].append(param) - param_grad_map[server_for_param]["grads"].append(grad) - - pserver_idx += 1 - if pserver_idx >= len(pserver_endpoints): - pserver_idx = 0 - return param_grad_map - - -class SimpleDistributeTranspiler: - def transpile(self, - optimize_ops, - params_grads, - program=None, - pservers="127.0.0.1:6174", - trainers=1, - split_method=round_robin): - """ - Transpile the program to a distributed data-parallelism programs. - - The main_program will be transform to use a remote parameter server - to do parameter optimization. And the optimization graph will be put - in to a parameter server program. - - Use different methods to split trainable varialbles to different - parameter servers. - - Example to run: - - exe = fluid.Executor(place) - t = fluid.DistributeTranspiler() - t.transpile(optimize_ops, params_grads, pservers="127.0.0.1:6174", trainers=1) - - pserver_endpoint = os.getenv("PSERVER") - if pserver_endpoint: - pserver_prog = t.get_pserver_program(pserver_endpoint, optimize_ops) - exe.run(fluid.default_startup_program()) - exe.run(pserver_prog) - else: - feeder = fluid.DataFeeder(feed_list=[images, label], place=place) - exe.run(fluid.default_startup_program()) - - for pass_id in range(PASS_NUM): - ... - - :param optimize_ops: op list of optimization, should be the - return value of Optimizer.minimize - :type optimize_ops: list - :param program: program to optimize, default default_main_program - :param pservers: parameter server endpoints like "m1:6174,m2:6174" - :type pservers: string - - :return: return a list of programs - """ - if program is None: - program = default_main_program() - self.program = program - self.trainers = trainers - self.optimize_ops = optimize_ops - self._optimize_distributed( - optimize_ops, - program, - params_grads, - pservers=pservers, - trainers=trainers, - split_method=split_method) - - def _clone_param(self, block, v): - assert isinstance(v, Parameter) - new_p = Parameter( - block=block, - shape=v.shape, - dtype=v.dtype, - type=v.type, - lod_level=v.lod_level, - stop_gradient=v.stop_gradient, - trainable=v.trainable, - optimize_attr=v.optimize_attr, - regularizer=v.regularizer, - name=v.name) - block.vars[new_p.name] = new_p - - def _clone_var(self, block, var): - assert isinstance(var, Variable) - return block.create_var( - name=var.name, - shape=var.shape, - dtype=var.dtype, - type=var.type, - lod_level=var.lod_level, - persistable=var.persistable) - - def _optimize_distributed(self, optimize_ops, program, params_and_grads, - **kwargs): - if kwargs.has_key("split_method"): - split_method = kwargs["split_method"] - else: - split_method = round_robin - - assert (callable(split_method)) - pserver_endpoints = kwargs["pservers"].split(",") - self.param_grad_map = split_method(params_and_grads, pserver_endpoints) - - send_op_ordered_inputs = [] - send_op_ordered_outputs = [] - epmap = [] - for ep, v in self.param_grad_map.iteritems(): - send_op_ordered_inputs.extend(v["grads"]) - send_op_ordered_outputs.extend(v["params"]) - for i in v["grads"]: - epmap.append(ep) - send_op = program.global_block().append_op( - type="send", - inputs={"X": send_op_ordered_inputs - }, # inputs is a list of tensors to be send - outputs={"Out": send_op_ordered_outputs}, - attrs={"endpoints": pserver_endpoints, - "epmap": epmap}) - - def get_trainer_program(self): - # remove optimize ops and add a send op to main_program - self.program.global_block().delete_ops(self.optimize_ops) - return self.program - - def _create_var_for_trainers(self, block, var, trainers): - var_list = [] - for i in xrange(trainers): - var_each = block.create_var( - name="%s.trainer_%d" % (var.name, i), - psersistable=var.persistable, - dtype=var.dtype, - shape=var.shape) - var_list.append(var_each) - return var_list - - def get_pserver_program(self, endpoint, optimize_ops): - pserver_program = Program() - for v in self.param_grad_map[endpoint]["params"]: - self._clone_param(pserver_program.global_block(), v) - - optimize_sub_program = Program() - grad_var_names = [ - var.name for var in self.param_grad_map[endpoint]["grads"] - ] - for opt_op in optimize_ops: - for _, var in opt_op.inputs.iteritems(): - # NOTE: append operators to merge gradients from multiple - # trainers. If trainers == 1, this is not needed. - if self.trainers > 1 and var.name in grad_var_names: - vars2merge = self._create_var_for_trainers( - optimize_sub_program.global_block(), var, self.trainers) - merged_var = optimize_sub_program.global_block().create_var( - name=var.name, - persistable=var.persistable, - dtype=var.dtype, - shape=var.shape) - optimize_sub_program.global_block().append_op( - type="sum", - inputs={"X": vars2merge}, - outputs={"Out": merged_var}) - optimize_sub_program.global_block().append_op( - type="scale", - inputs={"X": merged_var}, - outputs={"Out": merged_var}, - attrs={"scale": 1.0 / float(self.trainers)}) - else: - optimize_sub_program.global_block().create_var( - name=var.name, - persistable=var.persistable, - dtype=var.dtype, - shape=var.shape) - - if opt_op.inputs.has_key("Grad"): - if opt_op.inputs["Grad"].name in grad_var_names: - optimize_sub_program.global_block().append_op( - type=opt_op.type, - inputs=opt_op.inputs, - outputs=opt_op.outputs, - attrs=opt_op.attrs) - else: - optimize_sub_program.global_block().append_op( - type=opt_op.type, - inputs=opt_op.inputs, - outputs=opt_op.outputs, - attrs=opt_op.attrs) - pserver_program.global_block().append_op( - type="recv", - inputs={"RX": - self.param_grad_map[endpoint]["grads"]}, # grads to recv - outputs={}, - attrs={ - "OptimizeBlock": optimize_sub_program.global_block(), - "endpoint": endpoint, - "ParamList": - [p.name for p in self.param_grad_map[endpoint]["params"]], - "GradList": - [p.name for p in self.param_grad_map[endpoint]["grads"]], - "Trainers": self.trainers - }) - pserver_program.sync_with_cpp() - return pserver_program -- GitLab From 6f3c7d9b241ae91d39fd9114ea19c2d13ec4b544 Mon Sep 17 00:00:00 2001 From: Nicky Date: Wed, 30 May 2018 14:39:55 -0700 Subject: [PATCH 071/913] Simplify and make a clear function name --- .../machine_translation/test_machine_translation.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/paddle/fluid/tests/book/high-level-api/machine_translation/test_machine_translation.py b/python/paddle/fluid/tests/book/high-level-api/machine_translation/test_machine_translation.py index 1f85221a9d0..d4b723d3e6b 100644 --- a/python/paddle/fluid/tests/book/high-level-api/machine_translation/test_machine_translation.py +++ b/python/paddle/fluid/tests/book/high-level-api/machine_translation/test_machine_translation.py @@ -53,7 +53,7 @@ def encoder(is_sparse): return encoder_out -def decoder_train(context, is_sparse): +def train_decoder(context, is_sparse): # decoder trg_language_word = pd.data( name="target_language_word", shape=[1], dtype='int64', lod_level=1) @@ -81,7 +81,7 @@ def decoder_train(context, is_sparse): return rnn() -def decoder_decode(context, is_sparse): +def decode(context, is_sparse): init_state = context array_len = pd.fill_constant(shape=[1], dtype='int64', value=max_length) counter = pd.zeros(shape=[1], dtype='int64', force_cpu=True) @@ -150,7 +150,7 @@ def decoder_decode(context, is_sparse): def train_program(is_sparse): context = encoder(is_sparse) - rnn_out = decoder_train(context, is_sparse) + rnn_out = train_decoder(context, is_sparse) label = pd.data( name="target_language_next_word", shape=[1], dtype='int64', lod_level=1) cost = pd.cross_entropy(input=rnn_out, label=label) @@ -201,7 +201,7 @@ def decode_main(use_cuda, is_sparse): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() context = encoder(is_sparse) - translation_ids, translation_scores = decoder_decode(context, is_sparse) + translation_ids, translation_scores = decode(context, is_sparse) exe = Executor(place) exe.run(framework.default_startup_program()) -- GitLab From 83fb834f8cb31df6707de3dae31958b99e1af38f Mon Sep 17 00:00:00 2001 From: Kexin Zhao Date: Wed, 30 May 2018 14:51:46 -0700 Subject: [PATCH 072/913] Modify RNN encoder decoder example using new LoDTensor API (#11021) * initial commit * modify rnn_encoder_docoder example --- ...decoder.py => test_rnn_encoder_decoder.py} | 61 ++++++++----------- 1 file changed, 25 insertions(+), 36 deletions(-) rename python/paddle/fluid/tests/book/{notest_rnn_encoder_decoder.py => test_rnn_encoder_decoder.py} (87%) diff --git a/python/paddle/fluid/tests/book/notest_rnn_encoder_decoder.py b/python/paddle/fluid/tests/book/test_rnn_encoder_decoder.py similarity index 87% rename from python/paddle/fluid/tests/book/notest_rnn_encoder_decoder.py rename to python/paddle/fluid/tests/book/test_rnn_encoder_decoder.py index ce640dece8a..7ada57def6b 100644 --- a/python/paddle/fluid/tests/book/notest_rnn_encoder_decoder.py +++ b/python/paddle/fluid/tests/book/test_rnn_encoder_decoder.py @@ -152,29 +152,6 @@ def seq_to_seq_net(): return avg_cost, prediction -def to_lodtensor(data, place): - seq_lens = [len(seq) for seq in data] - cur_len = 0 - lod = [cur_len] - for l in seq_lens: - cur_len += l - lod.append(cur_len) - flattened_data = np.concatenate(data, axis=0).astype("int64") - flattened_data = flattened_data.reshape([len(flattened_data), 1]) - res = core.LoDTensor() - res.set(flattened_data, place) - res.set_lod([lod]) - return res - - -def create_random_lodtensor(lod, place, low, high): - data = np.random.random_integers(low, high, [lod[-1], 1]).astype("int64") - res = fluid.LoDTensor() - res.set(data, place) - res.set_lod([lod]) - return res - - def train(use_cuda, save_dirname=None): [avg_cost, prediction] = seq_to_seq_net() @@ -188,22 +165,20 @@ def train(use_cuda, save_dirname=None): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() exe = Executor(place) - exe.run(framework.default_startup_program()) + feed_order = ['source_sequence', 'target_sequence', 'label_sequence'] + feed_list = [ + framework.default_main_program().global_block().var(var_name) + for var_name in feed_order + ] + feeder = fluid.DataFeeder(feed_list, place) + batch_id = 0 for pass_id in xrange(2): for data in train_data(): - word_data = to_lodtensor(map(lambda x: x[0], data), place) - trg_word = to_lodtensor(map(lambda x: x[1], data), place) - trg_word_next = to_lodtensor(map(lambda x: x[2], data), place) - outs = exe.run(framework.default_main_program(), - feed={ - 'source_sequence': word_data, - 'target_sequence': trg_word, - 'label_sequence': trg_word_next - }, + feed=feeder.feed(data), fetch_list=[avg_cost]) avg_cost_val = np.array(outs[0]) @@ -237,9 +212,23 @@ def infer(use_cuda, save_dirname=None): [inference_program, feed_target_names, fetch_targets] = fluid.io.load_inference_model(save_dirname, exe) - lod = [0, 4, 10] - word_data = create_random_lodtensor(lod, place, low=0, high=1) - trg_word = create_random_lodtensor(lod, place, low=0, high=1) + # Setup input by creating LoDTensor to represent sequence of words. + # Here each word is the basic element of the LoDTensor and the shape of + # each word (base_shape) should be [1] since it is simply an index to + # look up for the corresponding word vector. + # Suppose the length_based level of detail (lod) info is set to [[4, 6]], + # which has only one lod level. Then the created LoDTensor will have only + # one higher level structure (sequence of words, or sentence) than the basic + # element (word). Hence the LoDTensor will hold data for two sentences of + # length 4 and 6, respectively. + # Note that lod info should be a list of lists. + lod = [[4, 6]] + base_shape = [1] + # The range of random integers is [low, high] + word_data = fluid.create_random_int_lodtensor( + lod, base_shape, place, low=0, high=1) + trg_word = fluid.create_random_int_lodtensor( + lod, base_shape, place, low=0, high=1) # Construct feed as a dictionary of {feed_target_name: feed_target_data} # and results will contain a list of data corresponding to fetch_targets. -- GitLab From 46f2688f3051b0bbeb070d05159922e8b689720e Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Thu, 31 May 2018 09:53:41 +0800 Subject: [PATCH 073/913] bug fix --- python/paddle/fluid/trainer.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index b4f719855f4..3354d77acec 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -356,10 +356,14 @@ class Trainer(object): self._train_by_any_executor(event_handler, exe, num_epochs, reader) def _train_by_any_executor(self, event_handler, exe, num_epochs, reader): - epochs = [ - epoch_id for epoch_id in range(num_epochs) - if epoch_id >= self.checkpoint.epoch_id - ] + if self.checkpoint: + epochs = [ + epoch_id for epoch_id in range(num_epochs) + if epoch_id >= self.checkpoint.epoch_id + ] + else: + epochs = [epoch_id for epoch_id in range(num_epochs)] + for epoch_id in epochs: event_handler(BeginEpochEvent(epoch_id)) for step_id, data in enumerate(reader()): -- GitLab From 8248333ad2adcb3b3cdcb353cff4025092f8dcdb Mon Sep 17 00:00:00 2001 From: minqiyang Date: Thu, 31 May 2018 10:53:45 +0800 Subject: [PATCH 074/913] remove simple distranspiler in transpiler/ repo --- python/paddle/fluid/transpiler/__init__.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/python/paddle/fluid/transpiler/__init__.py b/python/paddle/fluid/transpiler/__init__.py index 045ca537b2e..cf18090f71f 100644 --- a/python/paddle/fluid/transpiler/__init__.py +++ b/python/paddle/fluid/transpiler/__init__.py @@ -15,10 +15,9 @@ from distribute_transpiler import DistributeTranspiler from inference_transpiler import InferenceTranspiler from memory_optimization_transpiler import memory_optimize, release_memory -from distribute_transpiler_simple import SimpleDistributeTranspiler from ps_dispatcher import HashName, RoundRobin __all__ = [ - "DistributeTranspiler", "InferenceTranspiler", "SimpleDistributeTranspiler", - "memory_optimize", "release_memory", "HashName", "RoundRobin" + "DistributeTranspiler", "InferenceTranspiler", "memory_optimize", + "release_memory", "HashName", "RoundRobin" ] -- GitLab From 164692da9a75744db770836111ae4c63ac6ed7c3 Mon Sep 17 00:00:00 2001 From: chengduoZH Date: Thu, 31 May 2018 11:00:40 +0800 Subject: [PATCH 075/913] drop the last batch, if the size of last batch is not equal to batch_size --- python/paddle/batch.py | 6 ++++-- python/paddle/v2/minibatch.py | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/python/paddle/batch.py b/python/paddle/batch.py index 317cf037c69..d48c54fcbb6 100644 --- a/python/paddle/batch.py +++ b/python/paddle/batch.py @@ -15,7 +15,7 @@ __all__ = ['batch'] -def batch(reader, batch_size): +def batch(reader, batch_size, drop_last=False): """ Create a batched reader. @@ -23,6 +23,8 @@ def batch(reader, batch_size): :type reader: callable :param batch_size: size of each mini-batch :type batch_size: int + :param drop_last: drop the last batch, if the size of last batch is not equal to batch_size. + :type drop_last: bool :return: the batched reader. :rtype: callable """ @@ -35,7 +37,7 @@ def batch(reader, batch_size): if len(b) == batch_size: yield b b = [] - if b: + if drop_last == False and len(b) != 0: yield b return batch_reader diff --git a/python/paddle/v2/minibatch.py b/python/paddle/v2/minibatch.py index 317cf037c69..d48c54fcbb6 100644 --- a/python/paddle/v2/minibatch.py +++ b/python/paddle/v2/minibatch.py @@ -15,7 +15,7 @@ __all__ = ['batch'] -def batch(reader, batch_size): +def batch(reader, batch_size, drop_last=False): """ Create a batched reader. @@ -23,6 +23,8 @@ def batch(reader, batch_size): :type reader: callable :param batch_size: size of each mini-batch :type batch_size: int + :param drop_last: drop the last batch, if the size of last batch is not equal to batch_size. + :type drop_last: bool :return: the batched reader. :rtype: callable """ @@ -35,7 +37,7 @@ def batch(reader, batch_size): if len(b) == batch_size: yield b b = [] - if b: + if drop_last == False and len(b) != 0: yield b return batch_reader -- GitLab From a4d88fb6420cba41c701378b1ed56fe4f9ec45f1 Mon Sep 17 00:00:00 2001 From: minqiyang Date: Thu, 31 May 2018 11:41:08 +0800 Subject: [PATCH 076/913] 1. remove simple distranspiler from transpiler/ repo 2. remvoe comment line --- python/paddle/fluid/__init__.py | 4 ++-- .../fluid/tests/unittests/test_simple_dist_transpiler.py | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/python/paddle/fluid/__init__.py b/python/paddle/fluid/__init__.py index 859605d0053..d53a96a7a79 100644 --- a/python/paddle/fluid/__init__.py +++ b/python/paddle/fluid/__init__.py @@ -44,8 +44,8 @@ import transpiler from param_attr import ParamAttr, WeightNormParamAttr from data_feeder import DataFeeder from core import LoDTensor, CPUPlace, CUDAPlace, CUDAPinnedPlace -from transpiler import DistributeTranspiler, SimpleDistributeTranspiler, \ - InferenceTranspiler, memory_optimize, release_memory +from transpiler import DistributeTranspiler, InferenceTranspiler, \ + memory_optimize, release_memory from concurrency import (Go, make_channel, channel_send, channel_recv, channel_close, Select) from lod_tensor import create_lod_tensor, create_random_int_lodtensor diff --git a/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py b/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py index d51e356a536..60f99f412cd 100644 --- a/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py +++ b/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py @@ -62,7 +62,6 @@ class TestSimpleDistTranspiler(unittest.TestCase): self.assertEqual([op.type for op in pserver.blocks[1].ops], ["sum", "scale", "sgd"]) - print("xxx", [op.output_arg_names for op in startup.global_block().ops]) # confirm startup program self.assertEqual([op.type for op in startup.global_block().ops], ["fill_constant", "uniform_random", "uniform_random"]) -- GitLab From e05abab60923c819c16980bdd53bdd684518f75b Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Thu, 31 May 2018 11:56:59 +0800 Subject: [PATCH 077/913] use recordio in dist train --- doc/v2/howto/recordio/README.md | 122 ++++++++++++++++++ .../details/threaded_ssa_graph_executor.cc | 6 +- .../reader/create_recordio_file_reader_op.cc | 12 +- python/paddle/fluid/layers/io.py | 20 +-- python/paddle/fluid/recordio_writer.py | 35 ++++- tools/codestyle/docstring_checker.pyc | Bin 11769 -> 11769 bytes 6 files changed, 178 insertions(+), 17 deletions(-) create mode 100644 doc/v2/howto/recordio/README.md diff --git a/doc/v2/howto/recordio/README.md b/doc/v2/howto/recordio/README.md new file mode 100644 index 00000000000..3f81d54b8e1 --- /dev/null +++ b/doc/v2/howto/recordio/README.md @@ -0,0 +1,122 @@ +# How to use RecordIO in Fluid + +If you want to use RecordIO as your training data format, you need to convert to your training data +to RecordIO files and reading them in the process of training, PaddlePaddle Fluid provides some +interface to deal with the RecordIO files. + +## Generate RecordIO File + +Before start training with RecordIO files, you need to convert your training data +to RecordIO format by `fluid.recordio_writer.convert_reader_to_recordio_file`, the sample codes +as follows: + +```python + reader = paddle.batch(mnist.train(), batch_size=1) + feeder = fluid.DataFeeder( + feed_list=[ # order is image and label + fluid.layers.data( + name='image', shape=[784]), + fluid.layers.data( + name='label', shape=[1], dtype='int64'), + ], + place=fluid.CPUPlace()) + fluid.recordio_writer.convert_reader_to_recordio_file('./mnist.recordio', reader, feeder) +``` + +The above codes would generate a RecordIO `./mnist.recordio` on your host. + +## Use the RecordIO file in a Local Training Job + +PaddlePaddle Fluid provides an interface `fluid.layers.io.open_recordio_file` to load your RecordIO file +and then you can use them as a Layer in your network configuration, the sample codes as follows: + +```python + data_file = fluid.layers.io.open_recordio_file( + filename="./mnist.recordio", + shapes=[(-1, 784),(-1, 1)], + lod_levels=[0, 0], + dtypes=["float32", "int32"]) + data_file = fluid.layers.io.batch(data_file, batch_size=4) + + img, label = fluid.layers.io.read_file(data_file) + hidden = fluid.layers.fc(input=img, size=100, act='tanh') + prediction = fluid.layers.fc(input=hidden, size=10, act='softmax') + loss = fluid.layers.cross_entropy(input=prediction, label=label) + avg_loss = fluid.layers.mean(loss) + + fluid.optimizer.Adam(learning_rate=1e-3).minimize(avg_loss) + + place = fluid.CPUPlace() + + exe = fluid.Executor(place) + exe.run(fluid.default_startup_program()) + avg_loss_np = [] + + # train a pass + batch_id = 0 + while True: + tmp, = exe.run(fetch_list=[avg_loss]) + + avg_loss_np.append(tmp) + print(batch_id) + batch_id += 1 +``` + +## Use the RecordIO files in Distributed Training + +1. generate multiple RecordIO files + +For a distributed training job, you may have multiple trainer nodes, +and one or more RecordIO files for one trainer node, you can use the interface +`fluid.recordio_writer.convert_reader_to_recordio_files` to convert your training data +into multiple RecordIO files, the sample codes as follows: + +```python + reader = paddle.batch(mnist.train(), batch_size=1) + feeder = fluid.DataFeeder( + feed_list=[ # order is image and label + fluid.layers.data( + name='image', shape=[784]), + fluid.layers.data( + name='label', shape=[1], dtype='int64'), + ], + place=fluid.CPUPlace()) + fluid.recordio_writer.convert_reader_to_recordio_files( + filename_suffix='./mnist.recordio', batch_per_file=100, reader, feeder) +``` + +The above codes would generate multiple RecordIO files on your host like: + +```bash +. + \_mnist.recordio-00000 + |-mnist.recordio-00001 + |-mnist.recordio-00002 + |-mnist.recordio-00003 + |-mnist.recordio-00004 +``` + +1. read these RecordIO files with `fluid.layers.io.open_recordio_file` + +For a distributed training job, the distributed operator system will schedule trainer process on multiple nodes, +each trainer process reads parts of the whole training data, we usually take the following approach to make the training +data allocated by each trainer process as uniform as possiable: + +```python +def gen_train_list(file_pattern, trainers, trainer_id): + file_list = glob.glob(file_pattern) + ret_list = [] + for idx, f in enumerate(file_list): + if (idx + trainers) % trainers == trainer_id: + ret_list.append(f) + return ret_list + +trainers = int(os.getenv("TRAINERS")) +trainer_id = int(os.getenv("PADDLE_INIT_TRAINER_ID")) +data_file = fluid.layers.io.open_recordio_file( + filename=gen_train_list("./mnist.recordio*", trainers, trainer_id), + shapes=[(-1, 784),(-1, 1)], + lod_levels=[0, 0], + dtypes=["float32", "int32"]) +data_file = fluid.layers.io.batch(data_file, batch_size=4) +``` diff --git a/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc b/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc index 815f739371e..335c067dd73 100644 --- a/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc +++ b/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc @@ -189,9 +189,11 @@ void ThreadedSSAGraphExecutor::RunOp( BlockingQueue *ready_var_q, details::OpHandleBase *op) { auto op_run = [ready_var_q, op, this] { try { - VLOG(10) << op << " " << op->Name() << " : " << op->DebugString(); + VLOG(10) << "PE start " + << " " << op->Name() << " : " << op->DebugString(); op->Run(strategy_.use_event_); - VLOG(10) << op << " " << op->Name() << " Done "; + VLOG(10) << "PE end " + << " " << op->Name() << " Done "; running_ops_--; ready_var_q->Extend(op->Outputs()); VLOG(10) << op << " " << op->Name() << "Signal posted"; diff --git a/paddle/fluid/operators/reader/create_recordio_file_reader_op.cc b/paddle/fluid/operators/reader/create_recordio_file_reader_op.cc index 282ec3f36b9..6b6d4470268 100644 --- a/paddle/fluid/operators/reader/create_recordio_file_reader_op.cc +++ b/paddle/fluid/operators/reader/create_recordio_file_reader_op.cc @@ -65,20 +65,22 @@ class CreateRecordIOReaderOp : public framework::OperatorBase { static_cast(shape_concat.size()), "The accumulate of all ranks should be equal to the " "shape concat's length."); - std::string filename = Attr("filename"); + auto filenames = Attr>("filenames"); auto* out = scope.FindVar(Output("Out")) ->template GetMutable(); - - out->Reset(new RecordIOFileReader( - filename, RestoreShapes(shape_concat, ranks))); + for (auto& fn : filenames) { + out->Reset( + new RecordIOFileReader(fn, RestoreShapes(shape_concat, ranks))); + } } }; class CreateRecordIOReaderOpMaker : public FileReaderMakerBase { protected: void Apply() override { - AddAttr("filename", "The filename of record io reader"); + AddAttr>("filenames", + "The filenames of record io reader"); AddComment(R"DOC( CreateRecordIOReader Operator diff --git a/python/paddle/fluid/layers/io.py b/python/paddle/fluid/layers/io.py index 8758ac9f94a..b9d55827304 100644 --- a/python/paddle/fluid/layers/io.py +++ b/python/paddle/fluid/layers/io.py @@ -21,7 +21,7 @@ from ..layer_helper import LayerHelper from ..executor import global_scope __all__ = [ - 'data', 'BlockGuardServ', 'ListenAndServ', 'Send', 'open_recordio_file', + 'data', 'BlockGuardServ', 'ListenAndServ', 'Send', 'open_recordio_files', 'open_files', 'read_file', 'shuffle', 'batch', 'double_buffer', 'random_data_generator', 'Preprocessor' ] @@ -291,12 +291,12 @@ def _copy_reader_create_op_(block, op): return new_op -def open_recordio_file(filename, - shapes, - lod_levels, - dtypes, - pass_num=1, - for_parallel=True): +def open_recordio_files(filenames, + shapes, + lod_levels, + dtypes, + pass_num=1, + for_parallel=True): """ Open a RecordIO file @@ -304,7 +304,7 @@ def open_recordio_file(filename, Via the Reader Variable, we can get data from the given RecordIO file. Args: - filename(str): The RecordIO file's name. + filename(str) or list(str): The RecordIO file's name. shapes(list): List of tuples which declaring data shapes. lod_levels(list): List of ints which declaring data lod_level. dtypes(list): List of strs which declaring data type. @@ -336,6 +336,8 @@ def open_recordio_file(filename, ranks.append(len(shape)) var_name = unique_name('open_recordio_file') + if isinstance(filenames, str): + filenames = [filenames] startup_blk = default_startup_program().current_block() startup_var = startup_blk.create_var(name=var_name) @@ -345,7 +347,7 @@ def open_recordio_file(filename, attrs={ 'shape_concat': shape_concat, 'lod_levels': lod_levels, - 'filename': filename, + 'filenames': filenames, 'ranks': ranks }) diff --git a/python/paddle/fluid/recordio_writer.py b/python/paddle/fluid/recordio_writer.py index 5accaacd536..7c966cba74a 100644 --- a/python/paddle/fluid/recordio_writer.py +++ b/python/paddle/fluid/recordio_writer.py @@ -14,7 +14,7 @@ import core import contextlib - +from ..batch import batch __all__ = ['convert_reader_to_recordio_file'] @@ -46,3 +46,36 @@ def convert_reader_to_recordio_file( writer.complete_append_tensor() counter += 1 return counter + + +import paddle + + +def convert_reader_to_recordio_files( + filename_suffix, + batch_per_file, + reader_creator, + feeder, + compressor=core.RecordIOWriter.Compressor.Snappy, + max_num_records=1000, + feed_order=None): + if feed_order is None: + feed_order = feeder.feed_names + lines = [] + f_idx = 0 + counter = 0 + for idx, batch in enumerate(reader_creator()): + lines.append(batch) + if idx >= batch_per_file and idx % batch_per_file == 0: + filename = "%s-%05d" % (filename_suffix, f_idx) + with create_recordio_writer(filename, compressor, + max_num_records) as writer: + for l in lines: + res = feeder.feed(l) + for each in feed_order: + writer.append_tensor(res[each]) + writer.complete_append_tensor() + counter += 1 + lines = [] + f_idx += 1 + return counter diff --git a/tools/codestyle/docstring_checker.pyc b/tools/codestyle/docstring_checker.pyc index 1ce612ca2318ccb9b9f28d51cb93ce8e5e1d0680..07e875aec6c9bae8002bde4223348c6a29647b03 100644 GIT binary patch delta 939 zcmewv{WF@K`72B7N6d=Nrn_Hwj znTRk=T=oZH({v_B$ZsaXuuz4!1Pt38uT)5kv!qmAh*7pe-Ij1_)ZMJFElI##!0e@OH)lM*viO7&gxlS^|`^Gb^K(=$ur%kzt}iwhEyQzyqO z>1?)OiX=kW Date: Thu, 31 May 2018 12:21:13 +0800 Subject: [PATCH 078/913] clean up code --- python/paddle/fluid/recordio_writer.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/python/paddle/fluid/recordio_writer.py b/python/paddle/fluid/recordio_writer.py index 7c966cba74a..9557f91bb36 100644 --- a/python/paddle/fluid/recordio_writer.py +++ b/python/paddle/fluid/recordio_writer.py @@ -14,7 +14,6 @@ import core import contextlib -from ..batch import batch __all__ = ['convert_reader_to_recordio_file'] @@ -48,9 +47,6 @@ def convert_reader_to_recordio_file( return counter -import paddle - - def convert_reader_to_recordio_files( filename_suffix, batch_per_file, -- GitLab From 82e5738f536cc7f6f78c99422c7a599e8736bba6 Mon Sep 17 00:00:00 2001 From: dzhwinter Date: Thu, 31 May 2018 12:21:33 +0800 Subject: [PATCH 079/913] "fix build script" (#11011) --- paddle/scripts/paddle_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/scripts/paddle_build.sh b/paddle/scripts/paddle_build.sh index fd3834ee21d..8eeea1805d8 100755 --- a/paddle/scripts/paddle_build.sh +++ b/paddle/scripts/paddle_build.sh @@ -183,7 +183,7 @@ function build() { ============================================ EOF make clean - make -j `nproc` + make install -j `nproc` } function build_android() { -- GitLab From a6a7b6f180ec7fe08a3bd41902e88f3fd5caa17a Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Thu, 31 May 2018 12:23:57 +0800 Subject: [PATCH 080/913] code cleanup --- .../details/threaded_ssa_graph_executor.cc | 6 ++---- tools/codestyle/docstring_checker.pyc | Bin 11769 -> 0 bytes 2 files changed, 2 insertions(+), 4 deletions(-) delete mode 100644 tools/codestyle/docstring_checker.pyc diff --git a/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc b/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc index 335c067dd73..815f739371e 100644 --- a/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc +++ b/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc @@ -189,11 +189,9 @@ void ThreadedSSAGraphExecutor::RunOp( BlockingQueue *ready_var_q, details::OpHandleBase *op) { auto op_run = [ready_var_q, op, this] { try { - VLOG(10) << "PE start " - << " " << op->Name() << " : " << op->DebugString(); + VLOG(10) << op << " " << op->Name() << " : " << op->DebugString(); op->Run(strategy_.use_event_); - VLOG(10) << "PE end " - << " " << op->Name() << " Done "; + VLOG(10) << op << " " << op->Name() << " Done "; running_ops_--; ready_var_q->Extend(op->Outputs()); VLOG(10) << op << " " << op->Name() << "Signal posted"; diff --git a/tools/codestyle/docstring_checker.pyc b/tools/codestyle/docstring_checker.pyc deleted file mode 100644 index 07e875aec6c9bae8002bde4223348c6a29647b03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11769 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 QVT9NjS|84r2F9-c7hLv=%K!iX -- GitLab From 1555dc519ac5fca41dd63b4662ca7567ba2944ed Mon Sep 17 00:00:00 2001 From: Xin Pan Date: Thu, 31 May 2018 12:42:32 +0800 Subject: [PATCH 081/913] make infer test more stable. --- paddle/contrib/inference/test_paddle_inference_api_impl.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/paddle/contrib/inference/test_paddle_inference_api_impl.cc b/paddle/contrib/inference/test_paddle_inference_api_impl.cc index 096293a4e25..09ca1832db6 100644 --- a/paddle/contrib/inference/test_paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/test_paddle_inference_api_impl.cc @@ -144,8 +144,8 @@ TEST(paddle_inference_api_impl, image_classification) { float* data = static_cast(outputs[0].data.data); float* lod_data = output1.data(); for (size_t j = 0; j < len / sizeof(float); ++j) { - EXPECT_LT(lod_data[j] - data[j], 1e-10); - EXPECT_GT(lod_data[j] - data[j], -1e-10); + EXPECT_LT(lod_data[j] - data[j], 1e-3); + EXPECT_GT(lod_data[j] - data[j], -1e-3); } free(data); } -- GitLab From 759cb23711c0dab4d52dfb45ccc275602fa999fd Mon Sep 17 00:00:00 2001 From: Xin Pan Date: Thu, 31 May 2018 14:27:05 +0800 Subject: [PATCH 082/913] follow comments --- paddle/contrib/inference/test_paddle_inference_api_impl.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/paddle/contrib/inference/test_paddle_inference_api_impl.cc b/paddle/contrib/inference/test_paddle_inference_api_impl.cc index 09ca1832db6..57c39c50f1e 100644 --- a/paddle/contrib/inference/test_paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/test_paddle_inference_api_impl.cc @@ -144,8 +144,7 @@ TEST(paddle_inference_api_impl, image_classification) { float* data = static_cast(outputs[0].data.data); float* lod_data = output1.data(); for (size_t j = 0; j < len / sizeof(float); ++j) { - EXPECT_LT(lod_data[j] - data[j], 1e-3); - EXPECT_GT(lod_data[j] - data[j], -1e-3); + EXPECT_NEAR (lod_data[j], data[j], 1e-6); } free(data); } -- GitLab From 2719599e62c364ea76ec0e9116c36da0e451fe8c Mon Sep 17 00:00:00 2001 From: Xin Pan Date: Thu, 31 May 2018 15:09:50 +0800 Subject: [PATCH 083/913] clean --- paddle/contrib/inference/test_paddle_inference_api_impl.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/contrib/inference/test_paddle_inference_api_impl.cc b/paddle/contrib/inference/test_paddle_inference_api_impl.cc index 57c39c50f1e..e980e8c3b70 100644 --- a/paddle/contrib/inference/test_paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/test_paddle_inference_api_impl.cc @@ -144,7 +144,7 @@ TEST(paddle_inference_api_impl, image_classification) { float* data = static_cast(outputs[0].data.data); float* lod_data = output1.data(); for (size_t j = 0; j < len / sizeof(float); ++j) { - EXPECT_NEAR (lod_data[j], data[j], 1e-6); + EXPECT_NEAR(lod_data[j], data[j], 1e-6); } free(data); } -- GitLab From 44ea2343430a71d83b2fa37f6daa5e807031f699 Mon Sep 17 00:00:00 2001 From: Xin Pan Date: Thu, 31 May 2018 15:50:08 +0800 Subject: [PATCH 084/913] clean --- paddle/contrib/inference/test_paddle_inference_api_impl.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/contrib/inference/test_paddle_inference_api_impl.cc b/paddle/contrib/inference/test_paddle_inference_api_impl.cc index e980e8c3b70..caba7931cb1 100644 --- a/paddle/contrib/inference/test_paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/test_paddle_inference_api_impl.cc @@ -144,7 +144,7 @@ TEST(paddle_inference_api_impl, image_classification) { float* data = static_cast(outputs[0].data.data); float* lod_data = output1.data(); for (size_t j = 0; j < len / sizeof(float); ++j) { - EXPECT_NEAR(lod_data[j], data[j], 1e-6); + EXPECT_NEAR(lod_data[j], data[j], 1e-3); } free(data); } -- GitLab From 75ea577fd31a7ead1cbec6aa6b21338040ea585d Mon Sep 17 00:00:00 2001 From: Xin Pan Date: Thu, 31 May 2018 16:01:16 +0800 Subject: [PATCH 085/913] allow profiler and timeline to work when dev_ctx is nullptr. Sometimes dev_ctx is not available when RecordEvent. --- paddle/fluid/platform/profiler.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/paddle/fluid/platform/profiler.cc b/paddle/fluid/platform/profiler.cc index 3d8d64e4c27..01de9d7041b 100644 --- a/paddle/fluid/platform/profiler.cc +++ b/paddle/fluid/platform/profiler.cc @@ -127,6 +127,7 @@ double Event::CpuElapsedMs(const Event& e) const { double Event::CudaElapsedMs(const Event& e) const { #ifdef PADDLE_WITH_CUDA + if (!has_cuda_) return 0.0; PADDLE_ENFORCE(e.has_cuda() && has_cuda()); PADDLE_ENFORCE(e.device() == device()); PADDLE_ENFORCE(cudaEventSynchronize(event_)); -- GitLab From 4d11c8e9c64f65b6701edb1ba44cefdff0423acb Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Thu, 31 May 2018 15:11:46 +0800 Subject: [PATCH 086/913] retest single thread --- .../tests/book/test_inference_nlp.cc | 224 +++++++++++------- 1 file changed, 143 insertions(+), 81 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 95cdeb4ad1f..e216e9dbe6f 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -30,16 +30,19 @@ DEFINE_bool(use_mkldnn, false, "Use MKLDNN to run inference"); DEFINE_bool(prepare_vars, true, "Prepare variables before executor"); DEFINE_bool(prepare_context, true, "Prepare Context before executor"); +DEFINE_int32(num_threads, 1, "Number of threads should be used"); + inline double get_current_ms() { struct timeval time; gettimeofday(&time, NULL); return 1e+3 * time.tv_sec + 1e-3 * time.tv_usec; } -void read_data( - std::vector>* out, - const std::string& filename = "/home/tangjian/paddle-tj/out.ids.txt") { +// return size of total words +size_t read_datasets(std::vector* out, + const std::string& filename) { using namespace std; // NOLINT + size_t sz = 0; fstream fin(filename); string line; out->clear(); @@ -50,94 +53,153 @@ void read_data( while (getline(iss, field, ' ')) { ids.push_back(stoi(field)); } - out->push_back(ids); + if (ids.size() >= 1024 || out->size() >= 100) { + continue; + } + + paddle::framework::LoDTensor words; + paddle::framework::LoD lod{{0, ids.size()}}; + words.set_lod(lod); + int64_t* pdata = words.mutable_data( + {static_cast(ids.size()), 1}, paddle::platform::CPUPlace()); + memcpy(pdata, ids.data(), words.numel() * sizeof(int64_t)); + out->emplace_back(words); + sz += ids.size(); } + return sz; +} + +void test_multi_threads() { + /* + size_t jobs_per_thread = std::min(inputdatas.size() / FLAGS_num_threads, + inputdatas.size()); + std::vector workers(FLAGS_num_threads, jobs_per_thread); + workers[FLAGS_num_threads - 1] += inputdatas.size() % FLAGS_num_threads; + + std::vector> infer_threads; + + for (size_t i = 0; i < workers.size(); ++i) { + infer_threads.emplace_back(new std::thread([&, i]() { + size_t start = i * jobs_per_thread; + for (size_t j = start; j < start + workers[i]; ++j ) { + // 0. Call `paddle::framework::InitDevices()` initialize all the + devices + // In unittests, this is done in paddle/testing/paddle_gtest_main.cc + paddle::framework::LoDTensor words; + auto& srcdata = inputdatas[j]; + paddle::framework::LoD lod{{0, srcdata.size()}}; + words.set_lod(lod); + int64_t* pdata = words.mutable_data( + {static_cast(srcdata.size()), 1}, + paddle::platform::CPUPlace()); + memcpy(pdata, srcdata.data(), words.numel() * sizeof(int64_t)); + + LOG(INFO) << "thread id: " << i << ", words size:" << words.numel(); + std::vector cpu_feeds; + cpu_feeds.push_back(&words); + + paddle::framework::LoDTensor output1; + std::vector cpu_fetchs1; + cpu_fetchs1.push_back(&output1); + + // Run inference on CPU + if (FLAGS_prepare_vars) { + if (FLAGS_prepare_context) { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } else { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } + } else { + if (FLAGS_prepare_context) { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } else { + TestInference( + dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, + FLAGS_use_mkldnn); + } + } + //LOG(INFO) << output1.lod(); + //LOG(INFO) << output1.dims(); + } + })); + } + auto start_ms = get_current_ms(); + for (int i = 0; i < FLAGS_num_threads; ++i) { + infer_threads[i]->join(); + } + auto stop_ms = get_current_ms(); + LOG(INFO) << "total: " << stop_ms - start_ms << " ms";*/ } -TEST(inference, understand_sentiment) { +TEST(inference, nlp) { if (FLAGS_dirname.empty()) { LOG(FATAL) << "Usage: ./example --dirname=path/to/your/model"; } - std::vector> inputdatas; - read_data(&inputdatas); - LOG(INFO) << "---------- dataset size: " << inputdatas.size(); LOG(INFO) << "FLAGS_dirname: " << FLAGS_dirname << std::endl; std::string dirname = FLAGS_dirname; + std::vector datasets; + size_t num_total_words = + read_datasets(&datasets, "/home/tangjian/paddle-tj/out.ids.txt"); + LOG(INFO) << "Number of dataset samples(seq len<1024): " << datasets.size(); + LOG(INFO) << "Total number of words: " << num_total_words; + const bool model_combined = false; - int total_work = 10; - int num_threads = 2; - int work_per_thread = total_work / num_threads; - std::vector> infer_threads; - for (int i = 0; i < num_threads; ++i) { - infer_threads.emplace_back(new std::thread([&, i]() { - for (int j = 0; j < work_per_thread; ++j) { - // 0. Call `paddle::framework::InitDevices()` initialize all the devices - // In unittests, this is done in paddle/testing/paddle_gtest_main.cc - paddle::framework::LoDTensor words; - /* - paddle::framework::LoD lod{{0, 83}}; - int64_t word_dict_len = 198392; - SetupLoDTensor(&words, lod, static_cast(0), - static_cast(word_dict_len - 1)); - */ - std::vector srcdata{ - 784, 784, 1550, 6463, 56, 75693, 6189, 784, 784, - 1550, 198391, 6463, 42468, 4376, 10251, 10760, 6189, 297, - 396, 6463, 6463, 1550, 198391, 6463, 22564, 1612, 291, - 68, 164, 784, 784, 1550, 198391, 6463, 13659, 3362, - 42468, 6189, 2209, 198391, 6463, 2209, 2209, 198391, 6463, - 2209, 1062, 3029, 1831, 3029, 1065, 2281, 100, 11216, - 1110, 56, 10869, 9811, 100, 198391, 6463, 100, 9280, - 100, 288, 40031, 1680, 1335, 100, 1550, 9280, 7265, - 244, 1550, 198391, 6463, 1550, 198391, 6463, 42468, 4376, - 10251, 10760}; - paddle::framework::LoD lod{{0, srcdata.size()}}; - words.set_lod(lod); - int64_t* pdata = words.mutable_data( - {static_cast(srcdata.size()), 1}, - paddle::platform::CPUPlace()); - memcpy(pdata, srcdata.data(), words.numel() * sizeof(int64_t)); - - LOG(INFO) << "number of input size:" << words.numel(); - std::vector cpu_feeds; - cpu_feeds.push_back(&words); - - paddle::framework::LoDTensor output1; - std::vector cpu_fetchs1; - cpu_fetchs1.push_back(&output1); - - // Run inference on CPU - if (FLAGS_prepare_vars) { - if (FLAGS_prepare_context) { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } else { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } - } else { - if (FLAGS_prepare_context) { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } else { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } - } - LOG(INFO) << output1.lod(); - LOG(INFO) << output1.dims(); - } - })); + + // 0. Call `paddle::framework::InitDevices()` initialize all the devices + // 1. Define place, executor, scope + auto place = paddle::platform::CPUPlace(); + auto executor = paddle::framework::Executor(place); + auto* scope = new paddle::framework::Scope(); + + // 2. Initialize the inference_program and load parameters + std::unique_ptr inference_program; + inference_program = InitProgram(&executor, scope, dirname, model_combined); + if (FLAGS_use_mkldnn) { + EnableMKLDNN(inference_program); } - auto start_ms = get_current_ms(); - for (int i = 0; i < num_threads; ++i) { - infer_threads[i]->join(); + + if (FLAGS_num_threads > 1) { + test_multi_threads(); + } else { + if (FLAGS_prepare_vars) { + executor.CreateVariables(*inference_program, scope, 0); + } + // always prepare context and burning first time + std::unique_ptr ctx; + ctx = executor.Prepare(*inference_program, 0); + + // preapre fetch + const std::vector& fetch_target_names = + inference_program->GetFetchTargetNames(); + PADDLE_ENFORCE_EQ(fetch_target_names.size(), 1UL); + std::map fetch_targets; + paddle::framework::LoDTensor outtensor; + fetch_targets[fetch_target_names[0]] = &outtensor; + + // prepare feed + const std::vector& feed_target_names = + inference_program->GetFeedTargetNames(); + PADDLE_ENFORCE_EQ(feed_target_names.size(), 1UL); + std::map feed_targets; + + // for data and run + auto start_ms = get_current_ms(); + for (size_t i = 0; i < datasets.size(); ++i) { + feed_targets[feed_target_names[0]] = &(datasets[i]); + executor.RunPreparedContext(ctx.get(), scope, &feed_targets, + &fetch_targets, !FLAGS_prepare_vars); + } + auto stop_ms = get_current_ms(); + LOG(INFO) << "Total infer time: " << (stop_ms - start_ms) / 1000.0 / 60 + << " min, avg time per seq: " + << (stop_ms - start_ms) / datasets.size() << " ms"; } - auto stop_ms = get_current_ms(); - LOG(INFO) << "total: " << stop_ms - start_ms << " ms"; + delete scope; } -- GitLab From d13dd3b6a7ee81d4c106035ec0bad2c581ea795c Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Thu, 31 May 2018 16:04:47 +0800 Subject: [PATCH 087/913] revert profiling --- paddle/fluid/inference/tests/test_helper.h | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/paddle/fluid/inference/tests/test_helper.h b/paddle/fluid/inference/tests/test_helper.h index dd3a7a584ad..1f5551567c6 100644 --- a/paddle/fluid/inference/tests/test_helper.h +++ b/paddle/fluid/inference/tests/test_helper.h @@ -156,10 +156,27 @@ void TestInference(const std::string& dirname, auto executor = paddle::framework::Executor(place); auto* scope = new paddle::framework::Scope(); + // Profile the performance + paddle::platform::ProfilerState state; + if (paddle::platform::is_cpu_place(place)) { + state = paddle::platform::ProfilerState::kCPU; + } else { +#ifdef PADDLE_WITH_CUDA + state = paddle::platform::ProfilerState::kAll; + // The default device_id of paddle::platform::CUDAPlace is 0. + // Users can get the device_id using: + // int device_id = place.GetDeviceId(); + paddle::platform::SetDeviceId(0); +#else + PADDLE_THROW("'CUDAPlace' is not supported in CPU only device."); +#endif + } + // 2. Initialize the inference_program and load parameters std::unique_ptr inference_program; // Enable the profiler + paddle::platform::EnableProfiler(state); { paddle::platform::RecordEvent record_event( "init_program", @@ -172,6 +189,10 @@ void TestInference(const std::string& dirname, EnableMKLDNN(inference_program); } } + // Disable the profiler and print the timing information + paddle::platform::DisableProfiler(paddle::platform::EventSortingKey::kDefault, + "load_program_profiler"); + paddle::platform::ResetProfiler(); // 3. Get the feed_target_names and fetch_target_names const std::vector& feed_target_names = @@ -212,6 +233,9 @@ void TestInference(const std::string& dirname, true, CreateVars); } + // Enable the profiler + paddle::platform::EnableProfiler(state); + // Run repeat times to profile the performance for (int i = 0; i < repeat; ++i) { paddle::platform::RecordEvent record_event( @@ -228,6 +252,11 @@ void TestInference(const std::string& dirname, CreateVars); } } + + // Disable the profiler and print the timing information + paddle::platform::DisableProfiler( + paddle::platform::EventSortingKey::kDefault, "run_inference_profiler"); + paddle::platform::ResetProfiler(); } delete scope; -- GitLab From d90610624f7693d4dc9eda15ae6d6b46b0df8398 Mon Sep 17 00:00:00 2001 From: Wu Yi Date: Thu, 31 May 2018 16:23:11 +0800 Subject: [PATCH 088/913] Cleanup transpiler and move weight decay and clip on pservers (#11039) * WIP move weight decay * weight decay ok * wip * clean up transpiler * add details folder * update * fix split var test * follow comments --- .../fluid/tests/unittests/test_split_var.py | 4 +- .../fluid/transpiler/details/__init__.py | 16 + .../fluid/transpiler/details/program_utils.py | 37 ++ .../paddle/fluid/transpiler/details/ufind.py | 64 +++ .../fluid/transpiler/distribute_transpiler.py | 509 +++++++++--------- 5 files changed, 371 insertions(+), 259 deletions(-) create mode 100644 python/paddle/fluid/transpiler/details/__init__.py create mode 100644 python/paddle/fluid/transpiler/details/program_utils.py create mode 100644 python/paddle/fluid/transpiler/details/ufind.py diff --git a/python/paddle/fluid/tests/unittests/test_split_var.py b/python/paddle/fluid/tests/unittests/test_split_var.py index 0c5e8901b90..157def9b56e 100644 --- a/python/paddle/fluid/tests/unittests/test_split_var.py +++ b/python/paddle/fluid/tests/unittests/test_split_var.py @@ -14,7 +14,7 @@ import math import unittest -from paddle.fluid.transpiler.distribute_transpiler import split_dense_variable +from paddle.fluid.transpiler.distribute_transpiler import split_variable import paddle.fluid as fluid import paddle.fluid.core as core import random @@ -31,7 +31,7 @@ class TestSplitVar(unittest.TestCase): # dtype=core.VarDesc.VarType.LOD_TENSOR, shape=shape) var_list.append(var) - blocks = split_dense_variable(var_list, 10, min_size) + blocks = split_variable(var_list, 10, min_size) all_sizes = [] for s in expected_sizes: for s2 in s: diff --git a/python/paddle/fluid/transpiler/details/__init__.py b/python/paddle/fluid/transpiler/details/__init__.py new file mode 100644 index 00000000000..dc597c33849 --- /dev/null +++ b/python/paddle/fluid/transpiler/details/__init__.py @@ -0,0 +1,16 @@ +# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from program_utils import * +from ufind import * diff --git a/python/paddle/fluid/transpiler/details/program_utils.py b/python/paddle/fluid/transpiler/details/program_utils.py new file mode 100644 index 00000000000..f10b496306a --- /dev/null +++ b/python/paddle/fluid/transpiler/details/program_utils.py @@ -0,0 +1,37 @@ +# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +def delete_ops(block, ops): + try: + start = list(block.ops).index(ops[0]) + end = list(block.ops).index(ops[-1]) + [block.remove_op(start) for _ in xrange(end - start + 1)] + except Exception, e: + raise e + block.program.sync_with_cpp() + + +def find_op_by_input_arg(block, arg_name): + for index, op in enumerate(block.ops): + if arg_name in op.input_arg_names: + return index + return -1 + + +def find_op_by_output_arg(block, arg_name): + for index, op in enumerate(block.ops): + if arg_name in op.output_arg_names: + return index + return -1 diff --git a/python/paddle/fluid/transpiler/details/ufind.py b/python/paddle/fluid/transpiler/details/ufind.py new file mode 100644 index 00000000000..0e30d0e3f9c --- /dev/null +++ b/python/paddle/fluid/transpiler/details/ufind.py @@ -0,0 +1,64 @@ +# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +class UnionFind(object): + """ Union-find data structure. + + Union-find is a data structure that keeps track of a set of elements partitioned + into a number of disjoint (non-overlapping) subsets. + + Reference: + https://en.wikipedia.org/wiki/Disjoint-set_data_structure + + Args: + elements(list): The initialize element list. + """ + + def __init__(self, elementes=None): + self._parents = [] # index -> parent index + self._index = {} # element -> index + self._curr_idx = 0 + if not elementes: + elementes = [] + for ele in elementes: + self._parents.append(self._curr_idx) + self._index.update({ele: self._curr_idx}) + self._curr_idx += 1 + + def find(self, x): + # Find the root index of given element x, + # execute the path compress while findind the root index + if not x in self._index: + return -1 + idx = self._index[x] + while idx != self._parents[idx]: + t = self._parents[idx] + self._parents[idx] = self._parents[t] + idx = t + return idx + + def union(self, x, y): + # Union two given element + x_root = self.find(x) + y_root = self.find(y) + + if x_root == y_root: + return + self._parents[x_root] = y_root + + def is_connected(self, x, y): + # If two given elements have the same root index, + # then they are connected. + return self.find(x) == self.find(y) diff --git a/python/paddle/fluid/transpiler/distribute_transpiler.py b/python/paddle/fluid/transpiler/distribute_transpiler.py index e9b7d9e9d2d..06b0a1375ce 100644 --- a/python/paddle/fluid/transpiler/distribute_transpiler.py +++ b/python/paddle/fluid/transpiler/distribute_transpiler.py @@ -11,6 +11,30 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +""" +Transpile the program to distributed data-parallelism programs. +The main_program will be transformed to use a remote parameter server +to do parameter optimization. And the optimization graph will be put +into a parameter server program. + +Use different methods to split trainable variables to different +parameter servers. + +Steps to transpile trainer: +1. split variable to multiple blocks, aligned by product(dim[1:]) (width). +2. rename splited grad variables to add trainer_id suffix ".trainer_%d". +3. modify trainer program add split_op to each grad variable. +4. append send_op to send splited variables to server and fetch + params(splited blocks or origin param) from server. +5. append concat_op to merge splited blocks to update local weights. + +Steps to transpile pserver: +1. create new program for parameter server. +2. create params and grad variables that assigned to current server instance. +3. create a sub-block in the server side program +4. append ops that should run on current server instance. +5. add listen_and_serv op +""" from __future__ import print_function @@ -21,9 +45,11 @@ from .. import core, framework from ..framework import Program, default_main_program, \ default_startup_program, \ Variable, Parameter, grad_var_name +from details import * LOOKUP_TABLE_TYPE = "lookup_table" LOOKUP_TABLE_GRAD_TYPE = "lookup_table_grad" +OP_ROLE_VAR_ATTR_NAME = core.op_proto_and_checker_maker.kOpRoleVarAttrName() RPC_OP_ROLE_ATTR_NAME = op_role_attr_name = core.op_proto_and_checker_maker.kOpRoleAttrName( ) RPC_OP_ROLE_ATTR_VALUE = core.op_proto_and_checker_maker.OpRole.RPC @@ -40,62 +66,11 @@ class VarBlock: return "%s:%d:%d" % (self.varname, self.offset, self.size) -class UnionFind(object): - """ Union-find data structure. - - Union-find is a data structure that keeps track of a set of elements partitioned - into a number of disjoint (non-overlapping) subsets. - - Reference: - https://en.wikipedia.org/wiki/Disjoint-set_data_structure - - Args: - elements(list): The initialize element list. - """ - - def __init__(self, elementes=None): - self._parents = [] # index -> parent index - self._index = {} # element -> index - self._curr_idx = 0 - if not elementes: - elementes = [] - for ele in elementes: - self._parents.append(self._curr_idx) - self._index.update({ele: self._curr_idx}) - self._curr_idx += 1 - - def find(self, x): - # Find the root index of given element x, - # execute the path compress while findind the root index - if not x in self._index: - return -1 - idx = self._index[x] - while idx != self._parents[idx]: - t = self._parents[idx] - self._parents[idx] = self._parents[t] - idx = t - return idx - - def union(self, x, y): - # Union two given element - x_root = self.find(x) - y_root = self.find(y) - - if x_root == y_root: - return - self._parents[x_root] = y_root - - def is_connected(self, x, y): - # If two given elements have the same root index, - # then they are connected. - return self.find(x) == self.find(y) - - def same_or_split_var(p_name, var_name): return p_name == var_name or p_name.startswith(var_name + ".block") -def split_dense_variable(var_list, service_count, min_block_size=8192): +def split_variable(var_list, service_count, min_block_size=8192): """ We may need to split dense tensor to one or more blocks and put them equally onto parameter server. One block is a sub-tensor @@ -141,99 +116,15 @@ def split_dense_variable(var_list, service_count, min_block_size=8192): return blocks -def delete_ops(block, ops): - try: - start = list(block.ops).index(ops[0]) - end = list(block.ops).index(ops[-1]) - [block.remove_op(start) for _ in xrange(end - start + 1)] - except Exception, e: - raise e - block.program.sync_with_cpp() - - -def find_op_by_input_arg(block, arg_name): - for index, op in enumerate(block.ops): - if arg_name in op.input_arg_names: - return index - return -1 - - -def find_op_by_output_arg(block, arg_name): - for index, op in enumerate(block.ops): - if arg_name in op.output_arg_names: - return index - return -1 - - class DistributeTranspiler: - def transpile(self, - trainer_id, - program=None, - pservers="127.0.0.1:6174", - trainers=1, - split_method=RoundRobin, - sync_mode=True): - """ - Transpile the program to distributed data-parallelism programs. - The main_program will be transformed to use a remote parameter server - to do parameter optimization. And the optimization graph will be put - into a parameter server program. - - Use different methods to split trainable variables to different - parameter servers. - - Steps to transpile trainer: - 1. split variable to multiple blocks, aligned by product(dim[1:]) (width). - 2. rename splited grad variables to add trainer_id suffix ".trainer_%d". - 3. modify trainer program add split_op to each grad variable. - 4. append send_op to send splited variables to server and fetch - params(splited blocks or origin param) from server. - 5. append concat_op to merge splited blocks to update local weights. - - Steps to transpile pserver: - 1. create new program for parameter server. - 2. create params and grad variables that assigned to current server instance. - 3. create a sub-block in the server side program - 4. append ops that should run on current server instance. - 5. add listen_and_serv op - - :param trainer_id: one unique id for each trainer in a job. - :type trainer_id: int - :param program: program to transpile, default is default_main_program - :type program: Program - :param pservers: parameter server endpoints like "m1:6174,m2:6174" - :type pservers: string - :param trainers: total number of workers/trainers in the job - :type trainers: int - :param split_method: A function to determin how to split variables - to different servers equally. - :type split_method: function - :type sync_mode: boolean default True - :param sync_mode: if sync_mode is set True, it means that dist transpiler - will transpile the program into sync_mode pserver and trainer program. - """ - assert (split_method.__bases__[0] == PSDispatcher) - if program is None: - program = default_main_program() - self.origin_program = program - self.trainer_num = trainers - self.sync_mode = sync_mode - # TODO(typhoonzero): currently trainer_id is fetched from cluster system - # like Kubernetes, we should port this to use etcd later when developing - # fluid distributed training with fault-tolerance. - self.trainer_id = trainer_id - pserver_endpoints = pservers.split(",") - self.pserver_endpoints = pserver_endpoints - self.optimize_ops, params_grads = self._get_optimize_pass() - ps_dispatcher = split_method(pserver_endpoints) - + def _has_distributed_lookup_table(self): # process lookup_table_op # 1. check all lookup_table_op is distributed # 2. check all lookup_table_op share the same table. distributed_lookup_table_ops = [] # support only one distributed_lookup_table now self.table_name = None - for op in program.global_block().ops: + for op in self.origin_program.global_block().ops: if op.type == LOOKUP_TABLE_TYPE: if op.attrs['is_distributed'] is True: if self.table_name is None: @@ -246,20 +137,13 @@ class DistributeTranspiler: if self.table_name is not None: assert op.input("W")[0] != self.table_name - self.has_distributed_lookup_table = len( - distributed_lookup_table_ops) > 0 - - # step1: For large parameters and gradients, split them into smaller - # blocks. - param_list = [] - grad_list = [] - for p, g in params_grads: - # skip parameter marked not trainable - if type(p) == Parameter and p.trainable == False: - continue - param_list.append(p) - grad_list.append(g) + return len(distributed_lookup_table_ops) > 0 + def _update_dist_lookup_table_vars(self, param_list, grad_list, + params_grads): + # TODO(wuyi): put find a way to put dist lookup table stuff all together. + # update self.table_param_grad and self.trainer_side_table_grad_list + program = self.origin_program if self.has_distributed_lookup_table: param_list = [ param for param in param_list if param.name != self.table_name @@ -277,7 +161,7 @@ class DistributeTranspiler: self.trainer_side_table_grad_list = [ program.global_block().create_var( name="%s.trainer_%d.pserver_%d" % - (table_grad_var.name, trainer_id, index), + (table_grad_var.name, self.trainer_id, index), type=table_grad_var.type, shape=table_grad_var.shape, dtype=table_grad_var.dtype) @@ -293,23 +177,41 @@ class DistributeTranspiler: for index in range(len(self.pserver_endpoints)) ] - grad_blocks = split_dense_variable(grad_list, len(pserver_endpoints)) - param_blocks = split_dense_variable(param_list, len(pserver_endpoints)) + def _init_splited_vars(self, split_method): + # update these mappings for further transpile: + # 1. param_var_mapping: param var name -> [splited params vars] + # 2. grad_var_mapping: grad var name -> [splited grads vars] + # 3. grad_param_mapping: grad.blockx -> param.blockx + # 4. param_grad_ep_mapping: ep -> {"params": [], "grads": []} + + param_list = [] + grad_list = [] + for p, g in self.params_grads: + # skip parameter marked not trainable + if type(p) == Parameter and p.trainable == False: + continue + param_list.append(p) + grad_list.append(g) + + self._update_dist_lookup_table_vars(param_list, grad_list, + self.params_grads) + + grad_blocks = split_variable(grad_list, len(self.pserver_endpoints)) + param_blocks = split_variable(param_list, len(self.pserver_endpoints)) assert (len(grad_blocks) == len(param_blocks)) - # step2: Create new vars for the parameters and gradients blocks and - # add ops to do the split. - param_var_mapping = self._create_vars_from_blocklist(program, - param_blocks) - grad_var_mapping = self._create_vars_from_blocklist( - program, grad_blocks, add_trainer_suffix=self.trainer_num > 1) - grad_param_mapping = dict() + # origin_varname -> [splited_var] + self.param_var_mapping = self._create_vars_from_blocklist( + self.origin_program, param_blocks) + self.grad_var_mapping = self._create_vars_from_blocklist( + self.origin_program, + grad_blocks, + add_trainer_suffix=self.trainer_num > 1) + self.grad_param_mapping = dict() for g, p in zip(grad_blocks, param_blocks): g_name, g_bid, _ = g.split(":") p_name, p_bid, _ = p.split(":") - grad_param_mapping[grad_var_mapping[g_name][int(g_bid)]] = \ - param_var_mapping[p_name][int(p_bid)] - - # step 3: transpile trainer side program, insert recv op and send op. + self.grad_param_mapping[self.grad_var_mapping[g_name][int(g_bid)]] = \ + self.param_var_mapping[p_name][int(p_bid)] # create mapping of endpoint -> split var to create pserver side program self.param_grad_ep_mapping = dict() @@ -322,10 +224,50 @@ class DistributeTranspiler: }) for ep in self.pserver_endpoints ] + def transpile(self, + trainer_id, + program=None, + pservers="127.0.0.1:6174", + trainers=1, + split_method=RoundRobin, + sync_mode=True): + """ + :param trainer_id: one unique id for each trainer in a job. + :type trainer_id: int + :param program: program to transpile, default is default_main_program + :type program: Program + :param pservers: parameter server endpoints like "m1:6174,m2:6174" + :type pservers: string + :param trainers: total number of workers/trainers in the job + :type trainers: int + :param split_method: A function to determin how to split variables + to different servers equally. + :type split_method: function + :type sync_mode: boolean default True + :param sync_mode: if sync_mode is set True, it means that dist transpiler + will transpile the program into sync_mode pserver and trainer program. + """ + assert (split_method.__bases__[0] == PSDispatcher) + if program is None: + program = default_main_program() + self.origin_program = program + self.trainer_num = trainers + self.sync_mode = sync_mode + self.trainer_id = trainer_id + pserver_endpoints = pservers.split(",") + self.pserver_endpoints = pserver_endpoints + self.optimize_ops, self.params_grads = self._get_optimize_pass() + + ps_dispatcher = split_method(self.pserver_endpoints) + self.has_distributed_lookup_table = self._has_distributed_lookup_table() + + # split and create vars, then put splited vars in dicts for later use. + self._init_splited_vars(split_method) + # step 3.1: insert send op to send gradient vars to parameter servers ps_dispatcher.reset() send_vars = [] - for orig_varname, splited_vars in grad_var_mapping.items(): + for orig_varname, splited_vars in self.grad_var_mapping.items(): eplist = ps_dispatcher.dispatch(splited_vars) if len(splited_vars) == 1: orig_varname = splited_vars[0].name @@ -367,7 +309,7 @@ class DistributeTranspiler: # step 3.2: insert recv op to receive parameters from parameter server recv_vars = [] for _, var in enumerate(send_vars): - recv_vars.append(grad_param_mapping[var]) + recv_vars.append(self.grad_param_mapping[var]) ps_dispatcher.reset() eplist = ps_dispatcher.dispatch(recv_vars) @@ -375,7 +317,7 @@ class DistributeTranspiler: self.param_grad_ep_mapping[ep]["params"].append(recv_vars[i]) self.param_grad_ep_mapping[ep]["grads"].append(send_vars[i]) # step4: Concat the parameters splits together after recv. - for varname, splited_var in param_var_mapping.iteritems(): + for varname, splited_var in self.param_var_mapping.iteritems(): eps = [] for var in splited_var: index = [v.name for v in recv_vars].index(var.name) @@ -399,7 +341,7 @@ class DistributeTranspiler: RPC_OP_ROLE_ATTR_NAME: RPC_OP_ROLE_ATTR_VALUE }) - for varname, splited_var in param_var_mapping.iteritems(): + for varname, splited_var in self.param_var_mapping.iteritems(): if len(splited_var) <= 1: continue orig_param = program.global_block().vars[varname] @@ -440,7 +382,6 @@ class DistributeTranspiler: # we don't need to create them when grad arrives. # change client side var name to origin name by # removing ".trainer_%d" suffix - suff_idx = v.name.find(".trainer_") if suff_idx >= 0: orig_var_name = v.name[:suff_idx] @@ -477,24 +418,14 @@ class DistributeTranspiler: # located on current pserver opt_op_on_pserver = [] for _, op in enumerate(self.optimize_ops): - if self._is_opt_op(op) and self._is_opt_op_on_pserver(endpoint, op): + if self._is_optimizer_op(op) and self._is_opt_op_on_pserver( + endpoint, op): opt_op_on_pserver.append(op) # step 3.3 # Iterate through the ops, and if an op and the optimize ops # which located on current pserver are in one set, then # append it into the sub program. - # We try to put optimization program run parallelly, assume - # optimization program always looks like: - # - # prevop -> prevop -> opt op -> following op -> following op; -> - # prevop -> prevop -> opt op -> following op -> following op; -> - # global op -> global op - # - # we put operators that can run parallelly to many program blocks. - # in above example, we seperate ops by the ";". Global ops must run - # after all the optimize ops finished. - global_ops = [] # HACK: optimization global ops only used to scale beta1 and beta2 # replace it with dependency engine. @@ -502,12 +433,18 @@ class DistributeTranspiler: if self._is_adam_connected_op(op): global_ops.append(op) - def __append_optimize_op__(op, block, grad_to_block_id): - if self._is_opt_op(op): + def __append_optimize_op__(op, block, grad_to_block_id, merged_var): + if self._is_optimizer_op(op): self._append_pserver_ops(block, op, endpoint, grad_to_block_id, - self.origin_program) + self.origin_program, merged_var) else: - self._append_pserver_non_opt_ops(block, op) + self._append_pserver_non_opt_ops(block, op, endpoint) + + def __op_have_grad_input__(op): + for varname in op.input_arg_names: + if varname.find("@GRAD") >= 0: + return varname + return "" # append lr decay ops to the child block if exists lr_ops = self._get_lr_ops() @@ -515,17 +452,26 @@ class DistributeTranspiler: lr_decay_block = pserver_program.create_block( pserver_program.num_blocks - 1) for _, op in enumerate(lr_ops): - self._append_pserver_non_opt_ops(lr_decay_block, op) + self._append_pserver_non_opt_ops(lr_decay_block, op, endpoint) # append op to the current block grad_to_block_id = [] pre_block_idx = pserver_program.num_blocks - 1 for idx, opt_op in enumerate(opt_op_on_pserver): per_opt_block = pserver_program.create_block(pre_block_idx) + # append grad merging ops before clip and weight decay + for _, op in enumerate(self.optimize_ops): + # find the origin @GRAD var before clipping + grad_varname_for_block = __op_have_grad_input__(op) + if ufind.is_connected(op, opt_op) and grad_varname_for_block: + merged_var = self._append_pserver_grad_merge_ops( + per_opt_block, grad_varname_for_block, endpoint, + grad_to_block_id, self.origin_program) for _, op in enumerate(self.optimize_ops): # optimizer is connected to itself if ufind.is_connected(op, opt_op) and op not in global_ops: - __append_optimize_op__(op, per_opt_block, grad_to_block_id) + __append_optimize_op__(op, per_opt_block, grad_to_block_id, + merged_var) # append global ops if global_ops: @@ -533,15 +479,7 @@ class DistributeTranspiler: pserver_program.num_blocks - 1) for glb_op in global_ops: __append_optimize_op__(glb_op, opt_state_block, - grad_to_block_id) - - # NOT USED: single block version: - # - # for _, op in enumerate(self.optimize_ops): - # for _, opt_op in enumerate(opt_op_on_pserver): - # if ufind.is_connected(op, opt_op): - # __append_optimize_op__(glb_op, optimize_block) - # break + grad_to_block_id, None) # process distributed lookup_table prefetch_block = None @@ -631,6 +569,8 @@ class DistributeTranspiler: attrs=op.attrs) return s_prog + # ====================== private transpiler functions ===================== + # transpiler function for dis lookup_table def _replace_lookup_table_op_with_prefetch(self, program, pserver_endpoints): @@ -836,7 +776,6 @@ class DistributeTranspiler: return table_opt_block - # ====================== private transpiler functions ===================== def _create_vars_from_blocklist(self, program, block_list, @@ -979,17 +918,74 @@ class DistributeTranspiler: pass return orig_shape - def _orig_varname(self, varname): - suff_idx = varname.find(".trainer_") + def _get_varname_parts(self, varname): + # returns origin, blockid, trainerid orig_var_name = "" - if suff_idx >= 0: - orig_var_name = varname[:suff_idx] + trainer_part = "" + block_part = "" + trainer_idx = varname.find(".trainer_") + if trainer_idx >= 0: + trainer_part = varname[trainer_idx + 1:] + else: + trainer_idx = len(varname) + block_index = varname.find(".block") + if block_index >= 0: + block_part = varname[block_index + 1:trainer_idx] else: - orig_var_name = varname - return orig_var_name + block_index = len(varname) + orig_var_name = varname[0:min(block_index, trainer_idx)] + return orig_var_name, block_part, trainer_part + + def _orig_varname(self, varname): + orig, _, _ = self._get_varname_parts(varname) + return orig + + def _append_pserver_grad_merge_ops(self, optimize_block, + grad_varname_for_block, endpoint, + grad_to_block_id, origin_program): + program = optimize_block.program + pserver_block = program.global_block() + grad_block = None + for g in self.param_grad_ep_mapping[endpoint]["grads"]: + if self._orig_varname(g.name) == \ + self._orig_varname(grad_varname_for_block): + grad_block = g + break + if not grad_block: + # do not append this op if current endpoint + # is not dealing with this grad block + return + orig_varname, block_name, trainer_name = self._get_varname_parts( + grad_block.name) + if block_name: + merged_var_name = '.'.join([orig_varname, block_name]) + else: + merged_var_name = orig_varname + merged_var = \ + pserver_block.vars[merged_var_name] + grad_to_block_id.append(merged_var.name + ":" + str(optimize_block.idx)) + if self.sync_mode and self.trainer_num > 1: + vars2merge = [] + for i in xrange(self.trainer_num): + per_trainer_name = "%s.trainer_%d" % \ + (merged_var_name, i) + vars2merge.append(pserver_block.vars[per_trainer_name]) + + optimize_block.append_op( + type="sum", + inputs={"X": vars2merge}, + outputs={"Out": merged_var}) + # TODO(panyx0718): What if it's SELECTED_ROWS. + if not merged_var.type == core.VarDesc.VarType.SELECTED_ROWS: + optimize_block.append_op( + type="scale", + inputs={"X": merged_var}, + outputs={"Out": merged_var}, + attrs={"scale": 1.0 / float(self.trainer_num)}) + return merged_var def _append_pserver_ops(self, optimize_block, opt_op, endpoint, - grad_to_block_id, origin_program): + grad_to_block_id, origin_program, merged_var): program = optimize_block.program pserver_block = program.global_block() new_inputs = dict() @@ -997,40 +993,6 @@ class DistributeTranspiler: # moment can use the updated shape for key in opt_op.input_names: if key == "Grad": - grad_block = None - for g in self.param_grad_ep_mapping[endpoint]["grads"]: - if same_or_split_var( - self._orig_varname(g.name), - self._orig_varname(opt_op.input(key)[0])): - grad_block = g - break - if not grad_block: - # do not append this op if current endpoint - # is not dealing with this grad block - return - merged_var = \ - pserver_block.vars[self._orig_varname(grad_block.name)] - grad_to_block_id.append(merged_var.name + ":" + str( - optimize_block.idx)) - if self.sync_mode and self.trainer_num > 1: - vars2merge = [] - for i in xrange(self.trainer_num): - per_trainer_name = "%s.trainer_%d" % \ - (self._orig_varname(grad_block.name), i) - vars2merge.append(pserver_block.vars[per_trainer_name]) - - optimize_block.append_op( - type="sum", - inputs={"X": vars2merge}, - outputs={"Out": merged_var}) - # TODO(panyx0718): What if it's SELECTED_ROWS. - if not merged_var.type == core.VarDesc.VarType.SELECTED_ROWS: - optimize_block.append_op( - type="scale", - inputs={"X": merged_var}, - outputs={"Out": merged_var}, - attrs={"scale": 1.0 / float(self.trainer_num)}) - new_inputs[key] = merged_var elif key == "Param": # param is already created on global program @@ -1089,17 +1051,31 @@ class DistributeTranspiler: outputs=outputs, attrs=opt_op.attrs) - def _append_pserver_non_opt_ops(self, optimize_block, opt_op): + def _is_splited_grad_var(self, var, var_dict): + grad_block = None + for _, g in var_dict.iteritems(): + if self._orig_varname(g.name) == self._orig_varname(var.name): + if g.name.find(".trainer_") == -1: + grad_block = g + break + return grad_block + + def _append_pserver_non_opt_ops(self, optimize_block, opt_op, endpoint): program = optimize_block.program # Append the ops for parameters that do not need to be optimized/updated inputs = self._get_input_map_from_op( self.origin_program.global_block().vars, opt_op) - for varlist in inputs.itervalues(): + for key, varlist in inputs.iteritems(): if not isinstance(varlist, list): varlist = [varlist] - for var in varlist: - if not program.global_block().vars.has_key(var.name): + # for ops like clipping and weight decay, get the splited var + # for inputs/outputs + grad_block = self._is_splited_grad_var( + var, program.global_block().vars) + if grad_block: + inputs[key] = grad_block + elif not program.global_block().vars.has_key(var.name): program.global_block().create_var( name=var.name, persistable=var.persistable, @@ -1108,13 +1084,16 @@ class DistributeTranspiler: outputs = self._get_output_map_from_op( self.origin_program.global_block().vars, opt_op) - - for varlist in outputs.itervalues(): + for key, varlist in outputs.iteritems(): if not isinstance(varlist, list): varlist = [varlist] - for var in varlist: - program.global_block().clone_variable(var) + grad_block = self._is_splited_grad_var( + var, program.global_block().vars) + if grad_block: + outputs[key] = grad_block + elif not program.global_block().vars.has_key(var.name): + program.global_block().clone_variable(var) optimize_block.append_op( type=opt_op.type, @@ -1160,9 +1139,17 @@ class DistributeTranspiler: ufind.union(op1, op2) return ufind - def _is_opt_op(self, op): - # NOTE: It's a HACK implement. - # optimize op: SGDOptimize, MomentumOptimizer, AdamOptimizer and etc... + def _is_opt_role_op(self, op): + # NOTE: depend on oprole to find out whether this op is for + # optimize + op_maker = core.op_proto_and_checker_maker + optimize_role = core.op_proto_and_checker_maker.OpRole.Optimize + if op_maker.kOpRoleAttrName() in op.attrs and \ + int(op.attrs[op_maker.kOpRoleAttrName()]) == int(optimize_role): + return True + return False + + def _is_optimizer_op(self, op): if "Param" in op.input_names and \ "LearningRate" in op.input_names: return True @@ -1212,7 +1199,7 @@ class DistributeTranspiler: # find learning rate variables by optimize op lr_vars = set() for op in self.optimize_ops: - if self._is_opt_op(op): + if self._is_optimizer_op(op): lr_vars.add(op.input("LearningRate")[0]) find_ops = [] @@ -1229,7 +1216,7 @@ class DistributeTranspiler: # NOTE: we need to skip all optimize ops, since it is connected # with forward/backward ops and lr ops, we only need the lr ops. if op1 != op2 and self._is_op_connected(op1, op2) and \ - not self._is_opt_op(op1) and not self._is_opt_op(op2): + not self._is_optimizer_op(op1) and not self._is_optimizer_op(op2): ufind.union(op1, op2) # find all ops which is related with lr var for op1 in block.ops: @@ -1250,13 +1237,21 @@ class DistributeTranspiler: block = self.origin_program.global_block() opt_ops = [] params_grads = [] + origin_var_dict = self.origin_program.global_block().vars for op in block.ops: - if self._is_opt_op(op): + if self._is_opt_role_op(op): opt_ops.append(op) - params_grads.append((self.origin_program.global_block().var( - op.input("Param")[0]), - self.origin_program.global_block().var( - op.input("Grad")[0]))) + # HACK(wuyi): if we find grad vars from input of optimize + # ops, we may get the output of clip op. Use syntax "@GRAD" + # and op_role_var to get the pair. + for input_name in op.input_arg_names: + if input_name.find("@GRAD") != -1 and \ + op.attrs[RPC_OP_ROLE_ATTR_NAME]: + param_name = op.attrs[OP_ROLE_VAR_ATTR_NAME][0] + params_grads.append([ + origin_var_dict[param_name], + origin_var_dict[input_name] + ]) elif self._is_adam_connected_op(op): opt_ops.append(op) else: -- GitLab From 708bec2e56c6a856f628ad8b650b0bf04a3df975 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Thu, 31 May 2018 16:33:54 +0800 Subject: [PATCH 089/913] add test --- paddle/fluid/inference/tests/book/test_inference_nlp.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index e216e9dbe6f..990d45964e3 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -200,6 +200,14 @@ TEST(inference, nlp) { LOG(INFO) << "Total infer time: " << (stop_ms - start_ms) / 1000.0 / 60 << " min, avg time per seq: " << (stop_ms - start_ms) / datasets.size() << " ms"; + { // just for test + auto* scope = new paddle::framework::Scope(); + paddle::framework::LoDTensor outtensor; + TestInference( + dirname, {&(datasets[0])}, {&outtensor}, FLAGS_repeat, model_combined, + false); + delete scope; + } } delete scope; } -- GitLab From f9d93bfde1bd69d84a10cb676f0aba52b1596edd Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Thu, 31 May 2018 16:42:00 +0800 Subject: [PATCH 090/913] Add document to random crop operator --- paddle/fluid/operators/random_crop_op.cc | 6 +-- .../fluid/layers/layer_function_generator.py | 53 ++++++++++++++++--- python/paddle/fluid/layers/nn.py | 29 +++++++++- 3 files changed, 75 insertions(+), 13 deletions(-) diff --git a/paddle/fluid/operators/random_crop_op.cc b/paddle/fluid/operators/random_crop_op.cc index b14b559e31d..371cdb5b858 100644 --- a/paddle/fluid/operators/random_crop_op.cc +++ b/paddle/fluid/operators/random_crop_op.cc @@ -36,11 +36,11 @@ class RandomCropOpMaker : public framework::OpProtoAndCheckerMaker { AddInput("Seed", "The random seed."); AddOutput("Out", "The cropped instance batch."); AddOutput("SeedOut", "The random seed after random cropping.") - .AsDispensable(); + .AsIntermediate(); AddAttr>("shape", "The shape of a cropped instance."); AddComment(R"DOC( - This operator takes a batch of instance, and do random cropping on each instance. - It means that cropping positions differs on each instance, which is determined + This operator takes a batch of instance, and do random cropping on each instance. + It means that cropping positions differs on each instance, which is determined by an uniform random generator. All cropped instances have the same shape, which is determined by the operator's attribute 'shape'. )DOC"); diff --git a/python/paddle/fluid/layers/layer_function_generator.py b/python/paddle/fluid/layers/layer_function_generator.py index 295d1b7190e..6026237d0b6 100644 --- a/python/paddle/fluid/layers/layer_function_generator.py +++ b/python/paddle/fluid/layers/layer_function_generator.py @@ -15,16 +15,13 @@ import re import cStringIO import functools import warnings +import string from ..proto import framework_pb2 from ..framework import OpProtoHolder, Variable from ..layer_helper import LayerHelper -__all__ = [ - 'deprecated', - 'generate_layer_fn', - 'autodoc', -] +__all__ = ['deprecated', 'generate_layer_fn', 'autodoc', 'templatedoc'] def _convert_(name): @@ -43,6 +40,10 @@ def _convert_(name): return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower() +def _type_to_str_(tp): + return framework_pb2.AttrType.Name(tp) + + def _generate_doc_string_(op_proto): """ Generate docstring by OpProto @@ -54,9 +55,6 @@ def _generate_doc_string_(op_proto): str: the document string """ - def _type_to_str_(tp): - return framework_pb2.AttrType.Name(tp) - if not isinstance(op_proto, framework_pb2.OpProto): raise TypeError("OpProto should be `framework_pb2.OpProto`") @@ -220,3 +218,42 @@ def autodoc(comment=""): return func return __impl__ + + +def templatedoc(): + """ + Decorator of layer function. It will use the docstring from the layer + function as the template. The template arguments are: + + * ${comment}: The operator comment written in CPP. + * ${{name}_comment}: The comment of ${name} written with AddAttr, AddOutput, + and AddInput. The ${name} is Python snake style. i.e., xxx_xxx. + * ${{name}_type}: The type of ${name}. + + + Returns: + Decorated funciton. + """ + + def __impl__(func): + op_proto = OpProtoHolder.instance().get_op_proto(func.__name__) + tmpl = string.Template(func.__doc__) + args = {"comment": " ".join(op_proto.comment.split())} + for each_input in op_proto.inputs: + input_name = _convert_(each_input.name) + args["{0}_comment".format(input_name)] = each_input.comment + args["{0}_type".format(input_name)] = "Variable" + for each_attr in op_proto.attrs: + input_name = _convert_(each_attr.name) + args["{0}_comment".format(input_name)] = each_attr.comment + args["{0}_type".format(input_name)] = _type_to_str_(each_attr.type) + + for each_opt in op_proto.outputs: + output_name = _convert_(each_opt.name) + args["{0}_comment".format(output_name)] = each_opt.comment + args["{0}_type".format(output_name)] = "Variable" + + func.__doc__ = tmpl.substitute(args) + return func + + return __impl__ diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index 63ec8315147..acebeaebbb6 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -19,9 +19,10 @@ from ..layer_helper import LayerHelper from ..initializer import Normal, Constant from ..framework import Variable from ..param_attr import ParamAttr -from layer_function_generator import autodoc +from layer_function_generator import autodoc, templatedoc from tensor import concat import utils +import random __all__ = [ 'fc', @@ -3992,10 +3993,34 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): return out -def random_crop(input, shape, seed=1): +@templatedoc() +def random_crop(x, shape, seed=None): + """ + **Random crop operator** + + ${comment} + + Examples: + >>> img = fluid.layers.data("img", [3, 256, 256]) + >>> cropped_img = fluid.layers.random_crop(img, shape=[3, 224, 224]) + + Args: + x(${x_type}): ${x_comment} + shape(${shape_type}): ${shape_comment} + seed(int|${seed_type}|None): ${seed_comment} By default, the seed will + get from `random.randint(-65536, 65535)`. + + Returns: + ${out_comment} + + """ + helper = LayerHelper("random_crop", **locals()) dtype = helper.input_dtype() out = helper.create_tmp_variable(dtype) + if seed is None: + seed = random.randint(-65536, 65535) + if isinstance(seed, int): seed_value = seed seed = helper.create_tmp_variable(dtype="int64") -- GitLab From e330cd032e9a92e2a5851506c35c2ef31e02e01a Mon Sep 17 00:00:00 2001 From: chengduoZH Date: Thu, 31 May 2018 16:34:08 +0800 Subject: [PATCH 091/913] balance parameter update --- .../details/multi_devices_graph_builder.cc | 41 +++++++++++++------ .../details/multi_devices_graph_builder.h | 2 +- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/paddle/fluid/framework/details/multi_devices_graph_builder.cc b/paddle/fluid/framework/details/multi_devices_graph_builder.cc index d8e711994c5..17baacd13ee 100644 --- a/paddle/fluid/framework/details/multi_devices_graph_builder.cc +++ b/paddle/fluid/framework/details/multi_devices_graph_builder.cc @@ -11,11 +11,15 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -#include "paddle/fluid/framework/details/multi_devices_graph_builder.h" +#include #include +#include #include +#include + #include "paddle/fluid/framework/details/broadcast_op_handle.h" #include "paddle/fluid/framework/details/computation_op_handle.h" +#include "paddle/fluid/framework/details/multi_devices_graph_builder.h" #include "paddle/fluid/framework/details/reduce_op_handle.h" #include "paddle/fluid/framework/details/rpc_op_handle.h" #include "paddle/fluid/framework/details/scale_loss_grad_op_handle.h" @@ -26,9 +30,6 @@ #include "paddle/fluid/framework/details/nccl_all_reduce_op_handle.h" #endif -#include -#include - DEFINE_string(ssa_graph_path, "/tmp/ssa_graph.dot", "the ssa graph path only print with GLOG_v=10," "default /tmp/graph.dot"); @@ -148,9 +149,9 @@ bool MultiDevSSAGraphBuilder::IsDistTrainOp( std::unique_ptr MultiDevSSAGraphBuilder::Build( const ProgramDesc &program) const { - std::unordered_map var_types; + std::unordered_map all_vars; for (auto *var : program.Block(0).AllVars()) { - var_types[var->Name()] = var->GetType(); + all_vars[var->Name()] = var; } auto graph = new SSAGraph(); @@ -167,12 +168,28 @@ std::unique_ptr MultiDevSSAGraphBuilder::Build( auto send_vars = FindDistTrainSendVars(program); auto recv_vars = FindDistTrainRecvVars(program); - size_t cur_device_id = 0; std::vector> var_name_on_devices; std::vector> bcast_var_name_set; var_name_on_devices.resize(places_.size()); bcast_var_name_set.resize(places_.size()); + size_t cur_device_id = 0; + std::vector balance_grads(places_.size(), 0); + + auto get_appropriate_dev = [&](std::string &g_name) -> size_t { + auto var_desc = all_vars.at(g_name); + PADDLE_ENFORCE_NOT_NULL(var_desc); + auto dim = framework::make_ddim(var_desc->GetShape()); + int64_t numel = framework::product(dim); + PADDLE_ENFORCE_GE(numel, 0); + auto smallest = + std::min_element(std::begin(balance_grads), std::end(balance_grads)); + size_t dev_id = + static_cast(std::distance(std::begin(balance_grads), smallest)); + balance_grads[dev_id] += numel; + return dev_id; + }; + bool is_forwarding = true; for (auto *op : program.Block(0).AllOps()) { if (boost::get( @@ -220,13 +237,13 @@ std::unique_ptr MultiDevSSAGraphBuilder::Build( switch (strategy_.reduce_) { case BuildStrategy::ReduceStrategy::kReduce: + cur_device_id = get_appropriate_dev(g_name); CreateReduceOp(&result, g_name, cur_device_id); var_name_on_devices[cur_device_id].emplace(g_name); bcast_var_name_set[cur_device_id].emplace(p_name); - cur_device_id = (cur_device_id + 1) % places_.size(); break; case BuildStrategy::ReduceStrategy::kAllReduce: - if (IsSparseGradient(var_types, g_name)) { + if (IsSparseGradient(all_vars, g_name)) { CreateReduceOp(&result, g_name, 0); CreateBroadcastOp(&result, g_name, 0); } else { @@ -269,10 +286,10 @@ std::unique_ptr MultiDevSSAGraphBuilder::Build( } bool MultiDevSSAGraphBuilder::IsSparseGradient( - const std::unordered_map &var_types, + const std::unordered_map &all_vars, const std::string &og) const { - PADDLE_ENFORCE(var_types.count(og) != 0); - if (var_types.at(og) == proto::VarType::SELECTED_ROWS) { + PADDLE_ENFORCE(all_vars.count(og) != 0); + if (all_vars.at(og)->GetType() == proto::VarType::SELECTED_ROWS) { return true; } return false; diff --git a/paddle/fluid/framework/details/multi_devices_graph_builder.h b/paddle/fluid/framework/details/multi_devices_graph_builder.h index e07597dbd80..544cbe585c7 100644 --- a/paddle/fluid/framework/details/multi_devices_graph_builder.h +++ b/paddle/fluid/framework/details/multi_devices_graph_builder.h @@ -106,7 +106,7 @@ class MultiDevSSAGraphBuilder : public SSAGraphBuilder { size_t src_dev_id) const; bool IsSparseGradient( - const std::unordered_map &var_types, + const std::unordered_map &all_vars, const std::string &og) const; private: -- GitLab From 2a3c58d3fecab43a753bd8c47e327ceae9f0f467 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Thu, 31 May 2018 16:56:43 +0800 Subject: [PATCH 092/913] refine programdesc copy --- paddle/fluid/framework/block_desc.cc | 2 +- paddle/fluid/framework/block_desc.h | 2 +- paddle/fluid/framework/program_desc.cc | 15 +++++++++------ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/paddle/fluid/framework/block_desc.cc b/paddle/fluid/framework/block_desc.cc index fd409ed4c0f..b15aba91069 100644 --- a/paddle/fluid/framework/block_desc.cc +++ b/paddle/fluid/framework/block_desc.cc @@ -209,7 +209,7 @@ BlockDesc::BlockDesc(const BlockDesc &other, proto::BlockDesc *desc, : prog_(prog), desc_(desc) { need_update_ = true; for (auto &op : other.ops_) { - ops_.emplace_back(new OpDesc(*op->Proto(), prog, this)); + ops_.emplace_back(new OpDesc(*op, this)); } for (auto &it : other.vars_) { auto *var = new VarDesc(*it.second); diff --git a/paddle/fluid/framework/block_desc.h b/paddle/fluid/framework/block_desc.h index 600601669c5..189dd6c52f8 100644 --- a/paddle/fluid/framework/block_desc.h +++ b/paddle/fluid/framework/block_desc.h @@ -105,7 +105,7 @@ class BlockDesc { size_t OpSize() const { return ops_.size(); } - OpDesc *Op(int idx) { return ops_.at(idx).get(); } + OpDesc *Op(int idx) const { return ops_.at(idx).get(); } void Flush(); diff --git a/paddle/fluid/framework/program_desc.cc b/paddle/fluid/framework/program_desc.cc index 64fb028f83a..aa01f9928cf 100644 --- a/paddle/fluid/framework/program_desc.cc +++ b/paddle/fluid/framework/program_desc.cc @@ -51,12 +51,15 @@ ProgramDesc::ProgramDesc(const ProgramDesc &o) { auto *block = desc_.mutable_blocks(i); blocks_.emplace_back(new BlockDesc(*o.blocks_[i], block, this)); } - for (auto &block : blocks_) { - for (auto *op : block->AllOps()) { - for (const auto &attr : op->Proto()->attrs()) { - if (attr.type() == proto::AttrType::BLOCK) { - size_t blk_idx = attr.block_idx(); - op->SetBlockAttr(attr.name(), this->MutableBlock(blk_idx)); + for (size_t block_id = 0; block_id < blocks_.size(); ++block_id) { + auto all_ops = blocks_[block_id]->AllOps(); + for (size_t op_id = 0; op_id < all_ops.size(); ++op_id) { + auto &op = all_ops[op_id]; + for (const std::string &attr_name : op->AttrNames()) { + if (op->GetAttrType(attr_name) == proto::AttrType::BLOCK) { + int sub_block_id = + o.Block(block_id).Op(op_id)->GetBlockAttr(attr_name); + op->SetBlockAttr(attr_name, MutableBlock(sub_block_id)); } } } -- GitLab From 7c00e164e5886bb430ff945f2de091a2d45ff811 Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Thu, 31 May 2018 17:07:42 +0800 Subject: [PATCH 093/913] Add More comments --- .../fluid/layers/layer_function_generator.py | 13 ++++++--- python/paddle/fluid/layers/nn.py | 27 +++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/python/paddle/fluid/layers/layer_function_generator.py b/python/paddle/fluid/layers/layer_function_generator.py index 6026237d0b6..fb5e454e94f 100644 --- a/python/paddle/fluid/layers/layer_function_generator.py +++ b/python/paddle/fluid/layers/layer_function_generator.py @@ -230,15 +230,22 @@ def templatedoc(): and AddInput. The ${name} is Python snake style. i.e., xxx_xxx. * ${{name}_type}: The type of ${name}. - Returns: - Decorated funciton. + Decorated function. """ def __impl__(func): op_proto = OpProtoHolder.instance().get_op_proto(func.__name__) tmpl = string.Template(func.__doc__) - args = {"comment": " ".join(op_proto.comment.split())} + + comment_lines = op_proto.comment.split("\n") + comment = "" + for line in comment_lines: + line = line.lstrip() + comment += line + comment += "\n" + + args = {"comment": comment} for each_input in op_proto.inputs: input_name = _convert_(each_input.name) args["{0}_comment".format(input_name)] = each_input.comment diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index acebeaebbb6..970a186fac5 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -799,7 +799,22 @@ def gru_unit(input, return updated_hidden, reset_hidden_pre, gate +@templatedoc() def linear_chain_crf(input, label, param_attr=None): + """ + Linear Chain CRF. + + ${comment} + + Args: + input(${emission_type}): ${emission_comment} + label(${label_type}): ${label_comment} + param_attr(ParamAttr): The attribute of the learnable parameter. + + Returns: + ${log_likelihood_comment} + + """ helper = LayerHelper('linear_chain_crf', **locals()) size = input.shape[1] transition = helper.create_parameter( @@ -825,7 +840,19 @@ def linear_chain_crf(input, label, param_attr=None): return log_likelihood +@templatedoc() def crf_decoding(input, param_attr, label=None): + """ + ${comment} + + Args: + input(${emission_type}): ${emission_comment} + param_attr(ParamAttr): The parameter attribute for training. + label(${label_type}): ${label_comment} + + Returns: + ${viterbi_path_comment} + """ helper = LayerHelper('crf_decoding', **locals()) transition = helper.get_parameter(param_attr.name) viterbi_path = helper.create_tmp_variable(dtype=helper.input_dtype()) -- GitLab From 018d411075d40070b1efbae0f86185a819d35586 Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Thu, 31 May 2018 17:09:26 +0800 Subject: [PATCH 094/913] Remove unnecessary func name --- python/paddle/fluid/layers/nn.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index 970a186fac5..5e139a26538 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -4023,8 +4023,6 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): @templatedoc() def random_crop(x, shape, seed=None): """ - **Random crop operator** - ${comment} Examples: -- GitLab From 97b7502772ca2758428b4c221eac4091f495525b Mon Sep 17 00:00:00 2001 From: Yan Chunwei Date: Thu, 31 May 2018 17:39:39 +0800 Subject: [PATCH 095/913] inference API little fix (#11069) --- paddle/contrib/inference/CMakeLists.txt | 8 +- .../contrib/inference/paddle_inference_api.h | 44 +++++---- .../inference/paddle_inference_api_impl.cc | 94 ++++++------------- .../inference/paddle_inference_api_impl.h | 18 +--- .../test_paddle_inference_api_impl.cc | 13 +-- paddle/fluid/inference/CMakeLists.txt | 11 ++- 6 files changed, 75 insertions(+), 113 deletions(-) diff --git a/paddle/contrib/inference/CMakeLists.txt b/paddle/contrib/inference/CMakeLists.txt index 9c55f189bcc..3beb93c4e7f 100644 --- a/paddle/contrib/inference/CMakeLists.txt +++ b/paddle/contrib/inference/CMakeLists.txt @@ -36,7 +36,7 @@ function(inference_api_test TARGET_NAME TEST_SRC) string(REGEX REPLACE "^_$" "" arg "${arg}") cc_test(${TARGET_NAME} SRCS ${TEST_SRC} - DEPS paddle_fluid_api paddle_inference_api paddle_inference_api_impl + DEPS paddle_fluid_api paddle_inference_api ARGS --dirname=${PYTHON_TESTS_DIR}/book/) # TODO(panyx0178): Figure out how to add word2vec and image_classification # as deps. @@ -47,13 +47,9 @@ endfunction(inference_api_test) cc_library(paddle_inference_api - SRCS paddle_inference_api.cc + SRCS paddle_inference_api.cc paddle_inference_api_impl.cc DEPS ${FLUID_CORE_MODULES} ${GLOB_OP_LIB}) -cc_library(paddle_inference_api_impl - SRCS paddle_inference_api_impl.cc - DEPS paddle_inference_api paddle_fluid_api) - cc_test(test_paddle_inference_api SRCS test_paddle_inference_api.cc DEPS paddle_inference_api) diff --git a/paddle/contrib/inference/paddle_inference_api.h b/paddle/contrib/inference/paddle_inference_api.h index f804d9b2869..b4c7f9bef4d 100644 --- a/paddle/contrib/inference/paddle_inference_api.h +++ b/paddle/contrib/inference/paddle_inference_api.h @@ -45,10 +45,10 @@ struct PaddleTensor { }; /* -* A simple Inference API for Paddle. Currently this API might just be used by -* non-sequence scenerios. -* TODO(Superjomn) Prepare another API for NLP-related usages. -*/ + * A simple Inference API for Paddle. Currently this API can be used by + * non-sequence scenerios. + * TODO(Superjomn) Support another API for NLP-related usages. + */ class PaddlePredictor { public: struct Config; @@ -66,34 +66,38 @@ class PaddlePredictor { // be thread-safe. virtual std::unique_ptr Clone() = 0; - virtual bool InitShared() { return false; } // Destroy the Predictor. virtual ~PaddlePredictor() {} - friend std::unique_ptr CreatePaddlePredictor( - const PaddlePredictor::Config& config); + enum class EngineKind { + kNative = -1, // Use the native Fluid facility. + // TODO(Superjomn) support latter. + // kAnakin, // Use Anakin for inference. + // kTensorRT, // Use TensorRT for inference. + // kAutoMixedAnakin, // Automatically mix Fluid with Anakin. + // kAutoMixedTensorRT, // Automatically mix Fluid with TensorRT. + }; // The common configs for all the predictors. struct Config { - enum class EngineKind; - std::string model_dir; // path to the model directory. bool enable_engine{false}; // Enable to execute (part of) the model on - // third-party engines. - EngineKind engine_kind{Config::EngineKind::kNone}; - - enum class EngineKind { - kNone = -1, // Use the native Fluid facility. - kAnakin, // Use Anakin for inference. - kTensorRT, // Use TensorRT for inference. - kAutoMixedAnakin, // Automatically mix Fluid with Anakin. - kAutoMixedTensorRT, // Automatically mix Fluid with TensorRT. - }; }; }; +struct NativeConfig : public PaddlePredictor::Config { + bool use_gpu{false}; + int device; + float fraction_of_gpu_memory; + std::string prog_file; + std::string param_file; + bool share_variables; +}; + // A factory to help create difference predictor. -template +template < + typename ConfigT, + PaddlePredictor::EngineKind engine = PaddlePredictor::EngineKind::kNative> std::unique_ptr CreatePaddlePredictor(const ConfigT& config); } // namespace paddle diff --git a/paddle/contrib/inference/paddle_inference_api_impl.cc b/paddle/contrib/inference/paddle_inference_api_impl.cc index ebe4c329180..989252f69e4 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/paddle_inference_api_impl.cc @@ -54,7 +54,7 @@ std::string num2str(T a) { } } // namespace -bool PaddlePredictorImpl::Init() { +bool NativePaddlePredictor::Init() { VLOG(3) << "Predictor::init()"; // TODO(panyx0718): Should CPU vs GPU device be decided by id? @@ -96,8 +96,8 @@ bool PaddlePredictorImpl::Init() { return true; } -bool PaddlePredictorImpl::Run(const std::vector &inputs, - std::vector *output_data) { +bool NativePaddlePredictor::Run(const std::vector &inputs, + std::vector *output_data) { VLOG(3) << "Predictor::predict"; Timer timer; timer.tic(); @@ -133,59 +133,20 @@ bool PaddlePredictorImpl::Run(const std::vector &inputs, return true; } -std::unique_ptr PaddlePredictorImpl::Clone() { +std::unique_ptr NativePaddlePredictor::Clone() { VLOG(3) << "Predictor::clone"; - std::unique_ptr cls(new PaddlePredictorImpl(config_)); - if (!cls->InitShared()) { - LOG(ERROR) << "fail to call InitShared"; + std::unique_ptr cls(new NativePaddlePredictor(config_)); + + if (!dynamic_cast(cls.get())->Init()) { + LOG(ERROR) << "fail to call Init"; return nullptr; } // fix manylinux compile error. return std::move(cls); } -// TODO(panyx0718): Consider merge with Init()? -bool PaddlePredictorImpl::InitShared() { - VLOG(3) << "Predictor::init_shared"; - // 1. Define place, executor, scope - if (this->config_.device >= 0) { - place_ = platform::CUDAPlace(); - } else { - place_ = platform::CPUPlace(); - } - this->executor_.reset(new framework::Executor(this->place_)); - this->scope_.reset(new framework::Scope()); - // Initialize the inference program - if (!this->config_.model_dir.empty()) { - // Parameters are saved in separate files sited in - // the specified `dirname`. - this->inference_program_ = inference::Load( - this->executor_.get(), this->scope_.get(), this->config_.model_dir); - } else if (!this->config_.prog_file.empty() && - !this->config_.param_file.empty()) { - // All parameters are saved in a single file. - // The file names should be consistent with that used - // in Python API `fluid.io.save_inference_model`. - this->inference_program_ = inference::Load(this->executor_.get(), - this->scope_.get(), - this->config_.prog_file, - this->config_.param_file); - } - this->ctx_ = this->executor_->Prepare(*this->inference_program_, 0); - // 3. create variables - // TODO(panyx0718): why test share_variables. - if (config_.share_variables) { - this->executor_->CreateVariables( - *this->inference_program_, this->scope_.get(), 0); - } - // 4. Get the feed_target_names and fetch_target_names - this->feed_target_names_ = this->inference_program_->GetFeedTargetNames(); - this->fetch_target_names_ = this->inference_program_->GetFetchTargetNames(); - return true; -} - -bool PaddlePredictorImpl::SetFeed(const std::vector &inputs, - std::vector *feeds) { +bool NativePaddlePredictor::SetFeed(const std::vector &inputs, + std::vector *feeds) { VLOG(3) << "Predictor::set_feed"; if (inputs.size() != feed_target_names_.size()) { LOG(ERROR) << "wrong feed input size."; @@ -213,7 +174,7 @@ bool PaddlePredictorImpl::SetFeed(const std::vector &inputs, return true; } -bool PaddlePredictorImpl::GetFetch( +bool NativePaddlePredictor::GetFetch( const std::vector &fetchs, std::vector *outputs) { VLOG(3) << "Predictor::get_fetch"; @@ -280,23 +241,26 @@ bool PaddlePredictorImpl::GetFetch( } template <> -std::unique_ptr CreatePaddlePredictor( - const ConfigImpl &config) { - VLOG(3) << "create PaddlePredictorImpl"; - // 1. GPU memeroy - std::vector flags; - if (config.fraction_of_gpu_memory >= 0.0f || - config.fraction_of_gpu_memory <= 0.95f) { - flags.push_back("dummpy"); - std::string flag = "--fraction_of_gpu_memory_to_use=" + - num2str(config.fraction_of_gpu_memory); - flags.push_back(flag); - VLOG(3) << "set flag: " << flag; - framework::InitGflags(flags); +std::unique_ptr +CreatePaddlePredictor( + const NativeConfig &config) { + VLOG(3) << "create NativePaddlePredictor"; + if (config.use_gpu) { + // 1. GPU memeroy + std::vector flags; + if (config.fraction_of_gpu_memory >= 0.0f || + config.fraction_of_gpu_memory <= 0.95f) { + flags.push_back("dummpy"); + std::string flag = "--fraction_of_gpu_memory_to_use=" + + num2str(config.fraction_of_gpu_memory); + flags.push_back(flag); + VLOG(3) << "set flag: " << flag; + framework::InitGflags(flags); + } } - std::unique_ptr predictor(new PaddlePredictorImpl(config)); - if (!dynamic_cast(predictor.get())->Init()) { + std::unique_ptr predictor(new NativePaddlePredictor(config)); + if (!dynamic_cast(predictor.get())->Init()) { return nullptr; } return std::move(predictor); diff --git a/paddle/contrib/inference/paddle_inference_api_impl.h b/paddle/contrib/inference/paddle_inference_api_impl.h index c5454616807..84707e223d7 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.h +++ b/paddle/contrib/inference/paddle_inference_api_impl.h @@ -29,17 +29,10 @@ namespace paddle { -struct ConfigImpl : public PaddlePredictor::Config { - int device; - float fraction_of_gpu_memory; - std::string prog_file; - std::string param_file; - bool share_variables; -}; - -class PaddlePredictorImpl : public PaddlePredictor { +class NativePaddlePredictor : public PaddlePredictor { public: - explicit PaddlePredictorImpl(const ConfigImpl &config) : config_(config) {} + explicit NativePaddlePredictor(const NativeConfig &config) + : config_(config) {} bool Init(); @@ -48,16 +41,15 @@ class PaddlePredictorImpl : public PaddlePredictor { std::unique_ptr Clone() override; - ~PaddlePredictorImpl() override{}; + ~NativePaddlePredictor() override{}; private: - bool InitShared() override; bool SetFeed(const std::vector &input_datas, std::vector *feeds); bool GetFetch(const std::vector &fetchs, std::vector *output_data); - ConfigImpl config_; + NativeConfig config_; platform::Place place_; std::unique_ptr executor_; std::unique_ptr scope_; diff --git a/paddle/contrib/inference/test_paddle_inference_api_impl.cc b/paddle/contrib/inference/test_paddle_inference_api_impl.cc index caba7931cb1..5240fc2f202 100644 --- a/paddle/contrib/inference/test_paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/test_paddle_inference_api_impl.cc @@ -40,19 +40,20 @@ PaddleTensor LodTensorToPaddleTensor(framework::LoDTensor* t) { return pt; } -ConfigImpl GetConfig() { - ConfigImpl config; +NativeConfig GetConfig() { + NativeConfig config; config.model_dir = FLAGS_dirname + "word2vec.inference.model"; LOG(INFO) << "dirname " << config.model_dir; config.fraction_of_gpu_memory = 0.15; + config.use_gpu = true; config.device = 0; config.share_variables = true; return config; } TEST(paddle_inference_api_impl, word2vec) { - ConfigImpl config = GetConfig(); - std::unique_ptr predictor = CreatePaddlePredictor(config); + NativeConfig config = GetConfig(); + auto predictor = CreatePaddlePredictor(config); framework::LoDTensor first_word, second_word, third_word, fourth_word; framework::LoD lod{{0, 1}}; @@ -104,7 +105,7 @@ TEST(paddle_inference_api_impl, image_classification) { int batch_size = 2; bool use_mkldnn = false; bool repeat = false; - ConfigImpl config = GetConfig(); + NativeConfig config = GetConfig(); config.model_dir = FLAGS_dirname + "image_classification_resnet.inference.model"; @@ -133,7 +134,7 @@ TEST(paddle_inference_api_impl, image_classification) { is_combined, use_mkldnn); - std::unique_ptr predictor = CreatePaddlePredictor(config); + auto predictor = CreatePaddlePredictor(config); std::vector paddle_tensor_feeds; paddle_tensor_feeds.push_back(LodTensorToPaddleTensor(&input)); diff --git a/paddle/fluid/inference/CMakeLists.txt b/paddle/fluid/inference/CMakeLists.txt index cc4a725dfb3..ec16a1c600a 100644 --- a/paddle/fluid/inference/CMakeLists.txt +++ b/paddle/fluid/inference/CMakeLists.txt @@ -5,14 +5,19 @@ cc_library(paddle_fluid_api SRCS io.cc DEPS ${FLUID_CORE_MODULES} ${GLOB_OP_LIB}) -# Create static library get_property(fluid_modules GLOBAL PROPERTY FLUID_MODULES) -cc_library(paddle_fluid DEPS ${fluid_modules}) +if(WITH_CONTRIB) + set(fluid_modules "${fluid_modules}" paddle_inference_api) +endif() + +# Create static library +cc_library(paddle_fluid DEPS ${fluid_modules} paddle_fluid_api) # Create shared library cc_library(paddle_fluid_shared SHARED SRCS io.cc - DEPS ${fluid_modules}) + DEPS ${fluid_modules} paddle_fluid_api) + set_target_properties(paddle_fluid_shared PROPERTIES OUTPUT_NAME paddle_fluid) if(NOT APPLE) # TODO(liuyiqun): Temporarily disable the link flag because it is not support on Mac. -- GitLab From 2f5bc5e02d117ddc501ba4398aac9fd36ca7b336 Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Thu, 31 May 2018 17:53:52 +0800 Subject: [PATCH 096/913] fix transpiler package --- python/setup.py.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/setup.py.in b/python/setup.py.in index c42601d335f..8257f1d5e21 100644 --- a/python/setup.py.in +++ b/python/setup.py.in @@ -69,7 +69,8 @@ packages=['paddle', 'paddle.fluid.proto', 'paddle.fluid.proto.profiler', 'paddle.fluid.layers', - 'paddle.fluid.transpiler'] + 'paddle.fluid.transpiler', + 'paddle.fluid.transpiler.details'] if '${WITH_FLUID_ONLY}'== 'OFF': packages+=['paddle.proto', -- GitLab From e90bfd562b4738ead125a126124bbd8d526cb7a6 Mon Sep 17 00:00:00 2001 From: minqiyang Date: Thu, 31 May 2018 18:07:06 +0800 Subject: [PATCH 097/913] 1. Make a base unittest class for dist transpiler unittest 2. Merge the develop repo --- .../tests/unittests/test_dist_transpiler.py | 58 +-------------- .../unittests/test_simple_dist_transpiler.py | 47 +----------- .../fluid/tests/unittests/transpiler_test.py | 73 +++++++++++++++++++ .../fluid/transpiler/distribute_transpiler.py | 15 ++-- 4 files changed, 87 insertions(+), 106 deletions(-) create mode 100644 python/paddle/fluid/tests/unittests/transpiler_test.py diff --git a/python/paddle/fluid/tests/unittests/test_dist_transpiler.py b/python/paddle/fluid/tests/unittests/test_dist_transpiler.py index fa49bd41a58..a24f2aeecda 100644 --- a/python/paddle/fluid/tests/unittests/test_dist_transpiler.py +++ b/python/paddle/fluid/tests/unittests/test_dist_transpiler.py @@ -12,40 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -import unittest - -import paddle.fluid as fluid -import paddle.fluid.core as core -import paddle.fluid.layers as layers from paddle.fluid.transpiler.distribute_transpiler import delete_ops -import numpy + +from transpiler_test import TranspilerTest -class TestDistTranspiler(unittest.TestCase): +class TestDistTranspiler(TranspilerTest): def setUp(self): - self.trainer_id = 0 - self.trainers = 2 - self.pservers = 2 - self.pserver_eps = "127.0.0.1:6174,127.0.0.1:6175" self.current_pserver_ep = "127.0.0.1:6174" - def net_conf(self): - x = fluid.layers.data(name='x', shape=[1000], dtype='float32') - - y_predict = fluid.layers.fc(input=x, - size=1000, - act=None, - param_attr=fluid.ParamAttr(name='fc_w')) - - y = fluid.layers.data(name='y', shape=[1], dtype='float32') - - cost = fluid.layers.square_error_cost(input=y_predict, label=y) - avg_cost = fluid.layers.mean(cost) - sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.1) - - optimize_ops, params_grads = sgd_optimizer.minimize(avg_cost) - return optimize_ops, params_grads - def test_transpiler(self): trainer = self.get_trainer() pserver, startup = self.get_pserver(self.current_pserver_ep) @@ -70,14 +45,6 @@ class TestDistTranspiler(unittest.TestCase): fc_w_var = startup.global_block().var("fc_w.block1") self.assertEqual(fc_w_var.shape, (500, 1000)) - def get_main_program(self): - main = fluid.Program() - - with fluid.program_guard(main): - self.net_conf() - - return main - def get_expect_trainer_ops(self): trainer = fluid.Program() @@ -92,25 +59,6 @@ class TestDistTranspiler(unittest.TestCase): ops.insert(ops.index("elementwise_add_grad") + 1, "send_vars") return ops - def get_trainer(self): - return self._transpiler_instance().get_trainer_program() - - def get_pserver(self, ep): - t = self._transpiler_instance() - pserver = t.get_pserver_program(ep) - startup = t.get_startup_program(ep, pserver) - return pserver, startup - - def _transpiler_instance(self): - main = self.get_main_program() - t = fluid.DistributeTranspiler() - t.transpile( - self.trainer_id, - program=main, - pservers=self.pserver_eps, - trainers=self.trainers) - return t - if __name__ == "__main__": unittest.main() diff --git a/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py b/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py index 60f99f412cd..25d79b51f99 100644 --- a/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py +++ b/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py @@ -12,40 +12,18 @@ # See the License for the specific language governing permissions and # limitations under the License. -import unittest +import numpy as np import paddle.fluid as fluid -import paddle.fluid.core as core -import paddle.fluid.layers as layers from paddle.fluid.transpiler.distribute_transpiler import delete_ops -import numpy as np +from transpiler_test import TranspilerTest -class TestSimpleDistTranspiler(unittest.TestCase): + +class TestSimpleDistTranspiler(TranspilerTest): def setUp(self): - self.trainer_id = 0 - self.trainers = 2 - self.pservers = 2 - self.pserver_eps = "127.0.0.1:6174,127.0.0.1:6175" self.current_pserver_ep = "127.0.0.1:6175" - def net_conf(self): - x = fluid.layers.data(name='x', shape=[1000], dtype='float32') - - y_predict = fluid.layers.fc(input=x, - size=1000, - act=None, - param_attr=fluid.ParamAttr(name='fc_w')) - - y = fluid.layers.data(name='y', shape=[1], dtype='float32') - - cost = fluid.layers.square_error_cost(input=y_predict, label=y) - avg_cost = fluid.layers.mean(cost) - sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.1) - - optimize_ops, params_grads = sgd_optimizer.minimize(avg_cost) - return optimize_ops, params_grads - def test_simple_transpiler(self): np.random.seed(1) @@ -73,14 +51,6 @@ class TestSimpleDistTranspiler(unittest.TestCase): fc_w_var = startup.global_block().var("fc_w@GRAD.trainer_0") self.assertEqual(fc_w_var.shape, (1000, 1000)) - def get_main_program(self): - main = fluid.Program() - - with fluid.program_guard(main): - self.net_conf() - - return main - def get_expect_trainer_ops(self): trainer = fluid.Program() @@ -94,15 +64,6 @@ class TestSimpleDistTranspiler(unittest.TestCase): ops.insert(ops.index("elementwise_add_grad") + 1, "send_vars") return ops - def get_trainer(self): - return self._transpiler_instance().get_trainer_program() - - def get_pserver(self, ep): - t = self._transpiler_instance() - pserver = t.get_pserver_program(ep) - startup = t.get_startup_program(ep, pserver) - return pserver, startup - def _transpiler_instance(self): main = self.get_main_program() t = fluid.DistributeTranspiler() diff --git a/python/paddle/fluid/tests/unittests/transpiler_test.py b/python/paddle/fluid/tests/unittests/transpiler_test.py new file mode 100644 index 00000000000..d84c5d9c41c --- /dev/null +++ b/python/paddle/fluid/tests/unittests/transpiler_test.py @@ -0,0 +1,73 @@ +# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest +import numpy as np + +import paddle.fluid as fluid +import paddle.fluid.core as core +import paddle.fluid.layers as layers + + +class TranspilerTest(unittest.TestCase): + @classmethod + def setUpClass(self): + self.trainer_id = 0 + self.trainers = 2 + self.pservers = 2 + self.pserver_eps = "127.0.0.1:6174,127.0.0.1:6175" + + def net_conf(self): + x = fluid.layers.data(name='x', shape=[1000], dtype='float32') + + y_predict = fluid.layers.fc(input=x, + size=1000, + act=None, + param_attr=fluid.ParamAttr(name='fc_w')) + + y = fluid.layers.data(name='y', shape=[1], dtype='float32') + + cost = fluid.layers.square_error_cost(input=y_predict, label=y) + avg_cost = fluid.layers.mean(cost) + sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.1) + + optimize_ops, params_grads = sgd_optimizer.minimize(avg_cost) + return optimize_ops, params_grads + + def get_main_program(self): + main = fluid.Program() + + with fluid.program_guard(main): + self.net_conf() + + return main + + def get_trainer(self): + return self._transpiler_instance().get_trainer_program() + + def get_pserver(self, ep): + t = self._transpiler_instance() + pserver = t.get_pserver_program(ep) + startup = t.get_startup_program(ep, pserver) + return pserver, startup + + def _transpiler_instance(self): + main = self.get_main_program() + t = fluid.DistributeTranspiler() + t.transpile( + self.trainer_id, + program=main, + pservers=self.pserver_eps, + trainers=self.trainers) + return t diff --git a/python/paddle/fluid/transpiler/distribute_transpiler.py b/python/paddle/fluid/transpiler/distribute_transpiler.py index 04d47fb82e9..a116671c1b1 100644 --- a/python/paddle/fluid/transpiler/distribute_transpiler.py +++ b/python/paddle/fluid/transpiler/distribute_transpiler.py @@ -178,7 +178,7 @@ class DistributeTranspiler: for index in range(len(self.pserver_endpoints)) ] - def _init_splited_vars(self, split_method): + def _init_splited_vars(self, split_method, align_var_to_block=True): # update these mappings for further transpile: # 1. param_var_mapping: param var name -> [splited params vars] # 2. grad_var_mapping: grad var name -> [splited grads vars] @@ -198,15 +198,14 @@ class DistributeTranspiler: self.params_grads) if align_var_to_block: - grad_blocks = split_dense_variable(grad_list, - len(pserver_endpoints)) - param_blocks = split_dense_variable(param_list, - len(pserver_endpoints)) + grad_blocks = split_variable(grad_list, len(self.pserver_endpoints)) + param_blocks = split_variable(param_list, + len(self.pserver_endpoints)) else: # when we do NOT align var to block, we will always split params # grads into one block. - grad_blocks = split_dense_variable(grad_list, 1) - param_blocks = split_dense_variable(param_list, 1) + grad_blocks = split_variable(grad_list, 1) + param_blocks = split_variable(param_list, 1) assert (len(grad_blocks) == len(param_blocks)) # origin_varname -> [splited_var] self.param_var_mapping = self._create_vars_from_blocklist( @@ -272,7 +271,7 @@ class DistributeTranspiler: self.has_distributed_lookup_table = self._has_distributed_lookup_table() # split and create vars, then put splited vars in dicts for later use. - self._init_splited_vars(split_method) + self._init_splited_vars(split_method, align_var_to_block) # step 3.1: insert send op to send gradient vars to parameter servers ps_dispatcher.reset() -- GitLab From 733718c3e724fdd84355010e76ddd17e5b60ef2c Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Thu, 31 May 2018 19:12:23 +0800 Subject: [PATCH 098/913] remove the ugly test --- .../inference/tests/book/test_inference_nlp.cc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 990d45964e3..5241661fb31 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -53,7 +53,7 @@ size_t read_datasets(std::vector* out, while (getline(iss, field, ' ')) { ids.push_back(stoi(field)); } - if (ids.size() >= 1024 || out->size() >= 100) { + if (ids.size() >= 1024 ) { continue; } @@ -200,14 +200,14 @@ TEST(inference, nlp) { LOG(INFO) << "Total infer time: " << (stop_ms - start_ms) / 1000.0 / 60 << " min, avg time per seq: " << (stop_ms - start_ms) / datasets.size() << " ms"; - { // just for test - auto* scope = new paddle::framework::Scope(); - paddle::framework::LoDTensor outtensor; - TestInference( - dirname, {&(datasets[0])}, {&outtensor}, FLAGS_repeat, model_combined, - false); - delete scope; - } +// { // just for test +// auto* scope = new paddle::framework::Scope(); +// paddle::framework::LoDTensor outtensor; +// TestInference( +// dirname, {&(datasets[0])}, {&outtensor}, FLAGS_repeat, model_combined, +// false); +// delete scope; +// } } delete scope; } -- GitLab From 2007f630b47d52738b3896ec7d6af90c50b129d2 Mon Sep 17 00:00:00 2001 From: Luo Tao Date: Thu, 31 May 2018 19:23:24 +0800 Subject: [PATCH 099/913] add build and install document of fluid inference library --- doc/fluid/howto/index_cn.rst | 2 +- doc/fluid/howto/index_en.rst | 1 - .../inference/build_and_install_lib_cn.rst | 96 +++++++++++++++++++ doc/fluid/howto/inference/index_cn.rst | 8 ++ ...id.md => inference_support_in_fluid_cn.md} | 59 +----------- 5 files changed, 106 insertions(+), 60 deletions(-) create mode 100644 doc/fluid/howto/inference/build_and_install_lib_cn.rst create mode 100644 doc/fluid/howto/inference/index_cn.rst rename doc/fluid/howto/inference/{inference_support_in_fluid.md => inference_support_in_fluid_cn.md} (90%) diff --git a/doc/fluid/howto/index_cn.rst b/doc/fluid/howto/index_cn.rst index b7c62017972..b57af64f44d 100644 --- a/doc/fluid/howto/index_cn.rst +++ b/doc/fluid/howto/index_cn.rst @@ -4,5 +4,5 @@ .. toctree:: :maxdepth: 1 + inference/index_cn.rst optimization/index_cn.rst - inference/inference_support_in_fluid.md diff --git a/doc/fluid/howto/index_en.rst b/doc/fluid/howto/index_en.rst index f3ca41cdbf1..fd21e167ce3 100644 --- a/doc/fluid/howto/index_en.rst +++ b/doc/fluid/howto/index_en.rst @@ -5,4 +5,3 @@ HOW TO :maxdepth: 1 optimization/index_en.rst - inference/inference_support_in_fluid.md diff --git a/doc/fluid/howto/inference/build_and_install_lib_cn.rst b/doc/fluid/howto/inference/build_and_install_lib_cn.rst new file mode 100644 index 00000000000..c8d9992fcc9 --- /dev/null +++ b/doc/fluid/howto/inference/build_and_install_lib_cn.rst @@ -0,0 +1,96 @@ +安装与编译C++预测库 +=========================== + +直接下载安装 +------------- + +====================== ======================================== +版本说明 C++预测库 +====================== ======================================== +cpu_avx_mkl `fluid.tgz `_ +cpu_avx_openblas `fluid.tgz `_ +cpu_noavx_openblas `fluid.tgz `_ +cuda7.5_cudnn5_avx_mkl `fluid.tgz `_ +cuda8.0_cudnn5_avx_mkl `fluid.tgz `_ +cuda8.0_cudnn7_avx_mkl `fluid.tgz `_ +====================== ======================================== + +从源码编译 +---------- +用户也可以从 PaddlePaddle 核心代码编译C++预测库,只需在编译时配制下面这些编译选项: + +================= ========= +选项 值 +================= ========= +CMAKE_BUILD_TYPE Release +FLUID_INSTALL_DIR 安装路径 +WITH_FLUID_ONLY ON(推荐) +WITH_SWIG_PY OFF(推荐 +WITH_PYTHON OFF(推荐) +WITH_GPU ON/OFF +WITH_MKL ON/OFF +================= ========= + +建议按照推荐值设置,以避免链接不必要的库。其它可选编译选项按需进行设定。 + +下面的代码片段从github拉取最新代码,配制编译选项(需要将PADDLE_ROOT替换为PaddlePaddle预测库的安装路径): + + .. code-block:: bash + + pip install paddlepaddle-gpu + PADDLE_ROOT=/path/of/capi + git clone https://github.com/PaddlePaddle/Paddle.git + cd Paddle + mkdir build + cd build + cmake -DFLUID_INSTALL_DIR=$PADDLE_ROOT \ + -DCMAKE_BUILD_TYPE=Release \ + -DWITH_FLUID_ONLY=ON \ + -DWITH_SWIG_PY=OFF \ + -DWITH_PYTHON=OFF \ + -DWITH_MKL=OFF \ + -DWITH_GPU=OFF \ + .. + make + make inference_lib_dist + +成功编译后,使用C++预测库所需的依赖(包括:(1)编译出的PaddlePaddle预测库和头文件;(2)第三方链接库和头文件;(3)版本信息与编译选项信息) +均会存放于PADDLE_ROOT目录中。目录结构如下: + + .. code-block:: text + + PaddleRoot/ + ├── CMakeCache.txt + ├── paddle + │   └── fluid + │   ├── framework + │   ├── inference + │   ├── memory + │   ├── platform + │   ├── pybind + │   └── string + ├── third_party + │   ├── boost + │   │   └── boost + │   ├── eigen3 + │   │   ├── Eigen + │   │   └── unsupported + │   └── install + │   ├── gflags + │   ├── glog + │   ├── mklml + │   ├── protobuf + │   ├── snappy + │   ├── snappystream + │   └── zlib + └── version.txt + +version.txt 中记录了该预测库的版本信息,包括Git Commit ID、使用OpenBlas或MKL数学库、CUDA/CUDNN版本号,如: + + .. code-block:: text + + GIT COMMIT ID: c95cd4742f02bb009e651a00b07b21c979637dc8 + WITH_MKL: ON + WITH_GPU: ON + CUDA version: 8.0 + CUDNN version: v5 diff --git a/doc/fluid/howto/inference/index_cn.rst b/doc/fluid/howto/inference/index_cn.rst new file mode 100644 index 00000000000..a903423548d --- /dev/null +++ b/doc/fluid/howto/inference/index_cn.rst @@ -0,0 +1,8 @@ +预测库 +------------ + +.. toctree:: + :maxdepth: 1 + + build_and_install_lib_cn.rst + inference_support_in_fluid_cn.md diff --git a/doc/fluid/howto/inference/inference_support_in_fluid.md b/doc/fluid/howto/inference/inference_support_in_fluid_cn.md similarity index 90% rename from doc/fluid/howto/inference/inference_support_in_fluid.md rename to doc/fluid/howto/inference/inference_support_in_fluid_cn.md index d272cd3e3bd..309b17fccd5 100644 --- a/doc/fluid/howto/inference/inference_support_in_fluid.md +++ b/doc/fluid/howto/inference/inference_support_in_fluid_cn.md @@ -1,9 +1,8 @@ -# Fluid Inference使用指南 +# 使用指南 ## 目录: - Python Inference API -- 编译Fluid Inference库 - Inference C++ API - Inference实例 - Inference计算优化 @@ -55,62 +54,6 @@ return [program, feed_target_names, fetch_targets] ``` - -## 编译Fluid Inference库 - - - **不需要额外的CMake选项** - - 1、 配置CMake命令,更多配置请参考[源码编译PaddlePaddle](http://www.paddlepaddle.org/docs/develop/documentation/zh/build_and_install/build_from_source_cn.html) - ```bash - $ git clone https://github.com/PaddlePaddle/Paddle.git - $ cd Paddle - $ mkdir build - $ cd build - $ cmake -DCMAKE_INSTALL_PREFIX=your/path/to/paddle_inference_lib \ - -DCMAKE_BUILD_TYPE=Release \ - -DWITH_PYTHON=ON \ - -DWITH_MKL=OFF \ - -DWITH_GPU=OFF \ - .. - ``` - - - 2、 编译PaddlePaddle - ```bash - $ make - ``` - - - 3、 部署。执行如下命令将PaddlePaddle Fluid Inference库部署到`your/path/to/paddle_inference_lib`目录。 - ```bash - $ make inference_lib_dist - ``` - -- 目录结构 - - ```bash - $ cd your/path/to/paddle_inference_lib - $ tree - . - |-- paddle - | `-- fluid - | |-- framework - | |-- inference - | | |-- io.h - | | `-- libpaddle_fluid.so - | |-- memory - | |-- platform - | `-- string - |-- third_party - | |-- eigen3 - | `-- install - | |-- gflags - | |-- glog - | `-- protobuf - `-- ... - ``` - - 假设`PADDLE_ROOT=your/path/to/paddle_inference_lib`。 - - - ## 链接Fluid Inference库 - 示例项目([链接](https://github.com/luotao1/fluid_inference_example.git)) -- GitLab From 9d92dcea0a41093ad782561a0ade4095afbefcfa Mon Sep 17 00:00:00 2001 From: minqiyang Date: Thu, 31 May 2018 20:34:23 +0800 Subject: [PATCH 100/913] 1. import fluid to dist transpiler test --- python/paddle/fluid/tests/unittests/test_dist_transpiler.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/paddle/fluid/tests/unittests/test_dist_transpiler.py b/python/paddle/fluid/tests/unittests/test_dist_transpiler.py index a24f2aeecda..32647f9aa81 100644 --- a/python/paddle/fluid/tests/unittests/test_dist_transpiler.py +++ b/python/paddle/fluid/tests/unittests/test_dist_transpiler.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import paddle.fluid as fluid from paddle.fluid.transpiler.distribute_transpiler import delete_ops from transpiler_test import TranspilerTest -- GitLab From a3aca2a3cfeb6ab246ff95987374809be1a3c863 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Thu, 31 May 2018 20:58:26 +0800 Subject: [PATCH 101/913] fix bugs --- paddle/fluid/framework/block_desc.cc | 2 +- paddle/fluid/framework/op_desc.cc | 2 +- paddle/fluid/framework/op_desc.h | 3 ++- paddle/fluid/framework/program_desc.cc | 10 ++++++++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/paddle/fluid/framework/block_desc.cc b/paddle/fluid/framework/block_desc.cc index b15aba91069..e7842e9b813 100644 --- a/paddle/fluid/framework/block_desc.cc +++ b/paddle/fluid/framework/block_desc.cc @@ -200,7 +200,7 @@ BlockDesc::BlockDesc(ProgramDesc *prog, proto::BlockDesc *desc) vars_[var_desc.name()].reset(new VarDesc(var_desc)); } for (const proto::OpDesc &op_desc : desc_->ops()) { - ops_.emplace_back(new OpDesc(op_desc, prog, this)); + ops_.emplace_back(new OpDesc(op_desc, this)); } } diff --git a/paddle/fluid/framework/op_desc.cc b/paddle/fluid/framework/op_desc.cc index 09b67e5a174..f92769192c2 100644 --- a/paddle/fluid/framework/op_desc.cc +++ b/paddle/fluid/framework/op_desc.cc @@ -103,7 +103,7 @@ void OpDesc::CopyFrom(const OpDesc &op_desc) { need_update_ = true; } -OpDesc::OpDesc(const proto::OpDesc &desc, ProgramDesc *prog, BlockDesc *block) +OpDesc::OpDesc(const proto::OpDesc &desc, BlockDesc *block) : desc_(desc), need_update_(false) { // restore inputs_ int input_size = desc_.inputs_size(); diff --git a/paddle/fluid/framework/op_desc.h b/paddle/fluid/framework/op_desc.h index 1a330db7cc5..a02d3e26912 100644 --- a/paddle/fluid/framework/op_desc.h +++ b/paddle/fluid/framework/op_desc.h @@ -33,13 +33,14 @@ class OpDesc { OpDesc(const std::string &type, const VariableNameMap &inputs, const VariableNameMap &outputs, const AttributeMap &attrs); - OpDesc(const proto::OpDesc &desc, ProgramDesc *prog, BlockDesc *block); + OpDesc(const proto::OpDesc &desc, BlockDesc *block); explicit OpDesc(BlockDesc *block) : block_(block) {} OpDesc(const OpDesc &other, BlockDesc *block) { *this = other; block_ = block; + need_update_ = true; } void CopyFrom(const OpDesc &op_desc); diff --git a/paddle/fluid/framework/program_desc.cc b/paddle/fluid/framework/program_desc.cc index aa01f9928cf..1e01a6e9004 100644 --- a/paddle/fluid/framework/program_desc.cc +++ b/paddle/fluid/framework/program_desc.cc @@ -89,6 +89,16 @@ ProgramDesc::ProgramDesc(const std::string &binary_str) { for (auto &block_desc : *desc_.mutable_blocks()) { blocks_.emplace_back(new BlockDesc(this, &block_desc)); } + for (auto &block : blocks_) { + for (auto *op : block->AllOps()) { + for (const auto &attr : op->Proto()->attrs()) { + if (attr.type() == proto::AttrType::BLOCK) { + size_t blk_idx = attr.block_idx(); + op->SetBlockAttr(attr.name(), this->MutableBlock(blk_idx)); + } + } + } + } } const std::vector ProgramDesc::GetFeedTargetNames() { -- GitLab From 5870a6b486537d5f119282a36e23e6ab4be98804 Mon Sep 17 00:00:00 2001 From: Yan Chunwei Date: Thu, 31 May 2018 21:46:52 +0800 Subject: [PATCH 102/913] clean docstring_checker.pyc (#11093) --- tools/codestyle/docstring_checker.pyc | Bin 11769 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tools/codestyle/docstring_checker.pyc diff --git a/tools/codestyle/docstring_checker.pyc b/tools/codestyle/docstring_checker.pyc deleted file mode 100644 index 1ce612ca2318ccb9b9f28d51cb93ce8e5e1d0680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11769 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 z Date: Thu, 31 May 2018 20:48:45 -0500 Subject: [PATCH 103/913] Move sync_mode device ctx from grpc server (#10881) --- benchmark/fluid/kube_gen_job.py | 2 +- .../inference/analysis/data_flow_graph.h | 3 + .../data_flow_graph_to_fluid_pass_tester.cc | 6 +- .../analysis/fluid_to_data_flow_graph_pass.cc | 4 +- .../analysis/fluid_to_data_flow_graph_pass.h | 2 + .../fluid_to_data_flow_graph_pass_tester.cc | 6 +- paddle/fluid/inference/analysis/helper.h | 6 +- paddle/fluid/inference/analysis/pass.h | 1 + .../inference/analysis/subgraph_splitter.h | 2 + paddle/fluid/inference/analysis/ut_helper.h | 1 + .../inference/tensorrt/convert/ut_helper.h | 5 +- paddle/fluid/operators/detail/CMakeLists.txt | 3 +- paddle/fluid/operators/detail/grpc_client.cc | 2 + paddle/fluid/operators/detail/grpc_server.cc | 372 +++++++----------- paddle/fluid/operators/detail/grpc_server.h | 98 ++--- .../operators/detail/grpc_server_test.cc | 87 ++-- .../fluid/operators/detail/request_handler.h | 127 ++++++ .../operators/detail/request_handler_impl.cc | 115 ++++++ .../operators/detail/request_handler_impl.h | 64 +++ paddle/fluid/operators/detail/rpc_server.cc | 113 ++++++ paddle/fluid/operators/detail/rpc_server.h | 91 +++++ .../operators/detail/variable_response.h | 4 +- paddle/fluid/operators/gen_nccl_id_op.cc | 21 +- paddle/fluid/operators/listen_and_serv_op.cc | 211 +++------- paddle/fluid/operators/listen_and_serv_op.h | 31 +- paddle/fluid/operators/send_barrier_op.cc | 2 + paddle/fluid/operators/test_send_nccl_id.cc | 59 +-- paddle/fluid/platform/nccl_helper.h | 1 + 28 files changed, 886 insertions(+), 553 deletions(-) create mode 100644 paddle/fluid/operators/detail/request_handler.h create mode 100644 paddle/fluid/operators/detail/request_handler_impl.cc create mode 100644 paddle/fluid/operators/detail/request_handler_impl.h create mode 100644 paddle/fluid/operators/detail/rpc_server.cc create mode 100644 paddle/fluid/operators/detail/rpc_server.h diff --git a/benchmark/fluid/kube_gen_job.py b/benchmark/fluid/kube_gen_job.py index 39ba207fd96..9da8a69af1d 100644 --- a/benchmark/fluid/kube_gen_job.py +++ b/benchmark/fluid/kube_gen_job.py @@ -49,7 +49,7 @@ def parse_args(): parser.add_argument( '--fluid', default=1, type=int, help='whether is fluid job') parser.add_argument( - '--rdma', action='store_ture', help='whether mount rdma libs') + '--rdma', action='store_true', help='whether mount rdma libs') parser.add_argument( '--disttype', default="pserver", diff --git a/paddle/fluid/inference/analysis/data_flow_graph.h b/paddle/fluid/inference/analysis/data_flow_graph.h index 9f6ce40ede2..913e344d371 100644 --- a/paddle/fluid/inference/analysis/data_flow_graph.h +++ b/paddle/fluid/inference/analysis/data_flow_graph.h @@ -21,7 +21,10 @@ limitations under the License. */ #include #include +#include #include +#include +#include #include "paddle/fluid/inference/analysis/graph_traits.h" #include "paddle/fluid/inference/analysis/node.h" diff --git a/paddle/fluid/inference/analysis/data_flow_graph_to_fluid_pass_tester.cc b/paddle/fluid/inference/analysis/data_flow_graph_to_fluid_pass_tester.cc index 60f159da914..dcee75cee50 100644 --- a/paddle/fluid/inference/analysis/data_flow_graph_to_fluid_pass_tester.cc +++ b/paddle/fluid/inference/analysis/data_flow_graph_to_fluid_pass_tester.cc @@ -44,6 +44,6 @@ TEST_F(DFG_Tester, Test) { LOG(INFO) << graph.nodes.size(); } -} // analysis -} // inference -} // paddle +}; // namespace analysis +}; // namespace inference +}; // namespace paddle diff --git a/paddle/fluid/inference/analysis/fluid_to_data_flow_graph_pass.cc b/paddle/fluid/inference/analysis/fluid_to_data_flow_graph_pass.cc index f848a7d1add..9f67c989cca 100644 --- a/paddle/fluid/inference/analysis/fluid_to_data_flow_graph_pass.cc +++ b/paddle/fluid/inference/analysis/fluid_to_data_flow_graph_pass.cc @@ -12,9 +12,11 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ -#include "paddle/fluid/inference/analysis/fluid_to_data_flow_graph_pass.h" +#include #include +#include "paddle/fluid/inference/analysis/fluid_to_data_flow_graph_pass.h" + namespace paddle { namespace inference { namespace analysis { diff --git a/paddle/fluid/inference/analysis/fluid_to_data_flow_graph_pass.h b/paddle/fluid/inference/analysis/fluid_to_data_flow_graph_pass.h index cd0d4fabaaf..33517e57bec 100644 --- a/paddle/fluid/inference/analysis/fluid_to_data_flow_graph_pass.h +++ b/paddle/fluid/inference/analysis/fluid_to_data_flow_graph_pass.h @@ -19,6 +19,8 @@ #pragma once +#include + #include "paddle/fluid/framework/program_desc.h" #include "paddle/fluid/inference/analysis/data_flow_graph.h" #include "paddle/fluid/inference/analysis/pass.h" diff --git a/paddle/fluid/inference/analysis/fluid_to_data_flow_graph_pass_tester.cc b/paddle/fluid/inference/analysis/fluid_to_data_flow_graph_pass_tester.cc index 851c98bef30..817d32c92cd 100644 --- a/paddle/fluid/inference/analysis/fluid_to_data_flow_graph_pass_tester.cc +++ b/paddle/fluid/inference/analysis/fluid_to_data_flow_graph_pass_tester.cc @@ -32,6 +32,6 @@ TEST_F(DFG_Tester, Init) { LOG(INFO) << '\n' << graph.DotString(); } -} // analysis -} // inference -} // paddle +} // namespace analysis +} // namespace inference +} // namespace paddle diff --git a/paddle/fluid/inference/analysis/helper.h b/paddle/fluid/inference/analysis/helper.h index 24ea9a4bae7..153dca576bd 100644 --- a/paddle/fluid/inference/analysis/helper.h +++ b/paddle/fluid/inference/analysis/helper.h @@ -50,7 +50,7 @@ struct DataTypeNamer { return dic_.at(x); } - const std::string &repr(size_t &hash) const { + const std::string &repr(size_t &hash) const { // NOLINT PADDLE_ENFORCE(dic_.count(hash), "unknown type for representation"); return dic_.at(hash); } @@ -62,7 +62,9 @@ struct DataTypeNamer { SET_TYPE(float); } - std::unordered_map dic_; + std::unordered_map + dic_; }; #undef SET_TYPE diff --git a/paddle/fluid/inference/analysis/pass.h b/paddle/fluid/inference/analysis/pass.h index 5c89b1304d8..aa0e8667b5e 100644 --- a/paddle/fluid/inference/analysis/pass.h +++ b/paddle/fluid/inference/analysis/pass.h @@ -16,6 +16,7 @@ limitations under the License. */ #include #include +#include #include "paddle/fluid/framework/framework.pb.h" #include "paddle/fluid/inference/analysis/data_flow_graph.h" diff --git a/paddle/fluid/inference/analysis/subgraph_splitter.h b/paddle/fluid/inference/analysis/subgraph_splitter.h index ed90a0dcf31..a31afbe6933 100644 --- a/paddle/fluid/inference/analysis/subgraph_splitter.h +++ b/paddle/fluid/inference/analysis/subgraph_splitter.h @@ -18,6 +18,8 @@ limitations under the License. */ #pragma once +#include + #include "paddle/fluid/inference/analysis/data_flow_graph.h" #include "paddle/fluid/inference/analysis/node.h" diff --git a/paddle/fluid/inference/analysis/ut_helper.h b/paddle/fluid/inference/analysis/ut_helper.h index c86083d1215..722fa99a48a 100644 --- a/paddle/fluid/inference/analysis/ut_helper.h +++ b/paddle/fluid/inference/analysis/ut_helper.h @@ -15,6 +15,7 @@ limitations under the License. */ #pragma once #include #include +#include #include "paddle/fluid/framework/executor.h" #include "paddle/fluid/inference/analysis/data_flow_graph.h" #include "paddle/fluid/inference/analysis/fluid_to_data_flow_graph_pass.h" diff --git a/paddle/fluid/inference/tensorrt/convert/ut_helper.h b/paddle/fluid/inference/tensorrt/convert/ut_helper.h index 37fcb5c5030..e46c577cdae 100644 --- a/paddle/fluid/inference/tensorrt/convert/ut_helper.h +++ b/paddle/fluid/inference/tensorrt/convert/ut_helper.h @@ -19,6 +19,9 @@ limitations under the License. */ #pragma once +#include +#include + #include "paddle/fluid/framework/lod_tensor.h" #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/inference/analysis/helper.h" @@ -58,7 +61,7 @@ class TRTConvertValidation { public: TRTConvertValidation() = delete; - TRTConvertValidation(int batch_size, int workspace_size = 1 << 10) { + explicit TRTConvertValidation(int batch_size, int workspace_size = 1024) { // create engine. engine_.reset(new TensorRTEngine(10, 1 << 10, &stream_)); engine_->InitNetwork(); diff --git a/paddle/fluid/operators/detail/CMakeLists.txt b/paddle/fluid/operators/detail/CMakeLists.txt index b9a66474c9a..cf20530513c 100644 --- a/paddle/fluid/operators/detail/CMakeLists.txt +++ b/paddle/fluid/operators/detail/CMakeLists.txt @@ -1,6 +1,7 @@ if(WITH_DISTRIBUTE) grpc_library(sendrecvop_grpc SRCS bytebuffer_stream.cc sendrecvop_utils.cc grpc_client.cc - grpc_server.cc variable_response.cc PROTO send_recv.proto DEPS lod_tensor selected_rows) + request_handler_impl.cc rpc_server.cc grpc_server.cc variable_response.cc PROTO send_recv.proto DEPS lod_tensor + selected_rows memory) set(DISTRIBUTE_COMPILE_FLAGS "-Wno-non-virtual-dtor -Wno-error=non-virtual-dtor -Wno-error=delete-non-virtual-dtor") set_source_files_properties(serde_test.cc grpc_server_test.cc PROPERTIES COMPILE_FLAGS ${DISTRIBUTE_COMPILE_FLAGS}) cc_test(serde_test SRCS serde_test.cc variable_response.cc DEPS grpc++_unsecure grpc_unsecure gpr diff --git a/paddle/fluid/operators/detail/grpc_client.cc b/paddle/fluid/operators/detail/grpc_client.cc index f7ce7786874..da9ca1a0c1d 100644 --- a/paddle/fluid/operators/detail/grpc_client.cc +++ b/paddle/fluid/operators/detail/grpc_client.cc @@ -205,6 +205,8 @@ void RPCClient::AsyncSendFetchBarrier(const std::string& ep, int64_t time_out) { } bool RPCClient::Wait() { + VLOG(3) << "RPCClient begin Wait()" + << " req_count_:" << req_count_; if (req_count_ <= 0) { return true; } diff --git a/paddle/fluid/operators/detail/grpc_server.cc b/paddle/fluid/operators/detail/grpc_server.cc index 361cc24b5ba..e73756d8900 100644 --- a/paddle/fluid/operators/detail/grpc_server.cc +++ b/paddle/fluid/operators/detail/grpc_server.cc @@ -1,4 +1,4 @@ -/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved. +/*Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -12,19 +12,12 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ -#include "paddle/fluid/operators/detail/grpc_server.h" - #include #include -using ::grpc::ServerAsyncResponseWriter; +#include "paddle/fluid/operators/detail/grpc_server.h" -DEFINE_int32(rpc_server_handle_send_threads, 20, - "Number of threads used to handle send at rpc server."); -DEFINE_int32(rpc_server_handle_get_threads, 20, - "Number of threads used to handle get at rpc server."); -DEFINE_int32(rpc_server_handle_prefetch_threads, 1, - "Number of threads used to handle prefetch at rpc server."); +using ::grpc::ServerAsyncResponseWriter; namespace paddle { namespace operators { @@ -36,49 +29,40 @@ enum CallStatus { PROCESS = 0, FINISH }; class RequestBase { public: explicit RequestBase(GrpcService::AsyncService* service, - ::grpc::ServerCompletionQueue* cq, bool sync_mode, - const platform::DeviceContext* dev_ctx) + ::grpc::ServerCompletionQueue* cq, + RequestHandler* request_handler, int req_id) : service_(service), cq_(cq), - sync_mode_(sync_mode), status_(PROCESS), - dev_ctx_(dev_ctx) { + request_handler_(request_handler), + req_id_(req_id) { PADDLE_ENFORCE(cq_); } virtual ~RequestBase() {} - virtual void Process() { assert(false); } + virtual void Process() = 0; CallStatus Status() { return status_; } void SetStatus(CallStatus status) { status_ = status; } - virtual std::string GetReqName() { - assert(false); - return ""; - } + virtual std::string GetReqName() = 0; protected: ::grpc::ServerContext ctx_; GrpcService::AsyncService* service_; ::grpc::ServerCompletionQueue* cq_; - const bool sync_mode_; CallStatus status_; - const platform::DeviceContext* dev_ctx_; + RequestHandler* request_handler_; + int req_id_; }; class RequestSend final : public RequestBase { public: explicit RequestSend(GrpcService::AsyncService* service, - ::grpc::ServerCompletionQueue* cq, bool sync_mode, - framework::Scope* scope, ReceivedQueue* queue, - const platform::DeviceContext* dev_ctx, int req_id) - : RequestBase(service, cq, sync_mode, dev_ctx), - queue_(queue), - responder_(&ctx_), - req_id_(req_id) { - if (sync_mode_) { - request_.reset(new VariableResponse(scope, dev_ctx_, false)); - } else { - request_.reset(new VariableResponse(scope, dev_ctx_, true)); - } + ::grpc::ServerCompletionQueue* cq, + RequestHandler* request_handler, int req_id) + : RequestBase(service, cq, request_handler, req_id), responder_(&ctx_) { + request_.reset(new VariableResponse(request_handler->scope(), + request_handler->dev_ctx(), + !request_handler->sync_mode())); int method_id = static_cast(detail::GrpcMethod::kSendVariable); service_->RequestAsyncUnary( method_id, &ctx_, request_.get(), &responder_, cq_, cq_, @@ -87,12 +71,17 @@ class RequestSend final : public RequestBase { virtual ~RequestSend() {} - virtual std::string GetReqName() { return request_->Varname(); } + std::string GetReqName() override { return request_->Varname(); } + + void Process() override { + std::string varname = GetReqName(); + VLOG(3) << "RequestSend var_name:" << varname; - virtual void Process() { - std::string var_name = GetReqName(); - VLOG(3) << "RequestSend " << var_name; - queue_->Push(std::make_pair(var_name, request_)); + auto scope = request_->GetMutableLocalScope(); + auto invar = request_->GetVar(); + framework::Variable* outvar = nullptr; + + request_handler_->Handle(varname, scope, invar, &outvar); status_ = FINISH; responder_.Finish(reply_, ::grpc::Status::OK, @@ -102,105 +91,85 @@ class RequestSend final : public RequestBase { protected: sendrecv::VoidMessage reply_; std::shared_ptr request_; - ReceivedQueue* queue_; ServerAsyncResponseWriter responder_; - int req_id_; }; class RequestGet final : public RequestBase { public: explicit RequestGet(GrpcService::AsyncService* service, - ::grpc::ServerCompletionQueue* cq, bool sync_mode, - framework::Scope* scope, - const platform::DeviceContext* dev_ctx, - framework::BlockingQueue* queue, - int req_id) - : RequestBase(service, cq, sync_mode, dev_ctx), - responder_(&ctx_), - scope_(scope), - queue_(queue), - req_id_(req_id) { + ::grpc::ServerCompletionQueue* cq, + RequestHandler* request_handler, int req_id) + : RequestBase(service, cq, request_handler, req_id), responder_(&ctx_) { auto method_id = static_cast(detail::GrpcMethod::kGetVariable); service_->RequestAsyncUnary( method_id, &ctx_, &request_, &responder_, cq_, cq_, - reinterpret_cast(static_cast(req_id_))); + reinterpret_cast(static_cast(req_id))); } virtual ~RequestGet() {} - virtual std::string GetReqName() { return request_.varname(); } + std::string GetReqName() override { return request_.varname(); } - virtual void Process() { + void Process() override { // proc request. - std::string var_name = request_.varname(); - VLOG(3) << "RequestGet " << var_name; - auto* var = scope_->FindVar(var_name); + std::string varname = request_.varname(); + VLOG(3) << "RequestGet " << varname; + + auto scope = request_handler_->scope(); + auto invar = scope->FindVar(varname); + framework::Variable* outvar = nullptr; - if (var_name != FETCH_BARRIER_MESSAGE) { - SerializeToByteBuffer(var_name, var, *dev_ctx_, &reply_); + request_handler_->Handle(varname, scope, invar, &outvar); + + if (outvar) { + SerializeToByteBuffer(varname, outvar, *request_handler_->dev_ctx(), + &reply_); } status_ = FINISH; responder_.Finish(reply_, ::grpc::Status::OK, reinterpret_cast(static_cast(req_id_))); - - if (var_name == FETCH_BARRIER_MESSAGE) { - sendrecv::VariableMessage msg; - MessageWithName msg_with_name = std::make_pair(var_name, msg); - queue_->Push(msg_with_name); - } } protected: sendrecv::VariableMessage request_; ::grpc::ByteBuffer reply_; ServerAsyncResponseWriter<::grpc::ByteBuffer> responder_; - framework::Scope* scope_; - framework::BlockingQueue* queue_; - int req_id_; }; class RequestPrefetch final : public RequestBase { public: explicit RequestPrefetch(GrpcService::AsyncService* service, - ::grpc::ServerCompletionQueue* cq, bool sync_mode, - framework::Scope* scope, - const platform::DeviceContext* dev_ctx, - framework::Executor* executor, - framework::ProgramDesc* program, - framework::ExecutorPrepareContext* prefetch_ctx, - int req_id) - : RequestBase(service, cq, sync_mode, dev_ctx), + ::grpc::ServerCompletionQueue* cq, + RequestHandler* request_handler, int req_id) + : RequestBase(service, cq, request_handler, req_id), responder_(&ctx_), - scope_(scope), - executor_(executor), - program_(program), - prefetch_ctx_(prefetch_ctx), - req_id_(req_id) { - // prefetch always create a new sub scope - request_.reset(new VariableResponse(scope, dev_ctx_, true)); + local_scope_(nullptr) { + request_.reset(new VariableResponse(request_handler->scope(), + request_handler->dev_ctx(), true)); int method_id = static_cast(detail::GrpcMethod::kPrefetchVariable); service_->RequestAsyncUnary( method_id, &ctx_, request_.get(), &responder_, cq_, cq_, - reinterpret_cast(static_cast(req_id_))); + reinterpret_cast(static_cast(req_id))); } virtual ~RequestPrefetch() {} - virtual std::string GetReqName() { return request_->Varname(); } + std::string GetReqName() override { return request_->Varname(); } - virtual void Process() { + void Process() override { // prefetch process... + std::string varname = request_->OutVarname(); + VLOG(3) << "RequestPrefetch " << varname; + + auto scope = request_->GetMutableLocalScope(); + auto invar = scope->FindVar(varname); + framework::Variable* outvar = nullptr; - std::string var_name = request_->OutVarname(); - VLOG(3) << "RequestPrefetch " << var_name; - auto var_desc = program_->Block(0).FindVar(var_name); - framework::Scope* local_scope = request_->GetMutableLocalScope(); - auto* var = local_scope->FindVar(var_name); - InitializeVariable(var, var_desc->GetType()); - executor_->RunPreparedContext(prefetch_ctx_, local_scope); + request_handler_->Handle(varname, scope, invar, &outvar); - SerializeToByteBuffer(var_name, var, *dev_ctx_, &reply_); + SerializeToByteBuffer(varname, outvar, *request_handler_->dev_ctx(), + &reply_); status_ = FINISH; responder_.Finish(reply_, ::grpc::Status::OK, @@ -211,202 +180,169 @@ class RequestPrefetch final : public RequestBase { std::shared_ptr request_; ::grpc::ByteBuffer reply_; ServerAsyncResponseWriter<::grpc::ByteBuffer> responder_; - framework::Scope* scope_; - framework::Executor* executor_; - framework::ProgramDesc* program_; - framework::ExecutorPrepareContext* prefetch_ctx_; - int req_id_; + framework::Scope* local_scope_; }; -void AsyncGRPCServer::WaitClientGet(int count) { - int fetch_barriers = 0; - while (fetch_barriers < count) { - auto msg = var_get_queue_.Pop(); - if (msg.first == FETCH_BARRIER_MESSAGE) { - fetch_barriers++; - } - } -} - void AsyncGRPCServer::WaitServerReady() { + VLOG(3) << "AsyncGRPCServer is wait server ready"; std::unique_lock lock(this->mutex_ready_); condition_ready_.wait(lock, [=] { return this->ready_ == 1; }); + VLOG(3) << "AsyncGRPCServer WaitSeverReady"; } -void AsyncGRPCServer::RunSyncUpdate() { +void AsyncGRPCServer::StartServer() { ::grpc::ServerBuilder builder; - builder.AddListeningPort(address_, ::grpc::InsecureServerCredentials(), + builder.AddListeningPort(bind_address_, ::grpc::InsecureServerCredentials(), &selected_port_); + builder.SetMaxSendMessageSize(std::numeric_limits::max()); builder.SetMaxReceiveMessageSize(std::numeric_limits::max()); builder.RegisterService(&service_); - cq_send_ = builder.AddCompletionQueue(); - cq_get_ = builder.AddCompletionQueue(); - cq_prefetch_ = builder.AddCompletionQueue(); + for (auto t : rpc_call_map_) { + rpc_cq_[t.first].reset(builder.AddCompletionQueue().release()); + } server_ = builder.BuildAndStart(); - LOG(INFO) << "Server listening on " << address_ + LOG(INFO) << "Server listening on " << bind_address_ << " selected port: " << selected_port_; - std::function send_register = std::bind( - &AsyncGRPCServer::TryToRegisterNewSendOne, this, std::placeholders::_1); - std::function get_register = std::bind( - &AsyncGRPCServer::TryToRegisterNewGetOne, this, std::placeholders::_1); - std::function prefetch_register = - std::bind(&AsyncGRPCServer::TryToRegisterNewPrefetchOne, this, - std::placeholders::_1); + std::function f = + std::bind(&AsyncGRPCServer::TryToRegisterNewOne, this, + std::placeholders::_1, std::placeholders::_2); - for (int i = 0; i < kSendReqsBufSize; ++i) { - TryToRegisterNewSendOne(i); - } - for (int i = 0; i < kGetReqsBufSize; ++i) { - TryToRegisterNewGetOne(i); - } - for (int i = 0; i < kPrefetchReqsBufSize; ++i) { - TryToRegisterNewPrefetchOne(i); - } + for (auto& t : rpc_call_map_) { + auto& rpc_name = t.first; + auto& cq = rpc_cq_[rpc_name]; + auto threadnum = rpc_thread_num_[rpc_name]; + auto& reqs = rpc_reqs_[rpc_name]; - for (int i = 0; i < FLAGS_rpc_server_handle_send_threads; ++i) { - t_sends_.emplace_back( - new std::thread(std::bind(&AsyncGRPCServer::HandleRequest, this, - cq_send_.get(), "cq_send", send_register))); - } - for (int i = 0; i < FLAGS_rpc_server_handle_get_threads; ++i) { - t_gets_.emplace_back( - new std::thread(std::bind(&AsyncGRPCServer::HandleRequest, this, - cq_get_.get(), "cq_get", get_register))); - } - for (int i = 0; i < FLAGS_rpc_server_handle_prefetch_threads; ++i) { - t_prefetchs_.emplace_back(new std::thread( - std::bind(&AsyncGRPCServer::HandleRequest, this, cq_prefetch_.get(), - "cq_prefetch", prefetch_register))); + reqs.reserve(kRequestBufSize); + + for (int i = 0; i < kRequestBufSize; i++) { + TryToRegisterNewOne(rpc_name, i); + } + + for (int i = 0; i < threadnum; i++) { + rpc_threads_[rpc_name].emplace_back(new std::thread(std::bind( + &AsyncGRPCServer::HandleRequest, this, cq.get(), rpc_name, f))); + VLOG(3) << t.first << " creates threads!"; + } } + { std::lock_guard lock(this->mutex_ready_); ready_ = 1; } condition_ready_.notify_all(); + // wait server server_->Wait(); - for (int i = 0; i < FLAGS_rpc_server_handle_send_threads; ++i) { - t_sends_[i]->join(); - } - for (int i = 0; i < FLAGS_rpc_server_handle_get_threads; ++i) { - t_gets_[i]->join(); - } - for (int i = 0; i < FLAGS_rpc_server_handle_prefetch_threads; ++i) { - t_prefetchs_[i]->join(); + + for (auto& t : rpc_threads_) { + auto& threads = t.second; + for (size_t i = 0; i < threads.size(); ++i) { + threads[i]->join(); + VLOG(3) << t.first << " threads ends!"; + } } } void AsyncGRPCServer::ShutdownQueue() { - std::unique_lock lock(cq_mutex_); - cq_send_->Shutdown(); - cq_get_->Shutdown(); - cq_prefetch_->Shutdown(); + for (auto& t : rpc_cq_) { + t.second->Shutdown(); + VLOG(3) << t.first << " shutdown!"; + } } -// This URL explains why shutdown is complicate: -void AsyncGRPCServer::ShutDown() { +void AsyncGRPCServer::ShutDownImpl() { + std::unique_lock lock(cq_mutex_); is_shut_down_ = true; ShutdownQueue(); + + VLOG(3) << "server_ shutdown!"; server_->Shutdown(); } -void AsyncGRPCServer::TryToRegisterNewSendOne(int i) { +void AsyncGRPCServer::TryToRegisterNewOne(const std::string& rpc_name, + int req_id) { std::unique_lock lock(cq_mutex_); if (is_shut_down_) { VLOG(3) << "shutdown, do not TryToRegisterNewSendOne"; return; } - RequestSend* send = new RequestSend(&service_, cq_send_.get(), sync_mode_, - scope_, &var_recv_queue_, dev_ctx_, i); - send_reqs_[i] = static_cast(send); - VLOG(4) << "Create RequestSend status:" << send->Status(); -} -void AsyncGRPCServer::TryToRegisterNewGetOne(int req_id) { - std::unique_lock lock(cq_mutex_); - if (is_shut_down_) { - VLOG(3) << "shutdown, do not TryToRegisterNewGetOne"; - return; + VLOG(4) << "register send rpc_name:" << rpc_name + << ", handler:" << rpc_call_map_[kRequestSend]; + + auto& reqs = rpc_reqs_[rpc_name]; + auto& handler = rpc_call_map_[rpc_name]; + auto& cq = rpc_cq_[rpc_name]; + + RequestBase* b = nullptr; + if (rpc_name == kRequestSend) { + b = new RequestSend(&service_, cq.get(), handler, req_id); + } else if (rpc_name == kRequestGet) { + b = new RequestGet(&service_, cq.get(), handler, req_id); + } else if (rpc_name == kRequestPrefetch) { + b = new RequestPrefetch(&service_, cq.get(), handler, req_id); + } else { + PADDLE_ENFORCE(false, "not surpported rpc"); } - RequestGet* get = new RequestGet(&service_, cq_get_.get(), sync_mode_, scope_, - dev_ctx_, &var_get_queue_, req_id); - get_reqs_[req_id] = static_cast(get); - VLOG(4) << "Create RequestGet status:" << get->Status(); -} -void AsyncGRPCServer::TryToRegisterNewPrefetchOne(int req_id) { - std::unique_lock lock(cq_mutex_); - if (is_shut_down_) { - VLOG(3) << "shutdown, do not TryToRegisterNewPrefetchOne"; - return; - } - RequestPrefetch* prefetch = new RequestPrefetch( - &service_, cq_prefetch_.get(), sync_mode_, scope_, dev_ctx_, executor_, - program_, prefetch_ctx_.get(), req_id); - prefetch_reqs_[req_id] = static_cast(prefetch); + reqs[req_id] = b; - VLOG(4) << "Create RequestPrefetch status:" << prefetch->Status(); + VLOG(4) << "Create RequestSend status:" << b->Status(); } -// FIXME(typhoonzero): change cq_name to enum. void AsyncGRPCServer::HandleRequest( - ::grpc::ServerCompletionQueue* cq, const std::string& cq_name, - std::function TryToRegisterNewOne) { + ::grpc::ServerCompletionQueue* cq, const std::string& rpc_name, + std::function TryToRegisterNewOne) { void* tag = NULL; bool ok = false; while (true) { - VLOG(3) << "HandleRequest for " << cq_name << " wait Next"; + VLOG(3) << "HandleRequest " << rpc_name << " wait next"; if (!cq->Next(&tag, &ok)) { - LOG(INFO) << cq_name << " CompletionQueue shutdown!"; + LOG(INFO) << "CompletionQueue " << rpc_name << " shutdown!"; break; } - VLOG(3) << "HandleRequest for " << cq_name << " get Next"; - int req_id = static_cast(reinterpret_cast(tag)); - if (sync_mode_) { - // FIXME(typhoonzero): de-couple the barriers with recv_op - if (!is_shut_down_ && cq_name == "cq_get") WaitCond(1); - if (!is_shut_down_ && cq_name == "cq_send") WaitCond(0); - VLOG(3) << "HandleRequest for " << cq_name << " after WaitCond"; - } + int req_id = static_cast(reinterpret_cast(tag)); + VLOG(3) << "HandleRequest " << rpc_name << ", req_id:" << req_id + << " get next"; + auto& reqs = rpc_reqs_[rpc_name]; RequestBase* base = nullptr; { - std::lock_guard l(cq_mutex_); - if (cq_name == "cq_get") { - base = get_reqs_[req_id]; - } else if (cq_name == "cq_send") { - base = send_reqs_[req_id]; - } else if (cq_name == "cq_prefetch") { - base = prefetch_reqs_[req_id]; - } + PADDLE_ENFORCE(req_id >= 0 && req_id < kRequestBufSize); + std::unique_lock lock(cq_mutex_); + base = reqs[req_id]; } + // reference: // https://github.com/tensorflow/tensorflow/issues/5596 // https://groups.google.com/forum/#!topic/grpc-io/xftlRy-IQwM // https://groups.google.com/forum/#!topic/grpc-io/ywATt88Ef_I if (!ok) { - LOG(WARNING) << cq_name << " recv no regular event:argument name[" + LOG(WARNING) << "completion queue:" << rpc_name + << " recv no regular event:argument name[" << base->GetReqName() << "]"; - TryToRegisterNewOne(req_id); + TryToRegisterNewOne(rpc_name, req_id); delete base; continue; } + VLOG(3) << "queue id:" << rpc_name << ", req_id:" << req_id + << ", status:" << base->Status(); + switch (base->Status()) { case PROCESS: { base->Process(); - VLOG(4) << cq_name << " PROCESS status:" << base->Status(); break; } case FINISH: { - TryToRegisterNewOne(req_id); - VLOG(4) << cq_name << " FINISH status:" << base->Status(); + TryToRegisterNewOne(rpc_name, req_id); delete base; break; } @@ -415,20 +351,6 @@ void AsyncGRPCServer::HandleRequest( } } -void AsyncGRPCServer::WaitCond(int cond) { - std::unique_lock lock(this->barrier_mutex_); - barrier_condition_.wait(lock, - [=] { return this->barrier_cond_step_ == cond; }); -} - -void AsyncGRPCServer::SetCond(int cond) { - { - std::lock_guard lock(this->barrier_mutex_); - barrier_cond_step_ = cond; - } - barrier_condition_.notify_all(); -} - } // namespace detail } // namespace operators } // namespace paddle diff --git a/paddle/fluid/operators/detail/grpc_server.h b/paddle/fluid/operators/detail/grpc_server.h index bdff9801a92..d1fcbc414f1 100644 --- a/paddle/fluid/operators/detail/grpc_server.h +++ b/paddle/fluid/operators/detail/grpc_server.h @@ -14,6 +14,8 @@ limitations under the License. */ #pragma once +#include +#include #include #include // NOLINT #include @@ -28,6 +30,8 @@ limitations under the License. */ #include "paddle/fluid/framework/selected_rows.h" #include "paddle/fluid/framework/var_type.h" #include "paddle/fluid/operators/detail/grpc_service.h" +#include "paddle/fluid/operators/detail/request_handler.h" +#include "paddle/fluid/operators/detail/rpc_server.h" #include "paddle/fluid/operators/detail/send_recv.grpc.pb.h" #include "paddle/fluid/operators/detail/send_recv.pb.h" #include "paddle/fluid/operators/detail/sendrecvop_utils.h" @@ -37,106 +41,48 @@ namespace paddle { namespace operators { namespace detail { -typedef std::pair> - ReceivedMessage; -typedef framework::BlockingQueue ReceivedQueue; - -typedef std::pair MessageWithName; class RequestBase; -class AsyncGRPCServer final { +class AsyncGRPCServer final : public RPCServer { public: - explicit AsyncGRPCServer(const std::string &address, bool sync_mode) - : address_(address), sync_mode_(sync_mode), ready_(0) {} - - ~AsyncGRPCServer() {} - void WaitServerReady(); - void RunSyncUpdate(); - - // functions to sync server barrier status. - void WaitCond(int cond); - void SetCond(int cond); - void WaitClientGet(int count); - - void SetScope(framework::Scope *scope) { scope_ = scope; } - - void SetDevCtx(const platform::DeviceContext *dev_ctx) { dev_ctx_ = dev_ctx; } - - void SetProgram(framework::ProgramDesc *program) { program_ = program; } - - void SetExecutor(framework::Executor *executor) { executor_ = executor; } - - void SetPrefetchPreparedCtx( - std::unique_ptr prepared) { - prefetch_ctx_.reset(prepared.release()); - } - - int GetSelectedPort() const { return selected_port_; } - - const ReceivedMessage Get() { return this->var_recv_queue_.Pop(); } + explicit AsyncGRPCServer(const std::string& address, int client_num) + : RPCServer(address, client_num), ready_(0) {} - void Push(const std::string &msg_name) { - this->var_recv_queue_.Push(std::make_pair(msg_name, nullptr)); - } + virtual ~AsyncGRPCServer() {} + void WaitServerReady() override; + void StartServer() override; - void ShutDown(); + private: + void HandleRequest( + ::grpc::ServerCompletionQueue* cq, const std::string& rpc_name, + std::function TryToRegisterNewOne); - protected: - void HandleRequest(::grpc::ServerCompletionQueue *cq, - const std::string &cq_name, - std::function TryToRegisterNewOne); - void TryToRegisterNewSendOne(int req_id); - void TryToRegisterNewGetOne(int req_id); - void TryToRegisterNewPrefetchOne(int req_id); + void TryToRegisterNewOne(const std::string& rpc_name, int req_id); void ShutdownQueue(); + void ShutDownImpl() override; private: - static const int kSendReqsBufSize = 100; - static const int kGetReqsBufSize = 100; - static const int kPrefetchReqsBufSize = 10; + static const int kRequestBufSize = 100; std::mutex cq_mutex_; volatile bool is_shut_down_ = false; - std::unique_ptr<::grpc::ServerCompletionQueue> cq_send_; - std::unique_ptr<::grpc::ServerCompletionQueue> cq_get_; - std::unique_ptr<::grpc::ServerCompletionQueue> cq_prefetch_; - - RequestBase *send_reqs_[kSendReqsBufSize]; - RequestBase *get_reqs_[kGetReqsBufSize]; - RequestBase *prefetch_reqs_[kPrefetchReqsBufSize]; GrpcService::AsyncService service_; std::unique_ptr<::grpc::Server> server_; - std::string address_; - const bool sync_mode_; - framework::Scope *scope_; - const platform::DeviceContext *dev_ctx_; - - // received variable from RPC, operators fetch variable from this queue. - framework::BlockingQueue var_get_queue_; - // client send variable to this queue. - ReceivedQueue var_recv_queue_; - // condition of the sub program std::mutex barrier_mutex_; mutable int barrier_cond_step_; std::condition_variable barrier_condition_; - std::vector> t_sends_; - std::vector> t_gets_; - std::vector> t_prefetchs_; - - std::unique_ptr t_prefetch_; - - std::unique_ptr prefetch_ctx_; - framework::ProgramDesc *program_; - framework::Executor *executor_; - int selected_port_; - std::mutex mutex_ready_; std::condition_variable condition_ready_; + int ready_; + + std::map> rpc_cq_; + std::map>> rpc_threads_; + std::map> rpc_reqs_; }; }; // namespace detail diff --git a/paddle/fluid/operators/detail/grpc_server_test.cc b/paddle/fluid/operators/detail/grpc_server_test.cc index 350a7ee1234..f97f638701c 100644 --- a/paddle/fluid/operators/detail/grpc_server_test.cc +++ b/paddle/fluid/operators/detail/grpc_server_test.cc @@ -24,13 +24,16 @@ limitations under the License. */ #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/framework/operator.h" +#include "paddle/fluid/operators/detail/request_handler_impl.h" + namespace framework = paddle::framework; namespace platform = paddle::platform; namespace detail = paddle::operators::detail; USE_OP(lookup_table); -std::unique_ptr rpc_service_; +std::unique_ptr g_rpc_service; +std::unique_ptr g_req_handler; framework::BlockDesc* AppendPrefetchBlcok(framework::ProgramDesc* program) { auto root_block = program->MutableBlock(0); @@ -88,8 +91,7 @@ void InitTensorsOnServer(framework::Scope* scope, platform::CPUPlace* place, } } -void StartServer(const std::string& endpoint) { - rpc_service_.reset(new detail::AsyncGRPCServer(endpoint, true)); +void StartServer() { framework::ProgramDesc program; framework::Scope scope; platform::CPUPlace place; @@ -99,42 +101,59 @@ void StartServer(const std::string& endpoint) { auto prepared = exe.Prepare(program, block->ID()); InitTensorsOnServer(&scope, &place, 10); - rpc_service_->SetProgram(&program); - rpc_service_->SetPrefetchPreparedCtx(std::move(prepared)); - rpc_service_->SetDevCtx(&ctx); - rpc_service_->SetScope(&scope); - rpc_service_->SetExecutor(&exe); + g_req_handler->SetProgram(&program); + g_req_handler->SetPrefetchPreparedCtx(std::move(prepared)); + g_req_handler->SetDevCtx(&ctx); + g_req_handler->SetScope(&scope); + g_req_handler->SetExecutor(&exe); + + g_rpc_service->RegisterRPC(detail::kRequestPrefetch, g_req_handler.get()); + g_req_handler->SetRPCServer(g_rpc_service.get()); + + std::thread server_thread( + std::bind(&detail::AsyncGRPCServer::StartServer, g_rpc_service.get())); - rpc_service_->RunSyncUpdate(); + // FIXME(gongwb): don't use hard time. + sleep(10); + LOG(INFO) << "got nccl id and stop server..."; + g_rpc_service->ShutDown(); + server_thread.join(); } -TEST(PREFETCH, DISABLED_CPU) { - // start up a server instance backend - std::thread server_thread(StartServer, "127.0.0.1:8889"); - sleep(2); +TEST(PREFETCH, CPU) { + g_req_handler.reset(new detail::RequestPrefetchHandler(true)); + g_rpc_service.reset(new detail::AsyncGRPCServer("127.0.0.1:0", 1)); + + std::thread server_thread(StartServer); + g_rpc_service->WaitServerReady(); + + detail::RPCClient client; + int port = g_rpc_service->GetSelectedPort(); + std::string ep = paddle::string::Sprintf("127.0.0.1:%d", port); + framework::Scope scope; platform::CPUPlace place; platform::CPUDeviceContext ctx(place); - // create var on local scope - int64_t rows_numel = 5; - InitTensorsOnClient(&scope, &place, rows_numel); - std::string in_var_name("ids"); - std::string out_var_name("out"); - - auto client = detail::RPCClient::GetInstance(); - client->AsyncPrefetchVariable("127.0.0.1:8889", ctx, scope, in_var_name, - out_var_name); - client->Wait(); - - auto var = scope.Var(out_var_name); - auto value = var->GetMutable()->value(); - auto ptr = value.mutable_data(place); - - rpc_service_->ShutDown(); - server_thread.join(); - rpc_service_.reset(nullptr); - - for (int64_t i = 0; i < rows_numel; ++i) { - EXPECT_EQ(ptr[0 + i * value.dims()[1]], static_cast(i * 2)); + { + // create var on local scope + int64_t rows_numel = 5; + InitTensorsOnClient(&scope, &place, rows_numel); + std::string in_var_name("ids"); + std::string out_var_name("out"); + + client.AsyncPrefetchVariable(ep, ctx, scope, in_var_name, out_var_name); + client.Wait(); + auto var = scope.Var(out_var_name); + auto value = var->GetMutable()->value(); + auto ptr = value.mutable_data(place); + + for (int64_t i = 0; i < rows_numel; ++i) { + EXPECT_EQ(ptr[0 + i * value.dims()[1]], static_cast(i * 2)); + } } + + server_thread.join(); + LOG(INFO) << "begin reset"; + g_rpc_service.reset(nullptr); + g_req_handler.reset(nullptr); } diff --git a/paddle/fluid/operators/detail/request_handler.h b/paddle/fluid/operators/detail/request_handler.h new file mode 100644 index 00000000000..4bc5e7f10ee --- /dev/null +++ b/paddle/fluid/operators/detail/request_handler.h @@ -0,0 +1,127 @@ +// Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include + +#include +#include +#include +#include + +#include "paddle/fluid/framework/data_type.h" +#include "paddle/fluid/framework/executor.h" +#include "paddle/fluid/framework/lod_tensor.h" +#include "paddle/fluid/framework/program_desc.h" +#include "paddle/fluid/framework/scope.h" +#include "paddle/fluid/framework/selected_rows.h" +#include "paddle/fluid/framework/var_type.h" +#include "paddle/fluid/operators/detail/sendrecvop_utils.h" + +namespace paddle { +namespace operators { +namespace detail { + +constexpr char kRequestSend[] = "RequestSend"; +constexpr char kRequestGet[] = "RequestGet"; +constexpr char kRequestPrefetch[] = "RequestPrefetch"; + +class RPCServer; + +class RequestHandler { + public: + explicit RequestHandler(bool sync_mode) + : sync_mode_(sync_mode), + dev_ctx_(nullptr), + executor_(nullptr), + scope_(nullptr), + program_(nullptr), + rpc_server_(nullptr) {} + + virtual ~RequestHandler() {} + + // Set attributes. + void SetScope(framework::Scope* scope) { scope_ = scope; } + void SetDevCtx(const platform::DeviceContext* dev_ctx) { dev_ctx_ = dev_ctx; } + void SetProgram(framework::ProgramDesc* program) { program_ = program; } + void SetExecutor(framework::Executor* executor) { executor_ = executor; } + void SetPrefetchPreparedCtx( + std::unique_ptr prepared) { + prefetch_ctx_.reset(prepared.release()); + } + + // Used for async. + void SetGradToPreparedCtx( + std::unordered_map< + std::string, std::shared_ptr>* g) { + grad_to_prepared_ctx_ = g; + } + + void SetRPCServer(RPCServer* rpc_server) { rpc_server_ = rpc_server; } + + // Get attributes. + bool sync_mode() { return sync_mode_; } + framework::Scope* scope() { return scope_; } + const platform::DeviceContext* dev_ctx() { return dev_ctx_; } + framework::ExecutorPrepareContext* prefetch_ctx() { + return prefetch_ctx_.get(); + } + framework::ProgramDesc* program() { return program_; } + framework::Executor* executor() { return executor_; } + std::vector& sparse_vars() { return sparse_vars_; } + + // This function processes user's rpc request. + // The implemention is in request_handler_impl. + // example: + // std::string varname = request_.varname(); + // + // auto scope = request_handler_->scope(); + // auto invar = scope->FindVar(varname); + // framework::Variable* outvar = nullptr; + // + // request_handler_->Handle(varname, scope, invar, &outvar); + // if (outvar) { + // SerializeToByteBuffer(varname, outvar, + // *request_handler_->dev_ctx(), &reply_); + // } + virtual bool Handle(const std::string& varname, framework::Scope* scope, + framework::Variable* var, + framework::Variable** outvar) = 0; + + protected: + const bool sync_mode_; + + const platform::DeviceContext* dev_ctx_; + framework::Executor* executor_; + framework::Scope* scope_; + framework::ProgramDesc* program_; + std::unique_ptr prefetch_ctx_; + + // Used for async. + std::unordered_map>* + grad_to_prepared_ctx_; + + // Record received sparse variables, so that + // we could reset those after execute optimize program + std::vector sparse_vars_; + RPCServer* rpc_server_; + + std::mutex sparse_var_mutex_; +}; + +} // namespace detail +} // namespace operators +} // namespace paddle diff --git a/paddle/fluid/operators/detail/request_handler_impl.cc b/paddle/fluid/operators/detail/request_handler_impl.cc new file mode 100644 index 00000000000..f16c06d52f4 --- /dev/null +++ b/paddle/fluid/operators/detail/request_handler_impl.cc @@ -0,0 +1,115 @@ +// Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include +#include + +#include "paddle/fluid/framework/blocking_queue.h" +#include "paddle/fluid/framework/data_type.h" +#include "paddle/fluid/framework/lod_tensor.h" +#include "paddle/fluid/framework/scope.h" +#include "paddle/fluid/framework/selected_rows.h" +#include "paddle/fluid/operators/detail/request_handler_impl.h" +#include "paddle/fluid/operators/detail/rpc_server.h" +#include "paddle/fluid/operators/detail/sendrecvop_utils.h" +#include "paddle/fluid/operators/detail/variable_response.h" + +namespace paddle { +namespace operators { +namespace detail { + +bool RequestSendHandler::Handle(const std::string& varname, + framework::Scope* scope, + framework::Variable* invar, + framework::Variable** outvar) { + VLOG(4) << "RequestSendHandler:" << varname; + + // Async + if (!sync_mode_) { + try { + executor_->RunPreparedContext((*grad_to_prepared_ctx_)[varname].get(), + scope); + } catch (std::exception& e) { + LOG(ERROR) << "async: run sub program error " << e.what(); + return false; + } + return true; + } + + // Sync + if (varname == BATCH_BARRIER_MESSAGE) { + VLOG(3) << "sync: recv batch barrier message"; + rpc_server_->IncreaseBatchBarrier(kRequestSend); + } else { + VLOG(3) << "sync: received var_name: " << varname; + if (sync_mode_) { + rpc_server_->WaitCond(kRequestSend); + } + + if (invar == nullptr) { + LOG(ERROR) << "sync: Can not find server side var: " << varname; + PADDLE_THROW("sync: Can not find server side var"); + return false; + } + + if (invar->IsType()) { + std::unique_lock lock(sparse_var_mutex_); + sparse_vars_.push_back(invar); + } + } + + return true; +} + +bool RequestGetHandler::Handle(const std::string& varname, + framework::Scope* scope, + framework::Variable* invar, + framework::Variable** outvar) { + VLOG(4) << "RequestGetHandler:" << varname; + + if (varname != FETCH_BARRIER_MESSAGE) { + if (sync_mode_) { + rpc_server_->WaitCond(kRequestGet); + } + *outvar = scope_->FindVar(varname); + return true; + } + + // FETCH_BARRIER_MESSAGE + if (sync_mode_) { + VLOG(3) << "sync: recv fetch barrier message"; + rpc_server_->IncreaseBatchBarrier(kRequestGet); + } + + return true; +} + +bool RequestPrefetchHandler::Handle(const std::string& varname, + framework::Scope* scope, + framework::Variable* invar, + framework::Variable** outvar) { + VLOG(4) << "RequestPrefetchHandler " << varname; + + auto var_desc = program_->Block(0).FindVar(varname); + *outvar = scope->FindVar(varname); + InitializeVariable(*outvar, var_desc->GetType()); + executor_->RunPreparedContext(prefetch_ctx_.get(), scope); + + return true; +} + +} // namespace detail +} // namespace operators +} // namespace paddle diff --git a/paddle/fluid/operators/detail/request_handler_impl.h b/paddle/fluid/operators/detail/request_handler_impl.h new file mode 100644 index 00000000000..8d0c62232b6 --- /dev/null +++ b/paddle/fluid/operators/detail/request_handler_impl.h @@ -0,0 +1,64 @@ +// Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include + +#include +#include +#include +#include + +#include "paddle/fluid/framework/data_type.h" +#include "paddle/fluid/framework/executor.h" +#include "paddle/fluid/framework/lod_tensor.h" +#include "paddle/fluid/framework/program_desc.h" +#include "paddle/fluid/framework/scope.h" +#include "paddle/fluid/framework/selected_rows.h" +#include "paddle/fluid/framework/var_type.h" +#include "paddle/fluid/operators/detail/request_handler.h" +#include "paddle/fluid/operators/detail/sendrecvop_utils.h" + +namespace paddle { +namespace operators { +namespace detail { + +class RequestSendHandler final : public RequestHandler { + public: + explicit RequestSendHandler(bool sync_mode) : RequestHandler(sync_mode) {} + virtual ~RequestSendHandler() {} + bool Handle(const std::string& varname, framework::Scope* scope, + framework::Variable* var, framework::Variable** outvar) override; +}; + +class RequestGetHandler final : public RequestHandler { + public: + explicit RequestGetHandler(bool sync_mode) : RequestHandler(sync_mode) {} + virtual ~RequestGetHandler() {} + bool Handle(const std::string& varname, framework::Scope* scope, + framework::Variable* var, framework::Variable** outvar) override; +}; + +class RequestPrefetchHandler final : public RequestHandler { + public: + explicit RequestPrefetchHandler(bool sync_mode) : RequestHandler(sync_mode) {} + virtual ~RequestPrefetchHandler() {} + bool Handle(const std::string& varname, framework::Scope* scope, + framework::Variable* var, framework::Variable** outvar) override; +}; + +} // namespace detail +} // namespace operators +} // namespace paddle diff --git a/paddle/fluid/operators/detail/rpc_server.cc b/paddle/fluid/operators/detail/rpc_server.cc new file mode 100644 index 00000000000..448763372a8 --- /dev/null +++ b/paddle/fluid/operators/detail/rpc_server.cc @@ -0,0 +1,113 @@ +// Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include +#include +#include + +#include "paddle/fluid/operators/detail/rpc_server.h" + +namespace paddle { +namespace operators { +namespace detail { + +void RPCServer::ShutDown() { + LOG(INFO) << "RPCServer ShutDown "; + ShutDownImpl(); + + exit_flag_ = true; + barrier_cond_.notify_all(); + rpc_cond_.notify_all(); +} + +void RPCServer::SavePort() const { + auto file_path = string::Sprintf("/tmp/paddle.%d.port", ::getpid()); + std::ofstream port_file; + port_file.open(file_path); + port_file << selected_port_; + port_file.close(); + VLOG(4) << "selected port written to " << file_path; +} + +void RPCServer::WaitBarrier(const std::string& rpc_name) { + std::unique_lock lock(this->mutex_); + barrier_cond_.wait(lock, [=] { + return (barrier_counter_[rpc_name] >= client_num_ || exit_flag_.load()); + }); + + VLOG(3) << "batch_barrier_:" << barrier_counter_[rpc_name]; +} + +void RPCServer::IncreaseBatchBarrier(const std::string rpc_name) { + VLOG(3) << "RPCServer begin IncreaseBatchBarrier " << rpc_name; + int b = 0; + { + std::unique_lock lock(mutex_); + b = ++barrier_counter_[rpc_name]; + } + + VLOG(3) << "RPCServer IncreaseBatchBarrier " << rpc_name + << ", barrier_count:" << b << ", fan_in" << client_num_; + + if (b >= client_num_) { + barrier_cond_.notify_all(); + } +} + +void RPCServer::ResetBarrierCounter() { + VLOG(3) << "RPCServer ResetBarrierCounter "; + std::unique_lock lock(mutex_); + for (auto& t : barrier_counter_) { + t.second = 0; + } +} + +void RPCServer::RegisterRPC(const std::string& rpc_name, + RequestHandler* handler, int thread_num) { + rpc_call_map_[rpc_name] = handler; + rpc_thread_num_[rpc_name] = thread_num; + + static int cond = -1; + rpc_cond_map_[rpc_name] = ++cond; + VLOG(4) << "RegisterRPC rpc_name:" << rpc_name << ", handler:" << handler + << ", cond:" << rpc_cond_map_[rpc_name]; +} + +void RPCServer::SetCond(const std::string& rpc_name) { + VLOG(3) << "RPCServer SetCond " << rpc_name; + { + std::unique_lock lock(mutex_); + cur_cond_ = rpc_cond_map_[rpc_name]; + } + + rpc_cond_.notify_all(); +} + +void RPCServer::WaitCond(const std::string& rpc_name) { + VLOG(3) << "RPCServer WaitCond " << rpc_name; + int cond = 0; + { + std::unique_lock lock(mutex_); + cond = rpc_cond_map_[rpc_name]; + } + + std::unique_lock lock(mutex_); + rpc_cond_.wait( + lock, [=] { return (cur_cond_.load() == cond || exit_flag_.load()); }); +} + +} // namespace detail +} // namespace operators +} // namespace paddle diff --git a/paddle/fluid/operators/detail/rpc_server.h b/paddle/fluid/operators/detail/rpc_server.h new file mode 100644 index 00000000000..c2e7ae706c9 --- /dev/null +++ b/paddle/fluid/operators/detail/rpc_server.h @@ -0,0 +1,91 @@ +// Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include +#include +#include // NOLINT +#include +#include +#include "paddle/fluid/operators/detail/request_handler.h" + +namespace paddle { +namespace operators { +namespace detail { + +class RPCServer { + public: + explicit RPCServer(const std::string& address, int client_num) + : cur_cond_(0), + bind_address_(address), + exit_flag_(false), + selected_port_(0), + client_num_(client_num) {} + + virtual ~RPCServer() {} + virtual void StartServer() = 0; + virtual void WaitServerReady() = 0; + + void ShutDown(); + + bool IsExit() { return exit_flag_.load(); } + + int GetSelectedPort() const { return selected_port_; } + void SavePort() const; + + // RegisterRPC, register the rpc method name to a handler + // class, and auto generate a condition id for this call + // to be used for the barrier. + void RegisterRPC(const std::string& rpc_name, RequestHandler* handler, + int thread_num = 5); + + // Wait util all the clients have reached the barrier for one + // rpc method. This function should be called in the + // RequestHandler if you want to run the server/client in a + // synchronous mode. + void WaitBarrier(const std::string& rpc_name); + + void SetCond(const std::string& rpc_name); + void WaitCond(const std::string& rpc_name); + void IncreaseBatchBarrier(const std::string rpc_name); + void ResetBarrierCounter(); + + protected: + virtual void ShutDownImpl() = 0; + + private: + std::mutex mutex_; + std::unordered_map barrier_counter_; + std::condition_variable barrier_cond_; + + std::unordered_map rpc_cond_map_; + std::atomic cur_cond_; + std::condition_variable rpc_cond_; + + protected: + std::string bind_address_; + std::atomic exit_flag_; + int selected_port_; + + const int client_num_; + + std::unordered_map rpc_call_map_; + std::unordered_map rpc_thread_num_; + friend class RequestHandler; +}; + +}; // namespace detail +}; // namespace operators +}; // namespace paddle diff --git a/paddle/fluid/operators/detail/variable_response.h b/paddle/fluid/operators/detail/variable_response.h index bf624da2a6c..69cfd784f8d 100644 --- a/paddle/fluid/operators/detail/variable_response.h +++ b/paddle/fluid/operators/detail/variable_response.h @@ -67,8 +67,8 @@ class VariableResponse { framework::Scope* GetMutableLocalScope() const { return local_scope_; } - inline std::string Varname() { return meta_.varname(); } - inline std::string OutVarname() { return meta_.out_varname(); } + inline std::string Varname() const { return meta_.varname(); } + inline std::string OutVarname() const { return meta_.out_varname(); } // should call parse first. framework::Variable* GetVar() { diff --git a/paddle/fluid/operators/gen_nccl_id_op.cc b/paddle/fluid/operators/gen_nccl_id_op.cc index a5678f63466..4bce2d322d8 100644 --- a/paddle/fluid/operators/gen_nccl_id_op.cc +++ b/paddle/fluid/operators/gen_nccl_id_op.cc @@ -23,6 +23,7 @@ limitations under the License. */ #include "paddle/fluid/framework/threadpool.h" #include "paddle/fluid/operators/detail/grpc_client.h" #include "paddle/fluid/operators/detail/grpc_server.h" +#include "paddle/fluid/operators/detail/request_handler_impl.h" #include "paddle/fluid/platform/nccl_helper.h" namespace paddle { @@ -75,19 +76,23 @@ class GenNCCLIdOp : public framework::OperatorBase { // NOTE: Can not use unique_ptr here because the default // deleter will call GRPC Server's base class's dtor and // that will cause a wired crash. - detail::AsyncGRPCServer rpc_service(endpoint, true); + detail::RequestSendHandler rpc_h(true); + detail::AsyncGRPCServer rpc_service(endpoint, 1); + rpc_service.RegisterRPC(detail::kRequestSend, &rpc_h); + rpc_h.SetRPCServer(&rpc_service); + framework::ProgramDesc empty_program; framework::Executor executor(dev_ctx.GetPlace()); - rpc_service.SetScope(scope); - rpc_service.SetDevCtx(&dev_ctx); - rpc_service.SetProgram(&empty_program); - rpc_service.SetExecutor(&executor); + rpc_h.SetScope(scope); + rpc_h.SetDevCtx(&dev_ctx); + rpc_h.SetProgram(&empty_program); + rpc_h.SetExecutor(&executor); std::thread server_thread( - std::bind(&detail::AsyncGRPCServer::RunSyncUpdate, &rpc_service)); - rpc_service.SetCond(0); + std::bind(&detail::AsyncGRPCServer::StartServer, &rpc_service)); + rpc_service.SetCond(detail::kRequestSend); VLOG(3) << "start getting nccl id from trainer 0..."; - auto recv = rpc_service.Get(); + rpc_service.WaitBarrier(detail::kRequestSend); VLOG(3) << "got nccl id and stop server..."; rpc_service.ShutDown(); VLOG(3) << "rpc server stopped"; diff --git a/paddle/fluid/operators/listen_and_serv_op.cc b/paddle/fluid/operators/listen_and_serv_op.cc index df5f229acd7..71e75c25321 100644 --- a/paddle/fluid/operators/listen_and_serv_op.cc +++ b/paddle/fluid/operators/listen_and_serv_op.cc @@ -19,14 +19,16 @@ limitations under the License. */ #include // NOLINT #include +#include "paddle/fluid/operators/detail/grpc_server.h" +#include "paddle/fluid/operators/detail/request_handler_impl.h" #include "paddle/fluid/operators/listen_and_serv_op.h" #include "paddle/fluid/platform/profiler.h" namespace paddle { namespace operators { -void RunServer(std::shared_ptr service) { - service->RunSyncUpdate(); +void RunServer(std::shared_ptr service) { + service->StartServer(); VLOG(4) << "RunServer thread end"; } static void split(const std::string &str, char sep, @@ -67,8 +69,6 @@ static void ParallelExecuteBlocks( for (size_t i = 0; i < fs.size(); ++i) fs[i].wait(); } -std::atomic_int ListenAndServOp::selected_port_{0}; - ListenAndServOp::ListenAndServOp(const std::string &type, const framework::VariableNameMap &inputs, const framework::VariableNameMap &outputs, @@ -78,7 +78,6 @@ ListenAndServOp::ListenAndServOp(const std::string &type, ListenAndServOp::~ListenAndServOp() { Stop(); } void ListenAndServOp::Stop() { - rpc_service_->Push(LISTEN_TERMINATE_MESSAGE); rpc_service_->ShutDown(); server_thread_->join(); auto file_path = string::Sprintf("/tmp/paddle.%d.port", ::getpid()); @@ -87,26 +86,13 @@ void ListenAndServOp::Stop() { void ListenAndServOp::SavePort() const { // NOTE: default write file to /tmp/paddle.selected_port - selected_port_ = rpc_service_->GetSelectedPort(); - auto file_path = string::Sprintf("/tmp/paddle.%d.port", ::getpid()); - std::ofstream port_file; - port_file.open(file_path); - port_file << selected_port_.load(); - port_file.close(); - VLOG(4) << "selected port written to " << file_path; -} - -void ListenAndServOp::WaitServerReady() { - while (selected_port_.load() == 0) { - } + rpc_service_->SavePort(); } void ListenAndServOp::RunSyncLoop(framework::Executor *executor, framework::ProgramDesc *program, framework::Scope *recv_scope, framework::BlockDesc *prefetch_block) const { - auto fan_in = Attr("Fanin"); - size_t num_blocks = program->Size(); PADDLE_ENFORCE_GE(num_blocks, 2, "server program should have at least 2 blocks"); @@ -121,49 +107,24 @@ void ListenAndServOp::RunSyncLoop(framework::Executor *executor, optimize_prepared.begin(), std::shared_ptr(nullptr)); - bool exit_flag = false; + rpc_service_->ResetBarrierCounter(); // Record received sparse variables, so that // we could reset those after execute optimize program std::vector sparse_vars; - while (!exit_flag && !SignalHandler::IsProgramExit()) { + while (true) { // Get from multiple trainers, we don't care about the order in which // the gradients arrives, just add suffix 0~n and merge the gradient. - rpc_service_->SetCond(0); - size_t recv_var_cnt = 0; - int batch_barrier = 0; - while (batch_barrier != fan_in) { - const detail::ReceivedMessage v = rpc_service_->Get(); - auto recv_var_name = v.first; - if (recv_var_name == LISTEN_TERMINATE_MESSAGE) { - LOG(INFO) << "received terminate message and exit"; - exit_flag = true; - break; - } else if (recv_var_name == BATCH_BARRIER_MESSAGE) { - VLOG(3) << "recv batch barrier message"; - batch_barrier++; - continue; - } else { - VLOG(3) << "received grad: " << recv_var_name; - recv_var_cnt++; - auto var = v.second->GetVar(); - if (var == nullptr) { - LOG(ERROR) << "Can not find server side var: " << recv_var_name; - PADDLE_THROW("Can not find server side var"); - } - if (var->IsType()) { - sparse_vars.push_back(var); - } - } - } - if (exit_flag) { - rpc_service_->SetCond(1); - rpc_service_->ShutDown(); + rpc_service_->SetCond(detail::kRequestSend); + rpc_service_->WaitBarrier(detail::kRequestSend); + + if (rpc_service_->IsExit()) { + LOG(WARNING) << "get exit!rpc_processor break!"; + rpc_service_->SetCond(detail::kRequestGet); break; } // NOTE: if is_gpu_place, CUDA kernels are launched by multiple threads // and this will still work. - // The optimize blocks which have the same parent ID would run parallel // TODO(Yancey1989): need to use ParallelExecutor for future int32_t last_parent_blkid = program->Block(1).Parent(); @@ -194,52 +155,18 @@ void ListenAndServOp::RunSyncLoop(framework::Executor *executor, var->GetMutable()->mutable_rows()->clear(); } - rpc_service_->SetCond(1); - // FIXME(typhoonzero): use another condition to sync wait clients get. - rpc_service_->WaitClientGet(fan_in); - sparse_vars.clear(); + rpc_service_->SetCond(detail::kRequestGet); + rpc_service_->WaitBarrier(detail::kRequestGet); + rpc_service_->ResetBarrierCounter(); } // while(true) } -static void AsyncUpdateThread( - const std::string &var_name, const bool &exit_flag, - const std::shared_ptr &queue, - framework::Executor *executor, - framework::ExecutorPrepareContext *prepared) { - VLOG(3) << "update thread for " << var_name << " started"; - while (!exit_flag && !SignalHandler::IsProgramExit()) { - const detail::ReceivedMessage v = queue->Pop(); - if (SignalHandler::IsProgramExit()) { - VLOG(3) << "update thread for " << var_name << " exit"; - break; - } - auto recv_var_name = v.first; - VLOG(4) << "async update " << recv_var_name; - auto var = v.second->GetVar(); - if (var == nullptr) { - LOG(ERROR) << "Can not find server side var: " << recv_var_name; - PADDLE_THROW("Can not find server side var"); - } - auto fs = framework::Async([var_name, &executor, &v, prepared] { - try { - executor->RunPreparedContext(prepared, - v.second->GetMutableLocalScope()); - } catch (const std::exception &e) { - LOG(ERROR) << "run sub program error " << e.what(); - } - }); - fs.wait(); - } -} - void ListenAndServOp::RunAsyncLoop(framework::Executor *executor, framework::ProgramDesc *program) const { VLOG(3) << "RunAsyncLoop in"; // grad name to block id std::unordered_map grad_to_block_id; std::unordered_map id_to_grad; - std::unordered_map> - grad_to_queue; auto grad_to_block_id_str = Attr>("grad_to_block_id"); @@ -249,13 +176,9 @@ void ListenAndServOp::RunAsyncLoop(framework::Executor *executor, VLOG(3) << "after split, grad = " << pieces[0] << ", id=" << pieces[1]; PADDLE_ENFORCE_EQ(pieces.size(), 2); PADDLE_ENFORCE_EQ(grad_to_block_id.count(pieces[0]), 0); + int block_id = std::stoi(pieces[1]); grad_to_block_id[pieces[0]] = block_id; - std::shared_ptr queue = - std::make_shared(); - grad_to_queue[pieces[0]] = queue; - // record blocking queue in SignalHandler - SignalHandler::RegisterBlockingQueue(queue); id_to_grad[block_id] = pieces[0]; } size_t num_blocks = program->Size(); @@ -274,39 +197,36 @@ void ListenAndServOp::RunAsyncLoop(framework::Executor *executor, grad_to_prepared_ctx[id_to_grad[block_list[i]]] = optimize_prepared[i]; } - bool exit_flag = false; + request_send_handler_->SetGradToPreparedCtx(&grad_to_prepared_ctx); + request_get_handler_->SetGradToPreparedCtx(&grad_to_prepared_ctx); + request_prefetch_handler_->SetGradToPreparedCtx(&grad_to_prepared_ctx); - VLOG(3) << "start async optimize threads"; - std::vector> fs; - for (auto iter = grad_to_queue.begin(); iter != grad_to_queue.end(); iter++) { - std::string grad_name = iter->first; - VLOG(3) << "create async update thread for " << grad_name; - fs.push_back(framework::AsyncIO([grad_name, &exit_flag, &executor, - &grad_to_queue, &grad_to_prepared_ctx]() { - AsyncUpdateThread(grad_name, exit_flag, grad_to_queue[grad_name], - executor, grad_to_prepared_ctx[grad_name].get()); - })); - } VLOG(3) << "RunAsyncLoop into while"; - while (!exit_flag && !SignalHandler::IsProgramExit()) { - const detail::ReceivedMessage v = rpc_service_->Get(); - auto recv_var_name = v.first; - if (recv_var_name == LISTEN_TERMINATE_MESSAGE) { - LOG(INFO) << "received terminate message and exit"; - exit_flag = true; + while (true) { + if (rpc_service_->IsExit()) { + LOG(INFO) << "get exit!rpc_processor break!"; break; - } else { - VLOG(3) << "received grad: " << recv_var_name; - grad_to_queue[recv_var_name]->Push(v); } - if (exit_flag) { - rpc_service_->ShutDown(); - break; - } + sleep(1); } // while(true) } +static void FillRequestCtx(detail::RequestHandler *h, framework::Scope *scope, + platform::DeviceContext *dev_ctx, + framework::Executor *executor, + framework::ProgramDesc *program, + framework::ExecutorPrepareContext *prefetch_ctx, + detail::RPCServer *rpc_server) { + h->SetScope(scope); + h->SetDevCtx(dev_ctx); + h->SetExecutor(executor); + h->SetProgram(program); + h->SetPrefetchPreparedCtx(std::move( + std::unique_ptr(prefetch_ctx))); + h->SetRPCServer(rpc_server); +} + void ListenAndServOp::RunImpl(const framework::Scope &scope, const platform::Place &dev_place) const { // Mark this as PS that it should decide profiling by listening from trainer. @@ -316,27 +236,42 @@ void ListenAndServOp::RunImpl(const framework::Scope &scope, framework::Scope &recv_scope = scope.NewScope(); bool sync_mode = Attr("sync_mode"); + auto fan_in = Attr("Fanin"); PADDLE_ENFORCE(!rpc_service_); std::string endpoint = Attr("endpoint"); - rpc_service_.reset(new detail::AsyncGRPCServer(endpoint, sync_mode)); + LOG(INFO) << "sync_mode:" << sync_mode << ", fan_in:" << fan_in + << ", end_point:" << endpoint; + + // request_handler_.reset(new detail::GRPCRequestSendHandler(sync_mode)); + rpc_service_.reset(new detail::AsyncGRPCServer(endpoint, fan_in)); + request_send_handler_.reset(new detail::RequestSendHandler(sync_mode)); + request_get_handler_.reset(new detail::RequestGetHandler(sync_mode)); + request_prefetch_handler_.reset( + new detail::RequestPrefetchHandler(sync_mode)); + + rpc_service_->RegisterRPC(detail::kRequestSend, request_send_handler_.get()); + rpc_service_->RegisterRPC(detail::kRequestGet, request_get_handler_.get()); + rpc_service_->RegisterRPC(detail::kRequestPrefetch, + request_prefetch_handler_.get()); auto *optimize_block = Attr(kOptimizeBlock); auto *prefetch_block = Attr(kPrefetchBlock); auto *program = optimize_block->Program(); framework::Executor executor(dev_place); - // prepare rpc_service - rpc_service_->SetScope(&recv_scope); - rpc_service_->SetDevCtx(&dev_ctx); - rpc_service_->SetProgram(program); - rpc_service_->SetExecutor(&executor); - // prepare for prefetch VLOG(3) << "prefetch block id is " << prefetch_block->ID(); auto prefetch_prepared = executor.Prepare(*program, prefetch_block->ID()); - rpc_service_->SetPrefetchPreparedCtx(std::move(prefetch_prepared)); + + auto f = std::bind(FillRequestCtx, std::placeholders::_1, &recv_scope, + &dev_ctx, &executor, program, prefetch_prepared.release(), + rpc_service_.get()); + + f(request_send_handler_.get()); + f(request_get_handler_.get()); + f(request_prefetch_handler_.get()); // start the server listening after all member initialized. server_thread_.reset(new std::thread(RunServer, rpc_service_)); @@ -348,8 +283,6 @@ void ListenAndServOp::RunImpl(const framework::Scope &scope, signal(SIGTERM, SignalHandler::StopAndExit); // Write to a file of server selected port for python use. - std::string file_path = string::Sprintf("/tmp/paddle.%d.selected_port", - static_cast(::getpid())); SavePort(); if (sync_mode) { RunSyncLoop(&executor, program, &recv_scope, prefetch_block); @@ -385,27 +318,9 @@ class ListenAndServOpMaker : public framework::OpProtoAndCheckerMaker { } }; -bool SignalHandler::program_exit_flag_ = false; - -SignalHandler::BlockingQueueSet SignalHandler::blocking_queue_set_{}; - void SignalHandler::StopAndExit(int signal_num) { VLOG(3) << "Catch interrupt signal: " << signal_num << ", program will exit"; - - program_exit_flag_ = true; - - // awake all blocking queues - for (BlockingQueueSet::iterator iter = blocking_queue_set_.begin(); - iter != blocking_queue_set_.end(); iter++) { - iter->get()->Push( - std::make_pair(std::string(LISTEN_TERMINATE_MESSAGE), nullptr)); - } - - exit(EXIT_SUCCESS); -} - -void SignalHandler::RegisterBlockingQueue(BlockingQueue &queue) { - blocking_queue_set_.insert(queue); + exit(0); } } // namespace operators diff --git a/paddle/fluid/operators/listen_and_serv_op.h b/paddle/fluid/operators/listen_and_serv_op.h index 6f868369dcf..87952cb0e68 100644 --- a/paddle/fluid/operators/listen_and_serv_op.h +++ b/paddle/fluid/operators/listen_and_serv_op.h @@ -23,7 +23,8 @@ limitations under the License. */ #include "paddle/fluid/framework/lod_tensor.h" #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/framework/threadpool.h" -#include "paddle/fluid/operators/detail/grpc_server.h" +#include "paddle/fluid/operators/detail/request_handler.h" +#include "paddle/fluid/operators/detail/rpc_server.h" namespace paddle { namespace operators { @@ -31,7 +32,7 @@ namespace operators { constexpr char kOptimizeBlock[] = "OptimizeBlock"; constexpr char kPrefetchBlock[] = "PrefetchBlock"; -void RunServer(std::shared_ptr service); +void RunServer(std::shared_ptr service); class ListenAndServOp : public framework::OperatorBase { public: @@ -52,41 +53,27 @@ class ListenAndServOp : public framework::OperatorBase { void SavePort() const; - void WaitServerReady(); - - int GetSelectedPort() { return selected_port_; } + int GetSelectedPort() { return rpc_service_->GetSelectedPort(); } void Stop() override; void RunImpl(const framework::Scope& scope, const platform::Place& dev_place) const override; - static void ResetPort() { selected_port_ = 0; } - protected: - mutable std::shared_ptr rpc_service_; + mutable std::shared_ptr rpc_service_; + mutable std::shared_ptr request_send_handler_; + mutable std::shared_ptr request_get_handler_; + mutable std::shared_ptr request_prefetch_handler_; + mutable std::shared_ptr server_thread_; - // FIXME(wuyi): it's static so that the operator can be cloned. - static std::atomic_int selected_port_; }; class SignalHandler { - public: - typedef std::shared_ptr BlockingQueue; - typedef std::unordered_set BlockingQueueSet; - public: static void StopAndExit(int signal_num); - static void RegisterBlockingQueue(BlockingQueue&); - - static inline bool IsProgramExit() { return program_exit_flag_; } - private: - static bool program_exit_flag_; - - static BlockingQueueSet blocking_queue_set_; - DISABLE_COPY_AND_ASSIGN(SignalHandler); }; diff --git a/paddle/fluid/operators/send_barrier_op.cc b/paddle/fluid/operators/send_barrier_op.cc index 2c77ee2e279..bcd8e81609a 100644 --- a/paddle/fluid/operators/send_barrier_op.cc +++ b/paddle/fluid/operators/send_barrier_op.cc @@ -46,6 +46,8 @@ class SendBarrierOp : public framework::OperatorBase { auto rpc_client = detail::RPCClient::GetInstance(); + VLOG(3) << "SendBarrierOp sync_mode:" << sync_mode; + // need to wait before sending send_barrier message PADDLE_ENFORCE(rpc_client->Wait()); if (sync_mode) { diff --git a/paddle/fluid/operators/test_send_nccl_id.cc b/paddle/fluid/operators/test_send_nccl_id.cc index 719f039a0f5..a845ba2eb03 100644 --- a/paddle/fluid/operators/test_send_nccl_id.cc +++ b/paddle/fluid/operators/test_send_nccl_id.cc @@ -21,6 +21,8 @@ limitations under the License. */ #include "paddle/fluid/framework/operator.h" #include "paddle/fluid/framework/program_desc.h" #include "paddle/fluid/operators/detail/grpc_client.h" +#include "paddle/fluid/operators/detail/grpc_server.h" +#include "paddle/fluid/operators/detail/request_handler_impl.h" #include "paddle/fluid/operators/listen_and_serv_op.h" #include "paddle/fluid/operators/math/math_function.h" #include "paddle/fluid/operators/math/selected_rows_functor.h" @@ -35,42 +37,44 @@ namespace m = paddle::operators::math; namespace detail = paddle::operators::detail; namespace string = paddle::string; -std::unique_ptr rpc_service; +std::unique_ptr g_rpc_service; +std::unique_ptr g_req_handler; -void StartServer(std::atomic* initialized) { +void StartServer() { f::Scope scope; p::CPUPlace place; scope.Var(NCCL_ID_VARNAME); p::DeviceContextPool& pool = p::DeviceContextPool::Instance(); auto& dev_ctx = *pool.Get(p::CPUPlace()); - rpc_service.reset(new detail::AsyncGRPCServer("127.0.0.1:0", true)); - f::ProgramDesc empty_program; f::Executor executor(dev_ctx.GetPlace()); - rpc_service->SetScope(&scope); - rpc_service->SetDevCtx(&dev_ctx); - rpc_service->SetProgram(&empty_program); - rpc_service->SetExecutor(&executor); + g_req_handler->SetScope(&scope); + g_req_handler->SetDevCtx(&dev_ctx); + g_req_handler->SetProgram(&empty_program); + g_req_handler->SetExecutor(&executor); + + g_rpc_service->RegisterRPC(detail::kRequestSend, g_req_handler.get()); + g_req_handler->SetRPCServer(g_rpc_service.get()); std::thread server_thread( - std::bind(&detail::AsyncGRPCServer::RunSyncUpdate, rpc_service.get())); - *initialized = true; - rpc_service->SetCond(0); - auto recv = rpc_service->Get(); + std::bind(&detail::AsyncGRPCServer::StartServer, g_rpc_service.get())); + + g_rpc_service->SetCond(detail::kRequestSend); + std::cout << "before WaitFanInOfSend" << std::endl; + g_rpc_service->WaitBarrier(detail::kRequestSend); + LOG(INFO) << "got nccl id and stop server..."; - rpc_service->ShutDown(); + g_rpc_service->ShutDown(); server_thread.join(); } -TEST(SendNcclId, DISABLED_Normal) { - std::atomic initialized{false}; - std::thread server_thread(StartServer, &initialized); - while (!initialized) { - } - // wait server to start - // sleep(2); - rpc_service->WaitServerReady(); +TEST(SendNcclId, GrpcServer) { + g_req_handler.reset(new detail::RequestSendHandler(true)); + g_rpc_service.reset(new detail::AsyncGRPCServer("127.0.0.1:0", 1)); + + std::thread server_thread(StartServer); + g_rpc_service->WaitServerReady(); f::Scope scope; p::CPUPlace place; @@ -78,17 +82,20 @@ TEST(SendNcclId, DISABLED_Normal) { auto& dev_ctx = *pool.Get(p::CPUPlace()); auto var = scope.Var(NCCL_ID_VARNAME); - // var->SetType(f::proto::VarType_Type_RAW); auto id = var->GetMutable(); p::dynload::ncclGetUniqueId(id); - int port = rpc_service->GetSelectedPort(); + int port = g_rpc_service->GetSelectedPort(); + std::string ep = string::Sprintf("127.0.0.1:%d", port); detail::RPCClient client; - + LOG(INFO) << "connect to server" << ep; client.AsyncSendVariable(ep, dev_ctx, scope, NCCL_ID_VARNAME); client.Wait(); + client.AsyncSendBatchBarrier(ep); + client.Wait(); + server_thread.join(); - auto* ptr = rpc_service.release(); - delete ptr; + g_rpc_service.reset(nullptr); + g_req_handler.reset(nullptr); } diff --git a/paddle/fluid/platform/nccl_helper.h b/paddle/fluid/platform/nccl_helper.h index 09367889a95..6f8e3f22db5 100644 --- a/paddle/fluid/platform/nccl_helper.h +++ b/paddle/fluid/platform/nccl_helper.h @@ -15,6 +15,7 @@ #pragma once #include +#include #include // NOLINT #include #include -- GitLab From e6bb67a3013e82c2bd003db85e01eff9715a4bf0 Mon Sep 17 00:00:00 2001 From: chengduoZH Date: Fri, 1 Jun 2018 09:58:26 +0800 Subject: [PATCH 104/913] add authors --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 4ee05420982..11f227be714 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -4,6 +4,7 @@ | backyes | Yan-Fei Wang | | baiyfbupt | Yi-Fan Bai | | beckett1124 | Bin Qi | +| ChengduoZH | Cheng-Duo Zhao| | chengxiaohua1105 | Xiao-Hua Cheng | | cxwangyi, yiwangbaidu, wangkuiyi | Yi Wang | | cxysteven | Xing-Yi Cheng | -- GitLab From 04ccbed5b8539bd3fb97df5169ff9103edac3d60 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Fri, 1 Jun 2018 10:04:59 +0800 Subject: [PATCH 105/913] fix a compile error --- paddle/fluid/inference/tensorrt/convert/ut_helper.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/fluid/inference/tensorrt/convert/ut_helper.h b/paddle/fluid/inference/tensorrt/convert/ut_helper.h index 37fcb5c5030..dd481fa234e 100644 --- a/paddle/fluid/inference/tensorrt/convert/ut_helper.h +++ b/paddle/fluid/inference/tensorrt/convert/ut_helper.h @@ -101,7 +101,7 @@ class TRTConvertValidation { engine_->FreezeNetwork(); // Declare outputs. - op_desc_.reset(new framework::OpDesc(desc, nullptr, nullptr)); + op_desc_.reset(new framework::OpDesc(desc, nullptr)); // Set Inputs. for (const auto& input : op_desc_->InputArgumentNames()) { -- GitLab From 7973d9b4b5b3ef032c13410401b8c368220cd21d Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Fri, 1 Jun 2018 10:09:31 +0800 Subject: [PATCH 106/913] bug fix --- python/paddle/fluid/trainer.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 3354d77acec..72168886fdb 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -178,10 +178,11 @@ class Trainer(object): exe.run(self.startup_program) if self.checkpoint and self.checkpoint.load_serial: - exe = executor.Executor(place) - io.load_checkpoint(exe, self.checkpoint.checkpoint_dir, - self.checkpoint.load_serial, - self.startup_program) + with self._prog_and_scope_guard(): + exe = executor.Executor(place) + io.load_checkpoint(exe, self.checkpoint.checkpoint_dir, + self.checkpoint.load_serial, + self.startup_program) if not self.checkpoint.is_pserver: epoch_id, step_id = io.load_trainer_args( -- GitLab From 86efecb93c988119ce4dabbbb38bd3cd095622f9 Mon Sep 17 00:00:00 2001 From: Lei Wang Date: Thu, 31 May 2018 19:15:36 -0700 Subject: [PATCH 107/913] Build: add dependencies for test_paddle_inference_api_impl. (#11064) * Build: add test_word2vec test_image_classification as dependencies of test_paddle_inference_api_impl. * Fix build error when WITH_TESTING is OFF. --- paddle/contrib/inference/CMakeLists.txt | 37 ++++++++++--------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/paddle/contrib/inference/CMakeLists.txt b/paddle/contrib/inference/CMakeLists.txt index 3beb93c4e7f..6847f7db7fc 100644 --- a/paddle/contrib/inference/CMakeLists.txt +++ b/paddle/contrib/inference/CMakeLists.txt @@ -17,32 +17,21 @@ if(APPLE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=pessimizing-move") endif(APPLE) -function(inference_api_test TARGET_NAME TEST_SRC) +function(inference_api_test TARGET_NAME) set(options "") set(oneValueArgs "") set(multiValueArgs ARGS) cmake_parse_arguments(inference_test "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) set(PYTHON_TESTS_DIR ${PADDLE_BINARY_DIR}/python/paddle/fluid/tests) - set(arg_list "") + cc_test(test_paddle_inference_${TARGET_NAME} + SRCS test_paddle_inference_${TARGET_NAME}.cc + DEPS paddle_fluid_api paddle_inference_api + ARGS --dirname=${PYTHON_TESTS_DIR}/book/) if(inference_test_ARGS) - foreach(arg ${inference_test_ARGS}) - list(APPEND arg_list "_${arg}") - endforeach() - else() - list(APPEND arg_list "_") + set_tests_properties(test_paddle_inference_${TARGET_NAME} + PROPERTIES DEPENDS "${inference_test_ARGS}") endif() - foreach(arg ${arg_list}) - string(REGEX REPLACE "^_$" "" arg "${arg}") - cc_test(${TARGET_NAME} - SRCS ${TEST_SRC} - DEPS paddle_fluid_api paddle_inference_api - ARGS --dirname=${PYTHON_TESTS_DIR}/book/) - # TODO(panyx0178): Figure out how to add word2vec and image_classification - # as deps. - # set_tests_properties(${TARGET_NAME} - # PROPERTIES DEPENDS ${DEP_TEST}) - endforeach() endfunction(inference_api_test) @@ -50,9 +39,11 @@ cc_library(paddle_inference_api SRCS paddle_inference_api.cc paddle_inference_api_impl.cc DEPS ${FLUID_CORE_MODULES} ${GLOB_OP_LIB}) -cc_test(test_paddle_inference_api - SRCS test_paddle_inference_api.cc - DEPS paddle_inference_api) +if(WITH_TESTING) + cc_test(test_paddle_inference_api + SRCS test_paddle_inference_api.cc + DEPS paddle_inference_api) -inference_api_test(test_paddle_inference_api_impl - test_paddle_inference_api_impl.cc) + inference_api_test(api_impl + ARGS test_word2vec test_image_classification) +endif() -- GitLab From 31f0533c5ddce9d3db8dbabb8a581f3694f0a7e1 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Fri, 1 Jun 2018 10:54:19 +0800 Subject: [PATCH 108/913] fix compile errors --- paddle/fluid/inference/tensorrt/convert/activation_op.cc | 2 +- paddle/fluid/inference/tensorrt/convert/mul_op.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/paddle/fluid/inference/tensorrt/convert/activation_op.cc b/paddle/fluid/inference/tensorrt/convert/activation_op.cc index 6297051e5a3..79d01b640a2 100644 --- a/paddle/fluid/inference/tensorrt/convert/activation_op.cc +++ b/paddle/fluid/inference/tensorrt/convert/activation_op.cc @@ -24,7 +24,7 @@ class ReluOpConverter : public OpConverter { void operator()(const framework::proto::OpDesc& op) override { // Here the two nullptr looks strange, that's because the // framework::OpDesc's constructor is strange. - framework::OpDesc op_desc(op, nullptr, nullptr); + framework::OpDesc op_desc(op, nullptr); LOG(INFO) << "convert a fluid relu op to tensorrt activation layer whose " "type is Relu"; const nvinfer1::ITensor* input_tensor = diff --git a/paddle/fluid/inference/tensorrt/convert/mul_op.cc b/paddle/fluid/inference/tensorrt/convert/mul_op.cc index ed09f54bde0..aa8e66490f7 100644 --- a/paddle/fluid/inference/tensorrt/convert/mul_op.cc +++ b/paddle/fluid/inference/tensorrt/convert/mul_op.cc @@ -27,7 +27,7 @@ class MulOpConverter : public OpConverter { void operator()(const framework::proto::OpDesc& op) override { VLOG(4) << "convert a fluid mul op to tensorrt fc layer without bias"; - framework::OpDesc op_desc(op, nullptr, nullptr); + framework::OpDesc op_desc(op, nullptr); // Declare inputs auto* input1 = engine_->GetITensor(op_desc.Input("X")[0]); auto* input2 = engine_->GetITensor(op_desc.Input("Y")[0]); -- GitLab From f9556dca51484c270284c181337fc041964f2db0 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Fri, 1 Jun 2018 10:59:42 +0800 Subject: [PATCH 109/913] use open_files reader to read multiple files --- .../howto/cluster/fluid_recordio.md} | 26 ++++++++++-------- .../reader/create_recordio_file_reader_op.cc | 12 ++++---- python/paddle/fluid/layers/io.py | 20 ++++++-------- python/paddle/fluid/recordio_writer.py | 12 ++++++-- tools/codestyle/docstring_checker.pyc | Bin 0 -> 11769 bytes 5 files changed, 37 insertions(+), 33 deletions(-) rename doc/{v2/howto/recordio/README.md => fluid/howto/cluster/fluid_recordio.md} (88%) create mode 100644 tools/codestyle/docstring_checker.pyc diff --git a/doc/v2/howto/recordio/README.md b/doc/fluid/howto/cluster/fluid_recordio.md similarity index 88% rename from doc/v2/howto/recordio/README.md rename to doc/fluid/howto/cluster/fluid_recordio.md index 3f81d54b8e1..0e8b98542d1 100644 --- a/doc/v2/howto/recordio/README.md +++ b/doc/fluid/howto/cluster/fluid_recordio.md @@ -89,14 +89,14 @@ The above codes would generate multiple RecordIO files on your host like: ```bash . - \_mnist.recordio-00000 - |-mnist.recordio-00001 - |-mnist.recordio-00002 - |-mnist.recordio-00003 - |-mnist.recordio-00004 + \_mnist-00000.recordio + |-mnist-00001.recordio + |-mnist-00002.recordio + |-mnist-00003.recordio + |-mnist-00004.recordio ``` -1. read these RecordIO files with `fluid.layers.io.open_recordio_file` +1. open multiple RecordIO files by `fluid.layers.io.open_files` For a distributed training job, the distributed operator system will schedule trainer process on multiple nodes, each trainer process reads parts of the whole training data, we usually take the following approach to make the training @@ -113,10 +113,12 @@ def gen_train_list(file_pattern, trainers, trainer_id): trainers = int(os.getenv("TRAINERS")) trainer_id = int(os.getenv("PADDLE_INIT_TRAINER_ID")) -data_file = fluid.layers.io.open_recordio_file( - filename=gen_train_list("./mnist.recordio*", trainers, trainer_id), - shapes=[(-1, 784),(-1, 1)], - lod_levels=[0, 0], - dtypes=["float32", "int32"]) -data_file = fluid.layers.io.batch(data_file, batch_size=4) +data_file = fluid.layers.io.open_files( + filenames=gen_train_list("./mnist-[0-9]*.recordio", 2, 0), + thread_num=1, + shapes=[(-1, 784),(-1, 1)], + lod_levels=[0, 0], + dtypes=["float32", "int32"]) +img, label = fluid.layers.io.read_file(data_files) +... ``` diff --git a/paddle/fluid/operators/reader/create_recordio_file_reader_op.cc b/paddle/fluid/operators/reader/create_recordio_file_reader_op.cc index 6b6d4470268..282ec3f36b9 100644 --- a/paddle/fluid/operators/reader/create_recordio_file_reader_op.cc +++ b/paddle/fluid/operators/reader/create_recordio_file_reader_op.cc @@ -65,22 +65,20 @@ class CreateRecordIOReaderOp : public framework::OperatorBase { static_cast(shape_concat.size()), "The accumulate of all ranks should be equal to the " "shape concat's length."); - auto filenames = Attr>("filenames"); + std::string filename = Attr("filename"); auto* out = scope.FindVar(Output("Out")) ->template GetMutable(); - for (auto& fn : filenames) { - out->Reset( - new RecordIOFileReader(fn, RestoreShapes(shape_concat, ranks))); - } + + out->Reset(new RecordIOFileReader( + filename, RestoreShapes(shape_concat, ranks))); } }; class CreateRecordIOReaderOpMaker : public FileReaderMakerBase { protected: void Apply() override { - AddAttr>("filenames", - "The filenames of record io reader"); + AddAttr("filename", "The filename of record io reader"); AddComment(R"DOC( CreateRecordIOReader Operator diff --git a/python/paddle/fluid/layers/io.py b/python/paddle/fluid/layers/io.py index b9d55827304..8758ac9f94a 100644 --- a/python/paddle/fluid/layers/io.py +++ b/python/paddle/fluid/layers/io.py @@ -21,7 +21,7 @@ from ..layer_helper import LayerHelper from ..executor import global_scope __all__ = [ - 'data', 'BlockGuardServ', 'ListenAndServ', 'Send', 'open_recordio_files', + 'data', 'BlockGuardServ', 'ListenAndServ', 'Send', 'open_recordio_file', 'open_files', 'read_file', 'shuffle', 'batch', 'double_buffer', 'random_data_generator', 'Preprocessor' ] @@ -291,12 +291,12 @@ def _copy_reader_create_op_(block, op): return new_op -def open_recordio_files(filenames, - shapes, - lod_levels, - dtypes, - pass_num=1, - for_parallel=True): +def open_recordio_file(filename, + shapes, + lod_levels, + dtypes, + pass_num=1, + for_parallel=True): """ Open a RecordIO file @@ -304,7 +304,7 @@ def open_recordio_files(filenames, Via the Reader Variable, we can get data from the given RecordIO file. Args: - filename(str) or list(str): The RecordIO file's name. + filename(str): The RecordIO file's name. shapes(list): List of tuples which declaring data shapes. lod_levels(list): List of ints which declaring data lod_level. dtypes(list): List of strs which declaring data type. @@ -336,8 +336,6 @@ def open_recordio_files(filenames, ranks.append(len(shape)) var_name = unique_name('open_recordio_file') - if isinstance(filenames, str): - filenames = [filenames] startup_blk = default_startup_program().current_block() startup_var = startup_blk.create_var(name=var_name) @@ -347,7 +345,7 @@ def open_recordio_files(filenames, attrs={ 'shape_concat': shape_concat, 'lod_levels': lod_levels, - 'filenames': filenames, + 'filename': filename, 'ranks': ranks }) diff --git a/python/paddle/fluid/recordio_writer.py b/python/paddle/fluid/recordio_writer.py index 9557f91bb36..8d48e9abef0 100644 --- a/python/paddle/fluid/recordio_writer.py +++ b/python/paddle/fluid/recordio_writer.py @@ -12,9 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. +import os import core import contextlib -__all__ = ['convert_reader_to_recordio_file'] +__all__ = [ + 'convert_reader_to_recordio_file', 'convert_reader_to_recordio_files' +] @contextlib.contextmanager @@ -48,7 +51,7 @@ def convert_reader_to_recordio_file( def convert_reader_to_recordio_files( - filename_suffix, + filename, batch_per_file, reader_creator, feeder, @@ -57,13 +60,16 @@ def convert_reader_to_recordio_files( feed_order=None): if feed_order is None: feed_order = feeder.feed_names + f_name, f_ext = os.path.splitext(filename) + assert (f_ext == ".recordio") + lines = [] f_idx = 0 counter = 0 for idx, batch in enumerate(reader_creator()): lines.append(batch) if idx >= batch_per_file and idx % batch_per_file == 0: - filename = "%s-%05d" % (filename_suffix, f_idx) + filename = "%s-%05d%s" % (f_name, f_idx, f_ext) with create_recordio_writer(filename, compressor, max_num_records) as writer: for l in lines: diff --git a/tools/codestyle/docstring_checker.pyc b/tools/codestyle/docstring_checker.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07e875aec6c9bae8002bde4223348c6a29647b03 GIT binary patch literal 11769 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 QVT9NjS|84r2F9-c7hLv=%K!iX literal 0 HcmV?d00001 -- GitLab From 85c203b117797d9bf67a96b47006d3473862fcb5 Mon Sep 17 00:00:00 2001 From: whs Date: Fri, 1 Jun 2018 13:14:23 +0800 Subject: [PATCH 110/913] Make bilinear_interp_op support attrs from input. (#11041) * Make bilinear_interp_op support attrs from input. * Fix python api. --- paddle/fluid/operators/bilinear_interp_op.cc | 23 ++++++++++++ paddle/fluid/operators/bilinear_interp_op.cu | 25 ++++++++++++- paddle/fluid/operators/bilinear_interp_op.h | 22 +++++++++-- python/paddle/fluid/layers/nn.py | 19 +++++++--- .../unittests/test_bilinear_interp_op.py | 37 +++++++++++++++++-- 5 files changed, 111 insertions(+), 15 deletions(-) diff --git a/paddle/fluid/operators/bilinear_interp_op.cc b/paddle/fluid/operators/bilinear_interp_op.cc index d46fda54e7a..3321adf2743 100644 --- a/paddle/fluid/operators/bilinear_interp_op.cc +++ b/paddle/fluid/operators/bilinear_interp_op.cc @@ -34,9 +34,22 @@ class BilinearInterpOp : public framework::OperatorWithKernel { int out_w = ctx->Attrs().Get("out_w"); PADDLE_ENFORCE_EQ(dim_x.size(), 4, "X's dimension must be 4"); + if (ctx->HasInput("OutSize")) { + auto out_size_dim = ctx->GetInputDim("OutSize"); + PADDLE_ENFORCE_EQ(out_size_dim.size(), 1, + "OutSize's dimension size must be 1"); + PADDLE_ENFORCE_EQ(out_size_dim[0], 2, "OutSize's dim[0] must be 2"); + } std::vector dim_out({dim_x[0], dim_x[1], out_h, out_w}); ctx->SetOutputDim("Out", framework::make_ddim(dim_out)); } + + protected: + framework::OpKernelType GetExpectedKernelType( + const framework::ExecutionContext& ctx) const override { + return framework::OpKernelType( + framework::ToDataType(ctx.Input("X")->type()), ctx.GetPlace()); + } }; class BilinearInterpOpMaker : public framework::OpProtoAndCheckerMaker { @@ -45,6 +58,10 @@ class BilinearInterpOpMaker : public framework::OpProtoAndCheckerMaker { AddInput("X", "(Tensor) The input tensor of bilinear interpolation, " "This is a 4-D tensor with shape of (N x C x h x w)"); + AddInput("OutSize", + "(Tensor) This is a 1-D tensor with two number. " + "The first number is height and the second number is width.") + .AsDispensable(); AddOutput("Out", "(Tensor) The dimension of output is (N x C x out_h x out_w]"); @@ -78,6 +95,12 @@ class BilinearInterpOpGrad : public framework::OperatorWithKernel { ctx->SetOutputDim(framework::GradVarName("X"), dim_x); } } + + framework::OpKernelType GetExpectedKernelType( + const framework::ExecutionContext& ctx) const override { + return framework::OpKernelType( + framework::ToDataType(ctx.Input("X")->type()), ctx.GetPlace()); + } }; } // namespace operators diff --git a/paddle/fluid/operators/bilinear_interp_op.cu b/paddle/fluid/operators/bilinear_interp_op.cu index 510190f1aaf..4c197153849 100644 --- a/paddle/fluid/operators/bilinear_interp_op.cu +++ b/paddle/fluid/operators/bilinear_interp_op.cu @@ -102,10 +102,21 @@ class BilinearInterpOpCUDAKernel : public framework::OpKernel { auto* input_t = ctx.Input("X"); // float tensor auto* output_t = ctx.Output("Out"); // float tensor auto* input = input_t->data(); - auto* output = output_t->mutable_data(ctx.GetPlace()); int out_h = ctx.Attr("out_h"); int out_w = ctx.Attr("out_w"); + auto out_dims = output_t->dims(); + auto out_size_t = ctx.Input("OutSize"); + if (out_size_t != nullptr) { + Tensor sizes; + framework::TensorCopy(*out_size_t, platform::CPUPlace(), &sizes); + auto size_data = sizes.data(); + out_h = size_data[0]; + out_w = size_data[1]; + } + auto* output = output_t->mutable_data( + {out_dims[0], out_dims[1], out_h, out_w}, ctx.GetPlace()); + int batch_size = input_t->dims()[0]; int channels = input_t->dims()[1]; int in_h = input_t->dims()[2]; @@ -139,8 +150,8 @@ class BilinearInterpGradOpCUDAKernel : public framework::OpKernel { void Compute(const framework::ExecutionContext& ctx) const override { auto* d_input_t = ctx.Output(framework::GradVarName("X")); auto* d_output_t = ctx.Input(framework::GradVarName("Out")); - auto* d_input = d_input_t->mutable_data(ctx.GetPlace()); auto* d_output = d_output_t->data(); + auto* d_input = d_input_t->mutable_data(ctx.GetPlace()); auto& device_ctx = ctx.template device_context(); @@ -149,6 +160,16 @@ class BilinearInterpGradOpCUDAKernel : public framework::OpKernel { int out_h = ctx.Attr("out_h"); int out_w = ctx.Attr("out_w"); + + auto out_size_t = ctx.Input("OutSize"); + if (out_size_t != nullptr) { + Tensor sizes; + framework::TensorCopy(*out_size_t, platform::CPUPlace(), &sizes); + auto size_data = sizes.data(); + out_h = size_data[0]; + out_w = size_data[1]; + } + int batch_size = d_input_t->dims()[0]; int channels = d_input_t->dims()[1]; int in_h = d_input_t->dims()[2]; diff --git a/paddle/fluid/operators/bilinear_interp_op.h b/paddle/fluid/operators/bilinear_interp_op.h index f6cd77e4d49..8b03cd5a063 100644 --- a/paddle/fluid/operators/bilinear_interp_op.h +++ b/paddle/fluid/operators/bilinear_interp_op.h @@ -24,11 +24,18 @@ class BilinearInterpKernel : public framework::OpKernel { void Compute(const framework::ExecutionContext& ctx) const override { auto* input_t = ctx.Input("X"); // float tensor auto* output_t = ctx.Output("Out"); // float tensor + auto out_dims = output_t->dims(); auto* input = input_t->data(); - auto* output = output_t->mutable_data(ctx.GetPlace()); - int out_h = ctx.Attr("out_h"); int out_w = ctx.Attr("out_w"); + auto out_size_t = ctx.Input("OutSize"); + if (out_size_t != nullptr) { + auto out_size_data = out_size_t->data(); + out_h = out_size_data[0]; + out_w = out_size_data[1]; + } + auto* output = output_t->mutable_data( + {out_dims[0], out_dims[1], out_h, out_w}, ctx.GetPlace()); int batch_size = input_t->dims()[0]; int channels = input_t->dims()[1]; int in_h = input_t->dims()[2]; @@ -83,9 +90,8 @@ class BilinearInterpGradKernel : public framework::OpKernel { void Compute(const framework::ExecutionContext& ctx) const override { auto* d_input_t = ctx.Output(framework::GradVarName("X")); auto* d_output_t = ctx.Input(framework::GradVarName("Out")); - auto* d_input = d_input_t->mutable_data(ctx.GetPlace()); auto* d_output = d_output_t->data(); - + auto* d_input = d_input_t->mutable_data(ctx.GetPlace()); auto& device_ctx = ctx.template device_context(); math::SetConstant zero; @@ -93,6 +99,14 @@ class BilinearInterpGradKernel : public framework::OpKernel { int out_h = ctx.Attr("out_h"); int out_w = ctx.Attr("out_w"); + + auto out_size_t = ctx.Input("OutSize"); + if (out_size_t != nullptr) { + auto out_size_data = out_size_t->data(); + out_h = out_size_data[0]; + out_w = out_size_data[1]; + } + int batch_size = d_input_t->dims()[0]; int channels = d_input_t->dims()[1]; int in_h = d_input_t->dims()[2]; diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index 63ec8315147..cb87653c477 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -3944,7 +3944,7 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): input (Variable): The input tensor of bilinear interpolation, This is a 4-D tensor of the shape (num_batches, channels, in_h, in_w). - out_shape(list|tuple|None): Output shape of bilinear interpolation + out_shape(list|tuple|Variable|None): Output shape of bilinear interpolation layer, the shape is (out_h, out_w). Default: None scale(int|None): The multiplier for the input height or width. @@ -3971,13 +3971,20 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): def _is_list_or_turple_(data): return (isinstance(data, list) or isinstance(data, tuple)) + out_h = 0 + out_w = 0 + inputs = {"X": input} if out_shape is not None: - if not (_is_list_or_turple_(out_shape) and len(out_shape) == 2): + if not (_is_list_or_turple_(out_shape) and len(out_shape) == 2) and ( + out_shape is not Variable): raise ValueError('out_shape should be a list or tuple ', 'with length 2, (out_h, out_w).') - out_shape = list(map(int, out_shape)) - out_h = out_shape[0] - out_w = out_shape[1] + if _is_list_or_turple_(out_shape): + out_shape = list(map(int, out_shape)) + out_h = out_shape[0] + out_w = out_shape[1] + else: + inputs['OutSize'] = out_shape else: out_h = int(input.shape[2] * scale) out_w = int(input.shape[3] * scale) @@ -3985,7 +3992,7 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): out = helper.create_tmp_variable(dtype) helper.append_op( type="bilinear_interp", - inputs={"X": input}, + inputs=inputs, outputs={"Out": out}, attrs={"out_h": out_h, "out_w": out_w}) diff --git a/python/paddle/fluid/tests/unittests/test_bilinear_interp_op.py b/python/paddle/fluid/tests/unittests/test_bilinear_interp_op.py index bffb4f3b666..87c11e7880e 100644 --- a/python/paddle/fluid/tests/unittests/test_bilinear_interp_op.py +++ b/python/paddle/fluid/tests/unittests/test_bilinear_interp_op.py @@ -17,7 +17,10 @@ import numpy as np from op_test import OpTest -def bilinear_interp_np(input, out_h, out_w): +def bilinear_interp_np(input, out_h, out_w, out_size): + if out_size is not None: + out_h = out_size[0] + out_w = out_size[1] batch_size, channel, in_h, in_w = input.shape if out_h > 1: ratio_h = (in_h - 1.0) / (out_h - 1.0) @@ -49,12 +52,15 @@ def bilinear_interp_np(input, out_h, out_w): class TestBilinearInterpOp(OpTest): def setUp(self): + self.out_size = None self.init_test_case() self.op_type = "bilinear_interp" input_np = np.random.random(self.input_shape).astype("float32") - output_np = bilinear_interp_np(input_np, self.out_h, self.out_w) - + output_np = bilinear_interp_np(input_np, self.out_h, self.out_w, + self.out_size) self.inputs = {'X': input_np} + if self.out_size is not None: + self.inputs['OutSize'] = self.out_size self.attrs = {'out_h': self.out_h, 'out_w': self.out_w} self.outputs = {'Out': output_np} @@ -68,6 +74,7 @@ class TestBilinearInterpOp(OpTest): self.input_shape = [2, 3, 4, 4] self.out_h = 2 self.out_w = 2 + self.out_size = np.array([3, 3]).astype("int32") class TestCase1(TestBilinearInterpOp): @@ -91,5 +98,29 @@ class TestCase3(TestBilinearInterpOp): self.out_w = 128 +class TestCase4(TestBilinearInterpOp): + def init_test_case(self): + self.input_shape = [4, 1, 7, 8] + self.out_h = 1 + self.out_w = 1 + self.out_size = np.array([2, 2]).astype("int32") + + +class TestCase5(TestBilinearInterpOp): + def init_test_case(self): + self.input_shape = [3, 3, 9, 6] + self.out_h = 12 + self.out_w = 12 + self.out_size = np.array([11, 11]).astype("int32") + + +class TestCase6(TestBilinearInterpOp): + def init_test_case(self): + self.input_shape = [1, 1, 128, 64] + self.out_h = 64 + self.out_w = 128 + self.out_size = np.array([65, 129]).astype("int32") + + if __name__ == "__main__": unittest.main() -- GitLab From b33ea7be2d68e64c4a3844b7fbfa01f2697a7839 Mon Sep 17 00:00:00 2001 From: minqiyang Date: Fri, 1 Jun 2018 13:35:20 +0800 Subject: [PATCH 111/913] 1. change the variable name from align_var_to_block to slice_var_up 2. replace split_method with slice_var_up in func init_splited_variables --- .../unittests/test_simple_dist_transpiler.py | 2 +- .../fluid/transpiler/distribute_transpiler.py | 35 ++++++++++--------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py b/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py index 25d79b51f99..5ae2844e295 100644 --- a/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py +++ b/python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py @@ -72,7 +72,7 @@ class TestSimpleDistTranspiler(TranspilerTest): program=main, pservers=self.pserver_eps, trainers=self.trainers, - align_var_to_block=False) + slice_var_up=False) return t diff --git a/python/paddle/fluid/transpiler/distribute_transpiler.py b/python/paddle/fluid/transpiler/distribute_transpiler.py index a116671c1b1..da001add8e1 100644 --- a/python/paddle/fluid/transpiler/distribute_transpiler.py +++ b/python/paddle/fluid/transpiler/distribute_transpiler.py @@ -71,7 +71,7 @@ def same_or_split_var(p_name, var_name): return p_name == var_name or p_name.startswith(var_name + ".block") -def split_variable(var_list, service_count, min_block_size=8192): +def slice_variable(var_list, slice_count, min_block_size=8192): """ We may need to split dense tensor to one or more blocks and put them equally onto parameter server. One block is a sub-tensor @@ -83,8 +83,8 @@ def split_variable(var_list, service_count, min_block_size=8192): Args: var_list (list): List of variables. - service_count (int): Numel of pserver services. A pserver may have two - or more listening ports. + slice_count (int): Numel of count that variables will be sliced, which + could be the pserver services' count. min_block_size (int): Minimum splitted block size. Returns: blocks (list[(varname, block_id, current_block_size)]): A list @@ -92,12 +92,12 @@ def split_variable(var_list, service_count, min_block_size=8192): """ blocks = [] for var in var_list: - split_count = service_count + split_count = slice_count var_numel = reduce(lambda x, y: x * y, var.shape) max_pserver_count = int(math.floor(var_numel / float(min_block_size))) if max_pserver_count == 0: max_pserver_count = 1 - if max_pserver_count < service_count: + if max_pserver_count < slice_count: split_count = max_pserver_count block_size = int(math.ceil(var_numel / float(split_count))) @@ -178,7 +178,7 @@ class DistributeTranspiler: for index in range(len(self.pserver_endpoints)) ] - def _init_splited_vars(self, split_method, align_var_to_block=True): + def _init_splited_vars(self, slice_var_up): # update these mappings for further transpile: # 1. param_var_mapping: param var name -> [splited params vars] # 2. grad_var_mapping: grad var name -> [splited grads vars] @@ -197,16 +197,19 @@ class DistributeTranspiler: self._update_dist_lookup_table_vars(param_list, grad_list, self.params_grads) - if align_var_to_block: - grad_blocks = split_variable(grad_list, len(self.pserver_endpoints)) - param_blocks = split_variable(param_list, + if slice_var_up: + # when we slice var up into blocks, we will slice the var according to + # pserver services' count. A pserver may have two or more listening ports. + grad_blocks = slice_variable(grad_list, len(self.pserver_endpoints)) + param_blocks = slice_variable(param_list, len(self.pserver_endpoints)) else: - # when we do NOT align var to block, we will always split params + # when we do NOT slice var up into blocks, we will always slice params # grads into one block. - grad_blocks = split_variable(grad_list, 1) - param_blocks = split_variable(param_list, 1) + grad_blocks = slice_variable(grad_list, 1) + param_blocks = slice_variable(param_list, 1) assert (len(grad_blocks) == len(param_blocks)) + # origin_varname -> [splited_var] self.param_var_mapping = self._create_vars_from_blocklist( self.origin_program, param_blocks) @@ -237,7 +240,7 @@ class DistributeTranspiler: program=None, pservers="127.0.0.1:6174", trainers=1, - align_var_to_block=True, + slice_var_up=True, split_method=RoundRobin, sync_mode=True): """ @@ -271,7 +274,7 @@ class DistributeTranspiler: self.has_distributed_lookup_table = self._has_distributed_lookup_table() # split and create vars, then put splited vars in dicts for later use. - self._init_splited_vars(split_method, align_var_to_block) + self._init_splited_vars(slice_var_up) # step 3.1: insert send op to send gradient vars to parameter servers ps_dispatcher.reset() @@ -283,13 +286,13 @@ class DistributeTranspiler: # fc_b@GRAD_trainer_0, fc_b@GRAD_trainer_1 --> pserver2 # shuffle the map will avoid the uneven distribution above grad_var_mapping_items = self.grad_var_mapping.items() - if not align_var_to_block: + if not slice_var_up: np.random.shuffle(grad_var_mapping_items) for orig_varname, splited_vars in grad_var_mapping_items: eplist = ps_dispatcher.dispatch(splited_vars) - if not align_var_to_block: + if not slice_var_up: assert (len(splited_vars) == 1) if len(splited_vars) == 1: -- GitLab From 5387562576de020a35f864a07f14802b68ee398d Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 1 Jun 2018 14:07:41 +0800 Subject: [PATCH 112/913] add multi-thread test --- .../tests/book/test_inference_nlp.cc | 157 ++++++++---------- 1 file changed, 72 insertions(+), 85 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 5241661fb31..4e92d6a17b0 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -15,11 +15,7 @@ limitations under the License. */ #include #include #include -#include -#include -#include #include // NOLINT -#include #include "gflags/gflags.h" #include "gtest/gtest.h" #include "paddle/fluid/inference/tests/test_helper.h" @@ -41,19 +37,18 @@ inline double get_current_ms() { // return size of total words size_t read_datasets(std::vector* out, const std::string& filename) { - using namespace std; // NOLINT size_t sz = 0; - fstream fin(filename); - string line; + std::fstream fin(filename); + std::string line; out->clear(); while (getline(fin, line)) { - istringstream iss(line); - vector ids; - string field; + std::istringstream iss(line); + std::vector ids; + std::string field; while (getline(iss, field, ' ')) { ids.push_back(stoi(field)); } - if (ids.size() >= 1024 ) { + if (ids.size() >= 1024) { continue; } @@ -69,72 +64,61 @@ size_t read_datasets(std::vector* out, return sz; } -void test_multi_threads() { - /* - size_t jobs_per_thread = std::min(inputdatas.size() / FLAGS_num_threads, - inputdatas.size()); - std::vector workers(FLAGS_num_threads, jobs_per_thread); - workers[FLAGS_num_threads - 1] += inputdatas.size() % FLAGS_num_threads; - - std::vector> infer_threads; - - for (size_t i = 0; i < workers.size(); ++i) { - infer_threads.emplace_back(new std::thread([&, i]() { - size_t start = i * jobs_per_thread; - for (size_t j = start; j < start + workers[i]; ++j ) { - // 0. Call `paddle::framework::InitDevices()` initialize all the - devices - // In unittests, this is done in paddle/testing/paddle_gtest_main.cc - paddle::framework::LoDTensor words; - auto& srcdata = inputdatas[j]; - paddle::framework::LoD lod{{0, srcdata.size()}}; - words.set_lod(lod); - int64_t* pdata = words.mutable_data( - {static_cast(srcdata.size()), 1}, - paddle::platform::CPUPlace()); - memcpy(pdata, srcdata.data(), words.numel() * sizeof(int64_t)); - - LOG(INFO) << "thread id: " << i << ", words size:" << words.numel(); - std::vector cpu_feeds; - cpu_feeds.push_back(&words); - - paddle::framework::LoDTensor output1; - std::vector cpu_fetchs1; - cpu_fetchs1.push_back(&output1); - - // Run inference on CPU - if (FLAGS_prepare_vars) { - if (FLAGS_prepare_context) { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } else { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } - } else { - if (FLAGS_prepare_context) { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } else { - TestInference( - dirname, cpu_feeds, cpu_fetchs1, FLAGS_repeat, model_combined, - FLAGS_use_mkldnn); - } - } - //LOG(INFO) << output1.lod(); - //LOG(INFO) << output1.dims(); - } - })); - } - auto start_ms = get_current_ms(); - for (int i = 0; i < FLAGS_num_threads; ++i) { - infer_threads[i]->join(); +void ThreadRunInfer( + const int tid, paddle::framework::Executor* executor, + paddle::framework::Scope* scope, + const std::unique_ptr& inference_program, + const std::vector>& jobs) { + auto copy_program = std::unique_ptr( + new paddle::framework::ProgramDesc(*inference_program)); + std::string feed_holder_name = "feed_" + paddle::string::to_string(tid); + std::string fetch_holder_name = "fetch_" + paddle::string::to_string(tid); + copy_program->SetFeedHolderName(feed_holder_name); + copy_program->SetFetchHolderName(fetch_holder_name); + + // 3. Get the feed_target_names and fetch_target_names + const std::vector& feed_target_names = + copy_program->GetFeedTargetNames(); + const std::vector& fetch_target_names = + copy_program->GetFetchTargetNames(); + + PADDLE_ENFORCE_EQ(fetch_target_names.size(), 1UL); + std::map fetch_targets; + paddle::framework::LoDTensor outtensor; + fetch_targets[fetch_target_names[0]] = &outtensor; + + std::map feed_targets; + PADDLE_ENFORCE_EQ(feed_target_names.size(), 1UL); + + auto& inputs = jobs[tid]; + auto start_ms = get_current_ms(); + for (size_t i = 0; i < inputs.size(); ++i) { + feed_targets[feed_target_names[0]] = inputs[i]; + executor->Run(*copy_program, scope, &feed_targets, &fetch_targets, true, + true, feed_holder_name, fetch_holder_name); + } + auto stop_ms = get_current_ms(); + LOG(INFO) << "Tid: " << tid << ", process " << inputs.size() + << " samples, avg time per sample: " + + << (stop_ms - start_ms) / inputs.size() << " ms"; +} + +void bcast_datasets( + const std::vector& datasets, + std::vector>* jobs, + const int num_threads) { + size_t s = 0; + jobs->resize(num_threads); + while (s < datasets.size()) { + for (auto it = jobs->begin(); it != jobs->end(); it++) { + it->emplace_back(&datasets[s]); + s++; + if (s >= datasets.size()) { + break; + } } - auto stop_ms = get_current_ms(); - LOG(INFO) << "total: " << stop_ms - start_ms << " ms";*/ + } } TEST(inference, nlp) { @@ -166,7 +150,18 @@ TEST(inference, nlp) { } if (FLAGS_num_threads > 1) { - test_multi_threads(); + std::vector> jobs; + bcast_datasets(datasets, &jobs, FLAGS_num_threads); + std::vector> threads; + for (int i = 0; i < FLAGS_num_threads; ++i) { + threads.emplace_back(new std::thread(ThreadRunInfer, i, &executor, scope, + std::ref(inference_program), + std::ref(jobs))); + } + for (int i = 0; i < FLAGS_num_threads; ++i) { + threads[i]->join(); + } + } else { if (FLAGS_prepare_vars) { executor.CreateVariables(*inference_program, scope, 0); @@ -200,14 +195,6 @@ TEST(inference, nlp) { LOG(INFO) << "Total infer time: " << (stop_ms - start_ms) / 1000.0 / 60 << " min, avg time per seq: " << (stop_ms - start_ms) / datasets.size() << " ms"; -// { // just for test -// auto* scope = new paddle::framework::Scope(); -// paddle::framework::LoDTensor outtensor; -// TestInference( -// dirname, {&(datasets[0])}, {&outtensor}, FLAGS_repeat, model_combined, -// false); -// delete scope; -// } } delete scope; } -- GitLab From a4822ed897cebe6a27bd61d82c5a1b43022d3760 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 1 Jun 2018 14:37:35 +0800 Subject: [PATCH 113/913] add thread setting --- .../tests/book/test_inference_nlp.cc | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 4e92d6a17b0..fba64efece8 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -19,6 +19,10 @@ limitations under the License. */ #include "gflags/gflags.h" #include "gtest/gtest.h" #include "paddle/fluid/inference/tests/test_helper.h" +#ifdef PADDLE_WITH_MKLML +#include +#include +#endif DEFINE_string(dirname, "", "Directory of the inference model."); DEFINE_int32(repeat, 100, "Running the inference program repeat times"); @@ -149,6 +153,14 @@ TEST(inference, nlp) { EnableMKLDNN(inference_program); } +#ifdef PADDLE_WITH_MKLML + // only use 1 core per thread + omp_set_dynamic(0); + omp_set_num_threads(1); + mkl_set_num_threads(1); +#endif + + double start_ms = 0, stop_ms = 0; if (FLAGS_num_threads > 1) { std::vector> jobs; bcast_datasets(datasets, &jobs, FLAGS_num_threads); @@ -158,9 +170,11 @@ TEST(inference, nlp) { std::ref(inference_program), std::ref(jobs))); } + start_ms = get_current_ms(); for (int i = 0; i < FLAGS_num_threads; ++i) { threads[i]->join(); } + stop_ms = get_current_ms(); } else { if (FLAGS_prepare_vars) { @@ -185,16 +199,18 @@ TEST(inference, nlp) { std::map feed_targets; // for data and run - auto start_ms = get_current_ms(); + start_ms = get_current_ms(); for (size_t i = 0; i < datasets.size(); ++i) { feed_targets[feed_target_names[0]] = &(datasets[i]); executor.RunPreparedContext(ctx.get(), scope, &feed_targets, &fetch_targets, !FLAGS_prepare_vars); } - auto stop_ms = get_current_ms(); - LOG(INFO) << "Total infer time: " << (stop_ms - start_ms) / 1000.0 / 60 - << " min, avg time per seq: " - << (stop_ms - start_ms) / datasets.size() << " ms"; + stop_ms = get_current_ms(); } + + LOG(INFO) << "Total inference time with " << FLAGS_num_threads + << " threads : " << (stop_ms - start_ms) / 1000.0 + << " sec, avg time per seq: " + << (stop_ms - start_ms) / datasets.size() << " ms"; delete scope; } -- GitLab From ed365919b409749d903a2a5b4fbc4d3b00bb6f7c Mon Sep 17 00:00:00 2001 From: Wu Yi Date: Fri, 1 Jun 2018 14:46:19 +0800 Subject: [PATCH 114/913] Add fluid benchmark Dockerfile (#11095) * add fluid benchmark Dockerfile * add_fluid_benchmark_dockerfile --- benchmark/fluid/Dockerfile | 22 ++++++++++++++++++++++ benchmark/fluid/README.md | 16 +++++++++++++++- benchmark/fluid/run.sh | 26 ++++++++++++++------------ 3 files changed, 51 insertions(+), 13 deletions(-) create mode 100644 benchmark/fluid/Dockerfile diff --git a/benchmark/fluid/Dockerfile b/benchmark/fluid/Dockerfile new file mode 100644 index 00000000000..46140a9d1be --- /dev/null +++ b/benchmark/fluid/Dockerfile @@ -0,0 +1,22 @@ +FROM nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04 +RUN apt-get update && apt-get install -y python python-pip iputils-ping libgtk2.0-dev wget vim net-tools iftop +RUN ln -s /usr/lib/x86_64-linux-gnu/libcudnn.so.7 /usr/lib/libcudnn.so && ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.2 /usr/lib/libnccl.so +RUN pip install -U pip +RUN pip install -U kubernetes opencv-python paddlepaddle + +# IMPORTANT: +# Add "ENV http_proxy=http://ip:port" if your download is slow, and don't forget to unset it at runtime. + +RUN sh -c 'echo "import paddle.v2 as paddle\npaddle.dataset.cifar.train10()\npaddle.dataset.flowers.fetch()" | python' +RUN sh -c 'echo "import paddle.v2 as paddle\npaddle.dataset.mnist.train()\npaddle.dataset.mnist.test()\npaddle.dataset.imdb.fetch()" | python' +RUN sh -c 'echo "import paddle.v2 as paddle\npaddle.dataset.imikolov.fetch()" | python' +RUN pip uninstall -y paddlepaddle && mkdir /workspace + +ADD https://raw.githubusercontent.com/PaddlePaddle/cloud/develop/docker/paddle_k8s /usr/bin +ADD https://raw.githubusercontent.com/PaddlePaddle/cloud/develop/docker/k8s_tools.py /root + +ADD *.whl / +RUN pip install /*.whl && rm -f /*.whl && chmod +x /usr/bin/paddle_k8s + +ENV LD_LIBRARY_PATH=/usr/local/lib +ADD fluid_benchmark.py dataset.py models/ /workspace/ diff --git a/benchmark/fluid/README.md b/benchmark/fluid/README.md index 7071e9fdcd3..1b0c7dce8bd 100644 --- a/benchmark/fluid/README.md +++ b/benchmark/fluid/README.md @@ -44,11 +44,25 @@ Currently supported `--model` argument include: ## Run Distributed Benchmark on Kubernetes Cluster +You may need to build a Docker image before submitting a cluster job onto Kubernetes, or you will +have to start all those processes mannually on each node, which is not recommended. + +To build the Docker image, you need to choose a paddle "whl" package to run with, you may either +download it from +http://www.paddlepaddle.org/docs/develop/documentation/zh/build_and_install/pip_install_en.html or +build it by your own. Once you've got the "whl" package, put it under the current directory and run: + +```bash +docker build -t [your docker image name]:[your docker image tag] . +``` + +Then push the image to a Docker registry that your Kubernetes cluster can reach. + We provide a script `kube_gen_job.py` to generate Kubernetes yaml files to submit distributed benchmark jobs to your cluster. To generate a job yaml, just run: ```bash -python kube_gen_job.py --jobname myjob --pscpu 4 --cpu 8 --gpu 8 --psmemory 20 --memory 40 --pservers 4 --trainers 4 --entry "python fluid_benchmark.py --model mnist --parallel 1 --device GPU --update_method pserver " --disttype pserver +python kube_gen_job.py --jobname myjob --pscpu 4 --cpu 8 --gpu 8 --psmemory 20 --memory 40 --pservers 4 --trainers 4 --entry "python fluid_benchmark.py --model mnist --gpus 8 --device GPU --update_method pserver " --disttype pserver ``` Then the yaml files are generated under directory `myjob`, you can run: diff --git a/benchmark/fluid/run.sh b/benchmark/fluid/run.sh index f6dfd20bf2e..afaab5f4de4 100644 --- a/benchmark/fluid/run.sh +++ b/benchmark/fluid/run.sh @@ -37,7 +37,8 @@ nohup stdbuf -oL nvidia-smi \ -l 1 & # mnist # mnist gpu mnist 128 -FLAGS_benchmark=true stdbuf -oL python fluid/mnist.py \ +FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ + --model=mnist \ --device=GPU \ --batch_size=128 \ --skip_batch_num=5 \ @@ -46,7 +47,8 @@ FLAGS_benchmark=true stdbuf -oL python fluid/mnist.py \ # vgg16 # gpu cifar10 128 -FLAGS_benchmark=true stdbuf -oL python fluid/vgg16.py \ +FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ + --model=vgg16 \ --device=GPU \ --batch_size=128 \ --skip_batch_num=5 \ @@ -54,7 +56,8 @@ FLAGS_benchmark=true stdbuf -oL python fluid/vgg16.py \ 2>&1 | tee -a vgg16_gpu_128.log # flowers gpu 128 -FLAGS_benchmark=true stdbuf -oL python fluid/vgg16.py \ +FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ + --model=vgg16 \ --device=GPU \ --batch_size=32 \ --data_set=flowers \ @@ -64,40 +67,39 @@ FLAGS_benchmark=true stdbuf -oL python fluid/vgg16.py \ # resnet50 # resnet50 gpu cifar10 128 -FLAGS_benchmark=true stdbuf -oL python fluid/resnet50.py \ +FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ + --model=resnet50 \ --device=GPU \ --batch_size=128 \ --data_set=cifar10 \ - --model=resnet_cifar10 \ --skip_batch_num=5 \ --iterations=30 \ 2>&1 | tee -a resnet50_gpu_128.log # resnet50 gpu flowers 64 -FLAGS_benchmark=true stdbuf -oL python fluid/resnet50.py \ +FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ + --model=resnet50 \ --device=GPU \ --batch_size=64 \ --data_set=flowers \ - --model=resnet_imagenet \ --skip_batch_num=5 \ --iterations=30 \ 2>&1 | tee -a resnet50_gpu_flowers_64.log # lstm # lstm gpu imdb 32 # tensorflow only support batch=32 -FLAGS_benchmark=true stdbuf -oL python fluid/stacked_dynamic_lstm.py \ +FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ + --model=stacked_dynamic_lstm \ --device=GPU \ --batch_size=32 \ --skip_batch_num=5 \ --iterations=30 \ - --hidden_dim=512 \ - --emb_dim=512 \ - --crop_size=1500 \ 2>&1 | tee -a lstm_gpu_32.log # seq2seq # seq2seq gpu wmb 128 -FLAGS_benchmark=true stdbuf -oL python fluid/machine_translation.py \ +FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ + --model=machine_translation \ --device=GPU \ --batch_size=128 \ --skip_batch_num=5 \ -- GitLab From 15193c9e936270de7f39b1d738bbb3571adcd737 Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Fri, 1 Jun 2018 14:48:24 +0800 Subject: [PATCH 115/913] Faster RecordIO Scanner --- paddle/fluid/recordio/chunk.cc | 58 ++++++++++++++++++++------------ paddle/fluid/recordio/chunk.h | 16 +++++++-- paddle/fluid/recordio/scanner.cc | 26 +++++++------- paddle/fluid/recordio/scanner.h | 6 +--- 4 files changed, 64 insertions(+), 42 deletions(-) diff --git a/paddle/fluid/recordio/chunk.cc b/paddle/fluid/recordio/chunk.cc index 82d9aa601cf..6c65d9160c0 100644 --- a/paddle/fluid/recordio/chunk.cc +++ b/paddle/fluid/recordio/chunk.cc @@ -119,40 +119,56 @@ bool Chunk::Write(std::ostream& os, Compressor ct) const { } bool Chunk::Parse(std::istream& sin) { - Header hdr; - bool ok = hdr.Parse(sin); + ChunkParser parser(sin); + if (!parser.Init()) { + return false; + } + Clear(); + while (parser.HasNext()) { + Add(parser.Next()); + } + return true; +} + +ChunkParser::ChunkParser(std::istream& sin) : in_(sin) {} +bool ChunkParser::Init() { + pos_ = 0; + bool ok = header_.Parse(in_); if (!ok) { return ok; } - auto beg_pos = sin.tellg(); - uint32_t crc = Crc32Stream(sin, hdr.CompressSize()); - PADDLE_ENFORCE_EQ(hdr.Checksum(), crc); - Clear(); - sin.seekg(beg_pos, sin.beg); - std::unique_ptr compressed_stream; - switch (hdr.CompressType()) { + auto beg_pos = in_.tellg(); + uint32_t crc = Crc32Stream(in_, header_.CompressSize()); + PADDLE_ENFORCE_EQ(header_.Checksum(), crc); + in_.seekg(beg_pos, in_.beg); + + switch (header_.CompressType()) { case Compressor::kNoCompress: break; case Compressor::kSnappy: - compressed_stream.reset(new snappy::iSnappyStream(sin)); + compressed_stream_.reset(new snappy::iSnappyStream(in_)); break; default: PADDLE_THROW("Not implemented"); } + return true; +} - std::istream& stream = compressed_stream ? *compressed_stream : sin; +bool ChunkParser::HasNext() const { return pos_ < header_.NumRecords(); } - for (uint32_t i = 0; i < hdr.NumRecords(); ++i) { - uint32_t rec_len; - stream.read(reinterpret_cast(&rec_len), sizeof(uint32_t)); - std::string buf; - buf.resize(rec_len); - stream.read(&buf[0], rec_len); - PADDLE_ENFORCE_EQ(rec_len, stream.gcount()); - Add(buf); +std::string ChunkParser::Next() { + if (!HasNext()) { + return ""; } - return true; + ++pos_; + std::istream& stream = compressed_stream_ ? *compressed_stream_ : in_; + uint32_t rec_len; + stream.read(reinterpret_cast(&rec_len), sizeof(uint32_t)); + std::string buf; + buf.resize(rec_len); + stream.read(&buf[0], rec_len); + PADDLE_ENFORCE_EQ(rec_len, stream.gcount()); + return buf; } - } // namespace recordio } // namespace paddle diff --git a/paddle/fluid/recordio/chunk.h b/paddle/fluid/recordio/chunk.h index 71a1556a33b..cfb954a5916 100644 --- a/paddle/fluid/recordio/chunk.h +++ b/paddle/fluid/recordio/chunk.h @@ -13,6 +13,7 @@ // limitations under the License. #pragma once +#include #include #include @@ -53,9 +54,20 @@ class Chunk { DISABLE_COPY_AND_ASSIGN(Chunk); }; -size_t CompressData(const char* in, size_t in_length, Compressor ct, char* out); +class ChunkParser { + public: + explicit ChunkParser(std::istream& sin); + + bool Init(); + std::string Next(); + bool HasNext() const; -void DeflateData(const char* in, size_t in_length, Compressor ct, char* out); + private: + Header header_; + uint32_t pos_{0}; + std::istream& in_; + std::unique_ptr compressed_stream_; +}; } // namespace recordio } // namespace paddle diff --git a/paddle/fluid/recordio/scanner.cc b/paddle/fluid/recordio/scanner.cc index 88b4d4001bc..06a13e6c5b6 100644 --- a/paddle/fluid/recordio/scanner.cc +++ b/paddle/fluid/recordio/scanner.cc @@ -22,35 +22,33 @@ namespace paddle { namespace recordio { Scanner::Scanner(std::unique_ptr &&stream) - : stream_(std::move(stream)) { + : stream_(std::move(stream)), parser_(*stream_) { Reset(); } -Scanner::Scanner(const std::string &filename) { - stream_.reset(new std::ifstream(filename)); +Scanner::Scanner(const std::string &filename) + : stream_(new std::ifstream(filename)), parser_(*stream_) { Reset(); } void Scanner::Reset() { stream_->clear(); stream_->seekg(0, std::ios::beg); - ParseNextChunk(); + parser_.Init(); } std::string Scanner::Next() { - PADDLE_ENFORCE(!eof_, "StopIteration"); - auto rec = cur_chunk_.Record(offset_++); - if (offset_ == cur_chunk_.NumRecords()) { - ParseNextChunk(); + if (stream_->eof()) { + return ""; } - return rec; -} -void Scanner::ParseNextChunk() { - eof_ = !cur_chunk_.Parse(*stream_); - offset_ = 0; + auto res = parser_.Next(); + if (!parser_.HasNext() && HasNext()) { + parser_.Init(); + } + return res; } -bool Scanner::HasNext() const { return !eof_; } +bool Scanner::HasNext() const { return !stream_->eof(); } } // namespace recordio } // namespace paddle diff --git a/paddle/fluid/recordio/scanner.h b/paddle/fluid/recordio/scanner.h index 34f1b0c78d6..0d885dd87a2 100644 --- a/paddle/fluid/recordio/scanner.h +++ b/paddle/fluid/recordio/scanner.h @@ -37,11 +37,7 @@ class Scanner { private: std::unique_ptr stream_; - Chunk cur_chunk_; - size_t offset_; - bool eof_; - - void ParseNextChunk(); + ChunkParser parser_; }; } // namespace recordio } // namespace paddle -- GitLab From 28dc9ba3c14edb2b3d8389080ba3ea06f60684c2 Mon Sep 17 00:00:00 2001 From: whs Date: Fri, 1 Jun 2018 15:13:48 +0800 Subject: [PATCH 116/913] Add shape op to get the shape of variable. (#11048) * Add shape op to get the shape of variable. * Rename get_shape to shape. * Add checker for output and fix comments. --- paddle/fluid/operators/shape_op.cc | 54 +++++++++++++++++++ paddle/fluid/operators/shape_op.cu | 20 +++++++ paddle/fluid/operators/shape_op.h | 38 +++++++++++++ python/paddle/fluid/layers/ops.py | 1 + .../fluid/tests/unittests/test_shape_op.py | 47 ++++++++++++++++ 5 files changed, 160 insertions(+) create mode 100644 paddle/fluid/operators/shape_op.cc create mode 100644 paddle/fluid/operators/shape_op.cu create mode 100644 paddle/fluid/operators/shape_op.h create mode 100644 python/paddle/fluid/tests/unittests/test_shape_op.py diff --git a/paddle/fluid/operators/shape_op.cc b/paddle/fluid/operators/shape_op.cc new file mode 100644 index 00000000000..c75fce7959d --- /dev/null +++ b/paddle/fluid/operators/shape_op.cc @@ -0,0 +1,54 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ + +#include "paddle/fluid/operators/shape_op.h" +#include "paddle/fluid/framework/op_registry.h" + +namespace paddle { +namespace operators { + +class ShapeOp : public framework::OperatorWithKernel { + public: + using framework::OperatorWithKernel::OperatorWithKernel; + + void InferShape(framework::InferShapeContext *ctx) const override { + PADDLE_ENFORCE(ctx->HasInput("Input"), + "Input (Input) of get_shape op should not be null."); + PADDLE_ENFORCE(ctx->HasOutput("Out"), + "Output (Out) of get_shape op should not be null."); + auto in_dim = ctx->GetInputDim("Input"); + ctx->SetOutputDim("Out", {in_dim.size()}); + } +}; + +class ShapeOpMaker : public framework::OpProtoAndCheckerMaker { + public: + void Make() override { + AddInput("Input", "(Tensor), The input tensor."); + AddOutput("Out", "(Tensor), The shape of input tensor."); + AddComment(R"DOC( +Shape Operator. +Get the shape of input tensor. +)DOC"); + } +}; + +} // namespace operators +} // namespace paddle + +namespace ops = paddle::operators; +REGISTER_OPERATOR(shape, ops::ShapeOp, ops::ShapeOpMaker, + paddle::framework::EmptyGradOpMaker); +REGISTER_OP_CPU_KERNEL(shape, ops::ShapeKernel, ops::ShapeKernel, + ops::ShapeKernel, ops::ShapeKernel); diff --git a/paddle/fluid/operators/shape_op.cu b/paddle/fluid/operators/shape_op.cu new file mode 100644 index 00000000000..7736a2a1e13 --- /dev/null +++ b/paddle/fluid/operators/shape_op.cu @@ -0,0 +1,20 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ + +#include "paddle/fluid/operators/shape_op.h" + +REGISTER_OP_CUDA_KERNEL(shape, paddle::operators::ShapeKernel, + paddle::operators::ShapeKernel, + paddle::operators::ShapeKernel, + paddle::operators::ShapeKernel); diff --git a/paddle/fluid/operators/shape_op.h b/paddle/fluid/operators/shape_op.h new file mode 100644 index 00000000000..3be86b66a53 --- /dev/null +++ b/paddle/fluid/operators/shape_op.h @@ -0,0 +1,38 @@ +/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ + +#pragma once +#include +#include "paddle/fluid/framework/op_registry.h" + +namespace paddle { +namespace operators { + +using Tensor = framework::Tensor; + +template +class ShapeKernel : public framework::OpKernel { + public: + void Compute(const framework::ExecutionContext& ctx) const override { + auto* in_t = ctx.Input("Input"); + auto* out_t = ctx.Output("Out"); + auto out_data = out_t->mutable_data(platform::CPUPlace()); + auto in_dims = in_t->dims(); + for (int i = 0; i < in_dims.size(); ++i) { + out_data[i] = in_dims[i]; + } + } +}; +} // namespace operators +} // namespace paddle diff --git a/python/paddle/fluid/layers/ops.py b/python/paddle/fluid/layers/ops.py index a9fe25744cc..60f8cbbfa71 100644 --- a/python/paddle/fluid/layers/ops.py +++ b/python/paddle/fluid/layers/ops.py @@ -71,6 +71,7 @@ __all__ = [ 'cumsum', 'scatter', 'sum', + 'shape', ] + __activations__ for _OP in set(__all__): diff --git a/python/paddle/fluid/tests/unittests/test_shape_op.py b/python/paddle/fluid/tests/unittests/test_shape_op.py new file mode 100644 index 00000000000..a62ee050075 --- /dev/null +++ b/python/paddle/fluid/tests/unittests/test_shape_op.py @@ -0,0 +1,47 @@ +# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest +import numpy as np +from op_test import OpTest + + +class TestShapeOp(OpTest): + def setUp(self): + self.op_type = "shape" + self.config() + self.shape = [2, 3] + input = np.zeros(self.shape) + self.inputs = {'Input': input} + self.outputs = {'Out': np.array(self.shape)} + + def config(self): + self.shape = [2, 3] + + def test_check_output(self): + self.check_output() + + +class case1(TestShapeOp): + def config(self): + self.shape = [2] + + +class case2(TestShapeOp): + def config(self): + self.shape = [1, 2, 3] + + +if __name__ == '__main__': + unittest.main() -- GitLab From 86d8659c8de7e91c066935e723da29f31ffd6364 Mon Sep 17 00:00:00 2001 From: whs Date: Fri, 1 Jun 2018 15:14:08 +0800 Subject: [PATCH 117/913] Add python wrapper for gather op. (#11033) * Add python wrapper for gather op. * Add unitest for 'rank==1' and fix comments. * Fix comments. --- doc/fluid/api/layers.rst | 6 +++ paddle/fluid/operators/gather_op.cc | 1 - python/paddle/fluid/layers/nn.py | 51 ++++++++++++++++++- .../fluid/tests/unittests/test_gather_op.py | 15 +++++- 4 files changed, 69 insertions(+), 4 deletions(-) diff --git a/doc/fluid/api/layers.rst b/doc/fluid/api/layers.rst index f53da4d194f..dbb99d3c03f 100644 --- a/doc/fluid/api/layers.rst +++ b/doc/fluid/api/layers.rst @@ -1009,3 +1009,9 @@ ____ .. autofunction:: paddle.fluid.layers.upsampling_bilinear2d :noindex: +gather +____ + +.. autofunction:: paddle.fluid.layers.gather + :noindex: + diff --git a/paddle/fluid/operators/gather_op.cc b/paddle/fluid/operators/gather_op.cc index e21b5725892..aa3e05b83b2 100644 --- a/paddle/fluid/operators/gather_op.cc +++ b/paddle/fluid/operators/gather_op.cc @@ -33,7 +33,6 @@ class GatherOp : public framework::OperatorWithKernel { auto index_dims = ctx->GetInputDim("Index"); PADDLE_ENFORCE(index_dims.size() == 1); int batch_size = ctx->GetInputDim("Index")[0]; - PADDLE_ENFORCE_GE(batch_size, 0, "Batch size must be >0"); framework::DDim output_dims(ctx->GetInputDim("X")); output_dims[0] = batch_size; ctx->SetOutputDim("Out", output_dims); diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index cb87653c477..56f5c6b4bed 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -82,6 +82,7 @@ __all__ = [ 'roi_pool', 'dice_loss', 'upsampling_bilinear2d', + 'gather', 'random_crop', ] @@ -3889,7 +3890,6 @@ def roi_pool(input, rois, pooled_height=1, pooled_width=1, spatial_scale=1.0): def dice_loss(input, label, epsilon=0.00001): """ - **Dice loss Layer** Dice loss for comparing the similarity of two batch of data, usually is used for binary image segmentation i.e. labels are binary. The dice loss can be defined as below equation: @@ -3999,6 +3999,55 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): return out +def gather(input, index): + """ + Output is obtained by gathering entries of the outer-most dimension + of X indexed by `index` and concatenate them together. + + .. math:: + + Out = X[Index] + + + .. code-block:: text + + + Given: + + X = [[1, 2], + [3, 4], + [5, 6]] + + Index = [1, 2] + + Then: + + Out = [[3, 4], + [5, 6]] + + Args: + input (Variable): The source input with rank>=1. + index (Variable): The index input with rank=1. + + Returns: + output (Variable): The output is a tensor with the same rank as input. + + Examples: + .. code-block:: python + + output = fluid.layers.gather(x, index) + """ + helper = LayerHelper('gather', **locals()) + dtype = helper.input_dtype() + out = helper.create_tmp_variable(dtype) + helper.append_op( + type="gather", + inputs={"X": input, + "Index": index}, + outputs={"Out": out}) + return out + + def random_crop(input, shape, seed=1): helper = LayerHelper("random_crop", **locals()) dtype = helper.input_dtype() diff --git a/python/paddle/fluid/tests/unittests/test_gather_op.py b/python/paddle/fluid/tests/unittests/test_gather_op.py index 6fd043c27e2..4ae90864806 100644 --- a/python/paddle/fluid/tests/unittests/test_gather_op.py +++ b/python/paddle/fluid/tests/unittests/test_gather_op.py @@ -20,8 +20,9 @@ from op_test import OpTest class TestGatherOp(OpTest): def setUp(self): self.op_type = "gather" - xnp = np.random.random((10, 20)).astype("float32") - self.inputs = {'X': xnp, 'Index': np.array([1, 3, 5]).astype("int32")} + self.config() + xnp = np.random.random(self.x_shape).astype("float32") + self.inputs = {'X': xnp, 'Index': np.array(self.index).astype("int32")} self.outputs = {'Out': self.inputs["X"][self.inputs["Index"]]} def test_check_output(self): @@ -30,6 +31,16 @@ class TestGatherOp(OpTest): def test_check_grad(self): self.check_grad(['X'], 'Out') + def config(self): + self.x_shape = (10, 20) + self.index = [1, 3, 5] + + +class TestCase1(TestGatherOp): + def config(self): + self.x_shape = (10) + self.index = [1, 3, 5] + if __name__ == "__main__": unittest.main() -- GitLab From eacac49bcdd281f68d9fac2cba9dee2b245d0d17 Mon Sep 17 00:00:00 2001 From: minqiyang Date: Fri, 1 Jun 2018 15:15:26 +0800 Subject: [PATCH 118/913] 1. update test_split_var: replace split with slice --- .../{test_split_var.py => test_slice_var.py} | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) rename python/paddle/fluid/tests/unittests/{test_split_var.py => test_slice_var.py} (85%) diff --git a/python/paddle/fluid/tests/unittests/test_split_var.py b/python/paddle/fluid/tests/unittests/test_slice_var.py similarity index 85% rename from python/paddle/fluid/tests/unittests/test_split_var.py rename to python/paddle/fluid/tests/unittests/test_slice_var.py index 157def9b56e..82305b23a1a 100644 --- a/python/paddle/fluid/tests/unittests/test_split_var.py +++ b/python/paddle/fluid/tests/unittests/test_slice_var.py @@ -14,14 +14,14 @@ import math import unittest -from paddle.fluid.transpiler.distribute_transpiler import split_variable +from paddle.fluid.transpiler.distribute_transpiler import slice_variable import paddle.fluid as fluid import paddle.fluid.core as core import random -class TestSplitVar(unittest.TestCase): - def check_split_output(self, shapes, expected_sizes, min_size): +class TestSliceVar(unittest.TestCase): + def check_slice_output(self, shapes, expected_sizes, min_size): var_list = [] program = fluid.Program() for shape in shapes: @@ -31,7 +31,7 @@ class TestSplitVar(unittest.TestCase): # dtype=core.VarDesc.VarType.LOD_TENSOR, shape=shape) var_list.append(var) - blocks = split_variable(var_list, 10, min_size) + blocks = slice_variable(var_list, 10, min_size) all_sizes = [] for s in expected_sizes: for s2 in s: @@ -49,7 +49,7 @@ class TestSplitVar(unittest.TestCase): [1150, 1150, 1150, 1150, 1150, 1150, 1100] ] - self.check_split_output(shapes, expected_sizes, 1024) + self.check_slice_output(shapes, expected_sizes, 1024) def test_check_output_8k(self): shapes = [[3, 5], [1024], [28, 784], [8, 1020], [800, 10], @@ -57,7 +57,7 @@ class TestSplitVar(unittest.TestCase): expected_sizes = [[15], [1024], [10976, 10976], [8160], [8000], [35937, 35937, 35937, 35937, 35937, 35937]] - self.check_split_output(shapes, expected_sizes, 8192) + self.check_slice_output(shapes, expected_sizes, 8192) if __name__ == '__main__': -- GitLab From 18d640255efb6807a360c29d6e1c672aa679818a Mon Sep 17 00:00:00 2001 From: Yan Chunwei Date: Fri, 1 Jun 2018 15:38:45 +0800 Subject: [PATCH 119/913] simplify inference api (#11104) --- .../contrib/inference/paddle_inference_api.h | 40 +++++++++++-------- .../inference/paddle_inference_api_impl.cc | 22 +++++----- .../test_paddle_inference_api_impl.cc | 1 - 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/paddle/contrib/inference/paddle_inference_api.h b/paddle/contrib/inference/paddle_inference_api.h index b4c7f9bef4d..5fe8399762b 100644 --- a/paddle/contrib/inference/paddle_inference_api.h +++ b/paddle/contrib/inference/paddle_inference_api.h @@ -40,14 +40,23 @@ struct PaddleBuf { struct PaddleTensor { std::string name; // variable name. std::vector shape; + // TODO(Superjomn) for LoD support, add a vector> field if needed. PaddleBuf data; // blob of data. PaddleDType dtype; }; +enum class PaddleEngineKind { + kNative = 0, // Use the native Fluid facility. + // TODO(Superjomn) support following engines latter. + // kAnakin, // Use Anakin for inference. + // kTensorRT, // Use TensorRT for inference. + // kAutoMixedAnakin, // Automatically mix Fluid with Anakin. + // kAutoMixedTensorRT, // Automatically mix Fluid with TensorRT. +}; + /* * A simple Inference API for Paddle. Currently this API can be used by * non-sequence scenerios. - * TODO(Superjomn) Support another API for NLP-related usages. */ class PaddlePredictor { public: @@ -69,15 +78,6 @@ class PaddlePredictor { // Destroy the Predictor. virtual ~PaddlePredictor() {} - enum class EngineKind { - kNative = -1, // Use the native Fluid facility. - // TODO(Superjomn) support latter. - // kAnakin, // Use Anakin for inference. - // kTensorRT, // Use TensorRT for inference. - // kAutoMixedAnakin, // Automatically mix Fluid with Anakin. - // kAutoMixedTensorRT, // Automatically mix Fluid with TensorRT. - }; - // The common configs for all the predictors. struct Config { std::string model_dir; // path to the model directory. @@ -86,18 +86,24 @@ class PaddlePredictor { }; struct NativeConfig : public PaddlePredictor::Config { + // GPU related fields. bool use_gpu{false}; - int device; - float fraction_of_gpu_memory; + int device{0}; + float fraction_of_gpu_memory{-1.f}; // Negative to notify initialization. + std::string prog_file; std::string param_file; - bool share_variables; }; -// A factory to help create difference predictor. -template < - typename ConfigT, - PaddlePredictor::EngineKind engine = PaddlePredictor::EngineKind::kNative> +// A factory to help create different predictors. +// +// FOR EXTENSION DEVELOPER: +// Different predictors are designated by config type and engine kind. Similar +// configs can be merged, but there shouldn't be a huge config containing +// different fields for more than one kind of predictors. +// +// Similarly, each engine kind should map to a unique predictor implementation. +template std::unique_ptr CreatePaddlePredictor(const ConfigT& config); } // namespace paddle diff --git a/paddle/contrib/inference/paddle_inference_api_impl.cc b/paddle/contrib/inference/paddle_inference_api_impl.cc index 989252f69e4..99a64662d4d 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/paddle_inference_api_impl.cc @@ -57,8 +57,7 @@ std::string num2str(T a) { bool NativePaddlePredictor::Init() { VLOG(3) << "Predictor::init()"; - // TODO(panyx0718): Should CPU vs GPU device be decided by id? - if (config_.device >= 0) { + if (config_.use_gpu) { place_ = paddle::platform::CUDAPlace(config_.device); } else { place_ = paddle::platform::CPUPlace(); @@ -85,11 +84,13 @@ bool NativePaddlePredictor::Init() { } ctx_ = executor_->Prepare(*inference_program_, 0); - // Create variables - // TODO(panyx0718): Why need to test share_variables here? - if (config_.share_variables) { - executor_->CreateVariables(*inference_program_, scope_.get(), 0); - } + // Create temporary variables first, so that the first batch do not need to + // create variables in the runtime. This is the logics of the old inference + // API. + // TODO(Superjomn) this should be modified when `Clone` is valid for + // multi-thread application. + executor_->CreateVariables(*inference_program_, scope_.get(), 0); + // Get the feed_target_names and fetch_target_names feed_target_names_ = inference_program_->GetFeedTargetNames(); fetch_target_names_ = inference_program_->GetFetchTargetNames(); @@ -124,7 +125,7 @@ bool NativePaddlePredictor::Run(const std::vector &inputs, scope_.get(), &feed_targets, &fetch_targets, - !config_.share_variables); + false /* don't create variable eatch time */); if (!GetFetch(fetchs, output_data)) { LOG(ERROR) << "fail to get fetchs"; return false; @@ -242,11 +243,14 @@ bool NativePaddlePredictor::GetFetch( template <> std::unique_ptr -CreatePaddlePredictor( +CreatePaddlePredictor( const NativeConfig &config) { VLOG(3) << "create NativePaddlePredictor"; if (config.use_gpu) { // 1. GPU memeroy + PADDLE_ENFORCE( + config.fraction_of_gpu_memory > 0.f, + "fraction_of_gpu_memory in the config should be set to range (0., 1.]"); std::vector flags; if (config.fraction_of_gpu_memory >= 0.0f || config.fraction_of_gpu_memory <= 0.95f) { diff --git a/paddle/contrib/inference/test_paddle_inference_api_impl.cc b/paddle/contrib/inference/test_paddle_inference_api_impl.cc index 5240fc2f202..07b17acd484 100644 --- a/paddle/contrib/inference/test_paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/test_paddle_inference_api_impl.cc @@ -47,7 +47,6 @@ NativeConfig GetConfig() { config.fraction_of_gpu_memory = 0.15; config.use_gpu = true; config.device = 0; - config.share_variables = true; return config; } -- GitLab From 0c0c5df4cbed8a9c947fd2819640e9d402555ed1 Mon Sep 17 00:00:00 2001 From: Yan Chunwei Date: Fri, 1 Jun 2018 15:39:30 +0800 Subject: [PATCH 120/913] feature/add TRT fc converter (#11043) --- .../inference/tensorrt/convert/CMakeLists.txt | 2 + .../inference/tensorrt/convert/conv2d_op.cc | 3 +- .../fluid/inference/tensorrt/convert/fc_op.cc | 119 ++++++++++++++++++ .../inference/tensorrt/convert/mul_op.cc | 5 +- .../inference/tensorrt/convert/op_converter.h | 41 ++++-- .../inference/tensorrt/convert/test_fc_op.cc | 46 +++++++ .../inference/tensorrt/convert/test_mul_op.cc | 4 +- .../tensorrt/convert/test_op_converter.cc | 7 +- .../inference/tensorrt/convert/ut_helper.h | 40 +++--- paddle/fluid/inference/tensorrt/engine.cc | 1 + paddle/fluid/inference/tensorrt/engine.h | 4 +- paddle/fluid/operators/tensorrt_engine_op.cc | 3 +- 12 files changed, 240 insertions(+), 35 deletions(-) create mode 100644 paddle/fluid/inference/tensorrt/convert/fc_op.cc create mode 100644 paddle/fluid/inference/tensorrt/convert/test_fc_op.cc diff --git a/paddle/fluid/inference/tensorrt/convert/CMakeLists.txt b/paddle/fluid/inference/tensorrt/convert/CMakeLists.txt index 5ada1d63126..23ca8bfac84 100644 --- a/paddle/fluid/inference/tensorrt/convert/CMakeLists.txt +++ b/paddle/fluid/inference/tensorrt/convert/CMakeLists.txt @@ -8,3 +8,5 @@ nv_test(test_op_converter SRCS test_op_converter.cc mul_op.cc conv2d_op.cc DEPS nv_test(test_io_converter SRCS test_io_converter.cc io_converter.cc DEPS dynload_cuda dynamic_loader lod_tensor) nv_test(test_trt_mul_op SRCS test_mul_op.cc mul_op.cc DEPS ${FLUID_CORE_MODULES} tensorrt_engine mul_op SERIAL) +nv_test(test_trt_fc_op SRCS test_fc_op.cc fc_op.cc + DEPS ${FLUID_CORE_MODULES} tensorrt_engine mul_op SERIAL) diff --git a/paddle/fluid/inference/tensorrt/convert/conv2d_op.cc b/paddle/fluid/inference/tensorrt/convert/conv2d_op.cc index 209936c3baf..668d344f1bb 100644 --- a/paddle/fluid/inference/tensorrt/convert/conv2d_op.cc +++ b/paddle/fluid/inference/tensorrt/convert/conv2d_op.cc @@ -21,7 +21,8 @@ namespace tensorrt { class Conv2dOpConverter : public OpConverter { public: Conv2dOpConverter() {} - void operator()(const framework::proto::OpDesc& op) override { + void operator()(const framework::proto::OpDesc& op, + const framework::Scope& scope) override { LOG(INFO) << "convert a fluid conv2d op to tensorrt conv layer without bias"; } diff --git a/paddle/fluid/inference/tensorrt/convert/fc_op.cc b/paddle/fluid/inference/tensorrt/convert/fc_op.cc new file mode 100644 index 00000000000..bd05608d762 --- /dev/null +++ b/paddle/fluid/inference/tensorrt/convert/fc_op.cc @@ -0,0 +1,119 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ + +#include "paddle/fluid/framework/eigen.h" +#include "paddle/fluid/framework/lod_tensor.h" +#include "paddle/fluid/framework/op_registry.h" +#include "paddle/fluid/inference/tensorrt/convert/op_converter.h" +#include "paddle/fluid/inference/tensorrt/engine.h" +#include "paddle/fluid/platform/place.h" + +namespace paddle { +namespace inference { +namespace tensorrt { + +// Reorder the elements from istrides to ostrides, borrowed from TRT convert in +// tensorflow. +// https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/tensorrt/convert/convert_nodes.cc#L318 +template +void Reorder2(nvinfer1::DimsHW shape, const T* idata, nvinfer1::DimsHW istrides, + T* odata, nvinfer1::DimsHW ostrides) { + for (int h = 0; h < shape.h(); ++h) { + for (int w = 0; w < shape.w(); ++w) { + odata[h * ostrides.h() + w * ostrides.w()] = + idata[h * ostrides.h() + w * ostrides.w()]; + } + } +} + +// Reorder the data layout from CK to KC. +void ReorderCKtoKC(TensorRTEngine::Weight& iweights, + TensorRTEngine::Weight* oweights) { + int c = iweights.dims[0]; + int k = iweights.dims[1]; + oweights->dims.assign({k, c}); + nvinfer1::DimsHW istrides = {1, k}; + nvinfer1::DimsHW ostrides = {c, 1}; + Reorder2({k, c}, static_cast(iweights.get().values), istrides, + static_cast(const_cast(oweights->get().values)), + ostrides); +} + +/* + * FC converter convert a MUL op in Fluid to a FC layer in TRT. + */ +class FcOpConverter : public OpConverter { + public: + void operator()(const framework::proto::OpDesc& op, + const framework::Scope& scope) override { + VLOG(4) << "convert a fluid fc op to tensorrt fc layer without bias"; + + framework::OpDesc op_desc(op, nullptr, nullptr); + PADDLE_ENFORCE_EQ(op_desc.Input("X").size(), 1); + PADDLE_ENFORCE_EQ(op_desc.Input("Y").size(), 1); // Y is a weight + PADDLE_ENFORCE_EQ(op_desc.Output("Out").size(), 1); + + // Declare inputs + auto* X = engine_->GetITensor(op_desc.Input("X").front()); + + // Declare weights + auto* Y_v = scope.FindVar(op_desc.Input("Y").front()); + PADDLE_ENFORCE_NOT_NULL(Y_v); + auto* Y_t = Y_v->GetMutable(); + // This may trigger a GPU->CPU copy, because TRT's weight can only be + // assigned from CPU memory, that can't be avoided. + auto* weight_data = Y_t->mutable_data(platform::CPUPlace()); + PADDLE_ENFORCE_EQ(Y_t->dims().size(), 2UL); // a matrix + size_t n_output = Y_t->dims()[1]; + + framework::LoDTensor tmp; + tmp.Resize(Y_t->dims()); + memcpy(tmp.mutable_data(platform::CPUPlace()), Y_t->data(), + Y_t->dims()[0] * Y_t->dims()[1]); + + TensorRTEngine::Weight weight{nvinfer1::DataType::kFLOAT, + static_cast(weight_data), + Y_t->memory_size() / sizeof(float)}; + TensorRTEngine::Weight tmp_weight(nvinfer1::DataType::kFLOAT, + static_cast(tmp.data()), + Y_t->memory_size() / sizeof(float)); + weight.dims.assign({Y_t->dims()[0], Y_t->dims()[1]}); + tmp_weight.dims = weight.dims; + + // The data layout of TRT FC layer's weight is different from fluid's FC, + // need to reorder the elements. + ReorderCKtoKC(tmp_weight, &weight); + + // Currently, the framework can only handle one fluid op -> one TRT layer, + // but fc fuses `mul` and `bias` (2 fluid ops), so here is a trick, just + // handle `mul`, leave `add` as another layer. + // DEBUG + TensorRTEngine::Weight bias{nvinfer1::DataType::kFLOAT, nullptr, 0}; + + auto* layer = TRT_ENGINE_ADD_LAYER(engine_, FullyConnected, + *const_cast(X), + n_output, weight.get(), bias.get()); + + auto output_name = op_desc.Output("Out").front(); + engine_->DeclareOutput(layer, 0, output_name); + } +}; + +REGISTER_TRT_OP_CONVERTER(fc, FcOpConverter); + +} // namespace tensorrt +} // namespace inference +} // namespace paddle + +USE_OP(mul); diff --git a/paddle/fluid/inference/tensorrt/convert/mul_op.cc b/paddle/fluid/inference/tensorrt/convert/mul_op.cc index aa8e66490f7..6bb07709c7e 100644 --- a/paddle/fluid/inference/tensorrt/convert/mul_op.cc +++ b/paddle/fluid/inference/tensorrt/convert/mul_op.cc @@ -24,8 +24,9 @@ namespace tensorrt { class MulOpConverter : public OpConverter { public: MulOpConverter() {} - void operator()(const framework::proto::OpDesc& op) override { - VLOG(4) << "convert a fluid mul op to tensorrt fc layer without bias"; + void operator()(const framework::proto::OpDesc& op, + const framework::Scope& scope) override { + VLOG(4) << "convert a fluid mul op to tensorrt mul layer without bias"; framework::OpDesc op_desc(op, nullptr); // Declare inputs diff --git a/paddle/fluid/inference/tensorrt/convert/op_converter.h b/paddle/fluid/inference/tensorrt/convert/op_converter.h index 1cd3ed9a00a..4d21e241c0f 100644 --- a/paddle/fluid/inference/tensorrt/convert/op_converter.h +++ b/paddle/fluid/inference/tensorrt/convert/op_converter.h @@ -31,27 +31,42 @@ namespace tensorrt { class OpConverter { public: OpConverter() {} - virtual void operator()(const framework::proto::OpDesc& op) {} - void Run(const framework::proto::OpDesc& op, TensorRTEngine* engine) { - std::string type = op.type(); - auto* it = Registry::Lookup(type); - PADDLE_ENFORCE_NOT_NULL(it, "no OpConverter for optype [%s]", type); - it->SetEngine(engine); - (*it)(op); - } + // Converter logic for an op. + virtual void operator()(const framework::proto::OpDesc& op, + const framework::Scope& scope) {} + + // Convert a single fluid operaotr and add the corresponding layer to TRT. + void ConvertOp(const framework::proto::OpDesc& op, + const std::unordered_set& parameters, + const framework::Scope& scope, TensorRTEngine* engine) { + framework::OpDesc op_desc(op, nullptr, nullptr); + + OpConverter* it{nullptr}; - // convert fluid op to tensorrt layer - void ConvertOp(const framework::proto::OpDesc& op, TensorRTEngine* engine) { - OpConverter::Run(op, engine); + if (op_desc.Type() == "mul") { + PADDLE_ENFORCE_EQ(op_desc.Input("Y").size(), 1UL); + std::string Y = op_desc.Input("Y")[0]; + if (parameters.count(Y)) { + it = Registry::Lookup("fc"); + } + } + if (!it) { + it = Registry::Lookup(op_desc.Type()); + } + PADDLE_ENFORCE_NOT_NULL(it, "no OpConverter for optype [%s]", + op_desc.Type()); + it->SetEngine(engine); + (*it)(op, scope); } // convert fluid block to tensorrt network void ConvertBlock(const framework::proto::BlockDesc& block, - TensorRTEngine* engine) { + const std::unordered_set& parameters, + const framework::Scope& scope, TensorRTEngine* engine) { for (int i = 0; i < block.ops_size(); i++) { const auto& op = block.ops(i); - OpConverter::Run(op, engine); + ConvertOp(op, parameters, scope, engine); } } diff --git a/paddle/fluid/inference/tensorrt/convert/test_fc_op.cc b/paddle/fluid/inference/tensorrt/convert/test_fc_op.cc new file mode 100644 index 00000000000..a30253072ac --- /dev/null +++ b/paddle/fluid/inference/tensorrt/convert/test_fc_op.cc @@ -0,0 +1,46 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ + +#include +#include "paddle/fluid/inference/tensorrt/convert/op_converter.h" +#include "paddle/fluid/inference/tensorrt/convert/ut_helper.h" + +namespace paddle { +namespace inference { +namespace tensorrt { + +TEST(fc_op, test) { + std::unordered_set parameters({"mul-Y"}); + framework::Scope scope; + TRTConvertValidation validator(20, parameters, scope, 1000); + + validator.DeclInputVar("mul-X", nvinfer1::Dims4(8, 3, 1, 1)); + validator.DeclParamVar("mul-Y", nvinfer1::Dims2(3, 2)); + validator.DeclOutputVar("mul-Out", nvinfer1::Dims2(8, 2)); + + // Prepare Op description + framework::OpDesc desc; + desc.SetType("mul"); + desc.SetInput("X", {"mul-X"}); + desc.SetInput("Y", {"mul-Y"}); + desc.SetOutput("Out", {"mul-Out"}); + + validator.SetOp(*desc.Proto()); + + validator.Execute(10); +} + +} // namespace tensorrt +} // namespace inference +} // namespace paddle diff --git a/paddle/fluid/inference/tensorrt/convert/test_mul_op.cc b/paddle/fluid/inference/tensorrt/convert/test_mul_op.cc index d8b61d5f08f..1ce1130e5d6 100644 --- a/paddle/fluid/inference/tensorrt/convert/test_mul_op.cc +++ b/paddle/fluid/inference/tensorrt/convert/test_mul_op.cc @@ -21,7 +21,9 @@ namespace inference { namespace tensorrt { TEST(MulOpConverter, main) { - TRTConvertValidation validator(10, 1000); + framework::Scope scope; + std::unordered_set parameters; + TRTConvertValidation validator(10, parameters, scope, 1000); validator.DeclInputVar("mul-X", nvinfer1::Dims2(10, 6)); validator.DeclInputVar("mul-Y", nvinfer1::Dims2(6, 10)); validator.DeclOutputVar("mul-Out", nvinfer1::Dims2(10, 10)); diff --git a/paddle/fluid/inference/tensorrt/convert/test_op_converter.cc b/paddle/fluid/inference/tensorrt/convert/test_op_converter.cc index 9ae7de9cbfa..1d3f5eabb2f 100644 --- a/paddle/fluid/inference/tensorrt/convert/test_op_converter.cc +++ b/paddle/fluid/inference/tensorrt/convert/test_op_converter.cc @@ -12,9 +12,10 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ +#include "paddle/fluid/inference/tensorrt/convert/op_converter.h" + #include #include "paddle/fluid/framework/program_desc.h" -#include "paddle/fluid/inference/tensorrt/convert/op_converter.h" namespace paddle { namespace inference { @@ -27,7 +28,9 @@ TEST(OpConverter, ConvertBlock) { conv2d_op->SetType("conv2d"); OpConverter converter; - converter.ConvertBlock(*block->Proto(), nullptr /*TensorRTEngine*/); + framework::Scope scope; + converter.ConvertBlock(*block->Proto(), {}, scope, + nullptr /*TensorRTEngine*/); } } // namespace tensorrt diff --git a/paddle/fluid/inference/tensorrt/convert/ut_helper.h b/paddle/fluid/inference/tensorrt/convert/ut_helper.h index 684bbc208fc..d7e05dd5b5b 100644 --- a/paddle/fluid/inference/tensorrt/convert/ut_helper.h +++ b/paddle/fluid/inference/tensorrt/convert/ut_helper.h @@ -61,7 +61,10 @@ class TRTConvertValidation { public: TRTConvertValidation() = delete; - explicit TRTConvertValidation(int batch_size, int workspace_size = 1024) { + TRTConvertValidation(int batch_size, + const std::unordered_set& parameters, + framework::Scope& scope, int workspace_size = 1 << 10) + : parameters_(parameters), scope_(scope) { // create engine. engine_.reset(new TensorRTEngine(10, 1 << 10, &stream_)); engine_->InitNetwork(); @@ -76,19 +79,22 @@ class TRTConvertValidation { engine_->DeclareInput(name, nvinfer1::DataType::kFLOAT, dims); } + // Declare a parameter varaible in the scope. + void DeclParamVar(const std::string& name, const nvinfer1::Dims& dims) { + DeclVar(name, dims); + } + void DeclOutputVar(const std::string& name, const nvinfer1::Dims& dims) { DeclVar(name, dims); } + // Declare a variable in a fluid Scope. void DeclVar(const std::string& name, const nvinfer1::Dims& dims) { platform::CPUPlace place; platform::CPUDeviceContext ctx(place); // Init Fluid tensor. - std::vector dim_vec(dims.nbDims); - for (int i = 0; i < dims.nbDims; i++) { - dim_vec[i] = dims.d[i]; - } + std::vector dim_vec(dims.d, dims.d + dims.nbDims); auto* x = scope_.Var(name); auto* x_tensor = x->GetMutable(); x_tensor->Resize(framework::make_ddim(dim_vec)); @@ -99,7 +105,7 @@ class TRTConvertValidation { op_ = framework::OpRegistry::CreateOp(desc); OpConverter op_converter; - op_converter.ConvertOp(desc, engine_.get()); + op_converter.ConvertOp(desc, parameters_, scope_, engine_.get()); engine_->FreezeNetwork(); @@ -108,11 +114,13 @@ class TRTConvertValidation { // Set Inputs. for (const auto& input : op_desc_->InputArgumentNames()) { + if (parameters_.count(input)) continue; auto* var = scope_.FindVar(input); PADDLE_ENFORCE(var); auto tensor = var->GetMutable(); + engine_->SetInputFromCPU( - input, static_cast(tensor->data()), + input, static_cast(tensor->data()), sizeof(float) * analysis::AccuDims(tensor->dims(), tensor->dims().size())); } @@ -120,18 +128,21 @@ class TRTConvertValidation { void Execute(int batch_size) { // Execute Fluid Op - // Execute TRT platform::CPUPlace place; platform::CPUDeviceContext ctx(place); - engine_->Execute(batch_size); - op_->Run(scope_, place); + // Execute TRT. + engine_->Execute(batch_size); + cudaStreamSynchronize(*engine_->stream()); ASSERT_FALSE(op_desc_->OutputArgumentNames().empty()); + const size_t output_space_size = 200; for (const auto& output : op_desc_->OutputArgumentNames()) { std::vector fluid_out; - std::vector trt_out(200); - engine_->GetOutputInCPU(output, &trt_out[0], 200 * sizeof(float)); + std::vector trt_out(output_space_size); + engine_->GetOutputInCPU(output, &trt_out[0], + output_space_size * sizeof(float)); + cudaStreamSynchronize(*engine_->stream()); auto* var = scope_.FindVar(output); auto tensor = var->GetMutable(); @@ -139,7 +150,7 @@ class TRTConvertValidation { // Compare two output ASSERT_FALSE(fluid_out.empty()); for (size_t i = 0; i < fluid_out.size(); i++) { - EXPECT_LT(std::abs(fluid_out[i] - trt_out[i]), 0.001); + EXPECT_LT(std::abs(fluid_out[i] - trt_out[i]), 1e-6); } } } @@ -149,9 +160,10 @@ class TRTConvertValidation { private: std::unique_ptr engine_; cudaStream_t stream_; - framework::Scope scope_; std::unique_ptr op_; std::unique_ptr op_desc_; + const std::unordered_set& parameters_; + framework::Scope& scope_; }; } // namespace tensorrt diff --git a/paddle/fluid/inference/tensorrt/engine.cc b/paddle/fluid/inference/tensorrt/engine.cc index a88236ae98e..3d75fefc1a7 100644 --- a/paddle/fluid/inference/tensorrt/engine.cc +++ b/paddle/fluid/inference/tensorrt/engine.cc @@ -106,6 +106,7 @@ void TensorRTEngine::DeclareOutput(const nvinfer1::ILayer* layer, int offset, name); auto* output = layer->getOutput(offset); + SetITensor(name, output); PADDLE_ENFORCE(output != nullptr); output->setName(name.c_str()); infer_network_->markOutput(*output); diff --git a/paddle/fluid/inference/tensorrt/engine.h b/paddle/fluid/inference/tensorrt/engine.h index d9d3163b66d..fabcfd9e80c 100644 --- a/paddle/fluid/inference/tensorrt/engine.h +++ b/paddle/fluid/inference/tensorrt/engine.h @@ -37,13 +37,15 @@ class TensorRTEngine : public EngineBase { // Weight is model parameter. class Weight { public: - Weight(nvinfer1::DataType dtype, void* value, int num_elem) { + Weight(nvinfer1::DataType dtype, void* value, size_t num_elem) { w_.type = dtype; w_.values = value; w_.count = num_elem; } const nvinfer1::Weights& get() { return w_; } + std::vector dims; + private: nvinfer1::Weights w_; }; diff --git a/paddle/fluid/operators/tensorrt_engine_op.cc b/paddle/fluid/operators/tensorrt_engine_op.cc index 83e768b4dc9..855157e7c4c 100644 --- a/paddle/fluid/operators/tensorrt_engine_op.cc +++ b/paddle/fluid/operators/tensorrt_engine_op.cc @@ -31,8 +31,9 @@ void paddle::operators::TensorRTEngineKernel::Prepare( auto max_workspace = context.Attr("max_workspace"); engine_.reset(new inference::tensorrt::TensorRTEngine( max_batch_, max_workspace, nullptr)); + // TODO(Superjomn) parameters should be passed after analysised from outside. inference::Singleton::Global().ConvertBlock( - block, engine_.get()); + block, {}, context.scope(), engine_.get()); engine_->FreezeNetwork(); } -- GitLab From 4a24c238c15212dd921bd0199beca6fc145cd62a Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 1 Jun 2018 15:43:34 +0800 Subject: [PATCH 121/913] refine code --- paddle/fluid/inference/io.cc | 2 +- .../tests/book/test_inference_nlp.cc | 86 +++++++++---------- paddle/fluid/inference/tests/test_helper.h | 3 - 3 files changed, 42 insertions(+), 49 deletions(-) diff --git a/paddle/fluid/inference/io.cc b/paddle/fluid/inference/io.cc index 98780b6881c..65db7c7b500 100644 --- a/paddle/fluid/inference/io.cc +++ b/paddle/fluid/inference/io.cc @@ -117,7 +117,7 @@ std::unique_ptr Load(framework::Executor* executor, std::string program_desc_str; VLOG(3) << "loading model from " << model_filename; ReadBinaryFile(model_filename, &program_desc_str); - // LOG(INFO) << program_desc_str; + std::unique_ptr main_program( new framework::ProgramDesc(program_desc_str)); diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index fba64efece8..962358d761c 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -24,23 +24,22 @@ limitations under the License. */ #include #endif -DEFINE_string(dirname, "", "Directory of the inference model."); +DEFINE_string(modelpath, "", "Directory of the inference model."); +DEFINE_string(datafile, "", "File of input index data."); DEFINE_int32(repeat, 100, "Running the inference program repeat times"); DEFINE_bool(use_mkldnn, false, "Use MKLDNN to run inference"); DEFINE_bool(prepare_vars, true, "Prepare variables before executor"); -DEFINE_bool(prepare_context, true, "Prepare Context before executor"); - DEFINE_int32(num_threads, 1, "Number of threads should be used"); -inline double get_current_ms() { +inline double GetCurrentMs() { struct timeval time; gettimeofday(&time, NULL); return 1e+3 * time.tv_sec + 1e-3 * time.tv_usec; } // return size of total words -size_t read_datasets(std::vector* out, - const std::string& filename) { +size_t LoadData(std::vector* out, + const std::string& filename) { size_t sz = 0; std::fstream fin(filename); std::string line; @@ -68,6 +67,23 @@ size_t read_datasets(std::vector* out, return sz; } +void SplitData( + const std::vector& datasets, + std::vector>* jobs, + const int num_threads) { + size_t s = 0; + jobs->resize(num_threads); + while (s < datasets.size()) { + for (auto it = jobs->begin(); it != jobs->end(); it++) { + it->emplace_back(&datasets[s]); + s++; + if (s >= datasets.size()) { + break; + } + } + } +} + void ThreadRunInfer( const int tid, paddle::framework::Executor* executor, paddle::framework::Scope* scope, @@ -80,7 +96,6 @@ void ThreadRunInfer( copy_program->SetFeedHolderName(feed_holder_name); copy_program->SetFetchHolderName(fetch_holder_name); - // 3. Get the feed_target_names and fetch_target_names const std::vector& feed_target_names = copy_program->GetFeedTargetNames(); const std::vector& fetch_target_names = @@ -95,51 +110,32 @@ void ThreadRunInfer( PADDLE_ENFORCE_EQ(feed_target_names.size(), 1UL); auto& inputs = jobs[tid]; - auto start_ms = get_current_ms(); + auto start_ms = GetCurrentMs(); for (size_t i = 0; i < inputs.size(); ++i) { feed_targets[feed_target_names[0]] = inputs[i]; executor->Run(*copy_program, scope, &feed_targets, &fetch_targets, true, true, feed_holder_name, fetch_holder_name); } - auto stop_ms = get_current_ms(); + auto stop_ms = GetCurrentMs(); LOG(INFO) << "Tid: " << tid << ", process " << inputs.size() << " samples, avg time per sample: " - << (stop_ms - start_ms) / inputs.size() << " ms"; } -void bcast_datasets( - const std::vector& datasets, - std::vector>* jobs, - const int num_threads) { - size_t s = 0; - jobs->resize(num_threads); - while (s < datasets.size()) { - for (auto it = jobs->begin(); it != jobs->end(); it++) { - it->emplace_back(&datasets[s]); - s++; - if (s >= datasets.size()) { - break; - } - } - } -} - TEST(inference, nlp) { - if (FLAGS_dirname.empty()) { - LOG(FATAL) << "Usage: ./example --dirname=path/to/your/model"; + if (FLAGS_modelpath.empty() || FLAGS_datafile.empty()) { + LOG(FATAL) << "Usage: ./example --modelpath=path/to/your/model " + << "--datafile=path/to/your/data"; } - LOG(INFO) << "FLAGS_dirname: " << FLAGS_dirname << std::endl; - std::string dirname = FLAGS_dirname; + LOG(INFO) << "Model Path: " << FLAGS_modelpath; + LOG(INFO) << "Data File: " << FLAGS_datafile; std::vector datasets; - size_t num_total_words = - read_datasets(&datasets, "/home/tangjian/paddle-tj/out.ids.txt"); - LOG(INFO) << "Number of dataset samples(seq len<1024): " << datasets.size(); + size_t num_total_words = LoadData(&datasets, FLAGS_datafile); + LOG(INFO) << "Number of samples (seq_len<1024): " << datasets.size(); LOG(INFO) << "Total number of words: " << num_total_words; const bool model_combined = false; - // 0. Call `paddle::framework::InitDevices()` initialize all the devices // 1. Define place, executor, scope auto place = paddle::platform::CPUPlace(); @@ -148,13 +144,14 @@ TEST(inference, nlp) { // 2. Initialize the inference_program and load parameters std::unique_ptr inference_program; - inference_program = InitProgram(&executor, scope, dirname, model_combined); + inference_program = + InitProgram(&executor, scope, FLAGS_modelpath, model_combined); if (FLAGS_use_mkldnn) { EnableMKLDNN(inference_program); } #ifdef PADDLE_WITH_MKLML - // only use 1 core per thread + // only use 1 thread number per std::thread omp_set_dynamic(0); omp_set_num_threads(1); mkl_set_num_threads(1); @@ -163,24 +160,23 @@ TEST(inference, nlp) { double start_ms = 0, stop_ms = 0; if (FLAGS_num_threads > 1) { std::vector> jobs; - bcast_datasets(datasets, &jobs, FLAGS_num_threads); + SplitData(datasets, &jobs, FLAGS_num_threads); std::vector> threads; for (int i = 0; i < FLAGS_num_threads; ++i) { threads.emplace_back(new std::thread(ThreadRunInfer, i, &executor, scope, std::ref(inference_program), std::ref(jobs))); } - start_ms = get_current_ms(); + start_ms = GetCurrentMs(); for (int i = 0; i < FLAGS_num_threads; ++i) { threads[i]->join(); } - stop_ms = get_current_ms(); - + stop_ms = GetCurrentMs(); } else { if (FLAGS_prepare_vars) { executor.CreateVariables(*inference_program, scope, 0); } - // always prepare context and burning first time + // always prepare context std::unique_ptr ctx; ctx = executor.Prepare(*inference_program, 0); @@ -198,14 +194,14 @@ TEST(inference, nlp) { PADDLE_ENFORCE_EQ(feed_target_names.size(), 1UL); std::map feed_targets; - // for data and run - start_ms = get_current_ms(); + // feed data and run + start_ms = GetCurrentMs(); for (size_t i = 0; i < datasets.size(); ++i) { feed_targets[feed_target_names[0]] = &(datasets[i]); executor.RunPreparedContext(ctx.get(), scope, &feed_targets, &fetch_targets, !FLAGS_prepare_vars); } - stop_ms = get_current_ms(); + stop_ms = GetCurrentMs(); } LOG(INFO) << "Total inference time with " << FLAGS_num_threads diff --git a/paddle/fluid/inference/tests/test_helper.h b/paddle/fluid/inference/tests/test_helper.h index 1f5551567c6..01b8dc0be66 100644 --- a/paddle/fluid/inference/tests/test_helper.h +++ b/paddle/fluid/inference/tests/test_helper.h @@ -182,9 +182,6 @@ void TestInference(const std::string& dirname, "init_program", paddle::platform::DeviceContextPool::Instance().Get(place)); inference_program = InitProgram(&executor, scope, dirname, is_combined); - // std::string binary_str; - // inference_program->Proto()->SerializeToString(&binary_str); - // LOG(INFO) << binary_str; if (use_mkldnn) { EnableMKLDNN(inference_program); } -- GitLab From 3206bcd9291833518289e73e37513cdbc29e96c7 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 1 Jun 2018 16:24:55 +0800 Subject: [PATCH 122/913] refine log and add QPS --- paddle/fluid/inference/tests/book/test_inference_nlp.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 962358d761c..378e1620a09 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -202,11 +202,13 @@ TEST(inference, nlp) { &fetch_targets, !FLAGS_prepare_vars); } stop_ms = GetCurrentMs(); + LOG(INFO) << "Tid: 0, process " << datasets.size() + << " samples, avg time per sample: " + << (stop_ms - start_ms) / datasets.size() << " ms"; } LOG(INFO) << "Total inference time with " << FLAGS_num_threads << " threads : " << (stop_ms - start_ms) / 1000.0 - << " sec, avg time per seq: " - << (stop_ms - start_ms) / datasets.size() << " ms"; + << " sec, QPS: " << datasets.size() / ((stop_ms - start_ms) / 1000); delete scope; } -- GitLab From 9503dbb173f76f7b68d4a6edc18ce31cf7865c30 Mon Sep 17 00:00:00 2001 From: Yan Chunwei Date: Fri, 1 Jun 2018 17:14:18 +0800 Subject: [PATCH 123/913] fix compile error (#11119) --- paddle/fluid/inference/tensorrt/convert/fc_op.cc | 2 +- paddle/fluid/inference/tensorrt/convert/op_converter.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/paddle/fluid/inference/tensorrt/convert/fc_op.cc b/paddle/fluid/inference/tensorrt/convert/fc_op.cc index bd05608d762..45b07955975 100644 --- a/paddle/fluid/inference/tensorrt/convert/fc_op.cc +++ b/paddle/fluid/inference/tensorrt/convert/fc_op.cc @@ -59,7 +59,7 @@ class FcOpConverter : public OpConverter { const framework::Scope& scope) override { VLOG(4) << "convert a fluid fc op to tensorrt fc layer without bias"; - framework::OpDesc op_desc(op, nullptr, nullptr); + framework::OpDesc op_desc(op, nullptr); PADDLE_ENFORCE_EQ(op_desc.Input("X").size(), 1); PADDLE_ENFORCE_EQ(op_desc.Input("Y").size(), 1); // Y is a weight PADDLE_ENFORCE_EQ(op_desc.Output("Out").size(), 1); diff --git a/paddle/fluid/inference/tensorrt/convert/op_converter.h b/paddle/fluid/inference/tensorrt/convert/op_converter.h index 4d21e241c0f..3beafeefd06 100644 --- a/paddle/fluid/inference/tensorrt/convert/op_converter.h +++ b/paddle/fluid/inference/tensorrt/convert/op_converter.h @@ -40,7 +40,7 @@ class OpConverter { void ConvertOp(const framework::proto::OpDesc& op, const std::unordered_set& parameters, const framework::Scope& scope, TensorRTEngine* engine) { - framework::OpDesc op_desc(op, nullptr, nullptr); + framework::OpDesc op_desc(op, nullptr); OpConverter* it{nullptr}; -- GitLab From 7e9f0790e0366ef8db3f48f83635400d4742ad71 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 1 Jun 2018 17:24:54 +0800 Subject: [PATCH 124/913] fix scope in thread --- paddle/fluid/inference/tests/book/test_inference_nlp.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 378e1620a09..f7788ccbf40 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -91,6 +91,8 @@ void ThreadRunInfer( const std::vector>& jobs) { auto copy_program = std::unique_ptr( new paddle::framework::ProgramDesc(*inference_program)); + auto& sub_scope = scope->NewScope(); + std::string feed_holder_name = "feed_" + paddle::string::to_string(tid); std::string fetch_holder_name = "fetch_" + paddle::string::to_string(tid); copy_program->SetFeedHolderName(feed_holder_name); @@ -113,10 +115,11 @@ void ThreadRunInfer( auto start_ms = GetCurrentMs(); for (size_t i = 0; i < inputs.size(); ++i) { feed_targets[feed_target_names[0]] = inputs[i]; - executor->Run(*copy_program, scope, &feed_targets, &fetch_targets, true, - true, feed_holder_name, fetch_holder_name); + executor->Run(*copy_program, &sub_scope, &feed_targets, &fetch_targets, + true, true, feed_holder_name, fetch_holder_name); } auto stop_ms = GetCurrentMs(); + scope->DeleteScope(&sub_scope); LOG(INFO) << "Tid: " << tid << ", process " << inputs.size() << " samples, avg time per sample: " << (stop_ms - start_ms) / inputs.size() << " ms"; -- GitLab From 47630a4a9e8b54dc27184586d22559b427525785 Mon Sep 17 00:00:00 2001 From: "yi.wu" Date: Fri, 1 Jun 2018 17:28:24 +0800 Subject: [PATCH 125/913] fluid benchmark support recordio reader --- benchmark/fluid/Dockerfile | 2 +- benchmark/fluid/README.md | 9 ++ benchmark/fluid/fluid_benchmark.py | 55 +++++--- benchmark/fluid/models/machine_translation.py | 2 + benchmark/fluid/models/mnist.py | 21 ++- benchmark/fluid/models/resnet.py | 20 ++- .../fluid/models/stacked_dynamic_lstm.py | 3 + benchmark/fluid/models/vgg.py | 21 ++- benchmark/fluid/recordio_converter.py | 133 ++++++++++++++++++ python/paddle/fluid/layers/io.py | 2 +- 10 files changed, 241 insertions(+), 27 deletions(-) create mode 100644 benchmark/fluid/recordio_converter.py diff --git a/benchmark/fluid/Dockerfile b/benchmark/fluid/Dockerfile index 46140a9d1be..5d98a9b3c42 100644 --- a/benchmark/fluid/Dockerfile +++ b/benchmark/fluid/Dockerfile @@ -19,4 +19,4 @@ ADD *.whl / RUN pip install /*.whl && rm -f /*.whl && chmod +x /usr/bin/paddle_k8s ENV LD_LIBRARY_PATH=/usr/local/lib -ADD fluid_benchmark.py dataset.py models/ /workspace/ +ADD fluid_benchmark.py recordio_converter.py models/ /workspace/ diff --git a/benchmark/fluid/README.md b/benchmark/fluid/README.md index 1b0c7dce8bd..c17cab999b5 100644 --- a/benchmark/fluid/README.md +++ b/benchmark/fluid/README.md @@ -42,6 +42,15 @@ Currently supported `--model` argument include: PADDLE_PSERVER_PORT=7164 PADDLE_TRAINER_IPS=192.168.0.2,192.168.0.3 PADDLE_CURRENT_IP=127.0.0.1 PADDLE_TRAINER_ID=0 python fluid_benchmark.py --model mnist --device GPU --update_method nccl2 ``` +## Prepare the RecordIO file to Achieve Better Performance + +Run the following command will generate RecordIO files like "mnist.recordio" under the path +and batch_size you choose: + +```bash +python -c 'from recordio_converter import *; prepare_mnist("data", 32)' +``` + ## Run Distributed Benchmark on Kubernetes Cluster You may need to build a Docker image before submitting a cluster job onto Kubernetes, or you will diff --git a/benchmark/fluid/fluid_benchmark.py b/benchmark/fluid/fluid_benchmark.py index c1d458970a5..9dce7d56478 100644 --- a/benchmark/fluid/fluid_benchmark.py +++ b/benchmark/fluid/fluid_benchmark.py @@ -44,7 +44,6 @@ def parse_args(): type=float, default=0.001, help='The minibatch size.') - # TODO(wuyi): add "--use_fake_data" option back. parser.add_argument( '--skip_batch_num', type=int, @@ -106,6 +105,16 @@ def parse_args(): default='local', choices=['local', 'pserver', 'nccl2'], help='Choose parameter update method, can be local, pserver, nccl2.') + parser.add_argument( + '--use_reader_op', + action='store_true', + help='Whether to use reader op, and must specify the data path if set this to true.' + ) + parser.add_argument( + '--data_path', + type=str, + default="", + help='Directory that contains all the training recordio files.') args = parser.parse_args() return args @@ -208,11 +217,13 @@ def train(avg_loss, infer_prog, optimizer, train_reader, test_reader, batch_acc, place = core.CPUPlace() if args.device == 'CPU' else core.CUDAPlace(0) exe = fluid.Executor(place) exe.run(startup_prog) - feed_var_list = [ - var for var in train_prog.global_block().vars.itervalues() - if var.is_data - ] - feeder = fluid.DataFeeder(feed_var_list, place) + + if not args.use_reader_op: + feed_var_list = [ + var for var in train_prog.global_block().vars.itervalues() + if var.is_data + ] + feeder = fluid.DataFeeder(feed_var_list, place) iters, num_samples, start_time = 0, 0, time.time() for pass_id in range(args.pass_num): @@ -223,9 +234,12 @@ def train(avg_loss, infer_prog, optimizer, train_reader, test_reader, batch_acc, num_samples = 0 if iters == args.iterations: break - loss = exe.run(train_prog, - feed=feeder.feed(data), - fetch_list=[avg_loss]) + if args.use_reader_op: + loss = exe.run(train_prog, fetch_list=[avg_loss]) + else: + loss = exe.run(train_prog, + feed=feeder.feed(data), + fetch_list=[avg_loss]) iters += 1 num_samples += len(data) train_losses.append(loss) @@ -251,10 +265,14 @@ def train(avg_loss, infer_prog, optimizer, train_reader, test_reader, batch_acc, def train_parallel(avg_loss, infer_prog, optimizer, train_reader, test_reader, batch_acc, args, train_prog, startup_prog, nccl_id_var, num_trainers, trainer_id): - feed_var_list = [ - var for var in train_prog.global_block().vars.itervalues() - if var.is_data - ] + place = core.CPUPlace() if args.device == 'CPU' else core.CUDAPlace(0) + if not args.use_reader_op: + feed_var_list = [ + var for var in train_prog.global_block().vars.itervalues() + if var.is_data + ] + feeder = fluid.DataFeeder(feed_var_list, place) + # generate fake: if args.use_fake_data: for var in feed_var_list: @@ -271,7 +289,6 @@ def train_parallel(avg_loss, infer_prog, optimizer, train_reader, test_reader, "value": 1.0, "dtype": var.dtype}) - place = core.CPUPlace() if args.device == 'CPU' else core.CUDAPlace(0) if nccl_id_var and trainer_id == 0: #FIXME(wuyi): wait other trainer to start listening time.sleep(30) @@ -288,7 +305,6 @@ def train_parallel(avg_loss, infer_prog, optimizer, train_reader, test_reader, num_trainers=num_trainers, trainer_id=trainer_id) - feeder = fluid.DataFeeder(feed_var_list, place) for pass_id in range(args.pass_num): num_samples = 0 iters = 0 @@ -304,7 +320,10 @@ def train_parallel(avg_loss, infer_prog, optimizer, train_reader, test_reader, num_samples = 0 if iters == args.iterations: break - if args.use_fake_data: + # NOTE: if use reader ops, the input data is not splited to multiple cards + if args.use_reader_op and iters >= args.iterations / args.gpus: + break + if args.use_fake_data or args.use_reader_op: loss, = exe.run([avg_loss.name]) else: loss, = exe.run([avg_loss.name], feed=feeder.feed(data)) @@ -316,6 +335,8 @@ def train_parallel(avg_loss, infer_prog, optimizer, train_reader, test_reader, print("Pass %d, batch %d, loss %s" % (pass_id, batch_id, np.array(loss))) train_elapsed = time.time() - start_time + if args.use_reader_op: + num_samples = num_samples * args.gpus examples_per_sec = num_samples / train_elapsed print('\nTotal examples: %d, total time: %.5f, %.5f examples/sed\n' % (num_samples, train_elapsed, examples_per_sec)) @@ -342,7 +363,7 @@ def main(): # the unique trainer id, starting from 0, needed by trainer # only nccl_id_var, num_trainers, trainer_id = ( - None, 1, int(os.getenv("PADDLE_TRAINER_ID", "-1"))) + None, 1, int(os.getenv("PADDLE_TRAINER_ID", "0"))) if args.use_cprof: pr = cProfile.Profile() diff --git a/benchmark/fluid/models/machine_translation.py b/benchmark/fluid/models/machine_translation.py index 635b3373dd2..3024882725d 100644 --- a/benchmark/fluid/models/machine_translation.py +++ b/benchmark/fluid/models/machine_translation.py @@ -197,6 +197,8 @@ def lodtensor_to_ndarray(lod_tensor): def get_model(args): + if args.use_reader_op: + raise Exception("machine_translation do not support reader op for now.") embedding_dim = 512 encoder_size = 512 decoder_size = 512 diff --git a/benchmark/fluid/models/mnist.py b/benchmark/fluid/models/mnist.py index d264bfc12bd..5d3da68dafa 100644 --- a/benchmark/fluid/models/mnist.py +++ b/benchmark/fluid/models/mnist.py @@ -20,6 +20,7 @@ import numpy as np import argparse import time import cProfile +import os import paddle import paddle.fluid as fluid @@ -65,9 +66,23 @@ def cnn_model(data): def get_model(args): - # Input data - images = fluid.layers.data(name='pixel', shape=[1, 28, 28], dtype=DTYPE) - label = fluid.layers.data(name='label', shape=[1], dtype='int64') + if args.use_reader_op: + filelist = [ + os.path.join(args.data_path, f) for f in os.listdir(args.data_path) + ] + data_file = fluid.layers.open_files( + filenames=filelist, + shapes=[[-1, 1, 28, 28], (-1, 1)], + lod_levels=[0, 0], + dtypes=["float32", "int64"], + thread_num=args.gpus) + data_file = fluid.layers.double_buffer( + fluid.layers.batch( + data_file, batch_size=args.batch_size)) + images, label = fluid.layers.read_file(data_file) + else: + images = fluid.layers.data(name='pixel', shape=[1, 28, 28], dtype=DTYPE) + label = fluid.layers.data(name='label', shape=[1], dtype='int64') # Train program predict = cnn_model(images) diff --git a/benchmark/fluid/models/resnet.py b/benchmark/fluid/models/resnet.py index 9dec8911ed6..35daad6664b 100644 --- a/benchmark/fluid/models/resnet.py +++ b/benchmark/fluid/models/resnet.py @@ -19,6 +19,7 @@ from __future__ import print_function import functools import numpy as np import time +import os import cProfile, pstats, StringIO @@ -129,9 +130,24 @@ def get_model(args): else: dshape = [224, 224, 3] model = resnet_imagenet + if args.use_reader_op: + filelist = [ + os.path.join(args.data_path, f) for f in os.listdir(args.data_path) + ] + data_file = fluid.layers.open_files( + filenames=filelist, + shapes=[[-1] + dshape, (-1, 1)], + lod_levels=[0, 0], + dtypes=["float32", "int64"], + thread_num=args.gpus) + data_file = fluid.layers.double_buffer( + fluid.layers.batch( + data_file, batch_size=args.batch_size)) + input, label = fluid.layers.read_file(data_file) + else: + input = fluid.layers.data(name='data', shape=dshape, dtype='float32') + label = fluid.layers.data(name='label', shape=[1], dtype='int64') - input = fluid.layers.data(name='data', shape=dshape, dtype='float32') - label = fluid.layers.data(name='label', shape=[1], dtype='int64') predict = model(input, class_dim) cost = fluid.layers.cross_entropy(input=predict, label=label) avg_cost = fluid.layers.mean(x=cost) diff --git a/benchmark/fluid/models/stacked_dynamic_lstm.py b/benchmark/fluid/models/stacked_dynamic_lstm.py index 81a28b5f3ae..e2a8cf45ac3 100644 --- a/benchmark/fluid/models/stacked_dynamic_lstm.py +++ b/benchmark/fluid/models/stacked_dynamic_lstm.py @@ -44,6 +44,9 @@ def crop_sentence(reader, crop_size): def get_model(args): + if args.use_reader_op: + raise Exception( + "stacked_dynamic_lstm do not support reader op for now.") lstm_size = 512 emb_dim = 512 crop_size = 1500 diff --git a/benchmark/fluid/models/vgg.py b/benchmark/fluid/models/vgg.py index 53856c5f7ac..b84e118a88e 100644 --- a/benchmark/fluid/models/vgg.py +++ b/benchmark/fluid/models/vgg.py @@ -22,6 +22,7 @@ import paddle.fluid as fluid import paddle.fluid.core as core import argparse import functools +import os def vgg16_bn_drop(input): @@ -65,9 +66,23 @@ def get_model(args): else: data_shape = [224, 224, 3] - # Input data - images = fluid.layers.data(name='pixel', shape=data_shape, dtype='float32') - label = fluid.layers.data(name='label', shape=[1], dtype='int64') + if args.use_reader_op: + filelist = [ + os.path.join(args.data_path, f) for f in os.listdir(args.data_path) + ] + data_file = fluid.layers.open_files( + filenames=filelist, + shapes=[[-1] + data_shape, (-1, 1)], + lod_levels=[0, 0], + dtypes=["float32", "int64"], + thread_num=args.gpus) + data_file = fluid.layers.double_buffer( + fluid.layers.batch( + data_file, batch_size=args.batch_size)) + images, label = fluid.layers.read_file(data_file) + else: + images = fluid.layers.data(name='data', shape=dshape, dtype='float32') + label = fluid.layers.data(name='label', shape=[1], dtype='int64') # Train program net = vgg16_bn_drop(images) diff --git a/benchmark/fluid/recordio_converter.py b/benchmark/fluid/recordio_converter.py new file mode 100644 index 00000000000..c69062c4a1f --- /dev/null +++ b/benchmark/fluid/recordio_converter.py @@ -0,0 +1,133 @@ +# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import paddle +import paddle.fluid as fluid +import paddle.fluid.core as core +from paddle.dataset import mnist, cifar, flowers, image + + +def convert_2_recordio(py_reader, outfilepath, batch_size, shape_data, + shape_label): + num_batches = 0 + with fluid.program_guard(fluid.Program(), fluid.Program()): + reader = paddle.batch(py_reader(), batch_size=batch_size) + feeder = fluid.DataFeeder( + feed_list=[ # order is image and label + fluid.layers.data( + name='image', shape=shape_data), + fluid.layers.data( + name='label', shape=shape_label, dtype='int64'), + ], + place=fluid.CPUPlace()) + num_batches = fluid.recordio_writer.convert_reader_to_recordio_file( + outfilepath, reader, feeder) + return num_batches + + +def prepare_mnist(outpath, batch_size): + outfilepath = os.path.join(outpath, "mnist.recordio") + convert_2_recordio(mnist.train, outfilepath, batch_size, [784], [1]) + + +def prepare_cifar10(outpath, batch_size): + outfilepath = os.path.join(outpath, "cifar.recordio") + convert_2_recordio(cifar.train10, outfilepath, batch_size, [3, 32, 32], [1]) + + +def prepare_flowers(outpath, batch_size): + outfilepath = os.path.join(outpath, "flowers.recordio") + convert_2_recordio(flowers.train, outfilepath, batch_size, [3, 224, 224], + [1]) + + +def imagenet_train(data_dir): + contents = os.listdir(data_dir) + if set(contents) != set( + ["train", "train.txt", "val", "val_set", "val.txt", "unzip.sh"]): + raise Exception("Imagenet data contents error!") + img2label = dict() + imgfilelist = [] + with open(os.path.join(data_dir, "train.txt")) as fn: + while 1: + l = fn.readline() + if not l: + break + img, lbl = l[:-1].split(" ") + img2label[img] = int(lbl) + imgfilelist.append(img) + + def train_reader(): + for idx, imgfile in enumerate(imgfilelist): + data = image.load_image( + os.path.join(data_dir, "train", imgfile.lower())) + label = [img2label[imgfile], ] + yield [data, label] + + def default_mapper(sample): + img, label = sample + img = image.simple_transform( + img, 256, 224, True, mean=[103.94, 116.78, 123.68]) + return img.flatten().astype('float32'), label + + return paddle.reader.map_readers(default_mapper, train_reader) + + +# FIXME(wuyi): delete this when https://github.com/PaddlePaddle/Paddle/pull/11066 is merged +def convert_reader_to_recordio_files( + filename, + batch_per_file, + reader_creator, + feeder, + compressor=core.RecordIOWriter.Compressor.Snappy, + max_num_records=1000, + feed_order=None): + if feed_order is None: + feed_order = feeder.feed_names + f_name, f_ext = os.path.splitext(filename) + assert (f_ext == ".recordio") + + lines = [] + f_idx = 0 + counter = 0 + for idx, batch in enumerate(reader_creator()): + lines.append(batch) + if idx >= batch_per_file and idx % batch_per_file == 0: + filename = "%s-%05d%s" % (f_name, f_idx, f_ext) + with fluid.recordio_writer.create_recordio_writer( + filename, compressor, max_num_records) as writer: + for l in lines: + res = feeder.feed(l) + for each in feed_order: + writer.append_tensor(res[each]) + writer.complete_append_tensor() + counter += 1 + lines = [] + f_idx += 1 + print("written file: ", filename) + return counter + + +def prepare_imagenet(inpath, outpath, batch_size): + r = paddle.batch(imagenet_train(inpath), batch_size=batch_size) + feeder = fluid.DataFeeder( + feed_list=[ + fluid.layers.data( + name="image", shape=[3, 224, 224]), fluid.layers.data( + name="label", shape=[1], dtype='int64') + ], + place=fluid.CPUPlace()) + outpath = os.path.join(outpath, "imagenet.recordio") + convert_reader_to_recordio_files(outpath, 10000, r, feeder) diff --git a/python/paddle/fluid/layers/io.py b/python/paddle/fluid/layers/io.py index 8758ac9f94a..a56f3ea9db6 100644 --- a/python/paddle/fluid/layers/io.py +++ b/python/paddle/fluid/layers/io.py @@ -434,7 +434,7 @@ def open_files(filenames, shapes, lod_levels, dtypes, - thread_num, + thread_num=1, buffer_size=None, pass_num=1, for_parallel=True): -- GitLab From 86a61c177f484f3f073449cbe2bbc581cc170650 Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Thu, 31 May 2018 19:37:32 +0800 Subject: [PATCH 126/913] Add ScopeBufferedSSAGraphExecutor --- paddle/fluid/framework/CMakeLists.txt | 2 +- paddle/fluid/framework/details/CMakeLists.txt | 1 + .../framework/details/execution_strategy.h | 1 + .../scope_buffered_ssa_graph_executor.cc | 76 +++++++++++++++++++ .../scope_buffered_ssa_graph_executor.h | 53 +++++++++++++ .../framework/details/ssa_graph_executor.cc | 4 - .../framework/details/ssa_graph_executor.h | 6 +- .../details/threaded_ssa_graph_executor.cc | 6 +- .../details/threaded_ssa_graph_executor.h | 1 + paddle/fluid/framework/parallel_executor.cc | 58 ++++---------- paddle/fluid/pybind/pybind.cc | 8 ++ 11 files changed, 162 insertions(+), 54 deletions(-) create mode 100644 paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.cc create mode 100644 paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.h diff --git a/paddle/fluid/framework/CMakeLists.txt b/paddle/fluid/framework/CMakeLists.txt index ed1e70c6460..dbd375aa31b 100644 --- a/paddle/fluid/framework/CMakeLists.txt +++ b/paddle/fluid/framework/CMakeLists.txt @@ -87,7 +87,7 @@ cc_library(executor SRCS executor.cc DEPS op_registry device_context scope framework_proto glog lod_rank_table feed_fetch_method) -cc_library(parallel_executor SRCS parallel_executor.cc DEPS multi_devices_graph_builder threaded_ssa_graph_executor) +cc_library(parallel_executor SRCS parallel_executor.cc DEPS multi_devices_graph_builder threaded_ssa_graph_executor scope_buffered_ssa_graph_executor) cc_library(prune SRCS prune.cc DEPS framework_proto) cc_test(prune_test SRCS prune_test.cc DEPS op_info prune recurrent_op device_context) diff --git a/paddle/fluid/framework/details/CMakeLists.txt b/paddle/fluid/framework/details/CMakeLists.txt index 1bcd8412eb2..c026e6c100a 100644 --- a/paddle/fluid/framework/details/CMakeLists.txt +++ b/paddle/fluid/framework/details/CMakeLists.txt @@ -36,5 +36,6 @@ cc_test(broadcast_op_test SRCS broadcast_op_handle_test.cc DEPS var_handle op_ha device_context broadcast_op_handle) cc_test(gather_op_test SRCS gather_op_handle_test.cc DEPS var_handle op_handle_base scope ddim memory device_context gather_op_handle) +cc_library(scope_buffered_ssa_graph_executor SRCS scope_buffered_ssa_graph_executor.cc DEPS ssa_graph_executor) #cc_test(reduce_op_handle_test SRCS reduce_op_handle_test.cc DEPS var_handle op_handle_base scope ddim memory # device_context reduce_op_handle ) diff --git a/paddle/fluid/framework/details/execution_strategy.h b/paddle/fluid/framework/details/execution_strategy.h index e8d510ec955..e7aa74742f8 100644 --- a/paddle/fluid/framework/details/execution_strategy.h +++ b/paddle/fluid/framework/details/execution_strategy.h @@ -22,6 +22,7 @@ struct ExecutionStrategy { size_t num_threads_{0}; bool use_event_{true}; bool allow_op_delay_{false}; + size_t num_iteration_per_drop_scope_{100}; }; } // namespace details diff --git a/paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.cc b/paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.cc new file mode 100644 index 00000000000..eb4e7ec52f9 --- /dev/null +++ b/paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.cc @@ -0,0 +1,76 @@ +// Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.h" +#include +#include +#include "paddle/fluid/framework/executor.h" + +namespace paddle { +namespace framework { +namespace details { +ScopeBufferedSSAGraphExecutor::ScopeBufferedSSAGraphExecutor( + ExecutionStrategy strategy, std::vector local_scopes, + std::vector var_infos, std::vector places, + std::unique_ptr &&underlying_executor) + : strategy_(std::move(strategy)), + underlying_executor_(std::move(underlying_executor)), + local_scopes_(std::move(local_scopes)), + var_infos_(std::move(var_infos)), + places_(std::move(places)) {} + +FeedFetchList ScopeBufferedSSAGraphExecutor::Run( + const std::vector &fetch_tensors) { + if (drop_scope_counter_ == 0) { + // Create local scopes. + for (auto it = local_scopes_.rbegin(); it != local_scopes_.rend(); ++it) { + auto &scope = *it; + Scope &local_scope = scope->NewScope(); + *scope->Var(details::kLocalExecScopeName)->GetMutable() = + &local_scope; + + for (auto &info : var_infos_) { + if (scope->FindVar(info.name_) != nullptr) { + continue; + } + + if (info.persistable_) { // Persistable + InitializeVariable(scope->Var(info.name_), info.type_); + } else { + InitializeVariable(local_scope.Var(info.name_), info.type_); + } + } + } + } + + auto fetch_data = underlying_executor_->Run(fetch_tensors); + drop_scope_counter_ += 1; + if (!fetch_tensors.empty() || + drop_scope_counter_ == strategy_.num_iteration_per_drop_scope_) { + drop_scope_counter_ = 0; + // Wait All computational streams + for (auto p : places_) { + platform::DeviceContextPool::Instance().Get(p)->Wait(); + } + for (auto &scope : local_scopes_) { + auto &local_scope = + *scope->Var(details::kLocalExecScopeName)->GetMutable(); + scope->DeleteScope(local_scope); + } + } + return fetch_data; +} +} // namespace details +} // namespace framework +} // namespace paddle diff --git a/paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.h b/paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.h new file mode 100644 index 00000000000..20df7a4722d --- /dev/null +++ b/paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.h @@ -0,0 +1,53 @@ +// Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include +#include +#include +#include "paddle/fluid/framework/details/execution_strategy.h" +#include "paddle/fluid/framework/details/ssa_graph_executor.h" +#include "paddle/fluid/framework/scope.h" +#include "paddle/fluid/platform/place.h" +namespace paddle { +namespace framework { +namespace details { + +struct VariableInfo { + std::string name_; + proto::VarType::Type type_; + bool persistable_; +}; + +class ScopeBufferedSSAGraphExecutor : public SSAGraphExecutor { + public: + ScopeBufferedSSAGraphExecutor( + ExecutionStrategy strategy, std::vector local_scopes, + std::vector var_infos, std::vector places, + std::unique_ptr&& underlying_executor); + FeedFetchList Run(const std::vector& fetch_tensors) override; + + private: + size_t drop_scope_counter_{0}; + + ExecutionStrategy strategy_; + std::unique_ptr underlying_executor_; + std::vector local_scopes_; + std::vector var_infos_; + std::vector places_; +}; +} // namespace details +} // namespace framework +} // namespace paddle diff --git a/paddle/fluid/framework/details/ssa_graph_executor.cc b/paddle/fluid/framework/details/ssa_graph_executor.cc index 8da6ca889b8..09b97bd0d98 100644 --- a/paddle/fluid/framework/details/ssa_graph_executor.cc +++ b/paddle/fluid/framework/details/ssa_graph_executor.cc @@ -17,10 +17,6 @@ namespace paddle { namespace framework { namespace details { - -SSAGraphExecutor::SSAGraphExecutor(std::unique_ptr &&graph) - : graph_(std::move(graph)) {} - SSAGraphExecutor::~SSAGraphExecutor() {} } // namespace details diff --git a/paddle/fluid/framework/details/ssa_graph_executor.h b/paddle/fluid/framework/details/ssa_graph_executor.h index a8833b7388a..95808603360 100644 --- a/paddle/fluid/framework/details/ssa_graph_executor.h +++ b/paddle/fluid/framework/details/ssa_graph_executor.h @@ -28,15 +28,11 @@ class SSAGraphExecutor { DISABLE_COPY_AND_ASSIGN(SSAGraphExecutor); public: - // Steal graph inside - explicit SSAGraphExecutor(std::unique_ptr &&graph); + SSAGraphExecutor() {} virtual ~SSAGraphExecutor(); virtual FeedFetchList Run(const std::vector &fetch_tensors) = 0; - - protected: - std::unique_ptr graph_; }; } // namespace details } // namespace framework diff --git a/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc b/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc index 815f739371e..496fadd04da 100644 --- a/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc +++ b/paddle/fluid/framework/details/threaded_ssa_graph_executor.cc @@ -21,7 +21,7 @@ ThreadedSSAGraphExecutor::ThreadedSSAGraphExecutor( const ExecutionStrategy &strategy, const std::vector &local_scopes, const std::vector &places, std::unique_ptr &&graph) - : SSAGraphExecutor(std::move(graph)), + : graph_(std::move(graph)), pool_(strategy.num_threads_ >= 2 ? new ::ThreadPool(strategy.num_threads_) : nullptr), local_scopes_(local_scopes), @@ -189,7 +189,9 @@ void ThreadedSSAGraphExecutor::RunOp( BlockingQueue *ready_var_q, details::OpHandleBase *op) { auto op_run = [ready_var_q, op, this] { try { - VLOG(10) << op << " " << op->Name() << " : " << op->DebugString(); + if (VLOG_IS_ON(10)) { + VLOG(10) << op << " " << op->Name() << " : " << op->DebugString(); + } op->Run(strategy_.use_event_); VLOG(10) << op << " " << op->Name() << " Done "; running_ops_--; diff --git a/paddle/fluid/framework/details/threaded_ssa_graph_executor.h b/paddle/fluid/framework/details/threaded_ssa_graph_executor.h index 1f7f88d7521..4a2075f1ccc 100644 --- a/paddle/fluid/framework/details/threaded_ssa_graph_executor.h +++ b/paddle/fluid/framework/details/threaded_ssa_graph_executor.h @@ -51,6 +51,7 @@ class ThreadedSSAGraphExecutor : public SSAGraphExecutor { details::OpHandleBase *op); private: + std::unique_ptr graph_; std::unique_ptr<::ThreadPool> pool_; std::vector local_scopes_; std::vector places_; diff --git a/paddle/fluid/framework/parallel_executor.cc b/paddle/fluid/framework/parallel_executor.cc index 50c3468d556..003304b85af 100644 --- a/paddle/fluid/framework/parallel_executor.cc +++ b/paddle/fluid/framework/parallel_executor.cc @@ -23,6 +23,7 @@ limitations under the License. */ #endif #include "paddle/fluid/framework/details/multi_devices_graph_builder.h" +#include "paddle/fluid/framework/details/scope_buffered_ssa_graph_executor.h" #include "paddle/fluid/framework/details/threaded_ssa_graph_executor.h" #include "paddle/fluid/platform/profiler.h" @@ -42,8 +43,6 @@ class ParallelExecutorPrivate { #ifdef PADDLE_WITH_CUDA std::unique_ptr nccl_ctxs_; #endif - - std::vector> var_types_; bool own_local_scope; }; @@ -92,9 +91,18 @@ ParallelExecutor::ParallelExecutor( local_scopes.empty()) { // Is CUDA BCastParamsToGPUs(bcast_vars); } -// Startup Program has been run. All local scopes has correct parameters. + // Startup Program has been run. All local scopes has correct parameters. + + // Step 2. Create vars in each scope; + std::vector var_infos; + for (auto *var : main_program.Block(0).AllVars()) { + var_infos.emplace_back(); + var_infos.back().name_ = var->Name(); + var_infos.back().type_ = var->GetType(); + var_infos.back().persistable_ = var->Persistable(); + } -// Step 2. Convert main_program to SSA form and dependency graph. Also, insert +// Step 3. Convert main_program to SSA form and dependency graph. Also, insert // ncclOp #ifdef PADDLE_WITH_CUDA details::MultiDevSSAGraphBuilder builder( @@ -105,16 +113,15 @@ ParallelExecutor::ParallelExecutor( params, member_->local_scopes_, build_strategy); #endif + auto graph = builder.Build(main_program); member_->executor_.reset(new details::ThreadedSSAGraphExecutor( exec_strategy, member_->local_scopes_, places, std::move(graph))); - // Step 3. Create vars in each scope; - for (auto *var : main_program.Block(0).AllVars()) { - member_->var_types_.emplace_back(var->Name(), var->GetType(), - var->Persistable()); - } + member_->executor_.reset(new details::ScopeBufferedSSAGraphExecutor( + exec_strategy, member_->local_scopes_, std::move(var_infos), + member_->places_, std::move(member_->executor_))); } void ParallelExecutor::BCastParamsToGPUs( @@ -169,42 +176,9 @@ void ParallelExecutor::BCastParamsToGPUs( void ParallelExecutor::Run(const std::vector &fetch_tensors, const std::string &fetched_var_name) { platform::RecordBlock b(0); - // Create local scopes. - for (auto it = member_->local_scopes_.rbegin(); - it != member_->local_scopes_.rend(); ++it) { - auto &scope = *it; - Scope &local_scope = scope->NewScope(); - *scope->Var(details::kLocalExecScopeName)->GetMutable() = - &local_scope; - - for (auto &name_type_pair : member_->var_types_) { - if (scope->FindVar(std::get<0>(name_type_pair)) != nullptr) { - continue; - } - - if (std::get<2>(name_type_pair)) { // Persistable - InitializeVariable(scope->Var(std::get<0>(name_type_pair)), - std::get<1>(name_type_pair)); - } else { - InitializeVariable(local_scope.Var(std::get<0>(name_type_pair)), - std::get<1>(name_type_pair)); - } - } - } - auto fetch_data = member_->executor_->Run(fetch_tensors); *member_->global_scope_->Var(fetched_var_name)->GetMutable() = fetch_data; - - // Wait All computational streams - for (auto p : member_->places_) { - platform::DeviceContextPool::Instance().Get(p)->Wait(); - } - for (auto &scope : member_->local_scopes_) { - auto &local_scope = - *scope->Var(details::kLocalExecScopeName)->GetMutable(); - scope->DeleteScope(local_scope); - } } void ParallelExecutor::FeedTensorsIntoLocalScopes( diff --git a/paddle/fluid/pybind/pybind.cc b/paddle/fluid/pybind/pybind.cc index 3af8941be69..03cf417b62f 100644 --- a/paddle/fluid/pybind/pybind.cc +++ b/paddle/fluid/pybind/pybind.cc @@ -519,6 +519,14 @@ All parameter, weight, gradient are variables in Paddle. [](const ExecutionStrategy &self) { return self.allow_op_delay_; }, [](ExecutionStrategy &self, bool allow_op_delay) { self.allow_op_delay_ = allow_op_delay; + }) + .def_property( + "num_iteration_per_drop_scope", + [](const ExecutionStrategy &self) { + return self.num_iteration_per_drop_scope_; + }, + [](ExecutionStrategy &self, size_t num_iteration_per_drop_scope) { + self.num_iteration_per_drop_scope_ = num_iteration_per_drop_scope; }); py::class_ build_strategy(pe, "BuildStrategy"); -- GitLab From 7cf8b656a20578443694e4118464e06fb13f8539 Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Thu, 31 May 2018 20:10:09 +0800 Subject: [PATCH 127/913] Remove lock in device context --- paddle/fluid/platform/device_context.cc | 1 - paddle/fluid/platform/device_context.h | 3 --- 2 files changed, 4 deletions(-) diff --git a/paddle/fluid/platform/device_context.cc b/paddle/fluid/platform/device_context.cc index 1f733d71bdf..6c50ab2685c 100644 --- a/paddle/fluid/platform/device_context.cc +++ b/paddle/fluid/platform/device_context.cc @@ -175,7 +175,6 @@ CUDADeviceContext::~CUDADeviceContext() { Place CUDADeviceContext::GetPlace() const { return place_; } void CUDADeviceContext::Wait() const { - std::lock_guard guard(mutex_); PADDLE_ENFORCE(cudaStreamSynchronize(stream_)); PADDLE_ENFORCE(cudaGetLastError()); } diff --git a/paddle/fluid/platform/device_context.h b/paddle/fluid/platform/device_context.h index a9c1984616b..6b82d93237b 100644 --- a/paddle/fluid/platform/device_context.h +++ b/paddle/fluid/platform/device_context.h @@ -100,7 +100,6 @@ class CUDADeviceContext : public DeviceContext { template void RecordEvent(cudaEvent_t ev, Callback callback) { - std::lock_guard guard(mutex_); callback(); PADDLE_ENFORCE(cudaEventRecord(ev, stream_)); } @@ -110,8 +109,6 @@ class CUDADeviceContext : public DeviceContext { std::unique_ptr eigen_device_; std::unique_ptr eigen_stream_; - - mutable std::recursive_mutex mutex_; cudaStream_t stream_; cudnnHandle_t cudnn_handle_; cublasHandle_t cublas_handle_; -- GitLab From c5115950a87df858f963a06b71282bcda2cce920 Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Fri, 1 Jun 2018 11:17:50 +0800 Subject: [PATCH 128/913] Use static for dlsym --- paddle/fluid/platform/dynload/cublas.h | 2 +- paddle/fluid/platform/dynload/cudnn.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/paddle/fluid/platform/dynload/cublas.h b/paddle/fluid/platform/dynload/cublas.h index 81acaff87d3..25bcda7eedc 100644 --- a/paddle/fluid/platform/dynload/cublas.h +++ b/paddle/fluid/platform/dynload/cublas.h @@ -45,7 +45,7 @@ extern void *cublas_dso_handle; std::call_once(cublas_dso_flag, []() { \ cublas_dso_handle = paddle::platform::dynload::GetCublasDsoHandle(); \ }); \ - void *p_##__name = dlsym(cublas_dso_handle, #__name); \ + static void *p_##__name = dlsym(cublas_dso_handle, #__name); \ return reinterpret_cast(p_##__name)(args...); \ } \ }; \ diff --git a/paddle/fluid/platform/dynload/cudnn.h b/paddle/fluid/platform/dynload/cudnn.h index 34d83e39569..77e46fa768b 100644 --- a/paddle/fluid/platform/dynload/cudnn.h +++ b/paddle/fluid/platform/dynload/cudnn.h @@ -39,7 +39,7 @@ extern void EnforceCUDNNLoaded(const char* fn_name); cudnn_dso_handle = paddle::platform::dynload::GetCUDNNDsoHandle(); \ }); \ EnforceCUDNNLoaded(#__name); \ - void* p_##__name = dlsym(cudnn_dso_handle, #__name); \ + static void* p_##__name = dlsym(cudnn_dso_handle, #__name); \ return reinterpret_cast(p_##__name)(args...); \ } \ }; \ -- GitLab From 53dab95b7599e8cea50a886cf8bafd0e55beec36 Mon Sep 17 00:00:00 2001 From: yuyang18 Date: Fri, 1 Jun 2018 12:26:57 +0800 Subject: [PATCH 129/913] Static DSO handle --- paddle/fluid/platform/dynload/cupti.h | 2 +- paddle/fluid/platform/dynload/curand.h | 2 +- paddle/fluid/platform/dynload/nccl.h | 2 +- paddle/fluid/platform/dynload/tensorrt.h | 2 +- paddle/fluid/platform/dynload/warpctc.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/paddle/fluid/platform/dynload/cupti.h b/paddle/fluid/platform/dynload/cupti.h index e64de7c20fc..2ad52bc7d32 100644 --- a/paddle/fluid/platform/dynload/cupti.h +++ b/paddle/fluid/platform/dynload/cupti.h @@ -45,7 +45,7 @@ extern void *cupti_dso_handle; std::call_once(cupti_dso_flag, []() { \ cupti_dso_handle = paddle::platform::dynload::GetCUPTIDsoHandle(); \ }); \ - void *p_##__name = dlsym(cupti_dso_handle, #__name); \ + static void *p_##__name = dlsym(cupti_dso_handle, #__name); \ return reinterpret_cast(p_##__name)(args...); \ } \ }; \ diff --git a/paddle/fluid/platform/dynload/curand.h b/paddle/fluid/platform/dynload/curand.h index 46ad4379d5f..5b9e0820e0b 100644 --- a/paddle/fluid/platform/dynload/curand.h +++ b/paddle/fluid/platform/dynload/curand.h @@ -34,7 +34,7 @@ extern void *curand_dso_handle; std::call_once(curand_dso_flag, []() { \ curand_dso_handle = paddle::platform::dynload::GetCurandDsoHandle(); \ }); \ - void *p_##__name = dlsym(curand_dso_handle, #__name); \ + static void *p_##__name = dlsym(curand_dso_handle, #__name); \ return reinterpret_cast(p_##__name)(args...); \ } \ }; \ diff --git a/paddle/fluid/platform/dynload/nccl.h b/paddle/fluid/platform/dynload/nccl.h index 37902ae20c5..575516f8187 100644 --- a/paddle/fluid/platform/dynload/nccl.h +++ b/paddle/fluid/platform/dynload/nccl.h @@ -37,7 +37,7 @@ extern void* nccl_dso_handle; std::call_once(nccl_dso_flag, []() { \ nccl_dso_handle = paddle::platform::dynload::GetNCCLDsoHandle(); \ }); \ - void* p_##__name = dlsym(nccl_dso_handle, #__name); \ + static void* p_##__name = dlsym(nccl_dso_handle, #__name); \ return reinterpret_cast(p_##__name)(args...); \ } \ }; \ diff --git a/paddle/fluid/platform/dynload/tensorrt.h b/paddle/fluid/platform/dynload/tensorrt.h index f584a49da0f..5d67658b94a 100644 --- a/paddle/fluid/platform/dynload/tensorrt.h +++ b/paddle/fluid/platform/dynload/tensorrt.h @@ -40,7 +40,7 @@ extern void* tensorrt_dso_handle; paddle::platform::dynload::GetTensorRtDsoHandle(); \ PADDLE_ENFORCE(tensorrt_dso_handle, "load tensorrt so failed"); \ }); \ - void* p_##__name = dlsym(tensorrt_dso_handle, #__name); \ + static void* p_##__name = dlsym(tensorrt_dso_handle, #__name); \ PADDLE_ENFORCE(p_##__name, "load %s failed", #__name); \ return reinterpret_cast(p_##__name)(args...); \ } \ diff --git a/paddle/fluid/platform/dynload/warpctc.h b/paddle/fluid/platform/dynload/warpctc.h index 7c70649d21c..d157c1fda78 100644 --- a/paddle/fluid/platform/dynload/warpctc.h +++ b/paddle/fluid/platform/dynload/warpctc.h @@ -40,7 +40,7 @@ extern void* warpctc_dso_handle; std::call_once(warpctc_dso_flag, []() { \ warpctc_dso_handle = paddle::platform::dynload::GetWarpCTCDsoHandle(); \ }); \ - void* p_##_name = dlsym(warpctc_dso_handle, #__name); \ + static void* p_##_name = dlsym(warpctc_dso_handle, #__name); \ return reinterpret_cast(p_##_name)(args...); \ } \ }; \ -- GitLab From 663f4e6168ef9852991dc1ccfea462307d19a5d0 Mon Sep 17 00:00:00 2001 From: baiyf Date: Fri, 1 Jun 2018 19:30:59 +0800 Subject: [PATCH 130/913] Fix bilinear_op Python API (#11117) * fix conflict * code clean --- doc/fluid/api/layers.rst | 4 ++-- python/paddle/fluid/layers/nn.py | 21 +++++++++---------- .../fluid/tests/unittests/test_layers.py | 6 +++--- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/doc/fluid/api/layers.rst b/doc/fluid/api/layers.rst index dbb99d3c03f..5329adaa18b 100644 --- a/doc/fluid/api/layers.rst +++ b/doc/fluid/api/layers.rst @@ -1003,10 +1003,10 @@ dice_loss .. autofunction:: paddle.fluid.layers.dice_loss :noindex: -upsampling_bilinear2d +resize_bilinear ____ -.. autofunction:: paddle.fluid.layers.upsampling_bilinear2d +.. autofunction:: paddle.fluid.layers.resize_bilinear :noindex: gather diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index 56f5c6b4bed..bd6ed0f30e4 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -81,7 +81,7 @@ __all__ = [ 'label_smooth', 'roi_pool', 'dice_loss', - 'upsampling_bilinear2d', + 'resize_bilinear', 'gather', 'random_crop', ] @@ -3929,9 +3929,9 @@ def dice_loss(input, label, epsilon=0.00001): return reduce_mean(dice_score) -def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): +def resize_bilinear(input, out_shape=None, scale=None, name=None): """ - The mathematical meaning of upsampling_bilinear2d is also called + The mathematical meaning of resize bilinear layer is Bilinear interpolation. Bilinear interpolation is an extension of linear interpolation for interpolating functions of two variables (e.g. H-direction and @@ -3941,13 +3941,13 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): https://en.wikipedia.org/wiki/Bilinear_interpolation Args: - input (Variable): The input tensor of bilinear interpolation, + input (Variable): The input tensor of resize bilinear layer, This is a 4-D tensor of the shape (num_batches, channels, in_h, in_w). - out_shape(list|tuple|Variable|None): Output shape of bilinear interpolation + out_shape(list|tuple|Variable|None): Output shape of resize bilinear layer, the shape is (out_h, out_w). Default: None - scale(int|None): The multiplier for the input height or width. + scale(float|None): The multiplier for the input height or width. At least one of out_shape or scale must be set. And out_shape has a higher priority than scale. Default: None @@ -3961,7 +3961,7 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): Examples: .. code-block:: python - out = fluid.layers.bilinear_interp(input, out_shape=[12, 12]) + out = fluid.layers.resize_bilinear(input, out_shape=[12, 12]) """ if out_shape is None and scale is None: raise ValueError("One of out_shape and scale must not be None") @@ -3975,10 +3975,9 @@ def upsampling_bilinear2d(input, out_shape=None, scale=None, name=None): out_w = 0 inputs = {"X": input} if out_shape is not None: - if not (_is_list_or_turple_(out_shape) and len(out_shape) == 2) and ( - out_shape is not Variable): - raise ValueError('out_shape should be a list or tuple ', - 'with length 2, (out_h, out_w).') + if not (_is_list_or_turple_(out_shape) and + len(out_shape) == 2) and not isinstance(out_shape, Variable): + raise ValueError('out_shape should be a list or tuple or variable') if _is_list_or_turple_(out_shape): out_shape = list(map(int, out_shape)) out_h = out_shape[0] diff --git a/python/paddle/fluid/tests/unittests/test_layers.py b/python/paddle/fluid/tests/unittests/test_layers.py index 60dc1f83fc3..ca08fd7fc8e 100644 --- a/python/paddle/fluid/tests/unittests/test_layers.py +++ b/python/paddle/fluid/tests/unittests/test_layers.py @@ -369,13 +369,13 @@ class TestBook(unittest.TestCase): self.assertIsNotNone(output) print(str(program)) - def test_upsampling_bilinear2d(self): + def test_resize_bilinear(self): program = Program() with program_guard(program): x = layers.data(name='x', shape=[3, 9, 6], dtype="float32") - output = layers.upsampling_bilinear2d(x, out_shape=[12, 12]) + output = layers.resize_bilinear(x, out_shape=[12, 12]) self.assertIsNotNone(output) - output = layers.upsampling_bilinear2d(x, scale=3) + output = layers.resize_bilinear(x, scale=3) self.assertIsNotNone(output) print(str(program)) -- GitLab From eaeb76c419fbad9b7d3dd083666f80d84f89f55f Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 1 Jun 2018 19:35:49 +0800 Subject: [PATCH 131/913] add some comments --- .../tests/book/test_inference_nlp.cc | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index f7788ccbf40..c4d7b0bbf01 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -37,7 +37,8 @@ inline double GetCurrentMs() { return 1e+3 * time.tv_sec + 1e-3 * time.tv_usec; } -// return size of total words +// Load the input word index data from file and save into LodTensor. +// Return the size of words. size_t LoadData(std::vector* out, const std::string& filename) { size_t sz = 0; @@ -67,6 +68,8 @@ size_t LoadData(std::vector* out, return sz; } +// Split input data samples into small pieces jobs as balanced as possible, +// according to the number of threads. void SplitData( const std::vector& datasets, std::vector>* jobs, @@ -116,7 +119,8 @@ void ThreadRunInfer( for (size_t i = 0; i < inputs.size(); ++i) { feed_targets[feed_target_names[0]] = inputs[i]; executor->Run(*copy_program, &sub_scope, &feed_targets, &fetch_targets, - true, true, feed_holder_name, fetch_holder_name); + true /*create_local_scope*/, true /*create_vars*/, + feed_holder_name, fetch_holder_name); } auto stop_ms = GetCurrentMs(); scope->DeleteScope(&sub_scope); @@ -143,12 +147,13 @@ TEST(inference, nlp) { // 1. Define place, executor, scope auto place = paddle::platform::CPUPlace(); auto executor = paddle::framework::Executor(place); - auto* scope = new paddle::framework::Scope(); + std::unique_ptr scope( + new paddle::framework::Scope()); // 2. Initialize the inference_program and load parameters std::unique_ptr inference_program; inference_program = - InitProgram(&executor, scope, FLAGS_modelpath, model_combined); + InitProgram(&executor, scope.get(), FLAGS_modelpath, model_combined); if (FLAGS_use_mkldnn) { EnableMKLDNN(inference_program); } @@ -166,9 +171,9 @@ TEST(inference, nlp) { SplitData(datasets, &jobs, FLAGS_num_threads); std::vector> threads; for (int i = 0; i < FLAGS_num_threads; ++i) { - threads.emplace_back(new std::thread(ThreadRunInfer, i, &executor, scope, - std::ref(inference_program), - std::ref(jobs))); + threads.emplace_back( + new std::thread(ThreadRunInfer, i, &executor, scope.get(), + std::ref(inference_program), std::ref(jobs))); } start_ms = GetCurrentMs(); for (int i = 0; i < FLAGS_num_threads; ++i) { @@ -177,7 +182,7 @@ TEST(inference, nlp) { stop_ms = GetCurrentMs(); } else { if (FLAGS_prepare_vars) { - executor.CreateVariables(*inference_program, scope, 0); + executor.CreateVariables(*inference_program, scope.get(), 0); } // always prepare context std::unique_ptr ctx; @@ -201,7 +206,7 @@ TEST(inference, nlp) { start_ms = GetCurrentMs(); for (size_t i = 0; i < datasets.size(); ++i) { feed_targets[feed_target_names[0]] = &(datasets[i]); - executor.RunPreparedContext(ctx.get(), scope, &feed_targets, + executor.RunPreparedContext(ctx.get(), scope.get(), &feed_targets, &fetch_targets, !FLAGS_prepare_vars); } stop_ms = GetCurrentMs(); @@ -209,9 +214,7 @@ TEST(inference, nlp) { << " samples, avg time per sample: " << (stop_ms - start_ms) / datasets.size() << " ms"; } - LOG(INFO) << "Total inference time with " << FLAGS_num_threads << " threads : " << (stop_ms - start_ms) / 1000.0 << " sec, QPS: " << datasets.size() / ((stop_ms - start_ms) / 1000); - delete scope; } -- GitLab From 8939f17d304dd407efef3466a7bc96c6bb8747fe Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Fri, 1 Jun 2018 19:48:57 +0800 Subject: [PATCH 132/913] sppedup test_listen_and_serv_op --- .../fluid/tests/unittests/CMakeLists.txt | 6 +- .../unittests/test_listen_and_serv_op.py | 59 ++++++++----------- 2 files changed, 30 insertions(+), 35 deletions(-) diff --git a/python/paddle/fluid/tests/unittests/CMakeLists.txt b/python/paddle/fluid/tests/unittests/CMakeLists.txt index fead95ffdab..c33539f6b50 100644 --- a/python/paddle/fluid/tests/unittests/CMakeLists.txt +++ b/python/paddle/fluid/tests/unittests/CMakeLists.txt @@ -48,5 +48,7 @@ foreach(TEST_OP ${TEST_OPS}) endforeach(TEST_OP) py_test_modules(test_warpctc_op MODULES test_warpctc_op ENVS FLAGS_warpctc_dir=${WARPCTC_LIB_DIR} SERIAL) py_test_modules(test_dist_train MODULES test_dist_train SERIAL) -# tests that need to be done in fixed timeout -set_tests_properties(test_listen_and_serv_op PROPERTIES TIMEOUT 20) +# FIXME(Yancey1989): this test would cost much more time on CUDAPlace +# since load cudnn libraries, so we use a longer timeout to make this +# unit test stability. +set_tests_properties(test_listen_and_serv_op PROPERTIES TIMEOUT 30) diff --git a/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py b/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py index cf89f9d0ebf..ad479657cc2 100644 --- a/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py +++ b/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py @@ -23,7 +23,7 @@ from multiprocessing import Process from op_test import OpTest -def run_pserver(use_cuda, sync_mode, ip, port, trainer_count, trainer_id): +def run_pserver(use_cuda, sync_mode, ip, port, trainers, trainer_id): x = fluid.layers.data(name='x', shape=[1], dtype='float32') y_predict = fluid.layers.fc(input=x, size=1, act=None) y = fluid.layers.data(name='y', shape=[1], dtype='float32') @@ -39,15 +39,8 @@ def run_pserver(use_cuda, sync_mode, ip, port, trainer_count, trainer_id): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() exe = fluid.Executor(place) - port = os.getenv("PADDLE_INIT_PORT", port) - pserver_ips = os.getenv("PADDLE_INIT_PSERVERS", ip) # ip,ip... - eplist = [] - for ip in pserver_ips.split(","): - eplist.append(':'.join([ip, port])) - pserver_endpoints = ",".join(eplist) # ip:port,ip:port... - trainers = int(os.getenv("TRAINERS", trainer_count)) - current_endpoint = os.getenv("POD_IP", ip) + ":" + port - trainer_id = int(os.getenv("PADDLE_INIT_TRAINER_ID", trainer_id)) + pserver_endpoints = ip + ":" + port + current_endpoint = ip + ":" + port t = fluid.DistributeTranspiler() t.transpile( trainer_id, @@ -62,47 +55,47 @@ def run_pserver(use_cuda, sync_mode, ip, port, trainer_count, trainer_id): class TestListenAndServOp(OpTest): def setUp(self): - self.sleep_time = 5 + self.ps_timeout = 5 self.ip = "127.0.0.1" self.port = "6173" - self.trainer_count = 1 + self.trainers = 1 self.trainer_id = 1 - def _raise_signal(self, parent_pid, raised_signal): - time.sleep(self.sleep_time) - ps_command = subprocess.Popen( - "ps -o pid --ppid %d --noheaders" % parent_pid, - shell=True, - stdout=subprocess.PIPE) - ps_output = ps_command.stdout.read() - retcode = ps_command.wait() - assert retcode == 0, "ps command returned %d" % retcode - - for pid_str in ps_output.split("\n")[:-1]: - try: - os.kill(int(pid_str), raised_signal) - except Exception: - continue - def _start_pserver(self, use_cuda, sync_mode): p = Process( target=run_pserver, - args=(use_cuda, sync_mode, self.ip, self.port, self.trainer_count, + args=(use_cuda, sync_mode, self.ip, self.port, self.trainers, self.trainer_id)) p.start() + return p.pid + + def _wait_ps_ready(self, pid): + retry_times = self.ps_timeout + while True: + time.sleep(1) + assert retry_times >= 0, "wait ps ready failed" + try: + # the listen_and_serv_op would touch a file which contains the listen port + # on the /tmp directory until it was ready to process all the RPC call. + os.stat("/tmp/paddle.%d.port" % pid) + return + except os.error: + retry_times -= 1 def test_handle_signal_in_serv_op(self): # run pserver on CPU in sync mode - self._start_pserver(False, True) + pid = self._start_pserver(False, True) + self._wait_ps_ready(pid) # raise SIGINT to pserver - self._raise_signal(os.getpid(), signal.SIGINT) + os.kill(pid, signal.SIGINT) # run pserver on CPU in async mode - self._start_pserver(False, False) + pid = self._start_pserver(False, False) + self._wait_ps_ready(pid) # raise SIGTERM to pserver - self._raise_signal(os.getpid(), signal.SIGTERM) + os.kill(pid, signal.SIGINT) if __name__ == '__main__': -- GitLab From b5b666185720c241aad2421ffb2497dd92d159e5 Mon Sep 17 00:00:00 2001 From: Yan Chunwei Date: Fri, 1 Jun 2018 20:36:34 +0800 Subject: [PATCH 133/913] feature/simple inference demo (#11105) --- paddle/contrib/inference/CMakeLists.txt | 43 +++++------ paddle/contrib/inference/demo/CMakeLists.txt | 16 +++++ .../inference/demo/simple_on_word2vec.cc | 71 +++++++++++++++++++ .../inference/paddle_inference_api_impl.cc | 6 +- .../test_paddle_inference_api_impl.cc | 4 +- 5 files changed, 116 insertions(+), 24 deletions(-) create mode 100644 paddle/contrib/inference/demo/CMakeLists.txt create mode 100644 paddle/contrib/inference/demo/simple_on_word2vec.cc diff --git a/paddle/contrib/inference/CMakeLists.txt b/paddle/contrib/inference/CMakeLists.txt index 6847f7db7fc..8ca34465395 100644 --- a/paddle/contrib/inference/CMakeLists.txt +++ b/paddle/contrib/inference/CMakeLists.txt @@ -18,32 +18,35 @@ if(APPLE) endif(APPLE) function(inference_api_test TARGET_NAME) - set(options "") - set(oneValueArgs "") - set(multiValueArgs ARGS) - cmake_parse_arguments(inference_test "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + if (WITH_TESTING) + set(options "") + set(oneValueArgs "") + set(multiValueArgs ARGS) + cmake_parse_arguments(inference_test "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - set(PYTHON_TESTS_DIR ${PADDLE_BINARY_DIR}/python/paddle/fluid/tests) - cc_test(test_paddle_inference_${TARGET_NAME} - SRCS test_paddle_inference_${TARGET_NAME}.cc - DEPS paddle_fluid_api paddle_inference_api - ARGS --dirname=${PYTHON_TESTS_DIR}/book/) - if(inference_test_ARGS) - set_tests_properties(test_paddle_inference_${TARGET_NAME} - PROPERTIES DEPENDS "${inference_test_ARGS}") - endif() + set(PYTHON_TESTS_DIR ${PADDLE_BINARY_DIR}/python/paddle/fluid/tests) + cc_test(${TARGET_NAME} + SRCS ${TARGET_NAME}.cc + DEPS paddle_fluid paddle_inference_api + ARGS --dirname=${PYTHON_TESTS_DIR}/book/) + if(inference_test_ARGS) + set_tests_properties(${TARGET_NAME} + PROPERTIES DEPENDS "${inference_test_ARGS}") + endif() + endif(WITH_TESTING) endfunction(inference_api_test) - cc_library(paddle_inference_api SRCS paddle_inference_api.cc paddle_inference_api_impl.cc DEPS ${FLUID_CORE_MODULES} ${GLOB_OP_LIB}) -if(WITH_TESTING) - cc_test(test_paddle_inference_api - SRCS test_paddle_inference_api.cc - DEPS paddle_inference_api) +cc_test(test_paddle_inference_api + SRCS test_paddle_inference_api.cc + DEPS paddle_inference_api) - inference_api_test(api_impl - ARGS test_word2vec test_image_classification) +inference_api_test(test_paddle_inference_api_impl + ARGS test_word2vec test_image_classification) + +if(WITH_TESTING) + add_subdirectory(demo) endif() diff --git a/paddle/contrib/inference/demo/CMakeLists.txt b/paddle/contrib/inference/demo/CMakeLists.txt new file mode 100644 index 00000000000..7b0fa77ad13 --- /dev/null +++ b/paddle/contrib/inference/demo/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +inference_api_test(simple_on_word2vec ARGS test_word2vec) diff --git a/paddle/contrib/inference/demo/simple_on_word2vec.cc b/paddle/contrib/inference/demo/simple_on_word2vec.cc new file mode 100644 index 00000000000..165d2e196b3 --- /dev/null +++ b/paddle/contrib/inference/demo/simple_on_word2vec.cc @@ -0,0 +1,71 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ + +/* + * This file contains a simple demo for how to take a model for inference. + */ + +#include +#include +#include +#include "paddle/contrib/inference/paddle_inference_api.h" + +namespace paddle { +namespace demo { + +DEFINE_string(dirname, "", "Directory of the inference model."); + +void Main(bool use_gpu) { + //# 1. Create PaddlePredictor with a config. + NativeConfig config; + config.model_dir = FLAGS_dirname + "word2vec.inference.model"; + config.use_gpu = use_gpu; + config.fraction_of_gpu_memory = 0.15; + config.device = 0; + auto predictor = + CreatePaddlePredictor(config); + + for (int batch_id = 0; batch_id < 3; batch_id++) { + //# 2. Prepare input. + int64_t data[4] = {1, 2, 3, 4}; + + PaddleBuf buf{.data = data, .length = sizeof(data)}; + PaddleTensor tensor{.name = "", + .shape = std::vector({4, 1}), + .data = buf, + .dtype = PaddleDType::INT64}; + + // For simplicity, we set all the slots with the same data. + std::vector slots(4, tensor); + + //# 3. Run + std::vector outputs; + CHECK(predictor->Run(slots, &outputs)); + + //# 4. Get output. + ASSERT_EQ(outputs.size(), 1); + LOG(INFO) << "output buffer size: " << outputs.front().data.length; + const size_t num_elements = outputs.front().data.length / sizeof(float); + // The outputs' buffers are in CPU memory. + for (size_t i = 0; i < std::min(5UL, num_elements); i++) { + LOG(INFO) << static_cast(outputs.front().data.data)[i]; + } + } +} + +TEST(demo, word2vec_cpu) { Main(false /*use_gpu*/); } +TEST(demo, word2vec_gpu) { Main(true /*use_gpu*/); } + +} // namespace demo +} // namespace paddle diff --git a/paddle/contrib/inference/paddle_inference_api_impl.cc b/paddle/contrib/inference/paddle_inference_api_impl.cc index 99a64662d4d..e7a8fa68b7f 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/paddle_inference_api_impl.cc @@ -248,9 +248,11 @@ CreatePaddlePredictor( VLOG(3) << "create NativePaddlePredictor"; if (config.use_gpu) { // 1. GPU memeroy - PADDLE_ENFORCE( - config.fraction_of_gpu_memory > 0.f, + PADDLE_ENFORCE_GT( + config.fraction_of_gpu_memory, + 0.f, "fraction_of_gpu_memory in the config should be set to range (0., 1.]"); + PADDLE_ENFORCE_GE(config.device, 0, "Invalid device id %d", config.device); std::vector flags; if (config.fraction_of_gpu_memory >= 0.0f || config.fraction_of_gpu_memory <= 0.95f) { diff --git a/paddle/contrib/inference/test_paddle_inference_api_impl.cc b/paddle/contrib/inference/test_paddle_inference_api_impl.cc index 07b17acd484..1f960677163 100644 --- a/paddle/contrib/inference/test_paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/test_paddle_inference_api_impl.cc @@ -74,7 +74,7 @@ TEST(paddle_inference_api_impl, word2vec) { ASSERT_EQ(outputs.size(), 1UL); size_t len = outputs[0].data.length; float* data = static_cast(outputs[0].data.data); - for (int j = 0; j < len / sizeof(float); ++j) { + for (size_t j = 0; j < len / sizeof(float); ++j) { ASSERT_LT(data[j], 1.0); ASSERT_GT(data[j], -1.0); } @@ -92,7 +92,7 @@ TEST(paddle_inference_api_impl, word2vec) { TestInference(config.model_dir, cpu_feeds, cpu_fetchs1); float* lod_data = output1.data(); - for (size_t i = 0; i < output1.numel(); ++i) { + for (int i = 0; i < output1.numel(); ++i) { EXPECT_LT(lod_data[i] - data[i], 1e-3); EXPECT_GT(lod_data[i] - data[i], -1e-3); } -- GitLab From 38f8182df63d33ff619297d95f5a4431bf8d5362 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 1 Jun 2018 20:41:18 +0800 Subject: [PATCH 134/913] work around with dummy test --- .../fluid/inference/tests/book/CMakeLists.txt | 8 ++++++- .../tests/book/test_inference_nlp.cc | 21 ++++++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/paddle/fluid/inference/tests/book/CMakeLists.txt b/paddle/fluid/inference/tests/book/CMakeLists.txt index 90357f99d1d..b33df2942a8 100644 --- a/paddle/fluid/inference/tests/book/CMakeLists.txt +++ b/paddle/fluid/inference/tests/book/CMakeLists.txt @@ -35,7 +35,13 @@ inference_test(image_classification ARGS vgg resnet) inference_test(label_semantic_roles) inference_test(recognize_digits ARGS mlp conv) inference_test(recommender_system) -inference_test(nlp) #inference_test(rnn_encoder_decoder) #inference_test(understand_sentiment ARGS conv) inference_test(word2vec) + +# This is an unly work around to make this test run +cc_test(test_inference_nlp + SRCS test_inference_nlp.cc + DEPS paddle_fluid + ARGS + --modelpath=${PADDLE_BINARY_DIR}/python/paddle/fluid/tests/book/recognize_digits_mlp.inference.model) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index c4d7b0bbf01..5ece6084df2 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -37,10 +37,22 @@ inline double GetCurrentMs() { return 1e+3 * time.tv_sec + 1e-3 * time.tv_usec; } +// This function just give dummy data for recognize_digits model. +size_t DummyData(std::vector* out) { + paddle::framework::LoDTensor input; + SetupTensor(&input, {1, 1, 28, 28}, -1.f, 1.f); + out->emplace_back(input); + return 1; +} + // Load the input word index data from file and save into LodTensor. // Return the size of words. size_t LoadData(std::vector* out, const std::string& filename) { + if (filename.empty()) { + return DummyData(out); + } + size_t sz = 0; std::fstream fin(filename); std::string line; @@ -130,9 +142,12 @@ void ThreadRunInfer( } TEST(inference, nlp) { - if (FLAGS_modelpath.empty() || FLAGS_datafile.empty()) { - LOG(FATAL) << "Usage: ./example --modelpath=path/to/your/model " - << "--datafile=path/to/your/data"; + if (FLAGS_modelpath.empty()) { + LOG(FATAL) << "Usage: ./example --modelpath=path/to/your/model"; + } + if (FLAGS_datafile.empty()) { + LOG(WARNING) << " Not data file provided, will use dummy data!" + << "Note: if you use nlp model, please provide data file."; } LOG(INFO) << "Model Path: " << FLAGS_modelpath; LOG(INFO) << "Data File: " << FLAGS_datafile; -- GitLab From 99d00cce9330dac56aac52788d7fba76d0137430 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 1 Jun 2018 21:04:51 +0800 Subject: [PATCH 135/913] follow comment: refine where time started --- paddle/fluid/inference/tests/book/test_inference_nlp.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index 5ece6084df2..c3bec279252 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -185,12 +185,12 @@ TEST(inference, nlp) { std::vector> jobs; SplitData(datasets, &jobs, FLAGS_num_threads); std::vector> threads; + start_ms = GetCurrentMs(); for (int i = 0; i < FLAGS_num_threads; ++i) { threads.emplace_back( new std::thread(ThreadRunInfer, i, &executor, scope.get(), std::ref(inference_program), std::ref(jobs))); } - start_ms = GetCurrentMs(); for (int i = 0; i < FLAGS_num_threads; ++i) { threads[i]->join(); } -- GitLab From e0a8c584701299017dda12214fed1bb108d8a9e9 Mon Sep 17 00:00:00 2001 From: Lei Wang Date: Fri, 1 Jun 2018 15:55:21 -0700 Subject: [PATCH 136/913] Doc: fix typo in var_desc.md. (#11130) --- doc/fluid/design/concepts/var_desc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/fluid/design/concepts/var_desc.md b/doc/fluid/design/concepts/var_desc.md index 6750323c016..8db67f6703d 100644 --- a/doc/fluid/design/concepts/var_desc.md +++ b/doc/fluid/design/concepts/var_desc.md @@ -35,7 +35,7 @@ The computation `Program` consists of nested `Blocks`. Each `Block` will consist ## Definition of VarType -A VarDesc should have a name, type and whether or not it is persistable. The are different kinds of variable types supported in PaddlePaddle, apart from the POD_Types like: `LOD_TENSOR`, `SELECTED_ROWS`, `FEED_MINIBATCH`, `FETCH_LIST`, `STEP_SCOPES`, `LOD_RANK_TABLE`, `LOD_TENSOR_ARRAY`, `PLACE_LIST`, `READER` and `CHANNEL`. These are declared inside `VarType`. A `VarDesc` then looks as the following: +A VarDesc should have a name, type and whether or not it is persistable. There are different kinds of variable types supported in PaddlePaddle, apart from the POD_Types like: `LOD_TENSOR`, `SELECTED_ROWS`, `FEED_MINIBATCH`, `FETCH_LIST`, `STEP_SCOPES`, `LOD_RANK_TABLE`, `LOD_TENSOR_ARRAY`, `PLACE_LIST`, `READER` and `CHANNEL`. These are declared inside `VarType`. A `VarDesc` then looks as the following: ```proto message VarDesc { -- GitLab From 906334a6a493b5f47cdb52fc93688ee945f96f27 Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Sun, 3 Jun 2018 16:12:38 +0800 Subject: [PATCH 137/913] fix build error on mac --- paddle/fluid/operators/detail/grpc_server.h | 4 ++-- paddle/fluid/operators/listen_and_serv_op.cc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/paddle/fluid/operators/detail/grpc_server.h b/paddle/fluid/operators/detail/grpc_server.h index d1fcbc414f1..eae87de4201 100644 --- a/paddle/fluid/operators/detail/grpc_server.h +++ b/paddle/fluid/operators/detail/grpc_server.h @@ -71,8 +71,8 @@ class AsyncGRPCServer final : public RPCServer { std::unique_ptr<::grpc::Server> server_; // condition of the sub program - std::mutex barrier_mutex_; - mutable int barrier_cond_step_; + // std::mutex barrier_mutex_; + // mutable int barrier_cond_step_; std::condition_variable barrier_condition_; std::mutex mutex_ready_; diff --git a/paddle/fluid/operators/listen_and_serv_op.cc b/paddle/fluid/operators/listen_and_serv_op.cc index 71e75c25321..66a0f87b46c 100644 --- a/paddle/fluid/operators/listen_and_serv_op.cc +++ b/paddle/fluid/operators/listen_and_serv_op.cc @@ -222,8 +222,8 @@ static void FillRequestCtx(detail::RequestHandler *h, framework::Scope *scope, h->SetDevCtx(dev_ctx); h->SetExecutor(executor); h->SetProgram(program); - h->SetPrefetchPreparedCtx(std::move( - std::unique_ptr(prefetch_ctx))); + h->SetPrefetchPreparedCtx( + std::unique_ptr(prefetch_ctx)); h->SetRPCServer(rpc_server); } -- GitLab From d3e99aeec33475cdb4a06bb0867f28503e91b3c7 Mon Sep 17 00:00:00 2001 From: Yuan Gao Date: Mon, 4 Jun 2018 09:46:49 +0800 Subject: [PATCH 138/913] add normalize switch to box_coder_op (#11129) --- .../fluid/operators/detection/box_coder_op.cc | 4 ++ .../fluid/operators/detection/box_coder_op.cu | 42 ++++++++++-------- .../fluid/operators/detection/box_coder_op.h | 44 +++++++++++-------- .../tests/unittests/test_box_coder_op.py | 32 ++++++++++---- 4 files changed, 78 insertions(+), 44 deletions(-) diff --git a/paddle/fluid/operators/detection/box_coder_op.cc b/paddle/fluid/operators/detection/box_coder_op.cc index 74848005d0b..76ef08cb9ad 100644 --- a/paddle/fluid/operators/detection/box_coder_op.cc +++ b/paddle/fluid/operators/detection/box_coder_op.cc @@ -91,6 +91,10 @@ class BoxCoderOpMaker : public framework::OpProtoAndCheckerMaker { "the code type used with the target box") .SetDefault("encode_center_size") .InEnum({"encode_center_size", "decode_center_size"}); + AddAttr("box_normalized", + "(bool, default true) " + "whether treat the priorbox as a noramlized box") + .SetDefault(true); AddOutput("OutputBox", "(LoDTensor or Tensor) " "When code_type is 'encode_center_size', the output tensor of " diff --git a/paddle/fluid/operators/detection/box_coder_op.cu b/paddle/fluid/operators/detection/box_coder_op.cu index 8cef8e03439..fc7eb5d1ed7 100644 --- a/paddle/fluid/operators/detection/box_coder_op.cu +++ b/paddle/fluid/operators/detection/box_coder_op.cu @@ -20,15 +20,16 @@ __global__ void EncodeCenterSizeKernel(const T* prior_box_data, const T* prior_box_var_data, const T* target_box_data, const int row, const int col, const int len, - T* output) { + const bool normalized, T* output) { const int idx = threadIdx.x + blockIdx.x * blockDim.x; if (idx < row * col) { const int row_idx = idx / col; const int col_idx = idx % col; - T prior_box_width = - prior_box_data[col_idx * len + 2] - prior_box_data[col_idx * len]; - T prior_box_height = - prior_box_data[col_idx * len + 3] - prior_box_data[col_idx * len + 1]; + T prior_box_width = prior_box_data[col_idx * len + 2] - + prior_box_data[col_idx * len] + (normalized == false); + T prior_box_height = prior_box_data[col_idx * len + 3] - + prior_box_data[col_idx * len + 1] + + (normalized == false); T prior_box_center_x = (prior_box_data[col_idx * len + 2] + prior_box_data[col_idx * len]) / 2; T prior_box_center_y = (prior_box_data[col_idx * len + 3] + @@ -41,10 +42,11 @@ __global__ void EncodeCenterSizeKernel(const T* prior_box_data, T target_box_center_y = (target_box_data[row_idx * len + 3] + target_box_data[row_idx * len + 1]) / 2; - T target_box_width = - target_box_data[row_idx * len + 2] - target_box_data[row_idx * len]; - T target_box_height = - target_box_data[row_idx * len + 3] - target_box_data[row_idx * len + 1]; + T target_box_width = target_box_data[row_idx * len + 2] - + target_box_data[row_idx * len] + (normalized == false); + T target_box_height = target_box_data[row_idx * len + 3] - + target_box_data[row_idx * len + 1] + + (normalized == false); output[idx * len] = (target_box_center_x - prior_box_center_x) / prior_box_width / prior_box_var_data[col_idx * len]; @@ -63,14 +65,15 @@ __global__ void DecodeCenterSizeKernel(const T* prior_box_data, const T* prior_box_var_data, const T* target_box_data, const int row, const int col, const int len, - T* output) { + const bool normalized, T* output) { const int idx = threadIdx.x + blockIdx.x * blockDim.x; if (idx < row * col) { const int col_idx = idx % col; - T prior_box_width = - prior_box_data[col_idx * len + 2] - prior_box_data[col_idx * len]; - T prior_box_height = - prior_box_data[col_idx * len + 3] - prior_box_data[col_idx * len + 1]; + T prior_box_width = prior_box_data[col_idx * len + 2] - + prior_box_data[col_idx * len] + (normalized == false); + T prior_box_height = prior_box_data[col_idx * len + 3] - + prior_box_data[col_idx * len + 1] + + (normalized == false); T prior_box_center_x = (prior_box_data[col_idx * len + 2] + prior_box_data[col_idx * len]) / 2; T prior_box_center_y = (prior_box_data[col_idx * len + 3] + @@ -93,8 +96,10 @@ __global__ void DecodeCenterSizeKernel(const T* prior_box_data, output[idx * len] = target_box_center_x - target_box_width / 2; output[idx * len + 1] = target_box_center_y - target_box_height / 2; - output[idx * len + 2] = target_box_center_x + target_box_width / 2; - output[idx * len + 3] = target_box_center_y + target_box_height / 2; + output[idx * len + 2] = + target_box_center_x + target_box_width / 2 - (normalized == false); + output[idx * len + 3] = + target_box_center_y + target_box_height / 2 - (normalized == false); } } @@ -128,14 +133,15 @@ class BoxCoderCUDAKernel : public framework::OpKernel { T* output = output_box->data(); auto code_type = GetBoxCodeType(context.Attr("code_type")); + bool normalized = context.Attr("box_normalized"); if (code_type == BoxCodeType::kEncodeCenterSize) { EncodeCenterSizeKernel<<>>( prior_box_data, prior_box_var_data, target_box_data, row, col, len, - output); + normalized, output); } else if (code_type == BoxCodeType::kDecodeCenterSize) { DecodeCenterSizeKernel<<>>( prior_box_data, prior_box_var_data, target_box_data, row, col, len, - output); + normalized, output); } } }; diff --git a/paddle/fluid/operators/detection/box_coder_op.h b/paddle/fluid/operators/detection/box_coder_op.h index 77fc6c2b62a..3dc68935ac1 100644 --- a/paddle/fluid/operators/detection/box_coder_op.h +++ b/paddle/fluid/operators/detection/box_coder_op.h @@ -34,7 +34,7 @@ class BoxCoderKernel : public framework::OpKernel { void EncodeCenterSize(const framework::Tensor& target_box, const framework::Tensor& prior_box, const framework::Tensor& prior_box_var, - T* output) const { + const bool normalized, T* output) const { int64_t row = target_box.dims()[0]; int64_t col = prior_box.dims()[0]; int64_t len = prior_box.dims()[1]; @@ -44,10 +44,11 @@ class BoxCoderKernel : public framework::OpKernel { for (int64_t i = 0; i < row; ++i) { for (int64_t j = 0; j < col; ++j) { - T prior_box_width = - prior_box_data[j * len + 2] - prior_box_data[j * len]; - T prior_box_height = - prior_box_data[j * len + 3] - prior_box_data[j * len + 1]; + T prior_box_width = prior_box_data[j * len + 2] - + prior_box_data[j * len] + (normalized == false); + T prior_box_height = prior_box_data[j * len + 3] - + prior_box_data[j * len + 1] + + (normalized == false); T prior_box_center_x = (prior_box_data[j * len + 2] + prior_box_data[j * len]) / 2; T prior_box_center_y = @@ -57,10 +58,11 @@ class BoxCoderKernel : public framework::OpKernel { (target_box_data[i * len + 2] + target_box_data[i * len]) / 2; T target_box_center_y = (target_box_data[i * len + 3] + target_box_data[i * len + 1]) / 2; - T target_box_width = - target_box_data[i * len + 2] - target_box_data[i * len]; - T target_box_height = - target_box_data[i * len + 3] - target_box_data[i * len + 1]; + T target_box_width = target_box_data[i * len + 2] - + target_box_data[i * len] + (normalized == false); + T target_box_height = target_box_data[i * len + 3] - + target_box_data[i * len + 1] + + (normalized == false); size_t offset = i * col * len + j * len; output[offset] = (target_box_center_x - prior_box_center_x) / @@ -79,7 +81,7 @@ class BoxCoderKernel : public framework::OpKernel { void DecodeCenterSize(const framework::Tensor& target_box, const framework::Tensor& prior_box, const framework::Tensor& prior_box_var, - T* output) const { + const bool normalized, T* output) const { int64_t row = target_box.dims()[0]; int64_t col = prior_box.dims()[0]; int64_t len = prior_box.dims()[1]; @@ -91,10 +93,11 @@ class BoxCoderKernel : public framework::OpKernel { for (int64_t i = 0; i < row; ++i) { for (int64_t j = 0; j < col; ++j) { size_t offset = i * col * len + j * len; - T prior_box_width = - prior_box_data[j * len + 2] - prior_box_data[j * len]; - T prior_box_height = - prior_box_data[j * len + 3] - prior_box_data[j * len + 1]; + T prior_box_width = prior_box_data[j * len + 2] - + prior_box_data[j * len] + (normalized == false); + T prior_box_height = prior_box_data[j * len + 3] - + prior_box_data[j * len + 1] + + (normalized == false); T prior_box_center_x = (prior_box_data[j * len + 2] + prior_box_data[j * len]) / 2; T prior_box_center_y = @@ -116,8 +119,10 @@ class BoxCoderKernel : public framework::OpKernel { output[offset] = target_box_center_x - target_box_width / 2; output[offset + 1] = target_box_center_y - target_box_height / 2; - output[offset + 2] = target_box_center_x + target_box_width / 2; - output[offset + 3] = target_box_center_y + target_box_height / 2; + output[offset + 2] = + target_box_center_x + target_box_width / 2 - (normalized == false); + output[offset + 3] = + target_box_center_y + target_box_height / 2 - (normalized == false); } } } @@ -139,11 +144,14 @@ class BoxCoderKernel : public framework::OpKernel { output_box->mutable_data({row, col, len}, context.GetPlace()); auto code_type = GetBoxCodeType(context.Attr("code_type")); + bool normalized = context.Attr("box_normalized"); T* output = output_box->data(); if (code_type == BoxCodeType::kEncodeCenterSize) { - EncodeCenterSize(*target_box, *prior_box, *prior_box_var, output); + EncodeCenterSize(*target_box, *prior_box, *prior_box_var, normalized, + output); } else if (code_type == BoxCodeType::kDecodeCenterSize) { - DecodeCenterSize(*target_box, *prior_box, *prior_box_var, output); + DecodeCenterSize(*target_box, *prior_box, *prior_box_var, normalized, + output); } } }; diff --git a/python/paddle/fluid/tests/unittests/test_box_coder_op.py b/python/paddle/fluid/tests/unittests/test_box_coder_op.py index 56f5af91d8e..a31b7ea322f 100644 --- a/python/paddle/fluid/tests/unittests/test_box_coder_op.py +++ b/python/paddle/fluid/tests/unittests/test_box_coder_op.py @@ -19,7 +19,8 @@ import math from op_test import OpTest -def box_coder(target_box, prior_box, prior_box_var, output_box, code_type): +def box_coder(target_box, prior_box, prior_box_var, output_box, code_type, + box_normalized): prior_box_x = ( (prior_box[:, 2] + prior_box[:, 0]) / 2).reshape(1, prior_box.shape[0]) prior_box_y = ( @@ -30,6 +31,9 @@ def box_coder(target_box, prior_box, prior_box_var, output_box, code_type): (prior_box[:, 3] - prior_box[:, 1])).reshape(1, prior_box.shape[0]) prior_box_var = prior_box_var.reshape(1, prior_box_var.shape[0], prior_box_var.shape[1]) + if not box_normalized: + prior_box_height = prior_box_height + 1 + prior_box_width = prior_box_width + 1 if (code_type == "EncodeCenterSize"): target_box_x = ((target_box[:, 2] + target_box[:, 0]) / 2).reshape( @@ -40,6 +44,9 @@ def box_coder(target_box, prior_box, prior_box_var, output_box, code_type): target_box.shape[0], 1) target_box_height = ((target_box[:, 3] - target_box[:, 1])).reshape( target_box.shape[0], 1) + if not box_normalized: + target_box_height = target_box_height + 1 + target_box_width = target_box_width + 1 output_box[:,:,0] = (target_box_x - prior_box_x) / prior_box_width / \ prior_box_var[:,:,0] @@ -64,9 +71,13 @@ def box_coder(target_box, prior_box, prior_box_var, output_box, code_type): output_box[:, :, 1] = target_box_y - target_box_height / 2 output_box[:, :, 2] = target_box_x + target_box_width / 2 output_box[:, :, 3] = target_box_y + target_box_height / 2 + if not box_normalized: + output_box[:, :, 2] = output_box[:, :, 2] - 1 + output_box[:, :, 3] = output_box[:, :, 3] - 1 -def batch_box_coder(prior_box, prior_box_var, target_box, lod, code_type): +def batch_box_coder(prior_box, prior_box_var, target_box, lod, code_type, + box_normalized): n = target_box.shape[0] m = prior_box.shape[0] output_box = np.zeros((n, m, 4), dtype=np.float32) @@ -74,11 +85,11 @@ def batch_box_coder(prior_box, prior_box_var, target_box, lod, code_type): if (code_type == "EncodeCenterSize"): box_coder(target_box[lod[i]:lod[i + 1], :], prior_box, prior_box_var, output_box[lod[i]:lod[i + 1], :, :], - code_type) + code_type, box_normalized) elif (code_type == "DecodeCenterSize"): box_coder(target_box[lod[i]:lod[i + 1], :, :], prior_box, prior_box_var, output_box[lod[i]:lod[i + 1], :, :], - code_type) + code_type, box_normalized) return output_box @@ -93,15 +104,19 @@ class TestBoxCoderOp(OpTest): prior_box_var = np.random.random((10, 4)).astype('float32') target_box = np.random.random((5, 10, 4)).astype('float32') code_type = "DecodeCenterSize" + box_normalized = False output_box = batch_box_coder(prior_box, prior_box_var, target_box, - lod[0], code_type) + lod[0], code_type, box_normalized) self.inputs = { 'PriorBox': prior_box, 'PriorBoxVar': prior_box_var, 'TargetBox': target_box, } - self.attrs = {'code_type': 'decode_center_size'} + self.attrs = { + 'code_type': 'decode_center_size', + 'box_normalized': False + } self.outputs = {'OutputBox': output_box} @@ -116,15 +131,16 @@ class TestBoxCoderOpWithLoD(OpTest): prior_box_var = np.random.random((10, 4)).astype('float32') target_box = np.random.random((20, 4)).astype('float32') code_type = "EncodeCenterSize" + box_normalized = True output_box = batch_box_coder(prior_box, prior_box_var, target_box, - lod[0], code_type) + lod[0], code_type, box_normalized) self.inputs = { 'PriorBox': prior_box, 'PriorBoxVar': prior_box_var, 'TargetBox': (target_box, lod), } - self.attrs = {'code_type': 'encode_center_size'} + self.attrs = {'code_type': 'encode_center_size', 'box_normalized': True} self.outputs = {'OutputBox': output_box} -- GitLab From 7218f4feb28e295b55e0eedd1d0e437e190c4de8 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Mon, 4 Jun 2018 10:42:26 +0800 Subject: [PATCH 139/913] update by comment --- .../fluid/tests/unittests/test_listen_and_serv_op.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py b/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py index ad479657cc2..6be24b09447 100644 --- a/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py +++ b/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py @@ -72,8 +72,8 @@ class TestListenAndServOp(OpTest): def _wait_ps_ready(self, pid): retry_times = self.ps_timeout while True: - time.sleep(1) assert retry_times >= 0, "wait ps ready failed" + time.sleep(0.5) try: # the listen_and_serv_op would touch a file which contains the listen port # on the /tmp directory until it was ready to process all the RPC call. @@ -87,15 +87,15 @@ class TestListenAndServOp(OpTest): pid = self._start_pserver(False, True) self._wait_ps_ready(pid) - # raise SIGINT to pserver - os.kill(pid, signal.SIGINT) + # raise SIGTERM to pserver + os.kill(pid, signal.SIGTERM) # run pserver on CPU in async mode pid = self._start_pserver(False, False) self._wait_ps_ready(pid) # raise SIGTERM to pserver - os.kill(pid, signal.SIGINT) + os.kill(pid, signal.SIGTERM) if __name__ == '__main__': -- GitLab From ee4e567dea8074245c89be79b0267a515a84c6b6 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Mon, 4 Jun 2018 10:45:59 +0800 Subject: [PATCH 140/913] Creating readers before training begining --- .../fluid/operators/reader/open_files_op.cc | 52 ++++++++++--------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/paddle/fluid/operators/reader/open_files_op.cc b/paddle/fluid/operators/reader/open_files_op.cc index 8c0dac65dd6..c0526e45f4d 100644 --- a/paddle/fluid/operators/reader/open_files_op.cc +++ b/paddle/fluid/operators/reader/open_files_op.cc @@ -26,7 +26,11 @@ class MultiFileReader : public framework::ReaderBase { MultiFileReader(const std::vector& file_names, const std::vector& dims, size_t thread_num, size_t buffer_size) - : file_names_(file_names), dims_(dims), buffer_size_(buffer_size) { + : buffer_size_(buffer_size) { + readers_.resize(file_names.size()); + for (const std::string& f_name : file_names) { + readers_.emplace_back(CreateReaderByFileName(f_name, dims)); + } prefetchers_.resize(thread_num); StartNewScheduler(); } @@ -40,14 +44,13 @@ class MultiFileReader : public framework::ReaderBase { void StartNewScheduler(); void EndScheduler(); void ScheduleThreadFunc(); - void PrefetchThreadFunc(std::string file_name, size_t thread_idx); + void PrefetchThreadFunc(size_t reader_idx, size_t thread_idx); - std::vector file_names_; - std::vector dims_; + std::vector> readers_; std::thread scheduler_; std::vector prefetchers_; size_t buffer_size_; - reader::BlockingQueue* waiting_file_idx_; + reader::BlockingQueue* waiting_reader_idx_; reader::BlockingQueue* available_thread_idx_; reader::BlockingQueue>* buffer_; }; @@ -60,20 +63,23 @@ void MultiFileReader::ReadNext(std::vector* out) { void MultiFileReader::ReInit() { EndScheduler(); + for (auto& reader : readers_) { + reader->ReInit(); + } StartNewScheduler(); } void MultiFileReader::StartNewScheduler() { size_t thread_num = prefetchers_.size(); - waiting_file_idx_ = new reader::BlockingQueue(file_names_.size()); + waiting_reader_idx_ = new reader::BlockingQueue(readers_.size()); available_thread_idx_ = new reader::BlockingQueue(thread_num); buffer_ = new reader::BlockingQueue>( buffer_size_); - for (size_t i = 0; i < file_names_.size(); ++i) { - waiting_file_idx_->Send(i); + for (size_t i = 0; i < readers_.size(); ++i) { + waiting_reader_idx_->Send(i); } - waiting_file_idx_->Close(); + waiting_reader_idx_->Close(); for (size_t i = 0; i < thread_num; ++i) { available_thread_idx_->Send(i); } @@ -84,13 +90,13 @@ void MultiFileReader::StartNewScheduler() { void MultiFileReader::EndScheduler() { available_thread_idx_->Close(); buffer_->Close(); - waiting_file_idx_->Close(); + waiting_reader_idx_->Close(); if (scheduler_.joinable()) { scheduler_.join(); } delete buffer_; delete available_thread_idx_; - delete waiting_file_idx_; + delete waiting_reader_idx_; } void MultiFileReader::ScheduleThreadFunc() { @@ -102,12 +108,11 @@ void MultiFileReader::ScheduleThreadFunc() { if (prefetcher.joinable()) { prefetcher.join(); } - size_t file_idx; - if (waiting_file_idx_->Receive(&file_idx)) { + size_t reader_idx; + if (waiting_reader_idx_->Receive(&reader_idx)) { // Still have files to read. Start a new prefetch thread. - std::string file_name = file_names_[file_idx]; - prefetcher = std::thread([this, file_name, thread_idx] { - PrefetchThreadFunc(file_name, thread_idx); + prefetcher = std::thread([this, reader_idx, thread_idx] { + PrefetchThreadFunc(reader_idx, thread_idx); }); } else { // No more file to read. @@ -129,11 +134,9 @@ void MultiFileReader::ScheduleThreadFunc() { VLOG(5) << "MultiFileReader schedule thread terminates."; } -void MultiFileReader::PrefetchThreadFunc(std::string file_name, - size_t thread_idx) { - VLOG(5) << "The prefetch thread of file '" << file_name << "' starts."; - std::unique_ptr reader = - CreateReaderByFileName(file_name, dims_); +void MultiFileReader::PrefetchThreadFunc(size_t reader_idx, size_t thread_idx) { + VLOG(5) << "The prefetch thread of file idx '" << reader_idx << "' starts."; + std::unique_ptr& reader = readers_[reader_idx]; while (true) { std::vector ins; reader->ReadNext(&ins); @@ -144,8 +147,8 @@ void MultiFileReader::PrefetchThreadFunc(std::string file_name, buffer_->Send(std::move(ins)); } catch (paddle::platform::EnforceNotMet e) { VLOG(5) << "WARNING: The buffer channel has been closed. The prefetch " - "thread of file '" - << file_name << "' will terminate."; + "thread of file idx '" + << reader_idx << "' will terminate."; break; } } @@ -154,7 +157,8 @@ void MultiFileReader::PrefetchThreadFunc(std::string file_name, VLOG(5) << "WARNING: The available_thread_idx_ channel has been closed. " "Fail to send thread_idx."; } - VLOG(5) << "The prefetch thread of file '" << file_name << "' terminates."; + VLOG(5) << "The prefetch thread of file idx '" << reader_idx + << "' terminates."; } class OpenFilesOp : public framework::OperatorBase { -- GitLab From 7f5eb9f68743093ed14d5c35ebd0d266800ac939 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Mon, 4 Jun 2018 10:46:02 +0800 Subject: [PATCH 141/913] update by comment --- .../paddle/fluid/tests/unittests/test_listen_and_serv_op.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py b/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py index 6be24b09447..1226027ddc9 100644 --- a/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py +++ b/python/paddle/fluid/tests/unittests/test_listen_and_serv_op.py @@ -82,6 +82,10 @@ class TestListenAndServOp(OpTest): except os.error: retry_times -= 1 + def test_rpc_interfaces(self): + # TODO(Yancey1989): need to make sure the rpc interface correctly. + pass + def test_handle_signal_in_serv_op(self): # run pserver on CPU in sync mode pid = self._start_pserver(False, True) -- GitLab From 6ae7cbe252178e7bd3e5c3b7cde21581948b478f Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Mon, 4 Jun 2018 11:08:08 +0800 Subject: [PATCH 142/913] follow comments --- .../fluid/inference/tests/book/CMakeLists.txt | 3 ++- .../tests/book/test_inference_nlp.cc | 21 ++++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/paddle/fluid/inference/tests/book/CMakeLists.txt b/paddle/fluid/inference/tests/book/CMakeLists.txt index b33df2942a8..2fa5a9540ba 100644 --- a/paddle/fluid/inference/tests/book/CMakeLists.txt +++ b/paddle/fluid/inference/tests/book/CMakeLists.txt @@ -40,8 +40,9 @@ inference_test(recommender_system) inference_test(word2vec) # This is an unly work around to make this test run +# TODO(TJ): clean me up cc_test(test_inference_nlp SRCS test_inference_nlp.cc DEPS paddle_fluid ARGS - --modelpath=${PADDLE_BINARY_DIR}/python/paddle/fluid/tests/book/recognize_digits_mlp.inference.model) + --model_path=${PADDLE_BINARY_DIR}/python/paddle/fluid/tests/book/recognize_digits_mlp.inference.model) diff --git a/paddle/fluid/inference/tests/book/test_inference_nlp.cc b/paddle/fluid/inference/tests/book/test_inference_nlp.cc index c3bec279252..70aa42ac411 100644 --- a/paddle/fluid/inference/tests/book/test_inference_nlp.cc +++ b/paddle/fluid/inference/tests/book/test_inference_nlp.cc @@ -24,8 +24,8 @@ limitations under the License. */ #include #endif -DEFINE_string(modelpath, "", "Directory of the inference model."); -DEFINE_string(datafile, "", "File of input index data."); +DEFINE_string(model_path, "", "Directory of the inference model."); +DEFINE_string(data_file, "", "File of input index data."); DEFINE_int32(repeat, 100, "Running the inference program repeat times"); DEFINE_bool(use_mkldnn, false, "Use MKLDNN to run inference"); DEFINE_bool(prepare_vars, true, "Prepare variables before executor"); @@ -65,6 +65,7 @@ size_t LoadData(std::vector* out, ids.push_back(stoi(field)); } if (ids.size() >= 1024) { + // Synced with NLP guys, they will ignore input larger then 1024 continue; } @@ -142,18 +143,18 @@ void ThreadRunInfer( } TEST(inference, nlp) { - if (FLAGS_modelpath.empty()) { - LOG(FATAL) << "Usage: ./example --modelpath=path/to/your/model"; + if (FLAGS_model_path.empty()) { + LOG(FATAL) << "Usage: ./example --model_path=path/to/your/model"; } - if (FLAGS_datafile.empty()) { - LOG(WARNING) << " Not data file provided, will use dummy data!" + if (FLAGS_data_file.empty()) { + LOG(WARNING) << "No data file provided, will use dummy data!" << "Note: if you use nlp model, please provide data file."; } - LOG(INFO) << "Model Path: " << FLAGS_modelpath; - LOG(INFO) << "Data File: " << FLAGS_datafile; + LOG(INFO) << "Model Path: " << FLAGS_model_path; + LOG(INFO) << "Data File: " << FLAGS_data_file; std::vector datasets; - size_t num_total_words = LoadData(&datasets, FLAGS_datafile); + size_t num_total_words = LoadData(&datasets, FLAGS_data_file); LOG(INFO) << "Number of samples (seq_len<1024): " << datasets.size(); LOG(INFO) << "Total number of words: " << num_total_words; @@ -168,7 +169,7 @@ TEST(inference, nlp) { // 2. Initialize the inference_program and load parameters std::unique_ptr inference_program; inference_program = - InitProgram(&executor, scope.get(), FLAGS_modelpath, model_combined); + InitProgram(&executor, scope.get(), FLAGS_model_path, model_combined); if (FLAGS_use_mkldnn) { EnableMKLDNN(inference_program); } -- GitLab From f1facb7a3c8b61d9231d27408b173e388818f44b Mon Sep 17 00:00:00 2001 From: weixing02 Date: Mon, 4 Jun 2018 11:33:35 +0800 Subject: [PATCH 143/913] Fix links --- doc/v2/build_and_install/build_from_source_cn.rst | 12 ++++++------ doc/v2/build_and_install/build_from_source_en.rst | 12 +++++++----- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/doc/v2/build_and_install/build_from_source_cn.rst b/doc/v2/build_and_install/build_from_source_cn.rst index 741c01ce542..de7e9eb75c3 100644 --- a/doc/v2/build_and_install/build_from_source_cn.rst +++ b/doc/v2/build_and_install/build_from_source_cn.rst @@ -23,7 +23,7 @@ PaddlePaddle需要使用Docker环境完成编译,这样可以免去单独安 在 `这里 `__ 找到 paddle_manylinux_devel 镜像的编译以及使用方法。或者参考下述可选步骤,从源码中构建用于编译PaddlePaddle的Docker镜像。 -如果您选择不使用Docker镜像,则需要在本机安装下面章节列出的 `编译依赖`_ 之后才能开始编译的步骤。 +如果您选择不使用Docker镜像,则需要在本机安装下面章节列出的 :ref:`编译依赖 <_compile_deps>` 之后才能开始编译的步骤。 编译PaddlePaddle,需要执行: @@ -106,7 +106,7 @@ PaddlePaddle需要使用Docker环境完成编译,这样可以免去单独安 - 学习 Docker 有多难? - 理解 Docker 并不难,大概花十分钟看一下[这篇文章](https://zhuanlan.zhihu.com/p/19902938)。这可以帮您省掉花一小时安装和配置各种开发工具,以及切换机器时需要新安装的辛苦。别忘了 PaddlePaddle 更新可能导致需要新的开发工具。更别提简化问题复现带来的好处了。 + 理解 Docker 并不难,大概花十分钟看一下 `这篇文章 `_ 。这可以帮您省掉花一小时安装和配置各种开发工具,以及切换机器时需要新安装的辛苦。别忘了 PaddlePaddle 更新可能导致需要新的开发工具。更别提简化问题复现带来的好处了。 - 我可以用 IDE 吗? @@ -123,7 +123,7 @@ PaddlePaddle需要使用Docker环境完成编译,这样可以免去单独安 - 可以并行编译吗? - 是的。我们的 Docker image 运行一个 [Bash 脚本](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/scripts/docker/build.sh)。这个脚本调用 `make -j$(nproc)` 来启动和 CPU 核一样多的进程来并行编译。 + 是的。我们的 Docker image 运行一个 `Bash脚本 `_ 。这个脚本调用 `make -j$(nproc)` 来启动和 CPU 核一样多的进程来并行编译。 - Docker 需要 sudo @@ -131,11 +131,11 @@ PaddlePaddle需要使用Docker环境完成编译,这样可以免去单独安 - 在 Windows/MacOS 上编译很慢 - Docker 在 Windows 和 MacOS 都可以运行。不过实际上是运行在一个 Linux 虚拟机上。可能需要注意给这个虚拟机多分配一些 CPU 和内存,以保证编译高效。具体做法请参考[这个issue](https://github.com/PaddlePaddle/Paddle/issues/627)。 + Docker 在 Windows 和 MacOS 都可以运行。不过实际上是运行在一个 Linux 虚拟机上。可能需要注意给这个虚拟机多分配一些 CPU 和内存,以保证编译高效。具体做法请参考 `这个issue `_ 。 - 磁盘不够 - 本文中的例子里,`docker run` 命令里都用了 `--rm` 参数,这样保证运行结束之后的 containers 不会保留在磁盘上。可以用 `docker ps -a` 命令看到停止后但是没有删除的 containers。`docker build` 命令有时候会产生一些中间结果,是没有名字的 images,也会占用磁盘。可以参考[这篇文章](https://zaiste.net/posts/removing_docker_containers/)来清理这些内容。 + 本文中的例子里,`docker run` 命令里都用了 `--rm` 参数,这样保证运行结束之后的 containers 不会保留在磁盘上。可以用 `docker ps -a` 命令看到停止后但是没有删除的 containers。`docker build` 命令有时候会产生一些中间结果,是没有名字的 images,也会占用磁盘。可以参考 `这篇文章 `_ 来清理这些内容。 .. _compile_deps: @@ -211,7 +211,7 @@ PaddlePaddle可以使用cuDNN v5.1之后的任何一个版本来编译运行, 编译选项的设置 ++++++++++++++ -PaddePaddle通过编译时指定路径来实现引用各种BLAS/CUDA/cuDNN库。cmake编译时,首先在系统路径( :code:`/usr/lib:/usr/local/lib` )中搜索这几个库,同时也会读取相关路径变量来进行搜索。 通过使用 ``-D`` 命令可以设置,例如 +PaddePaddle通过编译时指定路径来实现引用各种BLAS/CUDA/cuDNN库。cmake编译时,首先在系统路径( :code:`/usr/lib:/usr/local/lib` )中搜索这几个库,同时也会读取相关路径变量来进行搜索。 通过使用 ``-D`` 命令可以设置,例如 .. code-block:: bash diff --git a/doc/v2/build_and_install/build_from_source_en.rst b/doc/v2/build_and_install/build_from_source_en.rst index b06c43e19dc..b08b45d43ec 100644 --- a/doc/v2/build_and_install/build_from_source_en.rst +++ b/doc/v2/build_and_install/build_from_source_en.rst @@ -11,7 +11,7 @@ To build PaddlePaddle, you need 1. A computer -- Linux, Windows, MacOS. 2. Docker. -Nothing else. Not even Python and GCC, because you can install all build tools into a Docker image. +Nothing else. Not even Python and GCC, because you can install all build tools into a Docker image. We run all the tools by running this image. .. _build_step: @@ -26,6 +26,8 @@ you can also find how to build and use paddle_manylinux_devel Docker image from `here `__ Or you can build your own image from source as the optional step below: +If you don't wish to use docker,you need to install several compile dependencies manually as :ref:`Compile Dependencies <_compile_deps>` shows to start compilation. + .. code-block:: bash # 1. clone the source code @@ -108,7 +110,7 @@ Frequently Asked Questions - How difficult is it to learn Docker? - It takes you ten minutes to read [an introductory article](https://docs.docker.com/get-started) and saves you more than one hour to install all required build tools, configure them, especially when new versions of PaddlePaddle require some new tools. Not even to mention the time saved when other people trying to reproduce the issue you have. + It takes you ten minutes to read `an introductory article `_ and saves you more than one hour to install all required build tools, configure them, especially when new versions of PaddlePaddle require some new tools. Not even to mention the time saved when other people trying to reproduce the issue you have. - Can I use my favorite IDE? @@ -125,7 +127,7 @@ Frequently Asked Questions - Does Docker do parallel building? - Our building Docker image runs a [Bash script](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/scripts/docker/build.sh), which calls `make -j$(nproc)` to starts as many processes as the number of your CPU cores. + Our building Docker image runs a `Bash script `_ , which calls `make -j$(nproc)` to starts as many processes as the number of your CPU cores. - Docker requires sudo @@ -133,11 +135,11 @@ Frequently Asked Questions - Docker on Windows/MacOS builds slowly - On Windows and MacOS, Docker containers run in a Linux VM. You might want to give this VM some more memory and CPUs so to make the building efficient. Please refer to [this issue](https://github.com/PaddlePaddle/Paddle/issues/627) for details. + On Windows and MacOS, Docker containers run in a Linux VM. You might want to give this VM some more memory and CPUs so to make the building efficient. Please refer to `this issue `_ for details. - Not enough disk space - Examples in this article use option `--rm` with the `docker run` command. This option ensures that stopped containers do not exist on hard disks. We can use `docker ps -a` to list all containers, including stopped. Sometimes `docker build` generates some intermediate dangling images, which also take disk space. To clean them, please refer to [this article](https://zaiste.net/posts/removing_docker_containers/). + Examples in this article use option `--rm` with the `docker run` command. This option ensures that stopped containers do not exist on hard disks. We can use `docker ps -a` to list all containers, including stopped. Sometimes `docker build` generates some intermediate dangling images, which also take disk space. To clean them, please refer to `this article `_ . .. _compile_deps: -- GitLab From 05a2a1a9064cdd1bf02f46603b2ee814bee4031d Mon Sep 17 00:00:00 2001 From: weixing02 Date: Mon, 4 Jun 2018 05:24:31 +0000 Subject: [PATCH 144/913] update apis --- doc/fluid/api/io.rst | 18 ++++++++++ doc/fluid/api/layers.rst | 72 ++++++++++++++++++++++++------------- doc/fluid/api/optimizer.rst | 44 ++++++++--------------- doc/fluid/api/profiler.rst | 12 +++++++ 4 files changed, 92 insertions(+), 54 deletions(-) diff --git a/doc/fluid/api/io.rst b/doc/fluid/api/io.rst index dd9d88b6699..3e956f8302d 100644 --- a/doc/fluid/api/io.rst +++ b/doc/fluid/api/io.rst @@ -59,3 +59,21 @@ get_inference_program .. autofunction:: paddle.fluid.io.get_inference_program :noindex: +save_checkpoint +--------------- + +.. autofunction:: paddle.fluid.io.save_checkpoint + :noindex: + +load_checkpoint +--------------- + +.. autofunction:: paddle.fluid.io.load_checkpoint + :noindex: + +clean_checkpoint +---------------- + +.. autofunction:: paddle.fluid.io.clean_checkpoint + :noindex: + diff --git a/doc/fluid/api/layers.rst b/doc/fluid/api/layers.rst index 5329adaa18b..f78e6db3268 100644 --- a/doc/fluid/api/layers.rst +++ b/doc/fluid/api/layers.rst @@ -181,6 +181,12 @@ Print .. autofunction:: paddle.fluid.layers.Print :noindex: +is_empty +-------- + +.. autofunction:: paddle.fluid.layers.is_empty + :noindex: + device ====== @@ -255,6 +261,19 @@ double_buffer .. autofunction:: paddle.fluid.layers.double_buffer :noindex: +random_data_generator +--------------------- + +.. autofunction:: paddle.fluid.layers.random_data_generator + :noindex: + +Preprocessor +------------ + +.. autoclass:: paddle.fluid.layers.Preprocessor + :members: + :noindex: + nn == @@ -594,6 +613,29 @@ roi_pool .. autofunction:: paddle.fluid.layers.roi_pool :noindex: +dice_loss +--------- + +.. autofunction:: paddle.fluid.layers.dice_loss + :noindex: + +resize_bilinear +--------------- + +.. autofunction:: paddle.fluid.layers.resize_bilinear + :noindex: + +gather +------ + +.. autofunction:: paddle.fluid.layers.gather + :noindex: + +random_crop +----------- + +.. autofunction:: paddle.fluid.layers.random_crop + :noindex: ops === @@ -742,6 +784,12 @@ sum .. autofunction:: paddle.fluid.layers.sum :noindex: +shape +----- + +.. autofunction:: paddle.fluid.layers.shape + :noindex: + sigmoid ------- @@ -991,27 +1039,3 @@ zeros .. autofunction:: paddle.fluid.layers.zeros :noindex: -topk ----- - -.. autofunction:: paddle.fluid.layers.topk - :noindex: - -dice_loss ----- - -.. autofunction:: paddle.fluid.layers.dice_loss - :noindex: - -resize_bilinear -____ - -.. autofunction:: paddle.fluid.layers.resize_bilinear - :noindex: - -gather -____ - -.. autofunction:: paddle.fluid.layers.gather - :noindex: - diff --git a/doc/fluid/api/optimizer.rst b/doc/fluid/api/optimizer.rst index df2bd2eace5..6ad44bb6905 100644 --- a/doc/fluid/api/optimizer.rst +++ b/doc/fluid/api/optimizer.rst @@ -47,28 +47,6 @@ DecayedAdagrad :members: :noindex: -Adadelta ------------------ - -.. autoclass:: paddle.fluid.optimizer.Adadelta - :members: - :noindex: - -RMSProp ------------------ - -.. autoclass:: paddle.fluid.optimizer.RMSProp - :members: - :noindex: - -ModelAverage ------------------ - -.. autoclass:: paddle.fluid.optimizer.ModelAverage - :members: - :noindex: - - SGDOptimizer ------------ @@ -111,25 +89,31 @@ DecayedAdagradOptimizer :members: :noindex: +RMSPropOptimizer +---------------- -AdadeltaOptimizer ------------------ - -.. autoclass:: paddle.fluid.optimizer.AdadeltaOptimizer +.. autoclass:: paddle.fluid.optimizer.RMSPropOptimizer :members: :noindex: +Adadelta +-------- -RMSPropOptimizer ------------------ +.. autoclass:: paddle.fluid.optimizer.Adadelta + :members: + :noindex: -.. autoclass:: paddle.fluid.optimizer.RMSPropOptimizer +ModelAverage +------------ + +.. autoclass:: paddle.fluid.optimizer.ModelAverage :members: :noindex: - + Optimizer --------- .. autoclass:: paddle.fluid.optimizer.Optimizer :members: :noindex: + diff --git a/doc/fluid/api/profiler.rst b/doc/fluid/api/profiler.rst index 74d102dcb0d..39fda658634 100644 --- a/doc/fluid/api/profiler.rst +++ b/doc/fluid/api/profiler.rst @@ -23,3 +23,15 @@ profiler .. autofunction:: paddle.fluid.profiler.profiler :noindex: +start_profiler +-------------- + +.. autofunction:: paddle.fluid.profiler.start_profiler + :noindex: + +stop_profiler +------------- + +.. autofunction:: paddle.fluid.profiler.stop_profiler + :noindex: + -- GitLab From 744cc412b779333f2869653d9c6d462fba3521eb Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Mon, 4 Jun 2018 14:11:25 +0800 Subject: [PATCH 145/913] fix a bug --- paddle/fluid/operators/reader/open_files_op.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/fluid/operators/reader/open_files_op.cc b/paddle/fluid/operators/reader/open_files_op.cc index c0526e45f4d..2cbae8a90a9 100644 --- a/paddle/fluid/operators/reader/open_files_op.cc +++ b/paddle/fluid/operators/reader/open_files_op.cc @@ -27,7 +27,7 @@ class MultiFileReader : public framework::ReaderBase { const std::vector& dims, size_t thread_num, size_t buffer_size) : buffer_size_(buffer_size) { - readers_.resize(file_names.size()); + readers_.reserve(file_names.size()); for (const std::string& f_name : file_names) { readers_.emplace_back(CreateReaderByFileName(f_name, dims)); } -- GitLab From 6ac47a3d90c64f283fb4b5ab30acac46efb2fe91 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Mon, 4 Jun 2018 14:48:02 +0800 Subject: [PATCH 146/913] rename Mkldnn to MKLDNN --- .../fluid/operators/activation_mkldnn_op.cc | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/paddle/fluid/operators/activation_mkldnn_op.cc b/paddle/fluid/operators/activation_mkldnn_op.cc index b892ac77d9e..46ed99bcf22 100644 --- a/paddle/fluid/operators/activation_mkldnn_op.cc +++ b/paddle/fluid/operators/activation_mkldnn_op.cc @@ -222,35 +222,35 @@ struct MKLDNNActivationGradFunc : public BaseActivationFunctor { }; template -using ReluMkldnnFunctor = +using ReluMKLDNNFunctor = MKLDNNActivationFunc; template -using TanhMkldnnFunctor = +using TanhMKLDNNFunctor = MKLDNNActivationFunc; template -using SqrtMkldnnFunctor = +using SqrtMKLDNNFunctor = MKLDNNActivationFunc; template -using AbsMkldnnFunctor = +using AbsMKLDNNFunctor = MKLDNNActivationFunc; template -using ReluMkldnnGradFunctor = +using ReluMKLDNNGradFunctor = MKLDNNActivationGradFunc; template -using TanhMkldnnGradFunctor = +using TanhMKLDNNGradFunctor = MKLDNNActivationGradFunc; template -using SqrtMkldnnGradFunctor = +using SqrtMKLDNNGradFunctor = MKLDNNActivationGradFunc; template -using AbsMkldnnGradFunctor = +using AbsMKLDNNGradFunctor = MKLDNNActivationGradFunc; } // namespace operators } // namespace paddle @@ -265,9 +265,9 @@ namespace ops = paddle::operators; ops::MKLDNNActivationGradKernel>); #define FOR_EACH_MKLDNN_KERNEL_FUNCTOR(__macro) \ - __macro(relu, ReluMkldnnFunctor, ReluMkldnnGradFunctor); \ - __macro(tanh, TanhMkldnnFunctor, TanhMkldnnGradFunctor); \ - __macro(sqrt, SqrtMkldnnFunctor, SqrtMkldnnGradFunctor); \ - __macro(abs, AbsMkldnnFunctor, AbsMkldnnGradFunctor); + __macro(relu, ReluMKLDNNFunctor, ReluMKLDNNGradFunctor); \ + __macro(tanh, TanhMKLDNNFunctor, TanhMKLDNNGradFunctor); \ + __macro(sqrt, SqrtMKLDNNFunctor, SqrtMKLDNNGradFunctor); \ + __macro(abs, AbsMKLDNNFunctor, AbsMKLDNNGradFunctor); FOR_EACH_MKLDNN_KERNEL_FUNCTOR(REGISTER_ACTIVATION_MKLDNN_KERNEL); -- GitLab From 1666cf96bfed426be8debdefa9a8a561f5a8a13f Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Mon, 4 Jun 2018 14:53:24 +0800 Subject: [PATCH 147/913] update by comment --- doc/fluid/howto/cluster/fluid_recordio.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/fluid/howto/cluster/fluid_recordio.md b/doc/fluid/howto/cluster/fluid_recordio.md index 0e8b98542d1..55ce63ec193 100644 --- a/doc/fluid/howto/cluster/fluid_recordio.md +++ b/doc/fluid/howto/cluster/fluid_recordio.md @@ -23,7 +23,10 @@ as follows: fluid.recordio_writer.convert_reader_to_recordio_file('./mnist.recordio', reader, feeder) ``` -The above codes would generate a RecordIO `./mnist.recordio` on your host. +The above code snippet would generate a RecordIO `./mnist.recordio` on your host. + +**NOTE**: we recommend users to set `batch_size=1` when generating the recordio files so that users can +adjust it flexibly while reading it. ## Use the RecordIO file in a Local Training Job @@ -96,7 +99,7 @@ The above codes would generate multiple RecordIO files on your host like: |-mnist-00004.recordio ``` -1. open multiple RecordIO files by `fluid.layers.io.open_files` +2. open multiple RecordIO files by `fluid.layers.io.open_files` For a distributed training job, the distributed operator system will schedule trainer process on multiple nodes, each trainer process reads parts of the whole training data, we usually take the following approach to make the training -- GitLab From c06f43bbb6aec4ae12d514ca92a77aed0d473882 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Mon, 4 Jun 2018 15:20:06 +0800 Subject: [PATCH 148/913] add annotation about _is_checkpoint_var --- python/paddle/fluid/io.py | 5 +++-- tools/codestyle/docstring_checker.pyc | Bin 12561 -> 12561 bytes 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index 62e3046db64..75146fe3269 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -639,13 +639,14 @@ def _is_checkpoint_var(var): var.desc.type() == core.VarDesc.VarType.FETCH_LIST or \ var.desc.type() == core.VarDesc.VarType.RAW: return False - + # @GRAD are named for gradient varibales, checkpoint will not save it. if "@GRAD" in var.name: return False - + # .trainer_ are named for distribute trian variables, checkpoint will not save it. if ".trainer_" in var.name: return False + # .block is named for distribute trian variables, checkpoint will not save it. if ".block" in var.name: return False diff --git a/tools/codestyle/docstring_checker.pyc b/tools/codestyle/docstring_checker.pyc index 1f0255b763c8d154b7cc17d2d525148dfea3b42d..a27d3c9a8cccab8552d510578debb2df04eb53bb 100644 GIT binary patch delta 16 XcmbQ3G%<;t`7|BNbF9rm> delta 16 XcmbQ3G%<;t`7|BNbF*pSi -- GitLab From 3526ac1136eb51decb567b4cd0230ac9bae5c244 Mon Sep 17 00:00:00 2001 From: fengjiayi Date: Mon, 4 Jun 2018 15:35:06 +0800 Subject: [PATCH 149/913] refine code --- paddle/fluid/operators/reader/open_files_op.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/paddle/fluid/operators/reader/open_files_op.cc b/paddle/fluid/operators/reader/open_files_op.cc index 2cbae8a90a9..31e5d81e55e 100644 --- a/paddle/fluid/operators/reader/open_files_op.cc +++ b/paddle/fluid/operators/reader/open_files_op.cc @@ -63,9 +63,6 @@ void MultiFileReader::ReadNext(std::vector* out) { void MultiFileReader::ReInit() { EndScheduler(); - for (auto& reader : readers_) { - reader->ReInit(); - } StartNewScheduler(); } @@ -141,6 +138,7 @@ void MultiFileReader::PrefetchThreadFunc(size_t reader_idx, size_t thread_idx) { std::vector ins; reader->ReadNext(&ins); if (ins.empty()) { + reader->ReInit(); break; } try { -- GitLab From 08e5f0ae482c1e70dc74c4677e5cb699b38c433e Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Mon, 4 Jun 2018 16:10:11 +0800 Subject: [PATCH 150/913] rename need_load_checkpoint to get_latest_checkpoint_serial --- python/paddle/fluid/io.py | 4 ++-- python/paddle/fluid/trainer.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index 75146fe3269..111907b5751 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -25,7 +25,7 @@ __all__ = [ 'load_persistables', 'save_inference_model', 'load_inference_model', 'get_inference_program', 'save_checkpoint', 'load_checkpoint', 'clean_checkpoint', 'load_persist_vars_without_grad', - 'save_persist_vars_without_grad' + 'save_persist_vars_without_grad', 'get_latest_checkpoint_serial' ] @@ -503,7 +503,7 @@ def save_checkpoint(executor, _lru_delete(checkpoint_dir, max_num_checkpoints) -def need_load_checkpoint(checkpoint_dir): +def get_latest_checkpoint_serial(checkpoint_dir): """ If the directory have checkpoint files, it will return lastest checkpoint directory serial number diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 72168886fdb..3c32ec1de8a 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -146,7 +146,7 @@ class Trainer(object): "The checkpoint_config shoule be an instance of CheckpointConfig" ) else: - self.checkpoint.load_serial = io.need_load_checkpoint( + self.checkpoint.load_serial = io.get_latest_checkpoint_serial( self.checkpoint.checkpoint_dir) self.scope = core.Scope() -- GitLab From 97b2f6f5f961575633b3ba0e8ea7b5c2fd5d4396 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Mon, 4 Jun 2018 17:02:37 +0800 Subject: [PATCH 151/913] ignore pyc files --- tools/codestyle/.gitignore | 1 + tools/codestyle/docstring_checker.pyc | Bin 11769 -> 0 bytes 2 files changed, 1 insertion(+) create mode 100644 tools/codestyle/.gitignore delete mode 100644 tools/codestyle/docstring_checker.pyc diff --git a/tools/codestyle/.gitignore b/tools/codestyle/.gitignore new file mode 100644 index 00000000000..0d20b6487c6 --- /dev/null +++ b/tools/codestyle/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/tools/codestyle/docstring_checker.pyc b/tools/codestyle/docstring_checker.pyc deleted file mode 100644 index 07e875aec6c9bae8002bde4223348c6a29647b03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11769 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 QVT9NjS|84r2F9-c7hLv=%K!iX -- GitLab From 9d3114c8c99b46a90b76811b3a2b19b1c1e31919 Mon Sep 17 00:00:00 2001 From: "yi.wu" Date: Mon, 4 Jun 2018 18:42:44 +0800 Subject: [PATCH 152/913] fix transpiler error --- .../paddle/fluid/transpiler/distribute_transpiler.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/python/paddle/fluid/transpiler/distribute_transpiler.py b/python/paddle/fluid/transpiler/distribute_transpiler.py index da001add8e1..27992df462f 100644 --- a/python/paddle/fluid/transpiler/distribute_transpiler.py +++ b/python/paddle/fluid/transpiler/distribute_transpiler.py @@ -187,12 +187,17 @@ class DistributeTranspiler: param_list = [] grad_list = [] + param_grad_set = set() for p, g in self.params_grads: # skip parameter marked not trainable if type(p) == Parameter and p.trainable == False: continue - param_list.append(p) - grad_list.append(g) + if p.name not in param_grad_set: + param_list.append(p) + param_grad_set.add(p.name) + if g.name not in param_grad_set: + grad_list.append(g) + param_grad_set.add(g.name) self._update_dist_lookup_table_vars(param_list, grad_list, self.params_grads) @@ -829,6 +834,9 @@ class DistributeTranspiler: if not block_map.has_key(varname): block_map[varname] = [] block_map[varname].append((long(offset), long(size))) + # Do not remove this important debug message: + print("block map: %s" % block_map) + for varname, splited in block_map.iteritems(): orig_var = program.global_block().var(varname) if len(splited) == 1: -- GitLab From 1766406f76ebf93f3ff1acc57c15019c4a2dacdd Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Mon, 4 Jun 2018 19:47:16 +0800 Subject: [PATCH 153/913] delete unused code --- paddle/fluid/operators/detail/grpc_server.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/paddle/fluid/operators/detail/grpc_server.h b/paddle/fluid/operators/detail/grpc_server.h index eae87de4201..e6ffc7066f2 100644 --- a/paddle/fluid/operators/detail/grpc_server.h +++ b/paddle/fluid/operators/detail/grpc_server.h @@ -71,8 +71,6 @@ class AsyncGRPCServer final : public RPCServer { std::unique_ptr<::grpc::Server> server_; // condition of the sub program - // std::mutex barrier_mutex_; - // mutable int barrier_cond_step_; std::condition_variable barrier_condition_; std::mutex mutex_ready_; -- GitLab From dcf40fd0bc5a7ed48e954feb591c63defd689f45 Mon Sep 17 00:00:00 2001 From: Luo Tao Date: Mon, 4 Jun 2018 20:39:34 +0800 Subject: [PATCH 154/913] refine benchmark --- benchmark/.gitignore | 3 +++ benchmark/fluid/fluid_benchmark.py | 31 ++++++++++++++++-------------- benchmark/fluid/run.sh | 20 ++++++++++--------- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/benchmark/.gitignore b/benchmark/.gitignore index 7b66e8a5b50..fb4114356d4 100644 --- a/benchmark/.gitignore +++ b/benchmark/.gitignore @@ -7,3 +7,6 @@ paddle/rnn/imdb.pkl caffe/image/logs tensorflow/image/logs tensorflow/rnn/logs +fluid/models/*.pyc +fluid/logs +fluid/nohup.out diff --git a/benchmark/fluid/fluid_benchmark.py b/benchmark/fluid/fluid_benchmark.py index c1d458970a5..cac1b0fad00 100644 --- a/benchmark/fluid/fluid_benchmark.py +++ b/benchmark/fluid/fluid_benchmark.py @@ -40,10 +40,7 @@ def parse_args(): parser.add_argument( '--batch_size', type=int, default=32, help='The minibatch size.') parser.add_argument( - '--learning_rate', - type=float, - default=0.001, - help='The minibatch size.') + '--learning_rate', type=float, default=0.001, help='The learning rate.') # TODO(wuyi): add "--use_fake_data" option back. parser.add_argument( '--skip_batch_num', @@ -72,6 +69,11 @@ def parse_args(): type=int, default=1, help='If gpus > 1, will use ParallelExecutor to run, else use Executor.') + parser.add_argument( + '--cpus', + type=int, + default=1, + help='If cpus > 1, will use ParallelDo to run, else use Executor.') parser.add_argument( '--data_set', type=str, @@ -231,10 +233,7 @@ def train(avg_loss, infer_prog, optimizer, train_reader, test_reader, batch_acc, train_losses.append(loss) print("Pass: %d, Iter: %d, Loss: %f\n" % (pass_id, iters, np.mean(train_losses))) - train_elapsed = time.time() - start_time - examples_per_sec = num_samples / train_elapsed - print('\nTotal examples: %d, total time: %.5f, %.5f examples/sec\n' % - (num_samples, train_elapsed, examples_per_sec)) + print_train_time(start_time, time.time(), num_samples) print("Pass: %d, Loss: %f" % (pass_id, np.mean(train_losses))) # evaluation if not args.no_test and batch_acc != None: @@ -315,10 +314,7 @@ def train_parallel(avg_loss, infer_prog, optimizer, train_reader, test_reader, if batch_id % 1 == 0: print("Pass %d, batch %d, loss %s" % (pass_id, batch_id, np.array(loss))) - train_elapsed = time.time() - start_time - examples_per_sec = num_samples / train_elapsed - print('\nTotal examples: %d, total time: %.5f, %.5f examples/sed\n' % - (num_samples, train_elapsed, examples_per_sec)) + print_train_time(start_time, time.time(), num_samples) if not args.no_test and batch_acc != None: test_acc = test(startup_exe, infer_prog, test_reader, feeder, batch_acc) @@ -329,12 +325,19 @@ def train_parallel(avg_loss, infer_prog, optimizer, train_reader, test_reader, def print_arguments(args): vars(args)['use_nvprof'] = (vars(args)['use_nvprof'] and vars(args)['device'] == 'GPU') - print('----------- resnet Configuration Arguments -----------') + print('----------- Configuration Arguments -----------') for arg, value in sorted(vars(args).iteritems()): print('%s: %s' % (arg, value)) print('------------------------------------------------') +def print_train_time(start_time, end_time, num_samples): + train_elapsed = end_time - start_time + examples_per_sec = num_samples / train_elapsed + print('\nTotal examples: %d, total time: %.5f, %.5f examples/sed\n' % + (num_samples, train_elapsed, examples_per_sec)) + + def main(): args = parse_args() print_arguments(args) @@ -342,7 +345,7 @@ def main(): # the unique trainer id, starting from 0, needed by trainer # only nccl_id_var, num_trainers, trainer_id = ( - None, 1, int(os.getenv("PADDLE_TRAINER_ID", "-1"))) + None, 1, int(os.getenv("PADDLE_TRAINER_ID", "0"))) if args.use_cprof: pr = cProfile.Profile() diff --git a/benchmark/fluid/run.sh b/benchmark/fluid/run.sh index afaab5f4de4..5d9b2db8713 100644 --- a/benchmark/fluid/run.sh +++ b/benchmark/fluid/run.sh @@ -2,6 +2,7 @@ # This script benchmarking the PaddlePaddle Fluid on # single thread single GPU. +mkdir -p logs #export FLAGS_fraction_of_gpu_memory_to_use=0.0 export CUDNN_PATH=/paddle/cudnn_v5 @@ -35,6 +36,7 @@ nohup stdbuf -oL nvidia-smi \ --format=csv \ --filename=mem.log \ -l 1 & + # mnist # mnist gpu mnist 128 FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ @@ -43,7 +45,7 @@ FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ --batch_size=128 \ --skip_batch_num=5 \ --iterations=500 \ - 2>&1 | tee -a mnist_gpu_128.log + 2>&1 | tee -a logs/mnist_gpu_128.log # vgg16 # gpu cifar10 128 @@ -53,7 +55,7 @@ FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ --batch_size=128 \ --skip_batch_num=5 \ --iterations=30 \ - 2>&1 | tee -a vgg16_gpu_128.log + 2>&1 | tee -a logs/vgg16_gpu_128.log # flowers gpu 128 FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ @@ -63,28 +65,28 @@ FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ --data_set=flowers \ --skip_batch_num=5 \ --iterations=30 \ - 2>&1 | tee -a vgg16_gpu_flowers_32.log + 2>&1 | tee -a logs/vgg16_gpu_flowers_32.log # resnet50 # resnet50 gpu cifar10 128 FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ - --model=resnet50 \ + --model=resnet \ --device=GPU \ --batch_size=128 \ --data_set=cifar10 \ --skip_batch_num=5 \ --iterations=30 \ - 2>&1 | tee -a resnet50_gpu_128.log + 2>&1 | tee -a logs/resnet50_gpu_128.log # resnet50 gpu flowers 64 FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ - --model=resnet50 \ + --model=resnet \ --device=GPU \ --batch_size=64 \ --data_set=flowers \ --skip_batch_num=5 \ --iterations=30 \ - 2>&1 | tee -a resnet50_gpu_flowers_64.log + 2>&1 | tee -a logs/resnet50_gpu_flowers_64.log # lstm # lstm gpu imdb 32 # tensorflow only support batch=32 @@ -94,7 +96,7 @@ FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ --batch_size=32 \ --skip_batch_num=5 \ --iterations=30 \ - 2>&1 | tee -a lstm_gpu_32.log + 2>&1 | tee -a logs/lstm_gpu_32.log # seq2seq # seq2seq gpu wmb 128 @@ -104,4 +106,4 @@ FLAGS_benchmark=true stdbuf -oL python fluid_benchmark.py \ --batch_size=128 \ --skip_batch_num=5 \ --iterations=30 \ - 2>&1 | tee -a lstm_gpu_128.log + 2>&1 | tee -a logs/lstm_gpu_128.log -- GitLab From d58955997e946f1d2c91849a935917e2643f4374 Mon Sep 17 00:00:00 2001 From: "yi.wu" Date: Mon, 4 Jun 2018 20:50:22 +0800 Subject: [PATCH 155/913] fix term core only --- cmake/external/grpc.cmake | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/cmake/external/grpc.cmake b/cmake/external/grpc.cmake index 9459f1ddfe8..4b6840578fd 100644 --- a/cmake/external/grpc.cmake +++ b/cmake/external/grpc.cmake @@ -33,10 +33,18 @@ ELSE() SET(BUILD_CMD make HAS_SYSTEM_PROTOBUF=false -s -j ${NUM_OF_PROCESSOR} static grpc_cpp_plugin) ENDIF() +# FIXME(wuyi): do not build zlib cares protobuf twice, find a way to build grpc with them ExternalProject_Add( extern_grpc DEPENDS protobuf zlib - URL "http://paddlepaddledeps.bj.bcebos.com/grpc.tar.xz" + # NOTE(wuyi): + # this package is generated by following steps: + # 1. git clone -b v1.8.x https://github.com/grpc/grpc.git + # 2. submodule update --init + # 3. keep only zlib, cares, protobuf, boringssl under "third_party", + # checkout and clean other dirs under third_party + # 4. remove .git, and package the directory. + URL "http://paddlepaddledeps.bj.bcebos.com/grpc-v1.8.x.tar.gz" PREFIX ${GRPC_SOURCES_DIR} UPDATE_COMMAND "" CONFIGURE_COMMAND "" @@ -49,7 +57,6 @@ ExternalProject_Add( INSTALL_COMMAND make prefix=${GRPC_INSTALL_DIR} install ) -# FIXME(typhoonzero): hack to get static lib path, try a better way like merge them. ADD_LIBRARY(grpc++_unsecure STATIC IMPORTED GLOBAL) SET_PROPERTY(TARGET grpc++_unsecure PROPERTY IMPORTED_LOCATION "${GRPC_INSTALL_DIR}/lib/libgrpc++_unsecure.a") -- GitLab From bfdcf18707c79f2cc29b0903cb9f4fab2e907490 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Mon, 4 Jun 2018 21:10:38 +0800 Subject: [PATCH 156/913] grammar optimized. --- python/paddle/fluid/io.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index 111907b5751..b5d96441bcf 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -492,7 +492,7 @@ def save_checkpoint(executor, if not os.path.isdir(checkpoint_dir): os.makedirs(checkpoint_dir) - serial = _get_lastest_checkpoint_dir(checkpoint_dir) + 1 + serial = _get_latest_checkpoint_dir(checkpoint_dir) + 1 cur_dir = _get_serial_dir(checkpoint_dir, serial) save_trainer_args(cur_dir, trainer_id, trainer_args) @@ -505,11 +505,11 @@ def save_checkpoint(executor, def get_latest_checkpoint_serial(checkpoint_dir): """ - If the directory have checkpoint files, it will return lastest checkpoint directory serial number + If the directory have checkpoint files, it will return latest checkpoint directory serial number :param checkpoint_dir """ - serial = _get_lastest_checkpoint_dir(checkpoint_dir) + serial = _get_latest_checkpoint_dir(checkpoint_dir) if serial < 0: return None return serial @@ -639,14 +639,14 @@ def _is_checkpoint_var(var): var.desc.type() == core.VarDesc.VarType.FETCH_LIST or \ var.desc.type() == core.VarDesc.VarType.RAW: return False - # @GRAD are named for gradient varibales, checkpoint will not save it. + # @GRAD are named for gradient variables, checkpoint will not save it. if "@GRAD" in var.name: return False - # .trainer_ are named for distribute trian variables, checkpoint will not save it. + # .trainer_ are named for distribute train variables, checkpoint will not save it. if ".trainer_" in var.name: return False - # .block is named for distribute trian variables, checkpoint will not save it. + # .block is named for distribute train variables, checkpoint will not save it. if ".block" in var.name: return False @@ -656,7 +656,6 @@ def _is_checkpoint_var(var): def _get_dir_serial(dirname): _, serial = dirname.split(CHECKPOINT_SEPARATOR) - serial_num = -1 try: serial_num = int(serial) except ValueError: @@ -723,7 +722,7 @@ def _write_success(dirname): f.write(now) -def _get_lastest_checkpoint_dir(checkpoint_dir): +def _get_latest_checkpoint_dir(checkpoint_dir): """ get the latest file in checkpoint directory, the _SUCCESS file must exist in the directory -- GitLab From 418c41d8fb4a9dd0f221e7c3e3b94d5433493ded Mon Sep 17 00:00:00 2001 From: Yan Chunwei Date: Mon, 4 Jun 2018 22:01:14 +0800 Subject: [PATCH 157/913] Feature/anakin embed (#11135) --- paddle/contrib/inference/CMakeLists.txt | 43 +++++++++- .../inference/demo/simple_on_word2vec.cc | 2 +- .../contrib/inference/paddle_inference_api.h | 27 +++--- .../paddle_inference_api_anakin_engine.cc | 82 +++++++++++++++++++ .../paddle_inference_api_anakin_engine.h | 51 ++++++++++++ ...ddle_inference_api_anakin_engine_tester.cc | 27 ++++++ .../inference/paddle_inference_api_impl.cc | 18 ++-- 7 files changed, 229 insertions(+), 21 deletions(-) create mode 100644 paddle/contrib/inference/paddle_inference_api_anakin_engine.cc create mode 100644 paddle/contrib/inference/paddle_inference_api_anakin_engine.h create mode 100644 paddle/contrib/inference/paddle_inference_api_anakin_engine_tester.cc diff --git a/paddle/contrib/inference/CMakeLists.txt b/paddle/contrib/inference/CMakeLists.txt index 8ca34465395..1e3bb7bf16f 100644 --- a/paddle/contrib/inference/CMakeLists.txt +++ b/paddle/contrib/inference/CMakeLists.txt @@ -17,6 +17,42 @@ if(APPLE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=pessimizing-move") endif(APPLE) +set(ANAKIN_INCLUDE "" CACHE STRING "root of Anakin header files") +set(ANAKIN_LIBRARY "" CACHE STRING "path of Anakin library") + + +set(inference_deps paddle_inference_api paddle_fluid_api) + +# if anakin is set enable anakin api implementation +if(ANAKIN_INCLUDE_DIR AND ANAKIN_LIBRARY) + set(ANAKIN_FOUND ON) +else() + set(ANAKIN_FOUND OFF) +endif() + +if (ANAKIN_FOUND) + # Anakin's code style doesn't follow google c style. + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=comment + -Wno-error=reorder + -Wno-error=format + -Wno-error=switch + -Wno-error=return-type + -Wno-error=non-virtual-dtor + -Wno-error=cpp") + + message(STATUS "Anakin for inference is enabled") + message(STATUS "Anakin is set INCLUDE:${ANAKIN_INCLUDE} LIBRARY:${ANAKIN_LIBRARY}") + include_directories("${ANAKIN_INCLUDE}") + # Anakin's source path is a mass, need to set sub-directories trivially. + include_directories("${ANAKIN_INCLUDE}/saber") + link_directories("${ANAKIN_LIBRARY}") + + nv_library(inference_anakin_api SRCS paddle_inference_api_anakin_engine.cc) + target_link_libraries(inference_anakin_api anakin) + list(APPEND inference_deps inference_anakin_api) +endif() + + function(inference_api_test TARGET_NAME) if (WITH_TESTING) set(options "") @@ -27,7 +63,7 @@ function(inference_api_test TARGET_NAME) set(PYTHON_TESTS_DIR ${PADDLE_BINARY_DIR}/python/paddle/fluid/tests) cc_test(${TARGET_NAME} SRCS ${TARGET_NAME}.cc - DEPS paddle_fluid paddle_inference_api + DEPS "${inference_deps}" ARGS --dirname=${PYTHON_TESTS_DIR}/book/) if(inference_test_ARGS) set_tests_properties(${TARGET_NAME} @@ -47,6 +83,11 @@ cc_test(test_paddle_inference_api inference_api_test(test_paddle_inference_api_impl ARGS test_word2vec test_image_classification) +if (ANAKIN_FOUND) + nv_test(inference_anakin_test SRCS paddle_inference_api_anakin_engine_tester.cc + DEPS ${inference_deps} protobuf) +endif() + if(WITH_TESTING) add_subdirectory(demo) endif() diff --git a/paddle/contrib/inference/demo/simple_on_word2vec.cc b/paddle/contrib/inference/demo/simple_on_word2vec.cc index 165d2e196b3..ee865f37900 100644 --- a/paddle/contrib/inference/demo/simple_on_word2vec.cc +++ b/paddle/contrib/inference/demo/simple_on_word2vec.cc @@ -54,7 +54,7 @@ void Main(bool use_gpu) { CHECK(predictor->Run(slots, &outputs)); //# 4. Get output. - ASSERT_EQ(outputs.size(), 1); + ASSERT_EQ(outputs.size(), 1UL); LOG(INFO) << "output buffer size: " << outputs.front().data.length; const size_t num_elements = outputs.front().data.length / sizeof(float); // The outputs' buffers are in CPU memory. diff --git a/paddle/contrib/inference/paddle_inference_api.h b/paddle/contrib/inference/paddle_inference_api.h index 5fe8399762b..b5cd0d603f1 100644 --- a/paddle/contrib/inference/paddle_inference_api.h +++ b/paddle/contrib/inference/paddle_inference_api.h @@ -1,16 +1,16 @@ /* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 +http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. */ +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ /* * This file contains the definition of a simple Inference API for Paddle. @@ -47,8 +47,8 @@ struct PaddleTensor { enum class PaddleEngineKind { kNative = 0, // Use the native Fluid facility. + kAnakin, // Use Anakin for inference. // TODO(Superjomn) support following engines latter. - // kAnakin, // Use Anakin for inference. // kTensorRT, // Use TensorRT for inference. // kAutoMixedAnakin, // Automatically mix Fluid with Anakin. // kAutoMixedTensorRT, // Automatically mix Fluid with TensorRT. @@ -95,6 +95,13 @@ struct NativeConfig : public PaddlePredictor::Config { std::string param_file; }; +// Configurations for Anakin engine. +struct AnakinConfig : public PaddlePredictor::Config { + int device; + std::string model_file; + int max_batch_size{-1}; +}; + // A factory to help create different predictors. // // FOR EXTENSION DEVELOPER: diff --git a/paddle/contrib/inference/paddle_inference_api_anakin_engine.cc b/paddle/contrib/inference/paddle_inference_api_anakin_engine.cc new file mode 100644 index 00000000000..865d7ac10db --- /dev/null +++ b/paddle/contrib/inference/paddle_inference_api_anakin_engine.cc @@ -0,0 +1,82 @@ +// Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#include "paddle/contrib/inference/paddle_inference_api_anakin_engine.h" + +namespace paddle { + +PaddleInferenceAnakinPredictor::PaddleInferenceAnakinPredictor( + const AnakinConfig &config) { + CHECK(Init(config)); +} + +bool PaddleInferenceAnakinPredictor::Init(const AnakinConfig &config) { + // TODO(Superjomn) Tell anakin to support return code. + engine_.Build(config.model_file, config.max_batch_size); + return true; +} + +bool PaddleInferenceAnakinPredictor::Run( + const std::vector &inputs, + std::vector *output_data) { + for (const auto &input : inputs) { + if (input.dtype != PaddleDType::FLOAT32) { + LOG(ERROR) << "Only support float type inputs. " << input.name + << "'s type is not float"; + return false; + } + engine_.SetInputFromCPU( + input.name, static_cast(input.data.data), input.data.length); + } + + // TODO(Superjomn) Tell anakin to support return code. + engine_.Execute(); + + if (output_data->empty()) { + LOG(ERROR) << "At least one output should be set with tensors' names."; + return false; + } + for (auto &output : *output_data) { + auto *tensor = engine_.GetOutputInGPU(output.name); + output.shape = tensor->shape(); + // Copy data from GPU -> CPU + if (cudaMemcpy(output.data.data, + tensor->data(), + tensor->size(), + cudaMemcpyDeviceToHost) != 0) { + LOG(ERROR) << "copy data from GPU to CPU error"; + return false; + } + } + return true; +} + +// TODO(Superjomn) To implement latter. +std::unique_ptr PaddleInferenceAnakinPredictor::Clone() { + return nullptr; +} + +// A factory to help create difference predictor. +template <> +std::unique_ptr +CreatePaddlePredictor( + const AnakinConfig &config) { + std::unique_ptr x( + new PaddleInferenceAnakinPredictor(config)); + return x; +}; + +} // namespace paddle diff --git a/paddle/contrib/inference/paddle_inference_api_anakin_engine.h b/paddle/contrib/inference/paddle_inference_api_anakin_engine.h new file mode 100644 index 00000000000..fe9f562e9d1 --- /dev/null +++ b/paddle/contrib/inference/paddle_inference_api_anakin_engine.h @@ -0,0 +1,51 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ + +/* + * This file contains the implementation of inference API with Anakin engine + * embeded, this API can only support Anakin models. + */ + +#pragma once + +// NOTE This header file do not have namespace. +// TODO(Superjomn) Tell Anakin to provide better APIs. +#include +#include "paddle/contrib/inference/paddle_inference_api.h" + +namespace paddle { + +class PaddleInferenceAnakinPredictor : public PaddlePredictor { + public: + PaddleInferenceAnakinPredictor(const AnakinConfig& config); + + // NOTE Unlike the native engine, the buffers of anakin engine's output_data + // should be allocated first. + // TODO(Superjomn) should unify all the behaviors of output_data accross all + // the engines. + bool Run(const std::vector& inputs, + std::vector* output_data) override; + + std::unique_ptr Clone() override; + + private: + bool Init(const AnakinConfig& config); + + anakin::AnakinEngine + engine_; +}; + +} // namespace paddle diff --git a/paddle/contrib/inference/paddle_inference_api_anakin_engine_tester.cc b/paddle/contrib/inference/paddle_inference_api_anakin_engine_tester.cc new file mode 100644 index 00000000000..43324bc67cb --- /dev/null +++ b/paddle/contrib/inference/paddle_inference_api_anakin_engine_tester.cc @@ -0,0 +1,27 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ + +#include "paddle/contrib/inference/paddle_inference_api.h" +#include + +namespace paddle { + +TEST(inference, anakin) { + AnakinConfig config; + + auto engine = + CreatePaddlePredictor(config); +} + +} // namespace paddle diff --git a/paddle/contrib/inference/paddle_inference_api_impl.cc b/paddle/contrib/inference/paddle_inference_api_impl.cc index e7a8fa68b7f..b52a43a463d 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/paddle_inference_api_impl.cc @@ -1,16 +1,16 @@ /* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 +http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. */ +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ #include #include -- GitLab From 79bda2c46d265f6d064d7e176535d1fdcbb055c6 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Mon, 4 Jun 2018 22:11:08 +0800 Subject: [PATCH 158/913] enable infer api with multi-threads --- .../contrib/inference/paddle_inference_api.h | 3 +- .../inference/paddle_inference_api_impl.cc | 41 +++++++++++-------- .../inference/paddle_inference_api_impl.h | 9 ++-- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/paddle/contrib/inference/paddle_inference_api.h b/paddle/contrib/inference/paddle_inference_api.h index b5cd0d603f1..c4588cf0403 100644 --- a/paddle/contrib/inference/paddle_inference_api.h +++ b/paddle/contrib/inference/paddle_inference_api.h @@ -63,6 +63,7 @@ class PaddlePredictor { struct Config; PaddlePredictor() = default; PaddlePredictor(const PaddlePredictor&) = delete; + PaddlePredictor& operator=(const PaddlePredictor&) = delete; // Predict an record. // The caller should be responsible for allocating and releasing the memory of @@ -76,7 +77,7 @@ class PaddlePredictor { virtual std::unique_ptr Clone() = 0; // Destroy the Predictor. - virtual ~PaddlePredictor() {} + virtual ~PaddlePredictor() = default; // The common configs for all the predictors. struct Config { diff --git a/paddle/contrib/inference/paddle_inference_api_impl.cc b/paddle/contrib/inference/paddle_inference_api_impl.cc index b52a43a463d..2d710727e23 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/paddle_inference_api_impl.cc @@ -54,7 +54,7 @@ std::string num2str(T a) { } } // namespace -bool NativePaddlePredictor::Init() { +bool NativePaddlePredictor::Init(std::shared_ptr scope) { VLOG(3) << "Predictor::init()"; if (config_.use_gpu) { @@ -62,9 +62,15 @@ bool NativePaddlePredictor::Init() { } else { place_ = paddle::platform::CPUPlace(); } - paddle::framework::InitDevices(false); + if (scope) { + scope_ = scope; + sub_scope_ = &(scope->NewScope()); + } else { + paddle::framework::InitDevices(false); + scope_.reset(new paddle::framework::Scope()); + } + executor_.reset(new paddle::framework::Executor(place_)); - scope_.reset(new paddle::framework::Scope()); // Initialize the inference program if (!config_.model_dir.empty()) { @@ -83,13 +89,8 @@ bool NativePaddlePredictor::Init() { return false; } ctx_ = executor_->Prepare(*inference_program_, 0); - - // Create temporary variables first, so that the first batch do not need to - // create variables in the runtime. This is the logics of the old inference - // API. - // TODO(Superjomn) this should be modified when `Clone` is valid for - // multi-thread application. - executor_->CreateVariables(*inference_program_, scope_.get(), 0); + executor_->CreateVariables( + *inference_program_, sub_scope_ ? sub_scope_ : scope_.get(), 0); // Get the feed_target_names and fetch_target_names feed_target_names_ = inference_program_->GetFeedTargetNames(); @@ -97,6 +98,13 @@ bool NativePaddlePredictor::Init() { return true; } +NativePaddlePredictor::~NativePaddlePredictor() { + if (sub_scope_) { + PADDLE_ENFORCE_NOT_NULL(scope_, "Should have parent scope!"); + scope_->DeleteScope(sub_scope_); + } +}; + bool NativePaddlePredictor::Run(const std::vector &inputs, std::vector *output_data) { VLOG(3) << "Predictor::predict"; @@ -121,11 +129,12 @@ bool NativePaddlePredictor::Run(const std::vector &inputs, } // Run the inference program // if share variables, we need not create variables - executor_->RunPreparedContext(ctx_.get(), - scope_.get(), - &feed_targets, - &fetch_targets, - false /* don't create variable eatch time */); + executor_->RunPreparedContext( + ctx_.get(), + sub_scope_ != nullptr ? sub_scope_ : scope_.get(), + &feed_targets, + &fetch_targets, + false /* don't create variable eatch time */); if (!GetFetch(fetchs, output_data)) { LOG(ERROR) << "fail to get fetchs"; return false; @@ -138,7 +147,7 @@ std::unique_ptr NativePaddlePredictor::Clone() { VLOG(3) << "Predictor::clone"; std::unique_ptr cls(new NativePaddlePredictor(config_)); - if (!dynamic_cast(cls.get())->Init()) { + if (!dynamic_cast(cls.get())->Init(scope_)) { LOG(ERROR) << "fail to call Init"; return nullptr; } diff --git a/paddle/contrib/inference/paddle_inference_api_impl.h b/paddle/contrib/inference/paddle_inference_api_impl.h index 84707e223d7..dfb34a8631e 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.h +++ b/paddle/contrib/inference/paddle_inference_api_impl.h @@ -34,14 +34,15 @@ class NativePaddlePredictor : public PaddlePredictor { explicit NativePaddlePredictor(const NativeConfig &config) : config_(config) {} - bool Init(); + // will only create sub scope if have global scope + bool Init(std::shared_ptr scope = nullptr); bool Run(const std::vector &inputs, std::vector *output_data) override; std::unique_ptr Clone() override; - ~NativePaddlePredictor() override{}; + ~NativePaddlePredictor() override; private: bool SetFeed(const std::vector &input_datas, @@ -52,11 +53,13 @@ class NativePaddlePredictor : public PaddlePredictor { NativeConfig config_; platform::Place place_; std::unique_ptr executor_; - std::unique_ptr scope_; + std::shared_ptr scope_; std::unique_ptr ctx_; std::unique_ptr inference_program_; std::vector feed_target_names_; std::vector fetch_target_names_; + // Do not use unique_ptr, use parent scope to delete + framework::Scope *sub_scope_{nullptr}; }; } // namespace paddle -- GitLab From 4760f2851ef37186c836a1cf46fea87f5a806fb2 Mon Sep 17 00:00:00 2001 From: Yibing Liu Date: Mon, 4 Jun 2018 10:31:32 -0700 Subject: [PATCH 159/913] Add the argsort operator --- paddle/fluid/operators/argsort_op.cc | 83 ++++++++++++++++++ paddle/fluid/operators/argsort_op.h | 86 +++++++++++++++++++ .../fluid/tests/unittests/test_argsort_op.py | 49 +++++++++++ 3 files changed, 218 insertions(+) create mode 100644 paddle/fluid/operators/argsort_op.cc create mode 100644 paddle/fluid/operators/argsort_op.h create mode 100644 python/paddle/fluid/tests/unittests/test_argsort_op.py diff --git a/paddle/fluid/operators/argsort_op.cc b/paddle/fluid/operators/argsort_op.cc new file mode 100644 index 00000000000..aead4e2e00f --- /dev/null +++ b/paddle/fluid/operators/argsort_op.cc @@ -0,0 +1,83 @@ +/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ + +#include "paddle/fluid/operators/argsort_op.h" + +namespace paddle { +namespace operators { + +class ArgsortOp : public framework::OperatorWithKernel { + public: + using framework::OperatorWithKernel::OperatorWithKernel; + + void InferShape(framework::InferShapeContext *ctx) const override { + PADDLE_ENFORCE(ctx->HasInput("X"), + "Input(X) of ArgsortOp should not be null."); + PADDLE_ENFORCE(ctx->HasOutput("Out"), + "Output(Out) of ArgsortOp should not be null."); + PADDLE_ENFORCE(ctx->HasOutput("Indices"), + "Output(Indices) of ArgsortOp should not be null."); + + auto in_dims = ctx->GetInputDim("X"); + int axis = static_cast(ctx->Attrs().Get("axis")); + + auto num_dims = in_dims.size(); + PADDLE_ENFORCE(axis < num_dims, + "Attr(axis) %d of ArgsortOp is out of bounds for Input(X) " + "dimension %d.", + axis, num_dims); + PADDLE_ENFORCE(axis >= 0 || axis == -1, + "Attr(axis) %d of ArgsortOp must be nonnegative or equal to " + "-1.", + axis); + + ctx->SetOutputDim("Out", in_dims); + ctx->SetOutputDim("Indices", in_dims); + ctx->ShareLoD("X", "Out"); + ctx->ShareLoD("X", "Indices"); + } +}; + +class ArgsortOpMaker : public framework::OpProtoAndCheckerMaker { + public: + void Make() override { + AddInput("X", "(Tensor) The input of Argsort op."); + AddOutput("Out", "(Tensor) The sorted tensor of Argsort op."); + AddOutput("Indices", + "(Tensor) The indices of a tensor giving the sorted order."); + AddComment(R"DOC( +Argsort operator + +Performs sorting on the input tensor along the given axis and outputs two +tensors, Output(Out) and Output(Indices). They reserve the same shape +with Input(X), and Output(Out) represents the sorted tensor while +Output(Indices) gives the sorted order along the given axis Attr(axis). + + )DOC"); + AddAttr("axis", + "(int, default -1) The axis along which to sort the tensor, " + "default -1, the last dimension.") + .SetDefault(-1); + } +}; + +} // namespace operators +} // namespace paddle + +namespace ops = paddle::operators; +REGISTER_OPERATOR(argsort, ops::ArgsortOp, ops::ArgsortOpMaker, + paddle::framework::EmptyGradOpMaker); +REGISTER_OP_CPU_KERNEL(argsort, + ops::ArgsortKernel, + ops::ArgsortKernel); diff --git a/paddle/fluid/operators/argsort_op.h b/paddle/fluid/operators/argsort_op.h new file mode 100644 index 00000000000..a9fe22c4ce1 --- /dev/null +++ b/paddle/fluid/operators/argsort_op.h @@ -0,0 +1,86 @@ +/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ + +#pragma once +#include +#include +#include +#include +#include "paddle/fluid/framework/eigen.h" +#include "paddle/fluid/framework/op_registry.h" + +namespace paddle { +namespace operators { + +using Tensor = framework::Tensor; + +template +using EigenMatrix = framework::EigenMatrix; + +template +class ArgsortKernel : public framework::OpKernel { + public: + void Compute(const framework::ExecutionContext& ctx) const override { + auto* input = ctx.Input("X"); + auto* output = ctx.Output("Out"); + auto* indices = ctx.Output("Indices"); + int axis = static_cast(ctx.Attr("axis")); + + auto in_dims = input->dims(); + axis = (axis == -1) ? (in_dims.size() - 1) : axis; + + const T* in_data = input->data(); + T* out_data = output->mutable_data(ctx.GetPlace()); + int64_t* idx_data = indices->mutable_data(ctx.GetPlace()); + + int64_t part_dims_prod = input->numel() / in_dims[axis]; + for (int64_t i = 0; i < part_dims_prod; ++i) { + int64_t idx = i; + std::vector idx_vec(in_dims.size(), 0); + for (int64_t dim = in_dims.size() - 1; dim >= 0; --dim) { + if (dim != axis) { + idx_vec[dim] = idx % in_dims[dim]; + idx /= in_dims[dim]; + } + } + std::vector> in_vec; + std::vector org_index_vec(in_dims[axis], 0); + for (int64_t j = 0; j < in_dims[axis]; ++j) { + idx_vec[axis] = j; + int64_t index = idx_vec[0]; + for (int64_t dim = 0; dim < in_dims.size() - 1; ++dim) { + index = index * in_dims[dim + 1] + idx_vec[dim + 1]; + } + in_vec.push_back(std::pair(in_data[index], j)); + org_index_vec[j] = index; + } + + std::sort( + in_vec.begin(), in_vec.end(), + [](const std::pair& v1, const std::pair& v2) { + return v1.first < v2.first; + }); + + for (size_t j = 0; j < org_index_vec.size(); ++j) { + int64_t index = org_index_vec[j]; + out_data[index] = in_vec[j].first; + idx_data[index] = in_vec[j].second; + } + } + } +}; + +} // namespace operators +} // namespace paddle diff --git a/python/paddle/fluid/tests/unittests/test_argsort_op.py b/python/paddle/fluid/tests/unittests/test_argsort_op.py new file mode 100644 index 00000000000..6995621ba8c --- /dev/null +++ b/python/paddle/fluid/tests/unittests/test_argsort_op.py @@ -0,0 +1,49 @@ +# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest +import numpy as np +from op_test import OpTest + + +class TestArgsortOp(OpTest): + def setUp(self): + self.init_axis() + x = np.random.random((2, 3, 4, 5)).astype("float32") + self.indices = np.argsort(x, kind='quicksort', axis=self.axis) + self.out = np.sort(x, kind='quicksort', axis=self.axis) + self.op_type = "argsort" + self.inputs = {'X': x} + self.attrs = {'axis': self.axis} + self.outputs = {'Indices': self.indices, 'Out': self.out} + + def init_axis(self): + self.axis = -1 + + def test_check_output(self): + self.check_output() + + +class TestArgsortOpAxis0(TestArgsortOp): + def init_axis(self): + self.axis = 0 + + +class TestArgsortOpAxis1(TestArgsortOp): + def init_axis(self): + self.axis = 1 + + +if __name__ == "__main__": + unittest.main() -- GitLab From 71b6bdb5d4dc090f8746845bf7bba9f62415e9f3 Mon Sep 17 00:00:00 2001 From: Siddharth Goyal Date: Mon, 4 Jun 2018 13:15:05 -0700 Subject: [PATCH 160/913] Fix signed-unsigned comparison warning (#11167) --- paddle/fluid/operators/sgd_op.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/fluid/operators/sgd_op.h b/paddle/fluid/operators/sgd_op.h index f9e0596191d..2685ce217ee 100644 --- a/paddle/fluid/operators/sgd_op.h +++ b/paddle/fluid/operators/sgd_op.h @@ -114,7 +114,7 @@ class SGDOpKernel : public framework::OpKernel { int64_t id_index = param.Index(grad.rows()[i]); PADDLE_ENFORCE_GE(id_index, static_cast(0), "id should be in the table"); - for (size_t j = 0; j < grad_row_width; j++) { + for (int64_t j = 0; j < grad_row_width; j++) { out_data[id_index * grad_row_width + j] -= lr[0] * grad_data[i * grad_row_width + j]; } -- GitLab From 95ba67a30cfe7395d2ed2f1e8193a88a4569fb22 Mon Sep 17 00:00:00 2001 From: Lei Wang Date: Mon, 4 Jun 2018 14:28:47 -0700 Subject: [PATCH 161/913] Build: fix go package installation path. (#11166) --- paddle/scripts/paddle_build.sh | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/paddle/scripts/paddle_build.sh b/paddle/scripts/paddle_build.sh index 8eeea1805d8..113d02ce486 100755 --- a/paddle/scripts/paddle_build.sh +++ b/paddle/scripts/paddle_build.sh @@ -145,19 +145,17 @@ function check_style() { trap 'abort' 0 set -e - # install glide - curl https://glide.sh/get | bash - eval "$(GIMME_GO_VERSION=1.8.3 gimme)" + if [ -x "$(command -v gimme)" ]; then + eval "$(GIMME_GO_VERSION=1.8.3 gimme)" + fi # set up go environment for running gometalinter mkdir -p $GOPATH/src/github.com/PaddlePaddle/ ln -sf ${PADDLE_ROOT} $GOPATH/src/github.com/PaddlePaddle/Paddle - cd $GOPATH/src/github.com/PaddlePaddle/Paddle/go; glide install; cd - - - go get github.com/alecthomas/gometalinter - gometalinter --install + mkdir -p ./build/go + cp go/glide.* build/go + cd build/go; glide install; cd - - cd ${PADDLE_ROOT} export PATH=/usr/bin:$PATH pre-commit install clang-format --version -- GitLab From a4237171a5f647f5c841e61d5d61f2ff8f8e80f7 Mon Sep 17 00:00:00 2001 From: Siddharth Goyal Date: Mon, 4 Jun 2018 14:29:19 -0700 Subject: [PATCH 162/913] Modify optimizer in new API to support more usecases (#11168) * Modify optimizer in new API to support more usecase * Modify CMake to include only modified examples --- .../fluid/tests/book/high-level-api/CMakeLists.txt | 12 ++++++------ .../high-level-api/fit_a_line/test_fit_a_line.py | 8 +++++--- .../test_label_semantic_roles_newapi.py | 10 +++++++--- python/paddle/fluid/trainer.py | 13 +++++++------ 4 files changed, 25 insertions(+), 18 deletions(-) diff --git a/python/paddle/fluid/tests/book/high-level-api/CMakeLists.txt b/python/paddle/fluid/tests/book/high-level-api/CMakeLists.txt index efa5ee2d06a..07da382867e 100644 --- a/python/paddle/fluid/tests/book/high-level-api/CMakeLists.txt +++ b/python/paddle/fluid/tests/book/high-level-api/CMakeLists.txt @@ -7,10 +7,10 @@ foreach(src ${TEST_OPS}) endforeach() add_subdirectory(fit_a_line) -add_subdirectory(recognize_digits) -add_subdirectory(image_classification) -add_subdirectory(understand_sentiment) +#add_subdirectory(recognize_digits) +#add_subdirectory(image_classification) +#add_subdirectory(understand_sentiment) add_subdirectory(label_semantic_roles) -add_subdirectory(word2vec) -add_subdirectory(recommender_system) -add_subdirectory(machine_translation) +#add_subdirectory(word2vec) +#add_subdirectory(recommender_system) +#add_subdirectory(machine_translation) diff --git a/python/paddle/fluid/tests/book/high-level-api/fit_a_line/test_fit_a_line.py b/python/paddle/fluid/tests/book/high-level-api/fit_a_line/test_fit_a_line.py index de3906fc6a0..b3117cf2e5e 100644 --- a/python/paddle/fluid/tests/book/high-level-api/fit_a_line/test_fit_a_line.py +++ b/python/paddle/fluid/tests/book/high-level-api/fit_a_line/test_fit_a_line.py @@ -48,13 +48,15 @@ def linear(): return avg_loss +def optimizer_func(): + return fluid.optimizer.SGD(learning_rate=0.001) + + def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() trainer = fluid.Trainer( - train_func=train_program, - place=place, - optimizer=fluid.optimizer.SGD(learning_rate=0.001)) + train_func=train_program, place=place, optimizer_func=optimizer_func) def event_handler(event): if isinstance(event, fluid.EndStepEvent): diff --git a/python/paddle/fluid/tests/book/high-level-api/label_semantic_roles/test_label_semantic_roles_newapi.py b/python/paddle/fluid/tests/book/high-level-api/label_semantic_roles/test_label_semantic_roles_newapi.py index 8cce398ff33..0ccb3a39e02 100755 --- a/python/paddle/fluid/tests/book/high-level-api/label_semantic_roles/test_label_semantic_roles_newapi.py +++ b/python/paddle/fluid/tests/book/high-level-api/label_semantic_roles/test_label_semantic_roles_newapi.py @@ -141,12 +141,16 @@ def train_program(): return [avg_cost] +def optimize_func(): + return fluid.optimizer.SGD(learning_rate=fluid.layers.exponential_decay( + learning_rate=0.01, decay_steps=100000, decay_rate=0.5, staircase=True)) + + def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() - optimizer = fluid.optimizer.SGD(learning_rate=0.01) trainer = fluid.Trainer( - train_func=train_program, place=place, optimizer=optimizer) + train_func=train_program, place=place, optimizer_func=optimize_func) feed_order = [ 'word_data', 'ctx_n2_data', 'ctx_n1_data', 'ctx_0_data', 'ctx_p1_data', @@ -245,7 +249,7 @@ def infer(use_cuda, inference_program, params_dirname): }, return_numpy=False) - print("infer results: ", np.array(results[0])) + print("infer results: ", np.array(results[0]).shape) def main(use_cuda): diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 7da123dd92e..cdacb419863 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -90,13 +90,13 @@ class Trainer(object): Args: train_func(callable): A function which will return loss. The loss must be a scalar. - optimizer(optimizer.Optimizer): The optimizer should be an instance of Optimizer + optimizer_func(callable): A function that returns an Optimizer object. place: The device place of this trainer. """ def __init__(self, train_func, - optimizer, + optimizer_func, param_path=None, place=None, parallel=False): @@ -105,8 +105,6 @@ class Trainer(object): # 1. we need to generate a framework.Program by calling # program_func. Reference: fluid.program_guard in # test_word2vec.py - if not isinstance(optimizer, opt_module.Optimizer): - raise TypeError("The optimizer should be an instance of Optimizer") self.scope = core.Scope() @@ -118,11 +116,14 @@ class Trainer(object): self.train_func_outputs = program_func_outs if isinstance( program_func_outs, list) else [program_func_outs] self.test_program = self.train_program.clone() + + # The fisrt element of program_func_outs is loss. + loss = self.train_func_outputs[0] + + optimizer = optimizer_func() if not isinstance(optimizer, opt_module.Optimizer): raise TypeError( "The optimizer should be an instance of Optimizer") - # The fisrt element of program_func_outs is loss. - loss = self.train_func_outputs[0] optimize_ops, params_grads = optimizer.minimize(loss) self.place = check_and_get_place(place) -- GitLab From f3d14c3bed9cc783fa6089819ddb54236e6e67f2 Mon Sep 17 00:00:00 2001 From: Lei Wang Date: Mon, 4 Jun 2018 15:04:21 -0700 Subject: [PATCH 163/913] Doc: fix android cross_compiling documents. (#11169) --- doc/mobile/cross_compiling_for_android_cn.md | 6 +++--- doc/mobile/cross_compiling_for_android_en.md | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/mobile/cross_compiling_for_android_cn.md b/doc/mobile/cross_compiling_for_android_cn.md index cdd69172393..0607748b751 100644 --- a/doc/mobile/cross_compiling_for_android_cn.md +++ b/doc/mobile/cross_compiling_for_android_cn.md @@ -63,16 +63,16 @@ Android的Docker开发镜像向用户提供两个可配置的参数: - 编译`armeabi-v7a`,`Android API 21`的PaddlePaddle库 ```bash -$ docker run -it --rm -v $PWD:/paddle -e "ANDROID_ABI=armeabi-v7a" -e "ANDROID_API=21" username/paddle-android:dev +$ docker run -it --rm -v $PWD:/paddle -w /paddle -e "ANDROID_ABI=armeabi-v7a" -e "ANDROID_API=21" username/paddle-android:dev ./paddle/scripts/paddle_build.sh build_android ``` - 编译`arm64-v8a`,`Android API 21`的PaddlePaddle库 ```bash -$ docker run -it --rm -v $PWD:/paddle -e "ANDROID_ABI=arm64-v8a" -e "ANDROID_API=21" username/paddle-android:dev +$ docker run -it --rm -v $PWD:/paddle -w /paddle -e "ANDROID_ABI=arm64-v8a" -e "ANDROID_API=21" username/paddle-android:dev ./paddle/scripts/paddle_build.sh build_android ``` -执行上述`docker run`命令时,容器默认执行[paddle/scripts/docker/build_android.sh](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/scripts/docker/build_android.sh)脚本。该脚本中记录了交叉编译Android版PaddlePaddle库常用的CMake配置,并且会根据`ANDROID_ABI`和`ANDROID_API`自动构建独立工具链、进行编译和安装。由于arm64架构要求Android API不小于21。因此当`ANDROID_ABI=arm64-v8a`,`ANDROID_API<21`时,Docker容器中将默认使用`Android API 21`的编译工具链。用户可以参考下文[配置交叉编译参数](#配置交叉编译参数)章节,根据个人的需求修改定制Docker容器所执行的脚本。编译安装结束之后,PaddlePaddle的C-API库将被安装到`$PWD/install_android`目录,所依赖的第三方库同时也被安装到`$PWD/install_android/third_party`目录。 +执行上述`docker run`命令时,容器执行[paddle/scripts/paddle_build.sh build_android](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/scripts/paddle_build.sh)脚本。该脚本中记录了交叉编译Android版PaddlePaddle库常用的CMake配置,并且会根据`ANDROID_ABI`和`ANDROID_API`自动构建独立工具链、进行编译和安装。由于arm64架构要求Android API不小于21。因此当`ANDROID_ABI=arm64-v8a`,`ANDROID_API<21`时,Docker容器中将默认使用`Android API 21`的编译工具链。用户可以参考下文[配置交叉编译参数](#配置交叉编译参数)章节,根据个人的需求修改定制Docker容器所执行的脚本。编译安装结束之后,PaddlePaddle的C-API库将被安装到`$PWD/install_android`目录,所依赖的第三方库同时也被安装到`$PWD/install_android/third_party`目录。 ## 基于Linux交叉编译环境的编译方式 本文档将以Linux x86-64平台为例,介绍交叉编译Android平台上适用的PaddlePaddle库的方法和步骤。 diff --git a/doc/mobile/cross_compiling_for_android_en.md b/doc/mobile/cross_compiling_for_android_en.md index 6af16fc114a..572063e8012 100644 --- a/doc/mobile/cross_compiling_for_android_en.md +++ b/doc/mobile/cross_compiling_for_android_en.md @@ -36,7 +36,7 @@ $ docker pull docker.paddlepaddlehub.com/paddle:latest-dev-android We can run the Docker image we just created to build the inference library of PaddlePaddle for Android using the command below: ```bash -$ docker run -it --rm -v $PWD:/paddle -e "ANDROID_ABI=armeabi-v7a" -e "ANDROID_API=21" paddle:dev-android +$ docker run -it --rm -v $PWD:/paddle -w /paddle -e "ANDROID_ABI=armeabi-v7a" -e "ANDROID_API=21" paddle:dev-android ./paddle/scripts/paddle_build.sh build_android ``` The Docker image accepts two arguments `ANDROID_ABI` and `ANDROID_API`: @@ -70,7 +70,7 @@ The Docker image accepts two arguments `ANDROID_ABI` and `ANDROID_API`: The ARM-64 architecture (`arm64-v8a`) requires at least level 21 of Android API. -The default entry-point of the Docker image, [`paddle/scripts/docker/build_android.sh`](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/scripts/docker/build_android.sh) generates the [Android cross-compiling standalone toolchain](https://developer.android.com/ndk/guides/standalone_toolchain.html) based on the argument: `ANDROID_ABI` or `ANDROID_API`. For information about other configuration arguments, please continue reading. +The build command, [`paddle/scripts/paddle_build.sh build_android`](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/scripts/paddle_build.sh) generates the [Android cross-compiling standalone toolchain](https://developer.android.com/ndk/guides/standalone_toolchain.html) based on the argument: `ANDROID_ABI` or `ANDROID_API`. For information about other configuration arguments, please continue reading. The above command generates and outputs the inference library in `$PWD/install_android` and puts third-party libraries in `$PWD/install_android/third_party`. -- GitLab From c9067bef99acf7b4903de86470437b39e55d4d53 Mon Sep 17 00:00:00 2001 From: Lei Wang Date: Mon, 4 Jun 2018 16:37:27 -0700 Subject: [PATCH 164/913] Doc: remove broken symbol links. (#11170) --- doc/fluid/howto/optimization/benchmark/README.md | 1 - doc/fluid/howto/optimization/benchmark/vgg16/README.md | 1 - 2 files changed, 2 deletions(-) delete mode 120000 doc/fluid/howto/optimization/benchmark/README.md delete mode 120000 doc/fluid/howto/optimization/benchmark/vgg16/README.md diff --git a/doc/fluid/howto/optimization/benchmark/README.md b/doc/fluid/howto/optimization/benchmark/README.md deleted file mode 120000 index db30af7f532..00000000000 --- a/doc/fluid/howto/optimization/benchmark/README.md +++ /dev/null @@ -1 +0,0 @@ -../../../../../benchmark/cluster/README.md \ No newline at end of file diff --git a/doc/fluid/howto/optimization/benchmark/vgg16/README.md b/doc/fluid/howto/optimization/benchmark/vgg16/README.md deleted file mode 120000 index ca963ef5f06..00000000000 --- a/doc/fluid/howto/optimization/benchmark/vgg16/README.md +++ /dev/null @@ -1 +0,0 @@ -../../../../../../benchmark/cluster/vgg16/README.md \ No newline at end of file -- GitLab From 99a5a3d8d3f1f2ab08b2e04828b812890bb29a73 Mon Sep 17 00:00:00 2001 From: Siddharth Goyal Date: Mon, 4 Jun 2018 17:17:57 -0700 Subject: [PATCH 165/913] Fix optimizer in remaining chapters with high level API (#11172) --- .../fluid/tests/book/high-level-api/CMakeLists.txt | 12 ++++++------ .../test_image_classification_resnet.py | 8 +++++--- .../test_image_classification_vgg.py | 8 +++++--- .../test_machine_translation.py | 14 +++++++++----- .../recognize_digits/test_recognize_digits_conv.py | 7 +++++-- .../recognize_digits/test_recognize_digits_mlp.py | 7 +++++-- .../test_recommender_system_newapi.py | 7 +++++-- .../test_understand_sentiment_conv.py | 7 +++++-- .../test_understand_sentiment_dynamic_rnn.py | 7 +++++-- .../test_understand_sentiment_stacked_lstm.py | 7 +++++-- .../word2vec/test_word2vec_new_api.py | 8 +++++--- 11 files changed, 60 insertions(+), 32 deletions(-) diff --git a/python/paddle/fluid/tests/book/high-level-api/CMakeLists.txt b/python/paddle/fluid/tests/book/high-level-api/CMakeLists.txt index 07da382867e..efa5ee2d06a 100644 --- a/python/paddle/fluid/tests/book/high-level-api/CMakeLists.txt +++ b/python/paddle/fluid/tests/book/high-level-api/CMakeLists.txt @@ -7,10 +7,10 @@ foreach(src ${TEST_OPS}) endforeach() add_subdirectory(fit_a_line) -#add_subdirectory(recognize_digits) -#add_subdirectory(image_classification) -#add_subdirectory(understand_sentiment) +add_subdirectory(recognize_digits) +add_subdirectory(image_classification) +add_subdirectory(understand_sentiment) add_subdirectory(label_semantic_roles) -#add_subdirectory(word2vec) -#add_subdirectory(recommender_system) -#add_subdirectory(machine_translation) +add_subdirectory(word2vec) +add_subdirectory(recommender_system) +add_subdirectory(machine_translation) diff --git a/python/paddle/fluid/tests/book/high-level-api/image_classification/test_image_classification_resnet.py b/python/paddle/fluid/tests/book/high-level-api/image_classification/test_image_classification_resnet.py index 63dc1b6ce30..2df3da9cca7 100644 --- a/python/paddle/fluid/tests/book/high-level-api/image_classification/test_image_classification_resnet.py +++ b/python/paddle/fluid/tests/book/high-level-api/image_classification/test_image_classification_resnet.py @@ -85,6 +85,10 @@ def train_network(): return [avg_cost, accuracy] +def optimizer_func(): + return fluid.optimizer.Adam(learning_rate=0.001) + + def train(use_cuda, train_program, params_dirname): BATCH_SIZE = 128 EPOCH_NUM = 1 @@ -111,9 +115,7 @@ def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() trainer = fluid.Trainer( - train_func=train_program, - optimizer=fluid.optimizer.Adam(learning_rate=0.001), - place=place) + train_func=train_program, optimizer_func=optimizer_func, place=place) trainer.train( reader=train_reader, diff --git a/python/paddle/fluid/tests/book/high-level-api/image_classification/test_image_classification_vgg.py b/python/paddle/fluid/tests/book/high-level-api/image_classification/test_image_classification_vgg.py index 0bf8f265a1c..224cca417e7 100644 --- a/python/paddle/fluid/tests/book/high-level-api/image_classification/test_image_classification_vgg.py +++ b/python/paddle/fluid/tests/book/high-level-api/image_classification/test_image_classification_vgg.py @@ -64,6 +64,10 @@ def train_network(): return [avg_cost, accuracy] +def optimizer_func(): + return fluid.optimizer.Adam(learning_rate=0.001) + + def train(use_cuda, train_program, params_dirname): BATCH_SIZE = 128 train_reader = paddle.batch( @@ -88,9 +92,7 @@ def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() trainer = fluid.Trainer( - train_func=train_program, - place=place, - optimizer=fluid.optimizer.Adam(learning_rate=0.001)) + train_func=train_program, place=place, optimizer_func=optimizer_func) trainer.train( reader=train_reader, diff --git a/python/paddle/fluid/tests/book/high-level-api/machine_translation/test_machine_translation.py b/python/paddle/fluid/tests/book/high-level-api/machine_translation/test_machine_translation.py index d4b723d3e6b..c4b37df3a09 100644 --- a/python/paddle/fluid/tests/book/high-level-api/machine_translation/test_machine_translation.py +++ b/python/paddle/fluid/tests/book/high-level-api/machine_translation/test_machine_translation.py @@ -158,6 +158,13 @@ def train_program(is_sparse): return avg_cost +def optimizer_func(): + return fluid.optimizer.Adagrad( + learning_rate=1e-4, + regularization=fluid.regularizer.L2DecayRegularizer( + regularization_coeff=0.1)) + + def train(use_cuda, is_sparse, is_local=True): EPOCH_NUM = 1 @@ -182,11 +189,8 @@ def train(use_cuda, is_sparse, is_local=True): trainer = fluid.Trainer( train_func=partial(train_program, is_sparse), - optimizer=fluid.optimizer.Adagrad( - learning_rate=1e-4, - regularization=fluid.regularizer.L2DecayRegularizer( - regularization_coeff=0.1)), - place=place) + place=place, + optimizer_func=optimizer_func) trainer.train( reader=train_reader, diff --git a/python/paddle/fluid/tests/book/high-level-api/recognize_digits/test_recognize_digits_conv.py b/python/paddle/fluid/tests/book/high-level-api/recognize_digits/test_recognize_digits_conv.py index 03439cbd376..9a09db25dc0 100644 --- a/python/paddle/fluid/tests/book/high-level-api/recognize_digits/test_recognize_digits_conv.py +++ b/python/paddle/fluid/tests/book/high-level-api/recognize_digits/test_recognize_digits_conv.py @@ -57,14 +57,17 @@ def train_program(): return [avg_cost, acc] +def optimizer_func(): + return fluid.optimizer.Adam(learning_rate=0.001) + + def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() - optimizer = fluid.optimizer.Adam(learning_rate=0.001) trainer = fluid.Trainer( train_func=train_program, place=place, - optimizer=optimizer, + optimizer_func=optimizer_func, parallel=True) def event_handler(event): diff --git a/python/paddle/fluid/tests/book/high-level-api/recognize_digits/test_recognize_digits_mlp.py b/python/paddle/fluid/tests/book/high-level-api/recognize_digits/test_recognize_digits_mlp.py index 89bbd21bea7..b2b544e791d 100644 --- a/python/paddle/fluid/tests/book/high-level-api/recognize_digits/test_recognize_digits_mlp.py +++ b/python/paddle/fluid/tests/book/high-level-api/recognize_digits/test_recognize_digits_mlp.py @@ -44,12 +44,15 @@ def train_program(): return [avg_cost, acc] +def optimizer_func(): + return fluid.optimizer.Adam(learning_rate=0.001) + + def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() - optimizer = fluid.optimizer.Adam(learning_rate=0.001) trainer = fluid.Trainer( - train_func=train_program, place=place, optimizer=optimizer) + train_func=train_program, place=place, optimizer_func=optimizer_func) def event_handler(event): if isinstance(event, fluid.EndEpochEvent): diff --git a/python/paddle/fluid/tests/book/high-level-api/recommender_system/test_recommender_system_newapi.py b/python/paddle/fluid/tests/book/high-level-api/recommender_system/test_recommender_system_newapi.py index dfc7325acf2..090c11ce1e7 100644 --- a/python/paddle/fluid/tests/book/high-level-api/recommender_system/test_recommender_system_newapi.py +++ b/python/paddle/fluid/tests/book/high-level-api/recommender_system/test_recommender_system_newapi.py @@ -155,12 +155,15 @@ def train_program(): return [avg_cost, scale_infer] +def optimizer_func(): + return fluid.optimizer.SGD(learning_rate=0.2) + + def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() - optimizer = fluid.optimizer.SGD(learning_rate=0.2) trainer = fluid.Trainer( - train_func=train_program, place=place, optimizer=optimizer) + train_func=train_program, place=place, optimizer_func=optimizer_func) feed_order = [ 'user_id', 'gender_id', 'age_id', 'job_id', 'movie_id', 'category_id', diff --git a/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_conv.py b/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_conv.py index 11e9fd1bec1..9b61f7a00ce 100644 --- a/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_conv.py +++ b/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_conv.py @@ -64,15 +64,18 @@ def train_program(word_dict): return [avg_cost, accuracy] +def optimizer_func(): + return fluid.optimizer.Adagrad(learning_rate=0.002) + + def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() - optimizer = fluid.optimizer.Adagrad(learning_rate=0.002) word_dict = paddle.dataset.imdb.word_dict() trainer = fluid.Trainer( train_func=partial(train_program, word_dict), place=place, - optimizer=optimizer) + optimizer_func=optimizer_func) def event_handler(event): if isinstance(event, fluid.EndEpochEvent): diff --git a/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_dynamic_rnn.py b/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_dynamic_rnn.py index 90757d54f99..aa7c567b4d6 100644 --- a/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_dynamic_rnn.py +++ b/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_dynamic_rnn.py @@ -79,15 +79,18 @@ def train_program(word_dict): return [avg_cost, accuracy] +def optimizer_func(): + return fluid.optimizer.Adagrad(learning_rate=0.002) + + def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() - optimizer = fluid.optimizer.Adagrad(learning_rate=0.002) word_dict = paddle.dataset.imdb.word_dict() trainer = fluid.Trainer( train_func=partial(train_program, word_dict), place=place, - optimizer=optimizer) + optimizer_func=optimizer_func) def event_handler(event): if isinstance(event, fluid.EndEpochEvent): diff --git a/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_stacked_lstm.py b/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_stacked_lstm.py index 52b7d4a8377..113dda88ca9 100644 --- a/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_stacked_lstm.py +++ b/python/paddle/fluid/tests/book/high-level-api/understand_sentiment/test_understand_sentiment_stacked_lstm.py @@ -71,15 +71,18 @@ def train_program(word_dict): return [avg_cost, accuracy] +def optimizer_func(): + return fluid.optimizer.Adagrad(learning_rate=0.002) + + def train(use_cuda, train_program, params_dirname): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() - optimizer = fluid.optimizer.Adagrad(learning_rate=0.002) word_dict = paddle.dataset.imdb.word_dict() trainer = fluid.Trainer( train_func=partial(train_program, word_dict), place=place, - optimizer=optimizer) + optimizer_func=optimizer_func) def event_handler(event): if isinstance(event, fluid.EndEpochEvent): diff --git a/python/paddle/fluid/tests/book/high-level-api/word2vec/test_word2vec_new_api.py b/python/paddle/fluid/tests/book/high-level-api/word2vec/test_word2vec_new_api.py index eeb8e670873..ba44f72d9b0 100644 --- a/python/paddle/fluid/tests/book/high-level-api/word2vec/test_word2vec_new_api.py +++ b/python/paddle/fluid/tests/book/high-level-api/word2vec/test_word2vec_new_api.py @@ -80,6 +80,10 @@ def train_program(is_sparse): return avg_cost +def optimizer_func(): + return fluid.optimizer.SGD(learning_rate=0.001) + + def train(use_cuda, train_program, params_dirname): train_reader = paddle.batch( paddle.dataset.imikolov.train(word_dict, N), BATCH_SIZE) @@ -104,9 +108,7 @@ def train(use_cuda, train_program, params_dirname): sys.exit("got NaN loss, training failed.") trainer = fluid.Trainer( - train_func=train_program, - optimizer=fluid.optimizer.SGD(learning_rate=0.001), - place=place) + train_func=train_program, optimizer_func=optimizer_func, place=place) trainer.train( reader=train_reader, -- GitLab From 5713a0bf5eef095ee2e1d6006add1574fca8de63 Mon Sep 17 00:00:00 2001 From: Kexin Zhao Date: Mon, 4 Jun 2018 17:46:12 -0700 Subject: [PATCH 166/913] fix lodtensor api in memory opt machine trans (#11171) --- .../test_memopt_machine_translation.py | 34 ++++++------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/python/paddle/fluid/tests/book_memory_optimization/test_memopt_machine_translation.py b/python/paddle/fluid/tests/book_memory_optimization/test_memopt_machine_translation.py index a1ca6d981fa..fa696acdfa9 100644 --- a/python/paddle/fluid/tests/book_memory_optimization/test_memopt_machine_translation.py +++ b/python/paddle/fluid/tests/book_memory_optimization/test_memopt_machine_translation.py @@ -80,21 +80,6 @@ def encoder_decoder(): return rnn() -def to_lodtensor(data, place): - seq_lens = [len(seq) for seq in data] - cur_len = 0 - lod = [cur_len] - for l in seq_lens: - cur_len += l - lod.append(cur_len) - flattened_data = np.concatenate(data, axis=0).astype("int64") - flattened_data = flattened_data.reshape([len(flattened_data), 1]) - res = core.LoDTensor() - res.set(flattened_data, place) - res.set_lod([lod]) - return res - - def main(): rnn_out = encoder_decoder() label = layers.data( @@ -122,18 +107,21 @@ def main(): exe.run(framework.default_startup_program()) + feed_order = [ + 'src_word_id', 'target_language_word', 'target_language_next_word' + ] + + feed_list = [ + fluid.default_main_program().global_block().var(var_name) + for var_name in feed_order + ] + feeder = fluid.DataFeeder(feed_list, place) + batch_id = 0 for pass_id in xrange(10): for data in train_data(): - word_data = to_lodtensor(map(lambda x: x[0], data), place) - trg_word = to_lodtensor(map(lambda x: x[1], data), place) - trg_word_next = to_lodtensor(map(lambda x: x[2], data), place) outs = exe.run(fluid.default_main_program(), - feed={ - 'src_word_id': word_data, - 'target_language_word': trg_word, - 'target_language_next_word': trg_word_next - }, + feed=feeder.feed(data), fetch_list=[avg_cost]) avg_cost_val = np.array(outs[0]) print('pass_id=' + str(pass_id) + ' batch=' + str(batch_id) + -- GitLab From c8d6c1d09c46457bbb68665108b3468de5a064fa Mon Sep 17 00:00:00 2001 From: whs Date: Tue, 5 Jun 2018 10:09:22 +0800 Subject: [PATCH 167/913] Auto generate python api for polygon_box_transform op. (#11074) * Auto generate python api for polygon_box_transform op. * Add unitest. --- python/paddle/fluid/layers/ops.py | 1 + python/paddle/fluid/tests/unittests/test_layers.py | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/python/paddle/fluid/layers/ops.py b/python/paddle/fluid/layers/ops.py index 60f8cbbfa71..69cfde852dd 100644 --- a/python/paddle/fluid/layers/ops.py +++ b/python/paddle/fluid/layers/ops.py @@ -71,6 +71,7 @@ __all__ = [ 'cumsum', 'scatter', 'sum', + 'polygon_box_transform', 'shape', ] + __activations__ diff --git a/python/paddle/fluid/tests/unittests/test_layers.py b/python/paddle/fluid/tests/unittests/test_layers.py index ca08fd7fc8e..621a450fa6a 100644 --- a/python/paddle/fluid/tests/unittests/test_layers.py +++ b/python/paddle/fluid/tests/unittests/test_layers.py @@ -379,6 +379,14 @@ class TestBook(unittest.TestCase): self.assertIsNotNone(output) print(str(program)) + def test_polygon_box_transform(self): + program = Program() + with program_guard(program): + x = layers.data(name='x', shape=[8, 4, 4], dtype="float32") + output = layers.polygon_box_transform(input=x) + self.assertIsNotNone(output) + print(str(program)) + if __name__ == '__main__': unittest.main() -- GitLab From 9d1dae3987abcef8a77f07e9e86e96de27b1cd46 Mon Sep 17 00:00:00 2001 From: Luo Tao Date: Tue, 5 Jun 2018 10:20:40 +0800 Subject: [PATCH 168/913] remove argument cpus, and will add in next PR --- benchmark/fluid/fluid_benchmark.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/benchmark/fluid/fluid_benchmark.py b/benchmark/fluid/fluid_benchmark.py index cac1b0fad00..9d33a841cdd 100644 --- a/benchmark/fluid/fluid_benchmark.py +++ b/benchmark/fluid/fluid_benchmark.py @@ -69,11 +69,6 @@ def parse_args(): type=int, default=1, help='If gpus > 1, will use ParallelExecutor to run, else use Executor.') - parser.add_argument( - '--cpus', - type=int, - default=1, - help='If cpus > 1, will use ParallelDo to run, else use Executor.') parser.add_argument( '--data_set', type=str, -- GitLab From 02cc80b30d5b5d6152171427ed8be8c8f91616e6 Mon Sep 17 00:00:00 2001 From: sneaxiy Date: Tue, 5 Jun 2018 10:33:20 +0800 Subject: [PATCH 169/913] Fix dangling pointer bug --- paddle/fluid/framework/executor.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/paddle/fluid/framework/executor.cc b/paddle/fluid/framework/executor.cc index 863053c32b1..3d68c5fb870 100644 --- a/paddle/fluid/framework/executor.cc +++ b/paddle/fluid/framework/executor.cc @@ -220,8 +220,10 @@ void Executor::Run(const ProgramDesc& program, Scope* scope, has_fetch_operators(program.Block(0), *fetch_targets, fetch_holder_name); ProgramDesc* copy_program = const_cast(&program); + std::unique_ptr unique_ptr_of_copy_program; if (!has_feed_ops || !has_fetch_ops) { - copy_program = std::unique_ptr(new ProgramDesc(program)).get(); + unique_ptr_of_copy_program.reset(new ProgramDesc(program)); + copy_program = unique_ptr_of_copy_program.get(); } auto* global_block = copy_program->MutableBlock(0); -- GitLab From 211b707b30929ebd8a1e3fb5fabfb848f0617095 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Tue, 5 Jun 2018 11:19:30 +0800 Subject: [PATCH 170/913] fix unknown gpu flag when cpu only --- paddle/contrib/inference/demo/simple_on_word2vec.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/paddle/contrib/inference/demo/simple_on_word2vec.cc b/paddle/contrib/inference/demo/simple_on_word2vec.cc index ee865f37900..9b4843f714f 100644 --- a/paddle/contrib/inference/demo/simple_on_word2vec.cc +++ b/paddle/contrib/inference/demo/simple_on_word2vec.cc @@ -65,7 +65,10 @@ void Main(bool use_gpu) { } TEST(demo, word2vec_cpu) { Main(false /*use_gpu*/); } + +#ifdef PADDLE_WITH_CUDA TEST(demo, word2vec_gpu) { Main(true /*use_gpu*/); } +#endif } // namespace demo } // namespace paddle -- GitLab From 2c2120c8a269080a883ad4b1eb8022d71f3d2cf8 Mon Sep 17 00:00:00 2001 From: Yibing Liu Date: Mon, 4 Jun 2018 20:25:25 -0700 Subject: [PATCH 171/913] Remove redundant code --- paddle/fluid/operators/argsort_op.h | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/paddle/fluid/operators/argsort_op.h b/paddle/fluid/operators/argsort_op.h index a9fe22c4ce1..51d2b89f94d 100644 --- a/paddle/fluid/operators/argsort_op.h +++ b/paddle/fluid/operators/argsort_op.h @@ -14,28 +14,20 @@ limitations under the License. */ #pragma once #include -#include #include #include -#include "paddle/fluid/framework/eigen.h" #include "paddle/fluid/framework/op_registry.h" namespace paddle { namespace operators { -using Tensor = framework::Tensor; - -template -using EigenMatrix = framework::EigenMatrix; - template class ArgsortKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& ctx) const override { - auto* input = ctx.Input("X"); - auto* output = ctx.Output("Out"); - auto* indices = ctx.Output("Indices"); + auto* input = ctx.Input("X"); + auto* output = ctx.Output("Out"); + auto* indices = ctx.Output("Indices"); int axis = static_cast(ctx.Attr("axis")); auto in_dims = input->dims(); -- GitLab From 238124909e978b3e581c214859cf7aea5df57b31 Mon Sep 17 00:00:00 2001 From: Qiao Longfei Date: Tue, 5 Jun 2018 13:01:21 +0800 Subject: [PATCH 172/913] fix protobuf memory leak (#11177) fix protobuf memory leak --- paddle/fluid/framework/block_desc.cc | 28 ++++------------------------ paddle/fluid/framework/block_desc.h | 9 --------- 2 files changed, 4 insertions(+), 33 deletions(-) diff --git a/paddle/fluid/framework/block_desc.cc b/paddle/fluid/framework/block_desc.cc index e7842e9b813..f537e4b9e56 100644 --- a/paddle/fluid/framework/block_desc.cc +++ b/paddle/fluid/framework/block_desc.cc @@ -169,17 +169,13 @@ void BlockDesc::Flush() { } if (need_update_) { - auto &op_field = *this->desc_->mutable_ops(); - this->ClearPBOps(); - op_field.Reserve(static_cast(ops_.size())); + this->desc_->mutable_ops()->Clear(); for (auto &op_desc : ops_) { - op_field.AddAllocated(op_desc->Proto()); + this->desc_->mutable_ops()->Add()->CopyFrom(*op_desc->Proto()); } - auto &var_field = *this->desc_->mutable_vars(); - this->ClearPBVars(); - var_field.Reserve(static_cast(vars_.size())); + this->desc_->mutable_vars()->Clear(); for (auto &var_desc : vars_) { - var_field.AddAllocated(var_desc.second->Proto()); + this->desc_->mutable_vars()->Add()->CopyFrom(*var_desc.second->Proto()); } need_update_ = false; } @@ -217,22 +213,6 @@ BlockDesc::BlockDesc(const BlockDesc &other, proto::BlockDesc *desc, } } -void BlockDesc::ClearPBOps() { - auto ops = this->desc_->mutable_ops(); - while (!ops->empty()) { - // we do not own the OpDesc, so release the ownership. - ops->ReleaseLast(); - } -} - -void BlockDesc::ClearPBVars() { - auto vars = this->desc_->mutable_vars(); - while (!vars->empty()) { - // we do not own the VarDesc, so release the ownership. - vars->ReleaseLast(); - } -} - void BlockDesc::SetForwardBlockID(int32_t forward_block_id) { PADDLE_ENFORCE(!desc_->has_forward_block_idx(), "Parent block ID has been set to %d. Cannot set to %d", diff --git a/paddle/fluid/framework/block_desc.h b/paddle/fluid/framework/block_desc.h index 189dd6c52f8..ce485484184 100644 --- a/paddle/fluid/framework/block_desc.h +++ b/paddle/fluid/framework/block_desc.h @@ -41,11 +41,6 @@ class BlockDesc { BlockDesc(const BlockDesc &other, proto::BlockDesc *desc, ProgramDesc *prog); - ~BlockDesc() { - this->ClearPBVars(); - this->ClearPBOps(); - } - int32_t ID() const { return desc_->idx(); } int32_t Parent() const { return desc_->parent_idx(); } @@ -113,10 +108,6 @@ class BlockDesc { ProgramDesc *Program() const { return this->prog_; } - private: - void ClearPBOps(); - void ClearPBVars(); - private: ProgramDesc *prog_; // not_own proto::BlockDesc *desc_; // not_own -- GitLab From 9630aa0e525c9a60790b22b3dffe0b90e8bb02c2 Mon Sep 17 00:00:00 2001 From: Luo Tao Date: Tue, 5 Jun 2018 13:45:29 +0800 Subject: [PATCH 173/913] fix test error in fluid_benchmark.py --- benchmark/fluid/fluid_benchmark.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/benchmark/fluid/fluid_benchmark.py b/benchmark/fluid/fluid_benchmark.py index 9d33a841cdd..8e6bfcbd301 100644 --- a/benchmark/fluid/fluid_benchmark.py +++ b/benchmark/fluid/fluid_benchmark.py @@ -85,8 +85,8 @@ def parse_args(): help='If set, use nvprof for CUDA.') parser.add_argument( '--no_test', - action='store_false', - help='If set, test the testset during training.') + action='store_true', + help='If set, do not test the testset during training.') parser.add_argument( '--memory_optimize', action='store_true', @@ -229,9 +229,9 @@ def train(avg_loss, infer_prog, optimizer, train_reader, test_reader, batch_acc, print("Pass: %d, Iter: %d, Loss: %f\n" % (pass_id, iters, np.mean(train_losses))) print_train_time(start_time, time.time(), num_samples) - print("Pass: %d, Loss: %f" % (pass_id, np.mean(train_losses))) + print("Pass: %d, Loss: %f" % (pass_id, np.mean(train_losses))), # evaluation - if not args.no_test and batch_acc != None: + if not args.no_test and batch_acc: pass_test_acc = test(exe, infer_prog, test_reader, feeder, batch_acc) print(", Test Accuracy: %f" % pass_test_acc) @@ -310,7 +310,7 @@ def train_parallel(avg_loss, infer_prog, optimizer, train_reader, test_reader, print("Pass %d, batch %d, loss %s" % (pass_id, batch_id, np.array(loss))) print_train_time(start_time, time.time(), num_samples) - if not args.no_test and batch_acc != None: + if not args.no_test and batch_acc: test_acc = test(startup_exe, infer_prog, test_reader, feeder, batch_acc) print("Pass: %d, Test Accuracy: %f\n" % (pass_id, test_acc)) -- GitLab From 36594017dd8d6654221c109c4637dd7189b176cf Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Tue, 5 Jun 2018 14:32:01 +0800 Subject: [PATCH 174/913] make infer init explicit --- paddle/contrib/inference/paddle_inference_api_impl.cc | 11 ++++++----- paddle/contrib/inference/paddle_inference_api_impl.h | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/paddle/contrib/inference/paddle_inference_api_impl.cc b/paddle/contrib/inference/paddle_inference_api_impl.cc index 2d710727e23..bda2981a144 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.cc +++ b/paddle/contrib/inference/paddle_inference_api_impl.cc @@ -54,7 +54,8 @@ std::string num2str(T a) { } } // namespace -bool NativePaddlePredictor::Init(std::shared_ptr scope) { +bool NativePaddlePredictor::Init( + std::shared_ptr parent_scope) { VLOG(3) << "Predictor::init()"; if (config_.use_gpu) { @@ -62,9 +63,9 @@ bool NativePaddlePredictor::Init(std::shared_ptr scope) { } else { place_ = paddle::platform::CPUPlace(); } - if (scope) { - scope_ = scope; - sub_scope_ = &(scope->NewScope()); + if (parent_scope) { + scope_ = parent_scope; + sub_scope_ = &(parent_scope->NewScope()); } else { paddle::framework::InitDevices(false); scope_.reset(new paddle::framework::Scope()); @@ -275,7 +276,7 @@ CreatePaddlePredictor( } std::unique_ptr predictor(new NativePaddlePredictor(config)); - if (!dynamic_cast(predictor.get())->Init()) { + if (!dynamic_cast(predictor.get())->Init(nullptr)) { return nullptr; } return std::move(predictor); diff --git a/paddle/contrib/inference/paddle_inference_api_impl.h b/paddle/contrib/inference/paddle_inference_api_impl.h index dfb34a8631e..86d1db7bcc7 100644 --- a/paddle/contrib/inference/paddle_inference_api_impl.h +++ b/paddle/contrib/inference/paddle_inference_api_impl.h @@ -35,7 +35,7 @@ class NativePaddlePredictor : public PaddlePredictor { : config_(config) {} // will only create sub scope if have global scope - bool Init(std::shared_ptr scope = nullptr); + bool Init(std::shared_ptr parent_scope); bool Run(const std::vector &inputs, std::vector *output_data) override; -- GitLab From 9735f25011b04116d271861fde8df05def81c3ce Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Tue, 5 Jun 2018 14:47:13 +0800 Subject: [PATCH 175/913] optimized --- python/paddle/fluid/io.py | 44 +++++++++++++--------------------- python/paddle/fluid/trainer.py | 8 +++---- 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/python/paddle/fluid/io.py b/python/paddle/fluid/io.py index b5d96441bcf..5abadc73f76 100644 --- a/python/paddle/fluid/io.py +++ b/python/paddle/fluid/io.py @@ -492,7 +492,7 @@ def save_checkpoint(executor, if not os.path.isdir(checkpoint_dir): os.makedirs(checkpoint_dir) - serial = _get_latest_checkpoint_dir(checkpoint_dir) + 1 + serial = get_latest_checkpoint_serial(checkpoint_dir) + 1 cur_dir = _get_serial_dir(checkpoint_dir, serial) save_trainer_args(cur_dir, trainer_id, trainer_args) @@ -503,18 +503,6 @@ def save_checkpoint(executor, _lru_delete(checkpoint_dir, max_num_checkpoints) -def get_latest_checkpoint_serial(checkpoint_dir): - """ - If the directory have checkpoint files, it will return latest checkpoint directory serial number - - :param checkpoint_dir - """ - serial = _get_latest_checkpoint_dir(checkpoint_dir) - if serial < 0: - return None - return serial - - def load_checkpoint(executor, checkpoint_dir, serial, main_program): """ Load checkpoint from a directory by executor, @@ -527,17 +515,16 @@ def load_checkpoint(executor, checkpoint_dir, serial, main_program): """ if checkpoint_dir is None: - raise ValueError( - "The values of 'checkpoint_dir' or 'serial' should not be None") + raise ValueError("The values of 'checkpoint_dir' should not be None") if serial is None or serial < 0: raise ValueError("The values of 'serial' should not be None or <0 ") if main_program is None: - raise ValueError("The values of 'main_program'should not be None") + raise ValueError('main_program should not be None.') cur_dir = _get_serial_dir(checkpoint_dir, serial) - load_persist_vars_without_grad(executor, cur_dir, main_program) + load_persist_vars_without_grad(executor, cur_dir, main_program, True) def clean_checkpoint(checkpoint_dir, delete_dir=False): @@ -557,18 +544,21 @@ def clean_checkpoint(checkpoint_dir, delete_dir=False): os.rmdir(checkpoint_dir) -def load_persist_vars_without_grad(executor, dirname, program, nest=True): +def load_persist_vars_without_grad(executor, + dirname, + program, + has_model_dir=False): """ load_persist_vars_without_grad will load variables from a directory by an executor, the variable named end with "@GRAD" will not be loaded. - :param executor - :param dirname - :param program - :param nest + :param executor executor for load the value + :param dirname the checkpoint directory + :param program will load all variables in program + :param has_model_dir if has_model_dir is True, will load variables from sub directory named __model__ """ - if nest: + if has_model_dir: dirname = _get_model_dir(dirname) load_vars( @@ -584,9 +574,9 @@ def save_persist_vars_without_grad(executor, dirname, program): save_persist_vars_without_grad will save variables to a directory by an executor, the variable named end with "@GRAD" will not be saved. - :param executor - :param dirname - :param program + :param executor executor for load the value + :param dirname the checkpoint directory + :param program will load all variables in program """ cur_dir = _get_model_dir(dirname) save_vars( @@ -722,7 +712,7 @@ def _write_success(dirname): f.write(now) -def _get_latest_checkpoint_dir(checkpoint_dir): +def get_latest_checkpoint_serial(checkpoint_dir): """ get the latest file in checkpoint directory, the _SUCCESS file must exist in the directory diff --git a/python/paddle/fluid/trainer.py b/python/paddle/fluid/trainer.py index 3c32ec1de8a..fbdd28f53ef 100644 --- a/python/paddle/fluid/trainer.py +++ b/python/paddle/fluid/trainer.py @@ -146,8 +146,9 @@ class Trainer(object): "The checkpoint_config shoule be an instance of CheckpointConfig" ) else: - self.checkpoint.load_serial = io.get_latest_checkpoint_serial( + serial = io.get_latest_checkpoint_serial( self.checkpoint.checkpoint_dir) + self.checkpoint.load_serial = serial if serial >= 0 else None self.scope = core.Scope() @@ -194,10 +195,7 @@ class Trainer(object): if param_path and os.path.isdir(param_path): # load params from param_path into scope io.load_persist_vars_without_grad( - exe, - dirname=param_path, - program=self.startup_program, - nest=False) + exe, dirname=param_path, program=self.startup_program) def _transpile_nccl2_dist(self): # PADDLE_TRAINER_IPS -- GitLab From be16af3b04b3052e35e6d9157cec302274a629a4 Mon Sep 17 00:00:00 2001 From: tangwei12 Date: Tue, 5 Jun 2018 14:48:15 +0800 Subject: [PATCH 176/913] delete pyc --- tools/codestyle/docstring_checker.pyc | Bin 12561 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tools/codestyle/docstring_checker.pyc diff --git a/tools/codestyle/docstring_checker.pyc b/tools/codestyle/docstring_checker.pyc deleted file mode 100644 index a27d3c9a8cccab8552d510578debb2df04eb53bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12561 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 -- GitLab From d74838bda08f4331eba4d84c70e5cdbbf3a32868 Mon Sep 17 00:00:00 2001 From: whs Date: Tue, 5 Jun 2018 15:22:30 +0800 Subject: [PATCH 177/913] Prune dims supported by reduce op. (#11113) --- paddle/fluid/operators/reduce_op.h | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/paddle/fluid/operators/reduce_op.h b/paddle/fluid/operators/reduce_op.h index cd19cc1460a..7df47f316c3 100644 --- a/paddle/fluid/operators/reduce_op.h +++ b/paddle/fluid/operators/reduce_op.h @@ -135,15 +135,16 @@ class ReduceKernel : public framework::OpKernel { } else { int ndim = context.Input("X")->dims().size(); int rdim = context.Attr>("dim").size(); - HANDLE_DIM(6, 5); - HANDLE_DIM(6, 4); - HANDLE_DIM(6, 3); - HANDLE_DIM(6, 2); - HANDLE_DIM(6, 1); - HANDLE_DIM(5, 4); - HANDLE_DIM(5, 3); - HANDLE_DIM(5, 2); - HANDLE_DIM(5, 1); + // comments for accelerating compiling temporarily. + // HANDLE_DIM(6, 5); + // HANDLE_DIM(6, 4); + // HANDLE_DIM(6, 3); + // HANDLE_DIM(6, 2); + // HANDLE_DIM(6, 1); + // HANDLE_DIM(5, 4); + // HANDLE_DIM(5, 3); + // HANDLE_DIM(5, 2); + // HANDLE_DIM(5, 1); HANDLE_DIM(4, 3); HANDLE_DIM(4, 2); HANDLE_DIM(4, 1); -- GitLab From 2e0d851685402e4e9d1835824f956326e9f2b0fd Mon Sep 17 00:00:00 2001 From: "yi.wu" Date: Tue, 5 Jun 2018 15:39:49 +0800 Subject: [PATCH 178/913] update readme --- benchmark/fluid/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/benchmark/fluid/README.md b/benchmark/fluid/README.md index c17cab999b5..48280a5621b 100644 --- a/benchmark/fluid/README.md +++ b/benchmark/fluid/README.md @@ -45,10 +45,11 @@ Currently supported `--model` argument include: ## Prepare the RecordIO file to Achieve Better Performance Run the following command will generate RecordIO files like "mnist.recordio" under the path -and batch_size you choose: +and batch_size you choose, you can use batch_size=1 so that later reader can change the batch_size +at any time using `fluid.batch`. ```bash -python -c 'from recordio_converter import *; prepare_mnist("data", 32)' +python -c 'from recordio_converter import *; prepare_mnist("data", 1)' ``` ## Run Distributed Benchmark on Kubernetes Cluster -- GitLab From e896926b9c3c8bed544f92ad82d42daac9fac0c0 Mon Sep 17 00:00:00 2001 From: Yancey1989 Date: Tue, 5 Jun 2018 15:42:29 +0800 Subject: [PATCH 179/913] add unit test for dist mnist --- .../fluid/tests/unittests/CMakeLists.txt | 1 + .../fluid/tests/unittests/test_dist_mnist.py | 208 ++++++++++++++++++ 2 files changed, 209 insertions(+) create mode 100644 python/paddle/fluid/tests/unittests/test_dist_mnist.py diff --git a/python/paddle/fluid/tests/unittests/CMakeLists.txt b/python/paddle/fluid/tests/unittests/CMakeLists.txt index c33539f6b50..2f2e9c96c1b 100644 --- a/python/paddle/fluid/tests/unittests/CMakeLists.txt +++ b/python/paddle/fluid/tests/unittests/CMakeLists.txt @@ -52,3 +52,4 @@ py_test_modules(test_dist_train MODULES test_dist_train SERIAL) # since load cudnn libraries, so we use a longer timeout to make this # unit test stability. set_tests_properties(test_listen_and_serv_op PROPERTIES TIMEOUT 30) +set_tests_properties(test_dist_mnist PROPERTIES TIMEOUT 60) diff --git a/python/paddle/fluid/tests/unittests/test_dist_mnist.py b/python/paddle/fluid/tests/unittests/test_dist_mnist.py new file mode 100644 index 00000000000..e6bc56cce10 --- /dev/null +++ b/python/paddle/fluid/tests/unittests/test_dist_mnist.py @@ -0,0 +1,208 @@ +# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import numpy as np +import argparse +import time + +import paddle +import paddle.fluid as fluid +import paddle.fluid.profiler as profiler +from paddle.fluid import core +import unittest +from multiprocessing import Process +import os +import signal + +SEED = 1 +DTYPE = "float32" + + +# random seed must set before configuring the network. +# fluid.default_startup_program().random_seed = SEED +def cnn_model(data): + conv_pool_1 = fluid.nets.simple_img_conv_pool( + input=data, + filter_size=5, + num_filters=20, + pool_size=2, + pool_stride=2, + act="relu") + conv_pool_2 = fluid.nets.simple_img_conv_pool( + input=conv_pool_1, + filter_size=5, + num_filters=50, + pool_size=2, + pool_stride=2, + act="relu") + + # TODO(dzhwinter) : refine the initializer and random seed settting + SIZE = 10 + input_shape = conv_pool_2.shape + param_shape = [reduce(lambda a, b: a * b, input_shape[1:], 1)] + [SIZE] + scale = (2.0 / (param_shape[0]**2 * SIZE))**0.5 + + predict = fluid.layers.fc( + input=conv_pool_2, + size=SIZE, + act="softmax", + param_attr=fluid.param_attr.ParamAttr( + initializer=fluid.initializer.NormalInitializer( + loc=0.0, scale=scale))) + return predict + + +def get_model(batch_size): + # Input data + images = fluid.layers.data(name='pixel', shape=[1, 28, 28], dtype=DTYPE) + label = fluid.layers.data(name='label', shape=[1], dtype='int64') + + # Train program + predict = cnn_model(images) + cost = fluid.layers.cross_entropy(input=predict, label=label) + avg_cost = fluid.layers.mean(x=cost) + + # Evaluator + batch_size_tensor = fluid.layers.create_tensor(dtype='int64') + batch_acc = fluid.layers.accuracy( + input=predict, label=label, total=batch_size_tensor) + + inference_program = fluid.default_main_program().clone() + # Optimization + opt = fluid.optimizer.AdamOptimizer( + learning_rate=0.001, beta1=0.9, beta2=0.999) + + # Reader + train_reader = paddle.batch( + paddle.dataset.mnist.train(), batch_size=batch_size) + test_reader = paddle.batch( + paddle.dataset.mnist.test(), batch_size=batch_size) + opt.minimize(avg_cost) + return inference_program, avg_cost, train_reader, test_reader, batch_acc, predict + + +def get_transpiler(trainer_id, main_program, pserver_endpoints, trainers): + t = fluid.DistributeTranspiler() + t.transpile( + trainer_id=trainer_id, + program=main_program, + pservers=pserver_endpoints, + trainers=trainers) + return t + + +def run_pserver(pserver_endpoints, trainers, current_endpoint): + get_model(batch_size=20) + t = get_transpiler(0, + fluid.default_main_program(), pserver_endpoints, + trainers) + pserver_prog = t.get_pserver_program(current_endpoint) + startup_prog = t.get_startup_program(current_endpoint, pserver_prog) + + place = fluid.CPUPlace() + exe = fluid.Executor(place) + exe.run(startup_prog) + + exe.run(pserver_prog) + + +class TestDistMnist(unittest.TestCase): + def setUp(self): + self._trainers = 1 + self._pservers = 1 + self._ps_endpoints = "127.0.0.1:9123" + + def start_pserver(self, endpoint): + p = Process( + target=run_pserver, + args=(self._ps_endpoints, self._trainers, endpoint)) + p.start() + return p.pid + + def _wait_ps_ready(self, pid): + retry_times = 5 + while True: + assert retry_times >= 0, "wait ps ready failed" + time.sleep(1) + try: + # the listen_and_serv_op would touch a file which contains the listen port + # on the /tmp directory until it was ready to process all the RPC call. + os.stat("/tmp/paddle.%d.port" % pid) + return + except os.error: + retry_times -= 1 + + def stop_pserver(self, pid): + os.kill(pid, signal.SIGTERM) + + def test_with_place(self): + p = fluid.CUDAPlace() if core.is_compiled_with_cuda( + ) else fluid.CPUPlace() + + pserver_pid = self.start_pserver(self._ps_endpoints) + self._wait_ps_ready(pserver_pid) + + self.run_trainer(p, 0) + + self.stop_pserver(pserver_pid) + + def run_trainer(self, place, trainer_id): + test_program, avg_cost, train_reader, test_reader, batch_acc, predict = get_model( + batch_size=20) + t = get_transpiler(trainer_id, + fluid.default_main_program(), self._ps_endpoints, + self._trainers) + + trainer_prog = t.get_trainer_program() + + exe = fluid.Executor(place) + exe.run(fluid.default_startup_program()) + + feed_var_list = [ + var for var in trainer_prog.global_block().vars.itervalues() + if var.is_data + ] + + feeder = fluid.DataFeeder(feed_var_list, place) + for pass_id in xrange(10): + for batch_id, data in enumerate(train_reader()): + exe.run(trainer_prog, feed=feeder.feed(data)) + + if (batch_id + 1) % 10 == 0: + acc_set = [] + avg_loss_set = [] + for test_data in test_reader(): + acc_np, avg_loss_np = exe.run( + program=test_program, + feed=feeder.feed(test_data), + fetch_list=[batch_acc, avg_cost]) + acc_set.append(float(acc_np)) + avg_loss_set.append(float(avg_loss_np)) + # get test acc and loss + acc_val = np.array(acc_set).mean() + avg_loss_val = np.array(avg_loss_set).mean() + if float(acc_val + ) > 0.2: # Smaller value to increase CI speed + return + else: + print( + 'PassID {0:1}, BatchID {1:04}, Test Loss {2:2.2}, Acc {3:2.2}'. + format(pass_id, batch_id + 1, + float(avg_loss_val), float(acc_val))) + if math.isnan(float(avg_loss_val)): + assert ("got Nan loss, training failed.") + + +if __name__ == "__main__": + unittest.main() -- GitLab From bd2ea0e1f84bb6522a66d44a072598153634cade Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Tue, 5 Jun 2018 15:48:25 +0800 Subject: [PATCH 180/913] add host_memory_profiling_cn.md --- .../optimization/host_memory_profiling_cn.md | 89 ++++++++++++++++++ .../optimization/memory_cpu_allocator.jpg | Bin 0 -> 77570 bytes .../optimization/memory_cpu_allocator.pdf | Bin 0 -> 26831 bytes .../optimization/memory_leak_protobuf.pdf | Bin 0 -> 40244 bytes .../optimization/memory_program_desc.png | Bin 0 -> 30768 bytes .../optimization/memory_protobuf_arena.png | Bin 0 -> 32597 bytes 6 files changed, 89 insertions(+) create mode 100644 doc/fluid/howto/optimization/host_memory_profiling_cn.md create mode 100644 doc/fluid/howto/optimization/memory_cpu_allocator.jpg create mode 100644 doc/fluid/howto/optimization/memory_cpu_allocator.pdf create mode 100644 doc/fluid/howto/optimization/memory_leak_protobuf.pdf create mode 100644 doc/fluid/howto/optimization/memory_program_desc.png create mode 100644 doc/fluid/howto/optimization/memory_protobuf_arena.png diff --git a/doc/fluid/howto/optimization/host_memory_profiling_cn.md b/doc/fluid/howto/optimization/host_memory_profiling_cn.md new file mode 100644 index 00000000000..464368ec028 --- /dev/null +++ b/doc/fluid/howto/optimization/host_memory_profiling_cn.md @@ -0,0 +1,89 @@ +## 堆内存分析和优化 + +计算机程序都可能有内存泄露的风险。**内存泄露**一般是由于程序在堆(heap)上分配了内存而没有释放,随着程序的运行占用的内存越来越大,一方面会影响程序的稳定性,可能让运行速度越来越慢,或者造成oom,甚至会影响运行程序的机器的稳定性,造成宕机。 + + +目前有很多内存泄露分析工具,比较经典的有[valgrind](http://valgrind.org/docs/manual/quick-start.html#quick-start.intro), [gperftools](https://gperftools.github.io/gperftools/)。 + +因为Fluid是用Python驱动C++ core来运行,valgrind直接分析非常困难,需要自己编译debug版本的、带valgrind支持的专用版本,而且输出的信息中大部分是Python自己的符号和调用信息,分析起来很困难,所以不建议使用。 + +本教程主要介绍[gperftools](https://gperftools.github.io/gperftools/)的使用。 + +gperftool主要支持以下四个功能: + +- thread-caching malloc +- heap-checking using tcmalloc +- heap-profiling using tcmalloc +- CPU profiler + +Paddle也提供了基于gperftool的[CPU性能分析教程](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/fluid/howto/optimization/cpu_profiling_cn.md)。 + +对于堆内存的分析,主要用到thread-caching malloc和heap-profiling using tcmalloc。 + +## 使用流程 +#### 环境 +本教程基于paddle提供的Docker开发环境paddlepaddle/paddle:latest-dev,基于Ubuntu 16.04.4 LTS环境。 + +#### 使用流程 + +- 安装google-perftools + +``` +apt-get install libunwind-dev +apt-get install google-perftools +``` + +- 安装pprof + +``` +go get -u github.com/google/pprof +``` + +- 设置运行环境 + +``` +export PPROF_PATH=/root/gopath/bin/pprof +export PPROF_BINARY_PATH=/root/gopath/bin/pprof +export LD_PRELOAD=/usr/lib/libtcmalloc.so.4 +``` + +- 使用heap profile来运行python程序。本质上是周期性的对堆的分配情况做一次快照。 + +``` +# HEAPPROFILE 设置生成的堆分析文件的目录和文件前缀 +# HEAP_PROFILE_ALLOCATION_INTERVAL 设置每分配多少存储dump一次dump,默认1GB +env HEAPPROFILE="./perf_log/test.log" HEAP_PROFILE_ALLOCATION_INTERVAL=209715200 python trainer.py +``` + +随着程序的运行,会在perf_log这个文件夹下生成很多文件,如下: + +``` +-rw-r--r-- 1 root root 1.0M Jun 1 15:00 test.log.0001.heap +-rw-r--r-- 1 root root 1.0M Jun 1 15:00 test.log.0002.heap +-rw-r--r-- 1 root root 1.0M Jun 1 15:00 test.log.0003.heap +-rw-r--r-- 1 root root 1.0M Jun 1 15:00 test.log.0004.heap +-rw-r--r-- 1 root root 1.0M Jun 1 15:00 test.log.0005.heap +-rw-r--r-- 1 root root 1.0M Jun 1 15:00 test.log.0006.heap +``` + +- 使用pprof对heap文件进行分析。分析有两种模式: + - 完整模式。会对当前heap做一个分析,显示目前分配内存一些调用路径。 + + ``` + pprof --pdf python test.log.0012.heap + ``` + 上述命令会生成一个profile00x.pdf的文件,可以直接打开,例如:[allocator](./memory_cpu_allocator.pdf)。从下图可以看出,在CPU版本fluid的运行过程中,分配存储最多的模块式CPUAllocator. 而别的模块相对而言分配内存较少,所以被忽略了,这对于分配内存泄露是很不方便的,因为泄露是一个缓慢的过程,在这种图中是无法看到的。 + + ![result](memory_cpu_allocator.jpg) + + - Diff模式。可以对两个时刻的heap做diff,把一些内存分配没有发生变化的模块去掉,而把增量部分显示出来。 + ``` + pprof --pdf --base test.log.0010.heap python test.log.1045.heap + ``` + 生成的结果为:[`memory_leak_protobuf`](./memory_leak_protobuf.pdf) + + 从图中可以看出:ProgramDesc这个结构,在两个版本之间增长了200MB+,所以这里有很大的内存泄露的可能性,最终结果也确实证明是这里造成了泄露。 + + ![result](memory_program_desc.png) + ![result](memory_protobuf_arena.png) + diff --git a/doc/fluid/howto/optimization/memory_cpu_allocator.jpg b/doc/fluid/howto/optimization/memory_cpu_allocator.jpg new file mode 100644 index 0000000000000000000000000000000000000000..29658b596b8ee77dcfd85faa0479ebdd063a183b GIT binary patch literal 77570 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⁡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

=~Sx7i67%0`{sQ#2Ny=_GIQ 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 j#_B&|1pN6Y{Od;Dzv46bes*(ceW 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 literal 0 HcmV?d00001 diff --git a/doc/fluid/howto/optimization/memory_leak_protobuf.pdf b/doc/fluid/howto/optimization/memory_leak_protobuf.pdf new file mode 100644 index 0000000000000000000000000000000000000000..40a8090ba22108666a9076aa72d9f6af90a4d484 GIT binary patch literal 40244 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