From 0629d964c35a9121c738b10e838fc4d25e51bfe9 Mon Sep 17 00:00:00 2001 From: Jingyi Date: Fri, 24 May 2024 17:40:29 +0800 Subject: [PATCH] improved workflow lock --- .gitignore | 1 + build_scripts/comfy/comfy_proxy.py | 66 ++++++++-- build_scripts/inference/serve | Bin 5054904 -> 5054904 bytes build_scripts/inference/start.sh | 201 +++++++---------------------- docker_start.sh | 138 ++++++++++++++++---- 5 files changed, 219 insertions(+), 187 deletions(-) diff --git a/.gitignore b/.gitignore index aefea1f1..7ada5763 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,4 @@ test/**/.env .DS_Store /container/ /.env +supervisord.* diff --git a/build_scripts/comfy/comfy_proxy.py b/build_scripts/comfy/comfy_proxy.py index 0c7b4e49..37cf49c5 100755 --- a/build_scripts/comfy/comfy_proxy.py +++ b/build_scripts/comfy/comfy_proxy.py @@ -851,9 +851,14 @@ if is_on_ec2: try: json_data = await request.json() if 'name' not in json_data or not json_data['name']: - raise ValueError("name is required") + return web.Response(status=200, content_type='application/json', + body=json.dumps({"result": False, "message": f"name is required"})) workflow_name = json_data['name'] + if workflow_name == 'default': + return web.Response(status=200, content_type='application/json', + body=json.dumps({"result": False, "message": f"{workflow_name} is not allowed"})) + payload_json = '' if 'payload_json' in json_data: @@ -865,20 +870,23 @@ if is_on_ec2: start_time = time.time() - s5cmd_syn_model_command = (f's5cmd sync ' + s5cmd_sync_command = (f's5cmd sync ' f'--delete=true ' f'--exclude="*comfy.tar" ' f'--exclude="*.log" ' f'--exclude="*__pycache__*" ' - f'--exclude="*.cache*" ' f'--exclude="*/ComfyUI/input/*" ' f'--exclude="*/ComfyUI/output/*" ' f'"/home/ubuntu/*" ' f'"s3://{bucket_name}/comfy/workflows/{workflow_name}/"') - logger.info(f"sync workflows files start {s5cmd_syn_model_command}") - os.system(s5cmd_syn_model_command) - os.system(f'echo "lock" > lock && s5cmd sync lock s3://{bucket_name}/comfy/workflows/{workflow_name}/lock') - action_unlock('release') + + s5cmd_lock_command = (f'echo "lock" > lock && ' + f's5cmd sync lock s3://{bucket_name}/comfy/workflows/{workflow_name}/lock') + + logger.info(f"sync workflows files start {s5cmd_sync_command}") + + subprocess.check_output(s5cmd_sync_command, shell=True) + subprocess.check_output(s5cmd_lock_command, shell=True) end_time = time.time() cost_time = end_time - start_time @@ -891,12 +899,54 @@ if is_on_ec2: response = get_response.json() logger.info(f"release workflow response is {response}") + action_unlock('release') + return web.Response(status=200, content_type='application/json', body=json.dumps({"result": True, "message": "success", "cost_time": cost_time})) except Exception as e: action_unlock('release') + logger.info(e) return web.Response(status=500, content_type='application/json', - body=json.dumps({"result": False, "message": e})) + body=json.dumps({"result": False, "message": 'Release workflow failed'})) + + + @server.PromptServer.instance.routes.put("/workflows") + async def switch_workflow(request): + if is_action_lock('release'): + return web.Response(status=200, content_type='application/json', + body=json.dumps( + {"result": False, "message": "release is not allowed during release workflow"})) + + try: + json_data = await request.json() + if 'name' not in json_data or not json_data['name']: + raise ValueError("name is required") + + workflow_name = json_data['name'] + + if workflow_name == os.getenv('WORKFLOW_NAME'): + return web.Response(status=200, content_type='application/json', + body=json.dumps({"result": False, "message": "workflow is already in use"})) + + if workflow_name == 'default' and not is_master_process: + return web.Response(status=200, content_type='application/json', + body=json.dumps({"result": False, "message": "slave can not use default workflow"})) + + if workflow_name != 'default': + if not check_file_exists(f"comfy/workflows/{workflow_name}/lock"): + return web.Response(status=200, content_type='application/json', + body=json.dumps({"result": False, "message": f"{workflow_name} not exists"})) + + name_file = os.getenv('WORKFLOW_NAME_FILE') + subprocess.check_output(f"echo {workflow_name} > {name_file}", shell=True) + subprocess.run(["pkill", "-f", "python3"]) + + return web.Response(status=200, content_type='application/json', + body=json.dumps({"result": True, "message": "Please wait to restart"})) + except Exception as e: + logger.info(e) + return web.Response(status=500, content_type='application/json', + body=json.dumps({"result": False, "message": 'Switch workflow failed'})) def check_file_exists(key): diff --git a/build_scripts/inference/serve b/build_scripts/inference/serve index 7b5033ba57f55fdf58fe727628ccedbb4a20fae3..a2d419504be600ef8a7ed2fdd9a235d322e6f3e0 100755 GIT binary patch delta 63956 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…j+(vn+bgqR$fN=m0y{ZW1?@OIip@^&74ok_BLmCCCf-|U485<=kOvkTsc;Uq_5MO*+5-Vw3O8U& z1{E6V9moP8@?HGxe<#kj;LzW9hH6a?d8UE*NC;YH)G$k`^t^|HOh_qYLy$qun9r# ztR1MEzH6Bc&9w0~17`NqigxE4;cr}S?1ul*eE$&CfyVWM9o!Yd`f)=S{YWK zawB+zHoIuwiS{$`)#z7lJWJV6`%Sc4O}(|={Mm>r*ZW?3wA^_AKiGGp%8eaZDDI1} za>)1p$h-dT^wd9e`X0Vc(>PaY<;KlHc6_SbNWzk_j`}w*MGUIz%gwuD9BOH^$vp0wFqzg#iAP|m+%q{6Io#7)P4{)$lwlVRPbY_<%TG@JT`E5=gjx_HId1#@96 ze_iJK^NP`SA#t$%^ER6wdSD(L{=Cg+i@9{gNHZPq$QA}FxMH}s+HC2UuNV<4XaJ*O z0i3f6{zd$|#1~#M4nSAg6{Cr6vw4gw#$NO+TcKgo7*G@%ZTI4r3XQt^s6+P`)a~50 zp%=y;_0fQW>nk#btzZG%0Au7rBkM;JFlqYX0qAiQ8Yf@|l)okcrO;>yV_;k8g>j}o zqR>c$ewcrpabVr=ZMGa33v*$TkAkaOp^*kNV5up<+#i@B%wkJ&s}~x3`QxzUnuSJ9 zDAy)YmOVhavRBEifJCz$|zI=E4G#w-y>r z_^UK`JNkj%c7;A8fkOIig~m82w=Xo7LRSnOK@ZGw=zIC&IC+`9_WX|q4zHOff+su8K$F0p|Kq%!$YP3^I#4v zg?Vu#$Sd19J(&?KfL`doo3jJc?x7#(@o;8L9p*w;FSgY5L-{uPhfQD_Y!7{T6yhnw z^er?}U=ExE3*c(#>PLq#Ie`vM9iD@39&&27XNCiqA@supn9M`aIOySlXDQ5qewfC? zPd3bhCt!@1iM8kY_fl|mU~get=zfr;f*v>=dSPZ4Rs^O|&xOljf$4|xLv##X@ECN% z3or)enC)O5^b9UEB0AC^lw%nWMt9`;&!G^DkP8!F9!!P>a2AvkSz73V<{xlpK@UtD zLLAJ4Tg-TvW5y3IOFb8gduE#hFFbkf5-p5H87C@JI z7DkgOlvC&rrlt6}byCQ~F&%oxFo3xXdN$!rzOg56*N^qPL(6!x5g8@jvF;WRp=o&n>{`Yd$leuji#)_gjK zxiHK0KTF5Z1M^@qEQC3*ZZ`&4K))~p#zFT&t}2+eh!upsn8kEVp#b_}){;VFml?2> zrRvVimNNkL9GC~)E7&UNg)a2umCOXD!4#MdXTc1(9QvUjX2HE?U1dTZ##@E%F|YrZ zxUnF_tl_$aX=~~DE&^c|fobbFz0@;cH&_6@(6yccVGNuFy>Pkd-@tvq9AG0W0drpE zY~c6!`S^zNYfQw9gAIFe{mZY@aW5R3I14Zr7Mcw*Nu&pv!}c&2dSC%eH2qt-AwhW? zhY)(VlQ2x*!GxgaZ9WrBeJ3jhb70*#^enanx^~l_kAi<6hYrSk$RUC`pFk4vALKB> z^e%!9emb(mW*OoMVy5`;~le1xk8#=r!a0h3`KoNoG$a%+a^(6@nt>nrvg z`r#2X;A=96InZ`D^<0(;`eA$M`i8>^)8Qc!bbm`CFb5{#&-#vm%=lw$3CuXoM9lc_ zxq6`d16u?=KXCnDFa;bD_Yer9p&!P=95?{x!4&8^!3_n*{K%cr4vicE`_Q0fkr7Qj zqgIj84aU?iGWb6Z*m4>c8D29ks>n#C?rmCR)EvaXHxwBe)bn5_^fW6n_Ch~A0_Er; zBM+v*LYU{HP&1yu<_rY=Fb1aISY!+^>o5i8!uAZ1(Sm`Yw^flb$JE;u85>|0oQ^;F zwjv{odQAHwV>R_WxEFdl78$wt)%VE359eR19M;kbjK7K$b~rewYYzVJejGEHW1MGoSw{Y{21# zC&)Al7D89oB4ZbR4|I7M7`BIb@Cbfaw<04Sx}o{UOc~JDp8;SKmn1Q` z*b1h@ZZHE5fPR<)v)~+<3s?In=!XsO zr6brL=D`HodG9VV;;ARYB$y7T!z{QQ7Qk`D#dwMgUnY(`3OS|#k3m;2_7bMUi2Lxv zCNQ^mkr4~|9}*Y?U<^z#{V*LCz}3(bPvS5Q9)Ny$66U}Hn47?s-cQ{9MLuIGnYahA zS2(;d0cOGN_&o#JYnTg@@FzdOOrUEJGl3p2TLHZ=8y3J^nEoIWfUbvF(E%h1qhT(L zg?TUm`Um@%0fmCWMaC@XPUMtBc?bzW4?F<9@C3|&1uzRn45ULC4L!ryYv@Yiltb^M zBnk`Q1tyR_iiD}>!AvtQnS{+aABAJ4<1x;F82}?5V1UQD(ZICPWNb2p>mIttkT5KO zvtZT}bPWAtiwwV6A5X_no-W<5&ZCisn6wx#Nu@~7om=1k$ z6f!7yVHO-`)?Z>q(7T4cf;n(6bgidDQ-6&ckm-l6;S2~{L76`i=muSI0QAEYm<#8a z{!J`BjDg!>@+PkT0~FG6oP_R7I)+)$^)Lx+X3t?RjECuO@}UG{w$P!e!wi@KhJ_igBPG5MsT)rVKnsaosOX& zX2Sw_47zsFG0cH=N3s$y?r{>@O?&9s!^+^#g56-od#p6ff#b}0-#!MQ5R=USCik;< z(DNZH0$m?*HJHp{MIJ?mZJ`%>U^+~M86Weh2J_%jQ~#9ypnQOYq5m^h0_MU3(|?e& zFpBFxjY2eqEEoebK4&FhE?mwGlFu*`>M_4@8JT{#0lLm|`Jj9M;FMF(f=5jMc}_Wu zfwp9H=z?jmE%aRA)(ibGIhpIffWj;s?u+at%!1p^z(4tTg}E>v#$4iZe2fHPH1xw5 zC>M}0biowpfwN%xWeyw6fZL(}FIE=HS6Er-f`yOyXh5MZGf9K3pu3R0g{~3~BaDHr z(R2vgnk;7q&}FcPFjo{C3t_TUZ1_#xUTkE;0=d|Te}V*R78@t2r`0JoN}*i0*l3u- z%G4`1Vto{Ht}iwcVY;i>NHZB#Y%GV#O^c1~P;ORi9Dy-66&n{|0jxO&-Cb>@~CIQQkdM0 zf$?X>kumi2EH>Jkbyxt???!)-33!T)CSw^8wuf@BV#5R7FcEs-IG6*o%sPJ@R0=bC z^G7(Yade2I70iX*U>+O*nn?QG8wgATT zD>mep@b{;Gn4VB<%)+0M;A1H$_;L7Q7Tg7M;31d`Pr^J{01IHm1O~j90iX+}(V-u< zr=A5prhXqYhkodX$@i1MM9u(g2t5OejRctEqp+P03I-M%wl(kpGK8K%#l~tg&|7Sr zfCX?Ie(!_)X%h6qLon^3Vk2fP9E=~vBr?#;BsPS2mpzFW794pn+idVC1Jc0DUyGHRei%Q64w5;|_;XsV8&0Kv7z@*3!c?w*_ZS-Bh=E(o0C)(>PmuXE zIF6FfEm{V{#HJIURj6TMN^s&>u`rV?sW& zFqJa^UDL?a?D&~tBcHl|9@qC%EIEudxs)3X%!O;A{2T+rWEj7m1YgDv<&A6!%=0tg z1`b&!1HpnfNC?Vrk?0IoWCz!OGKI8vSW1|@o5Qq`fR8vtGuZ;z7G}YP_`NyYV5q0V z6zKVwc4i&s!dzGYlRqKxS*+-%T*gp7z{su73+6yi-4dhiD-0A{Vz}m!(4D-( z3f=echZ<%b?lSAW_+ve@4o{l(KD;Rov-;9LoeA+5C9|O0M`1aIG?)o<;Q<(v$lof! zELdv#`7@*V`842f;O3A(-XkSOF7%J$uSD?YC6^ef(95gqtzKmUt9e!RHDb=`^UZ)?85pL)CJWGE^y?&)Ut*-dyx*89 zO#6csK+m|qyY4Ut*4#wGf07u?;;m9Y{yew~CiD8~TKwL>Sdj%>|LIqFsTzmBu*8VV zWah=pWFai2L+F9a@w<43wC!fjhQy0b`14>6bn%L3-9@Ynbi;I*1kG1J(_oH+_m5x! z@0~8(Ou`YR#sMf-FEtvz!Qn`+!HcPHz*@X?WU@9dq`|a0rAE!gWO^O%jls0*(P4(G z)F?3P^-GPoCCo6A7a*a(5ihyEN#c!5jczapPKUWo7!Z1!@@g3L!;?!$;0E3;^DSjb znvpTgilzZ{x1<4d-ONBRtqlV$qa)s!Tn^LB7g@JJUV=Pn`a6{x?Vn?YFdk;z&Wo?m z)1}ln1pROh@iATL&-BBH=kY_|^sNlkoww$oyGN<91;GnTsi()$;afDkhb6@Cfw`vc zDK+-u_x7Sg=sxBXLJv%Ud2lsM=FQA3;@tgtl`q$9z?+Z- z&^3UJ&47Unyn>El+;*1o0Xl}sgV+lES#TlDftmRIURDgo@S5LRQ-|AO#*k7YANrF> zWF;#F6JXXz`h$5Rd6jE51^H2C4l|N@1rNF(XD@fKq@#JcQDp{W*c#}1f&pRjSYE?J z_l{!#>KSmU89$z-&7k9nOoV#IWcK)N`kPv6jDzwt+M&n5Suoj0VFQBqSylk%E@Xx~ z>0l9ln6-pA=%Dv`_B;#!ic%vL=Bgw@2ks1JZgvFoVHzxj>2OOHiLc`7c!7B6hIz06 zzx)zg_72y-C$rQ@r;xsdy@eTXu~cT@HZp{1Z!;5^@eV5k{jlaL5`)q2689dYp1YR> zHS~Q<0Or9olkc;_Q2u~~pbMtzObBLcT>mlIoN64d{k&BR-MnDt-o@TlFEdhLUavAE z8>T-{X0+YSOdsMUB$zjxxYZ<*#A{v9^C)jlLDwi=P?<>de~A7; znXwk;!M)I*UFI{6P)Og;7MKDogmO-q;rWQfU@9#5xXj3c8K0s<_h)5Bw;Vb=$d?e%FTU}|;^9?%8`-VL#r6B*S%oy+~d-WqTHF>(s z$bs&B-hezn!{2BKGtMz{vwn%g_!%?3Oajnd$V_1xuYkoJ+p^d%&J#zWJ7<0a-;4c28`vk9q8fRq%F`3vtcsKHFcN| z{je0~z`9>BFz+-CfLU-B^zz=*UYHE?zvTM&^TJc?VV0N|rKZF5d&-UNW}TOxj+hO5 zlOTb4eV7?ckEbKE4tK!3DD&&H#WdLxEIO~GLY$qc`)Xoa-$G>VYjb{gI<`N$kM_bnEEyG!)OoF zU_>tM9wrWEz|>qH4M&t4Svb-jDK}2SoTPH2$v0#O+e3L|x#59sm=amkJI6| zY#H>ztTC*JS%-(9>xpus0Or7$?-+0_D+hC7CiIVEJfA6y=l!%}2yg%_fXOgz5*@(| zcoODJW~+|Va0+oSomac&z_h8H39~+py@&FXtmOC9VFHw=mm3RB&S0V@ee6BVg}%B! zuq5-#jp5L7im<8?P(TJO)BHq7ZG&HNhf6Q_k zHbCp}RYYSc_ZRKHuOb@pe@7cbmH+qC{I4RKNhf~OUjHhhMT1)1|4(7x0~b}5zCSa9 z&M_niPzFH;L&tnb_q^vl|Ia;h?~K_ra-`c3Yq8m6 z@<%E*?m_L)32wr}auWf&c-5IqbKINEgT|WOtx_cmYHepJ_*3gxe9czUr`ABTl~%JT zqwNru)?ewhPpy6d8}XpqGf*}qxW`#`aB}o1Tp<>dDU#YhwT|$M=~D%WclWpr8g|fW z$hYY~bX|)z7%oq3v5vO%{6@=KklhyA+Jb_F&|U~zwx!3Jgaoi3X-ROmvTb|;tf`!u zTdX7SWoQsyqY{8LLDR;XDsV~D;YF*3{62%-YKs5NI>OdDsK+^xRTA9otKkh-N-dI` zDDN{A&x1->qL+9T26x!%tIP>BEiLE$|dvXpbvnyGYylsD>@%^21S8h zU3N{6bH1b_ElKWHZsbbPO~CbrWqANzY=o&C{O$6mS~izrS>{KDFZ-cg0agWK0OK?S;%wM45tYrJbI?imTc*Ja>!+M;P zl=3~Q1hr7MQy$YX?!PxeoZbi>pmV7Lw57+54t;?d&Y*Tg!wR82jEy01SyKjM5CP*# z=D@XwA9pcrp`ccHvX6z=)KVZ#(7KIP65KN^snX{v;J(-5;RlIFKCIfT5qKPJZM6pa zHF@->xib4e_ju5uR`k(5o_MB#lcV|OBRL0lB6^6)R7~A)!nO}8V>Ckk$90|sx`BdD zp-vkpp2Zf*JOz)-Xg$Y5@qMN|61?fqDeEW;Qwrn!Z=ry+1%CqNTD^EApBNkON%qDJ>PQ<>(8C0X``(xKdIQb9+xf*vkuyI#$W zpxc0JZH@Y!tE%QSa9`SW8q-N^NRKl>CW~AGn!AC=HOPccaHdSVF^$G^C^`;wG+kmk zd;mIEqw~JDdQsfhR+osPG5t-jGv&}J0FFMX1&VAe4odYXT5Eng6L(uZH9U$)zYpvZYQXkPOOXWQjytfTU0fBZ(4m zK~`~e1c2Qa~HDI$4aM zls2nNK;MKO=QK8mK5;kqP&@hqqP0-R49DsTv;*q4*zl_zG-2kCro*h2NT(noa-el( zQzk5-z*4LO009&Y{9iANp zoz655oW*hx@kaSQsJY$hWl5e$qrSBcADjTFN&fAcfxpwp{H=9_>qh+9%71!M^0!v2 zEj_Zwd8f3NVp$;vS2c8MX${nEZc$g$ZJ@JgFVnG;dz`am>fCi|jCp{rq!Ztwtl9MA zw;0F!NPGv8NMR6`&OmZ}hgmY4Rx@g)?JUY@ztlO#I<3L<6YCr$(E&1>!dUoH5{oig z4Poh=L{D}=r;zqDYNcZxm{$7WutRzjXPFI`5O~ZaU?z?v^Y?H%22N`e2Kq}HG~h1| z%e3M0z11rqXIhW*9!|y+@2%WPQZx&dno1^HD2wUeIXHtB(8W{&8eZ@J-Z~mn^a&P` z)crj+Z!t6R)|E6HX;~yIIv)wkDeC`t<(x*2|HBq2f!6#V5;af>iz0dl!shF^dex2g z;lbODv_4Bf`>|;Rb|nK;76trZ9WlHL)O3xI-K+>ytAiXrU@=Ud+v9wUIi6QH$*STR zxDh%HwDkvTU}{%#kMod9&ehZdYR|m>m>cRcaejZy4(!|&7<&~BYzuY6D_iSAJd(&} zIp>A4F0w$|DX0_m7emuK(R*TPQKxlum=zCB^KOL$`_KeM7X#J-%tRHPR4!DU|smwmxN`xH36tUW2MMU>(4!sp3a;x_VIWv2KF<7PIADtufde zZ~TXW{UfR)pUy%I_r1HviB(JstdW8LTC!=>PuTf~()6FKBf~bXRvQn{oOcye3a`L8 zSp)tnrA<&rb?^E~8)OGrl+h`Ouzh*`TQmh5>a+*?V_Ce(rl5aWy?m-3yi9Sii$E=* zq<_KSQCiI+hPJcVNBbe7T6gp~$3qY0wcmx(a_xnn4|ffK#{#!fJF;<2!=Knbok1tb zX5r;p00jGaM(|@5KxWqhX?v>2xm=phuwZrPS~w0o^ywbwY{n57YXg>Lz|H|Hry7{D zod%^wNG^{M_R@}7JB_|ZhPLCySJNq=6KL33(DfyFj+JxbiDacry#=&4&0;#|nXBn) z(2cZ)>GaYb=MOSM z5W2+HlgoOXQIgKcQT3k-I-eqbX5TLxAq4$uKbNbQCD zEo>{>%!976aBt>5=YkDGF&+6CeXf?ihUV1cZ}vE!WJA0Gwcy?af3o2;Xg0myE4> zUog3*(>oBB&c*cQFPM3;v-<_h%DHqJ)ny%JIk%E-=mOk8nO#t>q9<6y(0&NZxdJ-L zWHohnp;JeaXE%hMqPn$7dl7`C^Hti=Z4D0M=dSO-Cc)+5a(1@db@9m^3ItAv zIhBdpS@@IduY3#KK;wVK;%23!U#)Yo4(tRP*7~{XGDykY*CPo10S_T#~*ln7dtjz%8=<|!drrNG*N4KquSU5^2F`V9T&oOM*d>9ak~7n$OFBa9}# zH{xvap@TdB^XTv1H19n84F5$fBB-Ve7c`$ zX#I4-9->W0OuKboJ*TFC4xwTH;ZX@XMy1yGzFIXx1v4mAZ2O>c<*?@psRdn5dH=C` z&DsN6-|aGW8dRA9>jGAK1;#nJ;C>q89y#D!uaS|LYc!B9?azQ@{Mk7`zFELiDCmOK zD#T(r!2Au%>N`ESW#Ze}b*kTPy*o`L8=#Ljr&~VUN3u6Mq7Eh~a(^#etGo5^{ ze}>$ck)RXk>;-i8>;dR3(AeSkpslgP?}3p$1}%1>8d@&2hUq@gMi<&NdN0%d=YK!R zh~t9}cEMwucI$&Ye0(qTIC0OS1vVT9%9}1BWs*OrOeWCBEI1S3mdXX45ByHX5!hM* zuqI$%Fn~$aV)+O1k@IgkxKdi)3rDJYdYlogf@8OAM*nxbgm?-Ku^h>wFz0MNEkU@r}NY->Y=u+T% z|AwJaNC%-2k!g3I10uPN7Fc^`1U9Wz}7sqQVS4kY`eBkeB9>|(Z1BRX2B|ew-qKTKR zem;fXz0S9;P$}1}E{95(?{Iv#x1!i$6R28X$F9ISfT5}`S-pn)`{FUyD=fKT((Li2 zzabaf8NXiV&CKE6;!!xr4G;$&8z1Ck>m1qZ%#(Bq&((JPoe#@#6!l*$zk6sAix^tZ z0(-6hqC1w-VUF3UonxqUr&etNEU@K1BNTV1DeHD z0TtBeVHTY%Mo^boxCHDOrA8o+A#C&b(2!H5MQZ)W0(Ep{3mlB5c^t!s4-gR>gL?HH zeu}=sZ$lcFG5Dr<_5y+ZJO>O%_!jtCM#qrSZ{xUL=LV)ZM~pDmii?7u}XxUMt5LtsLA`{4(zriW&r0?36l4ctxa#_x79n>Yhq{wpMeWNW6^d&I_$|= z_|kfah|^PkpObR+IjIZES*BsIIx z>kzhmH{$gPPR0$Z&f`O-B2Mjt(QG(d8Uj&_pU)5@!uBOyo{_l*ilJBw%##fuFjff+ zHy1;Mm#rSu6O60Fb@q&3IL2-T)@;d+UVV2Pr|)h}*K^ApW_ly&(K2-;PVlsHMS?D+ zv!Da^fZii%94!zOWYPJ>WE{9ywUII1iX!?a<56^}skH=GL^ZSuXboueuudH&ugvDdAC5tL?r^PflnNS;8V2ESR_&} zgyo!_Mhz8yn6{=5MX8Et(NGZ>kQ37Dd>jc~{`yDR#8^ADjv%eEW&ynpO-si_Iyn?` zq&J-%3ai!Rd5uO!usDieG69HFylaquE$u)opb4IK!Z!LR?sD6HZvhXi^Qfh3P}bA8 z^v6rq6+f7oaiGpMZgY*t@VK$cF7Q z;|H3#zPMBgu{>bR?qWoI>)luH4D&&E0q3Qb16NKVu;f*0^dQa|?g6%rmbzmph|TVG z-T;XGS&wX(ZUTMo33|#MT?B_!P_u<^>vduZWi|U6sIfElS=>**hBLO)PvRvRNoxnj zOs9axeb=>^IK%&VdE7I_Z=1&e#B^8b!^eZm3u~c96RV3K&XZ9%7_V z&Qo~1hEpJDRRm4k*n^6w0>w4Sp6Z`cHi51L9?3WYC*fDr8>j+FEFDkN`yOKW@Y7HC zIxXCe2&@u*BhH?S=_h1t^DpUdmP?oc9$m~6RT>UDh|{6Q`D0C{i$N#QJkZ#s-Q_99 znL}s?i&%Qc6Jrjab+SmHODsGn=sFnkEyde5(om!YA0cTK9mhQ`^*VI_NXlbTP9@i& z|0U4tEDq2y7WMQ!xPYq4Ugzf)n3&_*5HHXvq;Y3_AymnL&9xX0mU z%EIosnu2_wTuQTiVA<`9{tnrpRSnCPw8jS$YTF0&jE@LLtGwd_)5-K1iy}G?5|wEi zjy5W%_~F7UzUox3(}(jz;9gagfVIPbH2`Y_=A~(&%^_RxUlXuAiV70L>4SU47-||W ztf=IY;o?TY{Ud8OkDs6sSbo=ispd(*oJ}#P0$^8WT?wq1GDlz?D!M`)qu<2e5l{x~ zc{<`JeCWOh#WnQ$2rPX)S17Vw`z=^7zUuw`OpCE-V0c~!c4xU6sB}%ukhO3_fIu!RBE?5xbZPyc3|fWSTwLM1C|Kv z3^0A*vp4C$It>_qUqA;iSCdJbyEV590JcdG$z)N=faQFH-(z9`(*+x>0+tO7HL3-k zy&8a3(k7dj>)HeA9d6UH^lzJ(>a(P+*QsUshg<{L+8v6&NQ^16E9){z%>g>Mfc5LVskB6Fb0I;rIHBajr#YdYvyz_6M-GF2r@? zT;%MzsB2)aQTt@!PqPCA_N$Z^0GI23R!afY?6^)t^(gHM5Tkuu@D3u6NDl0xcQPb3 zBbBQ^s3Mu+kWs>h@&}C)b1`7ojDlBLv;#5Mecipzty1Z?Q6kLs4C0T;_?$qL0kdBq z5;f9c2%jFjxM=6B5V-Ie^U=8}zz%yMGz-FqUuk4NIB=bn^! za~XQk`35KsTr*j~u=0cmudw8`7xV|I>`WDbS_gH(x(H}XQ#r7FS{@>9^$EdCl{|}a zh{5Hukn8qHh?vRs0b%K!LNmsQ`Igq}=}AZw`_ve5tEFcSjUOwe#CY=- zsz4N*+!HL2hRN7@ba9**JGk^V7@kK9LZOJ&E)*I)EXGk&sBp0q-Aa#!im|Tzo;{vQ z2?O0o5iFL_Qiws}c^7EzI5B3(IcPK?a(kEv5_Y(2U%~_a>oBw%M)r7ds~KCO@nV&0 zC|Q=m!lCHE;=1*PGBq=7(TzBh$-OA zk&DhGMMZ;32Ng=TNt(gbNhl0jV-hb^cyBBo3fxUMs%@jk3Owyi+EHqP1xwINHKY^e;i(@JnSgm@lw0{6fR*(2D)*^WsE14 zEMQoqC&ODz*^{yNEWPJ~6FWODQydq*78-WSn~cI+X+IQwtoTKdaMnQJp<&PDz4h0V zF*KHtZHk!Y+P3*@U| zV!W&G2IN4^Q_+vEor5O5E?NYS=mR)NCE#rNHT9kizmYRUMA61*VYT@`a#@2bnqOG= z1r|a`?b=2sr;1x#J+in7w@wvvL^}Q~+m2sXkzL&x zjjn$4^&-eM{7JlSMm6~uW5w5t5Lf@A-<}tNR>79XnLnFHC;Ij}_Nr4>N2Q=KidccnK0393pY?JLi~5 zW{D{g;s3x-xiF3r@F#+7$drTZfM3UdBe386R(c9G&(ih)0XIPGqt!RSYkbUk1D3rk zI&lNGNm(@PMn1wgMH6onx8R4ae z6_2T?ehj{HT@HYi@nW`X&dLkU3$%9z8l*8^_+vI~kB7Y~8gmoeEvM9*P(n;&H=$j! zY1d8IIwjy;#8GTo?L)ouwEDRT){8*>Qw^`1L=w78(#=>6Lg@9Iv1iIYhMxtItXG1V zZD~D5%M!%+A$_0Y9m2sTdULS|p*Iu682ps#X9=jLDmtHldd8jfY;-()roy6(cFjg# zaih;>W1OFPm&V>AW|*rf^A>ozg-Tdd(-DYknhy3lKZ2t!cP^lR*kC+xj+lYAoQ_z6=c|DGzzUzkK*iDDHBUXlnq9&`l4(sYD=O++SH6p@5l_NGlqaI2VVlAwdF zP!jyX-L*sG);PpM_;G||9^^S!YnDtFkyJAmoEy0&Lxj>&7O0zK>_A#0>8E6IH&Ud| z1G=8NCVd;*q&XesSwVW(~u7%iz{4o1?BROErlI~8CxMJ+%Kk9;mb z*KD983jh|8&q9FdbQg;%dS{{7ZE3rW7Nm(~DBJ64P{jv`X{go?JfX2j+yHZ%79rYl z2c2Am4GH!ti_k6h(3soA%%NTP|EBd(m#1msZDPF8WL8k5-6jmXO|y9^Yoh-PO3Tt~ZD;Gh%Y zny%RwoI%(JyIeDyUd+S#mU{;_K6_~A9Vi~|{qNAqbN&vo(9&}&IqnoUp|W<|DHfwV z-`^?jMV+N)fjqs3Ude)AWz?I6EPW~IF6cB+#a(E%S~_tT%8che?}oW`lytY4V(BIzPL`351D#e}dVS3|k+#uVj{cbVB^(bD`B)JptSS7p%#WwWu=5mZ{ z=}tZgNnM3J@YvfbY#NT^1H|QB~#H!evm--}>ku<3vyZTlXgT{|$a( zhE3ez?vVl!3KK>2eKzXcO4CoSiiGERi)hY4igjem5p!*)J1=YSVpk81PGDYg|1&ERo1*$0VI5Nc6FSH>n545X zkN%P)#tbexkL76a@0-?ZDQ=C3!z8zL4Z2r39a)3Ei>|Xqc#S`P2|wh+P9ShWllNdN z_Fw#}jE2Z%HUn74e`(Zx7{Ui=^?iK9WTG$c6F0c}@5SzvPThy0hG*dK7dN}Mx!@-X z`*A*2ORwKA77tDye90L&i0;c3H&9}(u)A6X-VUXp`_NA&=3>iOl`CRgj}N`% zd{N!t=ivrFl7jLuFe+&|gvIJcZ{&;d)R>3#8}Z{0&nwjjgbg1sQ1Am7U{&8Qa2XJl^_Yh`*aJuUu?1r-NgAC(Tb>YO$)bS_o zUKJ0CIkuSCOTV`=Yj6!GRBA1~7CW_#I-TUs-$`i70aZw0YmxU+TE7;RiqDSMig82E z;PvWnT~rfa`!MbyiyU~zHONH2WTOHz9u}dPQno*g)dnA!Ka5kjBD_d_WiO3=1*U=d zvKt8ONeZx1V0u4fEDKmU1+9a3RiN~H6y7Wqfy$<&b-0xUB`25;V3AY-%%^lJzH1(8 z`sO3#Ro>dP!xE;#^Xs%lA#A;v>ADB6X1^ehgq~QBlMEA80Os{^J&s-dH(Zh*CF6ks zHplgn0#o=vb_41KpZjh=C(ft68!#svr_VNsg<(rzQQsGGnl1ZL5MWnUKq)Xxg^$1; z49Q0@BgRn)3vW972x{7c%p1j&S>br^`^x$#dJP>Mm>D%f~8ssF{ydI9Ukp$T8|R@*Wazm0!y$2uvk|3I#SwdCaYp0W6vV zHsJ)eEb7AVpVhK@F{nylBk?!q!V^d(Fb~Sygyo>H06)UQH+HyZ8IRkO%1y#PD;fGz zrG6ya@UOyj0_4q${ulU^tX`6n!e^iA(w`Nt${Ns6wbeAk}l(EPsW? zIbhlpt+t`1z)X}16E?Rg7n~n(A^9O$2==@IbS-Uq6rLv|hns(&-`wegM{%N+LhX-Y zdBzrRvzTjXEu;;bg`cbc_DfC&WnxE8Rhx0Y5=y5wqcw5vwFR9CC+}NO&-H)2)NdNE zdIKl#!1Pa~d0uS*)<~PSXm=0CwqR3?oVH?9ysj8u4IpQzm$r%-KIfjfoRII?qO0*A zb#KK3a-|ok;ldmend;g>zK=>D6S}&mG1z0tb>7fE_i2I(W zR|>EnY@p@>G1I4Z;)Q-E(^+rx+!XW#T62$qDgxDtFE6;VHTlae3JiL+z|hlSA}j|K ze*}s?7{`r&8dMoD-2~4XUBK`p=MyM-BAt4ISMW;wE)Azb;8a<)JW&Mwf$xDpE#&EX zINkaO5#`#n|B`bE$F)-@-q<()0hQDf(f<}X&-iqWI`@YM@~hXX$O9ONRO zS7ViYsC2zgledfD&9G=k8EuQfrm1<#-b14zq;=2Vp4cr%DW=NvU%_U?M~Np4G0cAGmgOJ zsc^}no>g403J;CjjI1uRp$7ejvo9>Q7*k2y7tyHsE6i(9ZxCh-<<@S!di#9Bx!`wHTP< zR9qvG|Nm6@Uj~eh;tb3bfy;=m0_HjZo(+uG8jnF(tg8+Q|FDKDT>_)WaZ;>>Nc_*s zXajX0!l=}QmyaFD(nGSa!T6g49#wh|%f8XTY*52AI&&bJ+l5QpKqUjwX`pNxePked zF(~eaaBCns7ZmsX1`4XzoQLpo<(6uoREcc8jNnf$U=1TY;c0(fU7!L`GS7A-xT?HG zpk;wP4{P=yyj*#(Hc&i}s}j5hif;=WC~qM8bx>{^T_No?vpwk_{=C{AAGk>W%XReZ39a&D;~z}!m;W(PPNR&f^@H61aSF=o%--jE1gG&Rg!)ig^% z^Q?&Tr-A6jpk-BhHVlxOjdRb>qWA_8I5Id~7U@>yn~O5OCEWUKwK0qbE zDMF^3qVR`QoI3@FLTcvR3l%(9qNcejc^R3Hpr$$}N-JF194@N3zOoFPBzbOJ4rPi@ zkx|osQS&^(&!WsDVzKQxrM^Vbv6#cz^mEjV+-#;uX>F;ZCxM1Prln;55cETe*0!gB z-+*zfRHpYS>O(OnEO4?+Jzk|wQSnq2=hu z2`+*W=WQ(3BYa`A`7dI`vXJRA**riT_#;m?X~aiih2Xi*eTLNMQNzJk#S>-J^cLiB z4W|eGB5oU`+S?X3Q>N2Pxek4O9P}2FxlxcUW3i-HDl;!Zavgm@HI2A$YN75%F>Uj> zB~nW-<2R@pUc-&}Pr$jhjrd=%O7Lto5FRuDUI%@~*UEf{Y88sOseo!eLd*6lf95lW zFcTw@>%5oR2cnZe2WYhC#{;B(3Ur)C#}7n*2%4AVUdjUj18COHg-^ zMZEViS%?gzGiHBu5d9`~d1C>&>&PZa~vU!z`lJmypLK=ep8T=U8Nw*g#B2F>FmpP~k$Ghv+b&Y(=Djl*ID z3N}fjOPHR&TvlH)APyObhCt$3D5jrRbf`v}Odla{p0=K+Zl=WwnOdJo{)x)RKhQyc z2fb9$VJdY1YK=$iV|A&27i3N{4x%~WIddbfPdM?JGP|+LUKaA=%}zW;oj`U*`g@q0 z40;u1f}XxgrRKSb18&buyhc2u@Rw^CX;|t6*+P4r%BzY&w(TL5DrA=pc=ha}@unH>ZM4cnayH zs7o@!kK8RY2KCn zJj6{y(doGCMnl8@2fhV34`!qOR^U9WjQDfFd9vw`-)k~GH6Ve9wf~2q#{Z#z_M{CH0^paP6n=PsFO#53KIr!=F%bOn+MVqahxr z%%Ov7!8jgwD}BAA614c9V>cc76dl4y?^bk!O7@Uu)MT1^k93O{I1cxzxV{N}T*Y|@ z!NJIvD4x42hZkg=7Pkmb&vzBcQznN_THhkxToA`g0)qS>+pT-$UwR&yDvmy;1>^L2 zr{eV;PVl|7;WP1Zs2zhjCq2 zl1Th*%+5Gx8Tr?g9dsluyshGT3qOCKbce?$hbkGTIbR4*+et-El$X&;C`92zcM;s#d+oAP>72=#C-B>6(g1! z=?YMs^jDRPCms&JsklC;4$qa@=w@fAIFDxzc!CM$!&WPprv(m;%8Xw0N?_dGo}nX9 zw>_iO^>OEo`jvDy=%fRRUd*NtuFaE9jFwT;5lCJ!Co4Qb;jgKz(68B)2Xqhx%rtIv-T9^+`&dS0WBP4RM&S z@Hj1Y^~U2V#V=C4(f*%McijEl@-=rhYZb}5HVJ5ZDUKWa_9DgeZkxkA)nJ0)`!zD3FN3b$rSeLp3~DLGY1hmyA`nW^MjCI6`8^HOd$?Nh*e zO13L$yGv#?S;-_N7b&?y$ztVTwu*07vP{WWlzdysP}MvBs>Sa#nZ8v-xiZwH;)C@~ zrjlcoj8!s8$uuRuQ~mvnlIN9llIK4~;N~$8%JNK9GDgXpluTCgHYGEZyhq6kO6Dv1 zsFHo;nzfWqDu zA7`~AHJ&zr@Nx~(5YILsn<=bK`~bqU9o8ea$mIH|iGD+dn-!)rw@O-{^LeE3Y>-KL z1JQSb;uRReEKSCEM>xPvE}@N!Mm5c9VKB*+KFQ*kCm4Mf+1;^iijG6$lc z1eK)GC7_WVgqJI?a+!2wpahSB;$3zobq_>u1I63C-4yg4oZYSJMsFB4%=b;ZDRm%v zE+}`6-Z~J?&hm1(n`#E4qtNQSJnp7;&`Ym>OtuTpZX80CFX&lXxL@(XDqf=E+;KP< zeNTsZUNhi(#{fkeg>4K^jJs*;Ks0|bu&kJxf#?>jX1uq9?@Z5rT>8!%9}aim;;qSS z^86mNuHK=U;$T!?2v^ycmsOEMRnfzhJgV@Ql>Eq`_l}BJE7{PW-)wqK0f&@~REDFK zJl;QnNq68?h1V(Bsz&AsgZ}F(ept!BE7?}S^@7o*Z~yx6g@RZFm;6E27cX=i)~L8X zWKW>>c`IE{c~H02E1I{)9NauN@Zw-OV(Q8Brvc~(VJ}om9X}BL1ZbYo(c%NquY%@T6D|Ie z*cLXSOjeIR_G49C?`Euu6!@0E)PKR3{fgF)D%PX_*g+qmt)N#Y?v~c{Em(ny>o*ts zVT!H&UE%s&l%5Wh7L4)bd!${AZY?Y)^BFw!P)1Q_#E7Ue#p*|JeDA@zTvEB%wKOKv zJ4)|5ivI;=@!uc=ZnR9t9ueAg~Xd#Kd0I<4ZrtE;%t=hPw}E zp<*9Z`g*xHt2icREj+2>V^us()sw6Ze15BVc*|j#>HlZ&U6nv@Iivn@#p@%Czr2oj zDL;_83;pc}MUT<4lTT}K8x~R&(}k}{$G8bNq~qe8@CpNHbM?0MT>{roT-V@o!!-<- zJFaVSdEoNIbsa7*T;8~Ra1F;b0+%l?8!kUwBXRlT3cxiAS0FAst{_~&xJKg&!8Hcg zSX|?9h2jdsH6GUlT;aGPa81ND30EYpC|r|qO~Dn7YbvhmaZSS&gKIjj8MtQRip4bx z*A2LC#1)4t9@kB{ZpM{>Yc{T1aLvJ$Shv0_>DCv`RdvUnb}Y7-n<(fR$0Tz{UFtKA zRc3Qv-N9!eE!JHWywmX%-sY&;33>^&?{qwk=iBn0LkthbvM8cv7W>FdjuE!TUHWpw zwT{muwC?I-YNIHER$pBvIfj@mzR%M=WsVgve5}kd2ZlX&IX-~l=3S15&4qPI&$Ab0 zbv3&kWHwjUCGB-gGvk5ftuG*p$ld+3I5~?m^1(!2!}Jyd{U1f|qju0(>3d&59<7x3 zB1B)^k1smDF)!rZ zPguYo4|$?=6)!tR_%$t;olajqr-5eA++L{rQBlCX899z+g{WJVo(fcTKKiq4f5@`AL7_Jr+|BD?NX6*>T(jBkG(HBm_MZ=gq=rsg+bv5S6u!!gOv<)!|X&a9S} zykDZpZ*oosKKCBU$I|*Y9Z%cR40KeEq_Zig8d+|nt<|X6QiE2@8mV=F+NkH4bm*3gEi>Pm1KSkAfAR|(L$LldZ+{<%D=L| zp+kAfbpw7<;px=P$wFW5pKRU(GFgHF&s2CirM`_a<{IdmAC$>zspf6?dz_BFjS4{- zYtao&uh6nu$1PEzuk_C=aIH*qz<@_9yoZ`=k(d9g{ge4WER#i3)H@iJi3a)>MHf)! zJE)#ADq*pYj=X~!JV4@I#F}XOyN(ZRUHki6{_+uNxsp8VU^%?1Kkc$n(s> zYB=KXpso)cR-`o_0gjhAk2roo+L{kxsZrB1w^2J{7MCKr_@Uz!i@k_m`inL}n;W5& zK(K{CYBDwvsju7eY$@(uPVIUfFFBW>iZYdf|FPa zbE*9#nyH|;e{$Vy6~+Gpy|TqXcN~ybIw%ixQjdXNq57FyNq?&sR5E`9KJ=h87emdQ zTcUvuP;@$(n?UCp=txCxq^Ksx9E<%BZD?{##Dc!R32lR~S%9!rtEW4II46W{hxmUV z6SfM?m@fREp#{y3iBTT!4Pjh6aArC6J=LofZetK(CU8!kOf^W3yxNhIR= zf0b&{wEq;Q@I(Wx&!1@&^d&OMjgg&4@0U?(3s+33U!tBe45|017AT||q{i;?*q4~M z+GzV%n6S$6Gd~#2Ze{%)T6+oy}6UlS()mqgJq(x@P}*Ke+rqXPpzb delta 64006 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�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 /etc/supervisord.conf - - init_port=8187 - for i in $(seq 1 "$PROCESS_NUMBER"); do - init_port=$((init_port + 1)) - - MASTER_PROCESS=false - if [ "$init_port" -eq "8188" ]; then - MASTER_PROCESS=true + if [ "$WORKFLOW_NAME" = "default" ]; then + if [ ! -f "/container/$WORKFLOW_NAME.tar" ]; then + start_at=$(date +%s) + s5cmd cp "s3://aws-gcr-solutions-$AWS_REGION/stable-diffusion-aws-extension-github-mainline/$ESD_VERSION/$SERVICE_TYPE.tar" "/container/$WORKFLOW_NAME.tar" + end_at=$(date +%s) + export DOWNLOAD_FILE_SECONDS=$((end_at-start_at)) fi - PROGRAM_NAME="comfy_$init_port" + start_at=$(date +%s) + tar --overwrite -xf "/container/$WORKFLOW_NAME.tar" -C "$WORKFLOW_DIR" + end_at=$(date +%s) + export DECOMPRESS_SECONDS=$((end_at-start_at)) - # shellcheck disable=SC2129 - echo "[program:$PROGRAM_NAME]" >> /etc/supervisord.conf - echo "command=/home/ubuntu/ComfyUI/venv/bin/python3 main.py --listen 0.0.0.0 --port $init_port --cuda-malloc --output-directory /home/ubuntu/ComfyUI/output/$init_port --temp-directory /home/ubuntu/ComfyUI/temp/$init_port" >> /etc/supervisord.conf - echo "startretries=3" >> /etc/supervisord.conf - echo "stdout_logfile=/home/ubuntu/ComfyUI/$PROGRAM_NAME.log" >> /etc/supervisord.conf - echo "stderr_logfile=/home/ubuntu/ComfyUI/$PROGRAM_NAME.log" >> /etc/supervisord.conf - echo "environment=MASTER_PROCESS=$MASTER_PROCESS,PROGRAM_NAME=$PROGRAM_NAME" >> /etc/supervisord.conf - echo "" >> /etc/supervisord.conf - done + cd "$WORKFLOW_DIR/ComfyUI" + mkdir -p models/vae/ + wget --quiet -O models/vae/vae-ft-mse-840000-ema-pruned.safetensors "https://huggingface.co/stabilityai/sd-vae-ft-mse-original/resolve/main/vae-ft-mse-840000-ema-pruned.safetensors" + mkdir -p models/checkpoints/ + wget --quiet -O models/checkpoints/majicmixRealistic_v7.safetensors "https://huggingface.co/GreenGrape/231209/resolve/045ebfc504c47ba8ccc424f1869c65a223d1f5cc/majicmixRealistic_v7.safetensors" + mkdir -p models/animatediff_models/ + wget --quiet -O models/animatediff_models/mm_sd_v15_v2.ckpt "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15_v2.ckpt" + wget --quiet -O models/checkpoints/v1-5-pruned-emaonly.ckpt "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt" + else + start_at=$(date +%s) + s5cmd --log=error sync "s3://$COMFY_BUCKET_NAME/comfy/workflows/$WORKFLOW_NAME/*" "$WORKFLOW_DIR/" + end_at=$(date +%s) + export DOWNLOAD_FILE_SECONDS=$((end_at-start_at)) + echo "download file: $DOWNLOAD_FILE_SECONDS seconds" + cd "$WORKFLOW_DIR/ComfyUI" + fi + fi - echo "---------------------------------------------------------------------------------" - cat /etc/supervisord.conf - echo "---------------------------------------------------------------------------------" + rm -rf /home/ubuntu/ComfyUI - supervisord -c /etc/supervisord.conf | grep -v 'uncaptured python exception' + ln -s "$WORKFLOW_DIR/ComfyUI" /home/ubuntu/ComfyUI + + cd /home/ubuntu/ComfyUI || exit 1 + + # if /comfy_proxy.py exists + if [ -f "/comfy_proxy.py" ]; then + cp /comfy_proxy.py /home/ubuntu/ComfyUI/custom_nodes/ + fi + + rm -rf web/extensions/ComfyLiterals + chmod -R +x venv + source venv/bin/activate + + chmod -R 777 /home/ubuntu/ComfyUI + + venv/bin/python3 main.py --listen 0.0.0.0 --port 8188 --cuda-malloc exit 1 -} +fi if [ -n "$WORKFLOW_NAME" ]; then cd /home/ubuntu || exit 1 @@ -410,114 +411,12 @@ if [ -n "$WORKFLOW_NAME" ]; then chmod -R +x venv source venv/bin/activate - # on EC2 - if [ -n "$ON_EC2" ]; then - ec2_start_process - exit 1 - fi - # on SageMaker python /metrics.py & python3 serve.py exit 1 fi -if [ -n "$ON_EC2" ]; then - set -euxo pipefail - - if [ "$SERVICE_TYPE" == "sd" ]; then - cd /home/ubuntu || exit 1 - - if [ -d "/home/ubuntu/stable-diffusion-webui/venv" ]; then - cd /home/ubuntu/stable-diffusion-webui || exit 1 - chmod -R +x venv - source venv/bin/activate - chmod -R 777 /home/ubuntu - python3 launch.py --enable-insecure-extension-access --skip-torch-cuda-test --no-half --listen --no-download-sd-model - exit 1 - fi - - echo "downloading comfy file $CACHE_PUBLIC_SD ..." - start_at=$(date +%s) - s5cmd cp "s3://$CACHE_PUBLIC_SD" /home/ubuntu/ - end_at=$(date +%s) - export DOWNLOAD_FILE_SECONDS=$((end_at-start_at)) - echo "download file: $DOWNLOAD_FILE_SECONDS seconds" - - echo "decompressing sd file..." - start_at=$(date +%s) - tar --overwrite -xf "$SERVICE_TYPE.tar" -C /home/ubuntu/ - end_at=$(date +%s) - export DECOMPRESS_SECONDS=$((end_at-start_at)) - echo "decompress file: $DECOMPRESS_SECONDS seconds" - - cd /home/ubuntu/stable-diffusion-webui/extensions || exit 1 - git clone https://github.com/zixaphir/Stable-Diffusion-Webui-Civitai-Helper.git - cd ../ - - export AWS_REGION=us-east-1 - wget https://raw.githubusercontent.com/awslabs/stable-diffusion-aws-extension/dev/workshop/sd_models.txt - s5cmd run sd_models.txt - - chmod -R +x venv - source venv/bin/activate - - chmod -R 777 /home/ubuntu/stable-diffusion-webui - python3 launch.py --enable-insecure-extension-access --skip-torch-cuda-test --no-half --listen --no-download-sd-model - else - cd /home/ubuntu || exit 1 - - if [ -d "/home/ubuntu/ComfyUI/venv" ]; then - cd /home/ubuntu/ComfyUI || exit 1 - rm -rf web/extensions/ComfyLiterals - chmod -R +x venv - source venv/bin/activate - ec2_start_process - exit 1 - fi - - echo "downloading comfy file $CACHE_PUBLIC_COMFY ..." - start_at=$(date +%s) - s5cmd cp "s3://$CACHE_PUBLIC_COMFY" /home/ubuntu/ - end_at=$(date +%s) - export DOWNLOAD_FILE_SECONDS=$((end_at-start_at)) - echo "download file: $DOWNLOAD_FILE_SECONDS seconds" - - echo "decompressing comfy file..." - start_at=$(date +%s) - tar --overwrite -xf "$SERVICE_TYPE.tar" -C /home/ubuntu/ - end_at=$(date +%s) - export DECOMPRESS_SECONDS=$((end_at-start_at)) - echo "decompress file: $DECOMPRESS_SECONDS seconds" - - cd /home/ubuntu/ComfyUI || exit 1 - rm -rf web/extensions/ComfyLiterals - chmod -R +x venv - source venv/bin/activate - - pip install dynamicprompts - pip install ultralytics - - mkdir -p models/vae/ - wget --quiet -O models/vae/vae-ft-mse-840000-ema-pruned.safetensors "https://huggingface.co/stabilityai/sd-vae-ft-mse-original/resolve/main/vae-ft-mse-840000-ema-pruned.safetensors" - - mkdir -p models/checkpoints/ - wget --quiet -O models/checkpoints/majicmixRealistic_v7.safetensors "https://huggingface.co/GreenGrape/231209/resolve/045ebfc504c47ba8ccc424f1869c65a223d1f5cc/majicmixRealistic_v7.safetensors" - - mkdir -p models/animatediff_models/ - wget --quiet -O models/animatediff_models/mm_sd_v15_v2.ckpt "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15_v2.ckpt" - - wget --quiet -O models/checkpoints/v1-5-pruned-emaonly.ckpt "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt" - - chmod -R 777 /home/ubuntu/ComfyUI - - ec2_start_process - fi - - exit 1 -fi - - if [ -f "/initiated_lock" ]; then echo "already initiated, start service directly..." if [ "$SERVICE_TYPE" == "sd" ]; then diff --git a/docker_start.sh b/docker_start.sh index fe858c7b..45df7174 100755 --- a/docker_start.sh +++ b/docker_start.sh @@ -6,13 +6,12 @@ if [ -f "/etc/environment" ]; then source /etc/environment fi -SERVICE_TYPE="comfy" - +export SERVICE_TYPE="comfy" export CONTAINER_NAME="esd_container" export ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text) export AWS_REGION=$(aws configure get region) -image="$ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$CONTAINER_NAME:latest" +export image="$ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$CONTAINER_NAME:latest" docker stop "$CONTAINER_NAME" || true docker rm "$CONTAINER_NAME" || true @@ -36,7 +35,7 @@ docker build -f Dockerfile \ image_hash=$(docker inspect "$image" | jq -r ".[0].Id") image_hash=${image_hash:7} -release_image="$ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$CONTAINER_NAME:$image_hash" +export release_image="$ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$CONTAINER_NAME:$image_hash" docker tag "$image" "$release_image" aws ecr get-login-password --region "$AWS_REGION" | docker login --username AWS --password-stdin "$ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com" @@ -58,29 +57,112 @@ fi total_memory=$(cat /proc/meminfo | grep 'MemTotal' | awk '{print $2}') total_memory_mb=$((total_memory / 1024)) echo "total_memory_mb: $total_memory_mb" -limit_memory_mb=$((total_memory_mb - 2048)) +export limit_memory_mb=$((total_memory_mb - 2048)) echo "limit_memory_mb: $limit_memory_mb" -# -v ./build_scripts/comfy/comfy_proxy.py:/home/ubuntu/ComfyUI/custom_nodes/comfy_proxy.py \ -docker run -v ~/.aws:/root/.aws \ - -v "$local_volume":/home/ubuntu \ - -v ./build_scripts/inference/start.sh:/start.sh \ - -v ./build_scripts/comfy/comfy_proxy.py:/home/ubuntu/ComfyUI/custom_nodes/comfy_proxy.py \ - --gpus all \ - -e "IMAGE_HASH=$release_image" \ - -e "ESD_VERSION=$ESD_VERSION" \ - -e "SERVICE_TYPE=$SERVICE_TYPE" \ - -e "ON_EC2=true" \ - -e "S3_BUCKET_NAME=$COMFY_BUCKET_NAME" \ - -e "AWS_REGION=$AWS_REGION" \ - -e "AWS_DEFAULT_REGION=$AWS_REGION" \ - -e "COMFY_API_URL=$COMFY_API_URL" \ - -e "COMFY_API_TOKEN=$COMFY_API_TOKEN" \ - -e "COMFY_ENDPOINT=$COMFY_ENDPOINT" \ - -e "COMFY_BUCKET_NAME=$COMFY_BUCKET_NAME" \ - -e "PROCESS_NUMBER=$PROCESS_NUMBER" \ - -e "WORKFLOW_NAME=$WORKFLOW_NAME" \ - --name "$CONTAINER_NAME" \ - -p 8188-8288:8188-8288 \ - --memory "${limit_memory_mb}mb" \ - "$image" +generate_process(){ + init_port=$1 + export PROGRAM_NAME="comfy_$init_port" + comfy_workflow_file="./container/$PROGRAM_NAME" + + WORKFLOW_NAME_TMP="" + + if [ -f "$comfy_workflow_file" ]; then + WORKFLOW_NAME_TMP=$(cat "$comfy_workflow_file") + fi + + if [ -z "$WORKFLOW_NAME_TMP" ]; then + WORKFLOW_NAME_TMP="$WORKFLOW_NAME" + fi + + if [ -z "$WORKFLOW_NAME_TMP" ]; then + WORKFLOW_NAME_TMP="default" + fi + + echo "$WORKFLOW_NAME_TMP" > "$comfy_workflow_file" + + export MASTER_PROCESS=false + if [ "$init_port" -eq "8188" ]; then + export MASTER_PROCESS=true + fi + + CONTAINER_PATH=$(realpath ./container) + START_SH=$(realpath ./build_scripts/inference/start.sh) + COMFY_PROXY=$(realpath ./build_scripts/comfy/comfy_proxy.py) + AWS_PATH=$(realpath ~/.aws) + START_HANDLER="#!/bin/bash +set -euxo pipefail +docker stop $PROGRAM_NAME || true +docker rm $PROGRAM_NAME || true +docker run -v $AWS_PATH:/root/.aws \\ + -v $CONTAINER_PATH:/container \\ + -v $START_SH:/start.sh \\ + -v $COMFY_PROXY:/comfy_proxy.py \\ + --gpus all \\ + -e IMAGE_HASH=$release_image \\ + -e SERVICE_TYPE=$SERVICE_TYPE \\ + -e ON_EC2=true \\ + -e S3_BUCKET_NAME=$COMFY_BUCKET_NAME \\ + -e AWS_REGION=$AWS_REGION \\ + -e AWS_DEFAULT_REGION=$AWS_REGION \\ + -e COMFY_API_URL=$COMFY_API_URL \\ + -e COMFY_API_TOKEN=$COMFY_API_TOKEN \\ + -e ESD_VERSION=$ESD_VERSION \\ + -e COMFY_ENDPOINT=$COMFY_ENDPOINT \\ + -e COMFY_BUCKET_NAME=$COMFY_BUCKET_NAME \\ + -e MASTER_PROCESS=$MASTER_PROCESS \\ + -e PROGRAM_NAME=$PROGRAM_NAME \\ + -e WORKFLOW_NAME_FILE=/container/$PROGRAM_NAME \\ + --name $PROGRAM_NAME \\ + -p $init_port:8188 \\ + --memory ${limit_memory_mb}mb \\ + $image +" + + echo "$START_HANDLER" > "./container/$PROGRAM_NAME.sh" + chmod +x "./container/$PROGRAM_NAME.sh" + + # shellcheck disable=SC2129 + echo "[program:$PROGRAM_NAME]" >> /tmp/supervisord.conf + echo "command=./container/$PROGRAM_NAME.sh" >> /tmp/supervisord.conf + echo "startretries=1" >> /tmp/supervisord.conf + echo "stdout_logfile=/dev/stdout" >> /tmp/supervisord.conf + echo "stderr_logfile=/dev/stderr" >> /tmp/supervisord.conf + echo "" >> /tmp/supervisord.conf +} + + +echo "---------------------------------------------------------------------------------" + +SUPERVISOR_CONF="[supervisord] +nodaemon=true +autostart=true +autorestart=true + +[inet_http_server] +port = 127.0.0.1:9001 + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +logfile=/dev/stdout +" + +echo "$SUPERVISOR_CONF" > /tmp/supervisord.conf + +init_port=8187 + +for i in $(seq 1 "$PROCESS_NUMBER"); do + init_port=$((init_port + 1)) + generate_process $init_port +done + +echo "---------------------------------------------------------------------------------" +cat /tmp/supervisord.conf +echo "---------------------------------------------------------------------------------" + +supervisorctl -c /tmp/supervisord.conf shutdown || true +sudo systemctl restart supervisor.service +supervisord -c /tmp/supervisord.conf | grep -v 'uncaptured python exception' +exit 1