From 2b13b010e32ae431c8fe9ea9441818f8d990395a Mon Sep 17 00:00:00 2001 From: Eldad Cohen Date: Thu, 4 Apr 2024 20:03:42 +0000 Subject: [PATCH 1/9] added an example for how to deploy mme with triton for custom model based on faster whisper --- .../audio/sample.wav | Bin 0 -> 87404 bytes .../mme-triton-custom-faster-whisper.ipynb | 589 ++++++++++++++++++ .../readme.md | 45 ++ 3 files changed, 634 insertions(+) create mode 100644 inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/audio/sample.wav create mode 100644 inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb create mode 100644 inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/readme.md diff --git a/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/audio/sample.wav b/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/audio/sample.wav new file mode 100644 index 0000000000000000000000000000000000000000..7c135edd19912bba17e011d01682365d2d05c671 GIT binary patch literal 87404 zcmXt91zb~K^ncslI@##%l9Ep8P_RHnZ0zn%?C$PD3`7h>0hMl$?vBBL!5Hg&|LgDn z|NB0`-rc$9e9!m9y>suz&WwmyyATD%2QLa=ziqE61A-tFxRPdo7snt74Kbj#iF*@+ zfQ%+|0?L5yK+~W!WG14E%s~DiG0<};8Cna8kqhA7138BLoAwJzgXTbG$Py#~*$kvC zp)*iA_|b)4B6E;Xz;`Y)8@&1X&7w zgmR(dK_+Y*qhRJvXfHGmA^@zb0k$;YWhk^2+5+^qBR7%#!24W83yhqDmOvD!5V?-*L#`ps zhz+y?+5yD_?*1UBz{p>O2}MHNp+nGohz$Kj-XU+0cEk}{5ABCGKt7NHDM!8_-;oxC z1}wxwfe;p|0NB1Eb%+@7I2&3F1p{qe0K;3P9>GJFARhLR2Gk4YJwje1Re)P}AQuK{ zLqp)M5XndS5Pfhz8|Y_1Y@`HST*Mff0b(={3WD^(+@HW^9im3eq3OVLC9t21WFo%- zw=^(wKF|n3mB8jdWGciI;F<|}0uNe&Tq!^{9hwV812*W;DDW{KDMR>(3ls;&tf48S z82JH4#fT>42+#*YdQd;Gm=4$`158mM;s(HG513VmbRYzPY$+50uy!ChATOH0Ol`;o zNZJAvRRF~gq!(cUJ<*UC@REnrfE+7Fc!&w`aVd~fg1hfX9>NCbrvv=KfTMr-KOh;% zAYui0T>{YK0g7^f|1Tm#oS{X~O2{9Qfmt7c{!YN65wK?mF`*tL1;jHI83ECZ0y3Jw zVk?+gfK(tH#1MG75?J8@O<8~)7(^ow#5e+s{j-@4ut^XPz_k~|f`mvTu#kr|APT_G zBEYOE(4PTfSA&QES|i8-;5UajKvx>zO#x=cK)!$<6tK_@^mik2#143{0Lbz{d|E($ z;y`5?fmxOi4fvD~EH;7KvHTA`415{@nb?L5gE4b}!U~Ku0qhNcF$|cY4d$AGtmOi) zT96^&fdz;f9Z2z!Nn`>U2fxvf35c!(kXC`(Qh_YCgKQuzP?rqwqX0aNfN=uQA_uW) z1sOL1tl>ca_}4)UAR;sZkn<58$QvNg1rZVgoeaPT8N@*cMAsRDp+3ZzFtRHs0uVnAiE0N2yN{06{PI>1f@5i+aA<*!A_nqo5ST7{tT96aSt$z`N zASsA#8DOmk1u_l* z{Wz%qW}saJ_~(L1seo@>q!Q?E1{tRTVub-SWXQkOK@4Q%paQJ{+jwXacpw5kk^y%l zpqT}_ksRRY1*3F;N(&(W-&I8oW~l)VOV9@_00JSfuL3@*f#g45$^W5Z13tvS9}2*! z0`LFJPzsQd0^1BweN2#>bnsUX_=o$?x)5MR17^oS#!LeAoggx`Am9FFBnjYFf;#$# z00Qy;e>-vzfgaEe#z7_u!S8WI38V=?3IVxA2Uaj36DGkZ1$0PVfB*yD)dbf+R4|C7 zE8tBVNXtQpq%0N+Fa7Zd1W0e&@sm*XH~Yk(I- za8Ct(jsSgVz^5Ag{a0)MkgGsU+Q2;nWRD4$3jxmlA%Z~dk%1;7Fv01x8;g#h@f{4Y*aAdmlVJ_KGdz$`k@Aq5f=ka=ie=^v+);GPS#wE`|AfF&}( zE&zIkAd*yolLangP{VeB-+%A?^U)BX_{Tj2vgRMtlmBHY8lcqx_YlY|R)#9zz+ntAc3EM|A^of0%QjPpZy@}1mGL|e|h$g@j(z>>3^CH zfR9*!LI$`~f$U%cTmQ!Jpu=(hX6&VgOt8L$_d5B3Kep~qlPSp{~VXTf_%p_fo5^bYJ}<3X481|8oW^ip>y1YnN_ zoHZk-!Co-}?D|qcH!cPHsYJvXAtDp%ZgsC3LcG9^^EeU*MvB$R>hEf<+74NP90mKt z^I+x~YD}4` zJf+;GTn(;G$}P%`$^>PEGF-V%`ApfVB&u{(wyH?gS=Ep#UR|q>1uK3e&@O}U7_#s`f?=|KmPMs>4li?Uk2M3x{;k?_SbQIRlJpq~0Qb#6*~Y8C&_@pj-d-_`t+OhIgD;b2P1%yKyRmUX_0gv`UV=BnoD*h8;~1Fmx(L! z2H5u)UCa$M6&0a2R#ZvZk{6P@VufJaW|$XnJ1&waBbAWnP}Wef^i7N$ z2EV(lZW=Pb6)E5pY|y?PSO zldRj?8TuderJ4>@F<~>wm-dqOk>HDHN(aQJWQp?IqEhZ+w)em(w#V?&!DU_T&1Oxp ztx=ulJCj=t8~qycn!7u`bZd66>m+t<>N_^<$2FU{Gr{AX5}cF{C^sNWpu;EyCLh0z z+(hl6O{0ILKVbaTc*|^Ou4G=)C}pf<6f$x&zB2DItu@@~_B1}NixJ7ZseF=MSqn8&^mm%oo9{7-(B7?CsTXF}YtA)@)7VJH(2i*uYS&Pw5Wc8gz68z@~pqBo9kP=>H^Cgi)9rVjq&X!t;^~=YLB&~_s<{O zJMK4@I(mq=RJsA8z((+X7(+nQ-m@-gS89i9pVw~F>C=_y#_O_l({w7d%$P@Lzo~EN zpER=R>xo9_lZXK0PG-_}66DAl^>X4n{UcTtX8Sa~sEyih9od0j0$(_5o0DxQ{=7Nr z7{s&Cn5sv$UF_@bt7HBN{fDoRWa8_|v9i_ep+(;dP3lM6Pt=MsH@?hxb|~%6@2)=q zpM9QtKjFPE`?ajNGnbxe_q{LwedC;d7j{_x*Z$>WjxsKMgp^M9rRHip(A{VfYUyQD zXX|HIVB2XUwOMWV&A!dH%zR8gU+cNHyFr1`F5ShH5@?J1DQ*D+rxA&bk&r|@_@-fj z-I%!(V;{ak%gNm_x^?Dh_e}F1+r+TLEAFq@8ERu;u9sr33K4|gvWrE19$7i5hl`+Z zQEYA6@iXsxNoiISz52xGfO|`CVqal1le6}Hklg!mv-0`G_oD^DAGgqs{TNo#dL(iyn?C`-YOFg(} z?~m9xm#}FMLccHXSQ6*qM_4vBsT$RMp_`=`tV#Y>_WgE6cVl|dt5;huT)trOr1(>7 z+TbI{^KEC^?>v1M_<7ZbkFQMMoX9v@n%6kon$dcqqhyfBXRGGn_K__ZA=+1s_F9td z7dvJ<+f1jqzH+U03-oyCcGdBkCErM8SZpFNvC_LqIggq`lCf0MY}ihsKanT8L{XS8 zv_GyNgNw!a+nk^8pZIm=faN`ts8Hc<^@;h*ho&X#@9x-M3qx`hRY0&>Pnp zf82?#zt=sf+@k$U?>0q*f{8y(+dU|LcU@A=wM^&P7kE|qMo;%Oi`8DMbKhvSS%ZNC z#Zx*y9y}F}wBzPU=C^xPULD-VI^!~==Q1H4S))I(_q-0eg|wOsRM`!){%al^_xcE#^DUi)Op;)S?*zrt>YT%9GF72@@azCkKSVHhG*Y)4cM zIy1Mpzw%6p(RasZtc%*Gzd!tvb*gwv8s$p)xzd**`CT>lDm6;T#Z#qC4LY2w%A=?q zGLm4e`j{5SJjCDx1*V2uyz$oyS?5@*nN3YHsqv}_n(mCE>Iz?o=90?vpD>%HV|^F9 zZAVR{)soQucg1t^t*3NcKKoTs_cv^9@G!vdRG&CGCtY7|@Gv-IRnbcQxS!FB!#n(D zI9~M33vTwGu>1mVfesVJNNnHi%Kpk@O=h)+3pV_!%&bi2UHg28pY^zXUE|8nPwsoa zMinYMmJFE;9_ePaoM_?>*s04HD2*8Wbc_dagjK4Wtg}Y&3eHa2DBQ6 zrZ!DKlU0UM2-c5hP6en$Xm4c%Z{bi(|IseH#_-N4=$*}4rv_AUb3mV$*}Ihsx2WcA z_sVgFed0pi&3}|YU2HcS$q6GvaY5PDnFMSn!h7| zar%neotKZii7KhDKTulnbNHJ_=AYbIZCOHXq*~a`e#@>B4--q7*EEmneA6cw%+P+N z8LTHTF|Zsq?=(g9IhyBb&6F0(e!?Y8suCw%#joI|jw~H!jIH5b8$H`Cs#{&VYRHr{ zU}ulhUoU6D0y=`SBKSD= zAmpRGr4nMF=v=Xq+4LB{)6~`aW*BX?$a<^EOf58R3vH%Wrrt)@Y6v&ZV{hlqk=|Cy zMNdZF_pR#Q(oxau(mFhL8F$r4&uExz3td1x*ID8Eady$F{KV84(sV6*?2HYIk1nOm ze;#_v^P$T$`^%;vMr1u4PPuyWK4)OyW_wea^^ZMY-G0!1Ip@6kc{7Xflk^$>u=W!( z|8v9J_L0`b&DE{c-ssUzaTR(S{x~)Zqd^YT#hRI#-qSs*xldYy{8^s#9k@#zE`^t_~-Ke})?2><==s{IL)3UbtZ68}+w;b#=9tz{l7Y+!l_#dWtl3D7@m~FUF zLN$?2-b)>#J27c2CexR3hc-<0rf#LwlD-lKv2#(8sw;{^%7bbTMUtRv?8fMRQ6-$o zuw(U-$++Ky3@v+Gw5OGi*q!2%;krK{GBPF_9f=LJ^M2yG-6_C+hV=roGF>OC8o4Lz zA3r@B&hZ#H*@~`wmOGh~oAJGYE0WA-R>}m}-sk zswjy2W+;3lP}GX~Nim>Az!L}-yP0WfJ~EB$R6h+nP3)ZM^CZMAd^{+`=Ys1@$9Hx= zt-CDun0p#rqBo%kl2QJ0o+UGRS~Mcm-^&UexJ|9l*p>Q>hKL! z^=BL8t-AdSxUK>V(Jc`qaZ}7k=@1Um-ZFJH{aEvvS*%am7`;B-WUV5Gj3OaLfNjfK zQaQE+xhEf$?vve+1xXtDkH&XQxJ!mHXQ}t-i%3LVAQ7i^+7foz<#uBF0vE1Zg8$dh zg7BeWN55|O`_AdpF4*)~c$koND`;A^P~>f`neYxIX!WnpDxH2RY>2dF2O`f zh=wjp#x!9`Gzq$``q73v^p|P5(>IXsl5;5;WK(=FYDD=#-Xgswy2&fx%x4ou_6r`X zi{P)A7U(qk1Zi0Nk$JFvk7JtigzHw{8==`Vm&~dUzaI42kL`&}4|cS-Ycl_+S4LY4 z2P%7oCF2c4rQKH=-;^)Pf0kQU5K(-k=vCgH-@AUj{hgeDsMN1|c5P-Ir_ri2lKqDp z#&;G<#gOcT;xuv{@(3182;&wR0MG`spZh_V9igqKcA5?hAhJ`_|LM zZH2SuwEI@;jf*vFiKWN~$&SfAqjv0&?ySZOz?% zu6nY%qiwTMof?P1aH7V!cK5LadE?uXIen=6xEC=yPczRBkMNSFWs# zt$b1%TDUN8b?({xWhFN&k}9`XG*?X3U|LgqezSc>kBzV8{o&V%O_2BaBNRQ_QTi%o zul96wZ4`QI#E^k12DhJYP{+ zcBSG}ongoMfo{&#F^}<`JS)LfSrMwA&_LNtYozxu19grW9yI%6aoudaAzx>{PLO_- z;h^4Tri?I*YEd$VxPG&2fgUKZBU_ND?Cz+{Nh)7dLf=A-*QXhem-QHf=Yb#r;tz%!PYS$2}hQ#Utk#_bJH`;VI}HJTHLcfsi_dZ?Y6D2s|v3iuTYg# z{M`L|)%|rZuKlPkbuGR6D==g9TTf1HO$zrR#stq&_z08Lc}zdE1WS&oK!1nkY*w7% z9MEy*7+=MDi(ZNfArbinV=?i*2?u+#oQVSU!GPcw5pm5>?MCZYwQmF70<^=l3&P zS_?m9Wc+whezZ-aJEL1Y7&QKp7dXW1@abEN)0@%1_0QqyTN4+*kDa!(cvI?@fi)RR zcgMNKpdu$C`w_z&y4 z{*fpA6!CJh%r?x|)c1^AimSrufc;sQgArv5Sy6j!7ip{^b|Tv+1_v&Vx=+Q9T6b^m z+A?^(^HIsO-#yhfLl-CRjdhLoa`w087BF)e4J(JPacl<$hxnt${hf_D{Vuw@7gX-r zy?OZx!^EdsuWc<{+p+xSVszZB=wD$Yp@c9ie{}^GS|y3(JZe`L89j%>6Y zYx2JpF3DJ)F3-XiUM}{kvgl5kI3zhrsIbBM&UfdV3ysHZr%(6uDD`<2b}`(}xkqCZ zc7%)M57=$3W!-CszYad=iye+1mkdlcysHiGxj3FSVK@>qdWL&r@K1AZ{oOwAi4~mH zz4Lo-^d>iLtgIW2b$+<%+|IWPA4W9IPg#?-LAvTug3E%_vxmb~AsP|CLiX8*qiuyp z)N=K4?#-6oq9rNHlTgyJht&Mdm08)fpIfp#OLNON)<_56%8sF45Vu)`MPTN&_+7C| zv6|~z>3zXR5ja0E$<`PjD%v1unE2anQzLSK@w z8(E97XIV{e4%+TE&G@d-scBX|>;V0s$)LY3OPO!wfzmya73@>hVdb}*gpwVtXwtshAusROiHR*UZtmZ` z7d@Zrw>v_ekdwG~*=XE@m;>P{fj@#jhR>fdi?NJ7Z%84UFJ3TK+%+@*#tkSb^8CK^ zm4EAVA!TF*}FcWbR{F5xB-imBUCD)~wj8*^E`L{>XR8M@kz?QWZR zE;%{zxcODy?mx_)mu8NMjGZ3yR(m}UEm@Ve9<_X3Tun@KYz`DZ7D<0axxtVG|mxPm$Q-Y@Ko z9UWYio<-jNUdHxwSQpW8khNm4SNMDPx2u1))hus2*|nl;vdQJ|`q@ae7W+p>shCVo?rK*AAVJv{;~Eko7(%a z+h&w2dZm7+dow(0<==&mX3TXhaQF4R;QKAWJ%HuxuVp}RBVU9)2jAtye7g1{qUc=J znkJ|21KoRDC@q5ntNHPwN77~R2bQPa4#rG4O;$CrVR#v5l7C1V%7=%ywHlN+{JBwg zjKyC%zMsFcCj8-?+iPE}KeoJRLCoCYnYTmc1`dRFhODyN%YV>0i*Kbq$?xxIEdTfs zbrDK>f6d{|wAZB%55Dlq-_;S&N^k1y+A)4^Qd23g$cme{{?%fg$j+#zF>7c333%YS z$n~Y&G*j5bL8n!+ro1sN=c{kt`GU0tp_L}BhueKx)4NEV%&{e7^@0klfX<`UWAbDJ z{KVlseM>k7f~!*xMmG(o4l&w!WhJe3`g;=1_p%aBMYJu>+gPy{yRBrBWICJc)4n|!V_-BqmUNi z3Hdy@6YVFtJw86Xj=ew-WBhP|YJGha!`8~ReKB#pPW+RZyJz;yycv4b|D8W3_@MVG za#H^=Peu*L$-6Tv?HiWVI%KSPrTZC^xBTObD_gHD{rbB(qh9t$RU9fbC$Yi+NHbs`)+VdXAu!2(bV`5ThckNd0~C?-}_aL)ujy&yI!%c z427^uMv}#?sC-nd)Lyh&o`iI%QR*YecX%HLk=TrFAAUPJF^c9@WA57Dj=OdvRkxv#KHb?~_8i3`w%- z^VSrH%s2S~#UG0wR!EvKgY$TwM81-G2}LcY95vRqKk1NQ_t@%;MX<#*GcSW^4IKU* z)T};>GJ~<`21T#%-ITuAMrDDK!mrSu)h6mP%ti75?&& zqDPV@?@y(V>}-G2u(Gcfi7@^`!cLHRS5k;{)u&9FK{H39rE)f7fP{GKjyolxtO&m73?zE7(>&+_8e)I<&g~ zeD|Ba{k#s;7;TTn8Y)ELFwW|QnBa_rtn>(4;c69 zIaF~oyWl6KFr~_@Qae97`+4rynzy~xoP73Z*SpTs!wIr*f(zZ)% z+-O_iB=jJ@jb6+grWU}VhzB~0$fmhcJm7p~w-SX>5Vc7R%tkpzyhhwAy(l{?Nfk_u zJ9DV)CBs3{zu$A^2vk)o^&atqjRl-CMoayWGe4N` zJyycmGUbac(*9*+YcQ$ZpsQ(GYu#r3)>xlO!Y{*Y#b2he7zf6 zH$Lk0bjIfp?-`f;x@Uxiq=#M&KQPlc>X9GCmZO`-VlZP#u8Je0JG+hAwzO_-o!79d zNBYN>FOtmRpOx9wc>z^7+VzLFatFq{d1u56(Ux?UUYl{N*)PlewkZzh9MY|~ z7@lRB(=StlC=ZBFaiJIr5-4{UqeRbzQG(69oUyFYRoqdYYO;|><_>bG!(p8C(HUdZ z5f%G6TWk2{u-OoC)KM|1jdNV=veO2#&hfCDl{{~G6gf~Byeh_OLD+)gd9l%Okgdx@ z)8*Rnv(i-E37<%rZ6(iJw+>z!QI9_t zTcM3;Ho7y-uGsH%HTDklUF{2bpPOE4{Y0;p`V&_RPsi@WxT%9AAEstao|@P`dX7!( zx9OYSpVx0XxRk9LiWpil^m({z^x@cLj(lKG|0cHCurW*k z;r+OY&;$O5!c7)nmV8-gFn1_ovEQ?4hm1tb_rzuD>%7N(*p}dWS)HJ^z4TcI<7LkS z(u+$U;IzzlHXqLXJW} zp1$77$rJPur$>Pu0Y%<^!EOuptO;DU?A@*G1czyjQkMe(93hm*BbA;w)ew^YsceiEZF#Hm#J_WLeEyJ&e^)xx(wh!+B=w~Y#ql@e`z$W`cm->Q zh0b+d{e9P>y~aDwZ~D9D(Tdp#%NI1yF`mT?R|oPv*V#MhUPk9l9O)^n#}>c%x%qQ; zYT26$Plfjgcirx$-nPC?eDw5fQHJrKOC__L5=PvWJIEMab4wTJ{l3!h;<;lBZZDL? zX~vGvQAHm2?{-p{j`KY z@@XBh`BrDuIF|U^D#iPLNcilx%a3l)IQa3%(Bbxd1=}k&ND>E^G2`*`uST;Y76tlD zKVayD8<<+u-&nKf7yi?|x6_gjK5e}7^g49i_4>4HVb_Sa-aKT!)=R(h=VDy~J6bwU zbkpBwTjq8rpg7{;oSeA7i?+unENq`=A3Z1RmhUvjMMiX55~@N(9|`Mv*=Ss|to&_Z zZf?r&l{vS5KFbWvoSr$DDbDUK(5R|yT-Ki^U8ou0!0~$<^)fzo{oEayyZ7y-?@!#V zyQOK()fJM2qPTmrpUr$4u_@rO-7SWjvVDAax47K?$G)_+AGW@k_N4fZ&FyKoW?vh< zM7_S~5%*0*n&eyTAH7=F!3Oae{B9ko)jGH5Gi)O1vt8$n&$~Hy&TRB7d6<5H!gaRI zE`2XbziRy?Wf0Z+s_J&p>AZb^rvI9jHU49L*2bLIIrD#&=IWP3R{dzYIoycyHlR2P ze3dc%iGw@rcL(qMyxV1;+s@Q=OIG+T(@j_&E1p#uiH~RsaI$;CEW-Fmj`rJ@v$A3{ zZl}|ew?F#!Xx;PcPik)`-{`w{?&;ZQ1}{-*#M~C}i85n!1GHCbr}-m$2lr2b(;{z0 zxks`iEF-psMEcu#!qYi+8OEy^@6p>O=eQ9)OKZ0j_5DWWY|Zlgne>yNt^Rf6w?p2U zlHzK^hS?o!xG&(#`U~x|d~SfpJ#@DA?Woz~aq#|ry={k9&s#Zjg-Mzs z#$I3ow75ow)^FV|1nGq3EDNpiYw;d3P_{E>o1{1l&Pa=mS@AY;;ky2<#GOw!2Ci7R z?AR)=6|Qj?XMTvB3cKg|+3XJMCB+{Z8dB8=i@)b5X8uZXe(^QgKIPccH+TO$I`d}y z?X1__H&z+P3!2In)XePtEH=WqQWLcq)_C_G?;-C&zv`fbAPt|%={)B~rwg{*j8?H+ zD3@RdSrK>Xz|pS3X2M^Sl9IwV#n($}3a{tK6s@Sxs8KZd_Xdj&l0tMhTHJI0Ide_? z*(J5hyw*8viC!m3kj3k)yt8Wg!u*+6qpr*p2XJlY=pWZwLEa#^+ZJX`-53wV?WP_43Lq<*dr8zh!m!CZFzP z-VTgNW3Ay8d)*n-Im88wMe=2hYu~Nj67M#D!=evM2@79E-3(hE`89aVDcne@eM2Kv zy=w4WCj}Jdi`-)GCdExwYdCExYsW+$>!SB9i2LJy0=S?}SXX9kO_?7BA zwbEGEYM*7PE!tJ?UhCv<&vH_@zH;7XlVI`DeALjNfq}=A6v>J4Z~b38zO>G3&Td#= zUs^}4y;-b7V5&Y3*ps8=k)-edn)S=)H9MYSQZJgx<@Wb_= zhjW({hSt6wED(&y_MqYzd?Q_RH}gj}FP#rfk8o5?Gjxe@O?Bj0*P6!}CuoM?bCnEn z(}ewycF&uRTWwJ-tmcyDoM!Vzr@Fay%*HP*Y25|f9OMQ4y?%gAluzKyQ*(9aF&A!I zR=Bi({$JdS z>$I!ZepU%)_1fP_i!edzcF_`U*Dz%`dLXDXrY)hfsY|ErdgJ@%IURdCdEI}w{uqK* zq2XyuJNGYP3DGVwP;CEF^71>e*Jo+Z^I5`Acrx#C^i+&qFCeik!UhWgDG#V(zDXQo&5w)v)UH|7-1x;e8Z z)ZXK^rHQ^V%LuO$C3EuomvwtIU8=lW$|*_DKm23#^N%mF8MD9UrN@5j$k|#jRs5yu zb?fH=A;*Q=I>l5@qBg)J!e&}O)0V|xrE0I%f2UWZmBVUh_R_W!lHnvc65Xa;E$fsA zDPD@>`HT7NsnW?W+!pS_N!4V}1Zq+&xreSL+iU(bJZ&Md4z{y&#Jje64*AXwc(0nvZS^lg$ z8exnNw6o;7gm!!|@c{8V{v0kE_ZkjE9RSZKr-5@uLY0N8P6;VZmG6*?*k`09>PPx3 zrmvQ}Hc6*mk7InzV$!PKdcEy!yCb$2t@c_NSUfU!HObZ+)_kDxg=#{$hY3TG5WE~K z{LS+mUp7)d@UWZH(b@K-`CUU|!^=j^Ca|ua#HaVCYK}(~#(&y7()6P;E)E)|va*uR_*h@Hy_r}h~q@d%` z;i#9$6SYLeQI;!wm9^?Ws0)~3cn;o@R7ftQRM4E6?V5vHP1^5tZlwgy(H?KS~$6FqL~{!_H@LHqcyB#mk$aD z@&<$hxWQ?IIfGx=JBBzz!^24<_r{)%zv1=pV}!fJp;BM@6@cL@G#@>HNyOg8RpZAA zDa1#_Fyc7j7NHog#HHb`;HI!l>~2_%xqy+NE6@$-ZnQCm1iN9QajWsegmjXe{D9&{ zjirI_g&CO|Xx0_YgIb5QbhU11Rsvgx33wdK zH62?p`fbExq=vJLGo3@@FgOc21DtOoKSt$a+s7pnyC%E&{(`$gy!e*HQzn-GR$f#` zLEWeT%whOFwh&i|uP3w<8%XcTvnXFEU6fkNBg#xlCwV2ggS3#;LYzx1C#)hc2>tkG z{3zZH#7jxoK^y@88z3QFAe&K2D2db|>Rj3_+FRNUS{w~e`#=q%woo=vIAkyK9FiTe z6z_^V3V%X(K^R0=WvXzL`AGakA%YG3KfI6$9{2Cqz^L))zL5#eE6z2}6HXb2F|uo9 zU}Wp44Ya0u2NdjOVVvN2yV%@||&6x zSXbPAoFTp(f12P#Y$7I-zL3gErKBgM1d^0^oH$9CO}L5A!u`ZvgJ)r;P?sPUaz~}7 zd@Xm9d7g8o_8_AzTCQ2Hu-cLs(2~AbOGxk&;Q@NhzdL zqy;1s(lE%jokVY;P>Lg@RoQ6o{ZPUJK$&F=i@ixPv9TpGw_XgCEk$W zMhGBy5KIXwd>#HiJ_^snUBwyU?qbo{b#M+wjrK%uLEQ!?55K5?fF}X672o9&ZWpyZDh)b^;@zl_*fW zPI6CLF2gEfl-E?{Y6x;g#i7?>*243!mbf0=6}&Yeg`h#)O3Wm3i5etZk{ijHWKN=x zIK&^sgT(2?0m4;+6QL1*7_S4kUW!vc(OfCbzGUM_$!~3X~`m` zrzC}9UGWLgq;R_s5+)1c1PlRts(p$*g%^Yho(QnQL*UrXec%yK{8e&Ex>Xh{_g6S6 zjZ_4+5cGjk=p||g+8r~3xdfYH)38psCpbB7KK>>?A3uN><0W`Dz6SpZe-=bT2j7f4 zgLA?)V^3o}u_E{n`~W@(u!h6aVO?L_s2ys6qHsm@0fH{4Q)1QbaML7b28+gSbb$Trwg_lA6f=$aczY6zz)J z$^@0Zx>fxEiH0z!&!}khB>EhN4p7mtC$LReJ=}U+3a%74iNoV5coJTL>%#rPUBCt7 zba1uUy;uiqCwvL^gnKZzFn*XG^i^~e8iy_grxDhJ^9Qyl6O;J^sU7VqXW>lzJuvIWlt9|R==l^|A_CUh756#0oq z#1AA}q|q`%xwb-IIieg;snmH$GV~U;9_@x9!g=sEtP*<^N5=2Kf4~z7QG}I*Lxc;2 z(}V+{r_%{d_`CQR{19#*&J6b*c-svhhB=s17=KI|dILHJMCJpK@;HOLWU?a6c3U@<4`piyAJIJr%QXmS=?O+6)94mQd@wE zT&tR{dZhGK5|ud$aLh-3P|+;ACG(Ykl2K)sWs$OUDN9C|K{8X>JlRRv0a=;szC28R zReoG?N^w^4O=+O2QFf{9)$i4p!TF4Z&=9mA1*5N{oiHCUTu_-LY!o&f%fsSv^C;nU=55Tx)hy?)<-=8=QTHhlS&eGntD3O z!C9&X)fe?w6-G5nm9NrLVboI9aaD&(sNAYfLK@T;)SJM$tSICvkgd**#>xjAfiu!`;k!qc)TCrN$ zpwLvx6z^pDvI)g``C@sz;*mT}<|a3gn9CNUpQzRgisVPsY-zc=NpVn~1npBER6K*+ z)dB?%V~e1a8}Qobc)1ee2)C)Wf|^~XHbSb1k?2Hd2QeCdU-cZdjj{yOr3xe<*!M~^ zf)=(1%EZK@UqExwkD)~TO$e(LK@F%EaIxwo(u0muxghVcK`JyjOLYaEtGa-yLDebm zA$u`5Ftv(h@O?~`@;c;$y$8*LmSFoa=ajG2NtkuGl_(#~8FUcRgaV&{P%?Oraxqw$ zkD}%%9?LHh?4?+xFV+sJls2eLr9}BkXc2m?aK4Nt=}_WOYM~~oUuHIy1EG*)ZWF0S zcu@KZEuPx1o(DN8tW*v-e~}hS4<9Dhg7y-UkT~gfDo=e;DZ^Q!cVPAs4B%wt1?p27 zj(iW+R39V$hF2j`U_E`Wh#(vx9Yd&cH2xO)A+8(JlR)_Qn1kvt)gCMX>6h|IJ@O>U zLAs4%kthbA0L3F%O^%Cd;oJ)$-@UL zq{K0ZBwvg@g1ZPZS(g>4*dm!uJSjgV$zt9YNyQSJ6si_sP5=G8J*mr&GfIPTCALU)C+IR-S@uCbqzP&}(EBQU#--1CW1R(1M;#s!W$Ium^-lb zvIJ!el?!RftF@Mm&qR+gzlr+^Tay15Ob+S(^XPZ4{n zJ1J|lUeRPWB$|QoluL+W^&VlLRv&3%m74|wox>Dj0C?OSw9h=PKAO91mo3BBcslq=LP~M9y0ax zB8L+td{69{CVQ??f*KasJHR~Y=pmC}%rw+q?p>Oz-h;mFf&hoR%!93$sAFhf!BzAc zxYLn{g{1>=0SAunda0L3N+ z4&;ecidU_k+(RlSy`&LVe-%|F77F%`8lfM6FZet^|=jN`X)LYeYU6j zLU?uYC6cc`X)qYavbi-fB^cB(7GhA@tapmbf)#{xRw%=SWvm+e45IWLn7B-!6yZlF@DJVRV{_j?^rbHi`RfAxE(#uRGi>#$7D5{{$ABP>Th!z!0#hVIi)nqr9r zl9M(Q8>of#ZSh~E)q&rN%AqoSUV6TBPPR02ouS`GGqA|8-eO#Ue{RF|&@(zhJOnLN zom6ZUOYl_kTlI~pqg_?qrsGB}W#GA$P60H6YNB=CE54Mssx+?Eb>h`vZ^^ll^IaG6 zzI3^_`wessotZi;=8VjmSk)o?Q#~1C?1-u#Nf3CM2M^eE9H3sFI6r0Xyv3zQ_FhVd zQ2Y$RZo40@r%6xXd*)%L`$$sQPcv-FQhshu(7Gr7#ah}pBmQ6X!#QQEF8HJVhr71` zi*nohhNqK(3A(!^6_5~7K@kj4vAcWQ?N+zl-7N|>pdcccgh+RH_w+D5^RC5x=5gbhzgPX|zULR<=f2c~<$l%3(e|CLmG!FNPobe<6CC3CtTH(# zUu&PCiUL&VA9a#Lfx9JA6}JJi9#t&`crIYY2)jo$}Bp1Ov4N#85P_@la6s&%~oZ5 zjml+_1J^9|M&%nURR}2O6wy6YImgZ3H*VzC1*dIV+LxQ$3>gu$+R|}4W6zJd3;b!$ zop!yB{&u4R3l=5MKIc1ya#tZxIG`hyUvV$UOJrO5;zth7dDpF8O1&?ZmW7!`>SY_a^K+b_Bs7~zSp(iQx^-Q_*c{c z?bAIOvQCAyIEXz1ukU?G`vh7?@rFc@O;c!DZLts4Gc($2>emuLGMM~k3Nq*t~Y5)>Ee! ztDExi)&2Gx-_qtb#ujXS5PQ-4uKP39hhe4N6?sn@LxEZSAl*X`8QM%#=# z-g25P_)KfQ&q|@*KtJXl!5tK5SK4>3Fias6OV?XV4BXhpxM1O-!8&gDuo;0I)o9cn zES+8)=Dg)%)M1&2p+QvouF2c2CWkC|I>m2k%*&MTkCQ%~&rVMMe3^F0_`!^VH!Zp8=9#@YlXDmJ zovq_k#qsZAe(<(7uXJ0c)$$o5@{`*TnT#DRJhedQUQc=VKJ}nre5VI`isC}QkCue6 zTlh-YjC)4gAk8Oz5ga1AM7^BvInGjjUKA8GXSv>rz|=~BS0n)Jgp(O=d)xOi&*u@hI0 zr8N}?eX)OfI60_cT*b@JjG9c|#L6!?7sFN5+=1|FDt?1_j>S& zq_e_e8IHQl_ylTe=@#BJ0+Du+vKXD(o2(k=Gkt;}{JjoYzTcR(Xz^B`NxK&8o^8GC z(oDDMI~JdqgbCgfc4U!oSJqsHg-ZTF#jxqq4>9m2Z(*OWjm%wD?Dehuby>{UH>$g~>!S{uf8w-gCx%Vh zIB8kmq7zH^&t@#JUGQ|d-K5%p>7o0VjMNqmnlGwGoBERh`lim7kJ*kO8Y1%zuN z8;);IGI^uvEV+m1SH)=KcXa~nQASYwIOz-$#py*H~qdeak{;*Dvdw+rBVvB6Eu8;=qwNhaDKTbUE!{@4Q~OH^RyNC#adG zclBE^HZqT1gU;ycO-YNNyT#JqT_|X-!)5l~*miCHov#lQQ^ysFN+JrMlz1dMJab95&Y79HJL|~Jr^gOOV?W(#ypqxV zHZ;>De@=;KWy8R(7K8Q-IhK`zE$vy+T2{o9H4P^-S4t*vYgI9rtcIB3+lecR?5&@% zI*Fyjbwqv5bJ)`U{GjLVmza&R{Epjwx#Y(_*dS9|2i6$d$#$%WT>)iYL1w!gOE*tk zb8pFRpTonH`X}s^3vbUH7{1ajo%V}Knzf-$C#Sh?Ir@P>#MSAvC}{o~^Qz(9x{`a@ zp7FZR5)ymTT=KRRHGSOpcFYIAh7;}Q+2aMtnRzYMGIHNt@tD?kyy2+C_Njw?rZ1$g z3O@}vm^owD@=)3;ewa>{sS!GecnFij9Ikqkq7(DvQ-Q$?I{-jQNVV*Iz*_Sp1J&J=akw<9%d zJe7T>Y98ZsXL+UEDy&z|UqCx1TirX8^U8y#oP|EY+=jX39^t$V7iqabdty`D@Dq+w zYl@k(>Vh#wAvI$#?Zhc+9lZ;qqirucU305KuN0kes+n@#fo8pE)Lo}Tj*Wgfb|pG~ zRHkXZf3N3GZ(CD>_>*D-W;J7}V&fngmD5to9;WtfJDqkWGo{$Ia(dX% zln?Z#e0}`=+E<&#ny#9@t!>6RcZ%JB@so+7p5zD=fe zvtU3aWkga_nK$%Iyeg%Z9H$8f$fwjiTeV35uYejiN@_QLAdXh+{seU&58l9W#puPb z+U;A7Mrpa}vy3yfTpXYIQ>@GNo|}9#wKMpQam7j7B9>-ho^5cInMVI6F;+JWUXV>u ze^LGr>9;Ivm$a?v+t}(+Hnw1U--hPaqA|RwwNrk)ExuCyoO>>Bc2T*MUmo1-tYkF4 zFDBL6;7Yj_937pqs>X&OOBcFs`8BPFdQW8~3bf8tBNQoxW@O|^k5Iib*hOWtrs*v= z)zd8}Z#DUadPaVk9H?hROw}2tUqCcd9@Yt0ES5*$Flr3h#-hbJQMgGy!q{J-qxG8g z#Ps1XBBj~jtYHY_kPaG`$Vjr9ZzQMQG&^P>le`(2N&HSJ;GV?aBRmx=cD;1IwD?3orIr)vy0_MK;h@*;L+tu-mUTJoh=)q4{3TIrW@+1Ho6!ho%I9 zg7=V8Ee`45N^UWd5MKAam5;X$VHnVl+KPLh&~J@mqS{Cw%+hry)AY@S_66AOv|uMX zv#ckUAiX@Ay;xW0sq%^Phdvr}1)n1+S5v`{&D_?`Wb)BC(PGvp z>P>V7Si22V2Vn)ebb6!Q61Nz)sDF|28-53=6~CU(R324NQ#|Q)7PND;dF#YB+>zq? zuHSe!I`)=d?c0hvC{L(d(qcRq+Z@O0>iJZ&f@@cKR-4QAA!kWl2XFMXm3vx$mi)>V z8?4lc#LVVQQg5SwSDTq1V=drRnnXI)6I#SuwOfphBoQuSZI3BLq}%EamsHdpv7hTA zX&UC3X|1j{nNYVDci(nq_iM^BMx{!x7f=3*x2vr*%|l_tEX-O`lIkA0nq$HKY|xM0 zin)%HYcG{24g@eC5tQ=x6#C#9Dw}o%yk`|58;xZN$Kqya&s0Qedv_>$W;sr6Uf0os zhgqymHPtvR!3@5eRNg(IzN#ltK3CEy=3v#uu}#$7a+5LnO@r)6z)Po``0*>;S4FDl)#6Zf3w z#&A#D@V_c1$T-bWir3;FBD1dX^#}BRtvlM8L|#tb(q5byrJbxjuUEgj z5<5qP!hc7-?a-!Q=HI|B(H+x2!KIwHy>pN42+m16CsMbPjNjt&_Vb`w7WB&m@^!Vohp&w3o)0ulNa84OD;9>7yXcb zW4$J!c(3{fI?lVe>Q=R-;zg9lsyuQBohL}?d}X;)UZ*|PSujw+k%7ESBV`t0i-^Sn zziK0Xpps*{_19D!kTe?`3)|4q(hdP%k=^;3%g{FMGpE_{cGM8%cf^gTY#y`oK~I;~ zckW^0%7)7FZLE9L3eK8__ZDxvHrBr}%u!gW6ySdp|<21$x+4$uJ>!Vi`O%| zK^A+lsg>ipa$L*WVMhi$T7Q_=G9#N$@k;I6o2!M_>Gk6Is2#jTm|GU&{tiXBlEMF> zA0r(_4#k7_{G~C3Kn4+eR@lT-Y9+8@Bv&!kXm65Mg+O*`Vr7$lOP(5y-$>4DR+F`P z!?s$$ghxdIpMmwwqVuN^vdXr%vrgd za>K5z#*CNjE0vv58WSxBhxLb#|7=j#vPJxsFg#F!1(PgHQTm$;m>TiSe9m1Y&w zY1(39uWP{zv1tb%{YD?M#2~J zm&D16T-1t=Ae{@8?b&nf^tAMN2Sf^a;)rdWosu&2sZ#uy7UKn+lf*=}o_w^4$}(U2 zwD%3w)!0}f(UBXQ_4U@IlII1HjGv{6F!?kY|EP81V7?$)G>v!7(S$y)wy48MZzbv? zdX{xs@9TnF0!;T)H6V00`j8ia-Ua8;WK#0mxO{oL%X7@;+c$rFTRUBh7vxxS+ z%S7&iKIZnm`XYLZZs5QaN{HOr@J#C{b{M|dz+RD4c}`BZ8Qq0h=b zsZba{=|RKa3}b|cW$r>}9EtkPF(E;AS4L){ zT3_04q2Cu?l=!ox7C0rJ+ljI-w6I*dDs{Jh#3~swnk>~z_aJ&zhczZLTVvj$wV4s!C3J=gCfy>@ois_szgz%u((c?rXw)!C9>wfoyOkV=vZ} zcNUfG>dI0yUBL655{T=tp14)CMrua*Ojl zF+ER zh4jN>qWKopIk8ljs8g(4CduNoDZn%6n7xWc1H0KYiFRvyQvq}1U}^2IWxZ@iba7o; zTT1uhZhZML;UU!64rb?#+L4^q!gHMSMEx#Nce;F|dWXnVJ(pN24pA24h8uCoSCnUD zx%!C)NA--*$=c7gI!IBbpHMd`mGrv?+L%G&1${P72eVYmnvkSZf`6z|(Fx?6i~`w9 z$pTCb*5C9u21ZYcWvR;PLCjfthqPTu^*VYk*Bm$`nw&}5%6O*ztJW&B4Ac9VL6IT< zH`Z;^FWenHQ^i~9x#E4@qV_SpW7@M?n%Zx27xs*4d(?Kf#I|Q`%Yvr(=2MM2?TXHN z_Q&oXE~@QBQ$)`g-a_>>jD@Ja`=iiPDJR^aQ2QffAPYwo8*3A<;L^p_s$i`zh6_!N zXC^A3tfqwIkv ~QytMIX9Qdx{w#h^M3nfPK8 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�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 P0{^4H|0wYPn*#q2LVnOg literal 0 HcmV?d00001 diff --git a/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb b/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb new file mode 100644 index 0000000000..b766e1bda9 --- /dev/null +++ b/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb @@ -0,0 +1,589 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Deploying Pre-trained Faster-Whisper-Large-v3 Model on SageMaker with Multi-Model Endpoint and Triton Serve as custome model\n", + "\n", + "Welcome to this notebook, where we will explore the process of deploying a pre-trained Faster-Whisper-Large-v3 model from Hugging Face on Amazon SageMaker. This deployment will be facilitated through the use of a Multi-Model Endpoint, allowing us to serve multiple models on a single SageMaker instance efficiently.\n", + "\n", + "## Overview\n", + "\n", + "In this demonstration, we'll cover the following key aspects:\n", + "\n", + "1. **Model Selection:** We will leverage the Hugging Face model hub to choose the Faster-Whisper-Large-v3 model, a powerful pre-trained model for various natural language processing tasks.\n", + "\n", + "2. **SageMaker Deployment:** Learn how to deploy the selected model on Amazon SageMaker, a fully managed service that enables the training and deployment of machine learning models at scale.\n", + "\n", + "3. **Multi-Model Endpoint:** Explore the advantages of using a Multi-Model Endpoint on SageMaker. This approach allows us to host and serve multiple models on a single instance, optimizing resource utilization and cost efficiency.\n", + "\n", + "4. **Triton Serve Integration:** Understand how Triton Serve, an open-source model serving platform, can be employed to dynamically load and unload models from the GPU. This capability is crucial for managing resources effectively and reducing operational costs.\n", + "\n", + "## Cost Optimization\n", + "\n", + "By utilizing a Multi-Model Endpoint on SageMaker, we aim to showcase how you can achieve significant cost savings. Serving multiple models on a single instance helps maximize the utilization of resources, leading to more efficient and economical deployment.\n", + "\n", + "## Note\n", + "Ensure that you have [git-lfs](https://git-lfs.com/) installed \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Installs\n", + "Installs the dependencies required to package the model and run inferences using Triton server. Update SageMaker, boto3, awscli etc\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%pip install -qU pip awscli boto3 sagemaker\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Imports and variables" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Setting up SageMaker Execution Role\n", + "\n", + "1. **Create Role:**\n", + " - Go to IAM Console.\n", + " - Choose \"Roles\" -> \"Create role.\"\n", + " - Select \"AWS service\" -> \"SageMaker.\"\n", + " - Attach necessary policies.\n", + " - Name the role: `AmazonSageMaker-ExecutionRole-mme-FasterWishper`.\n", + "\n", + "2. **Assign Permissions:**\n", + " - Go to SageMaker Console.\n", + " - Select your instance or job.\n", + " - In settings, choose the created role.\n", + " - Save changes.\n", + "\n", + "Now, your SageMaker instance/job is set up with the required execution role.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import boto3, json, sagemaker, time\n", + "from sagemaker import get_execution_role\n", + "import numpy as np\n", + "import os\n", + "\n", + "os.environ[\"TOKENIZERS_PARALLELISM\"] = \"false\"\n", + "\n", + "# sagemaker variables\n", + "region_name = \"eu-west-1\" # change to your region\n", + "sm_client = boto3.client(service_name=\"sagemaker\", region_name=\"eu-west-1\")\n", + "runtime_sm_client = boto3.client(\"sagemaker-runtime\")\n", + "sagemaker_session = sagemaker.Session(boto_session=boto3.Session())\n", + "role = f\"arn:aws:iam::{boto3.client('sts').get_caller_identity().get('Account')}:role/AmazonSageMaker-ExecutionRole-mme-FasterWishper\"\n", + "s3_client = boto3.client(\"s3\")\n", + "bucket = sagemaker.Session().default_bucket()\n", + "print(\"S3 Bucket: {}\".format(bucket))\n", + "prefix = \"faster-whisper-large-v3-mme-gpu\"\n", + "\n", + "# account mapping for SageMaker MME Triton Image\n", + "account_id_map = {\n", + " \"us-east-1\": \"785573368785\",\n", + " \"us-east-2\": \"007439368137\",\n", + " \"us-west-1\": \"710691900526\",\n", + " \"us-west-2\": \"301217895009\",\n", + " \"eu-west-1\": \"802834080501\",\n", + " \"eu-west-2\": \"205493899709\",\n", + " \"eu-west-3\": \"254080097072\",\n", + " \"eu-north-1\": \"601324751636\",\n", + " \"eu-south-1\": \"966458181534\",\n", + " \"eu-central-1\": \"746233611703\",\n", + " \"ap-east-1\": \"110948597952\",\n", + " \"ap-south-1\": \"763008648453\",\n", + " \"ap-northeast-1\": \"941853720454\",\n", + " \"ap-northeast-2\": \"151534178276\",\n", + " \"ap-southeast-1\": \"324986816169\",\n", + " \"ap-southeast-2\": \"355873309152\",\n", + " \"cn-northwest-1\": \"474822919863\",\n", + " \"cn-north-1\": \"472730292857\",\n", + " \"sa-east-1\": \"756306329178\",\n", + " \"ca-central-1\": \"464438896020\",\n", + " \"me-south-1\": \"836785723513\",\n", + " \"af-south-1\": \"774647643957\",\n", + "}\n", + "\n", + "region = boto3.Session(region_name=region_name).region_name\n", + "if region not in account_id_map.keys():\n", + " raise (\"UNSUPPORTED REGION\")\n", + "\n", + "base = \"amazonaws.com.cn\" if region.startswith(\"cn-\") else \"amazonaws.com\"\n", + "mme_triton_image_uri = (\n", + " \"{account_id}.dkr.ecr.{region}.{base}/sagemaker-tritonserver:23.05-py3\".format(\n", + " account_id=account_id_map[region], region=region, base=base\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generate model artifact for faster-whisper-large-v3 from huggingface" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will clone the model from huggingface" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!git clone https://huggingface.co/Systran/faster-whisper-large-v3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we need to arrange the model as the triton server expects it\n", + "\n", + "Model repository structure for Faster Whisper large v3 Model.\n", + "\n", + "```\n", + "faster-whisper-large-v3\n", + "├── 1\n", + "│ └── model.py\n", + "└── config.pbtxt\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!mkdir ./faster-whisper-large-v3/1\n", + "!mv ./faster-whisper-large-v3/*.* ./faster-whisper-large-v3/1/\n", + "!rm -f ./faster-whisper-large-v3/.gitattributes ./faster-whisper-large-v3/.git" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create config.pbtxt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile faster-whisper-large-v3/config.pbtxt\n", + "name: \"faster-whisper-large-v3\"\n", + "backend: \"python\"\n", + "max_batch_size: 1\n", + "\n", + "input [\n", + " {\n", + " name: \"audio_array\"\n", + " data_type: TYPE_STRING\n", + " dims: [1]\n", + " },\n", + " {\n", + " name: \"audio_lang\"\n", + " data_type: TYPE_STRING\n", + " dims: [1]\n", + " }\n", + "]\n", + "\n", + "output [\n", + " {\n", + " name: \"transcript\"\n", + " data_type: TYPE_STRING\n", + " dims: [ 1 ]\n", + " }\n", + "]\n", + "\n", + "instance_group [\n", + " {\n", + " kind: KIND_GPU\n", + " }\n", + "]\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Package models and upload to S3\n", + "Next, we will package our model as `*.tar.gz` files for uploading to S3. \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!tar -C ./ -czf faster-whisper-large-v3.tar.gz faster-whisper-large-v3\n", + "model_uri_faster_whisper_large = sagemaker_session.upload_data(path=\"faster-whisper-large-v3.tar.gz\", key_prefix=prefix)\n", + "print(\"Model URI: {}\".format(model_uri_faster_whisper_large))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Build and Push docker image\n", + "Now we will build our docker file that will based on [Sagemaker deep learning images](https://github.com/aws/deep-learning-containers/blob/master/available_images.md)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Create the docker file\n", + "In the dokcer image we will add all our requirements" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.core.magic import register_line_cell_magic\n", + "\n", + "@register_line_cell_magic\n", + "def writetemplate(line, cell):\n", + " with open(line, 'w') as f:\n", + " f.write(cell.format(**globals()))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%writetemplate Dockerfile\n", + "FROM {mme_triton_image_uri}\n", + "\n", + "RUN apt-get update && apt-get install -y \\\n", + " ffmpeg \\\n", + " libcublas11\n", + "\n", + "RUN pip3 install faster-whisper ffmpeg ffmpeg-python \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Build the docker image and push to ECR" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "docker_version=\"0.0.1\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!docker build -t {sagemaker_session.account_id()}.dkr.ecr.{region}.amazonaws.com/triton/faster-whisper:{docker_version} ." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!aws ecr create-repository --repository-name triton/faster-whisper --region {region}\n", + "!aws ecr get-login-password --region {region} | docker login --username AWS --password-stdin {sagemaker_session.account_id()}.dkr.ecr.{region}.amazonaws.com\n", + "!docker push {sagemaker_session.account_id()}.dkr.ecr.{region}.amazonaws.com/triton/faster-whisper:{docker_version}\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create SageMaker Endpoint\n", + "\n", + "Now that we have uploaded the model artifacts to S3, we can create a SageMaker multi-model endpoint." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Define the serving container\n", + "In the container definition, define the `ModelDataUrl` to specify the S3 directory that contains all the models that SageMaker multi-model endpoint will use to load and serve predictions. Set `Mode` to `MultiModel` to indicate SageMaker would create the endpoint with MME container specifications. We set the container with an image that supports deploying multi-model endpoints with GPU" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model_data_url = f\"s3://{bucket}/{prefix}/\"\n", + "\n", + "container = {\n", + " \"Image\": f\"{sagemaker_session.account_id()}.dkr.ecr.{region}.amazonaws.com/triton/faster-whisper:{docker_version}\",\n", + " \"ModelDataUrl\": model_data_url,\n", + " \"Mode\": \"MultiModel\",\n", + "}\n", + "print(\"Container: {}\".format(container))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Create a multi-model object" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once the image, data location are set we create the model using `create_model` by specifying the `ModelName` and the Container definition" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ts = time.strftime(\"%Y-%m-%d-%H-%M-%S\", time.gmtime())\n", + "sm_model_name = f\"{prefix}-mdl-{ts}\"\n", + "sagemaker_execution_role = role\n", + "\n", + "create_model_response = sm_client.create_model(\n", + " ModelName=sm_model_name, ExecutionRoleArn=sagemaker_execution_role, PrimaryContainer=container\n", + ")\n", + "\n", + "print(\"Model Arn: \" + create_model_response[\"ModelArn\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Define configuration for the multi-model endpoint" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the model above, we create an [endpoint configuration](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEndpointConfig.html) where we can specify the type and number of instances we want in the endpoint. Here we are deploying to `g4dn.2xlarge` NVIDIA GPU instance." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "endpoint_config_name = f\"{prefix}-epc-{ts}-2xl\"\n", + "\n", + "create_endpoint_config_response = sm_client.create_endpoint_config(\n", + " EndpointConfigName=endpoint_config_name,\n", + " ProductionVariants=[\n", + " {\n", + " \"InstanceType\": \"ml.g4dn.2xlarge\",\n", + " \"InitialVariantWeight\": 1,\n", + " \"InitialInstanceCount\": 1,\n", + " \"ModelName\": sm_model_name,\n", + " \"VariantName\": \"AllTraffic\",\n", + " }\n", + " ],\n", + ")\n", + "\n", + "print(\"Endpoint Config Arn: \" + create_endpoint_config_response[\"EndpointConfigArn\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Create Multi-Model Endpoint" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the above endpoint configuration we create a new sagemaker endpoint and wait for the deployment to finish. The status will change to **InService** once the deployment is successful." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "endpoint_name = f\"{prefix}-ep-{ts}-2xl\"\n", + "\n", + "create_endpoint_response = sm_client.create_endpoint(\n", + " EndpointName=endpoint_name, EndpointConfigName=endpoint_config_name\n", + ")\n", + "\n", + "print(\"Endpoint Arn: \" + create_endpoint_response[\"EndpointArn\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "resp = sm_client.describe_endpoint(EndpointName=endpoint_name)\n", + "status = resp[\"EndpointStatus\"]\n", + "print(\"Status: \" + status)\n", + "\n", + "while status == \"Creating\":\n", + " time.sleep(60)\n", + " resp = sm_client.describe_endpoint(EndpointName=endpoint_name)\n", + " status = resp[\"EndpointStatus\"]\n", + " print(\"Status: \" + status)\n", + "\n", + "print(\"Arn: \" + resp[\"EndpointArn\"])\n", + "print(\"Status: \" + status)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run Inference" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once we have the endpoint running we can use some sample raw data to do an inference using JSON as the payload format. For the inference request format, Triton uses the KFServing community standard [inference protocols](https://github.com/triton-inference-server/server/blob/main/docs/protocol/README.md)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import io\n", + "import base64\n", + "\n", + "def get_payload(wav_file_path, language):\n", + " with open(wav_file_path, \"rb\") as f:\n", + " wav = base64.b64encode(f.read()).decode('ascii')\n", + " \n", + " payload = {}\n", + " payload[\"inputs\"] = []\n", + " payload[\"inputs\"].append(\n", + " {\n", + " \"name\": \"audio_array\",\n", + " \"shape\": [1, 1],\n", + " \"datatype\": \"BYTES\",\n", + " \"data\": [wav],\n", + " }\n", + " )\n", + " payload[\"inputs\"].append(\n", + " {\n", + " \"name\": \"audio_lang\",\n", + " \"shape\": [1, 1],\n", + " \"datatype\": \"BYTES\",\n", + " \"data\": [language],\n", + " }\n", + " )\n", + " return payload" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "payload = get_payload(\"./audio/sample.wav\", \"fr\")\n", + "\n", + "response = runtime_sm_client.invoke_endpoint(\n", + " EndpointName=endpoint_name,\n", + " ContentType=\"application/json\",\n", + " Body=json.dumps(payload),\n", + " TargetModel=\"faster-whisper-large-v3.tar.gz\",\n", + ")\n", + "\n", + "response_body = json.loads(response[\"Body\"].read().decode(\"utf-8\"))\n", + "print(response_body)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sm_client.delete_model(ModelName=sm_model_name)\n", + "sm_client.delete_endpoint_config(EndpointConfigName=endpoint_config_name)\n", + "sm_client.delete_endpoint(EndpointName=endpoint_name)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/readme.md b/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/readme.md new file mode 100644 index 0000000000..78c2a3296a --- /dev/null +++ b/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/readme.md @@ -0,0 +1,45 @@ +# Deploying Pre-trained Faster-Whisper-Large-v3 Model on SageMaker with Multi-Model Endpoint and Triton Serve + +This guide provides an overview of deploying a pre-trained [Faster-Whisper-Large-v3 model](https://huggingface.co/Systran/faster-whisper-large-v3) from Hugging Face on Amazon SageMaker. The deployment utilizes a Multi-Model Endpoint, allowing efficient serving of multiple models on a single SageMaker instance. + +## Overview + +1. **Model Selection:** Choose the Faster-Whisper-Large-v3 model from Hugging Face's model hub. +2. **SageMaker Deployment:** Deploy the selected model on Amazon SageMaker, a managed service for ML model training and deployment. +3. **Multi-Model Endpoint:** Utilize a Multi-Model Endpoint on SageMaker for hosting and serving multiple models on a single instance. +4. **Triton Serve Integration:** Integrate Triton Serve, an open-source model serving platform, for dynamic loading and unloading of models from the GPU. + +## Cost Optimization + +By using a Multi-Model Endpoint on SageMaker, achieve cost savings by maximizing resource utilization and cost efficiency. + +## Prerequisites + +Ensure [git-lfs](https://git-lfs.com/) is installed. + +### Install Dependencies + +```bash +%pip install -qU pip awscli boto3 sagemaker +``` + +### Setting up SageMaker Execution Role + +1. Create a SageMaker execution role `AmazonSageMaker-ExecutionRole-mme-FasterWishper` with necessary policies. +2. Assign the created role to your SageMaker instance/job. + +## Usage + +1. Clone the Faster-Whisper-Large-v3 model from Hugging Face. +2. Arrange the model as Triton server expects it. +3. Create the Triton server configuration file (`config.pbtxt`). +4. Package the model as `*.tar.gz` for uploading to S3. +5. Build and push the Docker image to ECR. +6. Creat SageMaker Multi Model EndPoint base on Triton server +7. Test your endpoint + +--- + +This summarizes the key steps and commands involved in deploying the Faster-Whisper-Large-v3 model on SageMaker with a Multi-Model Endpoint and Triton Serve. Adjustments can be made based on specific requirements and configurations. + +Link to the [example notebook](sagemaker-mme-triton-fasterwhisper.ipynb) \ No newline at end of file From d912e1c509c95ee0e569820fbdf45eab004f1dcf Mon Sep 17 00:00:00 2001 From: Eldad Cohen Date: Fri, 5 Apr 2024 15:07:55 +0000 Subject: [PATCH 2/9] fixed grammar test --- .../mme-triton-custom-faster-whisper.ipynb | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb b/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb index b766e1bda9..5be9e2ee29 100644 --- a/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb +++ b/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Deploying Pre-trained Faster-Whisper-Large-v3 Model on SageMaker with Multi-Model Endpoint and Triton Serve as custome model\n", + "# Deploying Pre-trained Faster-Whisper-Large-v3 Model on SageMaker with Multi-Model Endpoint and Triton Serve as custom model\n", "\n", "Welcome to this notebook, where we will explore the process of deploying a pre-trained Faster-Whisper-Large-v3 model from Hugging Face on Amazon SageMaker. This deployment will be facilitated through the use of a Multi-Model Endpoint, allowing us to serve multiple models on a single SageMaker instance efficiently.\n", "\n", @@ -34,7 +34,7 @@ "metadata": {}, "source": [ "### Installs\n", - "Installs the dependencies required to package the model and run inferences using Triton server. Update SageMaker, boto3, awscli etc\n", + "Installs the dependencies required to package the model and run inferences using Triton server.
Update SageMaker, boto3, AWS CLI etc.\n", "\n" ] }, @@ -62,8 +62,8 @@ "\n", "1. **Create Role:**\n", " - Go to IAM Console.\n", - " - Choose \"Roles\" -> \"Create role.\"\n", - " - Select \"AWS service\" -> \"SageMaker.\"\n", + " - Choose \"Roles\" → \"Create role.\"\n", + " - Select \"AWS service\" → \"SageMaker\"\n", " - Attach necessary policies.\n", " - Name the role: `AmazonSageMaker-ExecutionRole-mme-FasterWishper`.\n", "\n", @@ -142,14 +142,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Generate model artifact for faster-whisper-large-v3 from huggingface" + "### Generate model artifact for faster-whisper-large-v3 from hugging face" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We will clone the model from huggingface" + "We will clone the model from hugging face" ] }, { @@ -165,7 +165,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now we need to arrange the model as the triton server expects it\n", + "Now we need to arrange the model as the Triton server expects it\n", "\n", "Model repository structure for Faster Whisper large v3 Model.\n", "\n", @@ -258,7 +258,7 @@ "metadata": {}, "source": [ "### Build and Push docker image\n", - "Now we will build our docker file that will based on [Sagemaker deep learning images](https://github.com/aws/deep-learning-containers/blob/master/available_images.md)" + "Now we will build our docker file that will be based on [SageMaker deep learning images](https://github.com/aws/deep-learning-containers/blob/master/available_images.md)" ] }, { @@ -266,7 +266,7 @@ "metadata": {}, "source": [ "#### Create the docker file\n", - "In the dokcer image we will add all our requirements" + "In the docker image we will add all our requirements" ] }, { @@ -448,7 +448,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Using the above endpoint configuration we create a new sagemaker endpoint and wait for the deployment to finish. The status will change to **InService** once the deployment is successful." + "Using the above endpoint configuration we create a new sagemaker endpoint and wait for the deployment to finish. The status will change to **In-service** once the deployment is successful." ] }, { From 7bcdd1c691e6702b268aaa12b25b7ba05345575b Mon Sep 17 00:00:00 2001 From: Eldad Cohen Date: Thu, 25 Apr 2024 07:27:36 +0000 Subject: [PATCH 3/9] update format with black --- .../mme-triton-custom-faster-whisper.ipynb | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb b/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb index 5be9e2ee29..bd8e58cc0c 100644 --- a/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb +++ b/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb @@ -44,7 +44,7 @@ "metadata": {}, "outputs": [], "source": [ - "%pip install -qU pip awscli boto3 sagemaker\n" + "%pip install -qU pip awscli boto3 sagemaker" ] }, { @@ -90,7 +90,7 @@ "os.environ[\"TOKENIZERS_PARALLELISM\"] = \"false\"\n", "\n", "# sagemaker variables\n", - "region_name = \"eu-west-1\" # change to your region\n", + "region_name = \"eu-west-1\" # change to your region\n", "sm_client = boto3.client(service_name=\"sagemaker\", region_name=\"eu-west-1\")\n", "runtime_sm_client = boto3.client(\"sagemaker-runtime\")\n", "sagemaker_session = sagemaker.Session(boto_session=boto3.Session())\n", @@ -249,7 +249,9 @@ "outputs": [], "source": [ "!tar -C ./ -czf faster-whisper-large-v3.tar.gz faster-whisper-large-v3\n", - "model_uri_faster_whisper_large = sagemaker_session.upload_data(path=\"faster-whisper-large-v3.tar.gz\", key_prefix=prefix)\n", + "model_uri_faster_whisper_large = sagemaker_session.upload_data(\n", + " path=\"faster-whisper-large-v3.tar.gz\", key_prefix=prefix\n", + ")\n", "print(\"Model URI: {}\".format(model_uri_faster_whisper_large))" ] }, @@ -277,9 +279,10 @@ "source": [ "from IPython.core.magic import register_line_cell_magic\n", "\n", + "\n", "@register_line_cell_magic\n", "def writetemplate(line, cell):\n", - " with open(line, 'w') as f:\n", + " with open(line, \"w\") as f:\n", " f.write(cell.format(**globals()))" ] }, @@ -312,7 +315,7 @@ "metadata": {}, "outputs": [], "source": [ - "docker_version=\"0.0.1\"" + "docker_version = \"0.0.1\"" ] }, { @@ -332,7 +335,7 @@ "source": [ "!aws ecr create-repository --repository-name triton/faster-whisper --region {region}\n", "!aws ecr get-login-password --region {region} | docker login --username AWS --password-stdin {sagemaker_session.account_id()}.dkr.ecr.{region}.amazonaws.com\n", - "!docker push {sagemaker_session.account_id()}.dkr.ecr.{region}.amazonaws.com/triton/faster-whisper:{docker_version}\n" + "!docker push {sagemaker_session.account_id()}.dkr.ecr.{region}.amazonaws.com/triton/faster-whisper:{docker_version}" ] }, { @@ -509,10 +512,11 @@ "import io\n", "import base64\n", "\n", + "\n", "def get_payload(wav_file_path, language):\n", " with open(wav_file_path, \"rb\") as f:\n", - " wav = base64.b64encode(f.read()).decode('ascii')\n", - " \n", + " wav = base64.b64encode(f.read()).decode(\"ascii\")\n", + "\n", " payload = {}\n", " payload[\"inputs\"] = []\n", " payload[\"inputs\"].append(\n", From 56e95eda7b7a002914ba9007b33bb958dc7e453b Mon Sep 17 00:00:00 2001 From: Eldad Cohen Date: Thu, 25 Apr 2024 08:37:39 +0000 Subject: [PATCH 4/9] added ci test result --- .../mme-triton-custom-faster-whisper.ipynb | 60 ++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb b/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb index bd8e58cc0c..92a7498396 100644 --- a/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb +++ b/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb @@ -4,8 +4,26 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Deploying Pre-trained Faster-Whisper-Large-v3 Model on SageMaker with Multi-Model Endpoint and Triton Serve as custom model\n", + "# Deploying Pre-trained Faster-Whisper-Large-v3 Model on SageMaker with Multi-Model Endpoint and Triton Serve as custom model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "This notebook's CI test result for us-west-2 is as follows. CI test results in other regions can be found at the end of the notebook.\n", + "\n", + "![This us-west-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-west-2/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "Welcome to this notebook, where we will explore the process of deploying a pre-trained Faster-Whisper-Large-v3 model from Hugging Face on Amazon SageMaker. This deployment will be facilitated through the use of a Multi-Model Endpoint, allowing us to serve multiple models on a single SageMaker instance efficiently.\n", "\n", "## Overview\n", @@ -567,6 +585,46 @@ "sm_client.delete_endpoint_config(EndpointConfigName=endpoint_config_name)\n", "sm_client.delete_endpoint(EndpointName=endpoint_name)" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Notebook CI Test Results\n", + "\n", + "This notebook was tested in multiple regions. The test results are as follows, except for us-west-2 which is shown at the top of the notebook.\n", + "\n", + "\n", + "![This us-east-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-east-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "\n", + "![This us-east-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-east-2/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "\n", + "![This us-west-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-west-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "\n", + "![This ca-central-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ca-central-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "\n", + "![This sa-east-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/sa-east-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "\n", + "![This eu-west-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "\n", + "![This eu-west-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-2/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "\n", + "![This eu-west-3 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-3/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "\n", + "![This eu-central-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-central-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "\n", + "![This eu-north-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-north-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "\n", + "![This ap-southeast-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-southeast-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "\n", + "![This ap-southeast-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-southeast-2/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "\n", + "![This ap-northeast-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-northeast-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "\n", + "![This ap-northeast-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-northeast-2/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "\n", + "![This ap-south-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-south-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n" + ] } ], "metadata": { From 727a7f18e349fd452434cd91ed3652a8b72e065e Mon Sep 17 00:00:00 2001 From: Eldad Cohen Date: Thu, 25 Apr 2024 10:58:45 +0000 Subject: [PATCH 5/9] added example to index.rst + move to triton examples --- inference/index.rst | 1 + .../audio/sample.wav | Bin .../mme-triton-custom-faster-whisper.ipynb | 0 .../mme-triton-custom-faster-whisper/readme.md | 0 4 files changed, 1 insertion(+) rename {inference/nlp/realtime/triton/multi-model => sagemaker-triton}/mme-triton-custom-faster-whisper/audio/sample.wav (100%) rename {inference/nlp/realtime/triton/multi-model => sagemaker-triton}/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb (100%) rename {inference/nlp/realtime/triton/multi-model => sagemaker-triton}/mme-triton-custom-faster-whisper/readme.md (100%) diff --git a/inference/index.rst b/inference/index.rst index e92a747cb6..591432cf3b 100644 --- a/inference/index.rst +++ b/inference/index.rst @@ -109,3 +109,4 @@ Nvidia Triton Inference ../sagemaker-triton/resnet50/triton_resnet50 ../sagemaker-triton/nlp_bert/triton_nlp_bert + ../sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper diff --git a/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/audio/sample.wav b/sagemaker-triton/mme-triton-custom-faster-whisper/audio/sample.wav similarity index 100% rename from inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/audio/sample.wav rename to sagemaker-triton/mme-triton-custom-faster-whisper/audio/sample.wav diff --git a/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb b/sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb similarity index 100% rename from inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb rename to sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb diff --git a/inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/readme.md b/sagemaker-triton/mme-triton-custom-faster-whisper/readme.md similarity index 100% rename from inference/nlp/realtime/triton/multi-model/mme-triton-custom-faster-whisper/readme.md rename to sagemaker-triton/mme-triton-custom-faster-whisper/readme.md From 1b5f263b53c9e412fe50b6940863d201e1e1f66c Mon Sep 17 00:00:00 2001 From: Eldad Cohen Date: Thu, 25 Apr 2024 11:02:36 +0000 Subject: [PATCH 6/9] update notebook path to ci --- .../mme-triton-custom-faster-whisper.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb b/sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb index 92a7498396..c98f1608bb 100644 --- a/sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb +++ b/sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb @@ -15,7 +15,7 @@ "\n", "This notebook's CI test result for us-west-2 is as follows. CI test results in other regions can be found at the end of the notebook.\n", "\n", - "![This us-west-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-west-2/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "![This us-west-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-west-2/sagemaker-triton|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", "\n", "---" ] From 4a6a421cf1728e2bf7595dbff188e7ad157edf4d Mon Sep 17 00:00:00 2001 From: Eldad Cohen Date: Thu, 25 Apr 2024 11:04:52 +0000 Subject: [PATCH 7/9] update notebook path to ci --- .../mme-triton-custom-faster-whisper.ipynb | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb b/sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb index c98f1608bb..ed67d23102 100644 --- a/sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb +++ b/sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb @@ -595,36 +595,41 @@ "This notebook was tested in multiple regions. The test results are as follows, except for us-west-2 which is shown at the top of the notebook.\n", "\n", "\n", - "![This us-east-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-east-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "![This us-east-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-east-1/sagemaker-triton|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", "\n", - "![This us-east-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-east-2/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "![This us-east-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-east-2/sagemaker-triton|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", "\n", - "![This us-west-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-west-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "![This us-west-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-west-1/sagemaker-triton|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", "\n", - "![This ca-central-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ca-central-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "![This ca-central-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ca-central-1/sagemaker-triton|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", "\n", - "![This sa-east-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/sa-east-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "![This sa-east-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/sa-east-1/sagemaker-triton|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", "\n", - "![This eu-west-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "![This eu-west-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-1/sagemaker-triton|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", "\n", - "![This eu-west-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-2/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "![This eu-west-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-2/sagemaker-triton|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", "\n", - "![This eu-west-3 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-3/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "![This eu-west-3 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-3/sagemaker-triton|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", "\n", - "![This eu-central-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-central-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "![This eu-central-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-central-1/sagemaker-triton|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", "\n", - "![This eu-north-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-north-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "![This eu-north-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-north-1/sagemaker-triton|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", "\n", - "![This ap-southeast-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-southeast-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "![This ap-southeast-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-southeast-1/sagemaker-triton|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", "\n", - "![This ap-southeast-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-southeast-2/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "![This ap-southeast-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-southeast-2/sagemaker-triton|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", "\n", - "![This ap-northeast-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-northeast-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "![This ap-northeast-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-northeast-1/sagemaker-triton|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", "\n", - "![This ap-northeast-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-northeast-2/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", + "![This ap-northeast-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-northeast-2/sagemaker-triton|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n", "\n", - "![This ap-south-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-south-1/inference|nlp|realtime|triton|multi-model|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n" + "![This ap-south-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-south-1/sagemaker-triton|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] } ], "metadata": { From 7fcce8bf4ec2a50ca525258ea2d521faf23b67c5 Mon Sep 17 00:00:00 2001 From: Eldad Cohen Date: Thu, 25 Apr 2024 11:25:52 +0000 Subject: [PATCH 8/9] removed empty cell --- .../mme-triton-custom-faster-whisper.ipynb | 5 ----- 1 file changed, 5 deletions(-) diff --git a/sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb b/sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb index ed67d23102..c9ce67194c 100644 --- a/sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb +++ b/sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb @@ -625,11 +625,6 @@ "\n", "![This ap-south-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-south-1/sagemaker-triton|mme-triton-custom-faster-whisper|mme-triton-custom-faster-whisper.ipynb)\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] } ], "metadata": { From a453bea0a00a6a4ae76c76c679ef51d8bee7b009 Mon Sep 17 00:00:00 2001 From: eldadcohen1 Date: Sun, 14 Jun 2026 15:55:46 +0300 Subject: [PATCH 9/9] Fix grammar check: use arrow char and backtick config filename Co-Authored-By: Claude Opus 4.8 (1M context) --- .../mme-triton-custom-faster-whisper.ipynb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb b/sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb index c9ce67194c..37717cf4c8 100644 --- a/sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb +++ b/sagemaker-triton/mme-triton-custom-faster-whisper/mme-triton-custom-faster-whisper.ipynb @@ -80,8 +80,8 @@ "\n", "1. **Create Role:**\n", " - Go to IAM Console.\n", - " - Choose \"Roles\" → \"Create role.\"\n", - " - Select \"AWS service\" → \"SageMaker\"\n", + " - Choose \"Roles\" → \"Create role.\"\n", + " - Select \"AWS service\" → \"SageMaker\"\n", " - Attach necessary policies.\n", " - Name the role: `AmazonSageMaker-ExecutionRole-mme-FasterWishper`.\n", "\n", @@ -210,7 +210,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Create config.pbtxt" + "### Create `config.pbtxt`" ] }, {