From d08dd12bd6215a2201cb968175d8ceec0677175c Mon Sep 17 00:00:00 2001 From: Huong Nguyen <32060364+Huongg@users.noreply.github.com> Date: Mon, 13 Jan 2025 09:35:05 +0000 Subject: [PATCH] Feature/remove et doc (#2232) * revert back the getVersion in graphql Signed-off-by: Huong Nguyen * update queries and schema Signed-off-by: Huong Nguyen * fix lint error Signed-off-by: Huong Nguyen * revert graphql_router since it's still using in getVersion Signed-off-by: Huong Nguyen * remove experiment-tracking.py, and runs and tracking datatset from repos Signed-off-by: Huong Nguyen * fix lint Signed-off-by: Huong Nguyen * update format lint Signed-off-by: Huong Nguyen * remove set_database_session Signed-off-by: Huong Nguyen * remove ET mentioned in the doc and readme Signed-off-by: Huong Nguyen * remove ET and session store from readme Signed-off-by: Huong Nguyen * update new architecture diagram to remove apollo graphQL Signed-off-by: Huong Nguyen --------- Signed-off-by: Huong Nguyen Co-authored-by: Huong Nguyen --- .github/img/frontend-architecture.png | Bin 67996 -> 73988 bytes ARCHITECTURE.md | 20 +- CONTRIBUTING.md | 17 -- docs/source/experiment_tracking.md | 360 ------------------------- docs/source/index.md | 4 +- docs/source/kedro-viz_visualisation.md | 1 - package/README.md | 28 -- 7 files changed, 3 insertions(+), 427 deletions(-) delete mode 100644 docs/source/experiment_tracking.md diff --git a/.github/img/frontend-architecture.png b/.github/img/frontend-architecture.png index 7eb7ce5bc5f72bf619e0a32aea7df8bd108b9a7b..99c4373fe85b6e640fe0d6934c99882ffc977130 100644 GIT binary patch literal 73988 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 z z0_DcwMCdb8YcqG?utB8Tgz2ep_d~IA6?J2A)W_hmk^>A0+r3Rl=90zniQC5PqE=KK zRwfi3MsX+cmE5F}z%NqAE>XaU4?t`f{emyRgOKsplj7)7&0!^BpsS!zwB`6*mumka z^ZAwfy~AqQn>YQ}?vbH$Xp8IgyPDJuh73ag=7)0NpLUkRQ=e$$RVFgSuD$ww4p89A z0}gT4u-K@Q^R|Uy%Vy$E!f6Q{JWH>aw*WNJoB!6lnztyw`oeP`_9;t4vUHes4)ybq z*zXu2=cN*+)eo*qqlWZ(4)Use3xKV##*-ojI}$|Del{Ia7S>gpF)XV@;xaX$#egla zQZUckATc)shn(Kg>HDjhi=WHo@^EQsQ(uN9!N5jG6)g2Af3%u$LTe6*GJ13xd%neD_UzAi`ucSUI8X+I)i8#e)gLj)9 z>Kld<1=>88T|t}WoIqcSqeg~!bceI#t$b*#NSrmrV;<04Aty#bSHq!6m%nCE8cf{Z z^y}vb7s{4WNpfrHpjQcPxk{7}B^A2MCJ0@SRfiEhut?d`?C68_uzs$%p%sv1{JNLa zu0BQYfzowh9=}gE1H1??Uv4TUc#+wL}eSj4i%O-%|y{_NN5aH^K zU!L!%@S2G;*&71#mnIFC`_2{m6=7#FZmUbs2o=WOk6_QVpBDl!zAKt zPQWXfCl9Z}FV)~Xe;DoGInh99YP0jIM637@UcRcSHOXc#fUO=s=-}}4|7XI2z#t@> z4hgfgv$Tv%dfe5Z+}zxx0bGjb($Z2A>P!^4iwQX%E3P0h88@%!Tn)F*J%bPJ1&6^d z!l4WpE&(xhqV&@UqKfcJCJ+O!71#^30Mns+vAQ^z4)T1hFhITF`;ipWd%u@v`!c0y zxz)&NjE=~BbR20Z4lmj7bm>dnw#w7TFiDl8cx?N1-&gUBc?t6FzGt&WjJTnAs@KZ+u-Dmp}-m3Jn%>b<{B_5O~pD(Z-HeWA8uI4%Xx zdE8lgt!?VtVd$FuqZQ#-O@BkRd2@%=Y_yg*I&T*=>RR_>xYiGYA@z#!bbRWF+b4-o zndtVpdyp>f?-AP2ok>t}C(f*qWk1*d#^zXd#9^WT@(TKa?kMWJ2Ko~kcr-XKN%T&yH+DTkcDnN|$)ZA^Ln_(=f=xs4;G zDrRrq$**@?L88l^>d=a;tIoLG&au1|#~Hj+r>>t&rf`!lB$kZ ztXD9xd0)ljJjR zh5N|KCJGUf8qG+;Fu60j?up-qH6;s$_|1AVGfiZLR2>Vmn44?c%@5#Gry6{^X&o*j zgueI&`08O=MJUk$3H^nxJ$Vlw=xF>#Q{0?Mmclg`b2YOCY2=qDZWM>Nlb9ZO;dh>q zzA!Z1=2*VpWIv$w6rExhydy{JCv`@u z#qi1HIkV~dLdgMTM&2=a&fvz6=50!`Ju4}4?Vg?a{$7)YJ1lRQ4Lmh+xCCJS@6hlD zN$-O_k?DVV>EIK@Xz6Icec>Abm74?!bvq=i9ng!Vv$!nZo;x{`{Dxt*EL>V|ZA?`D zMA}Dd=hy)czPQ^|z0)-*pJ-Csa^8DjAG4=$)fm3t?U~zjlF`r3Rda1*PgdrveZ+9X zG03CJu}#`zsa#_ss2o$od6Fe5r2(8disztSwQ!F`ky2aGEd2;tStx1tnc@(Vfzg!y zTevwCi-cVDvzH@}_DMUuj}o(>ZcjJ3Jki7;cFm^AeokALHcrYRkMu+?bq!mt++z9C z=rski6^;B=F>#7?$16dsgRQfvP%K^ccN{xBtm`dA?+aae`<_X+A~Dx>*}g$cYp6X- z){neu5&*ljp<6f<6`1n(806{1dSJs>SKEq<8!L9Vsc=Ct^x8Qk`EygvD684Q@wqbs z@)Y&94mX#dD0hdBso~S#MGU8PRnt^18&%_)WBhE7#+2@6A_VF(?jHh&=xMY$L;`8w zffJQ<${4}}#Cd>~3~98ly+&36s#e+3`u8!AhC5n8nX@z0b)rcO#|9<6hMc*#{Cxz- zFIx}ZJn$T4_wAM;zFf?avO_b9R6#dAIa7c+ZPfKW!JieEy)-)h{mAE!XC0FA@Mb6t zmJIXq6B&JY?floAlpUx2FLT24k**(@+|85|IihF9rv5x?<15yXzN z;Vo>>9QRY#5zw0oN?SqQTsB!uc0!qGNaDu>W39tG<%4a5Qdjf?Gd{is@}EAB9L%}C zLy0N>8{rz1x^qD9<1 z>}3Pe&~x-hC{ICp^M7V9C4t`c(EP#se>gT%G| zhKv~2cmL3D0EYt{1Hs28x`K-oXIJo@ooN2D0!nzwVTE|87E$Qh4#2k>Igy8HzW@aV z=UCpZQ80kR8PfFE{~U)q;|Ids19`QU08}Af|6`XM48*OkMDnSs(`s7i&LN<}>#y4O zfDdgVtVD_@@TkL9$P5G+Kr$K&(CcO;cMMS>8CAnuyI1aIfeNSL6{Tv~n=R<~eI)$S zdrr^=A(bS0dOrzS1$cn`CLAo}MAowdu$Fib+6xg()!@S9E#N5CB!qK=c z0@|s|GWCUTL#qHJf{!qZO67j?1U@+ZEOoGgKc(=>%3`xqQjPo1;&dr31$0NwRQNCi zg*DfH_(vtnEu_*gi5$Fl5lH||IQ}gw2X@Qh(wki{BULay-2`^AxXkDv*`=t4j1pgaA=!|oL4t?(wA9N>K?W<~*u3#s+P%&=E1-s2>09N69_zvur>+s2r1WPAnq>2$+Tup z+TlL(L*3BLa$ivb`{^ue92GuYyDM&>ZRjw02pfF+b|}vxGm`HUA~1ujIvgBZG1f~k z(mI9LlL6d32HDr69m<}G4m%@AvkX^<#lO+2$@Z&d&A8MnonIZr7aCY=w#4~Kw}tFl ze(@S8d+(Xz3ttGgkjK0|2xCQK;csZsJ)3syGdz25IBkw^ksdtp=SvrI8y$hW^>*%T zv9hbHO7eH6^Cp7g?9XH(0rFT+9l6QWor&r)^WA;Dyz-7WQrn6>DQDG=YKMraxfR_qAgye`#As+GwM5Lu=zm8~^ zHCw`Qcsh@Irf@9!)@Z?5#+*MBXLcYA^}$A!aMvOZNmqv`lgExqw`B-2z4BCq;6puv zk`mMj8&nd}10|4k;3PbG8$5a2gX5SI50TDRNewW7B`W)v#YnqhkdpArCI~RHP`OVQ zk~4mijVvuea+na><}q^IMW|tlL=*hYO`lM_1q3W)l`R%`CQ>?cgqRnXj`<1Nb31JP zjxO6^qX`i%_mR;23Xq4}3&`hh67f*c1zaE8ZJc&a7a zd#(=|!1_)0Y}#AW1(DPqtN6gcjV3MYz+VIvgdQNZNOy1jlPkOFH*4RgGDtO)2$CI!_LZ zdgb0;kZ!E5=FZ;p)Pq|j8wm76Lt*D(IIxG)M#VwW2tx8SdGc*UDg2dQ32N1goR^H} zX5~OjOxH4tZp19&kci#CX8KqaexfRBgd}j@uTu>f%)eivGVuww#@Ap}EZh=Od+rR+PdPXh@ z%3V@v!xEmRV%@u(7`*rTh@X;0A`MJJdhcfE=9Fw>o-UK`p`qa?M?*)96$_`i$>p7& zDG<4=1j31ii{v0~9zuFvc(3;41H_KwXt^X_p3aXDlk}{3sjT>Spu&-2d~7K@x|s&8 z*_^Deyz|AYLxR!YF^L_9JJ9Eyo>wDyvLDFEKB?4QNMR!k&jOoKb?YO`Q6!EQ0lBb4 za{*JlE0S;SFHk~Y=lm)JDFj#7zW=Powzs!0ANJ)4Iv5RwWaE(k+cqlpNFo54)C^E_ zM#u^&NkIm^19SZOlHc`_LM_ZARAJ0EnL6Jtt zBPncfS!SJ&_z~?1(;)m;8_fjLCI9aM>uSu1m?G-ML1bC4A`#dlV-Ge6cYBjjsF9wk zPTyZ0^-@jdQ{d5y*C!bFJ+9bv*VZvg#iOS-7DNexeE4&`IT@`4Y^G#p*ELU)>Znyy zHt(XtFsAD15rmPDr6X~_W10!{8@yeHph_CynP4fP=Iia#d+h9F5}s0Am&m+d!8c`# z`8IXKDOjM7$Yo06E>ox=sT&96Q~~Et-B$cHmAqz=+GcfHyqAJZ47Lol_qzPXH$Q{x z;s5#qqF@mg*%Fe1GZrtLu?D${7V42o3u1znqAfB}m>&g#0BH@VXS7S3)Iq$JT~~%T@wsC_ow9~FLBQu2xFpQq8Y}Gt z>g+kkaEh34Ch}-Qb1BfmBe))GZk`l=N40DO6l`u=6{oGjrmj>;ka{EX8Gg3~DSt=S zbquJpp07?^B~k?`7AJ-};H7}bDEDq@DGHladxbX?8)&nh7sGAINW+1SVw9;+j<~+-*FkxgUW|oa;_K9529Fe_ zg2F-WlOj+@alfNIEl|hnFFG<;n9K}W3?vM!uZx(0bdG0Z%_86$;qT6$0Ldx`rYmQZ zAqWH0bw1`s#C0MQ#C4N8;HMMgwCk%Z3WcegSky!FZ^$={I8pZ@#uuow^Ux!%@4vxv zWVXbx!G9w8pGZRDz<(n7pGYFs?msK}pOyUo(n?m#&)vyLvx~z)G;VdL9i-iDX=#LL zor7>z*wW_r0pu7kMuzSH_YNr=W#XwgLCMGU{q#iBq0f$Fi^$mr@z^%3>v}@Mll{bZ z3Pw6$#LZXCp#`Medi;?2V6<0PSC@suRN1#PiQU>{v^HR^*>=6!gl%q-E}rn$#Ts#PXYS!?+Ml7P^C!JyNL4r zqHcsnPb%9(j1g$2>VsX53*z{f^XWwu-f5=;+DQIG5hg0{<8ml(``L<3ACTfR;|Fz2 z7do#rB<`2*1tBR$-Oxoif^8Obg0#m_wv@|4gMpZ*^+@g&BL7IYTZ!Ep^Wt&>g0`7G zS>?WnxbFw(zly-VFvB0O$NlY1bjO}R?ys&^{aLdO8$t|K`au{`WD6pi4m8LZ`T#kM z>qB3Mx21o_8f@+(;7TX~a~$NCX~E!H9FE8a#Q?Pe)YN=8{G5&Y?sY@8%^SfgZbzM3 z3{p4%{*Ir@p-*sBxDJzl^zy^yr8wY=!*u zUL>>}ns9@QNah>A5Pl*(eg^;^19Tx)ASs9}8U^%2PKq0wp$%_SZzM2ntfma9c2^E_ z1YY?KRTT}wmtvmPbN$C?|1laUntx}s&rILR+aWfoDJ>l&z-s3!K3e~AZlwO3(&{?D zF++p~b;nL;v*Yuab1&P58ueZVt?)DIjG~u92x(5V8*~?Lor4Pi{DbISZqk*o%i_GC z31#)s&@`0Hy6iqiV)lW@F+^47Rg|;MDG%fJVKXaa0mQUV+-#cJ`ykoK{e-w;fG45r zxT?fD%B2W4hLz;y;SFWkb=Pa;&z%=GWM2PRHNSOSKj|XgdbLDJW%1y9#3pRf63EYrI{%RdO{A;( z=(f?28T&fO4?%K4G0|Ud@NEeCp(1uPiz=i3ranQ8rw*goK`%H#TF;lYTbooMhe)pP zNE)NnCyq@836W67nvk$f1<3|KvyCt(_r^f6N?3WP)Dm`WY-c01c1_GTi|W7~y}#Yb zi8Ez7Xgw_!i9pS;yzwN?;W>Z~TK##VN0De#QL@I^_*yH@YY)xZ8>zV;^7{BVf+2u+ zg&0(>{g7v(kijBnbEbZaXTeW`^c>s`h(KPLwhYeY+|rX7!Wfj>VEx(*E=S9{aB>ZU zib0#_4&~KmznO}DYZ*s|wiG_2MSD(3!B9^~=(M=(*w|QH{V`Wj?XHOln}yOFo|EK$ z|08o3*^=jAIJIV%MWqnHwhMvoQZx)8cZ2TvXcY5sf$deZ%XaoO2f(v;q5b%e0P$@;3gFyh4pI#PIgNGx^uzuj~zd^ zMr4KGN$gw~vx*XSQgL#9Qda89@0+Q!Urf_ihqi%sy?kVEDA`s}*tM6s*ci%qjZ_~j zq1iKi{!Ch@dc4Log17vxmxJdy_6Z!7P^4#tj;9V0A^KgL19&}{Y#v!z9*41s38lud z7mgn}_d4a>l=s^eO|0rmcY%7}DzOo8Z-!uJe(Bb|m1!1BZ z3WcnHe4A;+ByiO*>A$m$P%${JFaWOof!r3?+RHo`osU zm5bt6hzZuSUZw)VXAiCv!TRjiZg3sQ(4T4!T5M#(#eRoOI6t+Kd&cZSW7hTJ7^=4U z(0jYJS;n*`9H&*UuOf|{@9}c!6T$9iBv?gy_~`*~sxHA;XI0I9`bx?yUxNE%f(j?& zUgm7{4hdO)TYHM^Ho_*xAtlpKk=VL*#>8$*>*Gy@g|4Xe9y%*!mMb)BgA_j4yN7*~ ziKat@8=k@m&)Ssa(vMr-~>@yyUyh4f&kMI?R4!5cMjpH46%q0Vn7Mo{1 zpfi?<)E}L(h|p@~8>m7Qh&ytNchnk-$D(&)UR2c4e<$STEX`f>{BfvQ*L7f@>_(h; z4=l$n^kx}2e65rbu3Wi7_1${FRqH%0>DD$GLO8Edr~!5b+70wfKZK~YWktr%MKu@4 zl3C2%W+>}yvGc)g*s$Lfc;J2`$G{5N@v`;4Fe_9>(@)8=L^vtMiY=70M54GX>-2kO zBB!UxM)fFD&_3Acc(Pz590F=bK?$f4c##3I*F?PDtsg}PJW{pHQ#8>_VPh;8X!$53 z1pa@v`T5dkf^=UiB_6xipcC>oYA7u>{Yq@g6i+U=y>eiI=g)EUy8L8O@%8A8fjU#rt>$4KAQB_2K50e^((GqHCSD-8@ zn{rS`(P5ZVVD;X@YTLbPXI@$fr!hST<2BYssEDLb=SYVB^EM$3cL87*s@!Q@`R4Dv zLX~DDkr#Pg+<8y1Jk7maLJ02?{CWN~H0NJm^+kwsX?-hE1XW`s>J3e-u0+Z%-SokJ zH8nEWO-~fN+Xe$NG3@7I#@wfPzpGF(_0t_O;p5QOZkPb?11w73rzNADW|?HIaBmM<3H2^8)wxg&=&pMKu#w0}xOQTT$h zJAGb&ZQS=A$iiXu$a#k-VnyljvVO4!A;O==RM-jx~z{^kfw&@zaobb z3M9sG`l%GW+e}qYhDbOjXQ{g8h1}*nQDK-C=!F(Ze%&BcK8N;>J4P4@8$$1?=FC*l zKn2*A@~21RgF{osZ$GbKK2Kz%>a&X8L`Fi`GP{a-1!VmiDAcO!VfD<1ib3P-H#?Zm zr^40m=dxmZL68b>1&vd#gTB+&&vnFH-4>r?zw6s9DUi7nZfuhg?I*asdNUN5vo3`> z15C0+zK^~EWd7UiMJmK%kfftlHGL0uUg!z^ZTx*~ISa+-Jdut}wBiRq#foe7t z?hC<8I4z)SkV!$ofa%LcXJv$MVm(4?<%#610JTAEG(vF$j=UiYWc~H-`s%Gn<2OQX z&_MlA*sGu7>#dcFo|7IEt`sLn?@#eL(N1ahI-;q4oAOQj`{5;gxyseE`0^_jQMeDI zI_R8d)xt@O?H9k7C}4%Ko=Qv^DJdoL>?x(Br=T(PmHgqf%vOC@j}@uRZ*sxZ8EgUF zN{!G(N?tR#;aQeKWwTSynJE3abr!E0OTP)1KO!7{2sS?C^NH`2i1_i?AlKbAj}+wP zm}cRM>B$aK4B~$Jt$=s%HKcHov3plcMJpB1v6C?`W3>K8mUjrIx&46Ish1UlC25S* zQz87E%TD%}7H`+U z+69T!?YD(Er)DD4lpneaBeJa3^YZIPrsz31wFn|XU^t@-!~VKd%{9dEAidn~H2i2V zJ21+0gm$Xrj&4>{ruz49;`ycQwv6wObR|+Jx1BeqD%Vt8vS$ioO>Rwf=zcMq?QWHr zE95-2l;8?oZgICi^~hs)H|Q7gA)g!&26Nr5DJNyPWJ0JE6k*f#rZj7;`FC}?myv_w{k~P8BE9Q*9+r6_dakjE)dcb zW%rEoQ+1uf2BGZFe9Y;pk}n%hrp`*QsUT##>&51_%d7Qe4EjH1C%l;S6{nsH+37J6 z1>NwY%0`68$~704GWF&6Z!gAYdPs6G0g+;qzPbyo6X_>QMGH}S&*^rh3a?&5;5u`s zzdMlml2Z;2$O}Tgw)=HW$(`t&GVHF~5%MX$G#8uqX3Q66jlb|u?XY)G!wBYT;k6DA zxPMzXh=|I8Vc0)v$n8K|T3%FH3v5le&j>%HSp&19z$>3#A?EBVjQd1fLAmrSN-$ zhPM}KDMrQgv-D8nCn;mw%Rc@nW6>VYZo6DMCIga zFJs1kUV0`+Nq}wzuqPe6liR8-av7;{Z4(t03;6UgkK)9o)7{OM4vn(I{`V@9)EZ;C zsxfdmQDHmF)#g`?#w2f=2xHFmsXD_2=Q2ihIT$7iV~+iBHf~ZtJmFUrG|B`zZHi%L^L?+;zR?UZGkdW(Q5;bVpa#Wow^~l7 zkPqv`%r@%ZPq(})r6zu`rHTTV{8OhnbyY67xyM=_cY9hnXI5{iv5?T5l9K$@!cZeu zj4^n!JjQ)7J~p|%FVJe0+Zo!#-L(5yR~tbF`Weer*%8tAMwnqt-vZ}oUp&8fJGW^x zpq*3@r7>Z8Ak?s|X~yr2Ke_9-V4Br5;T@T(gfXVD9J#C|hY0*mX@j69b=ef^j%5=J z&0@)orD?t1`ZuoW^M(;GSa&Wvolu0*pS!K>`+*_Z6}#Dq3^{+kVq$|KwTo7(S)KBE zWX{_|RmLNF2}s3n#OS8H53rn((}U{e`<6K!@s_bUf$x;&c5I{marZUh>DY|oN*=md zBcszt2<61YZ_-SUkxk334=ts2MsUfEsOEDS>N6IpQZM+gttdgG?2txE zWivZub5{pXPt=B|dN`T%Od~#5vk5za~+*=CNd*pIO76o9U+=SO&GhC88Np_OFXpw095;E1R(y#U}en zdGZP?!8~n<#Ip3q_{PuyFBxT$x&elc=Y!Ly= zp7Gv2?~4)3(REHl{#m31-kW(gBQ3Jns9=tmDQ_WYTQFRLz3d|{pZ?LX<3#{#-cUAU z?s3%`hxnJIlDYiJf-RRN1zpqC$Ls7G3HKe8n)fuxThs++C?%aCtTLxpF4c-8j&9(MEWbOOvxeI){eugRq9qBZNzBX^L}8hhv3-Ez9ik140VaLW6c4^*G`qJeO)VA6=z%x;%)m@rSJCZ zR>@-I+<|mYmACy)Y}+|T=sf5=bx9l2ofW8<`nT`$Jt{@<+{U=zlZe^1&orIW0g0rK zJ=ez9qJ|f{0~*EeXmkyRtE@DIxIc@V`u^(vSWv-2{oWqd{LC&4%5dQdSqzC7RX<3Wk6@81{AqSeeeht3tA9;C-Bg?$0rD9$^BrT0=ZkHFo_D~x(a80^+G z1Cse6_2?!pId~qbQ|E8O4UB~->Xr1GkQmFIO2xV_q@c;S;lQPKkG1#t$TedS36M}9 zGC`W>vZ&!g^qZKz`TF{niVG=m4rJau$rci=P+xw$E!!@Bad|*q-h3hsZ8RbtJ+1n- z`i$%_tISHhc+{*o{V1z~F4kleo0;A&jIK9!z~u~Q&ZeuD4`Dxzge#)zJ)CUkuDKLO zQO!)Nrq9&MmZj8Sq-X7BxSN~jK=q(_pAhx;Gj?~El! z=iG}fJuRwlHsLECoVwEACAU}{l1$R#K+PX7m67H2HM@`k<8IB;*o`HOU3JOr?=~2p zSi0UjIsT=7Qc__5ai_fesi{7_cIbp#in(q0&A4NboAfJ!LCBvimb%5%4-Kv5skC_a z#d2Sq%N`tVhl0So#W>4H9mA~5?o&5|q-bV#hhvh|ad8UDo$sN@MBDCLiyd`I8+tLl zW<|ihG2ymW*)VprDWnPWxPri{wzQ)Wr@oRzc*I7y$L>ZtCvy|3rY9rA<5Eb5Eq z1oq~J>FEZ0rxn*ub>&(6tNAml^D_D(i7B~K0rcgc9RhE;>4Zgnz^X7m+t`6c`IWHxzG?`dHuhI-_Aa&}a_ zbC*ZbR|ccfC1KgH?kgkyhGe}jYNn}g01uT--J&l)8{Qz~;jL0AQ)WA(l%9Z9uL&=I z+k3gNR*1uVWd3E@gV9v^QGXLPf-u~tW#ciIfD#}jqoCzd@Y+U#ycoP-R8g!O`j)`- zl@~Myx4!3tfhw_7LH!pG1}4un^KulprpxP#Uu!66Mdzyyr*y;>$Ol~O*;3L@KJNdw{p}(-DvgG4@tN`wF;p0b!4Ryj#YLi{8*siYi3C#ot z1~m`SjlOZu4{BlRjWcA>z)v5CMR8wLw!1JD;5Z{kAe^^j9)3|7>OUoYrB3~i6^154 z#_NkK4&Ca!EIlfXc_S|J?-DUhJLc0b8oJy3=Jg9`PcC+6WGE!x>sZQj9Zu z5Q9NuP=LF+n=6O$)jRtI*;$wB3mUF2vaG~84ry4_%FVDW#h`Fk(NT+!QRa_ZLQZG( zv%S&pq#1DP>?z~k+!17JysOECWIC=jOC7cWhd_&cF%a83PMJbsrC_v+sb5`Japn4) zIVuOo!Iaut3rCJdXZLAB$sNv$l_1;R81;T%p&a4G(3E0bz&UZQ2f_gpIEX*ZwZm~w<;vRj!Mx&zDhadeQ#me(C2_)T<#0|d1Ij2&vVL2!=U8OSV1r9Cr`Rp8(EpXaRG;o zAa%#}&T9u+-iUo$RB;FpGjrdc(joRrI9z$U*(&W8KJQYwXSPV^u?dP?&iVz})34sg z{aCI}j9@&oAs6eraGktIr);*d(7-hxqs>O$nWdn&vjgw$HtXSL-RnNr`nn6FjxwRU zbwK2^-@@5$Exi+gy2^?V_ASlL&L(D+nyl2D`{UlKSCtk_Kj`gwy7*9RQf4tI>Ik2I zL9YW9PR){jiGU4LDSzv6{e39fRd$VLcErIwk2y(h?L^^CEdH@r_?^%5OH0_q@F@43 zuhugsuX`V;9;dUrA$xMbsi`kRVk==7xNSy*ubMS?d*n~6T`M)xzBNGVgH7qQOZr;f zX}W{&lF!|OS_H&rbA(Vfbq3+0W~ z@j?@2$+Lx%6$)SqcPypLf=eCrqMVn;l3Y+i`p{QnI4ovQ3M%S?5@2fdfM;EkP7RdcPnd&JqL7*%(VS~-rYCxV&c&64PrdPAYg zIWpNd#`h!&mC~2r#Puu-CAKjtZ{0#GasWF*9G_GB6Eb`NdgAMhID8U?aJ%@YB-dNP zCt_4r=&#qB)^fWiT3vd_IGRhy@syuvt#PdZD2R+gr)XA z|Kh1tJ-%#d<+qhB`A&hPo(?WgEA#c$z2e~PIqOZ^IjObq8SmT?YAWiEJTql~UaXPj zQ&+=cym@cKfW6K{2(Dp!)?$25-D1)wQ_ieL4eOq%@|*_&ML2>+O_ng-b3opW21{+x1+3mbS8U8_L!8`F(1Q$)0&N z?rizDv#Jp{=^4FHLx#Lq_2k&IXPx&2F{qUCHiw}uczUa5CbKbH&M5q1-5o}%3DNLT&3x#%bNMX zk5WFRGvzQ{zpIYJpsOQlr?+{;Jj>Jrr8IXde~)_ZDr`Z2ddjybngREuoQ2kS{XH?` zbdZ;|c%1>a9Nuj%siuQGX$dat|Py^7p>&zN`ilk1W*`vGm) z_sYGW3z&I1X0jv1u*|~bmbNOx@p3OtIF49m2ANzJntWhV*D@5k5E!`TDq&WvTV5G6 z?D1gAO>-N$YT1JR#ZTj+M?@z5BH*Z1(Uz0ApddY6rpQ`sVsNRZ?KO_>eUVU6y zPD`V?BqKi52PWZ_)Ry(D^IP5X$)eryuUs!oWKy+#4zxA)xK55QvL{EgDny)PsvdvH0Eu6}T^}w5 zqXe)dM}i_*8EL@~iYF*&O%Edc6ns&C%jvQC&#An_@O`gvZ?{ppboE){bY}P2= zxg6CsdRN7R6%KPLab}ov6OJJl<(48l7aHm={4wW`022Qgo-1?&6Np)JilkE#o`9y( zSN6TeSF@%>N;da9<;C{ug~~q@3f}>d0F8q{k&! z%-D&a?M9m!O1PHAteRu{7mjI%XKGf4D8n=FRz$y?lJ-5QL;43R$uMM1NKlf> zQpzAMliU8JTw{oyv<_#Bc+ZpR%HW`$MEA0oJo`Y&9Z57BQ~$RF2c3i|>GMC<>K7tC z129kiU>XYWI*!atQ18pTa=+94WXh-5Z^D&wN9XD$P9ED%x}EB;2}j^~jP>zst1zKT z;rg$ZQPfi|jcHXD5uK>#KX3IeSH}cuo!X+_Nl1^A6o+F^p-Dlv>!Q(O+f_jei}@W5 zundF%L=uO4hb;)@>Q|u!C`5F|?wXHD>0Xi3el(z=DUKyyW|988s6JO1O& zZZ+CRpU%nLUc~K*a{jiIZ{Z+I1-+9$SKr`+>(Kr5Y+1neR2Pm5dbs}J{(xN?8xeam z-k-+Be_)Hf-v%vY>ztZ8^IYoXIfPc*zwcJi0+TpShz|#PS(@v6bi5J)`t#aXA-vd zm{l*&WM^A$9uYdd=4^#;933!yU4;%rSxTGY9s8Tks(MOjrRf=fVo!MMuuBN?dGg4f zg@dBG&2!v%tH1V36AA32%@gcPeWu_>QmpI7FUSdW&w~cGe{2y^E}y&r$UntZr^*Zb zDw0WFsq`+?8^7a_JNFM?j{xSCCNDE31uoT`V4S;90IY#z(Ns&5kMbV2ffgvOk2&W9 zu@4)o?El}}03!nHb&Z~2!Ba+P7->K?QSMA{d{TaXek+sD*eg56F!l3Bh!dG3yLcIQ zq^d*j9|uv02EV}a5qKbHy;XOh#|zg^Ik?Xbz|B~Vv$M00j^AzxCBK71RW=?I|Hoy# zKg{Kf28`yr_)O8rOji%6)Ma^~s+vZZkjvo%R*W{eOX`r^r3^&phW%rlTr<_~qYfe?j z1l8mu1w#t|}THq>p$6Y;!bN^iPoH_m95AyfCa+ zH?2g7%AdRcYxNee-2M0B$(jH}!^8|gy6~@$w!RQ?2ic#tyhY9p-wSw48~3OC@cTzQ zK+JcOp<9-LZ5A3E9&H_Di+mQjz~=+Cbs9O8Y~2HZ|A(xk`J` zg&GKGPU64nk*X#hxD`f9RfR zaHj|XIE8G;ZybC!Tow?N6dBoU7Uk?F*nCrm>5uPjG1NBq6q347W@ZB)T5EjKYtHFI zJ@lTo({1#mJd|w(D@zNv{j7PewCntvIlk_#RgAyS>EV3PIoET}FvvA;K1M#}E?SB0 z6~o~!4Qs!BZMXmJw?{}ZK3KrAT$b}wI+OMkE?E>T)b%kXmJ1a&SoNIzw<#mm^E#;O z(&xC-|1vZ}&Kxjs4hc!iT46{s;Q?hwU8(i2Jj zrYZl6UWH35Y~b20uty0V^POva9J~K8UVl6eG<952whwk^=W1$>=Uiu)yYv4xyXafq z{_4x=IrA}v?}g+h)9Ck5qfffL3Eusi8~?}fh>h69S^k%4C`iK*UYZy455N9p3;!GD hpS9lqjU=A;8e5{_%X?=Y8JyKA*9HbFOn;zy0_9 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/new-kedro-project > **Note**: Once the backend development server is launched at port 4142, the local app will always pull data from that server. To prevent this, you can comment out the proxy setting in `package.json` and restart the dev server at port 4141. -#### Launch the development server with the `SQLiteSessionStore` - -Kedro-Viz provides a `SQLiteSessionStore` that users can use in their project to enable experiment tracking functionality. If you want to use this session store with the development server, make sure you don't use a relative path when specifying the store's location in `settings.py`. For example, `demo-project` specifies the local `data` directory within a project as the session store's location as follows: - -```python -from kedro_viz.integrations.kedro.sqlite_store import SQLiteStore -SESSION_STORE_ARGS = {"path": str(Path(__file__).parents[2] / "data")} -``` - -Owing to this coupling between the project settings and Kedro-Viz, if you wish to execute any Kedro commands on `demo-project` (including `kedro run`), you will need to install the Kedro-Viz Python package. To install your local development version of the package, run: - -```bash -pip3 install -e package -``` - -Since Kedro 0.18, a session can only contain one run. In Kedro-Viz, once a session has been retrieved from the store we always use the terminology "run" rather than "session", e.g. `run_id` rather than `session_id`. - ## Testing guidelines - Scope out major journeys from acceptance criteria from the ticket for manual end-to-end testing diff --git a/docs/source/experiment_tracking.md b/docs/source/experiment_tracking.md deleted file mode 100644 index 3a6f42addb..0000000000 --- a/docs/source/experiment_tracking.md +++ /dev/null @@ -1,360 +0,0 @@ -# Experiment tracking in Kedro-Viz - -```{important} -Starting from version 8.0.0 of Kedro-Viz, Experiment Tracking is exclusively supported for users with kedro-datasets version 2.1.0 or higher. -``` - -Experiment tracking is the process of saving all the metadata related to an experiment each time you run it. It enables you to compare different runs of a machine-learning model as part of the experimentation process. - -The metadata you store may include: - -* Scripts used for running the experiment -* Environment configuration files -* Versions of the data used for training and evaluation -* Evaluation metrics -* Model weights -* Plots and other visualisations - -You can use Kedro-Viz experiment tracking to store and access results, and to share them with others for comparison. Storage can be local or remote, such as cloud storage on AWS S3. - -The experiment tracking demo enables you to explore the experiment tracking capabilities of Kedro-Viz. - -![](./images/experiment-tracking_demo.gif) - -## Kedro versions supporting experiment tracking -Kedro has always supported parameter versioning (as part of your codebase with a version control system like `git`) and Kedro’s dataset versioning capabilities enabled you to [snapshot models, datasets and plots](https://docs.kedro.org/en/stable/data/data_catalog.html#dataset-versioning). - -Kedro-Viz version 4.1.1 introduced metadata capture, visualisation, discovery and comparison, enabling you to access, edit and [compare your experiments](#access-run-data-and-compare-runs) and additionally [track how your metrics change over time](#view-and-compare-metrics-data). - -Kedro-Viz version 5.0 also supports the [display and comparison of plots, such as Plotly and Matplotlib](./preview_plotly_datasets.md). Support for metric plots (timeseries and parallel coords) was added to Kedro-Viz version 5.2.1. - -Kedro-Viz version 6.2 includes support for collaborative experiment tracking using a cloud storage solution. This means that multiple users can store their experiment data in a centralized remote storage, such as AWS S3, and access it through Kedro-Viz. - -## When should I use experiment tracking in Kedro? - -The choice of experiment tracking tool depends on your use case and choice of complementary tools, such as MLflow and Neptune: - -- **Kedro** - If you need experiment tracking, are looking for improved metrics visualisation and want a lightweight tool to work alongside existing functionality in Kedro. Kedro does not support a model registry. -- **MLflow** - You can combine MLflow with Kedro by using [`kedro-mlflow`](https://kedro-mlflow.readthedocs.io/en/stable/) if you require experiment tracking, model registry and/or model serving capabilities or have access to Managed MLflow within the Databricks ecosystem. -- **Neptune** - If you require experiment tracking and model registry functionality, improved visualisation of metrics and support for collaborative data science, you may consider [`kedro-neptune`](https://docs.neptune.ai/integrations/kedro/) for your workflow. - -{doc}`We support a growing list of integrations`. - -## Set up a project - -This section describes the steps necessary to set up experiment tracking and access logged metrics, using the {doc}`spaceflights tutorial` with a version of Kedro equal to or higher than 0.18.4, and a version of Kedro-Viz equal to or higher than 5.2. - -There are three steps to enable experiment tracking features with Kedro-Viz. We illustrate how to: - -- [Set up a session store to capture experiment metadata](#set-up-the-session-store) -- [Set up experiment tracking datasets to list the metrics to track](#set-up-experiment-tracking-datasets) -- [Modify your nodes and pipelines to output those metrics](#modify-your-nodes-and-pipelines-to-log-metrics) - -### Install Kedro and Kedro-Viz -To use this tutorial code, you must already have {doc}`installed Kedro` and [Kedro-Viz](./kedro-viz_visualisation.md). You can confirm the versions you have installed by running `kedro info` - -```{note} -The example code uses a version of Kedro-Viz `>6.2.0`. -``` - -Create a new project using the spaceflights starter. From the terminal run: - -```bash -kedro new --starter=spaceflights-pandas -``` - -Feel free to name your project as you like, but this guide assumes the project is named `Spaceflights`. - -### Install the dependencies for the project - -Once you have created the project, to run project-specific Kedro commands, you must navigate to the directory in which it has been created: - -```bash -cd spaceflights -``` -Install the project's dependencies: - -```bash -pip install -r src/requirements.txt -``` - -## Set up the session store - -In the domain of experiment tracking, each pipeline run is considered a session. A session store records all related metadata for each pipeline run, from logged metrics to other run-related data such as timestamp, `git` username and branch. The session store is a [SQLite](https://www.sqlite.org/index.html) database that is generated during your first pipeline run after it has been set up in your project. - -### Local storage -To set up the session store locally, go to the `src/spaceflights/settings.py` file and add the following: - -```python -from kedro_viz.integrations.kedro.sqlite_store import SQLiteStore -from pathlib import Path - -SESSION_STORE_CLASS = SQLiteStore -SESSION_STORE_ARGS = {"path": str(Path(__file__).parents[2] / "data")} -``` - -This specifies the creation of the `SQLiteStore` under the `data` subfolder, using the `SQLiteStore` setup from your installed Kedro-Viz plugin - -This step is crucial to enable experiment tracking features on Kedro-Viz, as it is the database used to serve all run data to the Kedro-Viz front-end. Once this step is complete, you can either proceed to [set up the tracking datasets](#set-up-experiment-tracking-datasets) or [set up your nodes and pipelines to log metrics](#modify-your-nodes-and-pipelines-to-log-metrics); these two activities are interchangeable, but both should be completed to get a working experiment tracking setup. - -```{note} -Starting from Kedro-Viz 9.2.0, if the user does not provide `SESSION_STORE_ARGS` in the project settings, a default directory `.viz` will be created at the root of your Kedro project and used for `SQLiteStore`. -``` - -## Collaborative experiment tracking - -```{note} -To use collaborative experiment tracking, ensure that your installed version of Kedro-Viz is `>=6.2.0`. -``` - -For collaborative experiment tracking, Kedro-Viz saves your experiments as SQLite database files on a central cloud storage. To ensure that all users have a unique filename, set up your `KEDRO_SQLITE_STORE_USERNAME` in the environment variables. By default, Kedro-Viz will take your computer user name if this is not specified. - -> Note: In Kedro-Viz version 6.2, the only way to set up credentials for accessing your cloud storage is through environment variables. - -```bash -export KEDRO_SQLITE_STORE_USERNAME="your_unique__username" - -``` - -Now specify a remote path in the `SESSION_STORE_ARGS` variable, which links to your cloud storage. - - -```python -from kedro_viz.integrations.kedro.sqlite_store import SQLiteStore -from pathlib import Path - -SESSION_STORE_CLASS = SQLiteStore -SESSION_STORE_ARGS = { - "path": str(Path(__file__).parents[2] / "data"), - "remote_path": "s3://my-bucket-name/path/to/experiments", -} -``` - -Finally, ensure you have the necessary credentials set up as shown below: - -```bash -export AWS_ACCESS_KEY_ID="your_access_key_id" -export AWS_SECRET_ACCESS_KEY="your_secret_access_key" -export AWS_REGION="your_aws_region" - -``` - -## Set up experiment tracking datasets - -There are two types of tracking datasets: {py:class}`tracking.MetricsDataset ` and {py:class}`tracking.JSONDataset `. The `tracking.MetricsDataset` should be used for tracking numerical metrics, and the `tracking.JSONDataset` can be used for tracking any other JSON-compatible data like boolean or text-based data. - -Set up two datasets to log the columns used in the companies dataset (`companies_columns`) and experiment metrics for the data science pipeline (`metrics`) like the coefficient of determination (`r2 score`), max error (`me`) and mean absolute error (`mae`) by adding the following in the `conf/base/catalog.yml` file: - -```yaml -metrics: - type: tracking.MetricsDataset - filepath: data/09_tracking/metrics.json - -companies_columns: - type: tracking.JSONDataset - filepath: data/09_tracking/companies_columns.json -``` - -## Modify your nodes and pipelines to log metrics - -Now that you have set up the tracking datasets to log experiment tracking data, next ensure that the data is returned from your nodes. - -Set up the data to be logged for the metrics dataset - under `nodes.py` of your `data_science` pipeline (`src/spaceflights/pipelines/data_science/nodes.py`), add three different metrics to your `evaluate_model` function to log `r2_score`, `mae` and `me` and return these 3 metrics as key-value pairs. - -The new `evaluate_model` function should look like this: - -```python -from sklearn.metrics import mean_absolute_error, max_error - - -def evaluate_model( - regressor: LinearRegression, X_test: pd.DataFrame, y_test: pd.Series -) -> Dict[str, float]: - """Calculates and logs the coefficient of determination. - - Args: - regressor: Trained model. - X_test: Testing data of independent features. - y_test: Testing data for price. - """ - y_pred = regressor.predict(X_test) - score = r2_score(y_test, y_pred) - mae = mean_absolute_error(y_test, y_pred) - me = max_error(y_test, y_pred) - logger = logging.getLogger(__name__) - logger.info("Model has a coefficient R^2 of %.3f on test data.", score) - return {"r2_score": score, "mae": mae, "max_error": me} -``` - -Next, ensure that the dataset is also specified as an output of your `evaluate_model` node. In the `src/spaceflights/pipelines/data_science/pipeline.py` file, specify the `output` of your `evaluate_model` to be the `metrics` dataset. Note that the output dataset must exactly match the name of the tracking dataset specified in the catalog file. - -The node of the `evaluate_model` on the pipeline should look like this: - -```python -node( - func=evaluate_model, - inputs=["regressor", "X_test", "y_test"], - name="evaluate_model_node", - outputs="metrics", -) -``` - -Repeat the same steps to set up the `companies_column` dataset. For this dataset, log the column that contains the list of companies as outlined in the `companies.csv` file under the `data/01_raw` directory. Modify the `preprocess_companies` node under the `data_processing` pipeline (`src/spaceflights/pipelines/data_processing/nodes.py`) to return the data under a key-value pair, as shown below: - -```python -from typing import Tuple, Dict - - -def preprocess_companies(companies: pd.DataFrame) -> Tuple[pd.DataFrame, Dict]: - """Preprocesses the data for companies. - - Args: - companies: Raw data. - Returns: - Preprocessed data, with `company_rating` converted to a float and - `iata_approved` converted to boolean. - """ - companies["iata_approved"] = _is_true(companies["iata_approved"]) - companies["company_rating"] = _parse_percentage(companies["company_rating"]) - return companies, {"columns": companies.columns.tolist(), "data_type": "companies"} -``` - -Again, you must ensure that the dataset is also specified as an output on the `pipeline.py` file under the `data_processing` pipeline (`src/spaceflights/pipelines/data_processing/pipeline.py`), as follows: - -```python -node( - func=preprocess_companies, - inputs="companies", - outputs=["preprocessed_companies", "companies_columns"], - name="preprocess_companies_node", -) -``` - -Having set up both datasets, you can now generate your first set of experiment tracking data! - -## Generate the run data - -The beauty of native experiment tracking in Kedro is that all tracked data is generated and stored each time you do a Kedro run. Hence, to generate the data, you need only execute: - -```bash -kedro run -``` - -After the run completes, under `data/09_tracking`, you can now see two folders, `companies_column.json` and `metrics.json`. On performing a pipeline run after setting up the tracking datasets, Kedro generates a folder with the dataset name for each tracked dataset. Each folder of the tracked dataset contains folders named by the timestamp of each pipeline run to store the saved metrics of the dataset, and each future pipeline run generates a new timestamp folder with the JSON file of the saved metrics under the folder of its subsequent tracked dataset. - -You can also see the `session_store.db` generated from your first pipeline run after enabling experiment tracking, which is used to store all the generated run metadata, alongside the tracking dataset, to be used for exposing experiment tracking to Kedro-Viz. - -![](./images/experiment-tracking-folder.png) - -Execute `kedro run` a few times in a row to generate a larger set of experiment data. You can also play around with setting up different tracking datasets, and check the logged data via the generated JSON data files. - -## Access run data and compare runs - -Here comes the fun part of accessing your run data on Kedro-Viz. Having generated some run data, execute the following command: - -```bash -kedro viz run -``` - -When you open the Kedro-Viz web app, you see an experiment tracking icon on the left-hand side of the screen. - -![](./images/experiment-tracking-icon.png) - -Click the icon to go to the experiment tracking page (you can also access the page from your browser at `http://127.0.0.1:4141/experiment-tracking`), where you can see the sets of experiment data generated from all previous runs: - -![](./images/experiment-tracking-runs-list.png) - -You can now access, compare and pin your runs by toggling the `Compare runs` button: - -![](./images/experiment-tracking-compare-runs.png) - -## View and compare plots - -In this section, we illustrate how to compare Matplotlib plots across experimental runs (functionality available since Kedro-Viz version 5.0). - -### Update the dependencies - -Update the `src/requirements.txt` file in your Kedro project by adding the following dataset to enable Matplotlib for your project: - -```text -kedro-datasets[matplotlib.MatplotlibWriter]~=1.1 -seaborn~=0.12.1 -``` - -And install the requirements with: - -```bash -pip install -r src/requirements.txt -``` - -### Add a plotting node - -Add a new node to the `data_processing` nodes (`src/spaceflights/pipelines/data_processing/nodes.py`): - -```python -import matplotlib.pyplot as plt -import seaborn as sn - - -def create_confusion_matrix(companies: pd.DataFrame): - actuals = [0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1] - predicted = [1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1] - data = {"y_Actual": actuals, "y_Predicted": predicted} - df = pd.DataFrame(data, columns=["y_Actual", "y_Predicted"]) - confusion_matrix = pd.crosstab( - df["y_Actual"], df["y_Predicted"], rownames=["Actual"], colnames=["Predicted"] - ) - sn.heatmap(confusion_matrix, annot=True) - return plt -``` - -And now add this node to the `data_processing` pipeline (`src/spaceflights/pipelines/data_processing/pipeline.py`): - -```python -from .nodes import create_confusion_matrix - -node( - func=create_confusion_matrix, - inputs="companies", - outputs="confusion_matrix", -), -``` - -In the catalog (`conf/base/catalog.yml`) add the `confusion_matrix` data definition, making sure to set the versioned flag to `true` within the project catalog to include the plot in experiment tracking: - -```yaml -confusion_matrix: - type: matplotlib.MatplotlibWriter - filepath: data/09_tracking/confusion_matrix.png - versioned: true -``` - -After running the pipeline with `kedro run`, the plot is saved and you can see it in the experiment tracking panel when you execute `kedro viz run`. Clicking on a plot expands it. When in comparison view, expanding a plot shows all the plots in that view for side-by-side comparison. - -![](./images/experiment-tracking-plots-comparison.png) - -![](./images/experiment-tracking-plots-comparison-expanded.png) - -## View and compare metrics data - -From Kedro-Viz `>=5.2.1` experiment tracking also supports the display and comparison of metrics data through two chart types: time series and parallel coordinates. - -Time series displays one metric per graph, showing how the metric value has changed over time. - -Parallel coordinates displays all metrics on a single graph, with each vertical line representing one metric with its own scale. The metric values are positioned along those vertical lines and connected across each axis. - -When in comparison view, comparing runs highlights your selections on the respective chart types, improving readability even in the event there is a multitude of data points. - -```{note} -The following graphic is taken from the [Kedro-Viz experiment tracking demo](https://demo.kedro.org/) (it is not a visualisation from the example code you created above). -``` - -![](./images/experiment-tracking-metrics-comparison.gif) - -Additionally, you can monitor the changes to metrics over time from the pipeline visualisation tab which you can access by following the icon on the left-hand side of the screen. - -![](./images/pipeline_visualisation_icon.png) - -Clicking on any `MetricsDataset` node opens a side panel displaying how the metric value has changed over time: - -![](./images/pipeline_show_metrics.gif) \ No newline at end of file diff --git a/docs/source/index.md b/docs/source/index.md index ea10570cfb..4db6c326b8 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -6,7 +6,7 @@

-Kedro-Viz is an interactive development tool for visualising data science pipelines built with [Kedro](https://github.com/kedro-org/kedro). Kedro-Viz also enables users to view and compare different experiment runs within their Kedro project. +Kedro-Viz is an interactive development tool for visualising data science pipelines built with [Kedro](https://github.com/kedro-org/kedro). Kedro-Viz features include: @@ -18,7 +18,6 @@ Kedro-Viz features include: 🎨 Rich metadata side panel to display parameters, plots, etc. 📊 Support for all types of [Plotly charts](https://plotly.com/javascript/). ♻️ Autoreload on code change. -🧪 Support for experiment tracking and comparing runs in a Kedro project. Take a look at the live demo for a preview of Kedro-Viz. @@ -30,7 +29,6 @@ kedro-viz_visualisation share_kedro_viz preview_datasets slice_a_pipeline -experiment_tracking ``` ```{toctree} diff --git a/docs/source/kedro-viz_visualisation.md b/docs/source/kedro-viz_visualisation.md index 18379f45d4..744af9c431 100644 --- a/docs/source/kedro-viz_visualisation.md +++ b/docs/source/kedro-viz_visualisation.md @@ -89,7 +89,6 @@ Some of the known limitations while using `--lite` flag: * If the datasets are not resolved, they will be defaulted to a custom dataset `UnavailableDataset`. * The flowchart will not show the layers information for the datasets. -* Experiment Tracking will not work if the pre-requisite of having kedro-datasets version 2.1.0 and above is not met. ## Automatic visualisation updates diff --git a/package/README.md b/package/README.md index 781fff39c6..d7d0605813 100644 --- a/package/README.md +++ b/package/README.md @@ -204,34 +204,6 @@ Options: --include-previews A flag to include preview for all the datasets -h, --help Show this message and exit. ``` - -### Experiment Tracking usage - -To enable [experiment tracking](https://docs.kedro.org/en/stable/experiment_tracking/index.html) in Kedro-Viz, you need to add the Kedro-Viz `SQLiteStore` to your Kedro project. - -This can be done by adding the below code to `settings.py` in the `src` folder of your Kedro project. - -```python -from kedro_viz.integrations.kedro.sqlite_store import SQLiteStore -from pathlib import Path -SESSION_STORE_CLASS = SQLiteStore -SESSION_STORE_ARGS = {"path": str(Path(__file__).parents[2] / "data")} -``` - -Once the above set-up is complete, tracking datasets can be used to track relevant data for Kedro runs. More information on how to use tracking datasets can be found in the [experiment tracking documentation](https://docs.kedro.org/en/stable/experiment_tracking/index.html) - -**Notes:** - -- Experiment Tracking is only available for Kedro-Viz >= 4.0.2 and Kedro >= 0.17.5 -- Prior to Kedro 0.17.6, when using tracking datasets, you will have to explicitly mark the datasets as `versioned` for it to show up properly in Kedro-Viz experiment tracking tab. From Kedro >= 0.17.6, this is done automatically: - -```yaml -train_evaluation.r2_score_linear_regression: - type: tracking.MetricsDataset - filepath: ${base_location}/09_tracking/linear_score.json - versioned: true -``` - ### Standalone React component usage To use Kedro-Viz as a standalone React component, you can follow the example below. However, please note that Kedro-Viz does not support server-side rendering (SSR). If you're using Next.js or another SSR framework, you should be aware of this limitation.