From 1be51db20fbcfcdee01b82108d6a088f5486766c Mon Sep 17 00:00:00 2001 From: yangxudong Date: Thu, 20 Jul 2023 09:27:42 +0800 Subject: [PATCH] [feature]: Add component-based develop Backbone Network for EasyRec (#388) * [feat] add component-based development for easy_rec --- README.md | 7 +- docs/images/component/backbone.jpg | Bin 0 -> 745103 bytes docs/source/component/backbone.md | 1396 +++++++++++++++++ docs/source/component/component.md | 108 ++ docs/source/index.rst | 8 +- docs/source/models/dbmtl.md | 96 ++ docs/source/models/dcn.md | 94 +- docs/source/models/deepfm.md | 121 +- docs/source/models/dlrm.md | 109 +- docs/source/models/fibinet.md | 105 ++ docs/source/models/masknet.md | 87 + docs/source/models/mmoe.md | 104 +- docs/source/models/multi_cls.md | 83 + docs/source/models/multi_tower.md | 146 +- docs/source/models/rank.rst | 4 +- docs/source/models/recall.rst | 2 +- docs/source/models/regression.md | 92 ++ docs/source/models/simple_multi_task.md | 67 + docs/source/models/user_define.md | 3 + docs/source/models/wide_and_deep.md | 97 +- docs/source/quick_start/local_tutorial.md | 3 +- easy_rec/python/builders/loss_builder.py | 14 +- .../feature_column/feature_column_v2.py | 10 + easy_rec/python/layers/backbone.py | 369 +++++ easy_rec/python/layers/cmbf.py | 3 +- easy_rec/python/layers/common_layers.py | 83 + easy_rec/python/layers/input_layer.py | 199 ++- easy_rec/python/layers/keras/__init__.py | 16 + easy_rec/python/layers/keras/blocks.py | 164 ++ easy_rec/python/layers/keras/bst.py | 97 ++ easy_rec/python/layers/keras/din.py | 73 + easy_rec/python/layers/keras/fibinet.py | 245 +++ easy_rec/python/layers/keras/interaction.py | 312 ++++ easy_rec/python/layers/keras/mask_net.py | 138 ++ easy_rec/python/layers/keras/multi_task.py | 50 + .../layers/keras/numerical_embedding.py | 198 +++ .../python/layers/sequence_feature_layer.py | 1 + easy_rec/python/layers/uniter.py | 3 +- easy_rec/python/layers/utils.py | 81 + easy_rec/python/loss/jrc_loss.py | 72 +- .../model/collaborative_metric_learning.py | 86 +- easy_rec/python/model/dbmtl.py | 33 +- easy_rec/python/model/easy_rec_model.py | 33 + easy_rec/python/model/esmm.py | 8 +- easy_rec/python/model/mind.py | 2 +- easy_rec/python/model/mmoe.py | 5 +- easy_rec/python/model/multi_task_model.py | 126 +- easy_rec/python/model/ple.py | 5 +- easy_rec/python/model/rank_model.py | 47 +- easy_rec/python/model/simple_multi_task.py | 5 +- easy_rec/python/protos/backbone.proto | 96 ++ easy_rec/python/protos/cmbf.proto | 43 +- easy_rec/python/protos/dbmtl.proto | 3 +- easy_rec/python/protos/dnn.proto | 17 + easy_rec/python/protos/easy_rec_model.proto | 21 +- easy_rec/python/protos/fm.proto | 1 + easy_rec/python/protos/keras_layer.proto | 27 + easy_rec/python/protos/layer.proto | 121 +- easy_rec/python/protos/loss.proto | 2 + easy_rec/python/protos/seq_encoder.proto | 37 + easy_rec/python/protos/uniter.proto | 26 +- easy_rec/python/test/train_eval_test.py | 64 +- easy_rec/python/test/util_test.py | 23 + easy_rec/python/train_eval.py | 4 + easy_rec/python/utils/dag.py | 192 +++ easy_rec/python/utils/load_class.py | 27 + easy_rec/version.py | 2 +- .../configs/dcn_backbone_on_movielens.config | 203 +++ .../configs/deepfm_backbone_on_criteo.config | 643 ++++++++ ...pfm_backbone_on_criteo_with_autodis.config | 759 +++++++++ ...fm_backbone_on_criteo_with_periodic.config | 757 +++++++++ .../deepfm_backbone_on_movielens.config | 246 +++ .../configs/dlrm_backbone_on_criteo.config | 578 +++++++ examples/configs/dlrm_on_criteo.config | 534 +++++++ .../dlrm_on_criteo_with_autodis.config | 587 +++++++ .../dlrm_on_criteo_with_periodic.config | 595 +++++++ .../configs/dlrm_standard_on_criteo.config | 568 +++++++ examples/configs/fibinet_on_movielens.config | 204 +++ examples/configs/masknet_on_movielens.config | 200 +++ examples/configs/mlp_on_movielens.config | 239 +++ .../configs/multi_tower_on_movielens.config | 221 +++ ...wide_and_deep_backbone_on_movielens.config | 219 +++ examples/data/criteo/process_criteo_kaggle.py | 5 +- examples/rank_model/readme.md | 4 +- examples/readme.md | 48 +- .../dbmtl_backbone_on_taobao.config | 316 ++++ .../dcn_backbone_on_taobao.config | 291 ++++ .../deepfm_on_criteo_with_autodis.config | 786 ++++++++++ .../deepfm_on_criteo_with_periodic.config | 785 +++++++++ .../dlrm_backbone_on_taobao.config | 299 ++++ samples/model_config/fibinet_on_taobao.config | 293 ++++ samples/model_config/masknet_on_taobao.config | 288 ++++ .../mmoe_backbone_on_taobao.config | 316 ++++ .../multi_tower_backbone_on_taobao.config | 348 ++++ ...imple_multi_task_backbone_on_taobao.config | 291 ++++ .../wide_and_deep_backbone_on_avazau.config | 391 +++++ 96 files changed, 16661 insertions(+), 269 deletions(-) create mode 100644 docs/images/component/backbone.jpg create mode 100644 docs/source/component/backbone.md create mode 100644 docs/source/component/component.md create mode 100644 docs/source/models/fibinet.md create mode 100644 docs/source/models/masknet.md create mode 100644 easy_rec/python/layers/backbone.py create mode 100644 easy_rec/python/layers/keras/__init__.py create mode 100644 easy_rec/python/layers/keras/blocks.py create mode 100644 easy_rec/python/layers/keras/bst.py create mode 100644 easy_rec/python/layers/keras/din.py create mode 100644 easy_rec/python/layers/keras/fibinet.py create mode 100644 easy_rec/python/layers/keras/interaction.py create mode 100644 easy_rec/python/layers/keras/mask_net.py create mode 100644 easy_rec/python/layers/keras/multi_task.py create mode 100644 easy_rec/python/layers/keras/numerical_embedding.py create mode 100644 easy_rec/python/protos/backbone.proto create mode 100644 easy_rec/python/protos/keras_layer.proto create mode 100644 easy_rec/python/protos/seq_encoder.proto create mode 100644 easy_rec/python/utils/dag.py create mode 100644 examples/configs/dcn_backbone_on_movielens.config create mode 100644 examples/configs/deepfm_backbone_on_criteo.config create mode 100644 examples/configs/deepfm_backbone_on_criteo_with_autodis.config create mode 100644 examples/configs/deepfm_backbone_on_criteo_with_periodic.config create mode 100644 examples/configs/deepfm_backbone_on_movielens.config create mode 100644 examples/configs/dlrm_backbone_on_criteo.config create mode 100644 examples/configs/dlrm_on_criteo.config create mode 100644 examples/configs/dlrm_on_criteo_with_autodis.config create mode 100644 examples/configs/dlrm_on_criteo_with_periodic.config create mode 100644 examples/configs/dlrm_standard_on_criteo.config create mode 100644 examples/configs/fibinet_on_movielens.config create mode 100644 examples/configs/masknet_on_movielens.config create mode 100644 examples/configs/mlp_on_movielens.config create mode 100644 examples/configs/multi_tower_on_movielens.config create mode 100644 examples/configs/wide_and_deep_backbone_on_movielens.config create mode 100644 samples/model_config/dbmtl_backbone_on_taobao.config create mode 100644 samples/model_config/dcn_backbone_on_taobao.config create mode 100755 samples/model_config/deepfm_on_criteo_with_autodis.config create mode 100755 samples/model_config/deepfm_on_criteo_with_periodic.config create mode 100644 samples/model_config/dlrm_backbone_on_taobao.config create mode 100644 samples/model_config/fibinet_on_taobao.config create mode 100644 samples/model_config/masknet_on_taobao.config create mode 100644 samples/model_config/mmoe_backbone_on_taobao.config create mode 100644 samples/model_config/multi_tower_backbone_on_taobao.config create mode 100644 samples/model_config/simple_multi_task_backbone_on_taobao.config create mode 100755 samples/model_config/wide_and_deep_backbone_on_avazau.config diff --git a/README.md b/README.md index 1368c15b2..ad9963adb 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ Running Platform: ### Simple to config - Flexible feature config and simple model config +- [Build models by combining some components](docs/source/component/backbone.md) - Efficient and robust feature generation\[used in taobao\] - Nice web interface in development @@ -60,14 +61,16 @@ Running Platform: ### A variety of models - [DSSM](docs/source/models/dssm.md) / [MIND](docs/source/models/mind.md) / [DropoutNet](docs/source/models/dropoutnet.md) / [CoMetricLearningI2I](docs/source/models/co_metric_learning_i2i.md) -- [W&D](docs/source/models/wide_and_deep.md) / [DeepFM](docs/source/models/deepfm.md) / [MultiTower](docs/source/models/multi_tower.md) / [DCN](docs/source/models/dcn.md) / [DIN](docs/source/models/din.md) / [BST](docs/source/models/bst.md) +- [W&D](docs/source/models/wide_and_deep.md) / [DeepFM](docs/source/models/deepfm.md) / [MultiTower](docs/source/models/multi_tower.md) / [DCN](docs/source/models/dcn.md) / [FiBiNet](docs/source/models/fibinet.md) / [MaskNet](docs/source/models/masknet.md) +- [DIN](docs/source/models/din.md) / [BST](docs/source/models/bst.md) - [MMoE](docs/source/models/mmoe.md) / [ESMM](docs/source/models/esmm.md) / [DBMTL](docs/source/models/dbmtl.md) / [PLE](docs/source/models/ple.md) - [CMBF](docs/source/models/cmbf.md) / [UNITER](docs/source/models/uniter.md) - More models in development ### Easy to customize -- Easy to implement [customized models](docs/source/models/user_define.md) +- Support [component-based development](docs/source/component/backbone.md) +- Easy to implement [customized models](docs/source/models/user_define.md) and [components](docs/source/component/backbone.md#id12) - Not need to care about data pipelines ### Fast vector retrieve diff --git a/docs/images/component/backbone.jpg b/docs/images/component/backbone.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7dd5e0ecb06d8496fd83e54432f50ef87b143484 GIT binary patch literal 745103 zcmb@ucU)81`l!El5)yims6j##lmr`1NPuX70YVfA0Tnw43PFej5CmHQMTbG8Dnm02 zgn$ksjvy$*2o{P8V!(#rpfnLF(iBC#YsWL5`}_WNfA@1U2eaJnY_gJPt@XU`yY~6^ z>{~BTXFIz(0|Wse75)dly#kR=hj{w{aB~AD004P_LzVzJ*n+2kb%^$lwlhKjSlMw5 z0H=5W_n&jz;WPSxSChTw`!hy_`S%P(cM1P5&&!-JZ=~r8HTp&VVf8Z-ym#vqV2%% z?Kfz9&-eDc>>O{dBLFzqD|ux|ntpzPKic2>0$&M#@lU*nun@l(*+5o?w zHvHS>hq$BPx9pnxc+Rf>wt11R-v74uMmTx>+YUd#{qei@g*)2+d)zM^w*GUSgZnrA zI3Bdu^~d#NgS@x=drlN@Gddzx z0v`R(b%J=VKVBOdy-^6me7%?O_#?=4{OPfq`yzn8!1M}Na29e(_- zun^hUkX>_ch|7=T5m8=0UK<(i{o{C8Bbvs&SFhAJH#N5a03EC7IRH#?Wn&Oo^!I;{9Vmtf&%&{i z_TOWBG6ASg1c21_-(yAv0H~b+;My(!gW*x%uZKgQYPE8>d;B7Ec^as)|0enHZa z9HbB_L#`m#kp`p%d4xPiULnKCB=QM^#VBKl7#+-V%o+?0V~^Q@@y6`L1Y!i3Sj-7b z3ML!#8|HV+HB1BMKISo|7c+vH!2+xjb`jP9y9!IgI$}Mr+pznv;n-u?B9d-_f$7$m9ajS5)I2LXb&L1bh9m6H#a&V=%Yq&eO4%{o;1n#SxiX2&P zg`AC?tDKKqpj@E%~G2R-_!f(X~;}7GL@%i}6_?*>Kpdl8{LFmGC>^CP7LVAbgZplGl?rmv@%mCeN3Tmp>H8}l&w^u)U5PMX-;{8vWc>z@($&L$|=ec<$C4k%2O&TD$7-vD%(^d zRZ>*SRBo%hRQaf?sk&O#RW(5MxN5HIHC3tVn3{sxGBta(U23sv=hUvMJyd(AuAshL z-BI07{g`^L`gQfE>N6Ue8fF?E8lf7=8W%NMG~O&AELgt4X+gk(6AOwK++NV9iPbdJ zbky|MOwcUWysJ4t#1oB)uEb#CFT`?U8*yUcf`yg~H!nQ2Fn3|y!rn#LMavhtE(%$6 zcF~`Uo-F#bSZA^Q;=PN1Ui`;m>EaJ0Z4#5Tmy|@hOnOZEq@}Orq_tlwO{-d~X9;eJ z$r8^c(Mt-J++Ffco2YH8?XR7r{ik*p8ACQ9bIFIvMdSzM869067o9MjUv+NlywhEz z%hV0l&D8x{cUVtTZ=D`bFH`TP-dp{J`u6%E`q}z-^d}6+1}uYv289M~2A`K2FWs~> ze(B|DMGT{7xgrm&2*ENI#JWlhUIEH_@hW%;S))yv-) zlZ;)BV~sBvcT-d->nQ@tZkF7CUvu#bG9Fk4{8 zHj6jAVK!-QV(xFAYu;(0V&QCY+@i+fz2yqay_N-*&(>wm)jKy2N$$7$Mt;=DTdX^k(11pX7)K$mT-?hwjf^E${ z%D%Hfd4t!6oDHuxnrsZ;c*70j#&*ka>vmt}&Udf&03NO$86G_xV~&7R>xuW|c;mKRat8Ta2Zol1EedT<&_+Ip# z_w(@k&2MIp>z=$l6aJ3==lw?lm;spq!+RNf)AtVTW9&=c_a=}Lm=QP}v_9xu&^w+Z zFNgO&m=$~>_``mW{gVCPLbill4wVn}4ZY4^z~9fmb3pgNp#zV?R)i&n^$KhRS%Qi1 z4dEpbNW{*Fnn)s)q6Y^l2TvY+6}2uZH|k^b=IE=3G!F3(J%}-h`8j4N);U&u74XH;qq^pHA44aN~r|3E_#p zlP)JOC8{QdCq6x8d+Nez+-ctFwx2D2{`KdtNdZaselh*!+%NOV{>k^wn4QT!^DSjx zO50hhvjwU6RDSA{wDoDF=^E*=>3tb)8P_uPGm|o>vvy~-oU=T4;k@GcgXep*H)hxT zYV>RBuk$%UIgfK4axdqR^M20zkROmQEnpV>aY5(8FBd+Ec%o;8E``^ATmIX*B79L) z(O~iB;wCXoTvoEA2!627Fjlv{eI%(|@XBKhLkOPEUsFAe{`RQQP27l$&Ev!5Hx8mO?{{D6|_U24|SpB<(z=pnCyKlX??Q^^Hj^~}WyBqE{ zH##@oZnAH>+01DEtHq|}`aRmc>ibsruRU1%psICkYgL<7+qH+*4{O@#?Kd9TJ^EX^ zUfR&{Q%7T`Yv=vP?vEcm+4SVu(;ZKHp9MU7^E~AF`>v?2&o6}Ca@|Qi>OJRPl3)Jz z5A~nRy;i+-uYP*<;I-H57k&PHBmEKm^8+UaRR+%u=?#^=F@N*du=8;H+wE@$M#4ru zze^m|7|k1_j8%>^#~)1iObomafB$VVc}isN`!E0-TLJhr2Y}`9`f57>;Hbglwg6*c@#9DK z5*VMz93B13QdIyfWp4E1>sR4_{`tq#cYlX}{r7$U&u7>h3kys1{QuAMw|bx=y=y!{P{NzYt6`{K0DA^<5wS6qMBee?PwUz@T0H ztqUk)5eO4j1FQ#MWDn6WZmLuQKJ%;{V3s~gbg;HoAV&X1hb6eDLZ?RVqaQ! z9peo$G?w+22S^X?J$n~5lV`=WWvsUpzs!3_dR1rqh>Va0aZlHdX2LOg}W@ zR=-ky#G@xqwGy=Eo@NNRepiwY7UAZv4>P@{McA>jrftlN%#}9WxOjmJ$6J|$-MV<) zmoj6-YPU3fVcbkf%3{MhK-!V0)bTP=dqN=1n8u$M zG-GoB)BK(XKeI1Aj4tsnWtiAeL+g)r0k3Mq6enuPY;(y%hx(LCqSjF9FjKWlp_#Pw zJjvFBP3#YCB9f77!X?M{sdNxuzwr6o;X0c4C@%HmFjJ{weOs(Fqj^PJ5UxMfM!GO$ z%r33H9dp^i%~I#D6kbCcPt~s8BN(jfCEOHi8D~hdI<1YuZM?ScH#G{Q06X0n$q~`v zC05g;IbPR~-UZh2fV?l;o8R)5`k*L0Yh=UZg{;Hv7}I|e8HW{PHtkVTNd4b{iUA-;>F~nLnvP|HUmIQE z2d=Dikhl;xaCYhWAphDj9SY)X-#1w@v0Y%7L?f)~jFes=5#Vt*tb4_unp3p-x=t?$Tj4F-2`@j<+qoi7lYj@0td}P&=}e z&v4Ny4*lIxw{y%V^0iPSo=&h!;zozraGFW+9`2b7cYdCd3IXe3`C6utX4`r;H@CuP z(uUi6ve9NnB;VXmx9dE4)>E2;`SLEHeEH)&Y94G570d5mLNfH%abf#`0+$EW?L6Px z@f4&#zo^cvLQq>e%t9|l9W?b>0<=+RiD2=wgbwZ4TZdrE}7uVqGOT(PwbI_*TE^u7YV*h^_G(6|h3(BW)PQTCSr~8Meo4 z5~RW<;qC;>Q+yY4(ncAz4y8UCPlUSL8Gll(;=}RsC7CF;9$snHWDb(7BN1E9KhQ3r zHi6KRj2CnfVNqAp%M9P+c{9cJ%|{|7m~fU(5HL>NlGk3RV0m)8?OCHp%fhxGL^RqT zvEc(?e4)^$5JuTf$8Z-zF<9=}KV1w_ExdLWsDkP)Wrm9F1a<~Fv-SC;J)Bat;#e%oAR%MN5dOvsawuESo*U#t> z1Ke0|q-cS~i2bI2ZZfEf{09H#VWzxjfx?iU*fPa2qt!KjF=^z?VN>FHv9&E~n2fDvzH))^@_8r2y-Q(58HKs zV!nOA&U2tlzd*h)Iuf5I>jf8lCd%bbz z5j(2wMAM}c;%ekW5aQmQLMMu^zF3;QNeN@q z&Iv3i5(C>HV}0MG9loOsiVWH?d>7!&Wm|9b`X$tV+|Bq}gfrf;PYhPqe*^Rpwuk;@ zx=1sfIl|g>wPw=Ak*Nr|ZI7CyO9=F06xCAjS*ZIpGoZkOy@k`A);#PM`g?s^y$DRi z4CX^tgI;u8F+X!}OZl36$2N^KJ&&Ag)yY&yM?UfdHG z9~QJ3fpcb@3|hM^!;B}X>c@5nJhSHF7(vKL)!`Y@3IB|F%M(EG?4S%)IAv<-!4KSY zRVT+=^PFAM&cc+j;z*I47UAr@T$EHwFS*)NTCfSh%?>ja@`OP2!T3G#M2hhJhACYN z^1?-$=8%@elrigCb!<)#&UbkGV?|;Lmu8p5q2B33;BtUePDHrY%#in`UAv-u z*z3AqM-p(B?9rgDpFl;!RqQ@Vy0b;nW@-ayDpnajTW!!F%p(->qOzofI zE@HT_gOom8Nw3V^beh4SAkT+uQ-gfZBp=kFp1{QDnTkWj399lULV8rnbYnx~SdrKO zy_h7s!8ZuVpiM?qpqym)DY6)n0SkJE{duf zss$$Y={D_%(4*Ay0pC}35h=9!{+VE^>c;niBJ$G*N$OM^?7$Nhp#AkzZW1~3=I zz&DSBk>etM(zLXQ@vi*Ng;-+9eY{}~@I!KGgPEe{u^?y#UM-6CpV~2+$%%s*N~sO8 zhucwXFNiF`@7BG2VtuW>aKb>b<$Zjs#s<6=8d<7yog7XzMXBW}7W%qu12Iqwie)O0 zBg2;A?%XY4;!UFpGCQVB`PmZa1vwregF^E5{d%!(abF{zWMB>6OY;<3^bd+af&H!s zhiRk#Sb_8uU4&1lPHSD$4L(eZ`X1nB#RpYd$SH7XhGLKkNlol}pg>lPdYONfNw`P2 zQrs&fXi0SLk5Q9R7htNGSO?4y2el`fF8j&EKsr|6K(hp5l-iP$_wges(--U4NHbAX znTqVRmJzp|m;Na?z5GC7#9beoa=RQ*<(rH@@+^|iJ~@viM-Oi_QMj+`1V~66|F=AI zHNC9m?M=~K8*Z5DcBnxFxoXX32~+_pTclsmLoJ4^G8GSJd`yBiPy($0kxLvasskn` z4T-)1i=ik+UH->#m@RVw5QbvQv?@^Lxi(@xlvq76I2#OhHkI~Sn!4x@rER#cn)e?U z0GhRNQXy0Uxh==$r;Dkza%bVPvsB13&O4SVrK@_ZT`s@F|MIr)sDjr`rNgcTx!3Wz zRXzzF(o~^`;UE#r%0FxJlxAjBMweJg8&2W4>I%52B(PaVE&WQvTbEd6-wI0^sv=y= zfz0fTX2CBq-9v{ zjEN_;WBMXMkCT>hN@X`H1z(=mk1&;=*Cae$xLljmw9OQSR&G5Ttb3bxuvoDeb6ZS- zT7aqmSc^iNDs0V*@OXYs*~Riva$gmY!@ESd8*8bwQVo3cwgtTkw{1sGHv2-S_Pa^Y zp{{50qRB$K2!~x+JUi@8H^$~fK`SV_b*`JxBa*WXr}cBsJq$_m^M*QYZ(k4#ks1}{ z#l=$v36;}@D75zV+Chk9(6`6TeO1-jI?ICRtt2fqcwQ}beyE&k7ys9w(A^bVZm_wn zuSG`%m`odW*uQ8V%p(t`qNG9@2Zuj-rpGX--=$!!%mswlhM}Bjh-%RR_vd2U^W7Zm zAyf)ZI=?IUE$^N+byww0>fDw(V5suZ|7nFJYqNgEU`7;Pp`p-6?h_oxGG-^eQ#`gY z?dJq{owp3)W<-QP9*;kX*GTc0kg6k1e&0!jGiJcC%5G3!?PXR4-Sb4p?Yj5MQ7@FWS2kw+<%mU zJd;^LA**+iDt4?0iIiw2%fZC}-_g*zysuM`8Ky=wi;bhPV&%Bg zM$^MG7oY%K@}~}OxRUoxi@#<1F~JMzw(DGowQlt$EqVmWHA#AR?ezP$)Bj5_N_C zBe$}yol~YQ73#Wn*>-3Xv~Q$j%Cw-sUoK9B$e2Y<%*kdV#$*O z#Xr>xuE!qkP`m^O@bPc$UuF;dttOCWMx=TyPdyo;Th8)|z&NV_Tcy;fNye}On3t5V zu5U6fEfn?{E(-!Hn@D|@e7#6Tcd@IMq1eE)X0b@FODC?;jJ-H7O0qzZCe0?MHNjvn zoLs=WgP+SSExO;P@RnK&zg)N^lT>s|_<1%TsLH)y;5czgEd@u@yFK<1j(NH1J)ded97)-oTaNhMTk>W(jIn zwZND}Tl;Ev%Nmui5>GqzH;}glazZuCpnv|xrtgVRd2cusX%yTwaED<`uPbSUiR`&` zHe1c!bs!KoL+t&fMi&lz#p3?t*O|f{$O|#+xgqf03w)ms3bng+U&mkcS#r29%>RXW zt>;gy{;L|y_gXDTJyh-&xji3wP2K9 zYfo=vjl0(y*+v!HUU|s2TBKji&jh+7FEdTCj5iG+<4N4v8^=w6^Cnt-KQ~nEtf!la z0yG(q`nl~jtzdb>?So&a<{o|a@;U7dZuY_}P1`&&YmT$Im-6d<%K?H_XMF=B++G>QFllnQ-NQ&X6R10+$L8$! zk2;)^DbfD3J58E;`TfG-jvQdb@gYYRAt~GQxCuhmeAxg*ScLyGKH79xn!|h*H*mb1 z-bpqag{yM6EeG>qu2vc!yM`vYEZG=UdSwdZ@_>T$VF!)NErQcBU@*~k$ltNF`5{S! zGZbjS)mJE2tpQNY5KB#Q z{V;E`2THOZtEE3FRasZg>EwDda?;L=4;1>_G4I^VJH5_&Rkk1MVU(VJGZbCAh? zK52zCBdGCfpO`K*vOd?0pC~Hk=d% zffkchp2PUiqH<3*bDy%aM{sI2`E0o%QXBo@csW>pXT9w)V(xc{&EoN~NshJTX_1_a zXU5YyZ6)>X)$ASW3XCA23?9aQr#Sg&$DH?Gd#E;0za9HJJuAX`ju?Fq6YhqW^!}put1hkrmL-CMp5f1b zhgQ}XULUjZV(myIq%jr$IilMqmQie=_>8eFwPX;NyaYro)*tOZEM0)id2HJmm*U~+ zh%`F0+ricpv&NwAb#I9I>~wP%wnI_a8m3aEEjD>i<{H|lyHTH^*pzArLC=Qyk&e?U zQ`Vj?D9~O}XP(<>Fx5Ery3^PKq^Zi#SRcMsDml^6C|U$WBqNwwF;%u78D;@nkAp=6 ztM#P9h1G;&DH0-#H=ur{^}$`4GKdxW6QrqqQQOmPI2bGIz?$Ko zl9aG1nG3%zt+R<>t0IPzB3!-yxgp{p$9+)8#w#h=SKxM#06D|5$fkCeXNqpNzDzAO z4jbj742$p>h_jfaXU5=V&&5G&yZ%r)2(c>Dg0r!Fw=)!%KZ*?P_T=3>JOBf1u&O4- ziKbG2VH>kZAI{oKr<%$E>0Un<3mJCEOJtPQLyCo%yC?Nbb>n3;QyUhC!SPC3=-Q%n zmnvg8?N4V=dJi;QZ3WgfjJtB)6_y_wdz-4+`++;FpMx32jgd!-6rDZb=)53aPMp6J zPQh?Y4-s2`etaXz4W+r`*%VB|U^_=G|2c0M*03v6POFW+D?Up`Fz6}L{+yEex)5r4 zutL2yFE3q>Z5z`%;+QJ+#?c$S6KtKS1Z-4n$1j5BPwlt> zyziZWSxJcFRP`%%J-_G6KO^?Z>K2_GY*c(ia@xy$AuDQ>742V;8M4xz-$MZqXNoWW z@S}LdxE!k&`PCaFUlhc_Kt)gYw;b;U3Zv2sag)`89N?CaIP!@baG^0?y@Fxp(M5`P z7Q7V7@f|u8$PLQ8z{H0vLX;k8ZtIB-4si z=%X>j;uXF#!N9Z4-Y&=VI^lrf%N&_w*!ucsbaF5ZDi*>eP%%pSU-D-NW3U-`103EeoJpsgbZOoq4$yx zb7WdUF-*M^kTTtlbR8}SE5IGyzcW|(r&L~`hJDQx%d`Su@cL=rz!ULzh~b{J526AV zg97wV8qHWfX?*uVhw5&<_d4{Q-LF@4NGt(MR6!ed#*(XPGRN?`2N7nf?8S}wb%-tF zZe#C#1KT1>Y5rZ=s9K2R#;2mixanO2kKOLsqn`eQxU<dFR&_Frf;R_=ah08PPJc5E4*x{sEksLv*i75U>5i#;FH_k%W zC(L|(tYXk6W1~Rg1Zo-XA!$Mi#vBPF@H1cbejvUUnubiVKX#K~DnZ#q9484yDK7R^ zXdx$Y?|h+vTWJ|B3-zH{{34T#+D+M-Eh4#R`7n>BE8!KMr7@_5&JihFL?Y}!bGPXh z@p742L;x25OQ|sk6@k(tW+PpxXP!kgb{#NEfJwIj8gz3x2z2R$LQeRig5MIc$;nwFaFy(z{HW$= zJN3I|oOJHpC0s1C49YG+SDtI53)`3L0#P@EmLXBs9_0Ua7Dc*bRQu0E(C$U?j5h>3 z?Ac&vcYA0-T)MI|Yn+KNOMo$!X0B+ zIi5W#7Kjk$-Rmeaj5S*bVuQwa)kcvbTnHb!)6c|31RctXd8gRO!Avs7Wq_$5Y+BVu zeIUwzU=t}>NUDFG^HvpthEJvW#_S$(Ii6c*z;S=oB}O4;Dx*BJP1o&-?Jz?ngBno) zW86@#Ih>C*YLa0Lv(wr6&|Uhm5BH@)b+BDPP72eGTUQz9Y!Bycr=hdkfLT^^F$(cX z=onsc5Mv=5o;=w3@!?BmSI3L;+csg1m*x#G8D^vdE;jq&hj&# zfV{M37>Foz(_c6flM7g)E9==CsdK0MIXIE;1T|Ol(m`S_inHX(5J3zGWnH|RtDRrP z*HIKL^1|!nR>%-WYMrg&SikG|>g+C5GCJr+x-c6@(5O{C^nxu9-m@g2pz>Ek2}YS$N$SQCTt%qPC*1_wZ#IrYjPif|Z@ZTNM=^QDNEcON#*wQ?Q9$+FZ4#-!`91N=T1 zfe=)lP8YYVKZ7&yjoovh(hQf}R|gckPnIlD!gfcCO|1J5>QGRxpdezD<^nI;L;mz@ zf>Kuw(Hde4j*aJrI?KGmKq<9;lFHiL@U{~a<;BNX`h}~$bg8qHNk$YJ?1^wPn#B)w zN_}a~E!*~k`U6@bwQrBUe58L}ovFG7H&fiZn!&5JN3%1W>mk!CoR4wV+Z@|)*vqs$ zJ_hDtaDVhZ>-Wmkz4S6;&xB6|D~v#Zd8B5qO%Z|xNX1Y*rM@>XfvNB`KFrPJ zeOh~mV*kLY)-LgS%4^}0m`@*wxAoxV1&Yu1&?V%9e2Xrj;ohAuUuPw{`-IzY^J^0{ znup!%_o<}hzd?`}LJ#7vZ7y7%HbE{?(Ecdi9Hs?-HhDhE_U;4khusV#_zVWztIg_ls z?>tPrTvUud+>Sl|5~lmkBd6MeE@F zS*!l7co$1p!&=dmcHX!%$F(~h3x#t+LI~opqUp)oCOsRaginJ z<`M>#Jr8GxX|S-H_(2QiWN}j|nc3P`3tZU8Tu0hD7*o~TFzpPH&e8%Gc0@`h7VB1m zqO1l6uQ2@io6Q+PMrNbjfa)q>v7VxrFGJe%WQZp0f7BYeQV)>FHvs-SlU zPT{I>-d=Kh)u3u;-63O~v^UJ6p=4ppeYM;wz&OQCZrGSbb4)#z?-WZ3mewDM#S%C}>34Gcyoh{Gv^-2BS& zX^dwAND6USiDIUz5)7)4r?@F5ol+i$|5 z#=O-!zy74%6#}W`&-nW4;QjuFVbFmAIl7T2?+}sv`uv`;xf@9icyCxYW(ZeWH0V&p z(Q=H&pcPYiC@Nv_8$r_;FeVj9vxHGvy-7PVo{C_ya0X8NsY4%caOgWUpJWJYW=ckJ zXzt5l;A(rh)*N$wcy86`##`4E`r+#r)F$|+xpQJK$GZK};MZzUPllsGoPF?hTH^Kx zI%Rk8w+rNpuyF+{z<8HJgXN`07srh&GS2B)2g5<11b9Ou-CoK^V1RXJh2QDHJi+4{ zSRy}z^1WG$?$+r_scZRvWjrPJT&I)Mm}&#g>$e4$8kvz{IDzl& zxx4xn%kPQM2p83>$Ws)c1w@jvIUN?paabb7|6Q|^1Pm5;6yCV zX5P!27R#7!2V26ty7$2uShLNB>&tJ0>ESu!%l1t9dRyfQCmLkhI{aH&JR+m23LTPVit}bSzTFwDZCW52Hx&v%eO>UX(Jn)ES^2Lc=CJ$zz7l zdy~L^ z88dNADQ`UN<=)e9x*r;~U&c9Dlk1J@)x5hJYZ?+czVSQMOr^a3gUd71%L_WYHPW7B zerFm8z7xK;rd9d6@Ah=6*gG}W9~QV#DOrw+NFfTis(Ei(9xMibmy&B1Unn~;tYK$T zN)TcWdi^br|0T!?j~5k8KaqI|@N0WFS()9SdfO;kER&KPnTH7RKlS8IQt#sJ{pyD| zc3ITSO2(mw0L$c54_n@RY17EY7a3_SM4?JUZ4wCo&i8~1AC%56a8#{S#%rPF#@EC? zh*g?53>v5`)G#x3F2TqyfLou|s=rE_so!(`M#?nGG~5w_Dv3K@>+cCzD~!gtFv{2{ z(?VT|AvVchZsqT>Q8Fj_Nyao&Z7!~UlofSFJ5lg5vBBWVlw$OKp@ImJ(S61K;bvm- zW&Ipy&)O(BZ{V|3rr=0(c8=C%4ZHUl8z=Ga_Dn^=1@Fc6xQ8p;x>U7kFWNgY1$i?i zx-5T4BSA0IpDv24(fz%$P!@db{Kv|IsgTwlu3|vDH!CJ_ScAE79XG{5`TDwIudw3e zf_!RJp%%jl2Q>tiu~h{x(@>)0)n4+8#Mr`?5hk{D-;S@u$vfmdIro$>J!R#|XKous ziU3rSVgrRXi=>^u)DFI-%4>PSO7wq>Bn!0=(d7rE*>Sge_>I8y*eEVOrir~7c@`K? z4fog;pUpIWszbpzUU)ss90>E+=8oxml3Td|jrNt!J#?rH9KcRV`m3uf6rUNx^crA~ zsiZj3?cdf7TcJX73WUMIaL(^(lC#zU)2Q!8lB|k9WC`+7A-Sxjqhk7pyU&rHi(Zo{ z6hw02vS1@>Arkd+C<20}&3&-wZUynC`p6`N`l1F-cA4++zR!kV3e{01aYcbns|fQ6 z)KMWB8kPeZ3b)wZR1Hqf)>g0P8I-;EG2LlQa9@yPy%5BDvCH(Qo7kI-X#^q&*?HS8 zhf~A7pVZRp* zvlMVCgL&)rHpZ0RlQ{^8slRRgQitl@?)%ne=7B09*dKV< z`HSf?2N7bcPIp_ROb@p7MvS;Xy2Z<4aP1hGk64x-$b+IELFuX0v3=C&?m-0I$#6@c zG`~6mTd?`Nk$9m%!#I+lk{9}h=W)+0ufxO045sgICC9^g8=O$7pV=#JenZEjLLybB z7)3DUQ6bR^Kgue?N{+MLPzhlwoHPoU9_B89OlP|o)FufC z!9$P(=U)%nuxlKQf+8jT1$A=phN^cK4a7c(v}YbSCl2b-V2KQ@ zc~I2p)fihaqx{AZkV#;hFsL`BY2|5yCX1z8#F9Q~1jP%&4rb=+{SVXdJL1pCea%%~$ zpR2BP3I_IfnL0eNW2k;)E3T}8&w~3MEbuy|$X|FZ=w4%j3%e?FvE*4DYSUxec5E1e zn$qgNWYZEM7KVJ{n3r&?+`T}E8UOL|+(P02fly_}(LDE-0u+C@=hu}^&f$`C6xIIf zPIJ3e085d=#ru2$BDm_}hB4}O!n%?SY{EZPz)l&nz0NF=r01R~W{uxnQF_D_W^%f; z$uM#qGizwpDZRahO^QFZYZ{zn8Qky}uaBY`<8!t|J+Vt;-Tn}Fr4`r~_V!CB-8;In zt8K@2|^MtK08rG}>@zjU7*fn!#7G1w3|^Ze_AH9Aw@n`oqlO zCN%=7mwP08x^+!!3Z7atpj`*+OMLyQ4FzV;xcU9DgPHy~{|jue&))7sQIM}v)Egcd zZvb;VubsOCEkW@D(VC^1%DR7jD8bNS8e*^Vi&9`BzS;q;>&P=gxycZLyf5odXSgfP zK9`5X%IDKX7y4i!(@;k>V#9ZGKMoz( zwoisG^5UqQbJ!h$G(R~&l?S&Ez-R)?u~Iy8bl4`$-3izhec>qzZ8}(T zx4(KXkjTLtIFOT3Y>XtrJP)mOpRz4CL^vG~GoYm$NE_g9j z4K^fnbMVNjm%qj}jCW<0>3oE~l}P9iFK>U=XA~{Daq6~eXZBvW^N7^juiE(?+!g8` z_g}`>Ub_N6?x=TR?kdKP4J{=VUwT6#m|d{gJj_(<&zDr`(>@r_Ky~$hk`Hrg@Y@4< zm#eflWs|4aD8p%qgIeSyz!kfc+v*Ea5u)j_|_J3A1?nnL0B34^u72qrT1&s1(nG|>(*TT2Bd|%pNC_gRslm3zLpN99=Ax( zBiNd(8Y8~1nLIttR7kIBVo$CAWw+Kk?Roi$69wx&mjA8-cW1o5wm$>+L9Z^?cJck{ zl&$oJAwD5?`qp!r&Wb6*SH&^bm$PHu%E#|axqS`i5T0GYeFMCkaTh9&&)%P3^4|3Q z;(5b=0zdOttsXscp=z#R%luKtMWZjhzI6AI`wZ93Od-R&<8Dqk_G*7!Ot(utV*3qT zU-D(rZwh{FuyS*c;ba$BHtsp57a2|k%Jw=p;Iw#632u*fD7$G~wKkKl``d;3dj*xi zl=A{+r;Cl{66J@T+oB6tC8J!&DZHP)Q-_^D+U2mqX_nv{GoDSR|2y)C8JyBZfLl3!VY^aMCknAgy7;Gm@+-P zCY9A95`AuMftizjG~E)lH_>ISf#MF`*SVSA`*H320}bDR?mDeEdJB)Jt{w~d(LMWwm6MO>G{*#T;2%VaV@b4 zP2wkqg%g5J?@JT)FPyIf23&c5_OM4!ib6w4R!`Mgqb2M1<5k}^{ zecczH`#yx*egM;>2=y!7deQqVtk*%h`?6`DeX* za@Kj)LiU%xROv zRcaPv36~ke!W4T3Ps`EjEl?~AftoMSvqDDL*BhF#Ufv9}~k?i4x6 z)H*=b2^fdLLi+J$n49Zd$cQG ze4)^Xmd3C1^;pK6*OeqNmFvk@MjX)*PUYywG?0;+98nGHdRcFOUx&W&`QN^Q_{NHFAkm{EGkpCkO2;=a zoiip}_wJ+KXZAetOHujS{o@I{48MUBi8?B;QYOBnk9FMR-6l1zEt`#qbyiGV{wjYOd&vKFi_T@s4^=I*2(E@9ehxK}GXmhGGmX4<56B zSSBK%@=C#ibK@K9dq2QJPRcw?+26(v!@WQuf^^%C9>-Uwf;XDOo4#a2(xF(r2c`y3 z8xM@z?|k7i3GD^7*9<7E9X`h;(m4d9>7`rdGCZUxw=RCfvQxcW1`{Yizv9zj z&zjzd*6*VQY|Lu3;U<^043Dt38)L;(qa&g{!X+|!y=e-Adn~*h^?_^*fZe~kluD9k z7;hQ3$5Nd1k<*6N9>H+iG|UsQHd*(7mshWkT3%0tcp1Z)CweOybSN^4dr)BoR!>6U z?(n%@xp6m`PS>&Fo(uWJL2CLn>q}5{B@y#SsofA*{zih`r8Ugt?_&3<*Z!JDW&;ZUB!<;jyRwf+CcO+H23nZ@}7tdJp>R z9+5G;Ujrq~P_+QI!sU^R+yF)FQI;i^a7mJTivm}D5o><->pc-k;IQY1Jdf&1DX?<3ervrHH~65lVa zxlEzCH-Li)P&KPBo--TH*_}&P_Hwyr9Xl(+b=wb~xAU(M+cwX%QX1u()@6bR@iF7h z?e&XB+odu;q~1AG(-wrVmN9oZQAmuK@r}4}g%Q?0t!fU~v>~v>#_RN4h1#}FZK|}^ z6#>Z*8HdHH9!uj7ud*y%N$dBFtJQ~_SW!Fl`s(25KPbAGQF9RPRxFN(%Uth-&2+KZ zSO^ROkkfSdjfl4x!bHsaakyD-*#04%s4<0!S>e$;W48qCLn)TA%NEXzx}xL)5{SP& zJnGEu)1ijn>0{VR7q!&G9gOA@V@dhi_$w{*)H`XDaY=r%lmQrr*#nf^VwrV$)*OA* zEKDDPu z+A+$`YUPxkj8D>-;A4E4bC9#wPZ4YoZa-!*?1oFp92H&jfHU6e?FE7)q}$YE`T4LN z$=<#&$C}a!kn<{?uo9RexYuztHKLJ9CxBkvOpuHXg`0dIk{Wp@urR9=UqB=AGl6p6 zhayGRJ7-?FtG@D*pxxP;kKyJ;{T->X8qz%XaI;qAPlpr=z3mZGp$bky#J-NRH>j%8 z@Gma*&h~AGVAA^Hm|V@YcqP1{t&KGMh5F#HGM%eTm6oAO{V0dQyE zN|;OGUT@qYsRR1hsCVJie^z%SIWtY~1W0?)EmR;O-Qs1|DU)aYk;GdU!+P#gw6w;a373c<<43?Mgja(+POHOVUcXQD7T4qB$ z8yu-%DxK{IL#PzZlA>%IB(~L{;np^fOfyy?T`!en5y05hSP&HkDeF>S3&0y$ciwCD zA8K){g&-oJU>Ctvb%4gN{NeW?uayW!5UL4&24Kt!gE0o2m%Q*W(B|KCBE;0tIsYO+ zFbRy#+!zbv^MccgivWRkL2yayV(r!JLJM6}#O%dGLUBu;^v-C(ug6$ACgp#O>&gR( zRIi99-K9gniWXL1Enc`K)HRpBIa}ibxaH6pmsM#nHEuRiHBTB(wP6y8^8-&dJ}|w; zgZ*LfeVC|6oQY~d=nqIpP&=YzDJUwubS@p{z}g9bHT|fB{-=o(ta$T8r2!4VsJrC>C#_Z7PD5Dg+^%r+$-G1LYq?@IllXKQ5bJ zingH#*jX5zFR8cmAZjfRB3K)Qtu;MEgG-@>3P*!qi8VAK(tx+|kXQiKoz?f?^eahp zb&tAun-XFJxXn^y1FSCgSu<>OsOB+S0{s*S;Eys7nK_|jyqUjJ2hPqV^rdG%2a@B< zw3_GpaSO?63eG?Bz6k`lmccdFVUKc`wAdiq{TNQP3sAzAYD+BWxIYqV6Q2U3hkJs> zvKkJ-%Eygw_rYbs7lpl}8F_s@h*}kfbijTMJl7L_A5h*4jV!bi8O6Q!BN)iuk(&^R z;9?D&D4j)!je(dK+hZM2A;4U3&w^iot}zVA4TDoFt)hgWHl9cN?CW@q64A`U&4zuM zfy(Ow^+0`Y*Kc*2VoVa3{huY9>7P9HJIXd$ms<@AIEdd@olJ4Aou&H`tQn!v!wGR= zRHB@f9ASb|kGxOaEXZR46AG4Ap@b-#%!8oKP*j2GYT1Yaj1v+v!Ub=ziNH7u&uhnX z2U~mr0(v+I#(jS4NzVLc{x-8=ILHSz+@Ik+$-@3mrN_>#yi;hB z`HziWuVgINdmWyE=Ba_-MKSB#BEs8kORju6@ih2&vUbeqD4PKgRMaZIt$Ov(RUiHh zLpf45!&OFD*lHo&33gL8IZgiX;x{&n-#(OYJ;zZjtou(VY&+X-i|x!D|B{v+@dp`- zkhUSN;ZcMhtYu1P-j!E*wQY1c>0)XkS>L1SJ705eKjHdEP37$Z5JB1g!ZUG9P4_7v zq8>D9;t=dhg{O#Vn+{G7iXA@>{r-++<-M3%r7>670-0(+hxIELGG==z{D_&P#&Tyb zIHcz2%7pkC*giZKWAGMxSg#r62NH*zwc(AtFFO9gHOEZ5aBP(G z)Cv@?VmCalmb?ZbdxYEl-x7S11K0Zp-Wr)SyXn zSo{JZ*&!X<;jpr8`6RPujmPVvWN43`+n?4Tx>mU21AX|gWK8OfXAdn^hcP;s8_wh8 zR_EI6Ad;P3l`}`g9%Oa5_XK)gNNIKY0xa)mCu5?F-@WFWjEAn#w{5Bgc0};fQ9O~~ zWZ`wWZ8x|AXUGWZaXxD9O&9zO22fH)4dH|_3@7#)sks*rR1#6{qM1M?$2vF%1~<9} zi)NNa(RR~lJOtQF~s^9P-+@OlTex1Zj9Q1c1(bH7$zTW1sY-jG)9WHenH z!T6ASBJ~8$%9{eZ{P<6?sGA~>b&Wp0oZZO!^7u z*>T$0%jEgDFmGBY3ilArqr*qYZH2>;Qk1iUv;Asf{0Oe@K%J)=d(gv_OXr17thOJQ ziocoy-5k*-7Sq^vh~wD2%}G&ep_+Y+LYakfu7^%t_p7CiEtp$!{n_7PEG5!K!NakL zlH!`orXacT&KoLse0EGQ)M5m#JfNI-?0N94kIzk}RIGt#MXYF+evSQmy`0GyA@EN& zB7cgr4Ea_dPZ)U3;sy0ayA8yWUOXs(pKuH{x#w&ub+jt28(h1ry6B;?Mrn%@MrgBA zoFqaVnI6G&5_YjO#%)T5_`J}mE=8-vk2MX}?Bf$gtfNvlZ{Cb&xusa5x+V5MRXlco zobln{=Q>LYBqNpuFx<@|_SjjJ$ko+!+`X{H$49t0f=%w$R6i&GG)}!UoN3Qj#61L^ zoc@$)iBRp)bf8^a+kgmJ2JemWW_6SYDcCsOH+GxxYhYl;+oYmq>MI1U z48?^=QJq&CdzVa()tajvdae&-m9)xV%wtwE7YkKWM>f(3+B9|rBK-WI z@8(nnO{|u9EGwYmPN|X7X%_0WcE^p=OxF`e7K2hqp45}eSpU@EEAq&1mX ze&TQ0-SxM6n?aIo#!})!g3Pvq*089P!IP=-(p5sGT{5vMKI;QCHZQU*)9 z{Kc`++-Rh1u((P6N_jB)LkZ`h>lEdwm|fzcKD?YR$lx#7yfizpr+118hFkdlkf~p2 zV`?$R^Nx)&-tob+v%Os(?zugtEr~q6!lHy@OPg>dFW;NCgc zVA^#9)p`@OLM!8yu74ZH`upX*D^}HkdILp_Oqb~OOW-qVbX09VE+8cbEQijn%0E)u zTlYci7kib<-apM=DdI4GeC?EZ(I85QCEU^@Y5gPLz)au%NhGclTet@Rs^|<-; z&!EH64?JzKmon=9t#6HYWvmMJRnbltaWDED6co?de0pfSlq&?;4m86eh6gF?ow>Ao z>~(%|jz&n}_Dl}9YG-ni(H#7?@TTl}8Q{4gRuI4iy%bCQ0BY6v(hQwUGdqoMz?*>) z0xY!i$m^(9=QDdyo1`A%FXH7M^!JqA(kThS8z+6%7ierG7V5)-!ZPOp)TYoY2BPv- z6g9^KEO`&^`{J^M&_=6SRPuJ6-Q)K!&7H4WaCFT4l3SKoznd9)G|pgqT{nZqnoM@u zgT5q_3iS9R<~P0(5NT!SrW9`IB5ZHV*a_(<2BjLS;!1s8 zQrbnaRcyRpG;h5Hp!Io-0tT0hsokb1J13zDYU43fS0!i3H~c$l;CGdmclR~a1C$B;D1`9^`>C9#hjbFK}+C6kfpKTeKkN4 zkeS011!%Lc7?x2anG4=iRn+nhmXXuS3t~vL3TPE_b`n4lbdLj5MXf{p)htJ8ECXoa zf9M@5bxEZ}+ZF_Ki~x$rFk@87b?^CN_tRt9>#M3x zBmcznPjwau>+`UjbjOf$SKyod0=<@6vD`}n^Ox233%(}lt!Qeoo-lGik1hc_#i^W{ zdGmbatusT7RSg{%PIa)huD)fp6D^l6Ln9}q1Y$x7(p&CCtM;knlV7<$mztKnt70BJ1Y@q9j3r<=x>I8#Y7Lfz;UIhz$3ylmq&7UMDUqv_rpJk?~T8AL?9 ztOT5mCZnp8<~;%@aXM!q;3z-Dn7~##;W{R^`S{YAM}G-USY)~H&Bx!}6J^qZy1J}o zbfR!uZ_%S`Tb(34`IP5aT_PcCtADcFp}{;qr{RNn*3Gmqd8UsHVy_s;Y9c}GfCH?d zAsw%7I*-ZDuB{LWA6ljkBad8naB%b%@O68`{@~n4 zD!!fGC#aEz6Tj55n^mkvx9bOrN^e=Z6o1Q{on;UgIO=Pi>*R|u$3{Y(Q%3kVBFfr6 zy>YbkeQwWF;ePLC{hbFbN1Fz>NAsv0njJp@UzleDcwEShz5Ql&tgvL8vb>W+Dh7L- z2le?|q-sPu0&-fcjyQp}E7a8!s7{;oVL5vI?ljV2^5icwMt2I>MZWEX3 zZ*rS{2LC!H+KhZ!G1_{^S9TlsG3{0whR?;v-@8g^))zV+FTyKI9THRcqde|7`)m(d zStM(c%4Yl$Wy~ubQBXXZR+t19d^y>k*6&;^klu7%xt+W$ zg64?uuuSo-uQCr;-_D{fELawu=N%RO2M`IK53oQX=~AY3)%(}ZOxysA)u)$q9M*;& z-Gl5ulcEVTUl1as;ogvNj-%r*y*B=9yDtCl?HYo=zREZ&=Gh}4vA{=p;f!iMzX$oF zAM8#%E@U2-jeGA%MzrPW1g*dtjww7yy>s(4(*oWQJT)y+^zGe|lu%_suP`q%HvdxJ z9u!dg&h%4_91QG;!(2vOlk!>xh0m6Ex=3Q+1CL3MioFkcVc2%#L&a@QPJVfYhISH_R z?Uw(ugLdXbwHoSaQB0_XdXQ|pf8v1SxcBm#(J}3bmUPUA>D++^x{@=eQj-h((djpU16_<`&Q^NUVW`wp8#Sk0g6e=bFk8| zzKH6i{H7qCi>`Z6$w=si9p#Ae)>CR3?I`W19TFmaok=sl{1fxO(*N;@b$uH5Gv2=A z4Ji4Wpu>$Fk6i3;&H-2H@B^rY^#EqYb6{f+iX91|n}!q4UEYK4JI}Q7By9bVMw2~) zoj(C}YkHt_BARf{evsri(;bSq-4AvF<02V7%;eU@Dz?Vq%(~d6c(e*1et1Msnw4JI` zy}iwUW@c>AWI^wmiPl>eJeR(5TKkEx42vEEplxPGKUom1;Mkw1$w%%F*8syGR|sY{ zu!U4NH84>t3Q+kie=tykF6`HAFB7|9&&A}=Qd$b%P`wOqCW=}^`?IxUgPpPkHU$fw zMR-}|!4S}%mcc{7d>!YQVHUPOT|0IvNf%=Vu^(17vJ9x1ce<25TBK)H1gKiqDX9bZ zlYtx4OBWa**ksQD>rY-F{M1R!3uj}|8AuNElM@vcr~ZY+SZs{~TQunN{+7f8Ke+vI z8pQQww8I3j$oI!-W(z{V?CT_5k~A2E{TT~1(UjI*4A>WpyI$4+G<)&3oZCTKZ2GUK zw7IflZ+d*%EaQq2_k?iOfZQH@@gX~XTc(+@WQIc!A+SIg5<|LdHapaDshmGH=-#EN zb_gi6c;ZhnZ10%_kX)O!$yl1#Xbnb^UiqGfY)%Xo)zwt&^ z4q%?vFOSv0^*`Eh2`!?F16=1=Fi?vZvnDdaQt08CC$Yr2K!))9`{aF<){y>w&~wIWyI^nzch~;A~n; zy+gokDnSm~&s4lm!9=adO=CGvQ#uY%l>q8784L13c0uaaOIP!d9)N1OhSNvytK)%` zMVl_=hL)|p?<`P)|KFML|D6f{|9d7ZErBeU$?dk?2-Pj81B5Ts-XN8v18GIuxM|#o z#G72c9@nb|vD!p?@Itt6MuI;-Wa9e9QU|~$&RWEr?#TQ|Xs0nfdu>)i)P~n) z{0RVQk7kHoOlt0D@Zb#YpUMFWv>vOa!aueB{f)fV&fJ5Z9 zK3+e@^k@J~St)HNN?ulEna`CeNPn4=!#ZIFXu`quuX?=B6!T00xM-(E^D9Ke+UhgY zxi$bsXdm-5kk90@Kl`zrD8b$q>Z;FT5R3+{5{FgK;sBX7z8C@sVM1KtU@UH~?_?8Q zSIHQ=Lil{FK-dI#Pc|NC#rhM_pFFQ6)NF(7&vC#{zY(1-A4}h|DP5|-iB%d0<`TEM zCL#bEdNE-#+s$9+z6G`lP^E;KBUeAm+tVBFBC`i-(?PnloCpBCL?##)Oe$xP;sXG?hxFD0R9c2?_soh8a zUPpCFUPEld?2st=X#o6Y7{dg9^|j29CFddI#d@2FCJQ zSve=H{}Z?kJ%WYNHc2)r9eL1E;L2(p5MVmz9xJvV#r<54%mv9L3t8erE;+h}-X9Yo zrCn}V-h&YSPu%KreZi@p)v}45SODy4Ixo7}ggnT-uSI;>@WgCqm(%7dH~ZwXf&`$u zQL0yK>*6fPw9>A7HrROSkO>)pUT-xytfWiT8Q&w?<;ix)S(2^cA=BkNNVA9A*5I;E z{Uk5IfusuuZ$8Q#?4#$iX-W6m86WgeOMPWI6Nxv^?V;(CwHL4SU*QpuAH8A-EQsh1h%DrEOv-gdzJ;SDkl(;thX+&ld z)0)=h=mcJJM|lb@fMUZ>7ckP=4&qjy%Y~JDao3txR73Q>y67PbNkNSjPr9BWm$=SS z5V(2Lwi~AzWxrWz6u~wHorZX<9hF*nslU3uN@(DK%g-vzEb1U|q5U8>IcWsptYJjf zvWVOZ1UtNt&#dlMnaAA*L>uRx_p$v?D*W%hJEUrD|GI!)zc+9g^Bjy%;yY>I7?Xsp z?pGrgzl`ibj}&(P4(Mo>kp{NXJ`lp*UspUm#fNnbxZzUG;#b*jRh1%fW>`Z*L-)E#hc4H_Y6s`}!=GiZ{MaZA3r9f~th>-mvE*7a~amGN$;lz{4>jfO6m-E(_+|P%1gw>?JX2z$m z-lmoLAP7d7QE%EYVfWgZv@IQ2@`c?6=ac8IM%VmE5hNP${NRDn_|HY7V8 zVy2Tp=n)sxb1oSz z{RPZ`#s0ixe?I}4rHm|Jhww!t;lxqX|BF8C#?U7I;sB2_mfad6`2ni#7iR#!mY&7f zVQ?h~!bR00POGhG66a)VkO<@l_5a^d*BYS9#3*BM z@5rd>j8(@sC_gVuj~P|3#a(FG`3Ztx_b_?O;G^H{wE_&PIjzwx7e@d>BXDP1IbR*@0QQS2G)8miCvJNn_S$%QUxlLH-%6oqJ()?g4 zLW{f;wtnJ{;O@xg!~g8p3<>grZqE6DACF#v<1k~&ExVOzIszqzWieL$&!h9r8*kc= z+p3ly8=m7}71lq4m5%8gNBZW+QN=YhWY$kv8B&hLBC_@%(lHdC=XDG_wIrmHZ7KX1 zoSn4mS(9ca#Km*sTFwVFjLt#xiS&_{v?<*b+J``Ne#4@3haLXWG>UZDxpog~e+EDM z^67pJcaw9hfphN|nD#+N{94CJ$W~t9SIJ7_bSstMrQJ(%+7K?F1G1gpE3@ zau|$Z5ake|6A*0LIvw2yn*&?n5gO|<4)s8fby!a!M*64ZPnx9XPt!=nGZ)`lFY^@r zRt!4V;9TR&h?Niu+ktB*0OBU)@YGh`P%~#t*n5)4TPHjryxp|_n`a3^M)(nD-J_St zWo>*Sna{;hTL3=f6vWL(u}2Qj1Rvorc)MBZk+xX-%4CYM?r=eQOZ>5X{FQH*RcQ%| z90S=*=iz7<9|;B0Tf<#AL^;tQJ8xli@gmr2M#|3uIn(Zpkf2&I*AG@-v&#<()QAs)vf zPKCGxnf^OFH*d%E%vG)WtZUO)o=vlBTP4AHkP?xu@BZoDm@=OfAK+1~C;O6qL?{@qn7Zv*~L_+P-TCdptHQ=K>1c~T8 z!d(o$>G_?WC5a^wjF#8`OTq5F-R%K79~vOtN`oz z%;{})yv0moFC*;-npem6Wsh&=TOG~Ux;1ZF%@b}fAK?xSVkzRDhi%o8e$2wh?Y7Ek z-wFNsjnc1_lPSvXsTbV&(cerXaHreQr^iL<1&&(VZ6=fDkXQ^m>Q)BxRj)$v0UU;S zsjqUY@S}{&?`z*%A|Hrke$rqF$dqRQcAh(K6i_j?YR4E8uz=a%oTL*-^l+%{tGPqZ zzMS3A`Bxl!+`l zUPsVbVpn*T7$5v~zpU~e9`R&j`#j1T!p)5k)k}RGjN8y-k4Kyce1qXyR!Ni_^}@H> zm7bK=)(ooaFGUx36lGZZklp@2TUzH_XM)`fYWm^0bOxTPz6TlPVJ<>UaR9xhd<2yN zhI6V~fgfMFh)M1~4aIbU3h4$}CVvD(dr!{?^2b7{C}ZB}-`Nm9&+YNV=1=7Oj5F6Tca@u1b9qulZlcK+J? z3%>Q7oukkyrHL=-EPj^k8N%UHFcG&x2JNtPZ(Chho@S(Q;~;AAm?HXz^M9Z z{o>dl-PkdSZl3^*;_!MLB~asdw7B3c6CeZu<@?rIt1-m19pzXd_lFHViHKwJvei75 zYsxFll&zScA0R_Yic)}ik4hdT9^9@was*G-jj=&+=>$f(65wfNCNI4#r3d~Uxtp|H z$S0CAuM^XFt-v^*j(X{!o5#>&a1HkvF-$3~ zq?d@yv&PG)eDvs4ySV5O%3GN!qHSifobTOZnsmbDp-R7ep2Lr*rDL`UZ4GUAe0Iy> z^>!<<5cX>tJAiWfQM-e5|Kbn&yqNQ3ciLAJ7slJ4e(CTDw0{{zzd8V-oF%P{;9S&}D?=zJDSjR6bfmH&9d~}X2&ImB zZ;ZVYz2!-LrIyd>Z8xxa9Z3vAPfigYgP&rN2_HB`I1eRH zd$b2HRycrHPKO}~4(FXo9&i}3lXwe5d+0O*o(`iWNGCDIvRR*oDrt|bVfdGQ*!j7N zm_%@PmBJpBhyjI_0pYvK&RF8h!m-ka49Z(+Y7a^;?Lpq>(~5UBD=X{eI<$n-X3SFx zg)XW2u~onClpq)YGBWBU=x>$pOMgMtSXL5dmV6&0HT!S!yhQ$6&9i8C&Ssv$lyRvT zyY*wzEeuXz+%m@RwMS3alJ3mZhB}3tmI@`%EtAK=n#aB&3&qbUyvmySJ#129{q0+j zkp0a=#@6Sdm=9zh%2hZM#vKliSYoC1zDm5%plon52v+RD(w?fI0&f;W=!6Z(9v?7Yee**Xo{-=xcFsO6`X{W?h! zvzh&vJS&p4$5%AzJWYf2VEXjRxRQ?V%bl&iR*ra;n)|%b<4x_ekJCm z1mj0ytk``CYq;8yrp|3)>PqC_Ln4lb89{!ChA32 zpf)b0ht#}LEAr7BCo8ETm0!8XbHC=* zf~ktoBRE8Kcl0+uE9)#f?5JO!|E6Tqb13J~Kf6rFTBIb{vUD*w7N~EUC7hN)srj5B zkT|A3=yXQ@e=0S9p>WlOry7S*UT|)bK|ViHltAHlGqSz?!CWQ{pKYH^Va8lX;hv(o zSDF~eVi8j35^c8I(cZ&;&muPdUv*|BJq45!ZOWj|G@qUXbtYB3k4~&MTYhe*8WeQ>#^FVnl{L2r5+g25EHEp^@(HPX4fuUu` z10?R1k}p@s(Y~Cd+brV7BP1OmyZK}a-#ey9Tc?MwZOko=IcAjS`_q0nzd#BP%@UQ9 zYbp=DSg|ncXD_u5j?-~%*)KG;LB@U?tG?n>xc~~39MEyH>%)8OTJ!x=F#H|4WW@-+ z_k|iGc;%yW_zk7!S*kKc!G8>nbSwOuHt4uy_pg+!h3rPKVBD=>S4sXY!a9htvqv5A zPWD5UYo#rd>t;dUN>bmNomJM?dPD-HFQX?xH@%T;NXqTl&QvV>vU{ZBqpn*+^HXUq zT}o*VGR=8F@^TnVr;i?|%3<|m3?q-gRlP0SvK&Z&@8qfNLDXZ7l|w~z$E|M9VB|2k zs$XEUequTo@uF=HGJW@#;S0E-l=3}@7xOj4=Z7?mHaan~lKT}fmsm*ZxHQ`t*>+z` zU0K6^x04nM>))|=(@%>wr6Vt$|8uXh&7UM=*N$eQ$dJwx>t|r?VwOtMXMZmA-zto> zqMrK5mQtLXInI_+^g$Kk$RkB>J*U0`gQH1jp-mJ^M3_KTpX{LYd%}E5|66bOkAa7+ zg8tlfk5q^3pH-EQm5DrUIkJ^REougL(R#L7-K&tFkdzyItiVrrs;wCwS1omgJR-pP zFv%t%q`GQUn4XS}7177NVoK&AX>VB&GR9BDRJhGBSFxqpU1rZovlLmW%a4_(e|R!L z_=-qABqg&4RavbVrxHD;%;JNmP6fwwj$*)Zu^aY}RcF!LN)6^kuM z$N~ooTw?}Rl(k3!(NY4ZBmsIU;LRY&@Z0m&M5K_yU`z_Hd6i{JmlEm4ei;|6aPU(7_ed%#{{(Vf&04t0XXt7enBt0 zNSSje@i;(4is&p^1xsNJz)|^Ci`ZgHyt$_woMtp}!9( z$qO04gzALBSoFYu%0(#p$V8w?_oD`4dUmS1XuW@bp=v#_b&=X^U9(`&*>=jt?}H;x z!m5BKQ;zOCog@`uMxT((kZCj<&sri46H9|M53rFE^+DTn-bnYNyE~=}ybvvceeA^n zB7$xd(kOw6(&=;Rwk%p%zcs-AE)u0nf40bM(jv+Rot5rcZCEt>C8M$==T^wg+n*2? zH4`hg{p8Ha^YZ!u-%k#S___lqqhzcR3v2*<7&Y{=@y|1UbUAp55P%ewypM=L=j=4x zhD-M$5q)-U14GdeHK<^J+$ec~h?sEAV$D+G8bn=yx6(d3VsLva4|RlM_eM@2KT{{{v22(Vc$g85*9PC&i9^4?ZmYsgEl!6Q>x?|Xa<7yKM5oJ zcF2$YermYj01{!yfVc_=pBz9Ue0DBCQbm8MaP%vraWXSW?e<)Bh}u9xyp^=tCgO`H zUGd}Ak`AQbY^gS>6ULj!TQ{#O2kpZnt^p!|Jkdy}36r^0BFa?6ybq4}?PDTVuyigj z4ISku$mc)k$V%PBeh|NWHg35Dxy~i^n3So^?Mra*uUTa7OlIfrLn77;D&`E7v$+Mh ze`??~tr4~VKq3&IZTFpNlgsAxnx*^wY3Z%A;YWZL<{EzKRG!7F_HeA(wdMe>Kz*IS z!M=U-TcDK%=9(S_A*Ejyg25;03BT>F=?`67=r1T^Oto$RP8B#1yMO75a2~)5LQ{>S z5()y2G~a&j6fym-XV@s!Hr=%3a3XqeiI(}+{R``iCj>0g!4<#+edk<#C(1=b8~@uPk$McWLe8lnMAavBU`;H-@2 z_6Zq{7E(H^%jwz0GA>+99Ko$KvCOTK$rp_$U4C`_CyF!cJ}{*6=pW{VakME}xFo~+ zpVfwgGqw8FafN1m40TBe^`qV=Kemb2p7MA5*9dH z3K>O8W(Y2tJ=bs>v^5cl>tHEQk79#dMdN|pRY~U!E?`)>Kbb!E#U3bRAbtD8n!InB z@xQ-nWU-2WmfsKEBF3X}Is>sT!OQw?9bQ}vz#9r!S*DZauU56_{O_$Cddtlbbsxm- z|B7MyKdrhz!V9)in}?8Ic7J33JR;X6}Dtb6ls0elt#r-Ba|H_`zj#$WYM1BQ`_7HVztTe%6o_C|$tyWz(NV6BP75Lw4`R5NRW3~Q>eKG5Ja0gQs|nYA&EmcGTWmMxAN zTV}tt1LAFAK1Y#cY2cYMrHZ!_g#-T1OeYXkdMAnY^K2vmys^~qkUq|~vvc!UtTZ@E z!cx#CX(!N3{miNUVoB3ZJUDBk%5DKDzmwSl+G7UejKJgRk8cErNI5_eGKE@~Jeb;| zY};-%%&N8UrThlgOgeGERkJ1$IEc0a$I}$q3NsZWR-hz(`^p5o(hm~?rjM5L7|w#3 z0@hYpV05nmo$$hKiUnVMzmp(tHn83T&UzFSWZvYZF$aECOVj|{2X}VNAk=3x;ig96 z*^Y{`xibyS*!~7~;(_tM?$XKPa^OB9@gAsb_aFo?Y+5HQJT8^k7x_+>CNhKt89P8J zz?OZuWIQ&=i7+`_-AJdrVTq=)MkA}|7 zi!RDy%XAb-%xtZuSNsMWW+69lnB3M6by+}HhRL060S!Y=Zn3yoKi$W;o5dV%ja=`wbWb|$W30F9`5Ro3Wt8zdOFDkqRh?`4T(&g@_YDrBIH6twI0aoVmW=%Y zF{Oa5Wq+fo88&Dv(=87;DY*V6mi{23OGh`7bn+NLL^B?vVu6Qs+Q%M{FD-}LR6v<= zmowfffVnvsLDwQLe%gERGAt1BvdTi~?0)g#1c2 zP{Y-RC-bj`n%`{?aP+BvF7NHjJH0Z%9k^sJY|)bKR3oq~fZp*=r|f`ZAtDwpC^W>k z<&-gZ2X=VUCGQ7xr_e;C!Ua0}wBMg>4!t!1E*yUj0{Y~0X<0_wB$igqA8IctXM%zM zDX@K?eO@LC38>*LS#{XlxSy!bRX`@(1|z2hT}1k9_v0B@JMR-H8-%dD2T?q|o{^W) zq^S#VtyiQN7NF@nU0+6#<&Qy4SSXOMK;r)>mtu4PhFwRP)PxfXuFmd3%wEo8<@-Sn ztiFwHGx52|4);Z@S*Y7p6}9**U*)i| zh-*11nOZOU-d$7C=U*d@HFEZ|6&77JmB{=-!76zA;9SDTNO3a} z!Xbs144XkjMbl68N@Bww8@c@};_m5X z0gVDLlGDL}hd9+P7H#*5VO}fb%BPrHjnlWxKV*>jeTI}Uxb!`!`kehn8S!YFa^z{j zB-Gl2(8{614Pc(oH^NR-pW%ullud7^G|NQ1bmhvO?iO0}I2xaOsN7X};Z5hSb7JO) zU;v!TKqT$*Wh5eQquC>zFPs>TLS)>&J$+KF_mAUJxv-xEWH}_HAv&`4a6cIhQOsjF zhE{9W#!%B+jZwkD$4AtiTES-+Tjz0o?P&K{L=J+aaHr`f@>kTOu5FK>HP{PV z7e$n5cVA+jV}8xgOs;KRA{i)3K+SypM-nI($Bfc;6P)kE2@WW_Yl~=s7*66bIhGG2 zH68Q8KK89k z1Wfz&@M+9Fi(! ziMctbZci$AbHuB+S@EccpD|-MyCpNPo$Q<^7hpf@>x*Zq?SWuK|RO=ap?^T3{zqtCBwUpdMJ#o^@X+xd2VT*QacO46n zD^{_O(pwbKUs^HcA)X7YQYxXYInvKz4gV?^j?mc3$-Lb3J|AfPXpRtSv*>Uce0=zQ zWw+a%Q!dx##3UQsl2@t=8y+(43eZ@ul5YcK+O>2H`F)DFmSg$TIhlx{b@%zz{-a&h zH=?@fQ@>LG#yN4g1;Fsb6YqOvkU2ZiAU%Y`i75iIqG`dv$;xg?TAb_r{#5yTUB)jO z?w|C3z}|IZ%Awt8f5hz3Dv4_+Nq4a2m(_8^6?Ju7Uxy>Q@e$eK;noVfMLTumJ_a_0L%~0eKP#ED4QyD&N`H1= z&Ku60{wz*zcffzU>h)aNb1TtcV-cuQuEoZroK!6pV_1R^irc^3b0=UcnZax36u|o0c2Y)n0W~`L< zAhB=3YtETd1c%DR@UUiOfQL9cdfqQj%}118sHs%OVe{Z&}zCdmkN z{MPQkd;mjcmbDXye4L=hr#6SDn(k=r8a3Rv=9W?HRrC;*V?{SHLCBgFU>0bh=Gy~m zKTApVRo(L{61NXW@ohsYXLeevJ!YFLt>=zYq*lusE=`Z{%F1-_v%g<8Z| zRgRo$osVVe#D!P3VMt1ql$0sQO6K{Q%5#z((9H)M5&(s7|U9sT5dJ@qnQv9BBwqT^o znP3!ew{>MCm-ccT48EkQD*G`HkgN}8jKA~>#^`1mO&wko7zoyBj&FEZOw_5jOzrZPOxc!hQv#FTBJ=0ygR9dYR^RMoP0zRjeD;C9jQEV6E(;K zUcf}`*HF2nYHsFO1e@aiux|Hs>7csd%)c&Gt!C!?vCqnMk)vOcO9w5&5Dw0X@yA&E?Hr@jrfK%M=VHx{ilFJI!xdR2VFL;%l2&%Gu!*-W{=%aNLK7Mveg^sIe4 zQ4SPe#ldd6$4~MWr2m$qBl97H0r_ctmc~ZorFGtJkC__Z^`|AAMiw&({RR^eN&~oq z=67qOJP)|+{!9Hh?@yB4k+mRwO)m@sV0zJ%-Re$jz+?^yaM&0Tw-=`b13TRNFqpr|TO3@q96Cy1QI{ht_sPl;&i0v-4G3n|Vl@1US5j~lp56=gi z2x{z~-su=EI1?rG&V0m3EB{j6y4mO>>;7C;(Wg2!k9X|nRxcGFHoc+e1MX@%Za#)z z<|f^YA{=X3`Q3^?!hdFDMSyIrcx8kc$dKwE1iOXSycJHn`;=wQok@np^6E5#1UsSoM7^N4-!o9#%6t* zFQd#>4vfAqeGzej*Od4E?86%;iK`QrlqUsyB0IQO_8^KT`&l9ES8^N>c%9pW=Dtx712MMK%QemYwb7pM@Up3Yj>d;@ zis7CKWTn0alf0HnQ8CEL?Ur3!Gw}G=L`(`u8 zVi7FH6dsr%V#EFf7ix(GO?e8m#hesDG#5>bZgg;5j4fXXMDGT5Nx5o~j>V&&%6mgHu6isJ1Jn{qla~V}`>X;1|tL|Th9dOt2 z-zdt!bk1!So2(~y^?db6$0xf-r{cEPLOOUp%F-H4A^2(@6-|w&$#OqHSEJf6N30Of zUfD0snl;MiZft(>HAj$bWPD^PY|SWexmwC`aJlWRD-FcZ8ogV9IP_1%*Mv_f*jJUT zxP%y`E}2aJoNtD}TSI6A=7i|2D+tfsMS~v0>)xu=L|%^<4^r^0aQwnM zPlg55*qQZ>Eg%MqPq|JqHq9xi!i-cjo%Z}2&hqxQs6pUKRMq+qL|-1QvSwLCN!qHm zzvk~1c5}HbK{tcMbdAB|a^kTN6Y8`x!5E%sLu#AtO`$1!XFjc<2$VgU&fGza2|xF2 zyZKLwu|OU5#G?|?Ptb7s45)tVszmQ^vsfqh_cses_=$F3YaVM>s9A{5+Qfaxe)?F7aJ-P_lXDpyDPcF` zLE(QhjTk*$2~qstC(Jb``7-b7tLSu^UmNondg>5Z*r2ahkb(6divs-J*5l2>5!e0d zee@(7liTXM(fKQr;y3=>TQX}3Q+0|?E#Bk0#93e&^iaMAT zJbxWN(PByi)*>p|Q7d{$m^WcgsgVlKX=s9xb0VCOP7xp?zP|Ze_d5b>!(aE^*ilK< zEXnroK-ckyhz11rs0t<|v-1ap0<#gqm2t-h{||d_8V_|Fzkh$nVC*VW+4o{v>@oJi z6@zReQWT<4jIC_B7=)62Nii5PmP(YhkTpYP2`T$FS(1H;EZ6^>>G!(t`^o+EesI5j zPt(gX^Pcm2oS)@5LWcz|KJ7r=&6`iw=e}_`RW!6Q@!JOH?xE3P`vdR>vEt7*O24Pc z8x7A$jp{vrRCj#{7U=w2?~zxB16mrj`4`U`mN%5A>(-`){4~Qa`{D)mi;rCPUgX<2 zy6FOjm#3{WrxON$dfrb@mwq?ivhX%s*R1Q$-Mu((BuN;1Ioqa7YYwOzVBh&VyqpX8 zEuB~Q2}CL!Yton|^ENhteu9 z^g>|yq43G%8P}c^s!pI+UzhLxcd-$}UoS8s-~F2f3_Y}v+u|RoGq(Ton8r1X*}66@ zES;Vl-##rqyLIkcc?W-X+IDFE*^tB*PtFSO;l^j^3G)Zf<&I(+p&*z&QDns$NDkf` zQyd9959jUw;3{A%>3fHdDQQV>SEB5*&TJ64Np3Rbdy%2K>KDu0_nI4WWVgjnewi|R zWKeu8L;E21UFn=UC`^(N!nQ&$)*=qr1!KnFL_P8C-aBzjlY<_Nw0R@?j7 ziKM7CR)LsTm&0@NwcQ)OyR3A3iv|{OEWHZl`$xt8wgoK$1*b}p=VT|UFV`dI}wZ=;R-AW&>~zh)gHE%9WrY~G-j*STC9pRmx;cU z!FU*TdOZxttBr^xa>eVd2*Un2fTYXO+uOaX;4gkJAJS-F@!9+G=($(5lbMlqy`^8V z)&1_0lBXBDJCPmlRGm7S#-6r!hFXb~i!Aa?bPwH|)PK6F(i|&R<4wJ#eB!sEV=y7G ztl>huo`eHlw}fB_!RP)~bN{#Y_5Wq<3+81oIzMj$32)@(QY0$n5^aD#J=9Ap=K6nX z$-a`azVEtuMjDnc=<=;Zj#j@V3zR3T^%>F&xP;^2QCP4#cCi#V1&&ab`kvD3 zw*-b5Kk6FlV$M5lwF|UbE(#QI&Ee%8jWcZ$x>a&?J43V6y#%4^Gm0G|WI0*^ z*N764bb(&J1(~*>0v)Nb_I=R=lycq1!KWLdmvYIp@-1FP=sVS)tnS0529ieH!6NP* z@)@0tP62&AScX2Wep>|l404AnE@Ix=S77Ba#LT^;+`jsqqHN{=>=Rlj)@@4G8L!lAjlQ1 zikz;H13}*K?sgP6A_F=u5jIAw$KpZ4<|ycP;368~^^ky><0kSYh$qIU_8RR~EFG@~ zF;WAt_~oTOdIi_eqK|y~D5(50M_RW{w$B^VE4Y;Z>mtIR8?AIdc=Ew)CCa?@5E{9r zpvg*N`55lc6NSuuZ-8uVz@9uD`-fNq~U0{%rQtWDp$ zr!U5{#RXl+;AJ>r4mX9^GXgXbcKz;J4xpE@SEd1sb(vxHOxj^YZxb<7Rv}c&50P__ z(&1{}PHo12$Ffs%0zjgdnxKz5SjOTGiY@vH65_FExC@O!yFq?OaGmOpVl2A5^ooD6 zBW9GCG(ZqP#l^c>tUMu@p{oZjZKGt-iIg#dK&>ELzsE*7cM;oY8f28wFzA*=WZ35oGmxznp z&5zf2g=u+C&YPgmzK!n9DZ^X0$zNz&f15B$LePoMmoCJciAU*vmm=QDk|!La4; zf7$7yQJg_5aP=O29o9~Q!=C#1nhrnaqbBrb7<^{cC^bq-0F4T93F35;aiuYH_h(dy zMMQs$;x~{0;QizE&=U)rh-^3d^D03g{+AEPxJX@;63@Kv0N?scbZ(yYEZ?3t@ZB8P z|1IXfq~!8LqBqewmdmZPf&p;_LatVmMH?4-dI^x`+*t||%H)~=(XEHqnNP3(>+0Gh zk)0*ohIQ(=0wI6}WTXPHrJjxaNW>j!(jhT=kfSDhpAxWAL`woA6~u<;`tbe-aYCm> z&&UsjKgXh}euW-fwDfsH5JwIsCHQrZ0GC4@yRvTK)amMwDK-E6wKboB4-l^%0|+Ki zNCEMkI3gb5`B_>7*hvHX;ERpZ^>WXbICm_+{qU%WtH>GzFfuvwaUjH#Ou3{-iMxG9 zvb5f#MnWp&R>KD}_I!oCg4kfgP1C&uH6w(qS_&nUTE4j!-f1#|E(ABos^;@Gb{qMbs-h)I zl#Zzi(Y$|~GD-8M4keYDu@)7N8CML9yhaRXf$M{e`bOT5b_Z2tEwW511C0P@l-ZOu zeiSu|bjG1^Iva&DEKMMcgAFxQv`l?CwL_yDN>NlE;h&L zg2D{pP$VsZi+qYSt1XugtULMOWEn$VB`CKHGlvpnb}*2{MM?eGcVpn(Iaq{FZA_Pl zu{U@Zq*=G{w3GQH;2DtJUVad+c-qrQz?BggGy-;E%!q4IanW8N4IT&PU%rGJXo4gs zgU`IBotq>dZeM)`J<$A2U{6Dnn2{Zfn`An?sgKz>l^|0y;Qu_rprbKGY-a~P3+8V* zLZfmjROxB3Ak7rCrllk|+#<+~^$F(9sPHRMohiI_;$%0v4P< znzDm7*aa^2Uhb!1Ky#nkE2$#zTKO~Y75|D5BT#Y5z5Xsqy>WxxAZ*sl+sNP}q}2SV zMcCWSsf$|&M3c8qOIkKDZY&HW3e^c~qKIDiKtC;?j`5F}mB0d_!kGgx!#zDv&w)a| zHo9*t8z)uAGfCiu0+EsIiC_Q*!=h!`%~uG}ReBx`1|np<+h;*Kw7k?G935V=h>R(U znH5e_0*WBqKxrx>YVJI$T|+Q?gYXy(>$Jl?#be{KN}ri;bfXJXz*k*iZ_x`Kc|Xq9 zzw0w%&~uThG{O$kR&>2X0Ig(i9wP6*Pj0jEd6rY zep>>#2E}>GX34K|_K38cd`1YRqLBxc8{929+fv=X!dBYWI4|jL`@8&GWP9k7_w%}U zDR?2?6MY>=%6_tuny9`Qk#5Sb8@tTG#{0z@RxVQwM~6mTbGVW{wRWv*aBu7hgRbts z_j)y=#R~ZTp(figdM>c*_iQ9^&28~>MY{;aXOWwPDog70+`U@Z?#CVCVt5X!zb{^Y zKw3~3r4Nh4EG~Ljnae?N0#s~v^%+5%Xuo|%_Sa_VTm#QbZPyav&Ls`)DPz|&=Tt2W zj}1jW-?8As&XwyPHs2T(VDPyp=>^>;`RCI%>eBqK(uB>Ow(H90vBz6tb zTvg-8reF`{MNY+M#*aQX_ZSH!jUNiQr?YzPVc=xLk@y-C1fEckzN<2<^>wSxeN81W#ARivYfN#h zK~EV4Ce~nUh{gI{#o>_t9EM6+#zFT-t?!)TjQ@E$eCyGiMe09`L#jy`%9_Z;ZFNlP zOy-t5urE7v&>YHtPP=OUNaUqm#DhER%?^qzhQnO~pEAT-DWV*5tqv~)fi>xnoCRbkn~{)#IgG@eQzrsmZrlAh z4TEQtqTAUg>R0N&*wts}7F_K(mDG-fJ6 zh&nhPbN2dA_-(iA_6f@90%7;wq7EzPiwMTYP;UA2&?cS(9y6cWf41XF28WaVDBd0( zUK4%-J-XcAT>o71n9$yqu>UnaIlO&WgnuDp_R&8kIprE(z7Mr)3SzST_tzDA5I+!m zJbha(s|JfFR@Y5eL*9CxrQFw$x+h%xa{K}>`9mxIWX!j~-8GYw91*IAm#*ua68Q6# z>2=u9TYGo_Pg5x8o}$~tGBj89j``8`TE~j=2j`Fcc@1Ay6uumPIpK`q%)2`9G=mNl z|ATG_hk{ktNdx$Yt# zZ@zyxu|6FtuO}L2^J-~0dZ6L_Q+*$O%shs7Ombx`Y-$l zcYO5}((X9U>3j$kAFty6^<`T7`-|zc+5n%QGeXQWp^MraKj%K&uwaiqT=6K@&Q`gn z^{#+Dq>R`?BCk9CpE)}T9~ss7xcRsXFd81(hS?*wz~XN5=%?wM?Rya8ra!-}!j%e4FY`u3 zsfzKCLvjx~wciwi5R*%ofne2@rsW@1-(+w z`_1pRMeBvuhQah}T;EEa745FhCBH;z#QJoe0KW{MWb%i@d=EQL5~S+E3zK)yY8~Wz zO=o&XR+7!Ai7TZz@TI{@g2Lb-;TB)mvVCF>=$-8$zgg|))@l2$yqJ{9@|`SYymokN z;ZcD_Xwfs`gQpT_%35lii~L*~M|6L14}$U|qw%(bEZ_K)b=em2y1WZsQe>;oTV(sk zzrHKl2dpK#XZN`KJ%Z1BJnNns_3P$5I#Vk?$}-~nPW=vcu?dmpB%rX#ne7UnO4vRj z`^)52fa#j{kndD>#+FL?a774zIng6c?5*ybacp$jy2SOwhz@;!367|SJMB9WM|a*= z@cut83#+n2A`_P)wOzrX7PQ=)b9@GUPKn#YCr{z>*!guGuPg-fM@C3VVQp}uNUDja@|UC*3E1xwX6d`q8ZsBB>b^~- zH*-hj@Yg9E9N8|M{A6}`-ZQz_=V`!`)%Sdtj{LJd9qeARj1eJ`r+MW&NELxyiFGP4lbClXWC9sc6;T2 zztT1U@9@dJlTmk5?7;yxreE@L*w)ro-X3Fj0rs0Ri4n;jugcj&8c?(=-Hlgfn=;(r z^R7q{U%FTCRKH7&X>7$m)iQtHsL-5Az+Watp8j(g{MeTL$jZ=&W4*!t+YN>15@IWD zIQXrzWdDq+eRSYRzR=L(Ew|%$H%_5sUH#O4&Wh9)&whrsOYK}`H+&mp5zS!+fw`=} zaI3`jGZ{v&>KFe!Fw^z6w|6xA9I`@UPP`wrq<(2iWbfEl-<5^QsDS^Vhm~8}%gvV- zSBD$Ch19=&9n3StK`du3D4C1jQh%em|ClqDP~!s*Vje$$F8Zuc;R6B8#pDh z0E-4b&(_vWVfpuz1NMzS`*&_gfzXyx*gi4zW_Psxo7r$#4cN+;QgWYXCEs0D&b?0> z4Xzoyx$X**4l?bR;GTBto%gnPo`9HQbA|$h(89{_0lOEd%(7@VgKhSr$K-_FbBr&QGulHgU}^Z$?j^S%;gnUatNPNxno4~`Sz33(s=J;i)YbVg$mP*~vz7yv-iQM} z`)dxW!e<-6!rW>8{acn1F)P}G-CMrf_rTE9v4zRmmP_^N#`O*9xWw_#<)3Ch30f%g z9g(kgHx7$`J5xXRY=uGu6JdY_CX@X~=fLYbj@!?BFXYzkKPh|oBmP`Pq`#25MOs6k zqBK>{i{c%k`_bkIT(pGyJLQ1wwN!H{yITVrfc>o2y4{zGCj;YV181r_0zDa^*Dc;W zZ&;HM?BZ3M=CDf>33D?`V?$eGwx_@2?zyGrC$;A$eTiawlg%O#&V6NXc)J#mQM{iP zB6aJy+E{|)y$KWj`Ok6t4;4=n0{prL`wz|&>g`3^d*xbh^T;S|3W^iYS}5yc(b zw$Px?I{4aiW!`(S_ACE%N3q|V>0Xt!xo6RPuDtrP_VVPJ25{c!tbj2Vk6o!?>AFXk z`<3pM3f@XA3;6ME#`b}eMDKuP4714Q7s1^g#LVx#Bi&ol-|8%;g=DuLZ>Kq)NRQg! zV`>Xy{Af|h{&hDUBPb#cUzfNO2!*&Hoe^I4Pm|iToRX>t+TyfsKAV8a zcIzmwNp9#ISiEh%=!KnmZ@d3A)L8^*>{&$xfOebwF50)E5Pe!-yvM2Ctv#H#yxP8;UdOowm#Rjaq**txy zWviAZndTl`_$Ns+Vm@OVF`d50W4U!@d%AdJJ7!rgr#WbG;EHW0+xf~Ps{i-;vrkud4mLdS(8C)3yFwo7`%g>b=`H&#Y-_%|8(@rsl<;&PzXF$pk9lvCaDv z3+%TV);eD<4w*HzNQ13T&U@X>%iEHLzltZ=HwH9}xeBLWJb55bc`@>QD39yl{BymA z5p37{e%Ou}c!&1)W9zJT&4bONry5!Vq(Y&&>Vma{rCD!}>znqUmD_*$o}ArzCFsJQ z*6zo9@WS}mgf%`b&rMjk_t(Z%<~B}6v$9w{PY)0N77qEM=4bkZQ$<1$@6lj-jc5Urt@b~c{4xCHV)d;(aF-7EJQxZ& zwx6b9Ii<-y_0Mt6N$q1LwT8a8MY2w0eSNhO@5FmEZa}xR`V0#WHq-Dtv-b2^qoLcH zy2zTU8vPiXeDl=~fw-413&qmHniw78D|c?M8XT~4@5+NG%(Zu`+)?<-P$px);m(50 zGqMh`flh*otxJTQ$;%9~=grY1u4%B*8~) z_a6Jv-#}v285aihHNVr2Rf?Nxx%#I1ef5!7gN!QjFNFnM?yFc=4lJ5VqXl?!(o%G~#d(XYnl`yHvdHK%%kuG)tuf?~m z%3oeuL^<^@T7U|&Jeb`QG1*RAS#BNYKIg!h{;*=WUJa-3SJH2CY(n#rpF!@?J_isIlx0Baw7xK&NW27~9hVR5a=#dwA@)$JUlpwHa8``Y1(zj*y8n)zG5UYXxS{R)Ej)eFcfd%n`hrtr01#m%j}kOb*j;W zc`CE(8tLe0GP)D`H+olfPxjG7Lt{6?o;=GDPwsi^m664{Z}IPM^u>mT`1|eM9#)fX z&-coYm^ZaM9I<1Lco6bM1RgB4tG_2XaDWV`me(n!ydV0ZKYvzMe1}wH`c!&U|9?~` zN|t*ORD2lM_DR>@1$4ztX-bLNM4Zfd;kKqCO4FP&|F`B8yMfb#HI}Mv=Yrvq=(cW7 z!%2~t5P^zS;m14T>ZzYvTb+UxiZ6=?hYHeFCpc(Xfb7&RPk*!#z%!M9{D5KLFk%Q+ zonrplWi!gwD)51(*UBqkM*OWf0Laeb-D9rGN3ObM%haxNe2IN@n^R`P=%DGQ+G5nK3Vi+0`(PvX--U$U(20lRY#wCJ zS9|&c%i<#nXG=;-o|KYYc%Xk*LQ-Kn^Sf@LP5cn(TZE+c`r;+4qibpA`9Z_Ql@u%9QDb5Br)ggI%6CI`&rVgbvIPSVGRp zHx2|IMt`c<`%<9in3WdNxqWn(HKbFd{KH1jY*^i?>Wp8a?qBa3axP9C-m^H)fVTbm z>>sIIbZO}twu!{V8II7g&lq2^_7d1q`u2btXJ!l}S!8K%V(VT*NkBIxAxxMRlrV%w z_hh%jf4k+4b}}vv;9e>ss=el;oV{b?L$0O5woAdAsQVw3lrS};wx0q%U|-U$_L&oF zfAjB1ZMp0}I^YiZcqwBa1Oc#C8s1zLx24?O&+|$lR2ArEGMpDyO`KI->}wbRJ72yS z_MFrNqrE(E9-F9tL;>vkS=hu2Vd^i3(OCltIgQ&`|b}P@h^Q6dNX10 z^yH;qd4&sq{F`^~@?BpQe7rW2r9Ua9UJ~)#eNZrfH>v#Fxs7#wR>2MMt$0F4fUr=G z+r6}RD#fHc{(8>A${BD6Y&lW;`zb z_u1Lc>E@K@b|s%|pT4daJ1uxm;wID9w7}EM7yQ3PVXB%SyxxnIaXrSD)=x^(rOF@h zhxAa7D8_F1j+w?yq8YBD_qpI9RpeWWM9vk+yfp{3YZdWx&8fj} z(fPcRT!bFDQ9P?)UksN(F0xQ`#phlxgDnU+7v-#rQ2-4kIlgp_sccj5RT49Gy7Xj1 zYSq?)i8L!GG5ae@0uRE7b=oHT$g*MzoGMSj|(eU?M_7YfVm-MA6#y|JxS*-?r%guiK&-t4kVvpS(Yu zo3@Oj(2S?Q?SoBo&s%mAlLIn@}EmPOSdMw$(F+V}hQp+I&3$PPwVaN;& zp9iVt7Y}iV^v`Tk1_=E5@d!&jj--a7Wz*)zmOU}Lx$(b(n+ZI(Uc+maOAZG47*3{#?c{DI!UvfpIW7~WHP(F)X({3OU?zg-u&MM}S`36(2_$IK0$H7E!D6b= zaiwNb;`cTXz!|*+jEs?Ui~YD%KE|BPN)=dU;6x1DD>$&SCy=8MMxm;z^A=iMtP?SI z2x@E^SUa^a1TLd&KYsfoWxN~nJxam@CF&t`6kK(-Uc7q7Ei@VtgFhanaTrV&C68^B zNG>DyaIXRy8w(WnnrgXHp(i+>mL&Z~YzNh{DmHedg?!S76B29FnX^u_u%Uw1r-z2` zf?>rGURhIO4};uJ7~UIf$;a2Rc``*DPBFDRf)O-_U%sUJ(;$eUcqf4or{DvuB2Iy! ziWL&mskdC}mMl2m@k%f_WSd(s3FF|xl2~cmqw?=pI>6Y{#AxJ2_ z5`N#7P|EJq)oc zoZpeMPhR55U%(YdaquQjq3LSU7br}WF-7sZ2NX`Zytd=PF6Kw6!}PCmh?ht zEeqGr-5rh6JTJ2Z8YD0T(LbLC@9q1N!Uq+3v0?o^@bZW#?foGA=KV26leI2?f8?RJ zU2-jC2LX}rq6^_QJx%1GuDC~H@e;%D&ql@yR2~TkAVO0bU zIn@O$J5Q2n+i}J(wXyIN3~M$!EQW!GZX%!%C4H<9kz?k&_9GcM56f zf;oMCK$D=?jR>;L z7*^!qIqtYvX0jTNWASXZ3B-4na-lCOfH_4hTB)biZ;BvD;)t)vyjbPkp6AQOExgh9 z$$4uT!`diH3oNls7TjDkmEyqsbR%&NN-XujyI>mAN&^~63x>p;(pz$`4BXA(tNTkE zJy^t0YISbD5cXOsR5G%4aOWjqr58q@UxZ{cM5<|EvpS0F#I zLW-M3aD@KZ_|gV`hDLc7aB){HYw(ZlQ9#bdxUmzbIn*rIOyz=l7`D1pi$I6D@QR

lxGYG683pQU2aw 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 @?&6J z%+_l*^0ZfDBCX6uDvS2g6fcs_5GIPEWBo$sD9i&^dYB|g$}W~>_;!nMgUA=2%G6MY zP3-GH#_b%VIN*k|cK7G&Mo>Byp=8*VWwqeX(BdOyUWVsLMgx$f+*VW8?DnjwB!m13 zaDze?!I4EBRSCn$Ms4~Rsg~5~t)v@sMF}@$QL)3qeuGxeFYyuGI~b}%4`JxqEE_n* zFc)u~=)g2i$aJ#wM;fl8!IgI-IB%MDaF~w8Po(wuuBj_<2S0{pYU=NUw5g~Q_GO?l z)3EGo;bsYleTc50**0Ed|F~K5IQ2q*vhD+yk%m+vosg|!w#y6xA8EE31?Z{;;_RC` z`f}W1gRc7Or_YphH-N`{!PsbdUGfcG}cUqL0P4R=>p1W<{> zJQDzECB+Mndr9VmRmQLBtHVH>_mhuGF+ZUX*GRHbuZ1>%@m0|POM>VstPZ-sTHQYW zHYVt)7)ZPXwa2TvA#NFR-?K@x!gv3^eu|I-t1mnGC{WruX_Fof41DAiI(ZoNHb2_e zdR&`9v;UKM@utIHhLbWceXgieVd`WiRg!n#DCR6AtBPn}J7qA!#rqEU+yK3>#~2O{ zK{VM~)PQ$L#Huja9EFPeRZ#`&9ue==GtWBn=3E(Z#^la07&|{kKC463-Vd5}v;UA) z31rH#pe$hD%sjMTWA^$pY%`~g8a}5^cbt07I#11@o0WkTYkM(}12#$l`$``6s;E4e zp!z#av4W}O3H07sw9@{hjU@_fELnUCq`RYZWrlSvh@C%dBE~z$H&4>khu0f8h2jZd zW$+nSa0ySosoo^}d;b$bO5d14-d&yIID$=&;}-Z;$eW#3h5190^tJ^nM)agz<$U&; zXx$=^RW<%Gn$~1;19~>csu4U+}N(moMyKeMJ=LgYBpv1Akjt#+rfc5oEZRy!Yk!s8SC*fPV5}sDC|9Rdc zs~m-zGP78O<4-Y?5hBz$xgT@36W^=}Q>=OZ|Ki+Z)op=iOBW07yGyHZSbsY92)gpI z@Zfs9g`4WqKH$fP{zBk7Bq+C<)@xA*mR{>jvw9oxr}{>p#7P2=%hY=4fkZ2Pd_Ehrc|-qMp8fJPDW5E8k6PvE7L=4kDY@N$lZ^?A zU!m5XU=nGNFjiYLYD;lnS{g~)Tm{#7P=B_Ms+L}2UrZg9HVOCz

3~k)UbhuXJ#s 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

!C1 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≻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

^|lS)?(XPs+$Iq_8H%_3@APSn?mD_ zoISDasqP9QBb};=MFF{bmmZm|6!Kp`1e~L$jK-)dInsTd{?8Boi&T%hC-YJCS8;rE z@yzDG^XOL(yi)wOy1i^i_KaS2UA1n@oAI7?uKyyzYnBsoo;6_Ol}sT+3Lk}-oSE|X zEo&{Nmt*O?taTEUuNH`@c0mc0AhGZn=5g}{yiu_}zdBDcE3R7*5p=!bv*ZWITp4S> zny|94HH8Sl2&n>;d8Bf!!_?@+dq$JZ3vUo(JCnm6w%pOREqs_2tqS3XeUY9XV?V?x zG&M%ULfSis`bh-pXLVyj+B5BB#fJGXtD3F)gn3Z4PK;MY5@#+*-!#=8HzO@mKzR5^ z9cJlLSjwo)3`*G?9Cr~aT0ZDy=H|nq!z(AJH zMxz0Yr}saz5(oboJNtf;^d@|4O#uR0Az7mLpAXY~1#B)m_TOk0KESn>Bn3?LXV(nQ z+9K+t?=B~Wg5JrfD4m9slAK3mfFPp9Cufgd#5V}TTk83%T?QAYmW8AMIdfY7AXIT^ zoXTfshG$7I-+)Yz+}1qtYc*eOIU|^^9F&hSR5bZ0iHfsYfr%t8vDMZ*-KxJUPdx73!;@*aU~vGH-@=CzL)(k1=gr@3@>!d7TiG>h zEOvkO^Yx|N<=ok8V#05qrsz7yxo;_w!Z}Dr1f5y7BI+J*AbeUIcX=hBu9VZKp+7`6 z_BY~#$WXS3YaRJk@`D6^RD9r>(E^THGVZVuMUex*1|7+d2hzJ@r~3RWL{hoN73=_6 z&7UYfg@VX?>h!ls$MnRczi%<@s7=!70Z-@7wF;#kB#5p03w);8JGOPy{Q>2eW?$m3 zfmyg+1|Kw;BHfCh&19zZd<7~c0sJHmt!ADr)zB8c7GRY1-Q_9K;CyPlzgU_WgU)fw?Kn05Ljn75I zBECD8k9~JhUYs@Ts9mWGL2t=?wvHCYzMne#&lyf&m7mT!q0c|x2~A%Snmj|FPd$?u zM8P5^?JdT?u7gW9q^c^X?K&Ju?o(Scv}oyWWj+(8=5<>&L4_C+wQc zB8#5BdLI=zsQzvGFSj?jYjTP=!YbBz&w}uvJ$pZvGw3v;nY1A18q#Ygt}!OwcmCac z#Y&+V>+qLPdPBNew`pw);v|#ATQSxscaBq0bzYoH>bzmZFlfWZo-6?+1hA^Gj7XWQfw~pI zTAM(WpgN*~dP0`{C=DQt1hcR-4nE602N_NGB?YXNzD=A`Nd>QiQWSN0-TQ?Isr}h2 zrpF4hT)eeLz#EKD%C7TS*tXUiU|$*_Plw7Tj9F8`q?~xCsKdjaDy3x!$q2;pDgK!n zpM)jmepC(AwX4}7dE6SY0sNp|g?&GqoA1kzTA=x0y>`bP7G8$W$tuG~77Booi9WI< zEV2Z*e~xGa9+p&Z?{A)C=}8e+()CU{@BF;Xn$O2Htnj!6qBycH7K{vtC=GKGa?klk z?k5Wa$E=+Z=h%WyVCCs2cV@MoS|`!xixCD!rtTz(FUlh|U;C^}-8-V#%phPT1b6>r zVU?E6wb>Ovc^C`7iGXR(E}zF{L3Vv)WbsbMM#VcU?Ek;9A~JMog}3;y^!WEb|C3t4 z^+ui@Laj5grq3?t2Ag(w?=k)Qr~m4vPg~nk!$%c;AZzr87 zQyM07*j@+ejRc7U+0_d3$j&{t4|^gEdLuia5n0nKKcQtOh-{7R$=_CUgtj7XdN)l| z$6#Z)H1dG80a_z6uC{`VhUR+A8|7s;;u|FF`lQ^yi0bck%JIjaM2)-bu8VAf#*oWr z?|H4ofPyq68lHjr$iK+nSu;Z6Dqn7ZI(Omk39G3`6v0^_>eH|PPkj-Ew%&!U%srE1 ziEW`$WslT7FyduX^Qf`HrJB>)Mi1p$0u4HzmeZG=-EyivA(|LSdUz+_BEL~K@_M#S zXy|<#ri=u9F*W9zVn0zsIx$H*%fcpw@&meDX!KTRs@o_?!q>Lnj^ny#dCGP};|@a} zb}w1%UB@)slxP}xXw44`lOk17>73N|BD7!+F}}?D0J7fxSOY^rn4=PF(^DP*z3)mJ z3Ct}t((%K{zHUD=)ns#9xla+!nI+Kur0Nmf@l4rCmJDr1v*itR>+>^RjP>6Y>)M4> z5Qnfvwc^9hOphGU4}^6|Y1ex@m`2zt>$f?}n>)J8oSTrp82yynjYzAjO7-LmQfTz~0>TI((7^ds89mzanFNJ?jc_hk zj$5TqbB^wh3FH}Dn#0FtJQebA=993)o^l>Xm`?Yxjl;?QgqS3Q;Q2hSST4RwS2YH2 zW>))r5ZJGI3XNFhtI@mo$*a1VFGD(G;OB=zw%U9?mV=}G8JKF@HR&akK?nL_Q=D~&B?s%n{IeMF@ zg{!K>aO#n(6&$^{G3L>Y=oepK)O?fv*w8UyJ4f%)%Q;2C&!8W#7lwprAc~@ci3%B& zC3y*ODNxOWEs$!wGTIVk+rtDts2@|CxFw>zktg>Jz12n0gHd7U@;F>$TkY$r z>kZDaKR*8KyLhKj`S=Z8&@!+Nz$oR!#L!Dq({!yLPzHVY4|xAwf(6BHbkg=0t5>^J z`crQh!k!9x$KSqvDJs2S&`BR~1%Y75=i3QrQ3v0>Hhsdv4o$J_k53*dLDP%#ACQ!h z!FP*_|F@Fi)_+wpoaxmEIhXsT?Xi~^3KHjy(F6iPL^Wc|UJGHOq0@bjpuH%TDB_yt zc$HK;llU1ub~VwDofs3b0CG^W0vYNgwR_O3B~`E7_%{T(z74zIhmC93AjHDU(w?**!+;MPiYrZuR@k7k z00Ij?*6GF*;NOEBa9A?Q9(Q?UtZ{R2tSC=~E@25$J@1r)zEWM?%>)Ird;+5J08s|#Toz7E48)BbsE}|xKDaH*Wd!~lM8knVxTuZ-g1xbC zNxJtk3I7m0m5j$NEQ0El<>-*F*RU!1wM89sMD21O;oQWyb@^nyZkjMY0XaZ2f~*DymlP-*1D zAuH$Gkn-+}ewPF=+^yM_O4z0Lp(`AyWmsPQ;UWal;7_&}d(q|icawPr25({F2$xk__!&C1N*WBEBb{m=qrjM~;Itaw zv*38PzBX`nZLpMmqoS_rac&%i)4(3GQI@b_Ecr*3=@uROyKPxi`9LyI_jo1dMv+e% zpY6g5?t9QQMD_;0;?EPKHrcNuoYL-ueRX`gy#y3W@w zrHy&mxrCmD?~>it?l&^uY)#< zb&Bg!!MNqfE+|nL_g>ibXI}M-YTZ{Yyfttk-!*G`Xm5-eIAXcrVRvFL8x*EAM#>@u zqfX!E#JZo1C#pBlzgp~NV!L8=Aih{5j;YKU>kmf1Dx+x9a3hwpa44FnTzrybgdJ5$ zL0ywrhG}OYh7oPf6_agmXQ%M@ovY`!AOZgsQmB-jvT#xqLKMl*qVx4zAFHKPQ82yb zDus@N1C^6`upW{RE>nvs!h8gQqECPUhT5DL-Ro3rTfr%~jEl!+vanyZjO)qt((iA9 zlihlPm|jKn7!=Zoa|X1lz>XeM^jHFwC3IS_OtPk}86yX6oWh@=t-OsP0mQg>nfRAe zQn_bW%F6vDNLKS8>@o=N0U5VS^^K|Q?Ow5Fy>|WOEaXfNxQFxU({@DoOm!$*ucDW< zQi!PlGS%iHAfe-XEaF?9T4D%Gut{-GP*y-MbUmoo^crr7NKI|frHFF&OMaEexIu#X z&btXGS^1MbA)f!=Si!W|1G^{r?$I?Y+_4uLEVnd(5ys2BJcT zEMjJSev2>;20cT(GH!ITJu@WBf%dZWZBBeXLfS~3-(7!!sVAk>jEN)VR>Gp_ODU@ds5(xnQTyZp2?+ETRjEs#IgRE8gHq052H4;6g*g)zjU#a zq%DihazN3Mg<>U7P1fDzhto3Vd3w%j5#FIcqibEt`Ghb{3ws{QQ21COG3;;VWXgeW zTR_Ib+0&4phv6I;5v&K{!f~2b2X;?`>I8J~JL$M3Ws{2#rJ0&S2Bxf}L0!lwP6hWf zrXvtGJ{>?JT+TO0L}cwn(V-6U)>L(j@S|;S1&+Bzv`8tZ^K!;&e<@&3XatPjoNH8) zSZ%V1;O>MNStxgbD~nn|_@Hi9-3Tkb#`m^*3+Q$N{9eI=K=5ggm-Ec&+#IkXYTL|4 z_#Ea1GpLKXPArY?n0{Rj(tLCT4I^-2@*hUODv`$DwWl6BPoK1HF~hRZiEQ+QBtc<5 z))+HE4XF&k=F8dE@P0)nKkFQJS;R33`K3z7@`wwi?Jnh>+$x|R`1^$D9F0Kg_70iN z&9r5X^t~FULJ)ey=P&l#vT8QUll5+0Pr)C{sKTI=5Q6bIk`-oH{z=esRG{40&oyq( zSQh$V95lXsyb%Oq-d1Ax?fXZe+0361dwuHmVLuM?O*)*xkmT)ek~Kmn4uQBYVYz5f z(F?#>$;hcd4+?y`@n_(;xbQ<$d_eM8jC)YMbI`cL@hcH<$HO_e_X3&O0C~NOb4!G(a;0jf3TDhQxOhFj7i&=)px!+o@tR?WZ?l8 zW)9Xf?bn%tUnvy%a8OQ|Mp@J$bBGst@;b60!JcjekBuyBPqsem9^G1{ceRcT3XUjq zVhLrsDJP?*Z9=h$z4Jcb~mt;X$jgg>G_$j`W~H=>~MnI|w8ujwKvu8uAl8867}JnG*tXVaKg4_{=HL z44E-=m@JpbKu{8u-5L;=e4S=|I2#%ke%2R&O@Z$~{p!P9ueGJ;#c%f+MIVQL2L`&> zmoObZlMAK%2z+jYjc?uhKPwEl3xW|RQV*s#^R^x9Y{gMp>U#Zi1Y8(p#M^ZL_6V66e$%jimjCjO5f zKS~5fCqfQ8>fg@QZ=c^AkIT7*8bvt8ty{=bwvY{8VBurJ*IYUpEZy5D#bf&Rt&7e= zj`n^}*i2F*yiLv+OYl1pF%JrFJ>|2YmUPrSsL!va=&(O;DhrvB?B0!E(WqWOR{VXN z>9i(VPLSz1&2v;K{HFlj7p%1JCZXj93IpEUHNjeUpD$OVr+b_@BcJ)z20XgrtT7uj z9R5WPggrAI;H@eCbKBWtWB7{3elIzq{{|R$Nf|3?^iDU(fK)#I79mPkBjG0;Cy%Zq zWhClnbC-NEJz>18fXztB2xv|@C(c?%_;uI$ltmzNmbhg0Gi!1a{-HjNkOb06AxB`( z@5dEIt;nZh}hYv5Yk$-Mx%Jfl1Q+ z91E|DWk^czS%*zbwYi`Tf74}XDfM4Me!%QQQ1o|Vl(eck&muSlbz)!yd=^Z!)myJ4{}68oySL-E zHD_-uNMm@%OXawK6Qi(e7o+CyX|B8xqksGByxaKoNg?`l{PCWD5j%eC!ii0_>j$nz z?OuWzQf15WL9}z>vnjTEF6|ddc6eo-kH*&yE5(>t zp-L9%AqRCA3(E%2tooT9uT1>jhGR{6(7*YGZhUY2S)50Pf%;G>)op?zrFHa!QG`o$ zPmZZ*VMwCZ#Dx9w5kY7R&3G(F46>UeFRr;BJ!Ih*D8QVdNZsEf!qs~nU<68pmtF#x z*!aCKGcdYC6;q{sxkd|&L64Q#P5YsVbD_cwy#5AB0T33f!kov*@5~(#HZEZX850aEU}nGJR+m zRs*H&>%_QtV?&qUit$B6P34b|n`G-%WJty#ZTL^7UkX?kOgiNs^&L37x(>&9kux7bc_?aF_~(2CeYggKk$b#MIY`&F(WKg43wM$bw#NHs{I+ z$Wo#h0*?@la`8EZyG#kmSCn<>iBqc@B28RJs{!$T=4R#=#Oxal-<45zC%;AxaXB5U zocxg@sTlgMJIiH5Wk28+8CS*ZISKA7x?4BUe+b2+lP77MNg2xER>&ZxI^kLJJ1pbY~#1 zB}^tsn2zFy+rpR6gA7FW5qy=3=G0iSwF4)z^pbk5#LH4-+TOG|E39!M>*$@5BZYTp z(BgOdU*wq=Z+IIsBKb>U6uR}V^O!>#eR+NLe)&=~dn|f2Q*tdi=jCx7pCVp+b@B@{ zv_eFsbFFK7Z0)!5v(xDpd5w^+zMya1byuR&PbR)^_e^}x#z7x=DMx%c*wprWX(EI% zqNYPLUc8AVGAm-*oY9o%9emF-&PY|g+?ui(P-8lZKxaBnD!!6C7&Q9 zo;X=}u!sXXR?cf(;)v~R1ujvc^8qh4$zR}O7(T(tMa)NzB~tdtAUIDv#{k=Yr?$+UbrvZWr?j(Xeaa8o`Fs&fymu>Pato(f#*RL07puSr>$kF&>Y9EqkUC z+{er;w8BIOHIDCpaYiAIp|&x2Tk4Ipy$OsfO%si*zb=DXwMZZUfC>!}P)WhS;1jSx zY2kX9JrPL-Sp=~-LZ{$M4{qVORVF`lc$i2ETnDW<*IGuTGqe5dn3%5s=K?e2(W@a2 zx;kf=j&47B`^Q>lokY1>!sME~*V-n?Nq7@M2dYz`k?0Be}F+CDvfxoB=*?tPDM`K_kAqPkMFjz2_xA|_1j_D35&%VM8FxfPwrGwDLI^u8R_(boDMwbiT4ebhXcM`?2k!TWd=*%a*G1PcB)ki=6lDU8LnQJd<$(cWL8O9lFyzF`_i;c0;-Z5zhFCKt#Y{SZLS$89K`fhNe2 znF(9cuP-Dr?w~ZOeQFTf;)^+Qr`7HsxpiDJXisQrqd@_oMGQmbmYDpb?vQ^1MP!W& z9U^>$Vyvg3KLJ>hg^NVCAJsv-L+|!ZZKztn8=b@F({FD)s2C5M95bt#7h%1nP`N`4 zFtGj4rOddc@Zq3dKeqwc@Bb6B%^~;KHZLp0xvnkjUvXS{yS#_m3nitmPd-h`neWJi zROoMRDMy|~iFYpDT%EHY+85o4#)U`|2hErB1RrwV0oj%>E}QoAk+Q$M7)N&`UQG&z zWJwclagwrW-4u!VX~+IElddZ*AbFUE6&Qm|$+m#Xr)i}_YEJ&*Jl}b}OBVLW_91q! zt(5oatKqxv?z|H*>(^6*#MUEJ3Ut-&Gc>kzc8D8;y@Shqcu=I`vCvqC=M1`DxPO6L zm@k1@whMykiRq(vd6wRN|Ld5TAMX(?seTck9h7{ik=}l{Q4VTkD`3zgPb6P;m~?jV z>CvAgTu#PhT@s0fCwQAiI9WiHxVOhc3$vmT|NDm6dDc3~#CU9~trCO@>AwTf%2&t7 zcrklD%vm}*{5=e>@KXElNcMDH4_lYs;wx|}h$%%m5!SHpw?q6u!LmXF1(o(imqRQX zdSZqxKK!t}I3h4bb`Z#m?s^CofoQPET$e%xsmz@#;uR~t0!M2=3f3AF*A+wV3PyfC ze%N+pr3!j3kXs=~aKU*Vl@*HCm#CX3sMd*EM&H{6S!2MJ{7!oZzu7nYd|mM2eIB}R zkb`sN1?lYssU&}~6}Fmm$F_(ZV|9VEFTx2)3*WInwyU3w&x)S zj@*^)Z}!=*3jW-=|7@}W+8%q>`g}&#z~iJ5)@6Sv+I*24EA~IYhm4KVM&rL+Vi8*S z?p2GZU;boRjZNqO3UQ;*LI*0FoM)}Lj+AwkilHp_#vn%IGlhQ!Kzy|}yf-S2K`cvx z+9KLIuulyVgnV*nLG}ZS^PwQ=N~3;1?~=<*iRcIg1ZBB~o~+o)P%Mw0lkg)M6 zaA%Ah>*toHVAlGplr&PMH=kgHyyuXc5kT z^wJDF_%z94DhM)!fky(u@=lJ0gdcW7JdPKFU`8pO!$S1k+xJ)*`iUx=49B>gtzh9e zoW*=TH8NE~%!Z@isew2H*Riw146FQCTTr<+%rm`0%gK%u2|PY}Kc5?6ILm&9LzQg; z>FG&#qxsxu7fG)it0ao{Oh$jZc(EuEB}w)Tn8sno7CuQ*c1&3w&0oGUo?uZ^qnL?k zMW?_&>*kokE6mfBO;pS`O3bc9EzwT$7Y9Kx(BvqE(6|ptK#W+3cpV*Tt59ZCfeAd{ z7IOP`5vUX>W=EQ;uKn{oS5C3Jdlz3)ai4ifE6xq9KwxVk@xgO)>xymZ@l}ED>fgc- z|4*gG|1~_oE_5tzWvp=AQZQEEKZLett&}B^ebE<`uwW74i>|$cT3-z;N0}o<7$sF9Q(+@cJB9q3wbZfy{UTcICye2D@>cj_BL4o_Pam2rzDa)~5Ih`1d(-ILKmRNGV7&paFbjoNh0SQtH zggST^A2ExFgh=5ZeHw>cR(ORhNr}~5GgF}z%0-i==d_&fxWMG*!@+GmtkC9m}XDni*($(g>GJoVE#1EA#G zsC4d=zlCbhcL!l{hB_vnQtO3twp%9zJ4Z1GVKz4m;YEW3%w^JvD&z4BC0tc6qK05HuslwWfU+612L473m)x2o0ZYtaaNGoPnDE9vflxQd8{)sqrSPRZ8md8OFm0+c|T zLD2hv;aq#BJz-v&85`Z;C;ZV0Qc$Bxn4}CbpV-8XgqWJt_B)#3YRn)$+b^-i7VpCh zryGWS@{_&qkqU~6-zO)4n!E~@z9;|8h$)tZB;#P{I7DSr4`LHMk&#%+x(c_cZ>;q% zeDvDxTru9$o`Fr%*@uYfG`}A?6|;FM4vaJpOObi`%KKEMI4nV<;PG)#6o}fZp>xE@ zDV^)yhNT{@DL#Dk&P>l4WP9L1tvw#WK;+G@)XLvs8edc()B8as)m~H-7Wp&D-SXHW ziRzr7#pA1*3Dvts9K4&p*hc0=wiVsJv}G>hKMeq{x78<@1_6GGl$@`IJAq zf3mSCbR)$xVJD99(ax}~?xdAb(!$Y%0Gvd|aE(Va=kDM^oY$yPmT%yTh|ZGyGNiLF3e9tpiWXkU$jNrf~L(P?<| zi9y0yH8I0;cL(j>hfH+j8#Nv-_N4fhOU2c+(9Mw%D5ENrup04^uJEjd zUmKO25HU)CUDnC=8}Cg?gamzW#8h)9?tz8H8l;WPv%$sEO$`r>(fAP8Zr^4B8zGOn zdA2uV;lC~9m~Pjt74hpWA-+ zFw@!o_0(kjW&!v6TD?ID&L7icnI~A=8;$AK@`ZZtl5dZHaPS#g_@ULX`%v}#Z!+^8 zTOSYPWX`F5Db&AUT&=)vR_y9kTa4=J%0N` zJnc{j`Ri2PQVmqce2kx7(A$F01O7r-alo8;FI8sxuxoz5Y?xe+|1Y< z%K#U1g@mxY05%hA@sAQn4`WpTRJSmu`uJx%+uoDL+jEYXow%uS)RUhZ@UP5DbeV3Qrq6N}m+Ze_Ami)F5-6gO9BwD>*8x0Yxy84*wkyLmg+c?B%iYs#m=dgDM%P`_A)vDV+7+=iU`4!rU7>t*zslCcisdxkE>`UPB;xRb2w>Axe%JiN}hA4$fdn$LXy$~y0u=rHKQYJAoX-d$M1Qxxvh9qASZA8NNZ~U()o({cnEelRWahS~0Wn1SbT_ z@-4O8vy%=TDSxBfv*Mn)_Doc}m8c>5$joR9yoiriK8MY-GQFxvTUosjQ?BtI!Rt%| zopyFsC;-AAaha_}CylTR2%e0-QtvOF1@==5yIoe^q>-g(VqT7-kGe2Tre@n`A=--S*$YAjtHiX?A&m<+q}bA#{kiSNRvUqsc{Pgic}a7EYm z6UPdu{~|paQGZ1GWagMI8Vn3YrG6hTAIr&LcNle^HxC(cVWwf}$9u-6DQzas(dL*; zwZgBq9=D>2MO^R%&_f1=Oacm0HXYOM%E&I~TL11b^th3QQqW|zW zJ>e{Tt4tHKL}H zU8V7{qT8U;M+y9H94m>oByTWW2(Jx297670{mTJMk(20s`|MDhg|^kxtH3m!8&Mn~ zJ42=;B03Jmt8`rlHfGy>1Of<4@T5c^6sc~i8GHB}A5-k73T7;X28{a&UioQ9zTP8V zD=D9&cs?J|8oJWzxIcz!lCAOOUL>S1e3T&fjnsI9bY1>7Z1$TKy-OZ*ppdh3s3Vmk zQlcwlG<+Qq&^VaMGxpo#`2@NEC_<3|hHZQKX!wKMT&fL$gQ21vC`^Ru$3g2oM|zNQ z8e_{rvB20uJGh4|ou^SN0~(%v<%4t^uJYq=usqpy4K_Qx^2PpSrp6dJ34DN_xkE2A z5T>qp?{G{Z)vH0B&!)5+w=oD72X)0xq^2JH3JwJN>n&BCW+m`)EJ0_m>Jy`&;^TpN zGYKh$J4A@;m|VF*9_-Xxx|&M9upijs`fcq>#24$>(r=(BK<=6TT93W6_Ua`J5=r+% zw|_i4K3&~7uT%W(-tpn&(d5R(9Rx;LUT-*O^iKInoj|g5{jc5C@tXVleZIZXpSpVh zOZIBaRV``aNVhM^ZH-mJ%Mj{&>42N;QO(tEMoQp5rP}ooCtwtNoAm2uS&&Z#@OER6 zKnv;}SqLFPf=x*S!z0BDtj9!qg-ncVqgt%R@P}deJz0|*N!zEFS}tSMd9r*Wi}D|= z0IpU{4A122g!o@EL9onDpV8B)jR2m*I#HoTcW&WxKzs=eCvwV<+u=NC7-&Etp(WzK zJ*vsk@xyv3=mL5k&wf?7d;Rt4*|2-LXhNk*7o_NeRJQ3I%8PX)kp)qsfo zxYPe(@6F?(?BBle(>itvWv9qq*~*M{vy^XBmDaGmV{O#e?QU*l9>tH0>PFxjdQ;`(wy~ z1wJ{y3ImE;Qj1c{<~4vtT1@`#$v6Lut?|tJWc1a14lGZq zi_P8L{%dAacO6e1a}B8ZnTWs_nSnuA-zRIc!i3NEBlWntDvz?tu-m~&vf~_2OFc(T z3#97(S}E-iE$+3_8SRfdv8Hz9n>FIdz$;cVVes3cVsG+oCs0D9K^%8%tDRU4_uTFd zb!4m|*`BaW`wY4AjQnh+p(sYe>AUj^daSoHIz$yB&wksM>qkY8h|{mGNiYS3baEh^ z$20|G4TYt-!(Kz@QX{$uKLI zY)0v*%ceDNC29a!Wj6OK@n}nSk+IEoxnDast$QCCWEqK3i4ug#7>h%2+!P>I5*8!W zN;z$@@#Z@jSSg5~V>KwuBF7Uf)o+j$y1g&1^2_yRp9x(PJ?hzu6h{1he#XZN23jNZ z@3e4a&Ve-O4#v8BF~F+_%g|dg+g@FTc!2kG`6zLmb?Ap?>6hJyj23fJMQ(c*nK(9^gFC_j&5rYq~5mxT75t0K$pjQCa z0v19t6fd9BhOx+lPZy0YIs>cD|CrG~=S;oXE6|Zn>5l37jmfm#>B(LDEbX6H6^3Ha zGa9fI;@CCru?$rf#9rA$dk2V#HY-AP&Pa$)4QA)dda5TT4KDCSTicuxey+HK#0Z=_ zuq>^V<&6`YnqAj;k*-xp1Mm`l*;*T=46?pp=r^M9^L9GRV(Y!`D*Fh;*sXmv_dMzj zjPCGjYmg`-g?Gh5d{b6AJ3;H))7lnQ2ISiPtRf={Ncv@GFNLi9F1|MQC{~3p)fn=? z+uY%9nONx1AN-@FAovn(Hal*No_J~yy@?{0U+GqKAh-D0FoO0wGN8A%Vj*b^y__4; zzF|#n{{0_|05UZc2Kxlj=P>EcfQyaI(5h~rLxD9{Y=*t}UQXe3j$T)&j)mP7VOnpc z3a;+yjw$BAN4BLD2p3T$QWCg)m7`5ySHlJ5@2GCq#KJ6dgzkYLYgh{lC>w2+D_v4( zlhgR&&*PU!f>@dor-L&!Pdta=_{sdXESoJeBr+NCZ5Z;&jxnU)=zE;W^exQbkc_LJ zF;(%9p@F!n)k-!~9>2Ucpz3CISY$~V1XY?RP31rx%z@Q#d6O&lASXSYS|}h#RbInJ z4zRScD~XR?b5{qH*kbNc=k0&+Eql;tNTV+$II?a0BA+pp&U~L|WFs z4*Tc??{sPx!x_UwA+BcscBV@p2hB>f2scSa4Ab^0gnAbbHA@Ug*;TrP5sr<&LC|tBo7expwA) ze5Diy0Z&i8c6~5{?u2uE!=vhlM?0i}P$7gpxHYPXN~WIC_|!wy^-p%K3D?Cu_+YHK zV8Y_w%c}8M!+zP2R`~tBq&>`055(8>Sb96CiBt}WIVdE)3;yA*k4Ut&aaE*%d|Udt z+e9PbtV5^x(%#*oyx0)M1+I~v<)I*!aJtrjn1l)|d zp9kn`P)O+1dpwLP|v>(+salHJZ*wT|{z96=c zR&g2ehPOJjeN7(6%a5{tA>&m#8X?Gy%7@>c&G&W5c$n2M8~)_0wlGZKg?OYaO=*Q3 zv-6wc<1zLsR_4ho6*!Jp*h``wyG0usFUm`md|@-7ESOpK^xQYOcBl>?6Rjgbnj zdG{gY2%QSzXGSGzp85!0Pt=~R_0aVy0V{bzNdav{Z6D?d@=Yo#!^O5TP$6E+PkI`- zTddvA)ke<2=bjrBuc~)sr1Tbe+V+Tv0TvpVTz)8dz`wL4mA`7c8$3V$-11!^+0MNb~H`=!wE8guc|{mppJ4>V$_tCmRFTCUNzB0f>xykGme27L~ZxpWN9A3 z%*vPPVnbu;M*Z8LcX)c%ueflGc76X5qgO z`b{lT+B~}U7jnY~%q@4`14J;Vm_s5*7PG_Ew^jcrP>6vr2HF4YZV%HJjz zHafjHaXe1Vq(6jb*2o0*T)12OqH`Jyqy`huc3g-~%(pGk#4=00DPeIlWx_j78c-kd zZ}V2prO@b>Pc=}ccE_|>U-*m`IsZ6I<17gZ2h?Gc5rO70O#s2|#7U-(Fn@`s_DrXB zgKEK6?PCSDXF9nPx~%H3XvG`Kl)1z)%f(_yqv#Z0o~>j`#4azT)6BOE!+xBlD`5N@ z?q&~NORMkI@yuy_Lze2znJ-Db`Kon@ z>NQr}rCp_p(B0OS(Vc&8x6ymqq0B5DK-g4llqM>ai0%;=_r65kG^!Yv= zP0ic}^q|T0b88vej-Jc3ZdXQhpA_F`GII+A0O#!dPBTEibPC>(O@|{PN%+=RT zjs)B*SGiMvX?3HP<`=@q6>YX*S(CQ5d#LiA73vaRg~v>k7Zei7R+QWn9}nv8BhJ?f z@V0%lv~pn5TXk0!xuJVH|x!cE74Tf61!C|;(U*c~_+UkVbVhrw!6EY4x; zr!#UCeo|@(=e*fNNuv4&TqCll{gR&<>Z%&yjVz7jQ{Yby$LXq=-aY+P;L)R&4?qgQ zEvc(&u!r)ih-(fFz5U}8`t@?SR3-9UWn(j z&x}(qNy^Vwh7gJGCb zMUH+peG1})xNdZlT8SUULQ@$-I zQLR$6hq4(2ch@@tcJscFq$1XIwq-Uz6#8T*+JAi~47oO3neO;Y0?78oMPOiOLW@u^ zwmWm|ULsRws@7k;X?H>PTFeXTVOESnF&H%GcR@xI)>7 zFa0962h@pwb(M!1?N3p3RaI&`DoeabHYEbvqxiDu{fS^pc=xImj?GBBC}!lyjb7e% zCh!eg16VMiQ?;ZkwPlA?A7X|)XIC}_vJ1YP&eGKrtkm!zXk)lw!~ zQaXw)>z1cff6P!sYIut29g!i}bg8OzLfk~6-uRm$j8|MblBlEP$&2m@w=;+^A&BZz zF)KsTz9f6k-g}?v5yAj)XKJ63$0a3caxlrbp=;fvRoZo=n1X4PfPhN?$fK>?3#Z7lFUpREYw|0xa3RG4hj!m~%Q#$gwVyD0u^w z2hbxl;>+cDhvE$v&QU<7YP|eR3R&-}Bpd8tv12;`3~_xw($TKh2rZq*r~OQVOUMbr z4ip=SeK!Z9G_ZnsoeaMaG||vK8HIpi?d= zafB-WfR%vu#op({t=Bx#)FhUka3`Ph^=-aSs+Y%8K9$FpezFr|L7IIPe#SOnmYxid zZAoD;e`)bil~MJ+*TZRV=$ZP!y!UA<#p@o6L%FrxqBt}ZGtif_cKtEt$!HkttB5nV zd?5eYTrSR+V^Ehbh2i;pd^wtgb9G0dqOGN=SM?)P9ch8`EeChwD9hB>OqDd5lwDec z2Pp*1SUjDT{k-IE&if+s5+_TmousLUk_H`s_&w%21e)Aio??~Ocv)#^V@T5^UKvuA zfYN3E14;f7E>-4z7>ZZ#;R?vW>{F#kW*7+){W*V%`%%^JXtKq-mB=f|dX)_W z!vUFO&g9MB!%_52fzjLVlhj$S?)JNV!Z~Q*hSZWEUFW7$P|vf?jC!Lr_R2ZoiI1@h zCZWRQY%CTUA>kw4~BA$DC9`%PGP@c(`f|^M*vv3@V;tG#*Vm-dXC*a7e{aV zg|PRc;2~cHrWdLP3Xw5>sr9K@ZWCB0F%ck{OFUo|rKL=D<%Q#Q384{Df`B{PMk14) z7`Wo(NQF5Ye>{>;AOV>wHH*iwo=}|#ks|4TDm=;}AKgY^7ek9ZS9f~lLNZ(oWn(*) z=R^;71cJGO5-s|zmXWay6NbIAB#z%2qhAg_IArb;~`yx(^n?s=Hb zRtBO2T=nf=l36~b%sVPS=(ub~)V3xF5;1(^&$S96w1`VGvS1#&a^N2;Aia6?ovt%T=u)P`d)XbQ8T^QY`Lm zc$RFLoqt3i8EX-EYF(Ho+HOD5^=P8Dr=2b&gROMhagnHdS$yQ2Byk6LnS_zl6Oq8H z0UGLaiN#NpfBZd95FvN%=|ax%?vRZW-Mf8xif{j|Z$KgSL;io%6Yw`o>t1ut=(^S! zX*Nq7-|brXj>68i2%6?BBC(x$PFRY|Q{C|}F6jou%&~>828bwjBPYUJh<&}Ciw`Jo zm4z=-y+IVkRNa!v6@kZ;4woq6B+ig40t8xPa?X-N6(w+g2c%`S%&|v;dSmC-O1*!; zhqja|dsgen;24j#1i~nLXGswvx_1U5c{g{p!t+?5I1DCfG{K5W;R**Er(18ET;6-# zQLmgUiyTP%gDQC3T{s>zb(pQ^HvkP+d%eHEG3sXEr^7`p+arETXe-@+V9f8OHV@W{~nG%^7XW)tiiuXgG zfNB}GS|{6J=pwX>uI036rmFUI29O}|UCkM_mlz}PP_dTd-t*>37k)*6Tg#?w+5l0= z=ECRZ{50()uQ2QLt*^HgaH-x*r=6VzIksb%BpUWubM{ zj2EVSGqNZ&p|}Ff!(SV`en|WR9ZylvN82AC=QFsHj?nP2Cv)M&ijHU-6=AF>A`nMd z(en2<3lP2fI!YUzhk!(N)#fCN}^ zCm23*UCj{A2Gz{7<>RWaO`2sS`qYd&syK@M1Ue8-&9Lu|J+zu7Ci;?$E|W0YOT&R| zvUkks+a5zJ+}A)uT|h+<1UQj!mDGffh(-B=AzJJOjY?<(zMHUL$iV|R(Fg<($x9+l5tBIDZ%0eBd_A>DtlI-9PfNI5N5-+_bU2!orE^^qOAZ9Usm$4Bs2$ zI~#88q6brL#;mNprgzSBO&N&gakLZHzH1@6r}N&^9Fp;f9LdtG2#N79ykG~EEGv6N zA`FeL-19Sc;BLv8Fc6E;n85Dgnnyj?iCw9@;h7y@K@4Jb;=a)U{%KR5=$m7=S>Y}b zT+r%a;2e+{1u!e&0eLaApqHL+IeRT9KeOedoLmjm?j#LQ#YuScmo811utzR0XFNur zyouu{WV*Ao8R}-=aUqPhxxw>qOdSH<)SQXq1nt0OC37r{i!!poK7@$KsLKy^objnu zM@4tG1^pPJ#`Y9~tMRt6GNY?uatAgY48O!Qd z8JT#Hn1EVZehE2xfsBXgvXdzhx04hCP}~L$tQ%)ws$E# zH@Tr6@)&*I$MYAG7^sw1Q*p(@NU`?4`p3?`^f9i+DFc-lQr;CO_k1djr0SkYTUgrOwx;*KGiXCBfN_{?U}Yz42Rpn&>ODo`L7ew5mk+JX0=N=-l($VOH5 zv_cSP#xw3VrJ-WClumWQ)rj{ZTG0CqI!0qG`6GppF_kMl|D558s`1$jF5ZN8EKM-q zE-aLL;yW%REW)n4#f4th{Rz7YS-`Pz*b8jkR)|a~F)^w_F*#~_bnYiGck#JR=%tLP zO6c{{QQj>iprHV1K0mYpp+c&+Q85bR>+lsZZ6NV^$lmf-t#K!5o zO-pNEk}!^38xYNlqh~0czBF~E8~*R?lke8W?KhvF5ATsF4RGij&%0SMpkdo!v%k%? zSt@5>K`*UafX5RV*{=27^bP>) z(d7#^vEL1X-M;70C{aTGxX_eXoH!R0DgqOl<+u*H&FHei#ACrB3hv3MgzNK)R|T`Q zPoel7H|mcGTx4XS3Gd5tRj>l1Dv z_4Mh|%C3WeqHr>`v^I&{vT=+ojziI>M~(L|5p{CEJC06|x~odk+V#RT5EYX)C@jF| zVp#gL)IHdo4vvFJtzKz7u$NGr!3ZGn2Tla;~C>U+)R6^J;xHuF&iB;;c<+_nq=d?XdM3X z1tz6W6`oUAD}Vk04A26`M>4p~4ACYr+-cG5CKT-J0!vV)+Sikt%fjeV?`FhYO2a{O zb4}GyOZHR&AI~kKE2Jqt@dQ>s%9=)UR3TUtv?#PyrC}Y%T{L&K5%R;idq+|`($n`v zo0u?{0T8Gpn*hzt5A#^QR;v*qyW|k%BtgT)EKB8RC(4@ozQLusL-IszS(CdXsORWX zp#`j!n;nFNMWgGhS8k+ok7Pf^lM4V9eVIrMjlV>>V!2XF55>E9Fk zp{^#?HS|L+RVh-qJZ`gP?~NbzsgxDpUPe}m20oXv^H?>rqACQjdxVh^y+6g`WC>M6 z-c-#hTC+VWfrcAZi8rLa4ABIv=pw~+`){u!;=NFOe#X41WgP6K5KKfpA{VnHGpE1n z_}TRGG3*VAdPLxTpNgs5XG)GG<7A7{eL~O8_Z*>up8G{-cL{GdqI|NU(FhjEvDRa8 z-r^)DUw)tL9Wz3*iZ>tKP8sJW;aqevD1|X_6-b&-ib>@1+TE;uCMoNI3D=oIQeha0 zY)~qP`=^ymWB7=E%gYa6f&wFA@GynlsOLdWX*!=L-`_wiokmDeIDX}3@Xgkx5L!2;x~F;d+nppcCfN?N*W+ahcH^Cpu$;Ry zzUpV@Lw@=V&&l|+>;7d=?BzjVeoJPfFl9H;_Lwp)HEU^i!M+H@!tvDb{r6wRfE+f> zjvb_tb^Fq3*76_F;xSoyjBGks zURMSQ^iB|w#y#(fVwMn#Z%Yyxr0P$$V*k!earP_n6rXw#-8{~>oTco}6_v==1Du0c zs{{^es1JQx6Jl{GsJiJ(lJS{sq(C9fP1%&)vJs3F zEB@`riO|-Ip~P~~gxl{1GPVz*DD_aC6y^^G0Hv6AVXb0sDC_Y3e-Hr;GQOO&J0Oen|Ie|7P|(iWjhNDE(khvD*1V@n=uAUQWQlqGaU}VBT6B( zt05;&2N~^LT-$tfq)J&&CE{q8i zd`Z!TP{K^cR*FdM0LPdeJ!Pbwiy4-(7>wZvL0RvIJQm3pCQ8&<+;>%pK>i zFr%YcXpI1=Lk_@VCa+SUO=Hjq_L5QyqPpxe>=Cl519FR*J6J4+oWc`C?BpN?3Ek); z{lQ{K0f1rY3+0Kx%uiA3Ah0;-202J9M{s!r@~ai*3TA5}F5$T+lFf+Kgm-|@=`ib;oGVxXovvpXmD1A|SKLkLJo+EhebF=??G z3zM{h5dV#Y@F26lkZ$!$0lagx+PWK}WNv_=Ux@uxli6`ok@+Kzm5ZqiQ@@al-!x(N zK#Ys@RVHX^nrB$u-j%iH_FtvVPQMKeW(a0UwaFxE!ir*#Rz93qbg3pCB=44xg%v9Gn~;voyU>$ zjSC)vi`8~+FqfeWlo5r!5_Vg%x?LA&Ub7@1Kc_~x>y8*k)1QoI!yX-r zq&HbxR9Kofe^Y8qNz}xGeK4H)5!Q+#IyU+?i0Hj!dQd31;R6ZH3nmbth(_Lbt{#q_Y4jxue zj8NYiv+3qFTsqVgL!!&EyFTzK?kcoo;J4xwS`?bq3dC)mUA?AG*tGS{3cXNbHr8FR zt?Vt5H(c>}g?h0ruoy2QXqY&b#u3Q<9r`wl`*LiC88^-}IeJ7Ur7TfPj4aa*dbGcxi5V(C=!d$! z&A%F5t@L!__2giy@dZ}ag`yLmZyC7U z+X}s252Q*K86v~W7h@x$?}L=WaYRQYDv<|2r!Yo6*VU=|we8SiL%_VUX_$T(WOBLn zQyG`{H8itQ-pUs<&74uy5=%lxM|q;v-}P;DoYx?6tKQygXLW!p%2i9$JSBd`N%mD5 z?viADdye0ss(e9Vel5}2j2XM+=qt`!j-j-`KX9n(zB?N|Xi?0p!8FI2m}|qB93r+^ zUaO0>_kod3$1g-q1-k7oWaQ|wx^G93iuT$WB(-1~Ii7rX*BgGy!A-rKGgs&ktkuPS zbFT~i@ZCTkRb~rM-Vh$QYP-JBy>_^^L-HvXVqRXwFEHFr~idwu2<-^W1U|4 zzN2yF(lZ)`K)9a0_k?hF{`A%7hq{LKY7&2@Db5cUxTsj}-F%Hb8GdYBF#Q+8vn3W@ zAu#OR*1||klbSrx@aBq??Kh8wpDT4X0v}!!pc@tr#Rkkw-=111=)J=0;}mqSgontbn7+Y+NCeQS6N(0yA$Q%k1d*)$@v$6}f9-|k!50;B|TV6is z>3_!eK>#x;$x!H_87J|2g7BeJjR(B#`{J$`oLF8ITcE|Ln`tV^!m6v}0dOp5%~eLY zzF!)2X(w9;RExu}5T~z3o=M^j>7^r>T4f8$4;6^{6aSp94ORelng~+vqjd zXw3(*(8$dURIFa8v|u*8cXcd

HpX!r>2{oM-YsGI~Ox^h|y0$?|jXu$)98N9kYm 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

uQr&Lt-Z0d8y?<5Yxn*3XBa9g^ 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 fcy$u+4^TW9?4#Ifsh(hqezxYpk7S1M`{VxyLn bash ``` -注:需匹配当前EasyRec版本。 +注:\需匹配当前EasyRec版本。 ### 输入数据: diff --git a/easy_rec/python/builders/loss_builder.py b/easy_rec/python/builders/loss_builder.py index 7459372a5..ec4ab57c8 100644 --- a/easy_rec/python/builders/loss_builder.py +++ b/easy_rec/python/builders/loss_builder.py @@ -41,12 +41,18 @@ def build(loss_type, return tf.losses.mean_squared_error( labels=label, predictions=pred, weights=loss_weight, **kwargs) elif loss_type == LossType.JRC_LOSS: - alpha = 0.5 if loss_param is None else loss_param.alpha - auto_weight = False if loss_param is None else not loss_param.HasField( - 'alpha') session = kwargs.get('session_ids', None) + if loss_param is None: + return jrc_loss(label, pred, session, name=loss_name) return jrc_loss( - label, pred, session, alpha, auto_weight=auto_weight, name=loss_name) + label, + pred, + session, + loss_param.alpha, + loss_weight_strategy=loss_param.loss_weight_strategy, + sample_weights=loss_weight, + same_label_loss=loss_param.same_label_loss, + name=loss_name) elif loss_type == LossType.PAIR_WISE_LOSS: session = kwargs.get('session_ids', None) margin = 0 if loss_param is None else loss_param.margin diff --git a/easy_rec/python/compat/feature_column/feature_column_v2.py b/easy_rec/python/compat/feature_column/feature_column_v2.py index e1e4d9304..e3f7e6015 100644 --- a/easy_rec/python/compat/feature_column/feature_column_v2.py +++ b/easy_rec/python/compat/feature_column/feature_column_v2.py @@ -5193,3 +5193,13 @@ def deserialize_feature_columns(configs, custom_objects=None): deserialize_feature_column(c, custom_objects, columns_by_name) for c in configs ] + + +def is_embedding_column(fc): + if isinstance(fc, EmbeddingColumn): + return True + if isinstance(fc, fc_old._SharedEmbeddingColumn): + return True + if isinstance(fc, SharedEmbeddingColumn): + return True + return False diff --git a/easy_rec/python/layers/backbone.py b/easy_rec/python/layers/backbone.py new file mode 100644 index 000000000..893734eba --- /dev/null +++ b/easy_rec/python/layers/backbone.py @@ -0,0 +1,369 @@ +# -*- encoding:utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +import logging + +import six +import tensorflow as tf +from google.protobuf import struct_pb2 + +from easy_rec.python.layers.common_layers import EnhancedInputLayer +from easy_rec.python.layers.keras import MLP +from easy_rec.python.layers.utils import Parameter +from easy_rec.python.protos import backbone_pb2 +from easy_rec.python.utils.dag import DAG +from easy_rec.python.utils.load_class import load_keras_layer + +if tf.__version__ >= '2.0': + tf = tf.compat.v1 + + +class Package(object): + """A sub DAG of tf ops for reuse.""" + __packages = {} + + def __init__(self, config, features, input_layer, l2_reg=None): + self._config = config + self._features = features + self._input_layer = input_layer + self._l2_reg = l2_reg + self._dag = DAG() + self._name_to_blocks = {} + self.loss_dict = {} + input_feature_groups = set() + for block in config.blocks: + if len(block.inputs) == 0: + raise ValueError('block takes at least one input: %s' % block.name) + self._dag.add_node(block.name) + self._name_to_blocks[block.name] = block + layer = block.WhichOneof('layer') + if layer == 'input_layer': + if len(block.inputs) != 1: + raise ValueError('input layer `%s` takes only one input' % block.name) + one_input = block.inputs[0] + name = one_input.WhichOneof('name') + if name != 'feature_group_name': + raise KeyError( + '`feature_group_name` should be set for input layer: ' + + block.name) + input_name = one_input.feature_group_name + if not input_layer.has_group(input_name): + raise KeyError('invalid feature group name: ' + input_name) + if input_name in input_feature_groups: + logging.warning('input `%s` already exists in other block' % + input_name) + input_feature_groups.add(input_name) + + num_groups = len(input_feature_groups) + num_blocks = len(self._name_to_blocks) - num_groups + assert num_blocks > 0, 'there must be at least one block in backbone' + + num_pkg_input = 0 + for block in config.blocks: + layer = block.WhichOneof('layer') + if layer == 'input_layer': + continue + if block.name in input_feature_groups: + raise KeyError('block name can not be one of feature groups:' + + block.name) + for input_node in block.inputs: + input_type = input_node.WhichOneof('name') + if input_type == 'package_name': + num_pkg_input += 1 + continue + input_name = getattr(input_node, input_type) + if input_name in self._name_to_blocks: + assert input_name != block.name, 'input name can not equal to block name:' + input_name + self._dag.add_edge(input_name, block.name) + elif input_name not in input_feature_groups: + if input_layer.has_group(input_name): + logging.info('adding an input_layer block: ' + input_name) + new_block = backbone_pb2.Block() + new_block.name = input_name + input_cfg = backbone_pb2.Input() + input_cfg.feature_group_name = input_name + new_block.inputs.append(input_cfg) + new_block.input_layer.CopyFrom(backbone_pb2.InputLayer()) + self._name_to_blocks[input_name] = new_block + self._dag.add_node(input_name) + self._dag.add_edge(input_name, block.name) + input_feature_groups.add(input_name) + else: + raise KeyError( + 'invalid input name `%s`, must be the name of either a feature group or an another block' + % input_name) + num_groups = len(input_feature_groups) + assert num_pkg_input > 0 or num_groups > 0, 'there must be at least one input layer/feature group' + + if len(config.concat_blocks) == 0: + leaf = self._dag.all_leaves() + logging.warning( + '%s has no `concat_blocks`, try to use all leaf blocks: %s' % + (config.name, ','.join(leaf))) + self._config.concat_blocks.extend(leaf) + + Package.__packages[self._config.name] = self + + def block_input(self, config, block_outputs, training=None): + inputs = [] + for input_node in config.inputs: + input_type = input_node.WhichOneof('name') + input_name = getattr(input_node, input_type) + if input_type == 'package_name': + if input_name not in Package.__packages: + raise KeyError('package name `%s` does not exists' % input_name) + package = Package.__packages[input_name] + input_feature = package(training) + if len(package.loss_dict) > 0: + self.loss_dict.update(package.loss_dict) + elif input_name in block_outputs: + input_feature = block_outputs[input_name] + else: + raise KeyError('input name `%s` does not exists' % input_name) + + if input_node.HasField('input_slice'): + fn = eval('lambda x: x' + input_node.input_slice.strip()) + input_feature = fn(input_feature) + if input_node.HasField('input_fn'): + fn = eval(input_node.input_fn) + input_feature = fn(input_feature) + inputs.append(input_feature) + + if config.merge_inputs_into_list: + output = inputs + else: + output = merge_inputs(inputs, config.input_concat_axis, config.name) + + if config.HasField('extra_input_fn'): + fn = eval(config.extra_input_fn) + output = fn(output) + return output + + def __call__(self, is_training, **kwargs): + with tf.variable_scope(self._config.name, reuse=tf.AUTO_REUSE): + return self.call(is_training) + + def call(self, is_training): + block_outputs = {} + blocks = self._dag.topological_sort() + logging.info(self._config.name + ' topological order: ' + ','.join(blocks)) + print(self._config.name + ' topological order: ' + ','.join(blocks)) + for block in blocks: + config = self._name_to_blocks[block] + if config.layers: # sequential layers + logging.info('call sequential %d layers' % len(config.layers)) + output = self.block_input(config, block_outputs, is_training) + for layer in config.layers: + output = self.call_layer(output, layer, block, is_training) + block_outputs[block] = output + continue + # just one of layer + layer = config.WhichOneof('layer') + if layer is None: # identity layer + block_outputs[block] = self.block_input(config, block_outputs, + is_training) + elif layer == 'input_layer': + conf = config.input_layer + input_fn = EnhancedInputLayer(conf, self._input_layer, self._features) + feature_group = config.inputs[0].feature_group_name + output = input_fn(feature_group, is_training) + block_outputs[block] = output + else: + inputs = self.block_input(config, block_outputs, is_training) + output = self.call_layer(inputs, config, block, is_training) + block_outputs[block] = output + + outputs = [] + for output in self._config.concat_blocks: + if output in block_outputs: + temp = block_outputs[output] + if type(temp) in (tuple, list): + outputs.extend(temp) + else: + outputs.append(temp) + else: + raise ValueError('No output `%s` of backbone to be concat' % output) + output = merge_inputs(outputs, msg='backbone') + return output + + def call_keras_layer(self, layer_conf, inputs, name, training): + layer_cls, customize = load_keras_layer(layer_conf.class_name) + if layer_cls is None: + raise ValueError('Invalid keras layer class name: ' + + layer_conf.class_name) + + param_type = layer_conf.WhichOneof('params') + if customize: + if param_type is None or param_type == 'st_params': + params = Parameter(layer_conf.st_params, True, l2_reg=self._l2_reg) + else: + pb_params = getattr(layer_conf, param_type) + params = Parameter(pb_params, False, l2_reg=self._l2_reg) + layer = layer_cls(params, name=name) + kwargs = {'loss_dict': self.loss_dict} + return layer(inputs, training=training, **kwargs) + else: # internal keras layer + if param_type is None: + layer = layer_cls(name=name) + else: + assert param_type == 'st_params', 'internal keras layer only support st_params' + try: + kwargs = convert_to_dict(layer_conf.st_params) + logging.info('call %s layer with params %r' % + (layer_conf.class_name, kwargs)) + layer = layer_cls(name=name, **kwargs) + except TypeError as e: + logging.warning(e) + args = map(format_value, layer_conf.st_params.values()) + logging.info('try to call %s layer with params %r' % + (layer_conf.class_name, args)) + layer = layer_cls(*args, name=name) + try: + return layer(inputs, training=training) + except TypeError: + return layer(inputs) + + def call_layer(self, inputs, config, name, training): + layer_name = config.WhichOneof('layer') + if layer_name == 'keras_layer': + return self.call_keras_layer(config.keras_layer, inputs, name, training) + if layer_name == 'lambda': + conf = getattr(config, 'lambda') + fn = eval(conf.expression) + return fn(inputs) + if layer_name == 'repeat': + conf = config.repeat + n_loop = conf.num_repeat + outputs = [] + for i in range(n_loop): + name_i = '%s_%d' % (name, i) + output = self.call_keras_layer(conf.keras_layer, inputs, name_i, + training) + outputs.append(output) + if len(outputs) == 1: + return outputs[0] + if conf.HasField('output_concat_axis'): + return tf.concat(outputs, conf.output_concat_axis) + return outputs + if layer_name == 'recurrent': + conf = config.recurrent + fixed_input_index = -1 + if conf.HasField('fixed_input_index'): + fixed_input_index = conf.fixed_input_index + if fixed_input_index >= 0: + assert type(inputs) in (tuple, list), '%s inputs must be a list' + output = inputs + for i in range(conf.num_steps): + name_i = '%s_%d' % (name, i) + layer = conf.keras_layer + output_i = self.call_keras_layer(layer, output, name_i, training) + if fixed_input_index >= 0: + j = 0 + for idx in range(len(output)): + if idx == fixed_input_index: + continue + if type(output_i) in (tuple, list): + output[idx] = output_i[j] + else: + output[idx] = output_i + j += 1 + else: + output = output_i + if fixed_input_index >= 0: + del output[fixed_input_index] + if len(output) == 1: + return output[0] + return output + return output + + raise NotImplementedError('Unsupported backbone layer:' + layer_name) + + +class Backbone(object): + """Configurable Backbone Network.""" + + def __init__(self, config, features, input_layer, l2_reg=None): + self._config = config + self._l2_reg = l2_reg + self.loss_dict = {} + for pkg in config.packages: + Package(pkg, features, input_layer, l2_reg) + + main_pkg = backbone_pb2.BlockPackage() + main_pkg.name = 'backbone' + main_pkg.blocks.MergeFrom(config.blocks) + main_pkg.concat_blocks.extend(config.concat_blocks) + self._main_pkg = Package(main_pkg, features, input_layer, l2_reg) + + def __call__(self, is_training, **kwargs): + output = self._main_pkg(is_training, **kwargs) + if len(self._main_pkg.loss_dict) > 0: + self.loss_dict = self._main_pkg.loss_dict + + if self._config.HasField('top_mlp'): + params = Parameter.make_from_pb(self._config.top_mlp) + params.l2_regularizer = self._l2_reg + final_mlp = MLP(params, name='backbone_top_mlp') + output = final_mlp(output, training=is_training) + return output + + @classmethod + def wide_embed_dim(cls, config): + wide_embed_dim = None + for pkg in config.packages: + wide_embed_dim = get_wide_embed_dim(pkg.blocks, wide_embed_dim) + return get_wide_embed_dim(config.blocks, wide_embed_dim) + + +def get_wide_embed_dim(blocks, wide_embed_dim=None): + for block in blocks: + layer = block.WhichOneof('layer') + if layer == 'input_layer': + if block.input_layer.HasField('wide_output_dim'): + wide_dim = block.input_layer.wide_output_dim + if wide_embed_dim: + assert wide_embed_dim == wide_dim, 'wide_output_dim must be consistent' + else: + wide_embed_dim = wide_dim + return wide_embed_dim + + +def merge_inputs(inputs, axis=-1, msg=''): + if len(inputs) == 0: + raise ValueError('no inputs to be concat:' + msg) + if len(inputs) == 1: + return inputs[0] + + from functools import reduce + if all(map(lambda x: type(x) == list, inputs)): + # merge multiple lists into a list + return reduce(lambda x, y: x + y, inputs) + + if any(map(lambda x: type(x) == list, inputs)): + logging.warning('%s: try to merge inputs into list' % msg) + return reduce(lambda x, y: x + y, + [e if type(e) == list else [e] for e in inputs]) + + if axis != -1: + logging.info('concat inputs %s axis=%d' % (msg, axis)) + return tf.concat(inputs, axis=axis) + + +def format_value(value): + value_type = type(value) + if value_type == six.text_type: + return str(value) + if value_type == float: + int_v = int(value) + return int_v if int_v == value else value + if value_type == struct_pb2.ListValue: + return map(format_value, value) + if value_type == struct_pb2.Struct: + return convert_to_dict(value) + return value + + +def convert_to_dict(struct): + kwargs = {} + for key, value in struct.items(): + kwargs[str(key)] = format_value(value) + return kwargs diff --git a/easy_rec/python/layers/cmbf.py b/easy_rec/python/layers/cmbf.py index b633bac2b..e5f1caeb2 100644 --- a/easy_rec/python/layers/cmbf.py +++ b/easy_rec/python/layers/cmbf.py @@ -33,7 +33,8 @@ def __init__(self, model_config, feature_configs, features, cmbf_config, has_feature = True self._txt_seq_features = None if input_layer.has_group('text'): - self._txt_seq_features = input_layer(features, 'text', is_combine=False) + self._txt_seq_features, _, _ = input_layer( + features, 'text', is_combine=False) has_feature = True self._other_features = None if input_layer.has_group('other'): # e.g. statistical feature diff --git a/easy_rec/python/layers/common_layers.py b/easy_rec/python/layers/common_layers.py index 165fce5e1..fae4fe3fc 100644 --- a/easy_rec/python/layers/common_layers.py +++ b/easy_rec/python/layers/common_layers.py @@ -1,8 +1,12 @@ # -*- encoding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. +import six import tensorflow as tf +from easy_rec.python.compat.layers import layer_norm as tf_layer_norm +from easy_rec.python.utils.activation import get_activation + if tf.__version__ >= '2.0': tf = tf.compat.v1 @@ -14,6 +18,8 @@ def highway(x, scope='highway', dropout=0.0, reuse=None): + if isinstance(activation, six.string_types): + activation = get_activation(activation) with tf.variable_scope(scope, reuse): if size is None: size = x.shape.as_list()[-1] @@ -61,3 +67,80 @@ def text_cnn(x, pool_flat = tf.concat( pooled_outputs, 1) # shape: (batch_size, num_filters * len(filter_sizes)) return pool_flat + + +def layer_norm(input_tensor, name=None, reuse=None): + """Run layer normalization on the last dimension of the tensor.""" + return tf_layer_norm( + inputs=input_tensor, + begin_norm_axis=-1, + begin_params_axis=-1, + reuse=reuse, + scope=name) + + +class EnhancedInputLayer(object): + """Enhance the raw input layer.""" + + def __init__(self, config, input_layer, feature_dict): + if config.do_batch_norm and config.do_layer_norm: + raise ValueError( + 'can not do batch norm and layer norm for input layer at the same time' + ) + self._config = config + self._input_layer = input_layer + self._feature_dict = feature_dict + + def __call__(self, group, is_training, **kwargs): + with tf.name_scope('input_' + group): + return self.call(group, is_training) + + def call(self, group, is_training): + if self._config.output_seq_and_normal_feature: + seq_features, target_feature, target_features = self._input_layer( + self._feature_dict, group, is_combine=False) + return seq_features, target_features + + features, feature_list = self._input_layer(self._feature_dict, group) + num_features = len(feature_list) + + do_ln = self._config.do_layer_norm + do_bn = self._config.do_batch_norm + do_feature_dropout = is_training and 0.0 < self._config.feature_dropout_rate < 1.0 + if do_feature_dropout: + keep_prob = 1.0 - self._config.feature_dropout_rate + bern = tf.distributions.Bernoulli(probs=keep_prob, dtype=tf.float32) + mask = bern.sample(num_features) + elif do_bn: + features = tf.layers.batch_normalization(features, training=is_training) + elif do_ln: + features = layer_norm(features) + + do_dropout = 0.0 < self._config.dropout_rate < 1.0 + if do_feature_dropout or do_ln or do_bn or do_dropout: + for i in range(num_features): + fea = feature_list[i] + if self._config.do_batch_norm: + fea = tf.layers.batch_normalization(fea, training=is_training) + elif self._config.do_layer_norm: + fea = layer_norm(fea) + if do_dropout: + fea = tf.layers.dropout( + fea, self._config.dropout_rate, training=is_training) + if do_feature_dropout: + fea = tf.div(fea, keep_prob) * mask[i] + feature_list[i] = fea + if do_feature_dropout: + features = tf.concat(feature_list, axis=-1) + + if do_dropout and not do_feature_dropout: + features = tf.layers.dropout( + features, self._config.dropout_rate, training=is_training) + + if self._config.only_output_feature_list: + return feature_list + if self._config.only_output_3d_tensor: + return tf.stack(feature_list, axis=1) + if self._config.output_2d_tensor_and_feature_list: + return features, feature_list + return features diff --git a/easy_rec/python/layers/input_layer.py b/easy_rec/python/layers/input_layer.py index 92ed236db..914f977fa 100644 --- a/easy_rec/python/layers/input_layer.py +++ b/easy_rec/python/layers/input_layer.py @@ -19,10 +19,7 @@ from easy_rec.python.utils import conditional from easy_rec.python.utils import shape_utils -from easy_rec.python.compat.feature_column.feature_column_v2 import EmbeddingColumn # NOQA -from easy_rec.python.compat.feature_column.feature_column_v2 import SharedEmbeddingColumn # NOQA - -from easy_rec.python.compat.feature_column.feature_column import _SharedEmbeddingColumn # NOQA +from easy_rec.python.compat.feature_column.feature_column_v2 import is_embedding_column # NOQA class InputLayer(object): @@ -72,6 +69,119 @@ def __init__(self, def has_group(self, group_name): return group_name in self._feature_groups + def get_combined_feature(self, features, group_name, is_dict=False): + """Get combined features by group_name. + + Args: + features: input tensor dict + group_name: feature_group name + is_dict: whether to return group_features in dict + + Return: + features: all features concatenate together + group_features: list of features + feature_name_to_output_tensors: dict, feature_name to feature_value, only present when is_dict is True + """ + feature_name_to_output_tensors = {} + negative_sampler = self._feature_groups[group_name]._config.negative_sampler + + place_on_cpu = os.getenv('place_embedding_on_cpu') + place_on_cpu = eval(place_on_cpu) if place_on_cpu else False + with conditional(self._is_predicting and place_on_cpu, + ops.device('/CPU:0')): + concat_features, group_features = self.single_call_input_layer( + features, group_name, feature_name_to_output_tensors) + if group_name in self._group_name_to_seq_features: + # for target attention + group_seq_arr = self._group_name_to_seq_features[group_name] + concat_features, all_seq_fea = self.sequence_feature_layer( + features, + concat_features, + group_seq_arr, + feature_name_to_output_tensors, + negative_sampler=negative_sampler, + scope_name=group_name) + group_features.extend(all_seq_fea) + for col, fea in zip(group_seq_arr, all_seq_fea): + feature_name_to_output_tensors['seq_fea/' + col.group_name] = fea + all_seq_fea = array_ops.concat(all_seq_fea, axis=-1) + concat_features = array_ops.concat([concat_features, all_seq_fea], + axis=-1) + if is_dict: + return concat_features, group_features, feature_name_to_output_tensors + else: + return concat_features, group_features + + def get_plain_feature(self, features, group_name): + """Get plain features by group_name. Exclude sequence features. + + Args: + features: input tensor dict + group_name: feature_group name + + Return: + features: all features concatenate together + group_features: list of features + """ + assert group_name in self._feature_groups, 'invalid group_name[%s], list: %s' % ( + group_name, ','.join([x for x in self._feature_groups])) + + feature_group = self._feature_groups[group_name] + group_columns, _ = feature_group.select_columns(self._fc_parser) + if not group_columns: + return None, [] + + cols_to_output_tensors = OrderedDict() + output_features = feature_column.input_layer( + features, group_columns, cols_to_output_tensors=cols_to_output_tensors) + group_features = [cols_to_output_tensors[x] for x in group_columns] + + embedding_reg_lst = [] + for col, val in cols_to_output_tensors.items(): + if is_embedding_column(col): + embedding_reg_lst.append(val) + regularizers.apply_regularization( + self._embedding_regularizer, weights_list=embedding_reg_lst) + return output_features, group_features + + def get_sequence_feature(self, features, group_name): + """Get sequence features by group_name. Exclude plain features. + + Args: + features: input tensor dict + group_name: feature_group name + + Return: + seq_features: list of sequence features, each element is a tuple: + 3d embedding tensor (batch_size, max_seq_len, embedding_dimension), + 1d sequence length tensor. + """ + assert group_name in self._feature_groups, 'invalid group_name[%s], list: %s' % ( + group_name, ','.join([x for x in self._feature_groups])) + + if self._variational_dropout_config is not None: + raise ValueError( + 'variational dropout is not supported in not combined mode now.') + + feature_group = self._feature_groups[group_name] + _, group_seq_columns = feature_group.select_columns(self._fc_parser) + + embedding_reg_lst = [] + builder = feature_column._LazyBuilder(features) + seq_features = [] + for fc in group_seq_columns: + with variable_scope.variable_scope('input_layer/' + + fc.categorical_column.name): + tmp_embedding, tmp_seq_len = fc._get_sequence_dense_tensor(builder) + if fc.max_seq_length > 0: + tmp_embedding, tmp_seq_len = shape_utils.truncate_sequence( + tmp_embedding, tmp_seq_len, fc.max_seq_length) + seq_features.append((tmp_embedding, tmp_seq_len)) + embedding_reg_lst.append(tmp_embedding) + regularizers.apply_regularization( + self._embedding_regularizer, weights_list=embedding_reg_lst) + return seq_features + def __call__(self, features, group_name, is_combine=True, is_dict=False): """Get features by group_name. @@ -94,62 +204,18 @@ def __call__(self, features, group_name, is_combine=True, is_dict=False): """ assert group_name in self._feature_groups, 'invalid group_name[%s], list: %s' % ( group_name, ','.join([x for x in self._feature_groups])) - feature_name_to_output_tensors = {} - negative_sampler = self._feature_groups[group_name]._config.negative_sampler if is_combine: - place_on_cpu = os.getenv('place_embedding_on_cpu') - place_on_cpu = eval(place_on_cpu) if place_on_cpu else False - with conditional(self._is_predicting and place_on_cpu, - ops.device('/CPU:0')): - concat_features, group_features = self.single_call_input_layer( - features, group_name, feature_name_to_output_tensors) - if group_name in self._group_name_to_seq_features: - # for target attention - group_seq_arr = self._group_name_to_seq_features[group_name] - concat_features, all_seq_fea = self.sequence_feature_layer( - features, - concat_features, - group_seq_arr, - feature_name_to_output_tensors, - negative_sampler=negative_sampler, - scope_name=group_name) - group_features.extend(all_seq_fea) - for col, fea in zip(group_seq_arr, all_seq_fea): - feature_name_to_output_tensors['seq_fea/' + col.group_name] = fea - all_seq_fea = array_ops.concat(all_seq_fea, axis=-1) - concat_features = array_ops.concat([concat_features, all_seq_fea], - axis=-1) - if is_dict: - return concat_features, group_features, feature_name_to_output_tensors - else: - return concat_features, group_features - else: # return sequence feature in raw format instead of combine them - if self._variational_dropout_config is not None: - raise ValueError( - 'variational dropout is not supported in not combined mode now.') - - feature_group = self._feature_groups[group_name] - group_columns, group_seq_columns = feature_group.select_columns( - self._fc_parser) - - assert len(group_columns) == 0, \ - 'there are none sequence columns: %s' % str(group_columns) - - builder = feature_column._LazyBuilder(features) - seq_features = [] - embedding_reg_lst = [] - for fc in group_seq_columns: - with variable_scope.variable_scope('input_layer/' + - fc.categorical_column.name): - tmp_embedding, tmp_seq_len = fc._get_sequence_dense_tensor(builder) - if fc.max_seq_length > 0: - tmp_embedding, tmp_seq_len = shape_utils.truncate_sequence( - tmp_embedding, tmp_seq_len, fc.max_seq_length) - seq_features.append((tmp_embedding, tmp_seq_len)) - embedding_reg_lst.append(tmp_embedding) - regularizers.apply_regularization( - self._embedding_regularizer, weights_list=embedding_reg_lst) - return seq_features + return self.get_combined_feature(features, group_name, is_dict) + + # return sequence feature in raw format instead of combine them + place_on_cpu = os.getenv('place_embedding_on_cpu') + place_on_cpu = eval(place_on_cpu) if place_on_cpu else False + with conditional(self._is_predicting and place_on_cpu, + ops.device('/CPU:0')): + seq_features = self.get_sequence_feature(features, group_name) + plain_features, feature_list = self.get_plain_feature( + features, group_name) + return seq_features, plain_features, feature_list def single_call_input_layer(self, features, @@ -178,12 +244,8 @@ def single_call_input_layer(self, group_columns, cols_to_output_tensors=cols_to_output_tensors, feature_name_to_output_tensors=feature_name_to_output_tensors) - # embedding_reg_lst = [output_features] + embedding_reg_lst = [] - for col, val in cols_to_output_tensors.items(): - if isinstance(col, EmbeddingColumn) or isinstance(col, - SharedEmbeddingColumn): - embedding_reg_lst.append(val) builder = feature_column._LazyBuilder(features) seq_features = [] for column in sorted(group_seq_columns, key=lambda x: x.name): @@ -243,9 +305,12 @@ def single_call_input_layer(self, group_features = [cols_to_output_tensors[x] for x in group_columns] + \ [cols_to_output_tensors[x] for x in group_seq_columns] - if embedding_reg_lst: - regularizers.apply_regularization( - self._embedding_regularizer, weights_list=embedding_reg_lst) + for fc, val in cols_to_output_tensors.items(): + if is_embedding_column(fc): + embedding_reg_lst.append(val) + if embedding_reg_lst: + regularizers.apply_regularization( + self._embedding_regularizer, weights_list=embedding_reg_lst) return concat_features, group_features def get_wide_deep_dict(self): diff --git a/easy_rec/python/layers/keras/__init__.py b/easy_rec/python/layers/keras/__init__.py new file mode 100644 index 000000000..cd1c5bff3 --- /dev/null +++ b/easy_rec/python/layers/keras/__init__.py @@ -0,0 +1,16 @@ +from .blocks import MLP +from .blocks import Gate +from .blocks import Highway +from .bst import BST +from .din import DIN +from .fibinet import BiLinear +from .fibinet import FiBiNet +from .fibinet import SENet +from .interaction import FM +from .interaction import Cross +from .interaction import DotInteraction +from .mask_net import MaskBlock +from .mask_net import MaskNet +from .multi_task import MMoE +from .numerical_embedding import AutoDisEmbedding +from .numerical_embedding import PeriodicEmbedding diff --git a/easy_rec/python/layers/keras/blocks.py b/easy_rec/python/layers/keras/blocks.py new file mode 100644 index 000000000..928329d16 --- /dev/null +++ b/easy_rec/python/layers/keras/blocks.py @@ -0,0 +1,164 @@ +# -*- encoding:utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +"""Convenience blocks for building models.""" +import logging + +import tensorflow as tf + +from easy_rec.python.utils.activation import get_activation + +if tf.__version__ >= '2.0': + tf = tf.compat.v1 + + +class MLP(tf.keras.layers.Layer): + """Sequential multi-layer perceptron (MLP) block. + + Attributes: + units: Sequential list of layer sizes. + use_bias: Whether to include a bias term. + activation: Type of activation to use on all except the last layer. + final_activation: Type of activation to use on last layer. + **kwargs: Extra args passed to the Keras Layer base class. + """ + + def __init__(self, params, name='mlp', **kwargs): + super(MLP, self).__init__(name=name, **kwargs) + params.check_required('hidden_units') + use_bn = params.get_or_default('use_bn', True) + use_final_bn = params.get_or_default('use_final_bn', True) + use_bias = params.get_or_default('use_bias', True) + dropout_rate = list(params.get_or_default('dropout_ratio', [])) + activation = params.get_or_default('activation', 'relu') + initializer = params.get_or_default('initializer', 'he_uniform') + final_activation = params.get_or_default('final_activation', None) + use_bn_after_act = params.get_or_default('use_bn_after_activation', False) + units = list(params.hidden_units) + logging.info( + 'MLP(%s) units: %s, dropout: %r, activate=%s, use_bn=%r, final_bn=%r,' + ' final_activate=%s, bias=%r, initializer=%s, bn_after_activation=%r' % + (name, units, dropout_rate, activation, use_bn, use_final_bn, + final_activation, use_bias, initializer, use_bn_after_act)) + assert len(units) > 0, 'MLP(%s) takes at least one hidden units' % name + + num_dropout = len(dropout_rate) + self._sub_layers = [] + for i, num_units in enumerate(units[:-1]): + name = 'dnn_%d' % i + drop_rate = dropout_rate[i] if i < num_dropout else 0.0 + self.add_rich_layer(num_units, use_bn, drop_rate, activation, initializer, + use_bias, use_bn_after_act, name, + params.l2_regularizer) + + n = len(units) - 1 + drop_rate = dropout_rate[n] if num_dropout > n else 0.0 + name = 'dnn_%d' % n + self.add_rich_layer(units[-1], use_final_bn, drop_rate, final_activation, + initializer, use_bias, use_bn_after_act, name, + params.l2_regularizer) + + def add_rich_layer(self, + num_units, + use_bn, + dropout_rate, + activation, + initializer, + use_bias=True, + use_bn_after_activation=False, + name='mlp', + l2_reg=None): + + def batch_norm(x, training): + return tf.layers.batch_normalization( + x, training=training, name='%s/%s/bn' % (self.name, name)) + + act_fn = get_activation(activation) + if use_bn and not use_bn_after_activation: + dense = tf.keras.layers.Dense( + units=num_units, + use_bias=use_bias, + kernel_initializer=initializer, + kernel_regularizer=l2_reg, + name=name) + self._sub_layers.append(dense) + + # bn = tf.keras.layers.BatchNormalization(name='%s/bn' % name) + # keras BN layer have a stale issue on some versions of tf + self._sub_layers.append(batch_norm) + act = tf.keras.layers.Activation(act_fn, name='%s/act' % name) + self._sub_layers.append(act) + else: + dense = tf.keras.layers.Dense( + num_units, + activation=act_fn, + use_bias=use_bias, + kernel_initializer=initializer, + kernel_regularizer=l2_reg, + name=name) + self._sub_layers.append(dense) + if use_bn and use_bn_after_activation: + self._sub_layers.append(batch_norm) + + if 0.0 < dropout_rate < 1.0: + dropout = tf.keras.layers.Dropout(dropout_rate, name='%s/dropout' % name) + self._sub_layers.append(dropout) + elif dropout_rate >= 1.0: + raise ValueError('invalid dropout_ratio: %.3f' % dropout_rate) + + def call(self, x, training=None, **kwargs): + """Performs the forward computation of the block.""" + from inspect import isfunction + for layer in self._sub_layers: + if isfunction(layer): + x = layer(x, training=training) + else: + cls = layer.__class__.__name__ + if cls in ('Dropout', 'BatchNormalization'): + x = layer(x, training=training) + else: + x = layer(x) + return x + + +class Highway(tf.keras.layers.Layer): + + def __init__(self, params, name='highway', **kwargs): + super(Highway, self).__init__(name, **kwargs) + params.check_required('emb_size') + self.emb_size = params.emb_size + self.num_layers = params.get_or_default('num_layers', 1) + self.activation = params.get_or_default('activation', 'gelu') + self.dropout_rate = params.get_or_default('dropout_rate', 0.0) + + def call(self, inputs, training=None, **kwargs): + from easy_rec.python.layers.common_layers import highway + return highway( + inputs, + self.emb_size, + activation=self.activation, + num_layers=self.num_layers, + dropout=self.dropout_rate if training else 0.0) + + +class Gate(tf.keras.layers.Layer): + """Weighted sum gate.""" + + def __init__(self, params, name='gate', **kwargs): + super(Gate, self).__init__(name, **kwargs) + self.weight_index = params.get_or_default('weight_index', 0) + + def call(self, inputs, **kwargs): + assert len( + inputs + ) > 1, 'input of Gate layer must be a list containing at least 2 elements' + weights = inputs[self.weight_index] + j = 0 + for i, x in enumerate(inputs): + if i == self.weight_index: + continue + if j == 0: + output = weights[:, j, None] * x + else: + output += weights[:, j, None] * x + j += 1 + return output diff --git a/easy_rec/python/layers/keras/bst.py b/easy_rec/python/layers/keras/bst.py new file mode 100644 index 000000000..020a06d59 --- /dev/null +++ b/easy_rec/python/layers/keras/bst.py @@ -0,0 +1,97 @@ +# -*- encoding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +import tensorflow as tf +from tensorflow.python.keras.layers import Layer + +from easy_rec.python.layers import multihead_cross_attention +from easy_rec.python.utils.activation import get_activation +from easy_rec.python.utils.shape_utils import get_shape_list + + +class BST(Layer): + + def __init__(self, params, name='bst', l2_reg=None, **kwargs): + super(BST, self).__init__(name=name, **kwargs) + self.l2_reg = l2_reg + self.config = params.get_pb_config() + + def encode(self, seq_input, max_position): + seq_fea = multihead_cross_attention.embedding_postprocessor( + seq_input, + position_embedding_name=self.name + '/position_embeddings', + max_position_embeddings=max_position, + reuse_position_embedding=tf.AUTO_REUSE) + + n = tf.count_nonzero(seq_input, axis=-1) + seq_mask = tf.cast(n > 0, tf.int32) + + attention_mask = multihead_cross_attention.create_attention_mask_from_input_mask( + from_tensor=seq_fea, to_mask=seq_mask) + + hidden_act = get_activation(self.config.hidden_act) + attention_fea = multihead_cross_attention.transformer_encoder( + seq_fea, + hidden_size=self.config.hidden_size, + num_hidden_layers=self.config.num_hidden_layers, + num_attention_heads=self.config.num_attention_heads, + attention_mask=attention_mask, + intermediate_size=self.config.intermediate_size, + intermediate_act_fn=hidden_act, + hidden_dropout_prob=self.config.hidden_dropout_prob, + attention_probs_dropout_prob=self.config.attention_probs_dropout_prob, + initializer_range=self.config.initializer_range, + name=self.name + '/transformer', + reuse=tf.AUTO_REUSE) + # attention_fea shape: [batch_size, seq_length, hidden_size] + out_fea = attention_fea[:, 0, :] # target feature + print('bst output shape:', out_fea.shape) + return out_fea + + def call(self, inputs, training=None, **kwargs): + seq_features, target_features = inputs + assert len(seq_features) > 0, '[%s] sequence feature is empty' % self.name + if not training: + self.config.hidden_dropout_prob = 0.0 + self.config.attention_probs_dropout_prob = 0.0 + + seq_embeds = [seq_fea for seq_fea, _ in seq_features] + + max_position = self.config.max_position_embeddings + # max_seq_len: the max sequence length in current mini-batch, all sequences are padded to this length + batch_size, max_seq_len, _ = get_shape_list(seq_features[0][0], 3) + valid_len = tf.assert_less_equal( + max_seq_len, + max_position, + message='sequence length is greater than `max_position_embeddings`:' + + str(max_position) + ' in feature group:' + self.name) + with tf.control_dependencies([valid_len]): + # seq_input: [batch_size, seq_len, embed_size] + seq_input = tf.concat(seq_embeds, axis=-1) + if len(target_features) > 0: + max_position += 1 + + seq_embed_size = seq_input.shape.as_list()[-1] + if seq_embed_size != self.config.hidden_size: + seq_input = tf.layers.dense( + seq_input, + self.config.hidden_size, + activation=tf.nn.relu, + kernel_regularizer=self.l2_reg) + + if len(target_features) > 0: + target_feature = tf.concat(target_features, axis=-1) + target_size = target_feature.shape.as_list()[-1] + assert seq_embed_size == target_size, 'the embedding size of sequence and target item is not equal' \ + ' in feature group:' + self.name + if target_size != self.config.hidden_size: + target_feature = tf.layers.dense( + target_feature, + self.config.hidden_size, + activation=tf.nn.relu, + kernel_regularizer=self.l2_reg) + # target_feature: [batch_size, 1, embed_size] + target_feature = tf.expand_dims(target_feature, 1) + # seq_input: [batch_size, seq_len+1, embed_size] + seq_input = tf.concat([target_feature, seq_input], axis=1) + + return self.encode(seq_input, max_position) diff --git a/easy_rec/python/layers/keras/din.py b/easy_rec/python/layers/keras/din.py new file mode 100644 index 000000000..cee57ac90 --- /dev/null +++ b/easy_rec/python/layers/keras/din.py @@ -0,0 +1,73 @@ +# -*- encoding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +import logging + +import tensorflow as tf +from tensorflow.python.keras.layers import Layer + +from easy_rec.python.layers import dnn +from easy_rec.python.utils.shape_utils import get_shape_list + + +class DIN(Layer): + + def __init__(self, params, name='din', l2_reg=None, **kwargs): + super(DIN, self).__init__(name=name, **kwargs) + self.l2_reg = l2_reg + self.config = params.get_pb_config() + + def call(self, inputs, training=None, **kwargs): + seq_features, target_features = inputs + assert len(seq_features) > 0, '[%s] sequence feature is empty' % self.name + assert len(target_features) > 0, '[%s] target feature is empty' % self.name + + query = tf.concat(target_features, axis=-1) + seq_input = [seq_fea for seq_fea, _ in seq_features] + keys = tf.concat(seq_input, axis=-1) + + query_emb_size = int(query.shape[-1]) + seq_emb_size = keys.shape.as_list()[-1] + if query_emb_size != seq_emb_size: + logging.info( + ' the embedding size of sequence [%d] and target item [%d] is not equal' + ' in feature group: %s', seq_emb_size, query_emb_size, self.name) + if query_emb_size < seq_emb_size: + query = tf.pad(query, [[0, 0], [0, seq_emb_size - query_emb_size]]) + else: + assert False, 'the embedding size of target item is larger than the one of sequence' + + batch_size, max_seq_len, _ = get_shape_list(keys, 3) + queries = tf.tile(tf.expand_dims(query, 1), [1, max_seq_len, 1]) + din_all = tf.concat([queries, keys, queries - keys, queries * keys], + axis=-1) + din_layer = dnn.DNN( + self.config.attention_dnn, + self.l2_reg, + self.name + '/din_attention', + training, + last_layer_no_activation=True, + last_layer_no_batch_norm=True) + output = din_layer(din_all) # [B, L, 1] + scores = tf.transpose(output, [0, 2, 1]) # [B, 1, L] + + seq_len = seq_features[0][1] + seq_mask = tf.sequence_mask(seq_len, max_seq_len, dtype=tf.bool) + seq_mask = tf.expand_dims(seq_mask, 1) + paddings = tf.ones_like(scores) * (-2**32 + 1) + scores = tf.where(seq_mask, scores, paddings) # [B, 1, L] + if self.config.attention_normalizer == 'softmax': + scores = tf.nn.softmax(scores) # (B, 1, L) + elif self.config.attention_normalizer == 'sigmoid': + scores = scores / (seq_emb_size**0.5) + scores = tf.nn.sigmoid(scores) + else: + raise ValueError('unsupported attention normalizer: ' + + self.config.attention_normalizer) + + if query_emb_size < seq_emb_size: + keys = keys[:, :, :query_emb_size] # [B, L, E] + output = tf.squeeze(tf.matmul(scores, keys), axis=[1]) + if self.config.need_target_feature: + output = tf.concat([output, query], axis=-1) + print('din output shape:', output.shape) + return output diff --git a/easy_rec/python/layers/keras/fibinet.py b/easy_rec/python/layers/keras/fibinet.py new file mode 100644 index 000000000..98cdb3179 --- /dev/null +++ b/easy_rec/python/layers/keras/fibinet.py @@ -0,0 +1,245 @@ +# -*- encoding:utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +import itertools +import logging + +import tensorflow as tf + +from easy_rec.python.layers.common_layers import layer_norm +from easy_rec.python.layers.keras.blocks import MLP +from easy_rec.python.layers.utils import Parameter + +if tf.__version__ >= '2.0': + tf = tf.compat.v1 + + +class SENet(tf.keras.layers.Layer): + """SENET Layer used in FiBiNET. + + Input shape + - A list of 2D tensor with shape: ``(batch_size,embedding_size)``. + The ``embedding_size`` of each field can have different value. + + Output shape + - A 2D tensor with shape: ``(batch_size,sum_of_embedding_size)``. + + References: + 1. [FiBiNET](https://arxiv.org/pdf/1905.09433.pdf) + Combining Feature Importance and Bilinear feature Interaction for Click-Through Rate Prediction + 2. [FiBiNet++](https://arxiv.org/pdf/2209.05016.pdf) + Improving FiBiNet by Greatly Reducing Model Size for CTR Prediction + """ + + def __init__(self, params, name='SENet', **kwargs): + super(SENet, self).__init__(name, **kwargs) + self.config = params.get_pb_config() + + def call(self, inputs, **kwargs): + g = self.config.num_squeeze_group + for emb in inputs: + assert emb.shape.ndims == 2, 'field embeddings must be rank 2 tensors' + dim = int(emb.shape[-1]) + assert dim >= g and dim % g == 0, 'field embedding dimension %d must be divisible by %d' % ( + dim, g) + + field_size = len(inputs) + feature_size_list = [emb.shape.as_list()[-1] for emb in inputs] + + # Squeeze + # embedding dimension 必须能被 g 整除 + group_embs = [ + tf.reshape(emb, [-1, g, int(emb.shape[-1]) // g]) for emb in inputs + ] + + squeezed = [] + for emb in group_embs: + squeezed.append(tf.reduce_max(emb, axis=-1)) # [B, g] + squeezed.append(tf.reduce_mean(emb, axis=-1)) # [B, g] + z = tf.concat(squeezed, axis=1) # [bs, field_size * num_groups * 2] + + # Excitation + r = self.config.reduction_ratio + reduction_size = max(1, field_size * g * 2 // r) + + initializer = tf.glorot_normal_initializer() + a1 = tf.layers.dense( + z, + reduction_size, + kernel_initializer=initializer, + activation=tf.nn.relu, + name='%s/W1' % self.name) + weights = tf.layers.dense( + a1, + sum(feature_size_list), + kernel_initializer=initializer, + name='%s/W2' % self.name) + + # Re-weight + inputs = tf.concat(inputs, axis=-1) + output = inputs * weights + + # Fuse, add skip-connection + if self.config.use_skip_connection: + output += inputs + + # Layer Normalization + if self.config.use_output_layer_norm: + output = layer_norm(output) + return output + + +def _full_interaction(v_i, v_j): + # [bs, 1, dim] x [bs, dim, 1] = [bs, 1] + interaction = tf.matmul( + tf.expand_dims(v_i, axis=1), tf.expand_dims(v_j, axis=-1)) + return tf.squeeze(interaction, axis=1) + + +class BiLinear(tf.keras.layers.Layer): + """BilinearInteraction Layer used in FiBiNET. + + Input shape + - A list of 2D tensor with shape: ``(batch_size,embedding_size)``. + Its length is ``filed_size``. + The ``embedding_size`` of each field can have different value. + + Output shape + - 2D tensor with shape: ``(batch_size,output_size)``. + + Attributes: + num_output_units: the number of output units + type: ['all', 'each', 'interaction'], types of bilinear functions used in this layer + use_plus: whether to use bi-linear+ + + References: + 1. [FiBiNET](https://arxiv.org/pdf/1905.09433.pdf) + Combining Feature Importance and Bilinear feature Interaction for Click-Through Rate Prediction + 2. [FiBiNet++](https://arxiv.org/pdf/2209.05016.pdf) + Improving FiBiNet by Greatly Reducing Model Size for CTR Prediction + """ + + def __init__(self, params, name='bilinear', **kwargs): + super(BiLinear, self).__init__(name, **kwargs) + params.check_required(['num_output_units']) + bilinear_plus = params.get_or_default('use_plus', True) + self.bilinear_type = params.get_or_default('type', 'interaction').lower() + self.output_size = params.num_output_units + + if self.bilinear_type not in ['all', 'each', 'interaction']: + raise NotImplementedError( + "bilinear_type only support: ['all', 'each', 'interaction']") + + if bilinear_plus: + self.func = _full_interaction + else: + self.func = tf.multiply + + def call(self, inputs, **kwargs): + embeddings = inputs + logging.info('Bilinear Layer with %d inputs' % len(embeddings)) + if len(embeddings) > 200: + logging.warning('There are too many inputs for bilinear layer: %d' % + len(embeddings)) + equal_dim = True + _dim = embeddings[0].shape[-1] + for emb in embeddings: + assert emb.shape.ndims == 2, 'field embeddings must be rank 2 tensors' + if emb.shape[-1] != _dim: + equal_dim = False + if not equal_dim and self.bilinear_type != 'interaction': + raise ValueError( + 'all embedding dimensions must be same when not use bilinear type: interaction' + ) + dim = int(_dim) + + field_size = len(embeddings) + initializer = tf.glorot_normal_initializer() + + # bi-linear+: p的维度为[bs, f*(f-1)/2] + # bi-linear: + # 当equal_dim=True时,p的维度为[bs, f*(f-1)/2*k],k为embeddings的size + # 当equal_dim=False时,p的维度为[bs, (k_2+k_3+...+k_f)+...+(k_i+k_{i+1}+...+k_f)+...+k_f], + # 其中 k_i为第i个field的embedding的size + if self.bilinear_type == 'all': + v_dot = [ + tf.layers.dense( + v_i, + dim, + kernel_initializer=initializer, + name='%s/all' % self.name, + reuse=tf.AUTO_REUSE) for v_i in embeddings[:-1] + ] + p = [ + self.func(v_dot[i], embeddings[j]) + for i, j in itertools.combinations(range(field_size), 2) + ] + elif self.bilinear_type == 'each': + v_dot = [ + tf.layers.dense( + v_i, + dim, + kernel_initializer=initializer, + name='%s/each_%d' % (self.name, i), + reuse=tf.AUTO_REUSE) for i, v_i in enumerate(embeddings[:-1]) + ] + p = [ + self.func(v_dot[i], embeddings[j]) + for i, j in itertools.combinations(range(field_size), 2) + ] + else: # interaction + p = [ + self.func( + tf.layers.dense( + embeddings[i], + embeddings[j].shape.as_list()[-1], + kernel_initializer=initializer, + name='%s/interaction_%d_%d' % (self.name, i, j), + reuse=tf.AUTO_REUSE), embeddings[j]) + for i, j in itertools.combinations(range(field_size), 2) + ] + + output = tf.layers.dense( + tf.concat(p, axis=-1), self.output_size, kernel_initializer=initializer) + return output + + +class FiBiNet(tf.keras.layers.Layer): + """FiBiNet++:Improving FiBiNet by Greatly Reducing Model Size for CTR Prediction. + + References: + - [FiBiNet++](https://arxiv.org/pdf/2209.05016.pdf) + Improving FiBiNet by Greatly Reducing Model Size for CTR Prediction + """ + + def __init__(self, params, name='fibinet', **kwargs): + super(FiBiNet, self).__init__(name, **kwargs) + self._config = params.get_pb_config() + if self._config.HasField('mlp'): + p = Parameter.make_from_pb(self._config.mlp) + p.l2_regularizer = params.l2_regularizer + self.final_mlp = MLP(p, name=name) + else: + self.final_mlp = None + + def call(self, inputs, training=None, **kwargs): + feature_list = [] + + params = Parameter.make_from_pb(self._config.senet) + senet = SENet(params, name='%s/senet' % self.name) + senet_output = senet(inputs) + feature_list.append(senet_output) + + if self._config.HasField('bilinear'): + params = Parameter.make_from_pb(self._config.bilinear) + bilinear = BiLinear(params, name='%s/bilinear' % self.name) + bilinear_output = bilinear(inputs) + feature_list.append(bilinear_output) + + if len(feature_list) > 1: + feature = tf.concat(feature_list, axis=-1) + else: + feature = feature_list[0] + + if self.final_mlp is not None: + feature = self.final_mlp(feature, training=training) + return feature diff --git a/easy_rec/python/layers/keras/interaction.py b/easy_rec/python/layers/keras/interaction.py new file mode 100644 index 000000000..55f56f7a1 --- /dev/null +++ b/easy_rec/python/layers/keras/interaction.py @@ -0,0 +1,312 @@ +# -*- encoding:utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +import tensorflow as tf + +from easy_rec.python.utils.activation import get_activation + + +class FM(tf.keras.layers.Layer): + """Factorization Machine models pairwise (order-2) feature interactions without linear term and bias. + + References + - [Factorization Machines](https://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf) + Input shape. + - List of 2D tensor with shape: ``(batch_size,embedding_size)``. + - Or a 3D tensor with shape: ``(batch_size,field_size,embedding_size)`` + Output shape + - 2D tensor with shape: ``(batch_size, 1)``. + """ + + def __init__(self, params, name='fm', **kwargs): + super(FM, self).__init__(name, **kwargs) + self.use_variant = params.get_or_default('use_variant', False) + + def call(self, inputs, **kwargs): + if type(inputs) == list: + emb_dims = set(map(lambda x: int(x.shape[-1]), inputs)) + if len(emb_dims) != 1: + dims = ','.join([str(d) for d in emb_dims]) + raise ValueError('all embedding dim must be equal in FM layer:' + dims) + with tf.name_scope(self.name): + fea = tf.stack(inputs, axis=1) + else: + assert inputs.shape.ndims == 3, 'input of FM layer must be a 3D tensor or a list of 2D tensors' + fea = inputs + + with tf.name_scope(self.name): + square_of_sum = tf.square(tf.reduce_sum(fea, axis=1)) + sum_of_square = tf.reduce_sum(tf.square(fea), axis=1) + cross_term = tf.subtract(square_of_sum, sum_of_square) + if self.use_variant: + cross_term = 0.5 * cross_term + else: + cross_term = 0.5 * tf.reduce_sum(cross_term, axis=-1, keepdims=True) + return cross_term + + +class DotInteraction(tf.keras.layers.Layer): + """Dot interaction layer of DLRM model.. + + See theory in the DLRM paper: https://arxiv.org/pdf/1906.00091.pdf, + section 2.1.3. Sparse activations and dense activations are combined. + Dot interaction is applied to a batch of input Tensors [e1,...,e_k] of the + same dimension and the output is a batch of Tensors with all distinct pairwise + dot products of the form dot(e_i, e_j) for i <= j if self self_interaction is + True, otherwise dot(e_i, e_j) i < j. + + Attributes: + self_interaction: Boolean indicating if features should self-interact. + If it is True, then the diagonal entries of the interaction metric are + also taken. + skip_gather: An optimization flag. If it's set then the upper triangle part + of the dot interaction matrix dot(e_i, e_j) is set to 0. The resulting + activations will be of dimension [num_features * num_features] from which + half will be zeros. Otherwise activations will be only lower triangle part + of the interaction matrix. The later saves space but is much slower. + name: String name of the layer. + """ + + def __init__(self, params, name=None, **kwargs): + self._self_interaction = params.get_or_default('self_interaction', False) + self._skip_gather = params.get_or_default('skip_gather', False) + super(DotInteraction, self).__init__(name=name, **kwargs) + + def call(self, inputs, **kwargs): + """Performs the interaction operation on the tensors in the list. + + The tensors represent as transformed dense features and embedded categorical + features. + Pre-condition: The tensors should all have the same shape. + + Args: + inputs: List of features with shapes [batch_size, feature_dim]. + + Returns: + activations: Tensor representing interacted features. It has a dimension + `num_features * num_features` if skip_gather is True, otherside + `num_features * (num_features + 1) / 2` if self_interaction is True and + `num_features * (num_features - 1) / 2` if self_interaction is False. + """ + if isinstance(inputs, (list, tuple)): + # concat_features shape: batch_size, num_features, feature_dim + try: + concat_features = tf.stack(inputs, axis=1) + except (ValueError, tf.errors.InvalidArgumentError) as e: + raise ValueError('Input tensors` dimensions must be equal, original' + 'error message: {}'.format(e)) + else: + assert inputs.shape.ndims == 3, 'input of dot func must be a 3D tensor or a list of 2D tensors' + concat_features = inputs + + batch_size = tf.shape(concat_features)[0] + + # Interact features, select lower-triangular portion, and re-shape. + xactions = tf.matmul(concat_features, concat_features, transpose_b=True) + num_features = xactions.shape[-1] + ones = tf.ones_like(xactions) + if self._self_interaction: + # Selecting lower-triangular portion including the diagonal. + lower_tri_mask = tf.linalg.band_part(ones, -1, 0) + upper_tri_mask = ones - lower_tri_mask + out_dim = num_features * (num_features + 1) // 2 + else: + # Selecting lower-triangular portion not included the diagonal. + upper_tri_mask = tf.linalg.band_part(ones, 0, -1) + lower_tri_mask = ones - upper_tri_mask + out_dim = num_features * (num_features - 1) // 2 + + if self._skip_gather: + # Setting upper triangle part of the interaction matrix to zeros. + activations = tf.where( + condition=tf.cast(upper_tri_mask, tf.bool), + x=tf.zeros_like(xactions), + y=xactions) + out_dim = num_features * num_features + else: + activations = tf.boolean_mask(xactions, lower_tri_mask) + activations = tf.reshape(activations, (batch_size, out_dim)) + return activations + + +class Cross(tf.keras.layers.Layer): + """Cross Layer in Deep & Cross Network to learn explicit feature interactions. + + A layer that creates explicit and bounded-degree feature interactions + efficiently. The `call` method accepts `inputs` as a tuple of size 2 + tensors. The first input `x0` is the base layer that contains the original + features (usually the embedding layer); the second input `xi` is the output + of the previous `Cross` layer in the stack, i.e., the i-th `Cross` + layer. For the first `Cross` layer in the stack, x0 = xi. + + The output is x_{i+1} = x0 .* (W * xi + bias + diag_scale * xi) + xi, + where .* designates elementwise multiplication, W could be a full-rank + matrix, or a low-rank matrix U*V to reduce the computational cost, and + diag_scale increases the diagonal of W to improve training stability ( + especially for the low-rank case). + + References: + 1. [R. Wang et al.](https://arxiv.org/pdf/2008.13535.pdf) + See Eq. (1) for full-rank and Eq. (2) for low-rank version. + 2. [R. Wang et al.](https://arxiv.org/pdf/1708.05123.pdf) + + Example: + + ```python + # after embedding layer in a functional model: + input = tf.keras.Input(shape=(None,), name='index', dtype=tf.int64) + x0 = tf.keras.layers.Embedding(input_dim=32, output_dim=6) + x1 = Cross()(x0, x0) + x2 = Cross()(x0, x1) + logits = tf.keras.layers.Dense(units=10)(x2) + model = tf.keras.Model(input, logits) + ``` + + Args: + projection_dim: project dimension to reduce the computational cost. + Default is `None` such that a full (`input_dim` by `input_dim`) matrix + W is used. If enabled, a low-rank matrix W = U*V will be used, where U + is of size `input_dim` by `projection_dim` and V is of size + `projection_dim` by `input_dim`. `projection_dim` need to be smaller + than `input_dim`/2 to improve the model efficiency. In practice, we've + observed that `projection_dim` = d/4 consistently preserved the + accuracy of a full-rank version. + diag_scale: a non-negative float used to increase the diagonal of the + kernel W by `diag_scale`, that is, W + diag_scale * I, where I is an + identity matrix. + use_bias: whether to add a bias term for this layer. If set to False, + no bias term will be used. + preactivation: Activation applied to output matrix of the layer, before + multiplication with the input. Can be used to control the scale of the + layer's outputs and improve stability. + kernel_initializer: Initializer to use on the kernel matrix. + bias_initializer: Initializer to use on the bias vector. + kernel_regularizer: Regularizer to use on the kernel matrix. + bias_regularizer: Regularizer to use on bias vector. + + Input shape: A tuple of 2 (batch_size, `input_dim`) dimensional inputs. + Output shape: A single (batch_size, `input_dim`) dimensional output. + """ + + def __init__(self, params, **kwargs): + super(Cross, self).__init__(**kwargs) + self._projection_dim = params.get_or_default('projection_dim', None) + self._diag_scale = params.get_or_default('diag_scale', 0.0) + self._use_bias = params.get_or_default('use_bias', True) + preactivation = params.get_or_default('preactivation', None) + preact = get_activation(preactivation) + self._preactivation = tf.keras.activations.get(preact) + kernel_initializer = params.get_or_default('kernel_initializer', + 'truncated_normal') + self._kernel_initializer = tf.keras.initializers.get(kernel_initializer) + bias_initializer = params.get_or_default('bias_initializer', 'zeros') + self._bias_initializer = tf.keras.initializers.get(bias_initializer) + kernel_regularizer = params.get_or_default('kernel_regularizer', None) + self._kernel_regularizer = tf.keras.regularizers.get(kernel_regularizer) + bias_regularizer = params.get_or_default('bias_regularizer', None) + self._bias_regularizer = tf.keras.regularizers.get(bias_regularizer) + self._input_dim = None + self._supports_masking = True + + if self._diag_scale < 0: # pytype: disable=unsupported-operands + raise ValueError( + '`diag_scale` should be non-negative. Got `diag_scale` = {}'.format( + self._diag_scale)) + + def build(self, input_shape): + last_dim = input_shape[0][-1] + + if self._projection_dim is None: + self._dense = tf.keras.layers.Dense( + last_dim, + kernel_initializer=_clone_initializer(self._kernel_initializer), + bias_initializer=self._bias_initializer, + kernel_regularizer=self._kernel_regularizer, + bias_regularizer=self._bias_regularizer, + use_bias=self._use_bias, + dtype=self.dtype, + activation=self._preactivation, + ) + else: + self._dense_u = tf.keras.layers.Dense( + self._projection_dim, + kernel_initializer=_clone_initializer(self._kernel_initializer), + kernel_regularizer=self._kernel_regularizer, + use_bias=False, + dtype=self.dtype, + ) + self._dense_v = tf.keras.layers.Dense( + last_dim, + kernel_initializer=_clone_initializer(self._kernel_initializer), + bias_initializer=self._bias_initializer, + kernel_regularizer=self._kernel_regularizer, + bias_regularizer=self._bias_regularizer, + use_bias=self._use_bias, + dtype=self.dtype, + activation=self._preactivation, + ) + self.built = True + + def call(self, inputs, **kwargs): + """Computes the feature cross. + + Args: + inputs: The input tensor(x0, x) + - x0: The input tensor + - x: Optional second input tensor. If provided, the layer will compute + crosses between x0 and x; if not provided, the layer will compute + crosses between x0 and itself. + + Returns: + Tensor of crosses. + """ + if isinstance(inputs, (list, tuple)): + x0, x = inputs + else: + x0, x = inputs, inputs + + if not self.built: + self.build(x0.shape) + + if x0.shape[-1] != x.shape[-1]: + raise ValueError( + '`x0` and `x` dimension mismatch! Got `x0` dimension {}, and x ' + 'dimension {}. This case is not supported yet.'.format( + x0.shape[-1], x.shape[-1])) + + if self._projection_dim is None: + prod_output = self._dense(x) + else: + prod_output = self._dense_v(self._dense_u(x)) + + # prod_output = tf.cast(prod_output, self.compute_dtype) + + if self._diag_scale: + prod_output = prod_output + self._diag_scale * x + + return x0 * prod_output + x + + def get_config(self): + config = { + 'projection_dim': + self._projection_dim, + 'diag_scale': + self._diag_scale, + 'use_bias': + self._use_bias, + 'preactivation': + tf.keras.activations.serialize(self._preactivation), + 'kernel_initializer': + tf.keras.initializers.serialize(self._kernel_initializer), + 'bias_initializer': + tf.keras.initializers.serialize(self._bias_initializer), + 'kernel_regularizer': + tf.keras.regularizers.serialize(self._kernel_regularizer), + 'bias_regularizer': + tf.keras.regularizers.serialize(self._bias_regularizer), + } + base_config = super(Cross, self).get_config() + return dict(list(base_config.items()) + list(config.items())) + + +def _clone_initializer(initializer): + return initializer.__class__.from_config(initializer.get_config()) diff --git a/easy_rec/python/layers/keras/mask_net.py b/easy_rec/python/layers/keras/mask_net.py new file mode 100644 index 000000000..6ef740b47 --- /dev/null +++ b/easy_rec/python/layers/keras/mask_net.py @@ -0,0 +1,138 @@ +# -*- encoding:utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +import tensorflow as tf + +from easy_rec.python.layers.common_layers import layer_norm +from easy_rec.python.layers.keras.blocks import MLP +from easy_rec.python.layers.utils import Parameter + +if tf.__version__ >= '2.0': + tf = tf.compat.v1 + + +class MaskBlock(tf.keras.layers.Layer): + """MaskBlock use in MaskNet. + + Args: + projection_dim: project dimension to reduce the computational cost. + Default is `None` such that a full (`input_dim` by `aggregation_size`) matrix + W is used. If enabled, a low-rank matrix W = U*V will be used, where U + is of size `input_dim` by `projection_dim` and V is of size + `projection_dim` by `aggregation_size`. `projection_dim` need to be smaller + than `aggregation_size`/2 to improve the model efficiency. In practice, we've + observed that `projection_dim` = d/4 consistently preserved the + accuracy of a full-rank version. + """ + + def __init__(self, params, name='mask_block', reuse=None, **kwargs): + super(MaskBlock, self).__init__(name, **kwargs) + self.config = params.get_pb_config() + self.l2_reg = params.l2_regularizer + self._projection_dim = params.get_or_default('projection_dim', None) + self.reuse = reuse + + def call(self, inputs, **kwargs): + net, mask_input = inputs + mask_input_dim = int(mask_input.shape[-1]) + if self.config.HasField('reduction_factor'): + aggregation_size = int(mask_input_dim * self.config.reduction_factor) + elif self.config.HasField('aggregation_size') is not None: + aggregation_size = self.config.aggregation_size + else: + raise ValueError( + 'Need one of reduction factor or aggregation size for MaskBlock.') + + if self.config.input_layer_norm: + input_name = net.name.replace(':', '_') + net = layer_norm(net, reuse=tf.AUTO_REUSE, name='ln_' + input_name) + + # initializer = tf.initializers.variance_scaling() + initializer = tf.glorot_uniform_initializer() + + if self._projection_dim is None: + mask = tf.layers.dense( + mask_input, + aggregation_size, + activation=tf.nn.relu, + kernel_initializer=initializer, + kernel_regularizer=self.l2_reg, + name='%s/hidden' % self.name, + reuse=self.reuse) + else: + u = tf.layers.dense( + mask_input, + self._projection_dim, + kernel_initializer=initializer, + kernel_regularizer=self.l2_reg, + use_bias=False, + name='%s/prj_u' % self.name, + reuse=self.reuse) + mask = tf.layers.dense( + u, + aggregation_size, + activation=tf.nn.relu, + kernel_initializer=initializer, + kernel_regularizer=self.l2_reg, + name='%s/prj_v' % self.name, + reuse=self.reuse) + mask = tf.layers.dense( + mask, net.shape[-1], name='%s/mask' % self.name, reuse=self.reuse) + masked_net = net * mask + + output_size = self.config.output_size + hidden = tf.layers.dense( + masked_net, + output_size, + use_bias=False, + name='%s/output' % self.name, + reuse=self.reuse) + ln_hidden = layer_norm( + hidden, name='%s/ln_output' % self.name, reuse=self.reuse) + return tf.nn.relu(ln_hidden) + + +class MaskNet(tf.keras.layers.Layer): + """MaskNet: Introducing Feature-Wise Multiplication to CTR Ranking Models by Instance-Guided Mask. + + Refer: https://arxiv.org/pdf/2102.07619.pdf + """ + + def __init__(self, params, name='mask_net', **kwargs): + super(MaskNet, self).__init__(name, **kwargs) + self.params = params + self.config = params.get_pb_config() + if self.config.HasField('mlp'): + p = Parameter.make_from_pb(self.config.mlp) + p.l2_regularizer = params.l2_regularizer + self.mlp = MLP(p, name='%s/mlp' % name) + else: + self.mlp = None + + def call(self, inputs, training=None, **kwargs): + if self.config.use_parallel: + mask_outputs = [] + for i, block_conf in enumerate(self.config.mask_blocks): + params = Parameter.make_from_pb(block_conf) + params.l2_regularizer = self.params.l2_regularizer + mask_layer = MaskBlock(params, name='%s/block_%d' % (self.name, i)) + mask_outputs.append(mask_layer((inputs, inputs))) + all_mask_outputs = tf.concat(mask_outputs, axis=1) + + if self.mlp is not None: + output = self.mlp(all_mask_outputs) + else: + output = all_mask_outputs + return output + else: + net = inputs + for i, block_conf in enumerate(self.config.mask_blocks): + params = Parameter.make_from_pb(block_conf) + params.l2_regularizer = self.params.l2_regularizer + mask_layer = MaskBlock(params, name='%s/block_%d' % (self.name, i)) + net = mask_layer((net, inputs)) + + if self.mlp is not None: + output = self.mlp(net) + else: + output = net + return output diff --git a/easy_rec/python/layers/keras/multi_task.py b/easy_rec/python/layers/keras/multi_task.py new file mode 100644 index 000000000..ca865e5a7 --- /dev/null +++ b/easy_rec/python/layers/keras/multi_task.py @@ -0,0 +1,50 @@ +# -*- encoding:utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +import logging + +import tensorflow as tf + +from easy_rec.python.layers.keras.blocks import MLP + + +def gate_fn(inputs, units, name, l2_reg): + dense = tf.keras.layers.Dense( + units, kernel_regularizer=l2_reg, name='%s/dense' % name) + weights = dense(inputs) + return tf.nn.softmax(weights, axis=1) + + +class MMoE(tf.keras.layers.Layer): + """Multi-gate Mixture-of-Experts model.""" + + def __init__(self, params, name='MMoE', **kwargs): + super(MMoE, self).__init__(name, **kwargs) + params.check_required(['num_expert', 'num_task', 'expert_mlp']) + self._num_expert = params.num_expert + self._num_task = params.num_task + expert_params = params.expert_mlp + self._experts = [ + MLP(expert_params, 'expert_%d' % i) for i in range(self._num_expert) + ] + self._l2_reg = params.l2_regularizer + + def __call__(self, inputs, **kwargs): + if self._num_expert == 0: + logging.warning('num_expert of MMoE layer `%s` is 0' % self.name) + return inputs + + expert_fea_list = [expert(inputs) for expert in self._experts] + experts_fea = tf.stack(expert_fea_list, axis=1) + + task_input_list = [] + for task_id in range(self._num_task): + gate = gate_fn( + inputs, + self._num_expert, + name='gate_%d' % task_id, + l2_reg=self._l2_reg) + gate = tf.expand_dims(gate, -1) + task_input = tf.multiply(experts_fea, gate) + task_input = tf.reduce_sum(task_input, axis=1) + task_input_list.append(task_input) + return task_input_list diff --git a/easy_rec/python/layers/keras/numerical_embedding.py b/easy_rec/python/layers/keras/numerical_embedding.py new file mode 100644 index 000000000..e83c63a7e --- /dev/null +++ b/easy_rec/python/layers/keras/numerical_embedding.py @@ -0,0 +1,198 @@ +# -*- encoding:utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +import math + +import tensorflow as tf + +from easy_rec.python.utils.activation import get_activation + +if tf.__version__ >= '2.0': + tf = tf.compat.v1 + + +class NLinear(object): + """N linear layers for N token (feature) embeddings. + + To understand this module, let's revise `tf.layers.dense`. When `tf.layers.dense` is + applied to three-dimensional inputs of the shape + ``(batch_size, n_tokens, d_embedding)``, then the same linear transformation is + applied to each of ``n_tokens`` token (feature) embeddings. + + By contrast, `NLinear` allocates one linear layer per token (``n_tokens`` layers in total). + One such layer can be represented as ``tf.layers.dense(d_in, d_out)``. + So, the i-th linear transformation is applied to the i-th token embedding, as + illustrated in the following pseudocode:: + + layers = [tf.layers.dense(d_in, d_out) for _ in range(n_tokens)] + x = tf.random.normal(batch_size, n_tokens, d_in) + result = tf.stack([layers[i](x[:, i]) for i in range(n_tokens)], 1) + + Examples: + .. testcode:: + + batch_size = 2 + n_features = 3 + d_embedding_in = 4 + d_embedding_out = 5 + x = tf.random.normal(batch_size, n_features, d_embedding_in) + m = NLinear(n_features, d_embedding_in, d_embedding_out) + assert m(x).shape == (batch_size, n_features, d_embedding_out) + """ + + def __init__(self, n_tokens, d_in, d_out, bias=True, scope='nd_linear'): + """Init with input shapes. + + Args: + n_tokens: the number of tokens (features) + d_in: the input dimension + d_out: the output dimension + bias: indicates if the underlying linear layers have biases + scope: variable scope name + """ + with tf.variable_scope(scope): + self.weight = tf.get_variable( + 'weights', [1, n_tokens, d_in, d_out], dtype=tf.float32) + if bias: + initializer = tf.constant_initializer(0.0) + self.bias = tf.get_variable( + 'bias', [1, n_tokens, d_out], + dtype=tf.float32, + initializer=initializer) + else: + self.bias = None + + def __call__(self, x, *args, **kwargs): + if x.shape.ndims != 3: + raise ValueError( + 'The input must have three dimensions (batch_size, n_tokens, d_embedding)' + ) + if x.shape[2] != self.weight.shape[2]: + raise ValueError('invalid input embedding dimension %d, expect %d' % + (int(x.shape[2]), int(self.weight.shape[2]))) + + x = x[..., None] * self.weight # [B, N, D, D_out] + x = tf.reduce_sum(x, axis=-2) # [B, N, D_out] + if self.bias is not None: + x = x + self.bias + return x + + +class PeriodicEmbedding(tf.keras.layers.Layer): + """Periodic embeddings for numerical features described in [1]. + + References: + * [1] Yury Gorishniy, Ivan Rubachev, Artem Babenko, + "On Embeddings for Numerical Features in Tabular Deep Learning", 2022 + https://arxiv.org/pdf/2203.05556.pdf + + Attributes: + embedding_dim: the embedding size, must be an even positive integer. + sigma: the scale of the weight initialization. + **This is a super important parameter which significantly affects performance**. + Its optimal value can be dramatically different for different datasets, so + no "default value" can exist for this parameter, and it must be tuned for + each dataset. In the original paper, during hyperparameter tuning, this + parameter was sampled from the distribution ``LogUniform[1e-2, 1e2]``. + A similar grid would be ``[1e-2, 1e-1, 1e0, 1e1, 1e2]``. + If possible, add more intermediate values to this grid. + output_3d_tensor: whether to output a 3d tensor + output_tensor_list: whether to output the list of embedding + """ + + def __init__(self, params, name='periodic_embedding', **kwargs): + super(PeriodicEmbedding, self).__init__(name, **kwargs) + params.check_required(['embedding_dim', 'sigma']) + self.embedding_dim = int(params.embedding_dim) + if self.embedding_dim % 2: + raise ValueError('embedding_dim must be even') + sigma = params.sigma + self.initializer = tf.random_normal_initializer(stddev=sigma) + self.add_linear_layer = params.get_or_default('add_linear_layer', True) + self.linear_activation = params.get_or_default('linear_activation', 'relu') + self.output_tensor_list = params.get_or_default('output_tensor_list', False) + self.output_3d_tensor = params.get_or_default('output_3d_tensor', False) + + def call(self, inputs, **kwargs): + if inputs.shape.ndims != 2: + raise ValueError('inputs of PeriodicEmbedding must have 2 dimensions.') + + num_features = int(inputs.shape[-1]) + emb_dim = self.embedding_dim // 2 + with tf.variable_scope(self.name): + c = tf.get_variable( + 'coefficients', + shape=[1, num_features, emb_dim], + initializer=self.initializer) + + features = inputs[..., None] # [B, N, 1] + v = 2 * math.pi * c * features # [B, N, E] + emb = tf.concat([tf.sin(v), tf.cos(v)], axis=-1) # [B, N, 2E] + + dim = self.embedding_dim + if self.add_linear_layer: + linear = NLinear(num_features, dim, dim) + emb = linear(emb) + act = get_activation(self.linear_activation) + if callable(act): + emb = act(emb) + output = tf.reshape(emb, [-1, num_features * dim]) + + if self.output_tensor_list: + return output, tf.unstack(emb, axis=1) + if self.output_3d_tensor: + return output, emb + return output + + +class AutoDisEmbedding(tf.keras.layers.Layer): + """An Embedding Learning Framework for Numerical Features in CTR Prediction. + + Refer: https://arxiv.org/pdf/2012.08986v2.pdf + """ + + def __init__(self, params, name='auto_dis_embedding', **kwargs): + super(AutoDisEmbedding, self).__init__(name, **kwargs) + params.check_required(['embedding_dim', 'num_bins', 'temperature']) + self.emb_dim = int(params.embedding_dim) + self.num_bins = int(params.num_bins) + self.temperature = params.temperature + self.keep_prob = params.get_or_default('keep_prob', 0.8) + self.output_tensor_list = params.get_or_default('output_tensor_list', False) + self.output_3d_tensor = params.get_or_default('output_3d_tensor', False) + + def call(self, inputs, **kwargs): + if inputs.shape.ndims != 2: + raise ValueError('inputs of AutoDisEmbedding must have 2 dimensions.') + + num_features = int(inputs.shape[-1]) + with tf.variable_scope(self.name): + meta_emb = tf.get_variable( + 'meta_embedding', shape=[num_features, self.num_bins, self.emb_dim]) + w = tf.get_variable('project_w', shape=[1, num_features, self.num_bins]) + mat = tf.get_variable( + 'project_mat', shape=[num_features, self.num_bins, self.num_bins]) + + x = tf.expand_dims(inputs, axis=-1) # [B, N, 1] + hidden = tf.nn.leaky_relu(w * x) # [B, N, num_bin] + # 低版本的tf(1.12) matmul 不支持广播,所以改成 einsum + # y = tf.matmul(mat, hidden[..., None]) # [B, N, num_bin, 1] + # y = tf.squeeze(y, axis=3) # [B, N, num_bin] + y = tf.einsum('nik,bnk->bni', mat, hidden) # [B, N, num_bin] + + # keep_prob(float): if dropout_flag is True, keep_prob rate to keep connect + alpha = self.keep_prob + x_bar = y + alpha * hidden # [B, N, num_bin] + x_hat = tf.nn.softmax(x_bar / self.temperature) # [B, N, num_bin] + + # emb = tf.matmul(x_hat[:, :, None, :], meta_emb) # [B, N, 1, D] + # emb = tf.squeeze(emb, axis=2) # [B, N, D] + emb = tf.einsum('bnk,nkd->bnd', x_hat, meta_emb) + + output = tf.reshape(emb, [-1, self.emb_dim * num_features]) # [B, N*D] + + if self.output_tensor_list: + return output, tf.unstack(emb, axis=1) + + if self.output_3d_tensor: + return output, emb + return output diff --git a/easy_rec/python/layers/sequence_feature_layer.py b/easy_rec/python/layers/sequence_feature_layer.py index bb948f785..fd01b5b2c 100644 --- a/easy_rec/python/layers/sequence_feature_layer.py +++ b/easy_rec/python/layers/sequence_feature_layer.py @@ -3,6 +3,7 @@ import tensorflow as tf from tensorflow.python.framework import ops + from easy_rec.python.compat import regularizers from easy_rec.python.layers import dnn from easy_rec.python.layers import seq_input_layer diff --git a/easy_rec/python/layers/uniter.py b/easy_rec/python/layers/uniter.py index fa5c6a3ca..3018bad61 100644 --- a/easy_rec/python/layers/uniter.py +++ b/easy_rec/python/layers/uniter.py @@ -32,7 +32,8 @@ def __init__(self, model_config, feature_configs, features, uniter_config, tower_num += 1 self._txt_seq_features = None if input_layer.has_group('text'): - self._txt_seq_features = input_layer(features, 'text', is_combine=False) + self._txt_seq_features, _, _ = input_layer( + features, 'text', is_combine=False) tower_num += 1 self._use_token_type = True if tower_num > 1 else False self._other_features = None diff --git a/easy_rec/python/layers/utils.py b/easy_rec/python/layers/utils.py index 43204241c..850f6d7a2 100644 --- a/easy_rec/python/layers/utils.py +++ b/easy_rec/python/layers/utils.py @@ -19,6 +19,8 @@ import json +from google.protobuf import struct_pb2 +from google.protobuf.descriptor import FieldDescriptor from tensorflow.python.framework import ops from tensorflow.python.framework import sparse_tensor from tensorflow.python.ops import variables @@ -158,3 +160,82 @@ def mark_input_src(name, src_desc): 'name': name, 'src': src_desc })) + + +def is_proto_message(pb_obj, field): + field_type = pb_obj.DESCRIPTOR.fields_by_name[field].type + return field_type == FieldDescriptor.TYPE_MESSAGE + + +class Parameter(object): + + def __init__(self, params, is_struct, l2_reg=None): + self.params = params + self.is_struct = is_struct + self._l2_reg = l2_reg + + @staticmethod + def make_from_pb(config): + return Parameter(config, False) + + def get_pb_config(self): + assert not self.is_struct, 'Struct parameter can not convert to pb config' + return self.params + + @property + def l2_regularizer(self): + return self._l2_reg + + @l2_regularizer.setter + def l2_regularizer(self, value): + self._l2_reg = value + + def __getattr__(self, key): + if self.is_struct: + value = self.params[key] + if type(value) == struct_pb2.Struct: + return Parameter(value, True, self._l2_reg) + else: + return value + + value = getattr(self.params, key) + if is_proto_message(self.params, key): + return Parameter(value, False, self._l2_reg) + return value + + def __getitem__(self, key): + return self.__getattr__(key) + + def get_or_default(self, key, def_val): + if self.is_struct: + if key in self.params: + if def_val is None: + return self.params[key] + value = self.params[key] + if type(value) == float: + return type(def_val)(value) + return value + return def_val + else: # pb message + value = getattr(self.params, key) + if hasattr(value, '__len__'): + if len(value) > 0: + return value + elif self.params.HasField(key): + return value + return def_val + + def check_required(self, keys): + if not self.is_struct: + return + if not isinstance(keys, (list, tuple)): + keys = [keys] + for key in keys: + if key not in self.params: + raise KeyError('%s must be set in params') + + def has_field(self, key): + if self.is_struct: + return key in self.params + else: + return self.params.HasField(key) diff --git a/easy_rec/python/loss/jrc_loss.py b/easy_rec/python/loss/jrc_loss.py index fc8266b2c..30c019a77 100644 --- a/easy_rec/python/loss/jrc_loss.py +++ b/easy_rec/python/loss/jrc_loss.py @@ -12,7 +12,9 @@ def jrc_loss(labels, logits, session_ids, alpha=0.5, - auto_weight=False, + loss_weight_strategy='fixed', + sample_weights=1.0, + same_label_loss=True, name=''): """Joint Optimization of Ranking and Calibration with Contextualized Hybrid Model. @@ -23,14 +25,18 @@ def jrc_loss(labels, logits: a `Tensor` with shape [batch_size, 2]. e.g. the value of last neuron before activation. session_ids: a `Tensor` with shape [batch_size]. Session ids of each sample, used to max GAUC metric. e.g. user_id alpha: the weight to balance ranking loss and calibration loss - auto_weight: bool, whether to learn loss weight between ranking loss and calibration loss + loss_weight_strategy: str, the loss weight strategy to balancing between ce_loss and ge_loss + sample_weights: Coefficients for the loss. This must be scalar or broadcastable to + `labels` (i.e. same rank and each dimension is either 1 or the same). + same_label_loss: enable ge_loss for sample with same label in a session or not. name: the name of loss """ loss_name = name if name else 'jrc_loss' - logging.info('[{}] alpha: {}, auto_weight: {}'.format(loss_name, alpha, - auto_weight)) + logging.info('[{}] alpha: {}, loss_weight_strategy: {}'.format( + loss_name, alpha, loss_weight_strategy)) - ce_loss = tf.losses.sparse_softmax_cross_entropy(labels, logits) + ce_loss = tf.losses.sparse_softmax_cross_entropy( + labels, logits, weights=sample_weights) labels = tf.expand_dims(labels, 1) # [B, 1] labels = tf.concat([1 - labels, labels], axis=1) # [B, 2] @@ -54,13 +60,58 @@ def jrc_loss(labels, y_neg, y_pos = y[:, :, 0], y[:, :, 1] l_neg, l_pos = logits[:, :, 0], logits[:, :, 1] + if tf.is_numeric_tensor(sample_weights): + logging.info('[%s] use sample weight' % loss_name) + weights = tf.expand_dims(tf.cast(sample_weights, tf.float32), 0) + pairwise_weights = tf.tile(weights, tf.stack([batch_size, 1])) + y_pos *= pairwise_weights + y_neg *= pairwise_weights + else: + assert sample_weights == 1.0, 'invalid sample_weight %d' % sample_weights + # Compute list-wise generative loss -log p(x|y, z) - loss_pos = -tf.reduce_sum(y_pos * tf.nn.log_softmax(l_pos, axis=0), axis=0) - loss_neg = -tf.reduce_sum(y_neg * tf.nn.log_softmax(l_neg, axis=0), axis=0) - ge_loss = tf.reduce_mean((loss_pos + loss_neg) / tf.reduce_sum(mask, axis=0)) + if same_label_loss: + logging.info('[%s] enable same_label_loss' % loss_name) + loss_pos = -tf.reduce_sum(y_pos * tf.nn.log_softmax(l_pos, axis=0), axis=0) + loss_neg = -tf.reduce_sum(y_neg * tf.nn.log_softmax(l_neg, axis=0), axis=0) + ge_loss = tf.reduce_mean( + (loss_pos + loss_neg) / tf.reduce_sum(mask, axis=0)) + else: + logging.info('[%s] disable same_label_loss' % loss_name) + diag = tf.one_hot(tf.range(batch_size), batch_size) + l_pos = l_pos + (1 - diag) * y_pos * -1e9 + l_neg = l_neg + (1 - diag) * y_neg * -1e9 + loss_pos = -tf.linalg.diag_part(y_pos * tf.nn.log_softmax(l_pos, axis=0)) + loss_neg = -tf.linalg.diag_part(y_neg * tf.nn.log_softmax(l_neg, axis=0)) + ge_loss = tf.reduce_mean(loss_pos + loss_neg) + + tf.summary.scalar('loss/%s_ce' % loss_name, ce_loss) + tf.summary.scalar('loss/%s_ge' % loss_name, ge_loss) # The final JRC model - if auto_weight: + if loss_weight_strategy == 'fixed': + loss = alpha * ce_loss + (1 - alpha) * ge_loss + elif loss_weight_strategy == 'random_uniform': + weight = tf.random_uniform([]) + loss = weight * ce_loss + (1 - weight) * ge_loss + tf.summary.scalar('loss/%s_ce_weight' % loss_name, weight) + tf.summary.scalar('loss/%s_ge_weight' % loss_name, 1 - weight) + elif loss_weight_strategy == 'random_normal': + weights = tf.random_normal([2]) + loss_weight = tf.nn.softmax(weights) + loss = loss_weight[0] * ce_loss + loss_weight[1] * ge_loss + tf.summary.scalar('loss/%s_ce_weight' % loss_name, loss_weight[0]) + tf.summary.scalar('loss/%s_ge_weight' % loss_name, loss_weight[1]) + elif loss_weight_strategy == 'random_bernoulli': + bern = tf.distributions.Bernoulli(probs=0.5, dtype=tf.float32) + weights = bern.sample(2) + loss_weight = tf.cond( + tf.equal(tf.reduce_sum(weights), 1), lambda: weights, + lambda: tf.convert_to_tensor([0.5, 0.5])) + loss = loss_weight[0] * ce_loss + loss_weight[1] * ge_loss + tf.summary.scalar('loss/%s_ce_weight' % loss_name, loss_weight[0]) + tf.summary.scalar('loss/%s_ge_weight' % loss_name, loss_weight[1]) + elif loss_weight_strategy == 'uncertainty': uncertainty1 = tf.Variable( 0, name='%s_ranking_loss_weight' % loss_name, dtype=tf.float32) tf.summary.scalar('loss/%s_ranking_uncertainty' % loss_name, uncertainty1) @@ -71,5 +122,6 @@ def jrc_loss(labels, loss = tf.exp(-uncertainty1) * ce_loss + 0.5 * uncertainty1 loss += tf.exp(-uncertainty2) * ge_loss + 0.5 * uncertainty2 else: - loss = alpha * ce_loss + (1 - alpha) * ge_loss + raise ValueError('Unsupported loss weight strategy `%s` for jrc loss' % + loss_weight_strategy) return loss diff --git a/easy_rec/python/model/collaborative_metric_learning.py b/easy_rec/python/model/collaborative_metric_learning.py index d785e7141..b19537239 100644 --- a/easy_rec/python/model/collaborative_metric_learning.py +++ b/easy_rec/python/model/collaborative_metric_learning.py @@ -48,21 +48,22 @@ def __init__( raise ValueError('unsupported loss type: %s' % LossType.Name(self._loss_type)) - self._highway_features = {} - self._highway_num = len(self._model_config.highway) - for _id in range(self._highway_num): - highway_cfg = self._model_config.highway[_id] - highway_feature, _ = self._input_layer(self._feature_dict, - highway_cfg.input) - self._highway_features[highway_cfg.input] = highway_feature - - self.input_features = [] - if self._model_config.HasField('input'): - input_feature, _ = self._input_layer(self._feature_dict, - self._model_config.input) - self.input_features.append(input_feature) - - self.dnn = copy_obj(self._model_config.dnn) + if not self.has_backbone: + self._highway_features = {} + self._highway_num = len(self._model_config.highway) + for _id in range(self._highway_num): + highway_cfg = self._model_config.highway[_id] + highway_feature, _ = self._input_layer(self._feature_dict, + highway_cfg.input) + self._highway_features[highway_cfg.input] = highway_feature + + self.input_features = [] + if self._model_config.HasField('input'): + input_feature, _ = self._input_layer(self._feature_dict, + self._model_config.input) + self.input_features.append(input_feature) + + self.dnn = copy_obj(self._model_config.dnn) if self._labels is not None: if self._model_config.HasField('session_id'): @@ -79,32 +80,35 @@ def __init__( self.sample_id = None def build_predict_graph(self): - for _id in range(self._highway_num): - highway_cfg = self._model_config.highway[_id] - highway_fea = tf.layers.batch_normalization( - self._highway_features[highway_cfg.input], - training=self._is_training, - trainable=True, - name='highway_%s_bn' % highway_cfg.input) - highway_fea = highway( - highway_fea, - highway_cfg.emb_size, - activation=gelu, - scope='highway_%s' % _id) - print('highway_fea: ', highway_fea) - self.input_features.append(highway_fea) - - feature = tf.concat(self.input_features, axis=1) - - num_dnn_layer = len(self.dnn.hidden_units) - last_hidden = self.dnn.hidden_units.pop() - dnn_net = dnn.DNN(self.dnn, self._l2_reg, 'dnn', self._is_training) - net_output = dnn_net(feature) - tower_emb = tf.layers.dense( - inputs=net_output, - units=last_hidden, - kernel_regularizer=self._l2_reg, - name='dnn/dnn_%d' % (num_dnn_layer - 1)) + if self.has_backbone: + tower_emb = self.backbone + else: + for _id in range(self._highway_num): + highway_cfg = self._model_config.highway[_id] + highway_fea = tf.layers.batch_normalization( + self._highway_features[highway_cfg.input], + training=self._is_training, + trainable=True, + name='highway_%s_bn' % highway_cfg.input) + highway_fea = highway( + highway_fea, + highway_cfg.emb_size, + activation=gelu, + scope='highway_%s' % _id) + print('highway_fea: ', highway_fea) + self.input_features.append(highway_fea) + + feature = tf.concat(self.input_features, axis=1) + + num_dnn_layer = len(self.dnn.hidden_units) + last_hidden = self.dnn.hidden_units.pop() + dnn_net = dnn.DNN(self.dnn, self._l2_reg, 'dnn', self._is_training) + net_output = dnn_net(feature) + tower_emb = tf.layers.dense( + inputs=net_output, + units=last_hidden, + kernel_regularizer=self._l2_reg, + name='dnn/dnn_%d' % (num_dnn_layer - 1)) if self._model_config.output_l2_normalized_emb: norm_emb = tf.nn.l2_normalize(tower_emb, axis=-1) diff --git a/easy_rec/python/model/dbmtl.py b/easy_rec/python/model/dbmtl.py index 913793474..6c69d33ca 100644 --- a/easy_rec/python/model/dbmtl.py +++ b/easy_rec/python/model/dbmtl.py @@ -37,24 +37,29 @@ def __init__(self, features, self._model_config.bottom_uniter, self._input_layer) + elif not self.has_backbone: + self._features, self._feature_list = self._input_layer( + self._feature_dict, 'all') else: - self._features, _ = self._input_layer(self._feature_dict, 'all') + assert False, 'invalid code branch' self._init_towers(self._model_config.task_towers) def build_predict_graph(self): - if self._model_config.HasField('bottom_cmbf'): - bottom_fea = self._cmbf_layer(self._is_training, l2_reg=self._l2_reg) - elif self._model_config.HasField('bottom_uniter'): - bottom_fea = self._uniter_layer(self._is_training, l2_reg=self._l2_reg) - elif self._model_config.HasField('bottom_dnn'): - bottom_dnn = dnn.DNN( - self._model_config.bottom_dnn, - self._l2_reg, - name='bottom_dnn', - is_training=self._is_training) - bottom_fea = bottom_dnn(self._features) - else: - bottom_fea = self._features + bottom_fea = self.backbone + if bottom_fea is None: + if self._model_config.HasField('bottom_cmbf'): + bottom_fea = self._cmbf_layer(self._is_training, l2_reg=self._l2_reg) + elif self._model_config.HasField('bottom_uniter'): + bottom_fea = self._uniter_layer(self._is_training, l2_reg=self._l2_reg) + elif self._model_config.HasField('bottom_dnn'): + bottom_dnn = dnn.DNN( + self._model_config.bottom_dnn, + self._l2_reg, + name='bottom_dnn', + is_training=self._is_training) + bottom_fea = bottom_dnn(self._features) + else: + bottom_fea = self._features # MMOE block if self._model_config.HasField('expert_dnn'): diff --git a/easy_rec/python/model/easy_rec_model.py b/easy_rec/python/model/easy_rec_model.py index 325cdc257..6fb8fa60a 100644 --- a/easy_rec/python/model/easy_rec_model.py +++ b/easy_rec/python/model/easy_rec_model.py @@ -12,6 +12,7 @@ from easy_rec.python.compat import regularizers from easy_rec.python.layers import input_layer +from easy_rec.python.layers.backbone import Backbone from easy_rec.python.utils import constant from easy_rec.python.utils import estimator_utils from easy_rec.python.utils import restore_filter @@ -48,6 +49,11 @@ def __init__(self, self._l2_reg = regularizers.l2_regularizer(self.l2_regularization) # only used by model with wide feature groups, e.g. WideAndDeep self._wide_output_dim = -1 + if self.has_backbone: + wide_dim = Backbone.wide_embed_dim(model_config.backbone) + if wide_dim: + self._wide_output_dim = wide_dim + logging.info('set `wide_output_dim` to %d' % wide_dim) self._feature_configs = feature_configs self.build_input_layer(model_config, feature_configs) @@ -61,6 +67,33 @@ def __init__(self, if constant.SAMPLE_WEIGHT in features: self._sample_weight = features[constant.SAMPLE_WEIGHT] + self._backbone_output = None + self._backbone_net = self.build_backbone_network() + + def build_backbone_network(self): + if self.has_backbone: + return Backbone( + self._base_model_config.backbone, + self._feature_dict, + input_layer=self._input_layer, + l2_reg=self._l2_reg) + return None + + @property + def has_backbone(self): + return self._base_model_config.HasField('backbone') + + @property + def backbone(self): + if self._backbone_output: + return self._backbone_output + if self._backbone_net: + self._backbone_output = self._backbone_net(self._is_training) + loss_dict = self._backbone_net.loss_dict + self._loss_dict.update(loss_dict) + return self._backbone_output + return None + @property def embedding_regularization(self): return self._base_model_config.embedding_regularization diff --git a/easy_rec/python/model/esmm.py b/easy_rec/python/model/esmm.py index c6eaad483..50567ae63 100644 --- a/easy_rec/python/model/esmm.py +++ b/easy_rec/python/model/esmm.py @@ -31,7 +31,9 @@ def __init__(self, self._group_num = len(self._model_config.groups) self._group_features = [] - if self._group_num > 0: + if self.has_backbone: + logging.info('use bottom backbone network') + elif self._group_num > 0: logging.info('group_num: {0}'.format(self._group_num)) for group_id in range(self._group_num): group = self._model_config.groups[group_id] @@ -173,7 +175,9 @@ def build_predict_graph(self): Returns: self._prediction_dict: Prediction result of two tasks. """ - if self._group_num > 0: + if self.has_backbone: + all_fea = self.backbone + elif self._group_num > 0: group_fea_arr = [] # Both towers share the underlying network. for group_id in range(self._group_num): diff --git a/easy_rec/python/model/mind.py b/easy_rec/python/model/mind.py index c414703d2..270060297 100644 --- a/easy_rec/python/model/mind.py +++ b/easy_rec/python/model/mind.py @@ -32,7 +32,7 @@ def __init__(self, 'invalid model config: %s' % self._model_config.WhichOneof('model') self._model_config = self._model_config.mind - self._hist_seq_features = self._input_layer( + self._hist_seq_features, _, _ = self._input_layer( self._feature_dict, 'hist', is_combine=False) self._user_features, _ = self._input_layer(self._feature_dict, 'user') self._item_features, _ = self._input_layer(self._feature_dict, 'item') diff --git a/easy_rec/python/model/mmoe.py b/easy_rec/python/model/mmoe.py index acf1d6d59..3cc644f6d 100644 --- a/easy_rec/python/model/mmoe.py +++ b/easy_rec/python/model/mmoe.py @@ -26,7 +26,10 @@ def __init__(self, self._model_config = self._model_config.mmoe assert isinstance(self._model_config, MMoEConfig) - self._features, _ = self._input_layer(self._feature_dict, 'all') + if self.has_backbone: + self._features = self.backbone + else: + self._features, _ = self._input_layer(self._feature_dict, 'all') self._init_towers(self._model_config.task_towers) def build_predict_graph(self): diff --git a/easy_rec/python/model/multi_task_model.py b/easy_rec/python/model/multi_task_model.py index 43e5663ce..c683702ae 100644 --- a/easy_rec/python/model/multi_task_model.py +++ b/easy_rec/python/model/multi_task_model.py @@ -1,10 +1,12 @@ # -*- encoding:utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. import logging +from collections import OrderedDict import tensorflow as tf from easy_rec.python.builders import loss_builder +from easy_rec.python.layers.dnn import DNN from easy_rec.python.model.rank_model import RankModel from easy_rec.python.protos import tower_pb2 from easy_rec.python.protos.loss_pb2 import LossType @@ -27,6 +29,71 @@ def __init__(self, self._task_num = None self._label_name_dict = {} + def build_predict_graph(self): + if not self.has_backbone: + raise NotImplementedError( + 'method `build_predict_graph` must be implemented when backbone network do not exists' + ) + model = self._model_config.WhichOneof('model') + assert model == 'model_params', '`model_params` must be configured' + config = self._model_config.model_params + + self._init_towers(config.task_towers) + + backbone = self.backbone + if type(backbone) in (list, tuple): + if len(backbone) != len(config.task_towers): + raise ValueError( + 'The number of backbone outputs and task towers must be equal') + task_input_list = backbone + else: + task_input_list = [backbone] * len(config.task_towers) + + tower_features = {} + for i, task_tower_cfg in enumerate(config.task_towers): + tower_name = task_tower_cfg.tower_name + if task_tower_cfg.HasField('dnn'): + tower_dnn = DNN( + task_tower_cfg.dnn, + self._l2_reg, + name=tower_name, + is_training=self._is_training) + tower_output = tower_dnn(task_input_list[i]) + else: + tower_output = task_input_list[i] + tower_features[tower_name] = tower_output + + tower_outputs = {} + relation_features = {} + # bayes network + for task_tower_cfg in config.task_towers: + tower_name = task_tower_cfg.tower_name + if task_tower_cfg.HasField('relation_dnn'): + relation_dnn = DNN( + task_tower_cfg.relation_dnn, + self._l2_reg, + name=tower_name + '/relation_dnn', + is_training=self._is_training) + tower_inputs = [tower_features[tower_name]] + for relation_tower_name in task_tower_cfg.relation_tower_names: + tower_inputs.append(relation_features[relation_tower_name]) + relation_input = tf.concat( + tower_inputs, axis=-1, name=tower_name + '/relation_input') + relation_fea = relation_dnn(relation_input) + relation_features[tower_name] = relation_fea + else: + relation_fea = tower_features[tower_name] + + output_logits = tf.layers.dense( + relation_fea, + task_tower_cfg.num_class, + kernel_regularizer=self._l2_reg, + name=tower_name + '/output') + tower_outputs[tower_name] = output_logits + + self._add_to_prediction_dict(tower_outputs) + return self._prediction_dict + def _init_towers(self, task_tower_configs): """Init task towers.""" self._task_towers = task_tower_configs @@ -86,8 +153,47 @@ def build_metric_graph(self, eval_config): suffix='_%s' % tower_name)) return metric_dict + def build_loss_weight(self): + loss_weights = OrderedDict() + num_loss = 0 + for task_tower_cfg in self._task_towers: + tower_name = task_tower_cfg.tower_name + losses = task_tower_cfg.losses + n = len(losses) + if n > 0: + loss_weights[tower_name] = [loss.weight for loss in losses] + num_loss += n + else: + loss_weights[tower_name] = [1.0] + num_loss += 1 + + strategy = self._base_model_config.loss_weight_strategy + if strategy == self._base_model_config.Random: + weights = tf.random_normal([num_loss]) + weights = tf.nn.softmax(weights) + i = 0 + for k, v in loss_weights.items(): + n = len(v) + loss_weights[k] = weights[i:i + n] + i += n + return loss_weights + + def get_learnt_loss(self, loss_type, name, value): + strategy = self._base_model_config.loss_weight_strategy + if strategy == self._base_model_config.Uncertainty: + uncertainty = tf.Variable( + 0, name='%s_loss_weight' % name, dtype=tf.float32) + tf.summary.scalar('loss/%s_uncertainty' % name, uncertainty) + if loss_type in {LossType.L2_LOSS, LossType.SIGMOID_L2_LOSS}: + return 0.5 * tf.exp(-uncertainty) * value + 0.5 * uncertainty + else: + return tf.exp(-uncertainty) * value + 0.5 * uncertainty + else: + raise ValueError('Unsupported loss weight strategy: ' + strategy.Name) + def build_loss_graph(self): """Build loss graph for multi task model.""" + task_loss_weights = self.build_loss_weight() for task_tower_cfg in self._task_towers: tower_name = task_tower_cfg.tower_name loss_weight = task_tower_cfg.weight @@ -102,6 +208,7 @@ def build_loss_graph(self): task_tower_cfg.in_task_space_weight * in_task_space + task_tower_cfg.out_task_space_weight * (1 - in_task_space)) + task_loss_weight = task_loss_weights[tower_name] loss_dict = {} losses = task_tower_cfg.losses if len(losses) == 0: @@ -111,6 +218,8 @@ def build_loss_graph(self): loss_weight=loss_weight, num_class=task_tower_cfg.num_class, suffix='_%s' % tower_name) + for loss_name in loss_dict.keys(): + loss_dict[loss_name] = loss_dict[loss_name] * task_loss_weight[0] else: for loss in losses: loss_param = loss.WhichOneof('loss_param') @@ -124,20 +233,13 @@ def build_loss_graph(self): suffix='_%s' % tower_name, loss_name=loss.loss_name, loss_param=loss_param) - for loss_name, loss_value in loss_ops.items(): + for i, loss_name in enumerate(loss_ops): + loss_value = loss_ops[loss_name] if loss.learn_loss_weight: - uncertainty = tf.Variable( - 0, name='%s_loss_weight' % loss_name, dtype=tf.float32) - tf.summary.scalar('loss/%s_uncertainty' % loss_name, uncertainty) - if loss.loss_type in {LossType.L2_LOSS, LossType.SIGMOID_L2_LOSS}: - loss_dict[loss_name] = 0.5 * tf.exp( - -uncertainty) * loss_value + 0.5 * uncertainty - else: - loss_dict[loss_name] = tf.exp( - -uncertainty) * loss_value + 0.5 * uncertainty + loss_dict[loss_name] = self.get_learnt_loss( + loss.loss_type, loss_name, loss_value) else: - loss_dict[loss_name] = loss_value * loss.weight - + loss_dict[loss_name] = loss_value * task_loss_weight[i] self._loss_dict.update(loss_dict) kd_loss_dict = loss_builder.build_kd_loss(self.kd, self._prediction_dict, diff --git a/easy_rec/python/model/ple.py b/easy_rec/python/model/ple.py index f3ad71215..e04781bcd 100644 --- a/easy_rec/python/model/ple.py +++ b/easy_rec/python/model/ple.py @@ -27,7 +27,10 @@ def __init__(self, self._layer_nums = len(self._model_config.extraction_networks) self._task_nums = len(self._model_config.task_towers) - self._features, _ = self._input_layer(self._feature_dict, 'all') + if self.has_backbone: + self._features = self.backbone + else: + self._features, _ = self._input_layer(self._feature_dict, 'all') self._init_towers(self._model_config.task_towers) def gate(self, selector_fea, vec_feas, name): diff --git a/easy_rec/python/model/rank_model.py b/easy_rec/python/model/rank_model.py index 25eff23ea..f8c7f10c3 100644 --- a/easy_rec/python/model/rank_model.py +++ b/easy_rec/python/model/rank_model.py @@ -29,6 +29,18 @@ def __init__(self, if self._labels is not None: self._label_name = list(self._labels.keys())[0] + def build_predict_graph(self): + if not self.has_backbone: + raise NotImplementedError( + 'method `build_predict_graph` must be implemented when backbone network do not exits' + ) + output = self.backbone + if int(output.shape[-1]) != self._num_class: + logging.info('add head logits layer for rank model') + output = tf.layers.dense(output, self._num_class, name='output') + self._add_to_prediction_dict(output) + return self._prediction_dict + def _output_to_prediction_impl(self, output, loss_type, @@ -193,7 +205,12 @@ def build_loss_graph(self): loss_weight=self._sample_weight, num_class=self._num_class) else: - for loss in self._losses: + strategy = self._base_model_config.loss_weight_strategy + loss_weight = [1.0] + if strategy == self._base_model_config.Random and len(self._losses) > 1: + weights = tf.random_normal([len(self._losses)]) + loss_weight = tf.nn.softmax(weights) + for i, loss in enumerate(self._losses): loss_param = loss.WhichOneof('loss_param') if loss_param is not None: loss_param = getattr(loss, loss_param) @@ -205,18 +222,26 @@ def build_loss_graph(self): loss_name=loss.loss_name, loss_param=loss_param) for loss_name, loss_value in loss_ops.items(): - if loss.learn_loss_weight: - uncertainty = tf.Variable( - 0, name='%s_loss_weight' % loss_name, dtype=tf.float32) - tf.summary.scalar('loss/%s_uncertainty' % loss_name, uncertainty) - if loss.loss_type in {LossType.L2_LOSS, LossType.SIGMOID_L2_LOSS}: - loss_dict[loss_name] = 0.5 * tf.exp( - -uncertainty) * loss_value + 0.5 * uncertainty + if strategy == self._base_model_config.Fixed: + loss_dict[loss_name] = loss_value * loss.weight + elif strategy == self._base_model_config.Uncertainty: + if loss.learn_loss_weight: + uncertainty = tf.Variable( + 0, name='%s_loss_weight' % loss_name, dtype=tf.float32) + tf.summary.scalar('loss/%s_uncertainty' % loss_name, uncertainty) + if loss.loss_type in {LossType.L2_LOSS, LossType.SIGMOID_L2_LOSS}: + loss_dict[loss_name] = 0.5 * tf.exp( + -uncertainty) * loss_value + 0.5 * uncertainty + else: + loss_dict[loss_name] = tf.exp( + -uncertainty) * loss_value + 0.5 * uncertainty else: - loss_dict[loss_name] = tf.exp( - -uncertainty) * loss_value + 0.5 * uncertainty + loss_dict[loss_name] = loss_value * loss.weight + elif strategy == self._base_model_config.Random: + loss_dict[loss_name] = loss_value * loss_weight[i] else: - loss_dict[loss_name] = loss_value * loss.weight + raise ValueError('Unsupported loss weight strategy: ' + + strategy.Name) self._loss_dict.update(loss_dict) diff --git a/easy_rec/python/model/simple_multi_task.py b/easy_rec/python/model/simple_multi_task.py index b4c0613bc..05dd7a773 100644 --- a/easy_rec/python/model/simple_multi_task.py +++ b/easy_rec/python/model/simple_multi_task.py @@ -27,7 +27,10 @@ def __init__(self, self._model_config = self._model_config.simple_multi_task assert isinstance(self._model_config, SimpleMultiTaskConfig) - self._features, _ = self._input_layer(self._feature_dict, 'all') + if self.has_backbone: + self._features = self.backbone + else: + self._features, _ = self._input_layer(self._feature_dict, 'all') self._init_towers(self._model_config.task_towers) def build_predict_graph(self): diff --git a/easy_rec/python/protos/backbone.proto b/easy_rec/python/protos/backbone.proto new file mode 100644 index 000000000..c93fbf0df --- /dev/null +++ b/easy_rec/python/protos/backbone.proto @@ -0,0 +1,96 @@ +syntax = "proto2"; +package protos; + +import "easy_rec/python/protos/dnn.proto"; +import "easy_rec/python/protos/keras_layer.proto"; + +message InputLayer { + optional bool do_batch_norm = 1; + optional bool do_layer_norm = 2; + optional float dropout_rate = 3; + optional float feature_dropout_rate = 4; + optional bool only_output_feature_list = 5; + optional bool only_output_3d_tensor = 6; + optional bool output_2d_tensor_and_feature_list = 7; + optional bool output_seq_and_normal_feature = 8; + optional uint32 wide_output_dim = 9; +} + +message Lambda { + required string expression = 1; +} + +message Input { + oneof name { + string feature_group_name = 1; + string block_name = 2; + string package_name = 3; + } + optional string input_fn = 11; + optional string input_slice = 12; +} + +message RecurrentLayer { + required uint32 num_steps = 1 [default = 1]; + optional uint32 fixed_input_index = 2; + required KerasLayer keras_layer = 3; +} + +message RepeatLayer { + required uint32 num_repeat = 1 [default = 1]; + // default output the list of multiple outputs + optional int32 output_concat_axis = 2; + required KerasLayer keras_layer = 3; +} + +message Layer { + oneof layer { + Lambda lambda = 1; + KerasLayer keras_layer = 2; + RecurrentLayer recurrent = 3; + RepeatLayer repeat = 4; + InputLayer input_layer = 5; + } +} + +message Block { + required string name = 1; + // the input names of feature groups or other blocks + repeated Input inputs = 2; + optional int32 input_concat_axis = 3 [default = -1]; + optional bool merge_inputs_into_list = 4; + optional string extra_input_fn = 5; + + // sequential layers + repeated Layer layers = 6; + + // only take effect when there are no layers + oneof layer { + InputLayer input_layer = 101; + Lambda lambda = 102; + KerasLayer keras_layer = 103; + RecurrentLayer recurrent = 104; + RepeatLayer repeat = 105; + } +} + +// a package of blocks for reuse; e.g. call in a contrastive learning manner +message BlockPackage { + // package name + required string name = 1; + // a few blocks generating a DAG + repeated Block blocks = 2; + // the names of output blocks + repeated string concat_blocks = 3; +} + +message BackboneTower { + // a few sub DAGs + repeated BlockPackage packages = 1; + // a few blocks generating a DAG + repeated Block blocks = 2; + // the names of output blocks + repeated string concat_blocks = 3; + // optional top mlp layer + optional MLP top_mlp = 4; +} diff --git a/easy_rec/python/protos/cmbf.proto b/easy_rec/python/protos/cmbf.proto index 598bf1ecf..34e082115 100644 --- a/easy_rec/python/protos/cmbf.proto +++ b/easy_rec/python/protos/cmbf.proto @@ -1,9 +1,50 @@ syntax = "proto2"; package protos; -import "easy_rec/python/protos/layer.proto"; import "easy_rec/python/protos/dnn.proto"; +message CMBFTower { + // The number of heads of cross modal fusion layer + required uint32 multi_head_num = 1 [default = 1]; + // The number of heads of image feature learning layer + required uint32 image_multi_head_num = 101 [default = 1]; + // The number of heads of text feature learning layer + required uint32 text_multi_head_num = 102 [default = 1]; + // The dimension of text heads + required uint32 text_head_size = 2; + // The dimension of image heads + required uint32 image_head_size = 3 [default = 64]; + // The number of patches of image feature, take effect when there is only one image feature + required uint32 image_feature_patch_num = 4 [default = 1]; + // Do dimension reduce to this size for image feature before single modal learning module + required uint32 image_feature_dim = 5 [default = 0]; + // The number of self attention layers for image features + required uint32 image_self_attention_layer_num = 6 [default = 0]; + // The number of self attention layers for text features + required uint32 text_self_attention_layer_num = 7 [default = 1]; + // The number of cross modal layers + required uint32 cross_modal_layer_num = 8 [default = 1]; + // The dimension of image cross modal heads + required uint32 image_cross_head_size = 9; + // The dimension of text cross modal heads + required uint32 text_cross_head_size = 10; + // Dropout probability for hidden layers + required float hidden_dropout_prob = 11 [default = 0.0]; + // Dropout probability of the attention probabilities + required float attention_probs_dropout_prob = 12 [default = 0.0]; + + // Whether to add embeddings for different text sequence features + required bool use_token_type = 13 [default = false]; + // Whether to add position embeddings for the position of each token in the text sequence + required bool use_position_embeddings = 14 [default = true]; + // Maximum sequence length that might ever be used with this model + required uint32 max_position_embeddings = 15 [default = 0]; + // Dropout probability for text sequence embeddings + required float text_seq_emb_dropout_prob = 16 [default = 0.1]; + // dnn layers for other features + optional DNN other_feature_dnn = 17; +} + message CMBF { required CMBFTower config = 1; diff --git a/easy_rec/python/protos/dbmtl.proto b/easy_rec/python/protos/dbmtl.proto index 841b8adec..9adff1f62 100644 --- a/easy_rec/python/protos/dbmtl.proto +++ b/easy_rec/python/protos/dbmtl.proto @@ -3,7 +3,8 @@ package protos; import "easy_rec/python/protos/dnn.proto"; import "easy_rec/python/protos/tower.proto"; -import "easy_rec/python/protos/layer.proto"; +import "easy_rec/python/protos/cmbf.proto"; +import "easy_rec/python/protos/uniter.proto"; message DBMTL { // shared bottom cmbf layer diff --git a/easy_rec/python/protos/dnn.proto b/easy_rec/python/protos/dnn.proto index 021d34dbb..ff40f0fe4 100644 --- a/easy_rec/python/protos/dnn.proto +++ b/easy_rec/python/protos/dnn.proto @@ -12,3 +12,20 @@ message DNN { // use batch normalization optional bool use_bn = 4 [default = true]; } + +message MLP { + // hidden units for each layer + repeated uint32 hidden_units = 1; + // ratio of dropout + repeated float dropout_ratio = 2; + // activation function + optional string activation = 3 [default = 'relu']; + // use batch normalization + optional bool use_bn = 4 [default = true]; + optional bool use_final_bn = 5 [default = true]; + optional string final_activation = 6 [default = 'relu']; + optional bool use_bias = 7 [default = true]; + // kernel_initializer + optional string initializer = 8 [default = 'he_uniform']; + optional bool use_bn_after_activation = 9; +} diff --git a/easy_rec/python/protos/easy_rec_model.proto b/easy_rec/python/protos/easy_rec_model.proto index 27dcefadc..76506d710 100644 --- a/easy_rec/python/protos/easy_rec_model.proto +++ b/easy_rec/python/protos/easy_rec_model.proto @@ -1,6 +1,7 @@ syntax = "proto2"; package protos; +import "easy_rec/python/protos/backbone.proto"; import "easy_rec/python/protos/fm.proto"; import "easy_rec/python/protos/deepfm.proto"; import "easy_rec/python/protos/wide_and_deep.proto"; @@ -24,9 +25,17 @@ import "easy_rec/python/protos/loss.proto"; import "easy_rec/python/protos/rocket_launching.proto"; import "easy_rec/python/protos/variational_dropout.proto"; import "easy_rec/python/protos/multi_tower_recall.proto"; +import "easy_rec/python/protos/tower.proto"; + // for input performance test message DummyModel { +} + +// configure backbone network common parameters +message ModelParams { + optional float l2_regularization = 1; + repeated BayesTaskTower task_towers = 3; } // for knowledge distillation @@ -44,17 +53,19 @@ message KD { optional float loss_weight = 4 [default=1.0]; // only for loss_type == CROSS_ENTROPY_LOSS optional float temperature = 5 [default=1.0]; - } message EasyRecModel { required string model_class = 1; + // just a name for backbone config + optional string model_name = 99; // actually input layers, each layer produce a group of feature repeated FeatureGroupConfig feature_groups = 2; // model parameters oneof model { + ModelParams model_params = 100; DummyModel dummy = 101; WideAndDeep wide_and_deep = 102; DeepFM deepfm = 103; @@ -102,4 +113,12 @@ message EasyRecModel { repeated Loss losses = 15; + enum LossWeightStrategy { + Fixed = 0; + Uncertainty = 1; + Random = 2; + } + required LossWeightStrategy loss_weight_strategy = 16 [default = Fixed]; + + optional BackboneTower backbone = 17; } diff --git a/easy_rec/python/protos/fm.proto b/easy_rec/python/protos/fm.proto index c90af8cab..31d8f27d7 100644 --- a/easy_rec/python/protos/fm.proto +++ b/easy_rec/python/protos/fm.proto @@ -2,5 +2,6 @@ syntax = "proto2"; package protos; message FM { + optional bool use_variant = 1; optional float l2_regularization = 5 [default = 1e-4]; } diff --git a/easy_rec/python/protos/keras_layer.proto b/easy_rec/python/protos/keras_layer.proto new file mode 100644 index 000000000..2798260d3 --- /dev/null +++ b/easy_rec/python/protos/keras_layer.proto @@ -0,0 +1,27 @@ +syntax = "proto2"; +package protos; + +import "google/protobuf/struct.proto"; +import "easy_rec/python/protos/layer.proto"; +import "easy_rec/python/protos/dnn.proto"; +import "easy_rec/python/protos/fm.proto"; +import "easy_rec/python/protos/seq_encoder.proto"; + +message KerasLayer { + required string class_name = 1; + oneof params { + google.protobuf.Struct st_params = 2; + PeriodicEmbedding periodic_embedding = 3; + AutoDisEmbedding auto_dis_embedding = 4; + FM fm = 5; + MaskBlock mask_block = 6; + MaskNet masknet = 7; + SENet senet = 8; + Bilinear bilinear = 9; + FiBiNet fibinet = 10; + MLP mlp = 11; + DINEncoder din = 12; + BSTEncoder bst = 13; + MMoELayer mmoe = 14; + } +} diff --git a/easy_rec/python/protos/layer.proto b/easy_rec/python/protos/layer.proto index 6cea6d3bd..52a1cbf30 100644 --- a/easy_rec/python/protos/layer.proto +++ b/easy_rec/python/protos/layer.proto @@ -4,73 +4,68 @@ package protos; import "easy_rec/python/protos/dnn.proto"; message HighWayTower { - required string input = 1; + optional string input = 1; required uint32 emb_size = 2; + required string activation = 3 [default = 'gelu']; + optional float dropout_rate = 4; } -message CMBFTower { - // The number of heads of cross modal fusion layer - required uint32 multi_head_num = 1 [default = 1]; - // The number of heads of image feature learning layer - required uint32 image_multi_head_num = 101 [default = 1]; - // The number of heads of text feature learning layer - required uint32 text_multi_head_num = 102 [default = 1]; - // The dimension of text heads - required uint32 text_head_size = 2; - // The dimension of image heads - required uint32 image_head_size = 3 [default = 64]; - // The number of patches of image feature, take effect when there is only one image feature - required uint32 image_feature_patch_num = 4 [default = 1]; - // Do dimension reduce to this size for image feature before single modal learning module - required uint32 image_feature_dim = 5 [default = 0]; - // The number of self attention layers for image features - required uint32 image_self_attention_layer_num = 6 [default = 0]; - // The number of self attention layers for text features - required uint32 text_self_attention_layer_num = 7 [default = 1]; - // The number of cross modal layers - required uint32 cross_modal_layer_num = 8 [default = 1]; - // The dimension of image cross modal heads - required uint32 image_cross_head_size = 9; - // The dimension of text cross modal heads - required uint32 text_cross_head_size = 10; - // Dropout probability for hidden layers - required float hidden_dropout_prob = 11 [default = 0.0]; - // Dropout probability of the attention probabilities - required float attention_probs_dropout_prob = 12 [default = 0.0]; +message PeriodicEmbedding { + required uint32 embedding_dim = 1; + required float sigma = 2; + optional bool add_linear_layer = 3 [default = true]; + optional string linear_activation = 4 [default = 'relu']; + optional bool output_3d_tensor = 5; + optional bool output_tensor_list = 6; +} + +message AutoDisEmbedding { + required uint32 embedding_dim = 1; + required uint32 num_bins = 2; + required float keep_prob = 3 [default = 0.8]; + required float temperature = 4; + optional bool output_3d_tensor = 5; + optional bool output_tensor_list = 6; +} + +message SENet { + required uint32 reduction_ratio = 1 [default = 4]; + optional uint32 num_squeeze_group = 2 [default = 2]; + optional bool use_skip_connection = 3 [default = true]; + optional bool use_output_layer_norm = 4 [default = true]; +} + +message Bilinear { + required string type = 1 [default = 'interaction']; + required bool use_plus = 2 [default = true]; + required uint32 num_output_units = 3; +} + +message FiBiNet { + optional Bilinear bilinear = 1; + required SENet senet = 2; + optional MLP mlp = 8; +} + +message MaskBlock { + optional float reduction_factor = 1; + required uint32 output_size = 2; + optional uint32 aggregation_size = 3; + optional bool input_layer_norm = 4 [default = true]; + optional uint32 projection_dim = 5; +} - // Whether to add embeddings for different text sequence features - required bool use_token_type = 13 [default = false]; - // Whether to add position embeddings for the position of each token in the text sequence - required bool use_position_embeddings = 14 [default = true]; - // Maximum sequence length that might ever be used with this model - required uint32 max_position_embeddings = 15 [default = 0]; - // Dropout probability for text sequence embeddings - required float text_seq_emb_dropout_prob = 16 [default = 0.1]; - // dnn layers for other features - optional DNN other_feature_dnn = 17; +message MaskNet { + repeated MaskBlock mask_blocks = 1; + required bool use_parallel = 2 [default = true]; + optional MLP mlp = 3; } -message UniterTower { - // Size of the encoder layers and the pooler layer - required uint32 hidden_size = 1; - // Number of hidden layers in the Transformer encoder - required uint32 num_hidden_layers = 2; - // Number of attention heads for each attention layer in the Transformer encoder - required uint32 num_attention_heads = 3; - // The size of the "intermediate" (i.e. feed-forward) layer in the Transformer encoder - required uint32 intermediate_size = 4; - // The non-linear activation function (function or string) in the encoder and pooler. - required string hidden_act = 5 [default = 'gelu']; // "gelu", "relu", "tanh" and "swish" are supported. - // The dropout probability for all fully connected layers in the embeddings, encoder, and pooler - required float hidden_dropout_prob = 6 [default = 0.1]; - // The dropout ratio for the attention probabilities - required float attention_probs_dropout_prob = 7 [default = 0.1]; - // The maximum sequence length that this model might ever be used with - required uint32 max_position_embeddings = 8 [default = 512]; - // Whether to add position embeddings for the position of each token in the text sequence - required bool use_position_embeddings = 9 [default = true]; - // The stddev of the truncated_normal_initializer for initializing all weight matrices - required float initializer_range = 10 [default = 0.02]; - // dnn layers for other features - optional DNN other_feature_dnn = 11; +message MMoELayer { + // number of tasks + required uint32 num_task = 1; + // mmoe expert mlp layer definition + optional MLP expert_mlp = 2; + // number of mmoe experts + optional uint32 num_expert = 3; } diff --git a/easy_rec/python/protos/loss.proto b/easy_rec/python/protos/loss.proto index c5b74f47d..5c913bf6e 100644 --- a/easy_rec/python/protos/loss.proto +++ b/easy_rec/python/protos/loss.proto @@ -93,4 +93,6 @@ message PairwiseLogisticLoss { message JRCLoss { required string session_name = 1; optional float alpha = 2 [default = 0.5]; + optional bool same_label_loss = 3 [default = true]; + required string loss_weight_strategy = 4 [default = 'fixed']; } diff --git a/easy_rec/python/protos/seq_encoder.proto b/easy_rec/python/protos/seq_encoder.proto new file mode 100644 index 000000000..2b845a429 --- /dev/null +++ b/easy_rec/python/protos/seq_encoder.proto @@ -0,0 +1,37 @@ +syntax = "proto2"; +package protos; + +import "easy_rec/python/protos/dnn.proto"; + + +message BSTEncoder { + // Size of the encoder layers and the pooler layer + required uint32 hidden_size = 1; + // Number of hidden layers in the Transformer encoder + required uint32 num_hidden_layers = 2; + // Number of attention heads for each attention layer in the Transformer encoder + required uint32 num_attention_heads = 3; + // The size of the "intermediate" (i.e. feed-forward) layer in the Transformer encoder + required uint32 intermediate_size = 4; + // The non-linear activation function (function or string) in the encoder and pooler. + required string hidden_act = 5 [default = 'gelu']; // "gelu", "relu", "tanh" and "swish" are supported. + // The dropout probability for all fully connected layers in the embeddings, encoder, and pooler + required float hidden_dropout_prob = 6 [default = 0.1]; + // The dropout ratio for the attention probabilities + required float attention_probs_dropout_prob = 7 [default = 0.1]; + // The maximum sequence length that this model might ever be used with + required uint32 max_position_embeddings = 8 [default = 512]; + // Whether to add position embeddings for the position of each token in the text sequence + required bool use_position_embeddings = 9 [default = true]; + // The stddev of the truncated_normal_initializer for initializing all weight matrices + required float initializer_range = 10 [default = 0.02]; +} + +message DINEncoder { + // din attention layer + required DNN attention_dnn = 1; + // whether to keep target item feature + required bool need_target_feature = 2 [default = true]; + // option: softmax, sigmoid + required string attention_normalizer = 3 [default = 'softmax']; +} diff --git a/easy_rec/python/protos/uniter.proto b/easy_rec/python/protos/uniter.proto index 7e78ad23e..9efc1dc9e 100644 --- a/easy_rec/python/protos/uniter.proto +++ b/easy_rec/python/protos/uniter.proto @@ -1,9 +1,33 @@ syntax = "proto2"; package protos; -import "easy_rec/python/protos/layer.proto"; import "easy_rec/python/protos/dnn.proto"; +message UniterTower { + // Size of the encoder layers and the pooler layer + required uint32 hidden_size = 1; + // Number of hidden layers in the Transformer encoder + required uint32 num_hidden_layers = 2; + // Number of attention heads for each attention layer in the Transformer encoder + required uint32 num_attention_heads = 3; + // The size of the "intermediate" (i.e. feed-forward) layer in the Transformer encoder + required uint32 intermediate_size = 4; + // The non-linear activation function (function or string) in the encoder and pooler. + required string hidden_act = 5 [default = 'gelu']; // "gelu", "relu", "tanh" and "swish" are supported. + // The dropout probability for all fully connected layers in the embeddings, encoder, and pooler + required float hidden_dropout_prob = 6 [default = 0.1]; + // The dropout ratio for the attention probabilities + required float attention_probs_dropout_prob = 7 [default = 0.1]; + // The maximum sequence length that this model might ever be used with + required uint32 max_position_embeddings = 8 [default = 512]; + // Whether to add position embeddings for the position of each token in the text sequence + required bool use_position_embeddings = 9 [default = true]; + // The stddev of the truncated_normal_initializer for initializing all weight matrices + required float initializer_range = 10 [default = 0.02]; + // dnn layers for other features + optional DNN other_feature_dnn = 11; +} + message Uniter { required UniterTower config = 1; diff --git a/easy_rec/python/test/train_eval_test.py b/easy_rec/python/test/train_eval_test.py index 777dfd21a..d594c7dfe 100644 --- a/easy_rec/python/test/train_eval_test.py +++ b/easy_rec/python/test/train_eval_test.py @@ -97,10 +97,20 @@ def test_wide_and_deep(self): self._test_dir) self.assertTrue(self._success) + def test_wide_and_deep_backbone(self): + self._success = test_utils.test_single_train_eval( + 'samples/model_config/wide_and_deep_backbone_on_avazau.config', + self._test_dir) + self.assertTrue(self._success) + def test_dlrm(self): self._success = test_utils.test_single_train_eval( 'samples/model_config/dlrm_on_taobao.config', self._test_dir) + def test_dlrm_backbone(self): + self._success = test_utils.test_single_train_eval( + 'samples/model_config/dlrm_backbone_on_taobao.config', self._test_dir) + def test_adamw_optimizer(self): self._success = test_utils.test_single_train_eval( 'samples/model_config/deepfm_combo_on_avazu_adamw_ctr.config', @@ -131,6 +141,12 @@ def test_multi_tower(self): 'samples/model_config/multi_tower_on_taobao.config', self._test_dir) self.assertTrue(self._success) + def test_multi_tower_backbone(self): + self._success = test_utils.test_single_train_eval( + 'samples/model_config/multi_tower_backbone_on_taobao.config', + self._test_dir) + self.assertTrue(self._success) + def test_multi_tower_gauc(self): self._success = test_utils.test_single_train_eval( 'samples/model_config/multi_tower_on_taobao_gauc.config', @@ -336,6 +352,21 @@ def test_dcn(self): 'samples/model_config/dcn_on_taobao.config', self._test_dir) self.assertTrue(self._success) + def test_fibinet(self): + self._success = test_utils.test_single_train_eval( + 'samples/model_config/fibinet_on_taobao.config', self._test_dir) + self.assertTrue(self._success) + + def test_masknet(self): + self._success = test_utils.test_single_train_eval( + 'samples/model_config/masknet_on_taobao.config', self._test_dir) + self.assertTrue(self._success) + + def test_dcn_backbone(self): + self._success = test_utils.test_single_train_eval( + 'samples/model_config/dcn_backbone_on_taobao.config', self._test_dir) + self.assertTrue(self._success) + def test_dcn_with_f1(self): self._success = test_utils.test_single_train_eval( 'samples/model_config/dcn_f1_on_taobao.config', self._test_dir) @@ -521,11 +552,6 @@ def test_deepfm_with_sigmoid_l2_loss(self): self._test_dir) self.assertTrue(self._success) - # def test_deepfm_with_sequence_attention(self): - # self._success = test_utils.test_single_train_eval( - # 'samples/model_config/deppfm_seq_attn_on_taobao.config', self._test_dir) - # self.assertTrue(self._success) - def test_deepfm_with_embedding_learning_rate(self): self._success = test_utils.test_single_train_eval( 'samples/model_config/deepfm_combo_on_avazu_emblr_ctr.config', @@ -549,6 +575,11 @@ def test_mmoe(self): 'samples/model_config/mmoe_on_taobao.config', self._test_dir) self.assertTrue(self._success) + def test_mmoe_backbone(self): + self._success = test_utils.test_single_train_eval( + 'samples/model_config/mmoe_backbone_on_taobao.config', self._test_dir) + self.assertTrue(self._success) + def test_mmoe_with_multi_loss(self): self._success = test_utils.test_single_train_eval( 'samples/model_config/mmoe_on_taobao_with_multi_loss.config', @@ -566,6 +597,12 @@ def test_simple_multi_task(self): self._test_dir) self.assertTrue(self._success) + def test_simple_multi_task_backbone(self): + self._success = test_utils.test_single_train_eval( + 'samples/model_config/simple_multi_task_backbone_on_taobao.config', + self._test_dir) + self.assertTrue(self._success) + def test_esmm(self): self._success = test_utils.test_single_train_eval( 'samples/model_config/esmm_on_taobao.config', self._test_dir) @@ -581,6 +618,11 @@ def test_dbmtl(self): 'samples/model_config/dbmtl_on_taobao.config', self._test_dir) self.assertTrue(self._success) + def test_dbmtl_backbone(self): + self._success = test_utils.test_single_train_eval( + 'samples/model_config/dbmtl_backbone_on_taobao.config', self._test_dir) + self.assertTrue(self._success) + def test_dbmtl_cmbf(self): self._success = test_utils.test_single_train_eval( 'samples/model_config/dbmtl_cmbf_on_movielens.config', self._test_dir) @@ -753,6 +795,18 @@ def test_batch_tfrecord_input(self): self._test_dir) self.assertTrue(self._success) + def test_autodis_embedding(self): + self._success = test_utils.test_distributed_train_eval( + 'samples/model_config/deepfm_on_criteo_with_autodis.config', + self._test_dir) + self.assertTrue(self._success) + + def test_periodic_embedding(self): + self._success = test_utils.test_distributed_train_eval( + 'samples/model_config/deepfm_on_criteo_with_periodic.config', + self._test_dir) + self.assertTrue(self._success) + def test_sample_weight(self): self._success = test_utils.test_single_train_eval( 'samples/model_config/deepfm_with_sample_weight.config', self._test_dir) diff --git a/easy_rec/python/test/util_test.py b/easy_rec/python/test/util_test.py index 233a00772..c14524488 100644 --- a/easy_rec/python/test/util_test.py +++ b/easy_rec/python/test/util_test.py @@ -4,6 +4,7 @@ import tensorflow as tf from easy_rec.python.utils import estimator_utils +from easy_rec.python.utils.dag import DAG from easy_rec.python.utils.expr_util import get_expression if tf.__version__ >= '2.0': @@ -57,6 +58,28 @@ def test_get_expression_or(self): ['age_level', 'item_age_level']) assert result == "tf.greater(parsed_dict['age_level'], 3) | tf.less(parsed_dict['item_age_level'], 1)" + def test_dag(self): + dag = DAG() + dag.add_node('a') + dag.add_node('b') + dag.add_node('c') + dag.add_node('d') + dag.add_edge('a', 'b') + dag.add_edge('a', 'd') + dag.add_edge('b', 'c') + order = dag.topological_sort() + idx_a = order.index('a') + idx_b = order.index('b') + idx_c = order.index('c') + idx_d = order.index('d') + assert idx_a < idx_b + assert idx_a < idx_d + assert idx_b < idx_c + c = dag.all_downstreams('b') + assert c == ['c'] + leaf = dag.all_leaves() + assert leaf == ['c', 'd'] + if __name__ == '__main__': tf.test.main() diff --git a/easy_rec/python/train_eval.py b/easy_rec/python/train_eval.py index cfe592b6f..daaf3d572 100644 --- a/easy_rec/python/train_eval.py +++ b/easy_rec/python/train_eval.py @@ -96,8 +96,12 @@ help='is use check mode') parser.add_argument( '--selected_cols', type=str, default=None, help='select input columns') + parser.add_argument('--gpu', type=str, default=None, help='gpu id') args, extra_args = parser.parse_known_args() + if args.gpu is not None: + os.environ['CUDA_VISIBLE_DEVICES'] = args.gpu + edit_config_json = {} if args.edit_config_json: edit_config_json = json.loads(args.edit_config_json) diff --git a/easy_rec/python/utils/dag.py b/easy_rec/python/utils/dag.py new file mode 100644 index 000000000..b72ae072b --- /dev/null +++ b/easy_rec/python/utils/dag.py @@ -0,0 +1,192 @@ +import logging +from collections import OrderedDict +from collections import defaultdict +from copy import copy +from copy import deepcopy + + +class DAG(object): + """Directed acyclic graph implementation.""" + + def __init__(self): + """Construct a new DAG with no nodes or edges.""" + self.reset_graph() + + def add_node(self, node_name, graph=None): + """Add a node if it does not exist yet, or error out.""" + if not graph: + graph = self.graph + if node_name in graph: + raise KeyError('node %s already exists' % node_name) + graph[node_name] = set() + + def add_node_if_not_exists(self, node_name, graph=None): + try: + self.add_node(node_name, graph=graph) + except KeyError: + logging.info('node %s already exist' % node_name) + + def delete_node(self, node_name, graph=None): + """Deletes this node and all edges referencing it.""" + if not graph: + graph = self.graph + if node_name not in graph: + raise KeyError('node %s does not exist' % node_name) + graph.pop(node_name) + + for node, edges in graph.items(): + if node_name in edges: + edges.remove(node_name) + + def delete_node_if_exists(self, node_name, graph=None): + try: + self.delete_node(node_name, graph=graph) + except KeyError: + logging.info('node %s does not exist' % node_name) + + def add_edge(self, ind_node, dep_node, graph=None): + """Add an edge (dependency) between the specified nodes.""" + if not graph: + graph = self.graph + if ind_node not in graph or dep_node not in graph: + raise KeyError('one or more nodes do not exist in graph') + test_graph = deepcopy(graph) + test_graph[ind_node].add(dep_node) + is_valid, message = self.validate(test_graph) + if is_valid: + graph[ind_node].add(dep_node) + else: + raise Exception() + + def delete_edge(self, ind_node, dep_node, graph=None): + """Delete an edge from the graph.""" + if not graph: + graph = self.graph + if dep_node not in graph.get(ind_node, []): + raise KeyError('this edge does not exist in graph') + graph[ind_node].remove(dep_node) + + def rename_edges(self, old_task_name, new_task_name, graph=None): + """Change references to a task in existing edges.""" + if not graph: + graph = self.graph + for node, edges in graph.items(): + + if node == old_task_name: + graph[new_task_name] = copy(edges) + del graph[old_task_name] + + else: + if old_task_name in edges: + edges.remove(old_task_name) + edges.add(new_task_name) + + def predecessors(self, node, graph=None): + """Returns a list of all predecessors of the given node.""" + if graph is None: + graph = self.graph + return [key for key in graph if node in graph[key]] + + def downstream(self, node, graph=None): + """Returns a list of all nodes this node has edges towards.""" + if graph is None: + graph = self.graph + if node not in graph: + raise KeyError('node %s is not in graph' % node) + return list(graph[node]) + + def all_downstreams(self, node, graph=None): + """Returns a list of all nodes ultimately downstream of the given node in the dependency graph. + + in topological order. + """ + if graph is None: + graph = self.graph + nodes = [node] + nodes_seen = set() + i = 0 + while i < len(nodes): + downstreams = self.downstream(nodes[i], graph) + for downstream_node in downstreams: + if downstream_node not in nodes_seen: + nodes_seen.add(downstream_node) + nodes.append(downstream_node) + i += 1 + return list( + filter(lambda node: node in nodes_seen, + self.topological_sort(graph=graph))) + + def all_leaves(self, graph=None): + """Return a list of all leaves (nodes with no downstreams).""" + if graph is None: + graph = self.graph + return [key for key in graph if not graph[key]] + + def from_dict(self, graph_dict): + """Reset the graph and build it from the passed dictionary. + + The dictionary takes the form of {node_name: [directed edges]} + """ + self.reset_graph() + for new_node in graph_dict.keys(): + self.add_node(new_node) + for ind_node, dep_nodes in graph_dict.items(): + if not isinstance(dep_nodes, list): + raise TypeError('dict values must be lists') + for dep_node in dep_nodes: + self.add_edge(ind_node, dep_node) + + def reset_graph(self): + """Restore the graph to an empty state.""" + self.graph = OrderedDict() + + def independent_nodes(self, graph=None): + """Returns a list of all nodes in the graph with no dependencies.""" + if graph is None: + graph = self.graph + + dependent_nodes = set( + node for dependents in graph.values() for node in dependents) + return [node for node in graph.keys() if node not in dependent_nodes] + + def validate(self, graph=None): + """Returns (Boolean, message) of whether DAG is valid.""" + graph = graph if graph is not None else self.graph + if len(self.independent_nodes(graph)) == 0: + return False, 'no independent nodes detected' + try: + self.topological_sort(graph) + except ValueError: + return False, 'failed topological sort' + return True, 'valid' + + def topological_sort(self, graph=None): + """Returns a topological ordering of the DAG. + + Raises an error if this is not possible (graph is not valid). + """ + if graph is None: + graph = self.graph + result = [] + in_degree = defaultdict(lambda: 0) + + for u in graph: + for v in graph[u]: + in_degree[v] += 1 + ready = [node for node in graph if not in_degree[node]] + + while ready: + u = ready.pop() + result.append(u) + for v in graph[u]: + in_degree[v] -= 1 + if in_degree[v] == 0: + ready.append(v) + + if len(result) == len(graph): + return result + else: + raise ValueError('graph is not acyclic') + + def size(self): + return len(self.graph) diff --git a/easy_rec/python/utils/load_class.py b/easy_rec/python/utils/load_class.py index 2da1e4e41..9ac749c76 100644 --- a/easy_rec/python/utils/load_class.py +++ b/easy_rec/python/utils/load_class.py @@ -220,3 +220,30 @@ def create_class(cls, name): return newclass return RegisterABCMeta + + +def load_keras_layer(name): + """Load keras layer class. + + Args: + name: keras layer name + + Return: + (layer_class, is_customize) + """ + name = name.strip() + if name == '' or name is None: + return None + + path = 'easy_rec.python.layers.keras.' + name + try: + cls = pydoc.locate(path) + if cls is not None: + return cls, True + path = 'tensorflow.keras.layers.' + name + return pydoc.locate(path), False + except pydoc.ErrorDuringImport: + print('load keras layer %s failed' % name) + logging.error('load keras layer %s failed: %s' % + (name, traceback.format_exc())) + return None, False diff --git a/easy_rec/version.py b/easy_rec/version.py index 08d341768..5d3a16322 100644 --- a/easy_rec/version.py +++ b/easy_rec/version.py @@ -1,3 +1,3 @@ # -*- encoding:utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. -__version__ = '0.6.4' +__version__ = '0.7.0' diff --git a/examples/configs/dcn_backbone_on_movielens.config b/examples/configs/dcn_backbone_on_movielens.config new file mode 100644 index 000000000..2717a5c4c --- /dev/null +++ b/examples/configs/dcn_backbone_on_movielens.config @@ -0,0 +1,203 @@ +train_input_path: "examples/data/movielens_1m/movies_train_data" +eval_input_path: "examples/data/movielens_1m/movies_test_data" +model_dir: "examples/ckpt/dcn_on_movieslen" + +train_config { + log_step_count_steps: 100 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 2000 + sync_replicas: false +} + +eval_config { + metrics_set: { + auc {} + } + metrics_set: { + gauc { + uid_field: 'user_id' + } + } + metrics_set: { + max_f1 {} + } +} + +data_config { + input_fields { + input_name:'label' + input_type: INT32 + } + input_fields { + input_name:'user_id' + input_type: INT32 + } + input_fields { + input_name: 'movie_id' + input_type: INT32 + } + input_fields { + input_name:'rating' + input_type: INT32 + } + input_fields { + input_name: 'gender' + input_type: INT32 + } + input_fields { + input_name: 'age' + input_type: INT32 + } + input_fields { + input_name: 'job_id' + input_type: INT32 + } + input_fields { + input_name: 'zip_id' + input_type: STRING + } + input_fields { + input_name: 'title' + input_type: STRING + } + input_fields { + input_name: 'genres' + input_type: STRING + } + input_fields { + input_name: 'year' + input_type: INT32 + } + + label_fields: 'label' + batch_size: 1024 + num_epochs: 1 + prefetch_size: 32 + input_type: CSVInput + separator: '\t' +} + +feature_config: { + features: { + input_names: 'user_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 12000 + } + features: { + input_names: 'movie_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 6000 + } + features: { + input_names: 'gender' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 2 + } + features: { + input_names: 'job_id' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 21 + } + features: { + input_names: 'age' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 7 + } + features: { + input_names: 'genres' + feature_type: TagFeature + separator: '|' + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'title' + feature_type: SequenceFeature + separator: ' ' + embedding_dim: 16 + hash_bucket_size: 10000 + sequence_combiner: { + text_cnn: { + filter_sizes: [2, 3, 4] + num_filters: [16, 8, 8] + } + } + } + features: { + input_names: 'year' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 36 + } +} +model_config: { + model_name: 'DCN v2' + model_class: 'RankModel' + feature_groups: { + group_name: 'all' + feature_names: 'user_id' + feature_names: 'movie_id' + feature_names: 'job_id' + feature_names: 'age' + feature_names: 'gender' + feature_names: 'year' + feature_names: 'genres' + wide_deep: DEEP + } + backbone { + blocks { + name: "deep" + inputs { + feature_group_name: 'all' + } + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [256, 128, 64] + } + } + } + blocks { + name: "dcn" + inputs { + feature_group_name: 'all' + input_fn: 'lambda x: [x, x]' + } + recurrent { + num_steps: 3 + fixed_input_index: 0 + keras_layer { + class_name: 'Cross' + } + } + } + concat_blocks: ['deep', 'dcn'] + top_mlp { + hidden_units: [64, 32, 16] + } + } + model_params { + l2_regularization: 1e-4 + } + embedding_regularization: 1e-4 +} +export_config { + multi_placeholder: false +} diff --git a/examples/configs/deepfm_backbone_on_criteo.config b/examples/configs/deepfm_backbone_on_criteo.config new file mode 100644 index 000000000..25fc5cfc6 --- /dev/null +++ b/examples/configs/deepfm_backbone_on_criteo.config @@ -0,0 +1,643 @@ +train_input_path: "examples/data/criteo/criteo_train_data" +eval_input_path: "examples/data/criteo/criteo_test_data" +model_dir: "examples/ckpt/deepfm_backbone_criteo" + +train_config { + log_step_count_steps: 500 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 20000 + sync_replicas: True +} + +eval_config { + metrics_set: { + auc {} + } +} + +data_config { + separator: "\t" + input_fields: { + input_name: "label" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F1" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F2" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F3" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F4" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F5" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F6" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F7" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F8" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F9" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F10" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F11" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F12" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F13" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "C1" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C2" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C3" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C4" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C5" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C6" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C7" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C8" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C9" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C10" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C11" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C12" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C13" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C14" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C15" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C16" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C17" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C18" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C19" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C20" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C21" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C22" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C23" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C24" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C25" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C26" + input_type: STRING + default_val:"" + } + label_fields: "label" + + batch_size: 4096 + num_epochs: 1 + prefetch_size: 32 + input_type: CSVInput +} + +feature_config: { + features: { + input_names: "F1" + embedding_dim: 16 + feature_type: RawFeature + min_val:0.0 + max_val: 5775.0 + } + features: { + input_names: "F2" + embedding_dim: 16 + feature_type: RawFeature + min_val: -3.0 + max_val: 257675.0 + } + features: { + input_names: "F3" + embedding_dim: 16 + feature_type: RawFeature + min_val: 0.0 + max_val: 65535.0 + } + features: { + input_names: "F4" + embedding_dim: 16 + feature_type: RawFeature + min_val: 0.0 + max_val: 969.0 + } + features: { + input_names: "F5" + embedding_dim: 16 + feature_type: RawFeature + min_val: 0.0 + max_val: 23159456.0 + } + features: { + input_names: "F6" + embedding_dim: 16 + feature_type: RawFeature + min_val: 0.0 + max_val: 431037.0 + } + features: { + input_names: "F7" + embedding_dim: 16 + feature_type: RawFeature + min_val: 0.0 + max_val: 56311.0 + } + features: { + input_names: "F8" + embedding_dim: 16 + feature_type: RawFeature + min_val: 0.0 + max_val: 6047.0 + } + features: { + input_names: "F9" + embedding_dim: 16 + feature_type: RawFeature + min_val: 0.0 + max_val: 29019.0 + } + features: { + input_names: "F10" + embedding_dim: 16 + feature_type: RawFeature + min_val: 0.0 + max_val: 46.0 + } + features: { + input_names: "F11" + embedding_dim: 16 + feature_type: RawFeature + min_val: 0.0 + max_val: 231.0 + } + features: { + input_names: "F12" + embedding_dim: 16 + feature_type: RawFeature + min_val: 0.0 + max_val: 4008.0 + } + features: { + input_names: "F13" + embedding_dim: 16 + feature_type: RawFeature + min_val: 0.0 + max_val: 7393.0 + } + features: { + input_names: "C1" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C2" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C3" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C4" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C5" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C6" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C7" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C8" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C9" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C10" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C11" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C12" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C13" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C14" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C15" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C16" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C17" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C18" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C19" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C20" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C21" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C22" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C23" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C24" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + }features: { + input_names: "C25" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C26" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } +} +model_config: { + model_name: 'DeepFM' + model_class: 'RankModel' + feature_groups: { + group_name: "deep_features" + feature_names: "F1" + feature_names: "F2" + feature_names: "F3" + feature_names: "F4" + feature_names: "F5" + feature_names: "F6" + feature_names: "F7" + feature_names: "F8" + feature_names: "F9" + feature_names: "F10" + feature_names: "F11" + feature_names: "F12" + feature_names: "F13" + feature_names: "C1" + feature_names: "C2" + feature_names: "C3" + feature_names: "C4" + feature_names: "C5" + feature_names: "C6" + feature_names: "C7" + feature_names: "C8" + feature_names: "C9" + feature_names: "C10" + feature_names: "C11" + feature_names: "C12" + feature_names: "C13" + feature_names: "C14" + feature_names: "C15" + feature_names: "C16" + feature_names: "C17" + feature_names: "C18" + feature_names: "C19" + feature_names: "C20" + feature_names: "C21" + feature_names: "C22" + feature_names: "C23" + feature_names: "C24" + feature_names: "C25" + feature_names: "C26" + wide_deep:DEEP + } + feature_groups: { + group_name: "wide_features" + feature_names: "F1" + feature_names: "F2" + feature_names: "F3" + feature_names: "F4" + feature_names: "F5" + feature_names: "F6" + feature_names: "F7" + feature_names: "F8" + feature_names: "F9" + feature_names: "F10" + feature_names: "F11" + feature_names: "F12" + feature_names: "F13" + feature_names: "C1" + feature_names: "C2" + feature_names: "C3" + feature_names: "C4" + feature_names: "C5" + feature_names: "C6" + feature_names: "C7" + feature_names: "C8" + feature_names: "C9" + feature_names: "C10" + feature_names: "C11" + feature_names: "C12" + feature_names: "C13" + feature_names: "C14" + feature_names: "C15" + feature_names: "C16" + feature_names: "C17" + feature_names: "C18" + feature_names: "C19" + feature_names: "C20" + feature_names: "C21" + feature_names: "C22" + feature_names: "C23" + feature_names: "C24" + feature_names: "C25" + feature_names: "C26" + wide_deep:WIDE + } + backbone { + blocks { + name: 'wide_features' + inputs { + feature_group_name: 'wide_features' + } + input_layer { + wide_output_dim: 1 + } + } + blocks { + name: 'wide_logit' + inputs { + block_name: 'wide_features' + } + lambda { + expression: 'lambda x: tf.reduce_sum(x, axis=1, keepdims=True)' + } + } + blocks { + name: 'deep_features' + inputs { + feature_group_name: 'deep_features' + } + input_layer { + output_2d_tensor_and_feature_list: true + } + } + blocks { + name: 'fm' + inputs { + block_name: 'deep_features' + input_slice: '[1]' + } + keras_layer { + class_name: 'FM' + st_params { + fields { + key: 'use_variant' + value { bool_value: true } + } + } + } + } + blocks { + name: 'deep' + inputs { + block_name: 'deep_features' + input_slice: '[0]' + } + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [256, 128, 64] + } + } + } + concat_blocks: ['wide_logit', 'fm', 'deep'] + top_mlp { + hidden_units: [256, 128, 64] + } + } + model_params { + l2_regularization: 1e-5 + } + embedding_regularization: 1e-5 +} diff --git a/examples/configs/deepfm_backbone_on_criteo_with_autodis.config b/examples/configs/deepfm_backbone_on_criteo_with_autodis.config new file mode 100644 index 000000000..e0c6ccb43 --- /dev/null +++ b/examples/configs/deepfm_backbone_on_criteo_with_autodis.config @@ -0,0 +1,759 @@ +train_input_path: "examples/data/criteo/criteo_train_data" +eval_input_path: "examples/data/criteo/criteo_test_data" +model_dir: "examples/ckpt/deepfm_autodis_criteo" + +train_config { + log_step_count_steps: 500 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 20000 + sync_replicas: True +} + +eval_config { + metrics_set: { + auc {} + } +} + +data_config { + separator: "\t" + input_fields: { + input_name: "label" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F1" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F2" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F3" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F4" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F5" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F6" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F7" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F8" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F9" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F10" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F11" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F12" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F13" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "C1" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C2" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C3" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C4" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C5" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C6" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C7" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C8" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C9" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C10" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C11" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C12" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C13" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C14" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C15" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C16" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C17" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C18" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C19" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C20" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C21" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C22" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C23" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C24" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C25" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C26" + input_type: STRING + default_val:"" + } + label_fields: "label" + + batch_size: 4096 + num_epochs: 1 + prefetch_size: 32 + input_type: CSVInput +} + +feature_config: { + features: { + input_names: "F1" + feature_type: RawFeature + min_val:0.0 + max_val: 5775.0 + } + features: { + input_names: "F2" + feature_type: RawFeature + min_val: -3.0 + max_val: 257675.0 + } + features: { + input_names: "F3" + feature_type: RawFeature + min_val: 0.0 + max_val: 65535.0 + } + features: { + input_names: "F4" + feature_type: RawFeature + min_val: 0.0 + max_val: 969.0 + } + features: { + input_names: "F5" + feature_type: RawFeature + min_val: 0.0 + max_val: 23159456.0 + } + features: { + input_names: "F6" + feature_type: RawFeature + min_val: 0.0 + max_val: 431037.0 + } + features: { + input_names: "F7" + feature_type: RawFeature + min_val: 0.0 + max_val: 56311.0 + } + features: { + input_names: "F8" + feature_type: RawFeature + min_val: 0.0 + max_val: 6047.0 + } + features: { + input_names: "F9" + feature_type: RawFeature + min_val: 0.0 + max_val: 29019.0 + } + features: { + input_names: "F10" + feature_type: RawFeature + min_val: 0.0 + max_val: 46.0 + } + features: { + input_names: "F11" + feature_type: RawFeature + min_val: 0.0 + max_val: 231.0 + } + features: { + input_names: "F12" + feature_type: RawFeature + min_val: 0.0 + max_val: 4008.0 + } + features: { + input_names: "F13" + feature_type: RawFeature + min_val: 0.0 + max_val: 7393.0 + } + features: { + input_names: "C1" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C2" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C3" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C4" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C5" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C6" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C7" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C8" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C9" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C10" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C11" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C12" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C13" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C14" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C15" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C16" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C17" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C18" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C19" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C20" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C21" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C22" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C23" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C24" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + }features: { + input_names: "C25" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C26" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + feature_name: "D1" + input_names: "F1" + embedding_dim:16 + feature_type: RawFeature + min_val:0.0 + max_val: 5775.0 + } + features: { + feature_name: "D2" + input_names: "F2" + embedding_dim:16 + feature_type: RawFeature + min_val: -3.0 + max_val: 257675.0 + } + features: { + feature_name: "D3" + input_names: "F3" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 65535.0 + } + features: { + feature_name: "D4" + input_names: "F4" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 969.0 + } + features: { + feature_name: "D5" + input_names: "F5" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 23159456.0 + } + features: { + feature_name: "D6" + input_names: "F6" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 431037.0 + } + features: { + feature_name: "D7" + input_names: "F7" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 56311.0 + } + features: { + feature_name: "D8" + input_names: "F8" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 6047.0 + } + features: { + feature_name: "D9" + input_names: "F9" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 29019.0 + } + features: { + feature_name: "D10" + input_names: "F10" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 46.0 + } + features: { + feature_name: "D11" + input_names: "F11" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 231.0 + } + features: { + feature_name: "D12" + input_names: "F12" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 4008.0 + } + features: { + feature_name: "D13" + input_names: "F13" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 7393.0 + } +} +model_config: { + model_name: 'DeepFM with AutoDis' + model_class: 'RankModel' + feature_groups: { + group_name: "numerical_features" + feature_names: "F1" + feature_names: "F2" + feature_names: "F3" + feature_names: "F4" + feature_names: "F5" + feature_names: "F6" + feature_names: "F7" + feature_names: "F8" + feature_names: "F9" + feature_names: "F10" + feature_names: "F11" + feature_names: "F12" + feature_names: "F13" + wide_deep:DEEP + } + feature_groups: { + group_name: "categorical_features" + feature_names: "C1" + feature_names: "C2" + feature_names: "C3" + feature_names: "C4" + feature_names: "C5" + feature_names: "C6" + feature_names: "C7" + feature_names: "C8" + feature_names: "C9" + feature_names: "C10" + feature_names: "C11" + feature_names: "C12" + feature_names: "C13" + feature_names: "C14" + feature_names: "C15" + feature_names: "C16" + feature_names: "C17" + feature_names: "C18" + feature_names: "C19" + feature_names: "C20" + feature_names: "C21" + feature_names: "C22" + feature_names: "C23" + feature_names: "C24" + feature_names: "C25" + feature_names: "C26" + wide_deep:DEEP + } + feature_groups: { + group_name: "wide_features" + feature_names: "D1" + feature_names: "D2" + feature_names: "D3" + feature_names: "D4" + feature_names: "D5" + feature_names: "D6" + feature_names: "D7" + feature_names: "D8" + feature_names: "D9" + feature_names: "D10" + feature_names: "D11" + feature_names: "D12" + feature_names: "D13" + feature_names: "C1" + feature_names: "C2" + feature_names: "C3" + feature_names: "C4" + feature_names: "C5" + feature_names: "C6" + feature_names: "C7" + feature_names: "C8" + feature_names: "C9" + feature_names: "C10" + feature_names: "C11" + feature_names: "C12" + feature_names: "C13" + feature_names: "C14" + feature_names: "C15" + feature_names: "C16" + feature_names: "C17" + feature_names: "C18" + feature_names: "C19" + feature_names: "C20" + feature_names: "C21" + feature_names: "C22" + feature_names: "C23" + feature_names: "C24" + feature_names: "C25" + feature_names: "C26" + wide_deep:WIDE + } + backbone { + blocks { + name: 'wide_features' + inputs { + feature_group_name: 'wide_features' + } + input_layer { + wide_output_dim: 1 + } + } + blocks { + name: 'wide_logit' + inputs { + block_name: 'wide_features' + } + lambda { + expression: 'lambda x: tf.reduce_sum(x, axis=1, keepdims=True)' + } + } + blocks { + name: 'num_emb' + inputs { + feature_group_name: 'numerical_features' + } + keras_layer { + class_name: 'AutoDisEmbedding' + auto_dis_embedding { + embedding_dim: 16 + num_bins: 20 + temperature: 0.815 + output_tensor_list: true + } + } + } + blocks { + name: 'categorical_features' + inputs { + feature_group_name: 'categorical_features' + } + input_layer { + output_2d_tensor_and_feature_list: true + } + } + blocks { + name: 'fm' + inputs { + block_name: 'categorical_features' + input_slice: '[1]' + } + inputs { + block_name: 'num_emb' + input_slice: '[1]' + } + keras_layer { + class_name: 'FM' + fm { + use_variant: true + } + } + } + blocks { + name: 'deep' + inputs { + block_name: 'categorical_features' + input_slice: '[0]' + } + inputs { + block_name: 'num_emb' + input_slice: '[0]' + } + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [256, 128, 64] + } + } + } + # no wide_logit may have better performance + concat_blocks: ['wide_logit', 'fm', 'deep'] + top_mlp { + hidden_units: [256, 128, 64] + } + } + model_params { + l2_regularization: 1e-5 + } + embedding_regularization: 1e-5 +} diff --git a/examples/configs/deepfm_backbone_on_criteo_with_periodic.config b/examples/configs/deepfm_backbone_on_criteo_with_periodic.config new file mode 100644 index 000000000..06753ad2c --- /dev/null +++ b/examples/configs/deepfm_backbone_on_criteo_with_periodic.config @@ -0,0 +1,757 @@ +train_input_path: "examples/data/criteo/criteo_train_data" +eval_input_path: "examples/data/criteo/criteo_test_data" +model_dir: "examples/ckpt/deepfm_periodic_criteo" + +train_config { + log_step_count_steps: 500 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 20000 + sync_replicas: True +} + +eval_config { + metrics_set: { + auc {} + } +} + +data_config { + separator: "\t" + input_fields: { + input_name: "label" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F1" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F2" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F3" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F4" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F5" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F6" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F7" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F8" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F9" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F10" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F11" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F12" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F13" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "C1" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C2" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C3" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C4" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C5" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C6" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C7" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C8" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C9" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C10" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C11" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C12" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C13" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C14" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C15" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C16" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C17" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C18" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C19" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C20" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C21" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C22" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C23" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C24" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C25" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C26" + input_type: STRING + default_val:"" + } + label_fields: "label" + + batch_size: 4096 + num_epochs: 1 + prefetch_size: 32 + input_type: CSVInput +} + +feature_config: { + features: { + input_names: "F1" + feature_type: RawFeature + min_val:0.0 + max_val: 5775.0 + } + features: { + input_names: "F2" + feature_type: RawFeature + min_val: -3.0 + max_val: 257675.0 + } + features: { + input_names: "F3" + feature_type: RawFeature + min_val: 0.0 + max_val: 65535.0 + } + features: { + input_names: "F4" + feature_type: RawFeature + min_val: 0.0 + max_val: 969.0 + } + features: { + input_names: "F5" + feature_type: RawFeature + min_val: 0.0 + max_val: 23159456.0 + } + features: { + input_names: "F6" + feature_type: RawFeature + min_val: 0.0 + max_val: 431037.0 + } + features: { + input_names: "F7" + feature_type: RawFeature + min_val: 0.0 + max_val: 56311.0 + } + features: { + input_names: "F8" + feature_type: RawFeature + min_val: 0.0 + max_val: 6047.0 + } + features: { + input_names: "F9" + feature_type: RawFeature + min_val: 0.0 + max_val: 29019.0 + } + features: { + input_names: "F10" + feature_type: RawFeature + min_val: 0.0 + max_val: 46.0 + } + features: { + input_names: "F11" + feature_type: RawFeature + min_val: 0.0 + max_val: 231.0 + } + features: { + input_names: "F12" + feature_type: RawFeature + min_val: 0.0 + max_val: 4008.0 + } + features: { + input_names: "F13" + feature_type: RawFeature + min_val: 0.0 + max_val: 7393.0 + } + features: { + input_names: "C1" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C2" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C3" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C4" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C5" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C6" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C7" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C8" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C9" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C10" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C11" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C12" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C13" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C14" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C15" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C16" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C17" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C18" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C19" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C20" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C21" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C22" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C23" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C24" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + }features: { + input_names: "C25" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C26" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + feature_name: "D1" + input_names: "F1" + embedding_dim:16 + feature_type: RawFeature + min_val:0.0 + max_val: 5775.0 + } + features: { + feature_name: "D2" + input_names: "F2" + embedding_dim:16 + feature_type: RawFeature + min_val: -3.0 + max_val: 257675.0 + } + features: { + feature_name: "D3" + input_names: "F3" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 65535.0 + } + features: { + feature_name: "D4" + input_names: "F4" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 969.0 + } + features: { + feature_name: "D5" + input_names: "F5" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 23159456.0 + } + features: { + feature_name: "D6" + input_names: "F6" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 431037.0 + } + features: { + feature_name: "D7" + input_names: "F7" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 56311.0 + } + features: { + feature_name: "D8" + input_names: "F8" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 6047.0 + } + features: { + feature_name: "D9" + input_names: "F9" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 29019.0 + } + features: { + feature_name: "D10" + input_names: "F10" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 46.0 + } + features: { + feature_name: "D11" + input_names: "F11" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 231.0 + } + features: { + feature_name: "D12" + input_names: "F12" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 4008.0 + } + features: { + feature_name: "D13" + input_names: "F13" + embedding_dim:16 + feature_type: RawFeature + min_val: 0.0 + max_val: 7393.0 + } +} +model_config: { + model_name: 'DeepFM with Periodic' + model_class: 'RankModel' + feature_groups: { + group_name: "numerical_features" + feature_names: "F1" + feature_names: "F2" + feature_names: "F3" + feature_names: "F4" + feature_names: "F5" + feature_names: "F6" + feature_names: "F7" + feature_names: "F8" + feature_names: "F9" + feature_names: "F10" + feature_names: "F11" + feature_names: "F12" + feature_names: "F13" + wide_deep:DEEP + } + feature_groups: { + group_name: "categorical_features" + feature_names: "C1" + feature_names: "C2" + feature_names: "C3" + feature_names: "C4" + feature_names: "C5" + feature_names: "C6" + feature_names: "C7" + feature_names: "C8" + feature_names: "C9" + feature_names: "C10" + feature_names: "C11" + feature_names: "C12" + feature_names: "C13" + feature_names: "C14" + feature_names: "C15" + feature_names: "C16" + feature_names: "C17" + feature_names: "C18" + feature_names: "C19" + feature_names: "C20" + feature_names: "C21" + feature_names: "C22" + feature_names: "C23" + feature_names: "C24" + feature_names: "C25" + feature_names: "C26" + wide_deep:DEEP + } + feature_groups: { + group_name: "wide_features" + feature_names: "D1" + feature_names: "D2" + feature_names: "D3" + feature_names: "D4" + feature_names: "D5" + feature_names: "D6" + feature_names: "D7" + feature_names: "D8" + feature_names: "D9" + feature_names: "D10" + feature_names: "D11" + feature_names: "D12" + feature_names: "D13" + feature_names: "C1" + feature_names: "C2" + feature_names: "C3" + feature_names: "C4" + feature_names: "C5" + feature_names: "C6" + feature_names: "C7" + feature_names: "C8" + feature_names: "C9" + feature_names: "C10" + feature_names: "C11" + feature_names: "C12" + feature_names: "C13" + feature_names: "C14" + feature_names: "C15" + feature_names: "C16" + feature_names: "C17" + feature_names: "C18" + feature_names: "C19" + feature_names: "C20" + feature_names: "C21" + feature_names: "C22" + feature_names: "C23" + feature_names: "C24" + feature_names: "C25" + feature_names: "C26" + wide_deep:WIDE + } + backbone { + blocks { + name: 'wide_features' + inputs { + feature_group_name: 'wide_features' + } + input_layer { + wide_output_dim: 1 + } + } + blocks { + name: 'wide_logit' + inputs { + block_name: 'wide_features' + } + lambda { + expression: 'lambda x: tf.reduce_sum(x, axis=1, keepdims=True)' + } + } + blocks { + name: 'num_emb' + inputs { + feature_group_name: 'numerical_features' + } + keras_layer { + class_name: 'PeriodicEmbedding' + periodic_embedding { + embedding_dim: 16 + sigma: 0.005 + output_tensor_list: true + } + } + } + blocks { + name: 'categorical_features' + inputs { + feature_group_name: 'categorical_features' + } + input_layer { + output_2d_tensor_and_feature_list: true + } + } + blocks { + name: 'fm' + inputs { + block_name: 'categorical_features' + input_slice: '[1]' + } + inputs { + block_name: 'num_emb' + input_slice: '[1]' + } + keras_layer { + class_name: 'FM' + fm { + use_variant: true + } + } + } + blocks { + name: 'deep' + inputs { + block_name: 'categorical_features' + input_slice: '[0]' + } + inputs { + block_name: 'num_emb' + input_slice: '[0]' + } + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [256, 128, 64] + } + } + } + concat_blocks: ['wide_logit', 'fm', 'deep'] + top_mlp { + hidden_units: [256, 128, 64] + } + } + model_params { + l2_regularization: 1e-5 + } + embedding_regularization: 1e-5 +} diff --git a/examples/configs/deepfm_backbone_on_movielens.config b/examples/configs/deepfm_backbone_on_movielens.config new file mode 100644 index 000000000..56f210b10 --- /dev/null +++ b/examples/configs/deepfm_backbone_on_movielens.config @@ -0,0 +1,246 @@ +train_input_path: "examples/data/movielens_1m/movies_train_data" +eval_input_path: "examples/data/movielens_1m/movies_test_data" +model_dir: "examples/ckpt/deepfm_backbone_movieslen" + +train_config { + log_step_count_steps: 100 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 2000 + sync_replicas: True +} + +eval_config { + metrics_set: { + auc {} + } + metrics_set: { + gauc { + uid_field: 'user_id' + } + } + metrics_set: { + max_f1 {} + } +} + +data_config { + input_fields { + input_name:'label' + input_type: INT32 + } + input_fields { + input_name:'user_id' + input_type: INT32 + } + input_fields { + input_name: 'movie_id' + input_type: INT32 + } + input_fields { + input_name:'rating' + input_type: INT32 + } + input_fields { + input_name: 'gender' + input_type: INT32 + } + input_fields { + input_name: 'age' + input_type: INT32 + } + input_fields { + input_name: 'job_id' + input_type: INT32 + } + input_fields { + input_name: 'zip_id' + input_type: STRING + } + input_fields { + input_name: 'title' + input_type: STRING + } + input_fields { + input_name: 'genres' + input_type: STRING + } + input_fields { + input_name: 'year' + input_type: INT32 + } + + label_fields: 'label' + batch_size: 1024 + num_epochs: 1 + prefetch_size: 32 + input_type: CSVInput + separator: '\t' +} + +feature_config: { + features: { + input_names: 'user_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 12000 + } + features: { + input_names: 'movie_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 6000 + } + features: { + input_names: 'gender' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 2 + } + features: { + input_names: 'job_id' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 21 + } + features: { + input_names: 'age' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 7 + } + features: { + input_names: 'genres' + feature_type: TagFeature + separator: '|' + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'title' + feature_type: SequenceFeature + separator: ' ' + embedding_dim: 16 + hash_bucket_size: 10000 + sequence_combiner: { + text_cnn: { + filter_sizes: [2, 3, 4] + num_filters: [8, 4, 4] + } + } + } + features: { + input_names: 'year' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 36 + } +} +model_config: { + model_name: 'DeepFM' + model_class: 'RankModel' + feature_groups: { + group_name: 'wide' + feature_names: 'user_id' + feature_names: 'movie_id' + feature_names: 'job_id' + feature_names: 'age' + feature_names: 'gender' + feature_names: 'year' + feature_names: 'genres' + wide_deep: WIDE + } + feature_groups: { + group_name: 'features' + feature_names: 'user_id' + feature_names: 'movie_id' + feature_names: 'job_id' + feature_names: 'age' + feature_names: 'gender' + feature_names: 'year' + feature_names: 'genres' + feature_names: 'title' + wide_deep: DEEP + } + backbone { + blocks { + name: 'wide' + inputs { + feature_group_name: 'wide' + } + input_layer { + wide_output_dim: 1 + } + } + blocks { + name: 'features' + inputs { + feature_group_name: 'features' + } + input_layer { + output_2d_tensor_and_feature_list: true + } + } + blocks { + name: 'fm' + inputs { + block_name: 'features' + input_slice: '[1]' + } + keras_layer { + class_name: 'FM' + } + } + blocks { + name: 'deep' + inputs { + block_name: 'features' + input_slice: '[0]' + } + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [256, 128, 64, 1] + use_final_bn: false + final_activation: 'linear' + } + } + } + blocks { + name: 'add' + inputs { + block_name: 'wide' + input_fn: 'lambda x: tf.reduce_sum(x, axis=1, keepdims=True)' + } + inputs { + block_name: 'fm' + } + inputs { + block_name: 'deep' + } + merge_inputs_into_list: true + keras_layer { + class_name: 'Add' + } + } + concat_blocks: 'add' + } + model_params { + l2_regularization: 1e-4 + } + embedding_regularization: 1e-4 +} +export_config { + multi_placeholder: false +} diff --git a/examples/configs/dlrm_backbone_on_criteo.config b/examples/configs/dlrm_backbone_on_criteo.config new file mode 100644 index 000000000..bb7b2a92f --- /dev/null +++ b/examples/configs/dlrm_backbone_on_criteo.config @@ -0,0 +1,578 @@ +# align with raw dlrm model +train_input_path: "examples/data/criteo/criteo_train_data" +eval_input_path: "examples/data/criteo/criteo_test_data" +model_dir: "examples/ckpt/dlrm_backbone_criteo" + +train_config { + log_step_count_steps: 500 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 20000 + sync_replicas: True +} + +eval_config { + metrics_set: { + auc {} + } +} + +data_config { + separator: "\t" + input_fields: { + input_name: "label" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F1" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F2" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F3" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F4" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F5" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F6" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F7" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F8" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F9" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F10" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F11" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F12" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F13" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "C1" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C2" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C3" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C4" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C5" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C6" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C7" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C8" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C9" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C10" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C11" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C12" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C13" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C14" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C15" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C16" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C17" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C18" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C19" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C20" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C21" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C22" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C23" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C24" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C25" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C26" + input_type: STRING + default_val:"" + } + label_fields: "label" + + batch_size: 4096 + num_epochs: 1 + prefetch_size: 32 + input_type: CSVInput +} + +feature_config: { + features: { + input_names: "F1" + feature_type: RawFeature + min_val:0.0 + max_val: 5775.0 + } + features: { + input_names: "F2" + feature_type: RawFeature + min_val: -3.0 + max_val: 257675.0 + } + features: { + input_names: "F3" + feature_type: RawFeature + min_val: 0.0 + max_val: 65535.0 + } + features: { + input_names: "F4" + feature_type: RawFeature + min_val: 0.0 + max_val: 969.0 + } + features: { + input_names: "F5" + feature_type: RawFeature + min_val: 0.0 + max_val: 23159456.0 + } + features: { + input_names: "F6" + feature_type: RawFeature + min_val: 0.0 + max_val: 431037.0 + } + features: { + input_names: "F7" + feature_type: RawFeature + min_val: 0.0 + max_val: 56311.0 + } + features: { + input_names: "F8" + feature_type: RawFeature + min_val: 0.0 + max_val: 6047.0 + } + features: { + input_names: "F9" + feature_type: RawFeature + min_val: 0.0 + max_val: 29019.0 + } + features: { + input_names: "F10" + feature_type: RawFeature + min_val: 0.0 + max_val: 46.0 + } + features: { + input_names: "F11" + feature_type: RawFeature + min_val: 0.0 + max_val: 231.0 + } + features: { + input_names: "F12" + feature_type: RawFeature + min_val: 0.0 + max_val: 4008.0 + } + features: { + input_names: "F13" + feature_type: RawFeature + min_val: 0.0 + max_val: 7393.0 + } + features: { + input_names: "C1" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C2" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C3" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C4" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C5" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C6" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C7" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C8" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C9" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C10" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C11" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C12" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C13" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C14" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C15" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C16" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C17" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C18" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C19" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C20" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C21" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C22" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C23" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C24" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + }features: { + input_names: "C25" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C26" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } +} +model_config: { + model_name: 'DLRM' + model_class: 'RankModel' + feature_groups: { + group_name: "dense" + feature_names: "F1" + feature_names: "F2" + feature_names: "F3" + feature_names: "F4" + feature_names: "F5" + feature_names: "F6" + feature_names: "F7" + feature_names: "F8" + feature_names: "F9" + feature_names: "F10" + feature_names: "F11" + feature_names: "F12" + feature_names: "F13" + wide_deep:DEEP + } + feature_groups: { + group_name: "sparse" + feature_names: "C1" + feature_names: "C2" + feature_names: "C3" + feature_names: "C4" + feature_names: "C5" + feature_names: "C6" + feature_names: "C7" + feature_names: "C8" + feature_names: "C9" + feature_names: "C10" + feature_names: "C11" + feature_names: "C12" + feature_names: "C13" + feature_names: "C14" + feature_names: "C15" + feature_names: "C16" + feature_names: "C17" + feature_names: "C18" + feature_names: "C19" + feature_names: "C20" + feature_names: "C21" + feature_names: "C22" + feature_names: "C23" + feature_names: "C24" + feature_names: "C25" + feature_names: "C26" + wide_deep:DEEP + } + backbone { + blocks { + name: 'bottom_mlp' + inputs { + feature_group_name: 'dense' + } + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [64, 32, 16] + } + } + } + blocks { + name: 'sparse' + inputs { + feature_group_name: 'sparse' + } + input_layer { + output_2d_tensor_and_feature_list: true + } + } + blocks { + name: 'dot' + inputs { + block_name: 'bottom_mlp' + input_fn: 'lambda x: [x]' + } + inputs { + block_name: 'sparse' + input_fn: 'lambda x: x[1]' + } + keras_layer { + class_name: 'DotInteraction' + } + } + blocks { + name: 'sparse_2d' + inputs { + block_name: 'sparse' + input_fn: 'lambda x: x[0]' + } + } + concat_blocks: ['sparse_2d', 'dot'] + top_mlp { + hidden_units: [256, 128, 64] + } + } + model_params { + l2_regularization: 1e-5 + } + embedding_regularization: 1e-5 +} diff --git a/examples/configs/dlrm_on_criteo.config b/examples/configs/dlrm_on_criteo.config new file mode 100644 index 000000000..e6c45d574 --- /dev/null +++ b/examples/configs/dlrm_on_criteo.config @@ -0,0 +1,534 @@ +train_input_path: "examples/data/criteo/criteo_train_data" +eval_input_path: "examples/data/criteo/criteo_test_data" +model_dir: "examples/ckpt/dlrm_criteo_ckpt" + +train_config { + log_step_count_steps: 500 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 20000 + sync_replicas: True +} + +eval_config { + metrics_set: { + auc {} + } +} + +data_config { + separator: "\t" + input_fields: { + input_name: "label" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F1" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F2" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F3" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F4" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F5" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F6" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F7" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F8" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F9" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F10" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F11" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F12" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F13" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "C1" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C2" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C3" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C4" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C5" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C6" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C7" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C8" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C9" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C10" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C11" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C12" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C13" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C14" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C15" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C16" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C17" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C18" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C19" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C20" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C21" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C22" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C23" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C24" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C25" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C26" + input_type: STRING + default_val:"" + } + label_fields: "label" + + batch_size: 4096 + num_epochs: 1 + prefetch_size: 32 + input_type: CSVInput +} + +feature_config: { + features: { + input_names: "F1" + feature_type: RawFeature + min_val:0.0 + max_val: 5775.0 + } + features: { + input_names: "F2" + feature_type: RawFeature + min_val: -3.0 + max_val: 257675.0 + } + features: { + input_names: "F3" + feature_type: RawFeature + min_val: 0.0 + max_val: 65535.0 + } + features: { + input_names: "F4" + feature_type: RawFeature + min_val: 0.0 + max_val: 969.0 + } + features: { + input_names: "F5" + feature_type: RawFeature + min_val: 0.0 + max_val: 23159456.0 + } + features: { + input_names: "F6" + feature_type: RawFeature + min_val: 0.0 + max_val: 431037.0 + } + features: { + input_names: "F7" + feature_type: RawFeature + min_val: 0.0 + max_val: 56311.0 + } + features: { + input_names: "F8" + feature_type: RawFeature + min_val: 0.0 + max_val: 6047.0 + } + features: { + input_names: "F9" + feature_type: RawFeature + min_val: 0.0 + max_val: 29019.0 + } + features: { + input_names: "F10" + feature_type: RawFeature + min_val: 0.0 + max_val: 46.0 + } + features: { + input_names: "F11" + feature_type: RawFeature + min_val: 0.0 + max_val: 231.0 + } + features: { + input_names: "F12" + feature_type: RawFeature + min_val: 0.0 + max_val: 4008.0 + } + features: { + input_names: "F13" + feature_type: RawFeature + min_val: 0.0 + max_val: 7393.0 + } + features: { + input_names: "C1" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C2" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C3" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C4" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C5" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C6" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C7" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C8" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C9" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C10" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C11" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C12" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C13" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C14" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C15" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C16" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C17" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C18" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C19" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C20" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C21" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C22" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C23" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C24" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + }features: { + input_names: "C25" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C26" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } +} +model_config: { + model_class: 'DLRM' + feature_groups: { + group_name: "dense" + feature_names: "F1" + feature_names: "F2" + feature_names: "F3" + feature_names: "F4" + feature_names: "F5" + feature_names: "F6" + feature_names: "F7" + feature_names: "F8" + feature_names: "F9" + feature_names: "F10" + feature_names: "F11" + feature_names: "F12" + feature_names: "F13" + wide_deep:DEEP + } + feature_groups: { + group_name: "sparse" + feature_names: "C1" + feature_names: "C2" + feature_names: "C3" + feature_names: "C4" + feature_names: "C5" + feature_names: "C6" + feature_names: "C7" + feature_names: "C8" + feature_names: "C9" + feature_names: "C10" + feature_names: "C11" + feature_names: "C12" + feature_names: "C13" + feature_names: "C14" + feature_names: "C15" + feature_names: "C16" + feature_names: "C17" + feature_names: "C18" + feature_names: "C19" + feature_names: "C20" + feature_names: "C21" + feature_names: "C22" + feature_names: "C23" + feature_names: "C24" + feature_names: "C25" + feature_names: "C26" + wide_deep:DEEP + } + dlrm { + bot_dnn { + hidden_units: [64, 32, 16] + } + top_dnn { + hidden_units: [256, 128, 64] + } + l2_regularization: 1e-5 + } + embedding_regularization: 1e-5 +} diff --git a/examples/configs/dlrm_on_criteo_with_autodis.config b/examples/configs/dlrm_on_criteo_with_autodis.config new file mode 100644 index 000000000..53de6a279 --- /dev/null +++ b/examples/configs/dlrm_on_criteo_with_autodis.config @@ -0,0 +1,587 @@ +train_input_path: "examples/data/criteo/criteo_train_data" +eval_input_path: "examples/data/criteo/criteo_test_data" +model_dir: "examples/ckpt/dlrm_autodis_criteo" + +train_config { + log_step_count_steps: 500 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 20000 + sync_replicas: True +} + +eval_config { + metrics_set: { + auc {} + } +} + +data_config { + separator: "\t" + input_fields: { + input_name: "label" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F1" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F2" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F3" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F4" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F5" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F6" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F7" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F8" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F9" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F10" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F11" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F12" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F13" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "C1" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C2" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C3" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C4" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C5" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C6" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C7" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C8" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C9" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C10" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C11" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C12" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C13" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C14" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C15" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C16" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C17" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C18" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C19" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C20" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C21" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C22" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C23" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C24" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C25" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C26" + input_type: STRING + default_val:"" + } + label_fields: "label" + + batch_size: 4096 + num_epochs: 1 + prefetch_size: 32 + input_type: CSVInput +} + +feature_config: { + features: { + input_names: "F1" + feature_type: RawFeature + min_val:0.0 + max_val: 5775.0 + } + features: { + input_names: "F2" + feature_type: RawFeature + min_val: -3.0 + max_val: 257675.0 + } + features: { + input_names: "F3" + feature_type: RawFeature + min_val: 0.0 + max_val: 65535.0 + } + features: { + input_names: "F4" + feature_type: RawFeature + min_val: 0.0 + max_val: 969.0 + } + features: { + input_names: "F5" + feature_type: RawFeature + min_val: 0.0 + max_val: 23159456.0 + } + features: { + input_names: "F6" + feature_type: RawFeature + min_val: 0.0 + max_val: 431037.0 + } + features: { + input_names: "F7" + feature_type: RawFeature + min_val: 0.0 + max_val: 56311.0 + } + features: { + input_names: "F8" + feature_type: RawFeature + min_val: 0.0 + max_val: 6047.0 + } + features: { + input_names: "F9" + feature_type: RawFeature + min_val: 0.0 + max_val: 29019.0 + } + features: { + input_names: "F10" + feature_type: RawFeature + min_val: 0.0 + max_val: 46.0 + } + features: { + input_names: "F11" + feature_type: RawFeature + min_val: 0.0 + max_val: 231.0 + } + features: { + input_names: "F12" + feature_type: RawFeature + min_val: 0.0 + max_val: 4008.0 + } + features: { + input_names: "F13" + feature_type: RawFeature + min_val: 0.0 + max_val: 7393.0 + } + features: { + input_names: "C1" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C2" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C3" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C4" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C5" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C6" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C7" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C8" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C9" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C10" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C11" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C12" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C13" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C14" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C15" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C16" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C17" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C18" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C19" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C20" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C21" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C22" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C23" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C24" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + }features: { + input_names: "C25" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C26" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } +} +model_config: { + model_name: 'DLRM with autodis' + model_class: 'RankModel' + feature_groups: { + group_name: "dense" + feature_names: "F1" + feature_names: "F2" + feature_names: "F3" + feature_names: "F4" + feature_names: "F5" + feature_names: "F6" + feature_names: "F7" + feature_names: "F8" + feature_names: "F9" + feature_names: "F10" + feature_names: "F11" + feature_names: "F12" + feature_names: "F13" + wide_deep:DEEP + } + feature_groups: { + group_name: "sparse" + feature_names: "C1" + feature_names: "C2" + feature_names: "C3" + feature_names: "C4" + feature_names: "C5" + feature_names: "C6" + feature_names: "C7" + feature_names: "C8" + feature_names: "C9" + feature_names: "C10" + feature_names: "C11" + feature_names: "C12" + feature_names: "C13" + feature_names: "C14" + feature_names: "C15" + feature_names: "C16" + feature_names: "C17" + feature_names: "C18" + feature_names: "C19" + feature_names: "C20" + feature_names: "C21" + feature_names: "C22" + feature_names: "C23" + feature_names: "C24" + feature_names: "C25" + feature_names: "C26" + wide_deep:DEEP + } + backbone { + blocks { + name: 'num_emb' + inputs { + feature_group_name: 'dense' + } + keras_layer { + class_name: 'AutoDisEmbedding' + auto_dis_embedding { + embedding_dim: 16 + num_bins: 40 + temperature: 0.815 + output_tensor_list: true + } + } + } + blocks { + name: 'sparse' + inputs { + feature_group_name: 'sparse' + } + input_layer { + output_2d_tensor_and_feature_list: true + } + } + blocks { + name: 'dot' + inputs { + block_name: 'num_emb' + input_slice: '[1]' + } + inputs { + block_name: 'sparse' + input_slice: '[1]' + } + keras_layer { + class_name: 'DotInteraction' + } + } + blocks { + name: 'sparse_2d' + inputs { + block_name: 'sparse' + input_slice: '[0]' + } + } + blocks { + name: 'num_emb_2d' + inputs { + block_name: 'num_emb' + input_slice: '[0]' + } + } + concat_blocks: ['num_emb_2d', 'dot', 'sparse_2d'] + top_mlp { + hidden_units: [256, 128, 64] + } + } + model_params { + l2_regularization: 1e-5 + } + embedding_regularization: 1e-5 +} diff --git a/examples/configs/dlrm_on_criteo_with_periodic.config b/examples/configs/dlrm_on_criteo_with_periodic.config new file mode 100644 index 000000000..36c120e95 --- /dev/null +++ b/examples/configs/dlrm_on_criteo_with_periodic.config @@ -0,0 +1,595 @@ +train_input_path: "examples/data/criteo/criteo_train_data" +eval_input_path: "examples/data/criteo/criteo_test_data" +model_dir: "examples/ckpt/dlrm_periodic_criteo" + +train_config { + log_step_count_steps: 500 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 20000 + sync_replicas: True +} + +eval_config { + metrics_set: { + auc {} + } +} + +data_config { + separator: "\t" + input_fields: { + input_name: "label" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F1" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F2" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F3" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F4" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F5" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F6" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F7" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F8" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F9" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F10" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F11" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F12" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F13" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "C1" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C2" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C3" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C4" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C5" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C6" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C7" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C8" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C9" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C10" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C11" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C12" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C13" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C14" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C15" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C16" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C17" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C18" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C19" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C20" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C21" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C22" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C23" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C24" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C25" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C26" + input_type: STRING + default_val:"" + } + label_fields: "label" + + batch_size: 4096 + num_epochs: 1 + prefetch_size: 32 + input_type: CSVInput +} + +feature_config: { + features: { + input_names: "F1" + feature_type: RawFeature + min_val:0.0 + max_val: 5775.0 + } + features: { + input_names: "F2" + feature_type: RawFeature + min_val: -3.0 + max_val: 257675.0 + } + features: { + input_names: "F3" + feature_type: RawFeature + min_val: 0.0 + max_val: 65535.0 + } + features: { + input_names: "F4" + feature_type: RawFeature + min_val: 0.0 + max_val: 969.0 + } + features: { + input_names: "F5" + feature_type: RawFeature + min_val: 0.0 + max_val: 23159456.0 + } + features: { + input_names: "F6" + feature_type: RawFeature + min_val: 0.0 + max_val: 431037.0 + } + features: { + input_names: "F7" + feature_type: RawFeature + min_val: 0.0 + max_val: 56311.0 + } + features: { + input_names: "F8" + feature_type: RawFeature + min_val: 0.0 + max_val: 6047.0 + } + features: { + input_names: "F9" + feature_type: RawFeature + min_val: 0.0 + max_val: 29019.0 + } + features: { + input_names: "F10" + feature_type: RawFeature + min_val: 0.0 + max_val: 46.0 + } + features: { + input_names: "F11" + feature_type: RawFeature + min_val: 0.0 + max_val: 231.0 + } + features: { + input_names: "F12" + feature_type: RawFeature + min_val: 0.0 + max_val: 4008.0 + } + features: { + input_names: "F13" + feature_type: RawFeature + min_val: 0.0 + max_val: 7393.0 + } + features: { + input_names: "C1" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C2" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C3" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C4" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C5" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C6" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C7" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C8" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C9" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C10" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C11" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C12" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C13" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C14" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C15" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C16" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C17" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C18" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C19" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C20" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C21" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C22" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C23" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C24" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + }features: { + input_names: "C25" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C26" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } +} +model_config: { + model_name: 'dlrm with periodic' + model_class: 'RankModel' + feature_groups: { + group_name: "dense" + feature_names: "F1" + feature_names: "F2" + feature_names: "F3" + feature_names: "F4" + feature_names: "F5" + feature_names: "F6" + feature_names: "F7" + feature_names: "F8" + feature_names: "F9" + feature_names: "F10" + feature_names: "F11" + feature_names: "F12" + feature_names: "F13" + wide_deep:DEEP + } + feature_groups: { + group_name: "sparse" + feature_names: "C1" + feature_names: "C2" + feature_names: "C3" + feature_names: "C4" + feature_names: "C5" + feature_names: "C6" + feature_names: "C7" + feature_names: "C8" + feature_names: "C9" + feature_names: "C10" + feature_names: "C11" + feature_names: "C12" + feature_names: "C13" + feature_names: "C14" + feature_names: "C15" + feature_names: "C16" + feature_names: "C17" + feature_names: "C18" + feature_names: "C19" + feature_names: "C20" + feature_names: "C21" + feature_names: "C22" + feature_names: "C23" + feature_names: "C24" + feature_names: "C25" + feature_names: "C26" + wide_deep:DEEP + } + backbone { + blocks { + name: 'num_emb' + inputs { + feature_group_name: 'dense' + } + keras_layer { + class_name: 'PeriodicEmbedding' + st_params { + fields { + key: "output_tensor_list" + value { bool_value: true } + } + fields { + key: "embedding_dim" + value { number_value: 16 } + } + fields { + key: "sigma" + value { number_value: 0.005 } + } + } + } + } + blocks { + name: 'sparse' + inputs { + feature_group_name: 'sparse' + } + input_layer { + output_2d_tensor_and_feature_list: true + } + } + blocks { + name: 'dot' + inputs { + block_name: 'num_emb' + input_slice: '[1]' + } + inputs { + block_name: 'sparse' + input_fn: 'lambda x: x[1]' + } + keras_layer { + class_name: 'DotInteraction' + } + } + blocks { + name: 'sparse_2d' + inputs { + block_name: 'sparse' + input_slice: '[0]' + } + } + blocks { + name: 'num_emb_2d' + inputs { + block_name: 'num_emb' + input_fn: 'lambda x: x[0]' + } + } + concat_blocks: ['num_emb_2d', 'dot', 'sparse_2d'] + top_mlp { + hidden_units: [256, 128, 64] + } + } + model_params { + l2_regularization: 1e-5 + } + embedding_regularization: 1e-5 +} diff --git a/examples/configs/dlrm_standard_on_criteo.config b/examples/configs/dlrm_standard_on_criteo.config new file mode 100644 index 000000000..720560693 --- /dev/null +++ b/examples/configs/dlrm_standard_on_criteo.config @@ -0,0 +1,568 @@ +train_input_path: "examples/data/criteo/criteo_train_data" +eval_input_path: "examples/data/criteo/criteo_test_data" +model_dir: "examples/ckpt/dlrm_standard_criteo" + +train_config { + log_step_count_steps: 500 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 20000 + sync_replicas: True +} + +eval_config { + metrics_set: { + auc {} + } +} + +data_config { + separator: "\t" + input_fields: { + input_name: "label" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F1" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F2" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F3" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F4" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F5" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F6" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F7" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F8" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F9" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F10" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F11" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F12" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F13" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "C1" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C2" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C3" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C4" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C5" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C6" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C7" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C8" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C9" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C10" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C11" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C12" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C13" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C14" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C15" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C16" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C17" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C18" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C19" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C20" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C21" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C22" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C23" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C24" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C25" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C26" + input_type: STRING + default_val:"" + } + label_fields: "label" + + batch_size: 4096 + num_epochs: 1 + prefetch_size: 32 + input_type: CSVInput +} + +feature_config: { + features: { + input_names: "F1" + feature_type: RawFeature + min_val:0.0 + max_val: 5775.0 + } + features: { + input_names: "F2" + feature_type: RawFeature + min_val: -3.0 + max_val: 257675.0 + } + features: { + input_names: "F3" + feature_type: RawFeature + min_val: 0.0 + max_val: 65535.0 + } + features: { + input_names: "F4" + feature_type: RawFeature + min_val: 0.0 + max_val: 969.0 + } + features: { + input_names: "F5" + feature_type: RawFeature + min_val: 0.0 + max_val: 23159456.0 + } + features: { + input_names: "F6" + feature_type: RawFeature + min_val: 0.0 + max_val: 431037.0 + } + features: { + input_names: "F7" + feature_type: RawFeature + min_val: 0.0 + max_val: 56311.0 + } + features: { + input_names: "F8" + feature_type: RawFeature + min_val: 0.0 + max_val: 6047.0 + } + features: { + input_names: "F9" + feature_type: RawFeature + min_val: 0.0 + max_val: 29019.0 + } + features: { + input_names: "F10" + feature_type: RawFeature + min_val: 0.0 + max_val: 46.0 + } + features: { + input_names: "F11" + feature_type: RawFeature + min_val: 0.0 + max_val: 231.0 + } + features: { + input_names: "F12" + feature_type: RawFeature + min_val: 0.0 + max_val: 4008.0 + } + features: { + input_names: "F13" + feature_type: RawFeature + min_val: 0.0 + max_val: 7393.0 + } + features: { + input_names: "C1" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C2" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C3" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C4" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C5" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C6" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C7" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C8" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C9" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C10" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C11" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C12" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C13" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C14" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C15" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C16" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C17" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C18" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C19" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C20" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C21" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C22" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C23" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C24" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + }features: { + input_names: "C25" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C26" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } +} +model_config: { + model_name: 'Stardard DLRM' + model_class: 'RankModel' + feature_groups: { + group_name: "dense" + feature_names: "F1" + feature_names: "F2" + feature_names: "F3" + feature_names: "F4" + feature_names: "F5" + feature_names: "F6" + feature_names: "F7" + feature_names: "F8" + feature_names: "F9" + feature_names: "F10" + feature_names: "F11" + feature_names: "F12" + feature_names: "F13" + wide_deep:DEEP + } + feature_groups: { + group_name: "sparse" + feature_names: "C1" + feature_names: "C2" + feature_names: "C3" + feature_names: "C4" + feature_names: "C5" + feature_names: "C6" + feature_names: "C7" + feature_names: "C8" + feature_names: "C9" + feature_names: "C10" + feature_names: "C11" + feature_names: "C12" + feature_names: "C13" + feature_names: "C14" + feature_names: "C15" + feature_names: "C16" + feature_names: "C17" + feature_names: "C18" + feature_names: "C19" + feature_names: "C20" + feature_names: "C21" + feature_names: "C22" + feature_names: "C23" + feature_names: "C24" + feature_names: "C25" + feature_names: "C26" + wide_deep:DEEP + } + backbone { + blocks { + name: 'bottom_mlp' + inputs { + feature_group_name: 'dense' + } + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [64, 32, 16] + } + } + } + blocks { + name: 'sparse' + inputs { + feature_group_name: 'sparse' + } + input_layer { + only_output_feature_list: true + } + } + blocks { + name: 'dot' + inputs { + block_name: 'bottom_mlp' + } + inputs { + block_name: 'sparse' + } + keras_layer { + class_name: 'DotInteraction' + } + } + concat_blocks: ['bottom_mlp', 'dot'] + top_mlp { + hidden_units: [256, 128, 64] + } + } + model_params { + l2_regularization: 1e-5 + } + embedding_regularization: 1e-5 +} diff --git a/examples/configs/fibinet_on_movielens.config b/examples/configs/fibinet_on_movielens.config new file mode 100644 index 000000000..9c583354b --- /dev/null +++ b/examples/configs/fibinet_on_movielens.config @@ -0,0 +1,204 @@ +train_input_path: "examples/data/movielens_1m/movies_train_data" +eval_input_path: "examples/data/movielens_1m/movies_test_data" +model_dir: "examples/ckpt/fibinet_on_movieslen_ckpt" + +train_config { + log_step_count_steps: 100 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 2000 + sync_replicas: False +} + +eval_config { + metrics_set: { + auc {} + } + metrics_set: { + gauc { + uid_field: 'user_id' + } + } + metrics_set: { + max_f1 {} + } +} + +data_config { + input_fields { + input_name:'label' + input_type: INT32 + } + input_fields { + input_name:'user_id' + input_type: INT32 + } + input_fields { + input_name: 'movie_id' + input_type: INT32 + } + input_fields { + input_name:'rating' + input_type: INT32 + } + input_fields { + input_name: 'gender' + input_type: INT32 + } + input_fields { + input_name: 'age' + input_type: INT32 + } + input_fields { + input_name: 'job_id' + input_type: INT32 + } + input_fields { + input_name: 'zip_id' + input_type: STRING + } + input_fields { + input_name: 'title' + input_type: STRING + } + input_fields { + input_name: 'genres' + input_type: STRING + } + input_fields { + input_name: 'year' + input_type: INT32 + } + + label_fields: 'label' + batch_size: 1024 + num_epochs: 1 + prefetch_size: 32 + input_type: CSVInput + separator: '\t' +} + +feature_config: { + features: { + input_names: 'user_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 12000 + } + features: { + input_names: 'movie_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 6000 + } + features: { + input_names: 'gender' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 2 + } + features: { + input_names: 'job_id' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 21 + } + features: { + input_names: 'age' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 7 + } + features: { + input_names: 'genres' + feature_type: TagFeature + separator: '|' + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'title' + feature_type: SequenceFeature + separator: ' ' + embedding_dim: 16 + hash_bucket_size: 10000 + sequence_combiner: { + text_cnn: { + filter_sizes: [2, 3, 4] + num_filters: [16, 8, 8] + } + } + } + features: { + input_names: 'year' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 36 + } +} +model_config: { + model_name: 'FiBiNet' + model_class: 'RankModel' + feature_groups: { + group_name: 'all' + feature_names: 'user_id' + feature_names: 'movie_id' + feature_names: 'job_id' + feature_names: 'age' + feature_names: 'gender' + feature_names: 'year' + feature_names: 'genres' + wide_deep: DEEP + } + backbone { + blocks { + name: "all" + inputs { + feature_group_name: "all" + } + input_layer { + do_batch_norm: true + only_output_feature_list: true + } + } + blocks { + name: "fibinet" + inputs { + block_name: "all" + } + keras_layer { + class_name: 'FiBiNet' + fibinet { + senet { + reduction_ratio: 4 + } + bilinear { + type: 'each' + num_output_units: 512 + } + mlp { + hidden_units: [512, 256] + } + } + } + } + concat_blocks: ['fibinet'] + } + model_params { + } + embedding_regularization: 1e-4 +} +export_config { + multi_placeholder: false +} diff --git a/examples/configs/masknet_on_movielens.config b/examples/configs/masknet_on_movielens.config new file mode 100644 index 000000000..2d3c0da21 --- /dev/null +++ b/examples/configs/masknet_on_movielens.config @@ -0,0 +1,200 @@ +train_input_path: "examples/data/movielens_1m/movies_train_data" +eval_input_path: "examples/data/movielens_1m/movies_test_data" +model_dir: "examples/ckpt/masknet_on_movieslen_ckpt" + +train_config { + log_step_count_steps: 100 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 2000 + sync_replicas: True +} + +eval_config { + metrics_set: { + auc {} + } + metrics_set: { + gauc { + uid_field: 'user_id' + } + } + metrics_set: { + max_f1 {} + } +} + +data_config { + input_fields { + input_name:'label' + input_type: INT32 + } + input_fields { + input_name:'user_id' + input_type: INT32 + } + input_fields { + input_name: 'movie_id' + input_type: INT32 + } + input_fields { + input_name:'rating' + input_type: INT32 + } + input_fields { + input_name: 'gender' + input_type: INT32 + } + input_fields { + input_name: 'age' + input_type: INT32 + } + input_fields { + input_name: 'job_id' + input_type: INT32 + } + input_fields { + input_name: 'zip_id' + input_type: STRING + } + input_fields { + input_name: 'title' + input_type: STRING + } + input_fields { + input_name: 'genres' + input_type: STRING + } + input_fields { + input_name: 'year' + input_type: INT32 + } + + label_fields: 'label' + batch_size: 1024 + num_epochs: 1 + prefetch_size: 32 + input_type: CSVInput + separator: '\t' +} + +feature_config: { + features: { + input_names: 'user_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 12000 + } + features: { + input_names: 'movie_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 6000 + } + features: { + input_names: 'gender' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 2 + } + features: { + input_names: 'job_id' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 21 + } + features: { + input_names: 'age' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 7 + } + features: { + input_names: 'genres' + feature_type: TagFeature + separator: '|' + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'title' + feature_type: SequenceFeature + separator: ' ' + embedding_dim: 16 + hash_bucket_size: 10000 + sequence_combiner: { + text_cnn: { + filter_sizes: [2, 3, 4] + num_filters: [16, 8, 8] + } + } + } + features: { + input_names: 'year' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 36 + } +} +model_config: { + model_name: 'MaskNet' + model_class: 'RankModel' + feature_groups: { + group_name: 'all' + feature_names: 'user_id' + feature_names: 'movie_id' + feature_names: 'job_id' + feature_names: 'age' + feature_names: 'gender' + feature_names: 'year' + feature_names: 'genres' + wide_deep: DEEP + } + backbone { + blocks { + name: "mask_net" + inputs { + feature_group_name: "all" + } + keras_layer { + class_name: 'MaskNet' + masknet { + mask_blocks { + aggregation_size: 512 + output_size: 256 + } + mask_blocks { + aggregation_size: 512 + output_size: 256 + } + mask_blocks { + aggregation_size: 512 + output_size: 256 + } + mlp { + hidden_units: [512, 256] + } + } + } + } + concat_blocks: ['mask_net'] + } + model_params { + l2_regularization: 1e-5 + } + embedding_regularization: 1e-4 +} +export_config { + multi_placeholder: false +} diff --git a/examples/configs/mlp_on_movielens.config b/examples/configs/mlp_on_movielens.config new file mode 100644 index 000000000..4660125a3 --- /dev/null +++ b/examples/configs/mlp_on_movielens.config @@ -0,0 +1,239 @@ +train_input_path: "examples/data/movielens_1m/movies_train_data" +eval_input_path: "examples/data/movielens_1m/movies_test_data" +model_dir: "examples/ckpt/mlp_movieslen" + +train_config { + log_step_count_steps: 100 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 2000 + sync_replicas: True +} + +eval_config { + metrics_set: { + auc {} + } + metrics_set: { + gauc { + uid_field: 'user_id' + } + } + metrics_set: { + max_f1 {} + } +} + +data_config { + input_fields { + input_name:'label' + input_type: INT32 + } + input_fields { + input_name:'user_id' + input_type: INT32 + } + input_fields { + input_name: 'movie_id' + input_type: INT32 + } + input_fields { + input_name:'rating' + input_type: INT32 + } + input_fields { + input_name: 'gender' + input_type: INT32 + } + input_fields { + input_name: 'age' + input_type: INT32 + } + input_fields { + input_name: 'job_id' + input_type: INT32 + } + input_fields { + input_name: 'zip_id' + input_type: STRING + } + input_fields { + input_name: 'title' + input_type: STRING + } + input_fields { + input_name: 'genres' + input_type: STRING + } + input_fields { + input_name: 'year' + input_type: INT32 + } + + label_fields: 'label' + batch_size: 1024 + num_epochs: 1 + prefetch_size: 32 + input_type: CSVInput + separator: '\t' +} + +feature_config: { + features: { + input_names: 'user_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 12000 + } + features: { + input_names: 'movie_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 6000 + } + features: { + input_names: 'gender' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 2 + } + features: { + input_names: 'job_id' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 21 + } + features: { + input_names: 'age' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 7 + } + features: { + input_names: 'genres' + feature_type: TagFeature + separator: '|' + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'title' + feature_type: SequenceFeature + separator: ' ' + embedding_dim: 16 + hash_bucket_size: 10000 + sequence_combiner: { + text_cnn: { + filter_sizes: [2, 3, 4] + num_filters: [16, 8, 8] + } + } + } + features: { + input_names: 'year' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 36 + } +} +model_config: { + model_class: "RankModel" + feature_groups: { + group_name: 'features' + feature_names: 'user_id' + feature_names: 'movie_id' + feature_names: 'job_id' + feature_names: 'age' + feature_names: 'gender' + feature_names: 'year' + feature_names: 'genres' + wide_deep: DEEP + } + backbone { + blocks { + name: 'mlp' + inputs { + feature_group_name: 'features' + } + layers { + keras_layer { + class_name: 'Dense' + st_params { + fields { + key: 'units' + value: { number_value: 256 } + } + fields { + key: 'activation' + value: { string_value: 'relu' } + } + } + } + } + layers { + keras_layer { + class_name: 'Dropout' + st_params { + fields { + key: 'rate' + value: { number_value: 0.5 } + } + } + } + } + layers { + keras_layer { + class_name: 'Dense' + st_params { + fields { + key: 'units' + value: { number_value: 256 } + } + fields { + key: 'activation' + value: { string_value: 'relu' } + } + } + } + } + layers { + keras_layer { + class_name: 'Dropout' + st_params { + fields { + key: 'rate' + value: { number_value: 0.5 } + } + } + } + } + layers { + keras_layer { + class_name: 'Dense' + st_params { + fields { + key: 'units' + value: { number_value: 1 } + } + } + } + } + } + concat_blocks: 'mlp' + } + model_params { + l2_regularization: 1e-4 + } + embedding_regularization: 1e-4 +} diff --git a/examples/configs/multi_tower_on_movielens.config b/examples/configs/multi_tower_on_movielens.config new file mode 100644 index 000000000..25cad1309 --- /dev/null +++ b/examples/configs/multi_tower_on_movielens.config @@ -0,0 +1,221 @@ +train_input_path: "examples/data/movielens_1m/movies_train_data" +eval_input_path: "examples/data/movielens_1m/movies_test_data" +model_dir: "examples/ckpt/multi_tower_movieslen" + +train_config { + log_step_count_steps: 100 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 2000 + sync_replicas: True +} + +eval_config { + metrics_set: { + auc {} + } + metrics_set: { + gauc { + uid_field: 'user_id' + } + } + metrics_set: { + max_f1 {} + } +} + +data_config { + input_fields { + input_name:'label' + input_type: INT32 + } + input_fields { + input_name:'user_id' + input_type: INT32 + } + input_fields { + input_name: 'movie_id' + input_type: INT32 + } + input_fields { + input_name:'rating' + input_type: INT32 + } + input_fields { + input_name: 'gender' + input_type: INT32 + } + input_fields { + input_name: 'age' + input_type: INT32 + } + input_fields { + input_name: 'job_id' + input_type: INT32 + } + input_fields { + input_name: 'zip_id' + input_type: STRING + } + input_fields { + input_name: 'title' + input_type: STRING + } + input_fields { + input_name: 'genres' + input_type: STRING + } + input_fields { + input_name: 'year' + input_type: INT32 + } + + label_fields: 'label' + batch_size: 1024 + num_epochs: 1 + prefetch_size: 32 + input_type: CSVInput + separator: '\t' +} + +feature_config: { + features: { + input_names: 'user_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 12000 + } + features: { + input_names: 'movie_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 6000 + } + features: { + input_names: 'gender' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 2 + } + features: { + input_names: 'job_id' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 21 + } + features: { + input_names: 'age' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 7 + } + features: { + input_names: 'genres' + feature_type: TagFeature + separator: '|' + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'title' + feature_type: SequenceFeature + separator: ' ' + embedding_dim: 16 + hash_bucket_size: 10000 + sequence_combiner: { + text_cnn: { + filter_sizes: [2, 3, 4] + num_filters: [16, 8, 8] + } + } + } + features: { + input_names: 'year' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 36 + } +} +model_config: { + model_name: "multi tower" + model_class: "RankModel" + feature_groups: { + group_name: 'user' + feature_names: 'user_id' + feature_names: 'job_id' + feature_names: 'age' + feature_names: 'gender' + wide_deep: DEEP + } + feature_groups: { + group_name: 'item' + feature_names: 'movie_id' + feature_names: 'year' + feature_names: 'genres' + wide_deep: DEEP + } + backbone { + packages { + name: 'user_tower' + blocks { + name: 'mlp' + inputs { + feature_group_name: 'user' + } + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [256, 128] + } + } + } + } + packages { + name: 'item_tower' + blocks { + name: 'mlp' + inputs { + feature_group_name: 'item' + } + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [256, 128] + } + } + } + } + blocks { + name: 'top_mlp' + inputs { + package_name: 'user_tower' + } + inputs { + package_name: 'item_tower' + } + layers { + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [128, 64] + } + } + } + } + } + model_params { + l2_regularization: 1e-4 + } + embedding_regularization: 1e-4 +} diff --git a/examples/configs/wide_and_deep_backbone_on_movielens.config b/examples/configs/wide_and_deep_backbone_on_movielens.config new file mode 100644 index 000000000..d3c069611 --- /dev/null +++ b/examples/configs/wide_and_deep_backbone_on_movielens.config @@ -0,0 +1,219 @@ +train_input_path: "examples/data/movielens_1m/movies_train_data" +eval_input_path: "examples/data/movielens_1m/movies_test_data" +model_dir: "examples/ckpt/wide_and_deep_movieslen" + +train_config { + log_step_count_steps: 100 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 2000 + sync_replicas: True +} + +eval_config { + metrics_set: { + auc {} + } + metrics_set: { + gauc { + uid_field: 'user_id' + } + } + metrics_set: { + max_f1 {} + } +} + +data_config { + input_fields { + input_name:'label' + input_type: INT32 + } + input_fields { + input_name:'user_id' + input_type: INT32 + } + input_fields { + input_name: 'movie_id' + input_type: INT32 + } + input_fields { + input_name:'rating' + input_type: INT32 + } + input_fields { + input_name: 'gender' + input_type: INT32 + } + input_fields { + input_name: 'age' + input_type: INT32 + } + input_fields { + input_name: 'job_id' + input_type: INT32 + } + input_fields { + input_name: 'zip_id' + input_type: STRING + } + input_fields { + input_name: 'title' + input_type: STRING + } + input_fields { + input_name: 'genres' + input_type: STRING + } + input_fields { + input_name: 'year' + input_type: INT32 + } + + label_fields: 'label' + batch_size: 1024 + num_epochs: 1 + prefetch_size: 32 + input_type: CSVInput + separator: '\t' +} + +feature_config: { + features: { + input_names: 'user_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 12000 + } + features: { + input_names: 'movie_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 6000 + } + features: { + input_names: 'gender' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 2 + } + features: { + input_names: 'job_id' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 21 + } + features: { + input_names: 'age' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 7 + } + features: { + input_names: 'genres' + feature_type: TagFeature + separator: '|' + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'title' + feature_type: SequenceFeature + separator: ' ' + embedding_dim: 16 + hash_bucket_size: 10000 + sequence_combiner: { + text_cnn: { + filter_sizes: [2, 3, 4] + num_filters: [16, 8, 8] + } + } + } + features: { + input_names: 'year' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 36 + } +} +model_config: { + model_class: "RankModel" + feature_groups: { + group_name: 'wide' + feature_names: 'user_id' + feature_names: 'movie_id' + feature_names: 'job_id' + feature_names: 'age' + feature_names: 'gender' + feature_names: 'year' + feature_names: 'genres' + wide_deep: WIDE + } + feature_groups: { + group_name: 'deep' + feature_names: 'user_id' + feature_names: 'movie_id' + feature_names: 'job_id' + feature_names: 'age' + feature_names: 'gender' + feature_names: 'year' + feature_names: 'genres' + wide_deep: DEEP + } + backbone { + blocks { + name: 'wide' + inputs { + feature_group_name: 'wide' + } + input_layer { + wide_output_dim: 1 + only_output_feature_list: true + } + } + blocks { + name: 'deep_logit' + inputs { + feature_group_name: 'deep' + } + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [256, 256, 256, 1] + use_final_bn: false + final_activation: 'linear' + } + } + } + blocks { + name: 'final_logit' + inputs { + block_name: 'wide' + input_fn: 'lambda x: tf.add_n(x)' + } + inputs { + block_name: 'deep_logit' + } + merge_inputs_into_list: true + keras_layer { + class_name: 'Add' + } + } + concat_blocks: 'final_logit' + } + model_params { + l2_regularization: 1e-4 + } + embedding_regularization: 1e-4 +} diff --git a/examples/data/criteo/process_criteo_kaggle.py b/examples/data/criteo/process_criteo_kaggle.py index 60b7d9776..5b9cb4f34 100644 --- a/examples/data/criteo/process_criteo_kaggle.py +++ b/examples/data/criteo/process_criteo_kaggle.py @@ -11,8 +11,9 @@ samples_num = data_train.shape[0] print('samples_num:', samples_num, round(samples_num * 0.9)) -data_train[:round(samples_num * 0.9)].to_csv( +train_num = int(round(samples_num * 0.9)) +data_train[:train_num].to_csv( r'criteo_train_data', index=False, sep='\t', mode='a', header=False) -data_train[round(samples_num * 0.9):].to_csv( +data_train[train_num:].to_csv( r'criteo_test_data', index=False, sep='\t', mode='a', header=False) print('Done.') diff --git a/examples/rank_model/readme.md b/examples/rank_model/readme.md index 15d3f4dca..f6a2ba791 100644 --- a/examples/rank_model/readme.md +++ b/examples/rank_model/readme.md @@ -32,10 +32,12 @@ | MovieLens-1M | DeepFM | 0.8688 | | MovieLens-1M | DCN | 0.8576 | | MovieLens-1M | AutoInt | 0.8513 | +| MovieLens-1M | MaskNet | 0.8872 | +| MovieLens-1M | FibiNet | 0.8879 | # Criteo Research Kaggle 数据集 -在MovieLens-1M 数据集中, 我们提供了2个模型上的demo示例。 +在 `Criteo Research Kaggle` 数据集中, 我们提供了2个模型上的demo示例。 [FM](fm.md) / [DeepFM](deepfm.md) diff --git a/examples/readme.md b/examples/readme.md index 6a9ed63d3..71117b5e0 100644 --- a/examples/readme.md +++ b/examples/readme.md @@ -5,6 +5,7 @@ 这些Demo包含了在公开数据集上针对不同模型做的多种实验,涵盖了推荐系统中的召回任务和排序任务,主要包括数据集下载、预处理、模型配置、训练及评估等过程。 # 安装EasyRec + 我们提供了`本地Anaconda安装`和`Docker镜像启动`两种方式。 ## 本地Anaconda安装 @@ -49,7 +50,7 @@ sudo docker run -td --network host -v /local_path:/docker_path mybigpai-registry sudo docker exec -it bash ``` -注:需匹配当前EasyRec版本。 +注:\需匹配当前EasyRec版本。 # 准备数据集 @@ -99,14 +100,22 @@ EasyRec的模型训练和评估都是基于config配置文件的,配置文件 - [deepfm_on_movielens.config](configs/deepfm_on_movielens.config) +- [deepfm_backbone_on_movielens.config](configs/deepfm_backbone_on_movielens.config) + - [dcn_on_movielens.config](configs/dcn_on_movielens.config) - [autoint_on_movielens.config](configs/autoint_on_movielens.config) +- [masknet_on_movielens.config](configs/masknet_on_movielens.config) + +- [fibinet_on_movielens.config](configs/fibinet_on_movielens.config) + - [fm_on_criteo.config](configs/fm_on_criteo.config) - [deepfm_on_criteo.config](configs/deepfm_on_criteo.config) +- [deepfm_backbone_on_criteo.config](configs/deepfm_backbone_on_criteo.config) + **召回任务** - [dssm_on_books.config](configs/dssm_on_books.config) @@ -227,19 +236,36 @@ python -m easy_rec.python.train_eval --pipeline_config_path examples/configs/dee - MovieLens-1M - | Model | Epoch | AUC | - | --------- | ----- | ------ | - | Wide&Deep | 1 | 0.8558 | - | DeepFM | 1 | 0.8688 | - | DCN | 1 | 0.8576 | - | AutoInt | 1 | 0.8513 | + | Model | Epoch | AUC | + | -------------------- | ----- | ------ | + | MLP | 1 | 0.8616 | + | Wide&Deep | 1 | 0.8558 | + | Wide&Deep(Backbone) | 1 | 0.8854 | + | MultiTower(Backbone) | 1 | 0.8814 | + | DeepFM | 1 | 0.8867 | + | DeepFM(Backbone) | 1 | 0.8872 | + | DCN | 1 | 0.8576 | + | DCN_v2 | 1 | 0.8770 | + | AutoInt | 1 | 0.8513 | + | MaskNet | 1 | 0.8872 | + | FibiNet | 1 | 0.8893 | + + 备注:`MovieLens-1M` 数据集较小,评估指标方差较大,以上结果仅供参考。 - Criteo-Research - | Model | Epoch | AUC | - | ------ | ----- | ------ | - | FM | 1 | 0.7577 | - | DeepFM | 1 | 0.7967 | + | Model | Epoch | AUC | + | ----------------- | ----- | ------- | + | FM | 1 | 0.7577 | + | DeepFM | 1 | 0.7970 | + | DeepFM (backbone) | 1 | 0.7970 | + | DeepFM (periodic) | 1 | 0.7979 | + | DeepFM (autodis) | 1 | 0.7982 | + | DLRM | 1 | 0.79785 | + | DLRM (backbone) | 1 | 0.7983 | + | DLRM (standard) | 1 | 0.7949 | + | DLRM (autodis) | 1 | 0.7989 | + | DLRM (periodic) | 1 | 0.7998 | ### 召回模型 diff --git a/samples/model_config/dbmtl_backbone_on_taobao.config b/samples/model_config/dbmtl_backbone_on_taobao.config new file mode 100644 index 000000000..aafe5a9ef --- /dev/null +++ b/samples/model_config/dbmtl_backbone_on_taobao.config @@ -0,0 +1,316 @@ +train_input_path: "data/test/tb_data/taobao_train_data" +eval_input_path: "data/test/tb_data/taobao_test_data" +model_dir: "experiments/dbmtl_backbone_taobao_ckpt" + +train_config { + optimizer_config { + adam_optimizer { + learning_rate { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 1e-07 + } + } + } + use_moving_average: false + } + num_steps: 200 + sync_replicas: true + save_checkpoints_steps: 100 + log_step_count_steps: 100 +} +eval_config { + metrics_set { + auc { + } + } +} +data_config { + batch_size: 4096 + label_fields: "clk" + label_fields: "buy" + prefetch_size: 32 + input_type: CSVInput + input_fields { + input_name: "clk" + input_type: INT32 + } + input_fields { + input_name: "buy" + input_type: INT32 + } + input_fields { + input_name: "pid" + input_type: STRING + } + input_fields { + input_name: "adgroup_id" + input_type: STRING + } + input_fields { + input_name: "cate_id" + input_type: STRING + } + input_fields { + input_name: "campaign_id" + input_type: STRING + } + input_fields { + input_name: "customer" + input_type: STRING + } + input_fields { + input_name: "brand" + input_type: STRING + } + input_fields { + input_name: "user_id" + input_type: STRING + } + input_fields { + input_name: "cms_segid" + input_type: STRING + } + input_fields { + input_name: "cms_group_id" + input_type: STRING + } + input_fields { + input_name: "final_gender_code" + input_type: STRING + } + input_fields { + input_name: "age_level" + input_type: STRING + } + input_fields { + input_name: "pvalue_level" + input_type: STRING + } + input_fields { + input_name: "shopping_level" + input_type: STRING + } + input_fields { + input_name: "occupation" + input_type: STRING + } + input_fields { + input_name: "new_user_class_level" + input_type: STRING + } + input_fields { + input_name: "tag_category_list" + input_type: STRING + } + input_fields { + input_name: "tag_brand_list" + input_type: STRING + } + input_fields { + input_name: "price" + input_type: INT32 + } +} +feature_config: { + features { + input_names: "pid" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "adgroup_id" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features { + input_names: "cate_id" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10000 + } + features { + input_names: "campaign_id" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features { + input_names: "customer" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features { + input_names: "brand" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features { + input_names: "user_id" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features { + input_names: "cms_segid" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features { + input_names: "cms_group_id" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features { + input_names: "final_gender_code" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "age_level" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "pvalue_level" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "shopping_level" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "occupation" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "new_user_class_level" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "tag_category_list" + feature_type: TagFeature + embedding_dim: 16 + hash_bucket_size: 100000 + separator: "|" + } + features { + input_names: "tag_brand_list" + feature_type: TagFeature + embedding_dim: 16 + hash_bucket_size: 100000 + separator: "|" + } + features { + input_names: "price" + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 50 + } +} +model_config { + model_name: "DBMTL" + model_class: "MultiTaskModel" + feature_groups { + group_name: "all" + feature_names: "user_id" + feature_names: "cms_segid" + feature_names: "cms_group_id" + feature_names: "age_level" + feature_names: "pvalue_level" + feature_names: "shopping_level" + feature_names: "occupation" + feature_names: "new_user_class_level" + feature_names: "adgroup_id" + feature_names: "cate_id" + feature_names: "campaign_id" + feature_names: "customer" + feature_names: "brand" + feature_names: "price" + feature_names: "pid" + feature_names: "tag_category_list" + feature_names: "tag_brand_list" + wide_deep: DEEP + } + backbone { + blocks { + name: "mask_net" + inputs { + feature_group_name: "all" + } + keras_layer { + class_name: 'MaskNet' + masknet { + mask_blocks { + aggregation_size: 512 + output_size: 256 + } + mask_blocks { + aggregation_size: 512 + output_size: 256 + } + mask_blocks { + aggregation_size: 512 + output_size: 256 + } + mlp { + hidden_units: [512, 256] + } + } + } + } + } + model_params { + task_towers { + tower_name: "ctr" + label_name: "clk" + loss_type: CLASSIFICATION + metrics_set: { + auc {} + } + dnn { + hidden_units: [256, 128, 64, 32] + } + relation_dnn { + hidden_units: [32] + } + weight: 1.0 + } + task_towers { + tower_name: "cvr" + label_name: "buy" + loss_type: CLASSIFICATION + metrics_set: { + auc {} + } + dnn { + hidden_units: [256, 128, 64, 32] + } + relation_tower_names: ["ctr"] + relation_dnn { + hidden_units: [32] + } + weight: 1.0 + } + l2_regularization: 1e-6 + } + embedding_regularization: 5e-6 +} diff --git a/samples/model_config/dcn_backbone_on_taobao.config b/samples/model_config/dcn_backbone_on_taobao.config new file mode 100644 index 000000000..86f4e2462 --- /dev/null +++ b/samples/model_config/dcn_backbone_on_taobao.config @@ -0,0 +1,291 @@ +train_input_path: "data/test/tb_data/taobao_train_data" +eval_input_path: "data/test/tb_data/taobao_test_data" +model_dir: "experiments/dcn_backbone_taobao_ckpt" + +train_config { + log_step_count_steps: 100 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 100 + sync_replicas: True + num_steps: 100 +} + +eval_config { + metrics_set: { + auc {} + } +} + +data_config { + input_fields { + input_name:'clk' + input_type: INT32 + } + input_fields { + input_name:'buy' + input_type: INT32 + } + input_fields { + input_name: 'pid' + input_type: STRING + } + input_fields { + input_name: 'adgroup_id' + input_type: STRING + } + input_fields { + input_name: 'cate_id' + input_type: STRING + } + input_fields { + input_name: 'campaign_id' + input_type: STRING + } + input_fields { + input_name: 'customer' + input_type: STRING + } + input_fields { + input_name: 'brand' + input_type: STRING + } + input_fields { + input_name: 'user_id' + input_type: STRING + } + input_fields { + input_name: 'cms_segid' + input_type: STRING + } + input_fields { + input_name: 'cms_group_id' + input_type: STRING + } + input_fields { + input_name: 'final_gender_code' + input_type: STRING + } + input_fields { + input_name: 'age_level' + input_type: STRING + } + input_fields { + input_name: 'pvalue_level' + input_type: STRING + } + input_fields { + input_name: 'shopping_level' + input_type: STRING + } + input_fields { + input_name: 'occupation' + input_type: STRING + } + input_fields { + input_name: 'new_user_class_level' + input_type: STRING + } + input_fields { + input_name: 'tag_category_list' + input_type: STRING + } + input_fields { + input_name: 'tag_brand_list' + input_type: STRING + } + input_fields { + input_name: 'price' + input_type: INT32 + } + + label_fields: 'clk' + batch_size: 4096 + num_epochs: 10000 + prefetch_size: 32 + input_type: CSVInput +} + +feature_config: { + features: { + input_names: 'pid' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'adgroup_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'cate_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10000 + } + features: { + input_names: 'campaign_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'customer' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'brand' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'user_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'cms_segid' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'cms_group_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'final_gender_code' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'age_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'pvalue_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'shopping_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'occupation' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'new_user_class_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'tag_category_list' + feature_type: TagFeature + separator: '|' + hash_bucket_size: 100000 + embedding_dim: 16 + } + features: { + input_names: 'tag_brand_list' + feature_type: TagFeature + separator: '|' + hash_bucket_size: 100000 + embedding_dim: 16 + } + features: { + input_names: 'price' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 50 + } +} +model_config: { + model_class: 'RankModel' + feature_groups: { + group_name: 'all' + feature_names: 'user_id' + feature_names: 'cms_segid' + feature_names: 'cms_group_id' + feature_names: 'age_level' + feature_names: 'pvalue_level' + feature_names: 'shopping_level' + feature_names: 'occupation' + feature_names: 'new_user_class_level' + feature_names: 'adgroup_id' + feature_names: 'cate_id' + feature_names: 'campaign_id' + feature_names: 'customer' + feature_names: 'brand' + feature_names: 'price' + feature_names: 'pid' + feature_names: 'tag_category_list' + feature_names: 'tag_brand_list' + wide_deep: DEEP + } + backbone { + blocks { + name: "deep" + inputs { + feature_group_name: "all" + } + keras_layer { + class_name: "MLP" + mlp { + hidden_units: [256, 128, 64] + } + } + } + blocks { + name: "cross" + inputs { + feature_group_name: "all" + input_fn: "lambda x: [x, x]" + } + recurrent { + num_steps: 5 + fixed_input_index: 0 + keras_layer { + class_name: "Cross" + } + } + } + concat_blocks: ['deep', 'cross'] + top_mlp { + hidden_units: [64, 32, 16] + } + } + model_params { + l2_regularization: 1e-6 + } + embedding_regularization: 1e-4 +} diff --git a/samples/model_config/deepfm_on_criteo_with_autodis.config b/samples/model_config/deepfm_on_criteo_with_autodis.config new file mode 100755 index 000000000..41975c090 --- /dev/null +++ b/samples/model_config/deepfm_on_criteo_with_autodis.config @@ -0,0 +1,786 @@ +train_input_path: "data/test/criteo_sample.tfrecord" +eval_input_path: "data/test/criteo_sample.tfrecord" + +model_dir: "experiments/deepfm_with_autodis" + +train_config { + log_step_count_steps: 20 + # fine_tune_checkpoint: "" + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.0001 + decay_steps: 10000 + decay_factor: 0.5 + min_learning_rate: 0.0000001 + } + } + } + use_moving_average: false + } + + num_steps: 100 +} + +eval_config { + metrics_set: { + auc {} + } +} + +data_config { + separator: "\t" + input_fields: { + input_name: "label" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F1" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F2" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F3" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F4" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F5" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F6" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F7" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F8" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F9" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F10" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F11" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F12" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F13" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "C1" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C2" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C3" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C4" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C5" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C6" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C7" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C8" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C9" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C10" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C11" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C12" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C13" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C14" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C15" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C16" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C17" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C18" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C19" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C20" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C21" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C22" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C23" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C24" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C25" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C26" + input_type: INT64 + default_val:"" + } + label_fields: "label" + + batch_size: 8096 + num_epochs: 10000 + prefetch_size: 32 + input_type: TFRecordInput +} + +feature_config: { + features: { + input_names: "F1" + feature_type: RawFeature + min_val:0.0 + max_val: 5775.0 + } + features: { + input_names: "F2" + feature_type: RawFeature + min_val: -3.0 + max_val: 257675.0 + } + features: { + input_names: "F3" + feature_type: RawFeature + min_val: 0.0 + max_val: 65535.0 + } + features: { + input_names: "F4" + feature_type: RawFeature + min_val: 0.0 + max_val: 969.0 + } + features: { + input_names: "F5" + feature_type: RawFeature + min_val: 0.0 + max_val: 23159456.0 + } + features: { + input_names: "F6" + feature_type: RawFeature + min_val: 0.0 + max_val: 431037.0 + } + features: { + input_names: "F7" + feature_type: RawFeature + min_val: 0.0 + max_val: 56311.0 + } + features: { + input_names: "F8" + feature_type: RawFeature + min_val: 0.0 + max_val: 6047.0 + } + features: { + input_names: "F9" + feature_type: RawFeature + min_val: 0.0 + max_val: 29019.0 + } + features: { + input_names: "F10" + feature_type: RawFeature + min_val: 0.0 + max_val: 46.0 + } + features: { + input_names: "F11" + feature_type: RawFeature + min_val: 0.0 + max_val: 231.0 + } + features: { + input_names: "F12" + feature_type: RawFeature + min_val: 0.0 + max_val: 4008.0 + } + features: { + input_names: "F13" + feature_type: RawFeature + min_val: 0.0 + max_val: 7393.0 + } + features: { + input_names: "C1" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C2" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C3" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C4" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C5" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C6" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C7" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C8" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C9" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C10" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C11" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C12" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C13" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C14" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C15" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C16" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C17" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C18" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C19" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C20" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C21" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C22" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C23" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C24" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C25" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C26" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + feature_name: "D1" + input_names: "F1" + embedding_dim:10 + feature_type: RawFeature + min_val:0.0 + max_val: 5775.0 + } + features: { + feature_name: "D2" + input_names: "F2" + embedding_dim:10 + feature_type: RawFeature + min_val: -3.0 + max_val: 257675.0 + } + features: { + feature_name: "D3" + input_names: "F3" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 65535.0 + } + features: { + feature_name: "D4" + input_names: "F4" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 969.0 + } + features: { + feature_name: "D5" + input_names: "F5" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 23159456.0 + } + features: { + feature_name: "D6" + input_names: "F6" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 431037.0 + } + features: { + feature_name: "D7" + input_names: "F7" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 56311.0 + } + features: { + feature_name: "D8" + input_names: "F8" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 6047.0 + } + features: { + feature_name: "D9" + input_names: "F9" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 29019.0 + } + features: { + feature_name: "D10" + input_names: "F10" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 46.0 + } + features: { + feature_name: "D11" + input_names: "F11" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 231.0 + } + features: { + feature_name: "D12" + input_names: "F12" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 4008.0 + } + features: { + feature_name: "D13" + input_names: "F13" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 7393.0 + } +} +model_config:{ + model_class: 'RankModel' + feature_groups: { + group_name: "numerical_features" + feature_names: "F1" + feature_names: "F2" + feature_names: "F3" + feature_names: "F4" + feature_names: "F5" + feature_names: "F6" + feature_names: "F7" + feature_names: "F8" + feature_names: "F9" + feature_names: "F10" + feature_names: "F11" + feature_names: "F12" + feature_names: "F13" + wide_deep:DEEP + } + feature_groups: { + group_name: "categorical_features" + feature_names: "C1" + feature_names: "C2" + feature_names: "C3" + feature_names: "C4" + feature_names: "C5" + feature_names: "C6" + feature_names: "C7" + feature_names: "C8" + feature_names: "C9" + feature_names: "C10" + feature_names: "C11" + feature_names: "C12" + feature_names: "C13" + feature_names: "C14" + feature_names: "C15" + feature_names: "C16" + feature_names: "C17" + feature_names: "C18" + feature_names: "C19" + feature_names: "C20" + feature_names: "C21" + feature_names: "C22" + feature_names: "C23" + feature_names: "C24" + feature_names: "C25" + feature_names: "C26" + wide_deep:DEEP + } + feature_groups: { + group_name: "wide_features" + feature_names: "D1" + feature_names: "D2" + feature_names: "D3" + feature_names: "D4" + feature_names: "D5" + feature_names: "D6" + feature_names: "D7" + feature_names: "D8" + feature_names: "D9" + feature_names: "D10" + feature_names: "D11" + feature_names: "D12" + feature_names: "D13" + feature_names: "C1" + feature_names: "C2" + feature_names: "C3" + feature_names: "C4" + feature_names: "C5" + feature_names: "C6" + feature_names: "C7" + feature_names: "C8" + feature_names: "C9" + feature_names: "C10" + feature_names: "C11" + feature_names: "C12" + feature_names: "C13" + feature_names: "C14" + feature_names: "C15" + feature_names: "C16" + feature_names: "C17" + feature_names: "C18" + feature_names: "C19" + feature_names: "C20" + feature_names: "C21" + feature_names: "C22" + feature_names: "C23" + feature_names: "C24" + feature_names: "C25" + feature_names: "C26" + wide_deep:WIDE + } + backbone { + blocks { + name: 'wide_features' + inputs { + feature_group_name: 'wide_features' + } + input_layer { + wide_output_dim: 1 + } + } + blocks { + name: 'wide_logit' + inputs { + block_name: 'wide_features' + } + lambda { + expression: 'lambda x: tf.reduce_sum(x, axis=1, keepdims=True)' + } + } + blocks { + name: 'num_emb' + inputs { + feature_group_name: 'numerical_features' + } + keras_layer { + class_name: 'AutoDisEmbedding' + auto_dis_embedding { + embedding_dim: 10 + num_bins: 20 + temperature: 0.815 + output_tensor_list: true + } + } + } + blocks { + name: 'categorical_features' + inputs { + feature_group_name: 'categorical_features' + } + input_layer { + output_2d_tensor_and_feature_list: true + } + } + blocks { + name: 'fm' + inputs { + block_name: 'categorical_features' + input_fn: 'lambda x: x[1]' + } + inputs { + block_name: 'num_emb' + input_fn: 'lambda x: x[1]' + } + keras_layer { + class_name: 'FM' + fm { + use_variant: true + } + } + } + blocks { + name: 'deep' + inputs { + block_name: 'categorical_features' + input_fn: 'lambda x: x[0]' + } + inputs { + block_name: 'num_emb' + input_fn: 'lambda x: x[0]' + } + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [256, 128, 64] + } + } + } + concat_blocks: ['wide_logit', 'fm', 'deep'] + top_mlp { + hidden_units: [256, 128, 64] + } + } + model_params { + l2_regularization: 1e-5 + } + embedding_regularization: 1e-5 +} diff --git a/samples/model_config/deepfm_on_criteo_with_periodic.config b/samples/model_config/deepfm_on_criteo_with_periodic.config new file mode 100755 index 000000000..081fbf2cf --- /dev/null +++ b/samples/model_config/deepfm_on_criteo_with_periodic.config @@ -0,0 +1,785 @@ +train_input_path: "data/test/criteo_sample.tfrecord" +eval_input_path: "data/test/criteo_sample.tfrecord" + +model_dir: "experiments/deepfm_with_periodic" + +train_config { + log_step_count_steps: 20 + # fine_tune_checkpoint: "" + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.0001 + decay_steps: 10000 + decay_factor: 0.5 + min_learning_rate: 0.0000001 + } + } + } + use_moving_average: false + } + + num_steps: 100 +} + +eval_config { + metrics_set: { + auc {} + } +} + +data_config { + separator: "\t" + input_fields: { + input_name: "label" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F1" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F2" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F3" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F4" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F5" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F6" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F7" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F8" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F9" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F10" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F11" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F12" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F13" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "C1" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C2" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C3" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C4" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C5" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C6" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C7" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C8" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C9" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C10" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C11" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C12" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C13" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C14" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C15" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C16" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C17" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C18" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C19" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C20" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C21" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C22" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C23" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C24" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C25" + input_type: INT64 + default_val:"" + } + input_fields: { + input_name: "C26" + input_type: INT64 + default_val:"" + } + label_fields: "label" + + batch_size: 8096 + num_epochs: 10000 + prefetch_size: 32 + input_type: TFRecordInput +} + +feature_config: { + features: { + input_names: "F1" + feature_type: RawFeature + min_val:0.0 + max_val: 5775.0 + } + features: { + input_names: "F2" + feature_type: RawFeature + min_val: -3.0 + max_val: 257675.0 + } + features: { + input_names: "F3" + feature_type: RawFeature + min_val: 0.0 + max_val: 65535.0 + } + features: { + input_names: "F4" + feature_type: RawFeature + min_val: 0.0 + max_val: 969.0 + } + features: { + input_names: "F5" + feature_type: RawFeature + min_val: 0.0 + max_val: 23159456.0 + } + features: { + input_names: "F6" + feature_type: RawFeature + min_val: 0.0 + max_val: 431037.0 + } + features: { + input_names: "F7" + feature_type: RawFeature + min_val: 0.0 + max_val: 56311.0 + } + features: { + input_names: "F8" + feature_type: RawFeature + min_val: 0.0 + max_val: 6047.0 + } + features: { + input_names: "F9" + feature_type: RawFeature + min_val: 0.0 + max_val: 29019.0 + } + features: { + input_names: "F10" + feature_type: RawFeature + min_val: 0.0 + max_val: 46.0 + } + features: { + input_names: "F11" + feature_type: RawFeature + min_val: 0.0 + max_val: 231.0 + } + features: { + input_names: "F12" + feature_type: RawFeature + min_val: 0.0 + max_val: 4008.0 + } + features: { + input_names: "F13" + feature_type: RawFeature + min_val: 0.0 + max_val: 7393.0 + } + features: { + input_names: "C1" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C2" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C3" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C4" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C5" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C6" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C7" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C8" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C9" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C10" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C11" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C12" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C13" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C14" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C15" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C16" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C17" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C18" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C19" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C20" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C21" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C22" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C23" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C24" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C25" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + input_names: "C26" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 10 + embedding_name: "vocab_embed" + } + features: { + feature_name: "D1" + input_names: "F1" + embedding_dim:10 + feature_type: RawFeature + min_val:0.0 + max_val: 5775.0 + } + features: { + feature_name: "D2" + input_names: "F2" + embedding_dim:10 + feature_type: RawFeature + min_val: -3.0 + max_val: 257675.0 + } + features: { + feature_name: "D3" + input_names: "F3" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 65535.0 + } + features: { + feature_name: "D4" + input_names: "F4" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 969.0 + } + features: { + feature_name: "D5" + input_names: "F5" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 23159456.0 + } + features: { + feature_name: "D6" + input_names: "F6" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 431037.0 + } + features: { + feature_name: "D7" + input_names: "F7" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 56311.0 + } + features: { + feature_name: "D8" + input_names: "F8" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 6047.0 + } + features: { + feature_name: "D9" + input_names: "F9" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 29019.0 + } + features: { + feature_name: "D10" + input_names: "F10" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 46.0 + } + features: { + feature_name: "D11" + input_names: "F11" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 231.0 + } + features: { + feature_name: "D12" + input_names: "F12" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 4008.0 + } + features: { + feature_name: "D13" + input_names: "F13" + embedding_dim:10 + feature_type: RawFeature + min_val: 0.0 + max_val: 7393.0 + } +} +model_config:{ + model_class: 'RankModel' + feature_groups: { + group_name: "numerical_features" + feature_names: "F1" + feature_names: "F2" + feature_names: "F3" + feature_names: "F4" + feature_names: "F5" + feature_names: "F6" + feature_names: "F7" + feature_names: "F8" + feature_names: "F9" + feature_names: "F10" + feature_names: "F11" + feature_names: "F12" + feature_names: "F13" + wide_deep:DEEP + } + feature_groups: { + group_name: "categorical_features" + feature_names: "C1" + feature_names: "C2" + feature_names: "C3" + feature_names: "C4" + feature_names: "C5" + feature_names: "C6" + feature_names: "C7" + feature_names: "C8" + feature_names: "C9" + feature_names: "C10" + feature_names: "C11" + feature_names: "C12" + feature_names: "C13" + feature_names: "C14" + feature_names: "C15" + feature_names: "C16" + feature_names: "C17" + feature_names: "C18" + feature_names: "C19" + feature_names: "C20" + feature_names: "C21" + feature_names: "C22" + feature_names: "C23" + feature_names: "C24" + feature_names: "C25" + feature_names: "C26" + wide_deep:DEEP + } + feature_groups: { + group_name: "wide_features" + feature_names: "D1" + feature_names: "D2" + feature_names: "D3" + feature_names: "D4" + feature_names: "D5" + feature_names: "D6" + feature_names: "D7" + feature_names: "D8" + feature_names: "D9" + feature_names: "D10" + feature_names: "D11" + feature_names: "D12" + feature_names: "D13" + feature_names: "C1" + feature_names: "C2" + feature_names: "C3" + feature_names: "C4" + feature_names: "C5" + feature_names: "C6" + feature_names: "C7" + feature_names: "C8" + feature_names: "C9" + feature_names: "C10" + feature_names: "C11" + feature_names: "C12" + feature_names: "C13" + feature_names: "C14" + feature_names: "C15" + feature_names: "C16" + feature_names: "C17" + feature_names: "C18" + feature_names: "C19" + feature_names: "C20" + feature_names: "C21" + feature_names: "C22" + feature_names: "C23" + feature_names: "C24" + feature_names: "C25" + feature_names: "C26" + wide_deep:WIDE + } + backbone { + blocks { + name: 'wide_features' + inputs { + feature_group_name: 'wide_features' + } + input_layer { + wide_output_dim: 1 + } + } + blocks { + name: 'wide_logit' + inputs { + block_name: 'wide_features' + } + lambda { + expression: 'lambda x: tf.reduce_sum(x, axis=1, keepdims=True)' + } + } + blocks { + name: 'num_emb' + inputs { + feature_group_name: 'numerical_features' + } + keras_layer { + class_name: 'PeriodicEmbedding' + periodic_embedding { + embedding_dim: 10 + sigma: 0.005 + output_tensor_list: true + } + } + } + blocks { + name: 'categorical_features' + inputs { + feature_group_name: 'categorical_features' + } + input_layer { + output_2d_tensor_and_feature_list: true + } + } + blocks { + name: 'fm' + inputs { + block_name: 'categorical_features' + input_fn: 'lambda x: x[1]' + } + inputs { + block_name: 'num_emb' + input_fn: 'lambda x: x[1]' + } + keras_layer { + class_name: 'FM' + fm { + use_variant: true + } + } + } + blocks { + name: 'deep' + inputs { + block_name: 'categorical_features' + input_fn: 'lambda x: x[0]' + } + inputs { + block_name: 'num_emb' + input_fn: 'lambda x: x[0]' + } + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [256, 128, 64] + } + } + } + concat_blocks: ['wide_logit', 'fm', 'deep'] + top_mlp { + hidden_units: [256, 128, 64] + } + } + model_params { + l2_regularization: 1e-5 + } + embedding_regularization: 1e-5 +} diff --git a/samples/model_config/dlrm_backbone_on_taobao.config b/samples/model_config/dlrm_backbone_on_taobao.config new file mode 100644 index 000000000..a66f1d190 --- /dev/null +++ b/samples/model_config/dlrm_backbone_on_taobao.config @@ -0,0 +1,299 @@ +train_input_path: "data/test/tb_data/taobao_train_data" +eval_input_path: "data/test/tb_data/taobao_test_data" +model_dir: "experiments/dlrm_backbone_taobao_ckpt" + +train_config { + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 100 + log_step_count_steps: 10 + sync_replicas: true + num_steps: 100 +} + +eval_config { + metrics_set: { + auc {} + } +} + +data_config { + input_fields { + input_name:'clk' + input_type: INT32 + } + input_fields { + input_name:'buy' + input_type: INT32 + } + input_fields { + input_name: 'pid' + input_type: STRING + } + input_fields { + input_name: 'adgroup_id' + input_type: STRING + } + input_fields { + input_name: 'cate_id' + input_type: STRING + } + input_fields { + input_name: 'campaign_id' + input_type: STRING + } + input_fields { + input_name: 'customer' + input_type: STRING + } + input_fields { + input_name: 'brand' + input_type: STRING + } + input_fields { + input_name: 'user_id' + input_type: STRING + } + input_fields { + input_name: 'cms_segid' + input_type: STRING + } + input_fields { + input_name: 'cms_group_id' + input_type: STRING + } + input_fields { + input_name: 'final_gender_code' + input_type: STRING + } + input_fields { + input_name: 'age_level' + input_type: DOUBLE + } + input_fields { + input_name: 'pvalue_level' + input_type: DOUBLE + } + input_fields { + input_name: 'shopping_level' + input_type: DOUBLE + } + input_fields { + input_name: 'occupation' + input_type: STRING + } + input_fields { + input_name: 'new_user_class_level' + input_type: DOUBLE + } + input_fields { + input_name: 'tag_category_list' + input_type: STRING + } + input_fields { + input_name: 'tag_brand_list' + input_type: STRING + } + input_fields { + input_name: 'price' + input_type: DOUBLE + } + + label_fields: 'clk' + batch_size: 4096 + num_epochs: 10000 + prefetch_size: 32 + input_type: CSVInput +} + +feature_config: { + features: { + input_names: 'pid' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'adgroup_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'cate_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10000 + } + features: { + input_names: 'campaign_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'customer' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'brand' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'user_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'cms_segid' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'cms_group_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'final_gender_code' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'age_level' + feature_type: RawFeature + } + features: { + input_names: 'pvalue_level' + feature_type: RawFeature + } + features: { + input_names: 'shopping_level' + feature_type: RawFeature + } + features: { + input_names: 'occupation' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'new_user_class_level' + feature_type: RawFeature + } + features: { + input_names: 'tag_category_list' + feature_type: TagFeature + separator: '|' + hash_bucket_size: 10000 + embedding_dim: 16 + } + features: { + input_names: 'tag_brand_list' + feature_type: TagFeature + separator: '|' + hash_bucket_size: 100000 + embedding_dim: 16 + } + features: { + input_names: 'price' + feature_type: RawFeature + } +} +model_config { + model_class: 'RankModel' + + feature_groups { + group_name: 'dense' + feature_names: 'age_level' + feature_names: 'pvalue_level' + feature_names: 'shopping_level' + feature_names: 'new_user_class_level' + feature_names: 'price' + + wide_deep: DEEP + } + + feature_groups { + group_name: 'sparse' + feature_names: 'user_id' + feature_names: 'cms_segid' + feature_names: 'cms_group_id' + feature_names: 'occupation' + feature_names: 'adgroup_id' + feature_names: 'cate_id' + feature_names: 'campaign_id' + feature_names: 'customer' + feature_names: 'brand' + feature_names: 'pid' + feature_names: 'tag_category_list' + feature_names: 'tag_brand_list' + + wide_deep: DEEP + } + backbone { + blocks { + name: 'bottom_mlp' + inputs { + feature_group_name: 'dense' + } + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [64, 32, 16] + } + } + } + blocks { + name: 'sparse' + inputs { + feature_group_name: 'sparse' + } + input_layer { + only_output_feature_list: true + } + } + blocks { + name: 'dot' + inputs { + block_name: 'bottom_mlp' + input_fn: 'lambda x: [x]' + } + inputs { + block_name: 'sparse' + } + keras_layer { + class_name: 'DotInteraction' + } + } + concat_blocks: ['bottom_mlp', 'dot'] + top_mlp { + hidden_units: [256, 128, 64] + } + } + model_params { + } + embedding_regularization: 1e-5 +} + +export_config { +} diff --git a/samples/model_config/fibinet_on_taobao.config b/samples/model_config/fibinet_on_taobao.config new file mode 100644 index 000000000..05736d118 --- /dev/null +++ b/samples/model_config/fibinet_on_taobao.config @@ -0,0 +1,293 @@ +train_input_path: "data/test/tb_data/taobao_train_data" +eval_input_path: "data/test/tb_data/taobao_test_data" +model_dir: "experiments/fibinet_taobao_ckpt" + +train_config { + log_step_count_steps: 100 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 100 + sync_replicas: True + num_steps: 100 +} + +eval_config { + metrics_set: { + auc {} + } +} + +data_config { + input_fields { + input_name:'clk' + input_type: INT32 + } + input_fields { + input_name:'buy' + input_type: INT32 + } + input_fields { + input_name: 'pid' + input_type: STRING + } + input_fields { + input_name: 'adgroup_id' + input_type: STRING + } + input_fields { + input_name: 'cate_id' + input_type: STRING + } + input_fields { + input_name: 'campaign_id' + input_type: STRING + } + input_fields { + input_name: 'customer' + input_type: STRING + } + input_fields { + input_name: 'brand' + input_type: STRING + } + input_fields { + input_name: 'user_id' + input_type: STRING + } + input_fields { + input_name: 'cms_segid' + input_type: STRING + } + input_fields { + input_name: 'cms_group_id' + input_type: STRING + } + input_fields { + input_name: 'final_gender_code' + input_type: STRING + } + input_fields { + input_name: 'age_level' + input_type: STRING + } + input_fields { + input_name: 'pvalue_level' + input_type: STRING + } + input_fields { + input_name: 'shopping_level' + input_type: STRING + } + input_fields { + input_name: 'occupation' + input_type: STRING + } + input_fields { + input_name: 'new_user_class_level' + input_type: STRING + } + input_fields { + input_name: 'tag_category_list' + input_type: STRING + } + input_fields { + input_name: 'tag_brand_list' + input_type: STRING + } + input_fields { + input_name: 'price' + input_type: INT32 + } + + label_fields: 'clk' + batch_size: 4096 + num_epochs: 10000 + prefetch_size: 32 + input_type: CSVInput +} + +feature_config: { + features: { + input_names: 'pid' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'adgroup_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'cate_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10000 + } + features: { + input_names: 'campaign_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'customer' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'brand' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'user_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'cms_segid' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'cms_group_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'final_gender_code' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'age_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'pvalue_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'shopping_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'occupation' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'new_user_class_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'tag_category_list' + feature_type: TagFeature + separator: '|' + hash_bucket_size: 100000 + embedding_dim: 16 + } + features: { + input_names: 'tag_brand_list' + feature_type: TagFeature + separator: '|' + hash_bucket_size: 100000 + embedding_dim: 16 + } + features: { + input_names: 'price' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 50 + } +} +model_config: { + model_class: 'RankModel' + feature_groups: { + group_name: 'all' + feature_names: 'user_id' + feature_names: 'cms_segid' + feature_names: 'cms_group_id' + feature_names: 'age_level' + feature_names: 'pvalue_level' + feature_names: 'shopping_level' + feature_names: 'occupation' + feature_names: 'new_user_class_level' + feature_names: 'adgroup_id' + feature_names: 'cate_id' + feature_names: 'campaign_id' + feature_names: 'customer' + feature_names: 'brand' + feature_names: 'price' + feature_names: 'pid' + feature_names: 'tag_category_list' + feature_names: 'tag_brand_list' + wide_deep: DEEP + } + backbone { + blocks { + name: "all" + inputs { + feature_group_name: "all" + } + input_layer { + do_batch_norm: true + only_output_feature_list: true + } + } + blocks { + name: "fibinet" + inputs { + block_name: "all" + } + keras_layer { + class_name: 'FiBiNet' + fibinet { + senet { + reduction_ratio: 4 + } + bilinear { + type: 'each' + num_output_units: 512 + } + mlp { + hidden_units: [512, 256] + } + } + } + } + concat_blocks: ['fibinet'] + } + model_params { + l2_regularization: 1e-6 + } + embedding_regularization: 1e-4 +} diff --git a/samples/model_config/masknet_on_taobao.config b/samples/model_config/masknet_on_taobao.config new file mode 100644 index 000000000..26b8c8262 --- /dev/null +++ b/samples/model_config/masknet_on_taobao.config @@ -0,0 +1,288 @@ +train_input_path: "data/test/tb_data/taobao_train_data" +eval_input_path: "data/test/tb_data/taobao_test_data" +model_dir: "experiments/masknet_taobao_ckpt" + +train_config { + log_step_count_steps: 100 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 100 + sync_replicas: True + num_steps: 100 +} + +eval_config { + metrics_set: { + auc {} + } +} + +data_config { + input_fields { + input_name:'clk' + input_type: INT32 + } + input_fields { + input_name:'buy' + input_type: INT32 + } + input_fields { + input_name: 'pid' + input_type: STRING + } + input_fields { + input_name: 'adgroup_id' + input_type: STRING + } + input_fields { + input_name: 'cate_id' + input_type: STRING + } + input_fields { + input_name: 'campaign_id' + input_type: STRING + } + input_fields { + input_name: 'customer' + input_type: STRING + } + input_fields { + input_name: 'brand' + input_type: STRING + } + input_fields { + input_name: 'user_id' + input_type: STRING + } + input_fields { + input_name: 'cms_segid' + input_type: STRING + } + input_fields { + input_name: 'cms_group_id' + input_type: STRING + } + input_fields { + input_name: 'final_gender_code' + input_type: STRING + } + input_fields { + input_name: 'age_level' + input_type: STRING + } + input_fields { + input_name: 'pvalue_level' + input_type: STRING + } + input_fields { + input_name: 'shopping_level' + input_type: STRING + } + input_fields { + input_name: 'occupation' + input_type: STRING + } + input_fields { + input_name: 'new_user_class_level' + input_type: STRING + } + input_fields { + input_name: 'tag_category_list' + input_type: STRING + } + input_fields { + input_name: 'tag_brand_list' + input_type: STRING + } + input_fields { + input_name: 'price' + input_type: INT32 + } + + label_fields: 'clk' + batch_size: 4096 + num_epochs: 10000 + prefetch_size: 32 + input_type: CSVInput +} + +feature_config: { + features: { + input_names: 'pid' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'adgroup_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'cate_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10000 + } + features: { + input_names: 'campaign_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'customer' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'brand' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'user_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'cms_segid' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'cms_group_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'final_gender_code' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'age_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'pvalue_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'shopping_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'occupation' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'new_user_class_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'tag_category_list' + feature_type: TagFeature + separator: '|' + hash_bucket_size: 100000 + embedding_dim: 16 + } + features: { + input_names: 'tag_brand_list' + feature_type: TagFeature + separator: '|' + hash_bucket_size: 100000 + embedding_dim: 16 + } + features: { + input_names: 'price' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 50 + } +} +model_config: { + model_class: 'RankModel' + feature_groups: { + group_name: 'all' + feature_names: 'user_id' + feature_names: 'cms_segid' + feature_names: 'cms_group_id' + feature_names: 'age_level' + feature_names: 'pvalue_level' + feature_names: 'shopping_level' + feature_names: 'occupation' + feature_names: 'new_user_class_level' + feature_names: 'adgroup_id' + feature_names: 'cate_id' + feature_names: 'campaign_id' + feature_names: 'customer' + feature_names: 'brand' + feature_names: 'price' + feature_names: 'pid' + feature_names: 'tag_category_list' + feature_names: 'tag_brand_list' + wide_deep: DEEP + } + backbone { + blocks { + name: "mask_net" + inputs { + feature_group_name: "all" + } + keras_layer { + class_name: 'MaskNet' + masknet { + mask_blocks { + aggregation_size: 512 + output_size: 256 + } + mask_blocks { + aggregation_size: 512 + output_size: 256 + } + mask_blocks { + aggregation_size: 512 + output_size: 256 + } + mlp { + hidden_units: [512, 256] + } + } + } + } + concat_blocks: ['mask_net'] + } + model_params { + l2_regularization: 1e-6 + } + embedding_regularization: 1e-4 +} diff --git a/samples/model_config/mmoe_backbone_on_taobao.config b/samples/model_config/mmoe_backbone_on_taobao.config new file mode 100644 index 000000000..39018342c --- /dev/null +++ b/samples/model_config/mmoe_backbone_on_taobao.config @@ -0,0 +1,316 @@ +train_input_path: "data/test/tb_data/taobao_train_data" +eval_input_path: "data/test/tb_data/taobao_test_data" +model_dir: "experiments/mmoe_backbone_taobao_ckpt" + +train_config { + optimizer_config { + adam_optimizer { + learning_rate { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 1e-07 + } + } + } + use_moving_average: false + } + num_steps: 200 + sync_replicas: true + save_checkpoints_steps: 100 + log_step_count_steps: 100 +} +data_config { + batch_size: 4096 + label_fields: "clk" + label_fields: "buy" + prefetch_size: 32 + input_type: CSVInput + input_fields { + input_name: "clk" + input_type: INT32 + } + input_fields { + input_name: "buy" + input_type: INT32 + } + input_fields { + input_name: "pid" + input_type: STRING + } + input_fields { + input_name: "adgroup_id" + input_type: STRING + } + input_fields { + input_name: "cate_id" + input_type: STRING + } + input_fields { + input_name: "campaign_id" + input_type: STRING + } + input_fields { + input_name: "customer" + input_type: STRING + } + input_fields { + input_name: "brand" + input_type: STRING + } + input_fields { + input_name: "user_id" + input_type: STRING + } + input_fields { + input_name: "cms_segid" + input_type: STRING + } + input_fields { + input_name: "cms_group_id" + input_type: STRING + } + input_fields { + input_name: "final_gender_code" + input_type: STRING + } + input_fields { + input_name: "age_level" + input_type: STRING + } + input_fields { + input_name: "pvalue_level" + input_type: STRING + } + input_fields { + input_name: "shopping_level" + input_type: STRING + } + input_fields { + input_name: "occupation" + input_type: STRING + } + input_fields { + input_name: "new_user_class_level" + input_type: STRING + } + input_fields { + input_name: "tag_category_list" + input_type: STRING + } + input_fields { + input_name: "tag_brand_list" + input_type: STRING + } + input_fields { + input_name: "price" + input_type: INT32 + } +} +feature_config: { + features { + input_names: "pid" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "adgroup_id" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features { + input_names: "cate_id" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10000 + } + features { + input_names: "campaign_id" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features { + input_names: "customer" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features { + input_names: "brand" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features { + input_names: "user_id" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features { + input_names: "cms_segid" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features { + input_names: "cms_group_id" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features { + input_names: "final_gender_code" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "age_level" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "pvalue_level" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "shopping_level" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "occupation" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "new_user_class_level" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "tag_category_list" + feature_type: TagFeature + embedding_dim: 16 + hash_bucket_size: 100000 + separator: "|" + } + features { + input_names: "tag_brand_list" + feature_type: TagFeature + embedding_dim: 16 + hash_bucket_size: 100000 + separator: "|" + } + features { + input_names: "price" + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 50 + } +} +model_config { + model_name: "MMoE" + model_class: "MultiTaskModel" + feature_groups { + group_name: "all" + feature_names: "user_id" + feature_names: "cms_segid" + feature_names: "cms_group_id" + feature_names: "age_level" + feature_names: "pvalue_level" + feature_names: "shopping_level" + feature_names: "occupation" + feature_names: "new_user_class_level" + feature_names: "adgroup_id" + feature_names: "cate_id" + feature_names: "campaign_id" + feature_names: "customer" + feature_names: "brand" + feature_names: "price" + feature_names: "pid" + feature_names: "tag_category_list" + feature_names: "tag_brand_list" + wide_deep: DEEP + } + backbone { + blocks { + name: 'all' + inputs { + feature_group_name: 'all' + } + input_layer { + only_output_feature_list: true + } + } + blocks { + name: "senet" + inputs { + block_name: "all" + } + keras_layer { + class_name: 'SENet' + senet { + reduction_ratio: 4 + } + } + } + blocks { + name: "mmoe" + inputs { + block_name: "senet" + } + keras_layer { + class_name: 'MMoE' + mmoe { + num_task: 2 + num_expert: 3 + expert_mlp { + hidden_units: [256, 128] + } + } + } + } + } + model_params { + task_towers { + tower_name: "ctr" + label_name: "clk" + dnn { + hidden_units: [128, 64] + } + num_class: 1 + weight: 1.0 + loss_type: CLASSIFICATION + metrics_set: { + auc {} + } + } + task_towers { + tower_name: "cvr" + label_name: "buy" + dnn { + hidden_units: [128, 64] + } + num_class: 1 + weight: 1.0 + loss_type: CLASSIFICATION + metrics_set: { + auc {} + } + } + l2_regularization: 1e-06 + } + embedding_regularization: 5e-05 +} diff --git a/samples/model_config/multi_tower_backbone_on_taobao.config b/samples/model_config/multi_tower_backbone_on_taobao.config new file mode 100644 index 000000000..93ec357e4 --- /dev/null +++ b/samples/model_config/multi_tower_backbone_on_taobao.config @@ -0,0 +1,348 @@ +train_input_path: "data/test/tb_data/taobao_train_data" +eval_input_path: "data/test/tb_data/taobao_test_data" +model_dir: "experiments/multi_tower_backbone_taobao_ckpt" + +train_config { + log_step_count_steps: 100 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 100 + sync_replicas: True + num_steps: 200 +} + +eval_config { + metrics_set: { + auc {} + } +} + +data_config { + input_fields { + input_name:'clk' + input_type: INT32 + } + input_fields { + input_name:'buy' + input_type: INT32 + } + input_fields { + input_name: 'pid' + input_type: STRING + } + input_fields { + input_name: 'adgroup_id' + input_type: STRING + } + input_fields { + input_name: 'cate_id' + input_type: STRING + } + input_fields { + input_name: 'campaign_id' + input_type: STRING + } + input_fields { + input_name: 'customer' + input_type: STRING + } + input_fields { + input_name: 'brand' + input_type: STRING + } + input_fields { + input_name: 'user_id' + input_type: STRING + } + input_fields { + input_name: 'cms_segid' + input_type: STRING + } + input_fields { + input_name: 'cms_group_id' + input_type: STRING + } + input_fields { + input_name: 'final_gender_code' + input_type: STRING + } + input_fields { + input_name: 'age_level' + input_type: STRING + } + input_fields { + input_name: 'pvalue_level' + input_type: STRING + } + input_fields { + input_name: 'shopping_level' + input_type: STRING + } + input_fields { + input_name: 'occupation' + input_type: STRING + } + input_fields { + input_name: 'new_user_class_level' + input_type: STRING + } + input_fields { + input_name: 'tag_category_list' + input_type: STRING + } + input_fields { + input_name: 'tag_brand_list' + input_type: STRING + } + input_fields { + input_name: 'price' + input_type: INT32 + } + + label_fields: 'clk' + batch_size: 4096 + num_epochs: 10000 + prefetch_size: 32 + input_type: CSVInput +} + +feature_config: { + features: { + input_names: 'pid' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'adgroup_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'cate_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10000 + } + features: { + input_names: 'campaign_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'customer' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'brand' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'user_id' + feature_type: IdFeature + embedding_dim: 32 + hash_bucket_size: 100000 + } + features: { + input_names: 'cms_segid' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'cms_group_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'final_gender_code' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'age_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'pvalue_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'shopping_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'occupation' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'new_user_class_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'tag_category_list' + feature_type: TagFeature + separator: '|' + hash_bucket_size: 100000 + embedding_dim: 16 + } + features: { + input_names: 'tag_brand_list' + feature_type: TagFeature + separator: '|' + hash_bucket_size: 100000 + embedding_dim: 16 + } + features: { + input_names: 'price' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 50 + } +} +model_config: { + model_name: 'MultiTower' + model_class: 'RankModel' + feature_groups: { + group_name: 'user' + feature_names: 'user_id' + feature_names: 'cms_segid' + feature_names: 'cms_group_id' + feature_names: 'age_level' + feature_names: 'pvalue_level' + feature_names: 'shopping_level' + feature_names: 'occupation' + feature_names: 'new_user_class_level' + wide_deep: DEEP + } + feature_groups: { + group_name: 'item' + feature_names: 'adgroup_id' + feature_names: 'cate_id' + feature_names: 'campaign_id' + feature_names: 'customer' + feature_names: 'brand' + feature_names: 'price' + wide_deep: DEEP + } + feature_groups: { + group_name: 'combo' + feature_names: 'pid' + feature_names: 'tag_category_list' + feature_names: 'tag_brand_list' + wide_deep: DEEP + } + losses { + loss_type: F1_REWEIGHTED_LOSS + weight: 1.0 + f1_reweighted_loss { + f1_beta_square: 2.25 + } + } + losses { + loss_type: PAIR_WISE_LOSS + weight: 1.0 + } + backbone { + packages { + name: "user_tower" + blocks { + name: "mlp" + inputs { + feature_group_name: "user" + } + keras_layer { + class_name: "MLP" + mlp { + hidden_units: [256, 128] + } + } + } + } + packages { + name: "item_tower" + blocks { + name: "mlp" + inputs { + feature_group_name: "item" + } + keras_layer { + class_name: "MLP" + mlp { + hidden_units: [256, 128] + } + } + } + } + packages { + name: "combo_tower" + blocks { + name: "mlp" + inputs { + feature_group_name: "combo" + } + keras_layer { + class_name: "MLP" + mlp { + hidden_units: [256, 128] + } + } + } + } + blocks { + name: "top_mlp" + inputs { + package_name: "user_tower" + } + inputs { + package_name: "item_tower" + } + inputs { + package_name: "combo_tower" + } + keras_layer { + class_name: "MLP" + mlp { + hidden_units: [256, 128, 64] + } + } + } + } + model_params { + l2_regularization: 1e-6 + } + embedding_regularization: 1e-4 +} + +export_config { + multi_placeholder: false +} diff --git a/samples/model_config/simple_multi_task_backbone_on_taobao.config b/samples/model_config/simple_multi_task_backbone_on_taobao.config new file mode 100644 index 000000000..9737e8193 --- /dev/null +++ b/samples/model_config/simple_multi_task_backbone_on_taobao.config @@ -0,0 +1,291 @@ +train_input_path: "data/test/tb_data/taobao_train_data" +eval_input_path: "data/test/tb_data/taobao_test_data" +model_dir: "experiments/simple_multi_task_backbone_taobao_ckpt" + +train_config { + optimizer_config { + adam_optimizer { + learning_rate { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 1e-07 + } + } + } + use_moving_average: false + } + num_steps: 200 + sync_replicas: true + save_checkpoints_steps: 100 + log_step_count_steps: 100 +} +eval_config { + metrics_set { + auc { + } + } +} +data_config { + batch_size: 4096 + label_fields: "clk" + label_fields: "buy" + prefetch_size: 32 + input_type: CSVInput + input_fields { + input_name: "clk" + input_type: INT32 + } + input_fields { + input_name: "buy" + input_type: INT32 + } + input_fields { + input_name: "pid" + input_type: STRING + } + input_fields { + input_name: "adgroup_id" + input_type: STRING + } + input_fields { + input_name: "cate_id" + input_type: STRING + } + input_fields { + input_name: "campaign_id" + input_type: STRING + } + input_fields { + input_name: "customer" + input_type: STRING + } + input_fields { + input_name: "brand" + input_type: STRING + } + input_fields { + input_name: "user_id" + input_type: STRING + } + input_fields { + input_name: "cms_segid" + input_type: STRING + } + input_fields { + input_name: "cms_group_id" + input_type: STRING + } + input_fields { + input_name: "final_gender_code" + input_type: STRING + } + input_fields { + input_name: "age_level" + input_type: STRING + } + input_fields { + input_name: "pvalue_level" + input_type: STRING + } + input_fields { + input_name: "shopping_level" + input_type: STRING + } + input_fields { + input_name: "occupation" + input_type: STRING + } + input_fields { + input_name: "new_user_class_level" + input_type: STRING + } + input_fields { + input_name: "tag_category_list" + input_type: STRING + } + input_fields { + input_name: "tag_brand_list" + input_type: STRING + } + input_fields { + input_name: "price" + input_type: INT32 + } +} +feature_config: { + features { + input_names: "pid" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "adgroup_id" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features { + input_names: "cate_id" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10000 + } + features { + input_names: "campaign_id" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features { + input_names: "customer" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features { + input_names: "brand" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features { + input_names: "user_id" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features { + input_names: "cms_segid" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features { + input_names: "cms_group_id" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features { + input_names: "final_gender_code" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "age_level" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "pvalue_level" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "shopping_level" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "occupation" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "new_user_class_level" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features { + input_names: "tag_category_list" + feature_type: TagFeature + embedding_dim: 16 + hash_bucket_size: 100000 + separator: "|" + } + features { + input_names: "tag_brand_list" + feature_type: TagFeature + embedding_dim: 16 + hash_bucket_size: 100000 + separator: "|" + } + features { + input_names: "price" + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 50 + } +} +model_config { + model_name: "SimpleMultiTask" + model_class: "MultiTaskModel" + feature_groups { + group_name: "all" + feature_names: "user_id" + feature_names: "cms_segid" + feature_names: "cms_group_id" + feature_names: "age_level" + feature_names: "pvalue_level" + feature_names: "shopping_level" + feature_names: "occupation" + feature_names: "new_user_class_level" + feature_names: "adgroup_id" + feature_names: "cate_id" + feature_names: "campaign_id" + feature_names: "customer" + feature_names: "brand" + feature_names: "price" + feature_names: "pid" + feature_names: "tag_category_list" + feature_names: "tag_brand_list" + wide_deep: DEEP + } + backbone { + blocks { + name: "identity" + inputs { + feature_group_name: "all" + } + } + } + model_params { + task_towers { + tower_name: "ctr" + label_name: "clk" + dnn { + hidden_units: [256, 192, 128, 64] + } + num_class: 1 + weight: 1.0 + loss_type: CLASSIFICATION + metrics_set: { + auc {} + } + } + task_towers { + tower_name: "cvr" + label_name: "buy" + dnn { + hidden_units: [256, 192, 128, 64] + } + num_class: 1 + weight: 1.0 + loss_type: CLASSIFICATION + metrics_set: { + auc {} + } + } + l2_regularization: 1e-07 + } + embedding_regularization: 5e-06 +} diff --git a/samples/model_config/wide_and_deep_backbone_on_avazau.config b/samples/model_config/wide_and_deep_backbone_on_avazau.config new file mode 100755 index 000000000..59de34076 --- /dev/null +++ b/samples/model_config/wide_and_deep_backbone_on_avazau.config @@ -0,0 +1,391 @@ +train_input_path: "data/test/dwd_avazu_ctr_deepmodel_10w.csv" +eval_input_path: "data/test/dwd_avazu_ctr_deepmodel_10w.csv" +model_dir: "experiments/wide_and_deep_backbone_on_avazu" + +train_config { + log_step_count_steps: 200 + # fine_tune_checkpoint: "" + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.0001 + decay_steps: 10000 + decay_factor: 0.5 + min_learning_rate: 0.0000001 + } + } + } + use_moving_average: false + } + + sync_replicas: true + save_checkpoints_steps: 500 + num_steps: 100 +} + +eval_config { + metrics_set: { + auc {} + } +} + +data_config { + separator: "," + input_fields: { + input_name: "label" + input_type: INT64 + default_val:"0" + } + input_fields: { + input_name: "hour" + input_type: INT64 + default_val:"0" + } + input_fields: { + input_name: "c1" + input_type: INT64 + default_val:"0" + } + input_fields: { + input_name: "banner_pos" + input_type: INT64 + default_val:"0" + } + input_fields: { + input_name: "site_id" + input_type: STRING + default_val:"0" + } + input_fields: { + input_name: "site_domain" + input_type: STRING + default_val:"0" + } + input_fields: { + input_name: "site_category" + input_type: STRING + default_val:"0" + } + input_fields: { + input_name: "app_id" + input_type: STRING + default_val:"0" + } + input_fields: { + input_name: "app_domain" + input_type: STRING + default_val:"0" + } + input_fields: { + input_name: "app_category" + input_type: STRING + default_val:"0" + } + input_fields: { + input_name: "device_id" + input_type: STRING + default_val:"0" + } + input_fields: { + input_name: "device_ip" + input_type: STRING + default_val:"0" + } + input_fields: { + input_name: "device_model" + input_type: STRING + default_val:"0" + } + input_fields: { + input_name: "device_type" + input_type: STRING + default_val:"0" + } + input_fields: { + input_name: "device_conn_type" + input_type: STRING + default_val:"0" + } + input_fields: { + input_name: "c14" + input_type: STRING + default_val:"0" + } + input_fields: { + input_name: "c15" + input_type: STRING + default_val:"0" + } + input_fields: { + input_name: "c16" + input_type: STRING + default_val:"0" + } + input_fields: { + input_name: "c17" + input_type: STRING + default_val:"0" + } + input_fields: { + input_name: "c18" + input_type: STRING + default_val:"0" + } + input_fields: { + input_name: "c19" + input_type: INT64 + default_val:"0" + } + input_fields: { + input_name: "c20" + input_type: INT64 + default_val:"0" + } + input_fields: { + input_name: "c21" + input_type: INT64 + default_val:"0" + } + label_fields: "label" + + batch_size: 1024 + num_epochs: 10000 + prefetch_size: 32 + input_type: CSVInput +} + +feature_config: { + features: { + input_names: "hour" + feature_type: RawFeature + boundaries: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23] + embedding_dim: 16 + } + features: { + input_names: "c1" + feature_type: RawFeature + boundaries: [1000.0,1001.0,1002.0,1003.0,1004.0,1005.0,1006.0,1007.0,1008.0,1009.0,1010.0,1011.0,1012.0,1013.0,1014.0,1015.0] + embedding_dim: 16 + } + features: { + input_names: "banner_pos" + feature_type: RawFeature + boundaries: [1,2,3,4,5,6] + embedding_dim: 16 + } + features: { + input_names: "site_id" + feature_type: IdFeature + embedding_dim: 32 + hash_bucket_size: 10000 + } + features: { + input_names: "site_domain" + feature_type: IdFeature + embedding_dim: 20 + hash_bucket_size: 100 + } + features: { + input_names: "site_category" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: "app_id" + feature_type: IdFeature + embedding_dim: 32 + hash_bucket_size: 10000 + } + features: { + input_names: "app_domain" + feature_type: IdFeature + embedding_dim: 20 + hash_bucket_size: 1000 + } + features: { + input_names: "app_category" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: "device_id" + feature_type: IdFeature + embedding_dim: 64 + hash_bucket_size: 100000 + } + features: { + input_names: "device_ip" + feature_type: IdFeature + embedding_dim: 64 + hash_bucket_size: 100000 + } + features: { + input_names: "device_model" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10000 + } + features: { + input_names: "device_type" + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: "device_conn_type" + feature_type: IdFeature + embedding_dim: 32 + hash_bucket_size: 10 + } + features: { + input_names: "c14" + feature_type: IdFeature + embedding_dim: 20 + hash_bucket_size: 500 + } + features: { + input_names: "c15" + feature_type: IdFeature + embedding_dim: 20 + hash_bucket_size: 500 + } + features: { + input_names: "c16" + feature_type: IdFeature + embedding_dim: 20 + hash_bucket_size: 500 + } + features: { + input_names: "c17" + feature_type: IdFeature + embedding_dim: 20 + hash_bucket_size: 500 + } + features: { + input_names: "c18" + feature_type: IdFeature + embedding_dim: 20 + hash_bucket_size: 500 + } + features: { + input_names: "c19" + feature_type: RawFeature + boundaries: [10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190] + embedding_dim: 16 + } + features: { + input_names: "c20" + feature_type: RawFeature + boundaries: [100.0,200.0,300.0,400.0,500.0,600.0,700.0,800.0, 900.0, 1000.0,1100.0,1200.0, 1300.0,1400.0] + embedding_dim: 16 + } + features: { + input_names: "c21" + feature_type: RawFeature + boundaries: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25] + embedding_dim: 16 + } +} +model_config { + model_class: "RankModel" + feature_groups: { + group_name: "deep" + feature_names: "hour" + feature_names: "c1" + feature_names: "banner_pos" + feature_names: "site_id" + feature_names: "site_domain" + feature_names: "site_category" + feature_names: "app_id" + feature_names: "app_domain" + feature_names: "app_category" + feature_names: "device_id" + feature_names: "device_ip" + feature_names: "device_model" + feature_names: "device_type" + feature_names: "device_conn_type" + feature_names: "c14" + feature_names: "c15" + feature_names: "c16" + feature_names: "c17" + feature_names: "c18" + feature_names: "c19" + feature_names: "c20" + feature_names: "c21" + wide_deep:DEEP + } + feature_groups: { + group_name: "wide" + feature_names: "hour" + feature_names: "c1" + feature_names: "banner_pos" + feature_names: "site_id" + feature_names: "site_domain" + feature_names: "site_category" + feature_names: "app_id" + feature_names: "app_domain" + feature_names: "app_category" + feature_names: "device_id" + feature_names: "device_ip" + feature_names: "device_model" + feature_names: "device_type" + feature_names: "device_conn_type" + feature_names: "c14" + feature_names: "c15" + feature_names: "c16" + feature_names: "c17" + feature_names: "c18" + feature_names: "c19" + feature_names: "c20" + feature_names: "c21" + wide_deep:WIDE + } + backbone { + blocks { + name: 'wide' + inputs { + feature_group_name: 'wide' + } + input_layer { + only_output_feature_list: true + wide_output_dim: 1 + } + } + blocks { + name: 'deep_logit' + inputs { + feature_group_name: 'deep' + } + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [256, 256, 256, 1] + use_final_bn: false + final_activation: 'linear' + } + } + } + blocks { + name: 'final_logit' + inputs { + block_name: 'wide' + input_fn: 'lambda x: tf.add_n(x)' + } + inputs { + block_name: 'deep_logit' + } + merge_inputs_into_list: true + keras_layer { + class_name: 'Add' + } + } + concat_blocks: 'final_logit' + } + model_params { + l2_regularization: 1e-4 + } + embedding_regularization: 1e-7 +}