From 9cc90ee3eb5206b701747a99fcaefa80bc0141bd Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Mon, 18 Nov 2024 16:50:34 -0500 Subject: [PATCH 01/10] Update UI screenshot in README (#5666) * Update UI ScreenShot in README * Remove legacy UI screenshot file * nit * nit --- README.md | 2 +- comfyui_screenshot.png | Bin 118577 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 comfyui_screenshot.png diff --git a/README.md b/README.md index 7476b578..714a1d9b 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ [github-downloads-latest-shield]: https://img.shields.io/github/downloads/comfyanonymous/ComfyUI/latest/total?style=flat&label=downloads%40latest [github-downloads-link]: https://github.com/comfyanonymous/ComfyUI/releases -![ComfyUI Screenshot](comfyui_screenshot.png) +![ComfyUI Screenshot](https://github.com/user-attachments/assets/7ccaf2c1-9b72-41ae-9a89-5688c94b7abe) This ui will let you design and execute advanced stable diffusion pipelines using a graph/nodes/flowchart based interface. For some workflow examples and see what ComfyUI can do you can check out: diff --git a/comfyui_screenshot.png b/comfyui_screenshot.png deleted file mode 100644 index 73272eae69339f92c88422c45ad166cbc5900adf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118577 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 za)�WN!w(zu`1bvFks@Dt+y~-#JyukuT{BX+w`IYHZnarGCeA&!{&&<14+OpMc+$ zEQfz>5B>H1nW;V3KYDdZ6?F{T6||VOqYphkbz3PiCSj?K3o|n_VfIbPX5lASJC3F; znj0QCl#1r0u2Z5s=BEI;MD>6@Gv1(?xmmZbXh+V_={C{mc?>k!L-)%q2LW7 zPMIRNC<4OWEm!w>a$MGQ8@*g4plu|7t3P&i_yZoN}#nlr_cP0{fxD5QwXaW zTfh*|^$+&pCg4`AWXp2`8yVsqf+WVzZvqy=^quB`>Z2-;j8F>cuUUSQ z6oZ9?4y$GcC!2rr9 zmTEx5-!8fScT{(g`WI^YSqx$sGLZ7yR|21pyTRxQmCohM#XB8$O*W2gyj5nEw`cPj z3#&i5z&cKZW+{f2y#eTo0YWT4wc4t9LX-OhbNr)6eIRMAy}thjP{zDrM#^n-hrHp= zJ)iVD?Pbu77x3Y4Z2NPpy0HFcC(qbx^|s4ojnk3t-6C^?n)KIB!&l7)vLAf&{%`?2 z(il{5`r^ny?=tj~A;Bk3Qi0IxR?qjw()S~m6txz7v_Dw5=1iX|w49RF$->5FvDh#)TehkE+Z ze-;b<*I=R)Ahhwwpiw(QMN<{V;x2X|W-{N6+io_=YXdlmsjo7TURK%YW=~{Ybn3m zEu@${7%59c91D1eLbR!l@yqSx`>#$|1}&JuTKdwv zJ`=d&=B*isM=bEH$6WX{d%-F@Xl|y~2p3$uUo*aI_aP%=zslE}g2Td$KGYT!rdf8> z#g(i5zVp3j%l+6<;cA{fJq5`)h5%aXYBZu<4f|z(R`FzTKyj8EpFcl4Xd(|+#v`h# zKWFBE+7TqfC^^^cYrq+h2xs~+z{U_w?_e!`X_u#lJ5VSa%zj}Zj0;d!V>am&6l9{O z9`A$flM*R;eMEK%sraxMtI=9Sh@j(OSbf@B>64qBj65v2MN^IWfM1oFaLsE0+Ktl$?D^Xu9X_;a59wXKr!PeX*TZPM=CCY7?liO+B7cr(Et6Yic0SXe?+~ z;PbxzW@3Eiipxhs+nLlZb3HEWYVDt}8h4Qt6B8S-@;GDCz?|Gx$3%B9b6#+}a#!>kY?`!y1j?9dBCNQP6pVt=$Tx!Y94c zr{5@sh#Jfja4o2nrAXc>rr_>@xtAqj>e-9&<&Pd+J$ZtbpMR}w!HtIr8y_Z2I><0wh-6>6EccRZ zTX;mCgm{{~OT+qAedakpmHUO+vLi%3|6vnzaAU&8$j=o^XwJp#AqGDJbb~7~d@x(E z(%_|~b>YIJs_wBVw`g~ihSBbo`%|q@mD6zdx8;elo#!0`;K1ism48iHWZwvof!4Vt zu>xjVd8Zyf5!!<_No2_y%m-a7&2lUrX1SxIZD$9TcY1wTbij!_;W9kp;-b>6_nf#t z9#4AFlVWcY04E;{xpR;@4eHS>&8yq7Dyv*I-7eDo*HsAcgcmsD8hpy7s- z94`We-KiK9896jQCFK_Z1~*Dh+BKU^vs$y0I;$`RzAw6*6I>0IEO1m|mue2${|AC+ zxySGo1*u^m1tX+o)R>70^c%l8&%+udr}Lu^aeUc)JGmLN!9 zusqiP$$;56;|l~~l~3R)yg4zW#Zg}?1!H7j@88z>+E!|spZ}+-a^*4QN?WOxrRN-* z-8#S5goMZm3%hFTIEhPYWoK_@SSI74mu6ozuX*ay@AKnbn{)9;&=sF(WS5_6K6UI2 zFcIMVu{#w}`KXeKOcrn*p)tkTBQ7BUE-*lHbatNIfgg+2Chy(ltm{bkV=;gn+*|2s zPpcosk}CVyO;y}2ehU-y=10hz79rSJWagG2h2 zr4Fab6%lS(!D*@2!i{qhP6??f9M07~DHO6fad(^5NSFPjt<;mj$-R!QoQd^DIjlA7 zZ_TBpx$0<7=H(2TTXx`C!sTf7_1jA1R2|6KQfuQdG-I0k&vUef*=`NKD14&b(MKuY z1SZ5)S_Z)VyKb+zs=&>(>@0xB8|y%^hx<@lOABV&tTmGy;fs9xBrE@lvdFUwn&?_! zkTG5%A&>(W=z>t>jM|uzl%IbIC1IVZJxa!DWve`J;u8e=A#=(86>y|-qo~!G3xnmx zVb-18qS6IBDjPtkj&GI-Ocu=?xfiq)##(ZvmRrJU{owko%(U1SqoH29I zv20A6a1HkU{WW4(PD7Xrw9O8R^fc|9%8{RJv0A#eWuRXbz+D%L`NQ%b+uKnIfRPIP z=?8sBc24o%?6zr++wkQ2(DjP?h4`q9cYuz-Zh(q!-=3VB8pPw>l@CHEfLTqAMvQR) z46XgDe1C{hllt>B>c-zpA~%k&IZUjy{w|w*d*5@0b?a7hFwmk3f0=5^Mz?uv27kPa z^2ovXvvX9Bvj(Qd3%b7Tz4&fm76BR=w!k9;}tCP%2~IrW2_yA{@Fu+3dIzfZA9XNFFu0kN{CB*u`2+0TmaVT!c_Fa1uH8}jU4D;wC6o(mf|2& zB4b<|+tFpvEZ=trKn;E-ZOT`_&C&sS4}nDB0Wm5CP$`ROtAg$)v;g?0(a+M{+!chi zoW#WIqMO%{<17Q1DTwI<>x3Ee0B=ZbyoD8 z5Kbom8qloG=+6XK?ff?hG8#Yu+R-5UPnbod*D6yf~1CLY(#%P?GBXeo}Ms7Hk|^F9<%IBndemzL592wr=@@rJhW??l8N=3H`PueSn}j6iD) zY7GEqeLoSV`iTxot^C5%lxmpBYeSbFMKocFAC$gm41E6J!7}1Zb^U1-@|~C(1k&hz z=!|gnNLV;=^dP5fHt@KNQ8>_nw_#$fOq8gVEfiFe09+P18N+b@13gN>hr4PFyk^XT z7S3xQ%kY@H<)HrAd7gM%^val4U3bS3zkvVk%J|B3HzOf|N4zn=E3CGsvUWkln?k`8 z$?+1>*?oj8Tf3gIneoUw4kxLqwIC%IkI1hF+Vq#sP6X_jw^gah$$0hAnV zI|KH(Ym9UnKFwWvHeH4G+jhr$DJ=j^ZWj2k<1gM4TFJ>~Yq8_@(C#^7eFdGhN9;>% z!S@5Hm+5X(z?W;}moj@&pDvXWMr^dL7H=lUspU4G2Fsd|Qk3WW#Hwp)!ScurX9fG3 z0qql3!;=SYB61irT*R@OLylA8pXMp=w4w7llL@%IftBmHQ^s)C1|!Z2hu|~rLWGpk z+JdZhKDfPR zKbeQKG^0?kH=SgoC?+YHmy`1-`9pjAQ8Ff?vq@St@I$1pZ}WV4YJe+&Aszth{dAsH zBy{`$^SgT_or^7Q?XK&4`}*~cuRCOG&E+gztNQ<}r!zcCOb6?_?H&X~Na>2OFlKfH zA0-xYf{=FhVb@t8xdYr}GDI_Yk$<2y#JZoaF!|#jijW&>7mP3+a-4D7%Y1P?hLYM8 zbwE6r*LKOD2Twz1CcA=@rvbdc{$14?sq^%iL^etmY>e6+8EwlFam~Z z81pvYpJQ>MC!ChyM`4&^3kFwh&u%^kFR(y=zxLH41%Y_RJnNay<#iblOA8t4?gzc< z_bXpU$5)_6-Bs7>>Ki z$v{Lxt9X54n+HJSz70J4;XMd?R(Wyx#B$Ne*0Q~nyB#ZlTlJ}ac7H=li|OViq+VXU z&+P*;|KcI_NY&h{+gf(Xa>WbX$kqSOLLw+hOqS`{bCv2EKsAOo4F)ut9dx>WY2tFB z;3=VvbK{433^z@=Ba;SGz6Tv=%MS!-a+V}@7abj(zc91p*z1-bA78e~kHPh2ZLbIS ze^<(X>Y*YK|L>*zEzMfrEM~~iYTI!jOiW6)Y zBV*$zVJ|;a+0E2w-~-$E+D8jVljsc1hJ(v z`48e_4X!RZm&C*Cu7PYG92y#To8D$S93?=1!c2wb3OmYwuNE$MjD2oWr!i_LuUkzE z@x1rzK6~vn&2#y2^}27WD=WubiZk1p^tH98;S2|Qab-(VH(7$Q=GFjM|qmuBMgaSj)Zu^=@^?2HaV+ zna*z>A}WmJlysl?fDLizE8~>Hv-oT2s3{UBv_k#g$V)(<>$hh(DLq|+)(~dD+UfS@ za9Batf}ma8zH$$P#_$5!XSDd|$F_XixSgpd_4MQxO-0ZB*;!whb?&u7O|)>k{qYdj$g1Rv=bPTV6QLejzpqez}W-Ucb@>P{PNFbnhAI)=jA>rcPISium& z#beXb3J0B+7@2Ti*7-@9p)|Cv=z?e4M)i2Wxe%?y(u9O>V1uNkrw_N~Wnex$+OPhb zrNKG>mg?t@L^ z^~R3)*U3T$mp2HQt+PEKy7R%NB}*PWTyZ!eJM2yN%uJV%lc;1^Ak7jbol^au@) zgl`gHH4sAuk&+A!<95u0Y7e7YOo8|b5DaoF7L|pyn3Uc6fzZzY@Lj!frMI6S@HDu3 z3J42d2Izwo4v`}`DKC&|E`SvexMoW%Bngk(P-+pfK%_=&Y-}@Nw74UGA=|_D5j9CQ z*&h8`)aLme!)w@OhzX(?=85kc+wxjI4YuWA)&uy&fd)+q!I}eFhxuf%3T?Moc%EF!wEX^BPz(vwN;Hoi<5V zt1wS)92$9a+z7j@$ehiSsb7l%cp96UU^vK$9tB`;`HSCf8(P(4#_+{jxgL8N&?CZ- zANoarFVlV;<2O7O+#PJ3Tk?wP+`~^?98QmE9=JSL;5iik%;O|x(L|w(i!M4kk~m7x zB-nlkr64iFz{RDodBE4lM+O8X#j-VF)KHET>p zeN1iJqpKW(ULv3h3jov*oYEr^XI{VlBE){UebI8Rj*w@fJN*mwa3d&V;C}83gRRvs z02;!uR)rHQexP6V;&LcsGVoTo**vi@4}}vVp_IzczgL?5(L#b42MB*@R2Ne)gw%M1 zC#RyK4?qllPf!w$BfVz2ThXPYtn7k7=P}jI(&$z`FyYwyt`qh{;n)-h*2*!nvdWk> zBoR^!kA21Rhza{W2ntmnkeNQ~%28_8dG z>@}|UBDCgf*d%VVy51PvP55#Pg`h5DQUi{I0lkQ-r(oJD4&(|*L+!ntFD)cK;c;8s zr$hll!P9`O4dp!uaC~xdb67Hj?gZ5>CI^Iw=(+s*-dSbQRT(~8hiGeMcR}v=N?Ud> z#-+_32qv%#h-+sE^5w_kJz`?^po2iSeow|B*=4(yuC6YI7eSs?g2>F5$B-{Zkb9uY zYK#l5uC;br@B8rJI|?&Z zB&FEZWP8x%K>E(t`KpE zqp-k0_akHi6Epw7REL3UU0q#Z`_?94K*wY%CJQh8NR+>R^JdoQx3bgGutCRYH@n}t z4v7osXi$>le&FIRh)JBTgF6%Jr!d!K`_?tNx&Gr;6IGc12glpSIIX(^lDX#@4yCWb zVDJpK(CDjg&a+BdwFAY+=s>o+J(&BF*Ot~i(5knlX%!EY24buXj1#?e=kPEHvUVMv z*E^f=*=5N2mpwNXbL?;E1K;6}39E0p;LqCqxv-}|@J|HWl~vpflXCmfw1o{X;n%&c z4jJP|gnJah{=OJm@UtcJ97;nBBH+>4GJ_MBQSI07fTC+`z zj63bV9?oUfimOAV!lZWU)VDtgsHt>aYA6+n0+^)OVcNX3KBGP4e`ta9=pQi zKK7NoYOcC+`^x(iFHzp%Wh&(7p-fIo_+vjG@!oS~z1sKqSCP-W1%93QqVk!{>_+|l zRV6|B>!lcTx_>B(GCVzsU|IzjAJZ#S>rA0tgb1||fX>vw`#yVcGH_z+B7*ZM0pR%n zp8*`{4`*Wu<`1kkF~k+wKiW(%dXygf1mFkA>~$QhZxP&4jE+f=@I8t75Xk3E#8_b~ zg0Q2Ru8Z1L!AI~dRz6U$KA57+f${Oo;|0$7S@bIIVl?cfQNyW|@DUg%?hU(-ZJgE46zuWwtDm%OMkuCIW`cdKpJ*0{O7h63NG>+NYGe|ue1(_|_J%3p7LL6+V6^(l?p zMIU3*<=`y`nMl>WQ(p;>1ndJWNk**RO*$TF^?mSbjj(Vw2v^kV+C_Wy%EG682T%dX zsOIf?GlpqNPXdkv51xP+QO;b8rm0=bqG4a(lpv6{-W%sD5% zBqjwj$sbG$`nAn0{*~(0G)=H06YF!vB!&TJ4n))RNhSbFA4c2m6b%nS2j*->+Z4dV5V3 z))D>p$)*{2ETV~v6~A&lA7;XFW0OFE%^eF_L2hd5+fEzAGiL*J4>+wO1 zdAh00NE<6FD>pY;*IIWA3!$R-%^IKW3U=+@t&u|3Xt#1gdVrUuB?v93qt*=EU&RkPv+)^96KZEf(=xWyKNIfCw7^-KiYaB_wF4g!z3J;saE_G?3{L#C4+nH;Mf2c z(km3emROC=>+5ow^{YZEw@2$>x)kaeq;UJlot>RTJ|Pupn1CgMwLIx3V!q`M7r><$ z|Hv+8x-Oy=XBs$;!IZbgK-2pf`I7_>iatp2+Vc zQuu@jEACiGV}P1tF}Rjuz}e|&t&C<^!-fzIj6(4CAQ7JA@=frbiQ z5(3h3Z(rX?#0E?kMtVI(EFmOAm(YDh%DC5}Wrw4*;MM1_UIH5>^6afx4Zp87#@|GD61P+5u8)EtQ2ATp5P+iBDYZ*y3Upo|_X zDQUuiB8`FYlk=5rRzu{J?sRVL`B-*3tz-QFQ8D!O%RT;~T)Y!W$?Jj8F4)r5qE2-|#bQ`it7VMHfn zmgr`g)N;V$Ri+=uzdOwJ2@7+j0D{rY*L;%D9f&^t{sKB_#~;0QhzJA$098MRyu5)v zy2!9>6^xXTqfcokrv^cWK)Rey<_1#!{gkW;s6yB8krg4pD{X(#vAtuL+eveNeah3Op=F7&Hbp+)!l zqfZC5^n$empYxFuiS-5egX4pQBgZv070DKvdPsNoIP??toy`N?dNlBwLTM&p-}{be ztT=Pke_gNn){-qeEAR*z%M>?utZ0TUey}Gw7Ayt~Pf#zx;LZX-Dw%EAs^o@}%dUVfQyAonzJSjkVS~^gZ6O_5UNP((geI2n7aiXUrWZpO%_e(Xu`ocFA4C}rCk6RQq;TH0l?&&TKYpW;H z9qE|7xL}(wj-yD+il+SubaWXUX156ust}-qlYhbysoGcAUSnwV_3#sRQ5;po9l!=h zfdp$bj1*N0_<`CeOZbF0#nPjaHDlM5%y_70&W+O%cjbyvW?Q#DIVfJORh#&Rzx|uo zMSjdZ#EJHEpc(t@Wito876t1a;E>s4&@9mKP-EEt{qZRwM5I0Lv%e7el4`Ui1K%L) zR)=erxyK)6uBY)UN47hXB4=9knz~`C*M>ZH9-Lsymd6TFF@v#B5`=XQ3!V!-T_}bX z#>YJ=VLtf-DCI(Rukx|Ior>bla%meIW^3P?<@DPZ;$VRV3ZBh=b_0%XclzxprXb$Q zbYT|xfxwY+bBQ+kF(_Rcw93xSw$Q%O|i41Dv@kLKBmxVjcZ z0UR6PFFw{Q{LXj7Jo!+JXUaXklm?WfefgH3u?nG7=Q^eE$c+kb}G=dcV{2Q zi33VAq6?jKUW<|M<|_*AL5q@*Oq8fs)#BE43C@tyC z$-l=Jy(8k81f4Nr2;N2Hlg8NrXN_Ba842GE0;}M(3u8fCG&DvS91bS)Bga+}i5EE} zVn?J3zP$77FI&fe-}jMZs)!RFY?C0f9r#2g+|ONSo7iBtxrm0JI^^cwLWaL06qVI``mk`31BK?m<9+ccC6Y zF>qr~&#rmdPB6h&Z`$!02jL!@&-<{Kh$(TnRe&|0)CoF7%DHL=JS3z)7!(K03o1XY z+WZ&frkk2(Qg#<$F9bo0k`l(2Hw{cE#;FDHOz@DnPyu$^VYxLlH6>@=;YTVkGh=n6&7;Zo&QO=6%u3_F00K%%~7#ZwRXvF0396&vRyP+AjF0c;lVS*Bm zjfohJBWW7NMZRu2az|MJKtL%lj{;%_!f`ujz>Uqv+Z#_rrpPj@6_Jc^-@c3o2H98T z1+)}_C5GWiBk8>$#tM9&2-%=TyltLO#|;|ap_1Eg>|eQ>eOAnB)GnhCl)g_97tDgT`p?P zi&`3~OEO&=E*nZiTE>CF6q9cb@)PYft|aU`ZXZ8CD8~C&FS+~t%$XwPC)RR@>LYch z`jtrUrkD4B&?xHg%iFYc-{VKg$pO}qg-X=M-7=oU`U_dDlq95srr&5~uReeG=p;Y) zlU9pk>F3P9ZnxMD7PE(gG|5yhe0Ja%Tla(uc-x~*Oe8uE)FY@#2c34LQVkO6B=8T~ zX%b>$*%zRkMC1~mb7AH70L1-dL}U? zpH2A1#V*otZ9*ABc(Xa=qdC~`%}(4iDU|6iUcU5IJZEn&Wh#d)MX6m=#q)$ z@-wk0bHLG3Nu*!75@gBy4rWkxoxCX#{(eeEtl?|s^AIL82mQcp4>Wtk!va3#z|&-4 z!fg4F=e2qA*Wjls=skF26`fKID_mrwP=ys1$`stJn%{Nv=R0BrEZdFG@rYQvBnszp z42StMq;16?U%x(_)tXvEirD}U4P-^@mt83yv_4Q}Hx}sg=ND5vMN!H}>ujsa$@GYKvG!VrTyFQ+OWBlB)b<5^Im9<`_@5v05E=r5~ zP^i~XAou!#=KO)Q*_+x^Yjegp&AR3B9?vxer{Yt1l#u7M+#tC#B5fZlsp>xA`)-Oe z4WR(+-K^HltgIhw){t~BV@i-!UUNeO+*%@4_?4J+9#ww4_+WbEab2|4=_Bzlvm<{s z-~aMlYab=Y7TzxX=IXijavZ90=AZ86-Ye7<8PgM-$Nl@eIA_ri%xykan(rPNE5lg# zJXQ!48Xv>BNL~MmIJb<=<{fzCjy{<3Te5eXxMP&M*`ptZwL{AP_74ALKeJloz$XT1 zhyI<0Z}Zw~g;fH0N*%S{nTmlej+si4Dk+VXF3>7JYI;6uu#jETFyy%YZbq8ouL@cn zA{f-C=n6V_Y@Crc%9vd`kr6)DTvnoQaL`z4;pz#tqpjOQcLT1vgFv#1|6rQBRNukI zBIxt4+a^t@b7P}8Rp0T%U)p{NV@a;8_lk0){bK04lN1GJZL^Usr{q;zV zVb4}&OR->i3F^|X-Y;3J#brOZ!Fc5ux)^ zNi_dqGv7ndB0cwU(|PeIiG&_uCyB+El$6{JS$Fe^_51IB3VY%tG#&m- zUSbiv$vu6u3PJj`mnRO8f$G&wiBa0Ql^iBuT=L2w7 z>#+LS%Jk*?gv_tpSZ3!ux*5cSOMdW2m zThAn>s>a?Zx=%!meLG;q17PgTj-;iYv{?GUy}Wx*$Q0nekv`K8d|jiuxqNt7ZjOG+ z9pg#yTDC=D9nOC}y~yT)vP#|0&^01%fe*ND+0!KA2TUaflOI1YG(Dj!@90$9SA0!{ z8lCS~EaAXpkqeO%r1{_!m>-R8@yU0YIP4@?ZZ%x_>NVhk7En>k(hSfjyfm8Y3v zv~>_wVwS-!e3ooFCI?AnNM03YxUId-bvpIt4Cl&~D}62~0KhwOvGf|fI^xQ4!G+}q z(lC`+y2qSks$i8j13+R-^kDz5{q9j2Ei+LY+b6!A?Bd{$U0XjtTKUrh=#oOt((ve< zCHvDvXcuG4;`<=z(0|b0)|NANNMo&5>)Uv)^hRE~$J%c)PPQE%QgEWz`F{)+_j699Fv2T+9-4c*{t; zIxp8@J(I(<>`J`Fgi==^*1#CL3~{i{uS8aJtL#O1!C=PE(3glFYC&(_ryNk_PIhV> z*;{<`@!}zTpa1?Rb%heaPsdB#E$qWHSnegC)9~7{xRKJf8(kGL`d+w%^x5a#z(k8W zP0X=%2XWe;Gsq1 z8wOqJVCyV@hRmgnaXrh=ZuhWAdUH-kDfy|OKziX7EVySI7+G19aR-|!O~oK_PX749 zab?S%0;@p>xuThoI30=rkcOR9`m*OW`aQXJMIjCj8oRswOPW>)?77Ua{H!vKmf+M@ z>Ox$$@#~W8EtoNAnPwv$dI)DPqUu&tz8@uFzOyqe8(%b0m1gfYb-pl8f1=ZTJn&Hl z#cS8^FTI1ejOBVL!H!%vxJM++9!F zQ!J|aHr^tntqbE^_TW!x9|xR(w6oQMj{pi$Il!iQ;$ivG2nk_~#uLv6@CaRFHUXpt4d7K5YA=msIT+dgq4^~t}Zu_|BQTKU_#|Dv9ON0 z>Cbt{lH_7!J4>_J=$=v=H~)L_@{j$V-@m4Pd3*B59~hJkpSXw7`MoHI;gJ1im?suV&R@meooOzVcNh8t9OmtVXLI%_X}o2Q=`}dj-LP z#XVWEcVZf|GoPpuV~)|FM}Er#!N6vz;{gxRxhCL6<1A-%08kUFB<_}%_W+8kk~j{N z7T|d5#>U^E!k=)tjA99FQUJNY9nnL;(73(Pr#o%Jj7ffr~`675LhJPbi88qCQuyGG|kaQcXu!858VG5A(6}jPbnW? zM?2{rL6~WcUiz_R+O@{XPIB`!G8fE=kcjp$##1{fXx5Lz{Xf)2eY&Hf8|S?B-($M~8HAOg1(E=~^c zi-k}L#}U|DI^5bhW{tpgP!FOR^qd1$<`w1T-@bko*z2td6Z};S40?Dx=+^0qG~-Kq z3!s4p_;=5q8Njn!V+rzYVWA5qnG%LPXx)mNF$3O3cNcRE36K{(eqf7}a3f7h5`e`p z@GF4PqmAXf#C>K3Mhr1JK_3YSU}9lu1~Y@(>{H1ch}DjGc5s=2a~8U1n)g97Fa}eL zFt>zrJxWDM)YLEq*e1W#bCnLGywSUkgyZWOH)w7guKJ|fqD_rwr0@-s2wtW%7S`>G zw%qY({-7-{cnBTFHyUA55$))~0Jls_O}$OQ(*m*y7EC6Z9U)7SU}`#F{V7^D(pTuy#7f5N*RFm4i8GFP zmHHftvX(KGeSi32dRrK^I^9&8Y zp#Kic#tvAMQRP{Q2vA#uH^RUGi+XUVUm4vYR^M+SUS30G{rzU+qUe!Y@`{ zM8waMeZU_uoH+gl70{3)(a*cVW_A47nG_bnFqjp6_~X7}aTE##@ErgJ5TgzSJOuP{ z9^Cnu;^wV))49c2T%s@nJ>jHz_k-#YF%4xC`s%9VGE zT4Du~B^>jaushJu#l@V?(ERA#VwER2(>F%A6qgy^tw7)R#kAoQ|gF(7}Bva(>6AhCsK0`b7U$i#01( z_I)aqZ#(k5Yjm9&nY^rskFSkQ5-#Z%({^{8NV58_x%m=K)@5akYPcxGZ2_M_hHo7H z{AlL@eE^LzJ3B~klQ2jPSl>`M22R^4N5kIZcGGh(ewKAS+a9)+V^#f4 zMm6_?^Rf(z^>Cd}5FME(k!i1vJD(}#tLs>=-z+nO=;+|{k4L1u=eHc#o zfvPlzwnHVOACPQ9HUMF`ps;Yq6C-*?tZ;PLRKmqBU^|x1PYW`#%e#YL*oi%*$%$Tl ztN>viH`alEFib{9kagqyMd*B8T|EcrmtW<+6r?!-(}+=;u+Rl#rXRh*Ng$;}Uk0rT zC?FBwgoTfdCYfP&&QjXdgtP*5)(WhLq;m^^^9f89txYIxgJH)REl2kb+( zec}bB29_qlTXDaL<`htfHM?N=1)T7qOHeO*x_DTDBbCwI^6~~B+44X|g=1Gx&klS` zbm_d^oPe$2~WgQ^#fYFJt+%I*Utf&YgKsSKa?LtDg{rw56bb?;!FuCo9 zW-q8rAI4`-s{#K(C=~PJ>x%D?`{2YM8(MmK!di#LJV!hCw}bhRxK9yo~7_AeA&qr+r4`u+y2$$APu+Pl&jmw*XSdudBC#`*Qp?YrvY4H zQc||Y9#WJQi>*lflZd(Omv!Fha!d>*QA z)>#$m+mW<3HsLVVWgL7zNm{oFur~opJMovweGOM2R+dNJx0U|Qu(blnihamQ03;;R zyHs>Hmrb17G3ruGzUCk{zmJM0ih7!FU}H-`iK&UGbO=Tcu}O_)8vML@ZRij1C>2`w z{xJHvaFwBCb|}T;Q|>iTG%oIodL?p*6x|lV{-3~tzY$7C8FYj7A$cU1rAtuuf<+ z{dE7AhpMh*gfENc#*WFKN+#wtKq_>*sZ}v4eJ@eWl1LOdv-(#XkGm9mas9CPbZ%zC13E*cq{ZX+^1(mqdQ+Js;UwMUtuS_PTRqjZ9@$*%VEg7f5! zg`o|uX)0TvJeQOdIdyN6hVepgbqbAIgq9-*T99req~R7jb3f9LoKr>!-6UF9xfGL}>??7>|uzz)?YC-W7f{;ql`g7Rh)w zywa|@1QIjvJiooiS^!sz%01f!J_?G)gK`JX66xy@`rZ)b)=yd5)W3gE@cHW#RTrEb zFV2`YR|N2Q6BasXD={!=)KcG+WU5A8?*Q61Y#>TlsKz}z7?AG1d+-u9rRe<$1I$UW z&aW0ZdHncsjG4QCAI7i`YTV$Ma^`FZa+@<}HD3xwG2VsGJgYC7YR4rTsYR2gMB3fZ zoy4bv5`)k{1vsp#YT|?%23s6D>#rF-IV!W4Km2Bw3DG96AQnD<$N^r zK4~3bzGD+5scwxZ^-A}ddxi?)Pw!@zDf9xXB51vL;XjEBJ_8Qypy3l1VA$Is)I~;$ zw6_1P9px-UBzhP|r2bPu`roUTc0?YNa3G)Dgiu&)Mb*?tezLfYzGiYKU zxn-Nn5pAi_3Jv`4^O66MvWPu4Z+uO^c&bxxv#G|rKcnjKche#A1pY634PW4!Gdn2U zDh(ve47a-ZQVrGV8tN~QmaJg~0Y2@PW{R)3HwZ$|_7xU>u*yp@Aw6@(@)8kIVJ-sz z27w#;Y*CB1Yn=e`F{TH(xw!$7A!I?oW1yv#=tmQ?6Kpid8i3qDf1sJ7!M>OdEL%o} zM{l8b4;BV0E~xrac9Xt?N6ap5_sTF65QcXwXmJU@KjPhFrw{PVwEbi%jsf@7cje3T z#QJ=MF9RtU{aiNmdpVA=%n#i{~xLwCmqe zl81FMaUEid0dPsaCXuIa`6Po)Lq?sWxq<-@9ibZmB~WXH?_U6+)YTh+(gt5eJvE40 zLigm!z@Q+o;I?p2V`fh&WIb@N?G_`U+Zh@j-Vgh+4$w-T!d;Ne%)v1aUjD&Dhrm3H zIEeBhYPX3B>Pob=2|@!wKUr&+34@mJU`IfPnS7NNbM20hp<+>6p$iEY2+hm~(=^+9 zm9}}-YE`fKyC?ha3vRJl`~R2M>OX!gE|)T=#Qgo;*k%pyptRm^=8Z2`Z75?){<)FaW~~ zaAM#bc%toie*+8tP~k3Y8s;)Z4;!x`HwS4dyZV2Q>(n0sY?%KA8eV$nSvdR?VFbc{ zzhb0wFT_k>_BkWy0Bl2*OI1g8+cB`qh=EyESQwu6X6Su<70v=)C2%qx^C*$+K@?*1 zEr+lOgr+D8)B5#bvsz(770lptYm$}dnD_!8b*gX$@DK*&8*dpQs9BIx8WSEqwD^#X z?g=Qb8O>}PHfZSTx^>#JR7AU50YPXR0$_5VlZcZzC?r-O`|;ce+WR7^+@QWT^i6H8 z|E*gosi{Egq+BO0@N#!|NA2tA=y?7-593NN8?gGo0*}H}QJ?}39y}mtL#~55a2onP z_joIBNT#*$I>XQDK+PaQR53#%4jZKn4bZz2RvXN05niAcp4y|KP5CK=3fyQ z9$slhjH<*a5%|Wch#tZ-LBvMlwAflCEelZmD2r@TD^S1(JaO@R_wPT2_!UaS?>MW0 z)39)IsuEmmp#MSEJv}{HE5TDttOtcToI(I4bY5S27hYFZa>x4ktO8v^jJ0v+v+IC} zuufP+_1(bb!sh;pHLX#be;gG#R3gN%*l6LE)*|;g*TYND*=aF9-KRs;MElx8qN5>5 z;ACZm1JU@{7!wl{+{nw>v8@7SV z1>quQiEjH@t^uLeKs3aX;ARfNB|lP6sk%*^+KMHa+P1)-E9N>vVX=M&E2gvI^~1yo zBfFE483B`rW)LJcwD9;*xOaEIS&syL_ScpzTTUg>h1MEof;|l#MJNT{mCGK~m9AT- zW??Z%c<@8y2_^TbNIi*~VT>SnKIE8kXfb4d*d_FI3CZ-VW09P!tgf6gnGCHhq6=vG z?s3K2Ph&(OcFx(eTNn`;5l*9XTJ9mB_*c{eNakjhvfFy?E2#^wnnk@N6 z;6K1Gh+(q>6QKGMfQ`2)a%Xs*KH;JR5eS3(Vq!jnsn53K%s!}Mprcvt_!*!lA)=$_ z7~r;T>a2t!U%;otJ%)OTqz?krgCeTYY^c3p9AIa|6|X1JDLxp`E0p1URF!y{kiKn5TpaaP;H;%hzW#A0g*I^_O2vhv`3Smz9?%-*l@t%Yha`20$R#yfRBYZxNXr zwj2;9sNx;U(FTiy-d_zsqHk2tl3#9(ga4dR|8A8#rjZ-@yn%OQSsH$hAN(-5^Kz$Y9s&606Wh|8arwDpN#Xs!o8bRT+I&SX zMNvNqlcgKs!Uj-nH#7&g%3^Cs&(^A`so_)>-nI>sJ^L4{z?h+zd$C;74pL31;5db$ zw$2!Wl-|7TbK>L2kFnFhm4zNY#&G*C>iEyzU+4!@QH`fyUjW&$1}JPMxAGAEYjj zb*rhVM?6Ru@1hsG1tb!!mh57hLHvm6&|^LT&B41OszH@uwvDCz{$|K=&t^aHlN=To z**cqdT=+q~Y;DVtzUnH9-DByg3k&{14N|JIK-kg4EF>KHf4VOO) zg_XfE%#?Kzj-b&^0sU{{4(DPzgk1#ZXrLJlJ4s@oh(PGd3mYNWl3|Ck&tS>^fj!vd zwk`iYmE8Id)z{zWI{l!wH&`FepStZHDF!VO1$~a6+hF}40@5Eg;xF(o2y36nNIiZ1 zbUaW=%pZe+06rD7E?G8g(EFfzM>B<&8(5i|#gFEaGkXm5{$KDfD$D6vy2e&fb)X3S zwT}4weUi<+GqZnnkZr!?fFQ|RGi=Y)L`!cn6Bdf*?@#R`}8JM^v;(Dxsej|*4 zJ7#fZ(eh*;mjclc=q`Kp3Vl^gb@imHv;l#EEJCMZHe-uA_diMu+FBwDoeL!A{c7CY zgw-rGed<^7UrW9nxC8DBNa!kZBe3v0+lB59H1wxR+zMo~K*5GseHIatDE|>eD!W37 zlMQah{dKg+SMkDf&iI`Je~?lmbiP`8NQrQ_kP=~rbqR*R&i0+3dSc&qqNpRCW5N<` zAjnFP_o%H{_XE8GEE&wXjNOc~6}geYLq3fCXT_yjOS)n#{NJ#-HhfvkX_@t z%*Dcyn;}sMCp@}aQ5-1+;PivWMwX*?y{c@c+te89QO2!`t69as-zVI^(GECOXuplf zGoYpB<>6^)Y$QwuAjuqtK*8Sr2lPQ`1EtRgt!qEZck-o2=KmoFN=Lb0plh53O^)WD z$A6mo_;*}=4n=)D2QRn0OaARvi}d7VZ5&$YWD^Gk)RAaFK#)YBE10?tjR&Uh60W=v zn<3stlY?-PTyygr{sVkOM^PTa7`5=}Q#Z_mA$}4X5=>afc$-UMmnG>A|KGBqf~GeT zt+nu_01KO1jRSw;dQOBo;iJq4Z@zrMdKBvT$7ilYvt0!(6HaaG5gi%ZT61yjkof>K z4B#PdF7oyuekWue;LPJl-RlE!iIAu$Kh97?3x9ey$D+%~P;aq_mLS`NaBU3FJ=sJz z2}cLf=!QN+bfG)uw2k{w0I>%dJ<_Rx#?#Y_MH*F2lwFsa!aB-p$b*5UAU7mGtTPR= zz9zY8wOv;_A)S}=pDU;ga{$xsH*?>VQtDU`G2hKuXmud*FJ?p14VU2bxC@S{mQxa z_53Pmx64ATqn(xuSxZSjGr<8kZ(@QLRvf$*u|#o{YixG90=*P5W&{Vros1CLXVAxq z^70zNoY$pz9=r%bD9`8%0zcdgHZD^@xs#Bv5%xBate_Q0pgwTlc(%q3W){dJ9iE@l zd&uXSPe!K}1&rI=zQvf8O@*|wpP~&3RA;7F2B@A)iLq#C@wAchSFZ9n&9Ca_Q z)3^FUVrkX-%TQsF}~(stFMCb6b%0x*g&9_>F{nJj;7hEam4VKreY}7vw%&K z8}OFclM|~wH7`H}3+lM=#v?fSk=Xnmf@j)AO&YqLWuuS)Lv;y|ugo~>QJ1k%Rx9Ra zU@Qx>!a4{Ut2Xv5S%%D>@Nk6i>Q-_4U(~&{Z{Q{oxl_*MXgkPsz}p^2pMCtNO+*d^ zm%HRcG#@Z!k(fM!RRhx^hsC7g-6TOZd#8;PuuwN0Qd0=ddcJ+r?<*@H(ZIWcA7(X* ziXo6lX=)~)qkfX7Cjorz6Ew`xhT#!(TQ^q!^~JFWXk5#NH>8*?N&&YO&t19%yqHK} zkQ0DYth$&f(J@nlvj~zhe8q(I7~Y;qiq?-AOHUsu1w0-26GU`Y0L*R>kMZ8ufPGd z!VBINc9iz20+9lmZf?_i-f2TWK z80SKJbqfK09ZYG2Beyi{9HIb};q_m^uc0=R-`O5wHMEWZzmOO=EqwaeF?ZOx$zyZr zx3drEw{htRTvvKXqb#(xHMiwq-Sj3-?J~0;ukVS~ZHn`_GP}GHt|&)$G+k}_aahju z_PtG}$qKQ0lp6`leU1qTo#`8UTJ*N2=IzLt_j7v1MXo~{5A1f2yReH5&V|K)vn&kB zcxg9fXNzUkOD|GDGO|U(BNcv$*ypIlg{+>v!0skg#e{)B?F<~%+^x|G)qXAma09GyLnf0F<8eC-#0`c@c*5Wc)_ zto!LYp@T*h=QMiZ2HG}8^BsSkik@lj(Fa_hdb$5(S?5xhZ($~gK^kt;dm$ySf##MF z$Zp1G4cnBciaZrEBkq{^qj`TTR70%n>~bFSZnpTC{6GyDcZ{}j zL0PornpvZ3AWNdg-n6j^+Z0%TXZ$jy0dD^ZcM71s&Z9xvx!u$1ih*@deiEEwg{ zH~`zNZD^A4g3SBqB6#gP%%R*NsoHW4O@k3=mx*a*gsBs55+;rHq3I8)@Go#Kwg*=d zjwnbhiLejg!3e= zsj>>pXkk!by1KY41qHM|u*#?jm*qgeH2heG2mleh=^8VKnS=j zEK^1W#1MrL1QkLMBPG1@-0z~bwnocth8f5YB)R`R_dLJz9c?>^FbKm4`J|+u9#mmf zHa)a1!a^!PW-I9-l$-GGQCp}D4Fw<2=jfG|^+5qB+}H8-L#pg%7Xfpuq<;Jk?abOJ z){x*~HQ2tV zha`01$%D)2OH?rkXBqLdqhNc%rdg$x7T;=rfxcb|q=t0k!>8}S7YZpzuC}uKhO|I? zwFAqNLVtl|S%(VsiP9k|Ip9+fZz|w*FBWXY zOMn0*dKrk#puzp9__uR8Ip_%jT@&e46o7ISIh<(T6FVeDGb+`mjf12^eN@Q|(in&m zn2Wscic@lhxCK-&KyWIO`t3@J1DD>|HPgSCReS%(MVonQXs_o6QcCZthP3ecr_&Zk zmwJKQ5vepQ#|q5GB4ijqr=c|(gWro3IR|(=9_U*J`amwYA2ZwF1K(>Xc4hCHBDb!j#9YLqpH!F!>+a14}6Iz*R1+#Hi3 zo^wweAOjY|)R$Q>!ANY`$1C&cz9N=kh5GL)XJoo`n69_ri#Aa)=!>_-I~D^J|U$ACMb z=jW?egTuvZDZkgBgOWgyx?Gb+|HR43geK&>I?s;I?9(IdrC#{!TwRMjl!GDE$PKo5 zxjY6^IddV?MvzAL{n*Z~4YwQ4Pq&0|cPpkCf(eE0`w-wJxNq3hwDffMZKaLiF~3F!ImS52$S@>qRrSWwb3G+(Or(RycJOC8-I1QeI zc76`64VeV*GkQyET~n?-)Wry;s+yXWm>4CYagp3}ObHB$dnV)}J*rPjphA?Z6|7;;=3>?2`P{d1& zK!?O&4w|GlKYbnxd}JVeGbqvtodRSTSl~f4bb{UjK@*9i^(Mhzz8T2i=)-Vl@oAAm zCbb8`FnC9o-uukIg2ugvbI{m$Jerj9G_#4}Q6sVi`2nwABs=Oizq02)4M?++k%Vb< zYapRV_TaEUC&t(tVG3!Es676FBQ9}5-g2Mb_z0k4kFTY<%%W`v^Th|3Tf*8ruKw_gR-{USLEl%BB*v)1YBPINRyQuBfHX;CD^c2Q$6 zSBM&#zj3{ZudexHM3!V~(RZ>u=`?~Gh7sYt{1-tBBb;9l7vq-M0i-j~Cjc*?#{rDi z+s+PZjNijTSO)K#rs`wFTUFlNQS2jp{^pe!!*fdNLz0<~A{$*2tXN+ahhAe#`-Vn% z$*HJvFIi%<{K!y8t1enh4@E;BD`I+v;f_K4T5I;@iC7Pyx#5pjf_@P0J`xJhIRM{x zWgMdWQlWwl9y|!;n6(a<7ouQhE?ty*iZo!U6JFyBdGCU^8khwL6k8Hut8`3mLZkwc|#XFE0!!F5Y_MAEP$Tm*7)? zr=zvJ+i?Ct9hUazq95K^;-8H35Lc*eYz)xv1=Z4LWl)Ep6jvZE>_xvbfH`MHKs^3WgHLn79~L&glfK1GcP91sdZwxjLT#lE+;T z;O4wD5Hg=AM!^;|V5(2H zHKRJNIF60WlhD|+0TdO})+9Ogf8uxmns(!PaJF_TqAGBlGZ&o)Ex73V>_F?}Gzl}^1s~U9U$hZ~D_r8KnC%;+oYLDc zx8yyl?N@h-s6|l~d#Hy$hipNf0InDLAv4$CjeKA62zGCR7lJP}Mc4?ePHwn70~#~9 z?-`%Io-H{F1DrNag3}H&6$I@^XGl5_mg*>$pgBSkq(ON&<-gXQznPf?m=N zdRvhX-w1<%GlElc?-h4>-t&oHxcd5FU2gu3;})S?YlhiS=$+N|shK2;I{E~VnS&qo zRf!($PNUC?_tD}6n=wKY+9|Tj{c5HmPB5NpQaZh5WXSR+a-@Fzmq4=yheUPnEamM> z6EH8oZZgbl>o8Yntk^hS^V7`u-;dOrQz%3j-F3qU9m&2_X<^22*DqsM^Q+UAOHCGY Wyn7vbfzlwia_y=OE3f)~dHBC$=2n~l From b699a15062e01230663964961b23c7ddf7c6c826 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Tue, 19 Nov 2024 02:34:35 -0500 Subject: [PATCH 02/10] Refactor inpaint/ip2p code. --- comfy/model_base.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/comfy/model_base.py b/comfy/model_base.py index f2833168..7e92ca10 100644 --- a/comfy/model_base.py +++ b/comfy/model_base.py @@ -153,8 +153,7 @@ class BaseModel(torch.nn.Module): def encode_adm(self, **kwargs): return None - def extra_conds(self, **kwargs): - out = {} + def concat_cond(self, **kwargs): if len(self.concat_keys) > 0: cond_concat = [] denoise_mask = kwargs.get("concat_mask", kwargs.get("denoise_mask", None)) @@ -193,7 +192,14 @@ class BaseModel(torch.nn.Module): elif ck == "masked_image": cond_concat.append(self.blank_inpaint_image_like(noise)) data = torch.cat(cond_concat, dim=1) - out['c_concat'] = comfy.conds.CONDNoiseShape(data) + return data + return None + + def extra_conds(self, **kwargs): + out = {} + concat_cond = self.concat_cond(**kwargs) + if concat_cond is not None: + out['c_concat'] = comfy.conds.CONDNoiseShape(concat_cond) adm = self.encode_adm(**kwargs) if adm is not None: @@ -523,9 +529,7 @@ class SD_X4Upscaler(BaseModel): return out class IP2P: - def extra_conds(self, **kwargs): - out = {} - + def concat_cond(self, **kwargs): image = kwargs.get("concat_latent_image", None) noise = kwargs.get("noise", None) device = kwargs["device"] @@ -537,18 +541,15 @@ class IP2P: image = utils.common_upscale(image.to(device), noise.shape[-1], noise.shape[-2], "bilinear", "center") image = utils.resize_to_batch_size(image, noise.shape[0]) + return self.process_ip2p_image_in(image) - out['c_concat'] = comfy.conds.CONDNoiseShape(self.process_ip2p_image_in(image)) - adm = self.encode_adm(**kwargs) - if adm is not None: - out['y'] = comfy.conds.CONDRegular(adm) - return out class SD15_instructpix2pix(IP2P, BaseModel): def __init__(self, model_config, model_type=ModelType.EPS, device=None): super().__init__(model_config, model_type, device=device) self.process_ip2p_image_in = lambda image: image + class SDXL_instructpix2pix(IP2P, SDXL): def __init__(self, model_config, model_type=ModelType.EPS, device=None): super().__init__(model_config, model_type, device=device) From f498d855ba4333b27a862b663c02aee3761ea9f4 Mon Sep 17 00:00:00 2001 From: Yoland Yan <4950057+yoland68@users.noreply.github.com> Date: Tue, 19 Nov 2024 00:34:20 -0800 Subject: [PATCH 03/10] Add terminal size fallback (#5623) --- api_server/services/terminal_service.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/api_server/services/terminal_service.py b/api_server/services/terminal_service.py index 284afab5..ed788d9a 100644 --- a/api_server/services/terminal_service.py +++ b/api_server/services/terminal_service.py @@ -1,5 +1,6 @@ from app.logger import on_flush import os +import shutil class TerminalService: @@ -10,15 +11,27 @@ class TerminalService: self.subscriptions = set() on_flush(self.send_messages) + def get_terminal_size(self): + try: + size = os.get_terminal_size() + return (size.columns, size.lines) + except OSError: + try: + size = shutil.get_terminal_size() + return (size.columns, size.lines) + except OSError: + return (80, 24) # fallback to 80x24 + def update_size(self): - sz = os.get_terminal_size() + columns, lines = self.get_terminal_size() changed = False - if sz.columns != self.cols: - self.cols = sz.columns + + if columns != self.cols: + self.cols = columns changed = True - if sz.lines != self.rows: - self.rows = sz.lines + if lines != self.rows: + self.rows = lines changed = True if changed: From 156a28786be9ba6352061090096462bfb1b485bb Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Tue, 19 Nov 2024 07:31:29 -0500 Subject: [PATCH 04/10] Add boolean to InpaintModelConditioning to disable the noise mask. --- nodes.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/nodes.py b/nodes.py index 1ac817a2..300cfcf1 100644 --- a/nodes.py +++ b/nodes.py @@ -382,6 +382,7 @@ class InpaintModelConditioning: "vae": ("VAE", ), "pixels": ("IMAGE", ), "mask": ("MASK", ), + "add_noise_mask": ("BOOLEAN", {"default": True, "tooltip": "Add a noise mask to the latent so sampling will only happen within the mask. Might improve results or completely break things depending on the model."}), }} RETURN_TYPES = ("CONDITIONING","CONDITIONING","LATENT") @@ -390,7 +391,7 @@ class InpaintModelConditioning: CATEGORY = "conditioning/inpaint" - def encode(self, positive, negative, pixels, vae, mask): + def encode(self, positive, negative, pixels, vae, mask, add_noise_mask): x = (pixels.shape[1] // 8) * 8 y = (pixels.shape[2] // 8) * 8 mask = torch.nn.functional.interpolate(mask.reshape((-1, 1, mask.shape[-2], mask.shape[-1])), size=(pixels.shape[1], pixels.shape[2]), mode="bilinear") @@ -414,7 +415,8 @@ class InpaintModelConditioning: out_latent = {} out_latent["samples"] = orig_latent - out_latent["noise_mask"] = mask + if add_noise_mask: + out_latent["noise_mask"] = mask out = [] for conditioning in [positive, negative]: From 898615122f224d24cc4c53a30e67c8b0e70579da Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Tue, 19 Nov 2024 15:31:09 -0500 Subject: [PATCH 05/10] Rename add_noise_mask -> noise_mask. --- nodes.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nodes.py b/nodes.py index 300cfcf1..7f151586 100644 --- a/nodes.py +++ b/nodes.py @@ -382,7 +382,7 @@ class InpaintModelConditioning: "vae": ("VAE", ), "pixels": ("IMAGE", ), "mask": ("MASK", ), - "add_noise_mask": ("BOOLEAN", {"default": True, "tooltip": "Add a noise mask to the latent so sampling will only happen within the mask. Might improve results or completely break things depending on the model."}), + "noise_mask": ("BOOLEAN", {"default": True, "tooltip": "Add a noise mask to the latent so sampling will only happen within the mask. Might improve results or completely break things depending on the model."}), }} RETURN_TYPES = ("CONDITIONING","CONDITIONING","LATENT") @@ -391,7 +391,7 @@ class InpaintModelConditioning: CATEGORY = "conditioning/inpaint" - def encode(self, positive, negative, pixels, vae, mask, add_noise_mask): + def encode(self, positive, negative, pixels, vae, mask, noise_mask): x = (pixels.shape[1] // 8) * 8 y = (pixels.shape[2] // 8) * 8 mask = torch.nn.functional.interpolate(mask.reshape((-1, 1, mask.shape[-2], mask.shape[-1])), size=(pixels.shape[1], pixels.shape[2]), mode="bilinear") @@ -415,7 +415,7 @@ class InpaintModelConditioning: out_latent = {} out_latent["samples"] = orig_latent - if add_noise_mask: + if noise_mask: out_latent["noise_mask"] = mask out = [] From 22535d05896cf78d84924c492c8cfc17b8786c05 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 20 Nov 2024 07:33:06 -0500 Subject: [PATCH 06/10] Skip layer guidance now works on stable audio model. --- comfy/ldm/audio/dit.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/comfy/ldm/audio/dit.py b/comfy/ldm/audio/dit.py index 4d2185be..5b3f498f 100644 --- a/comfy/ldm/audio/dit.py +++ b/comfy/ldm/audio/dit.py @@ -612,7 +612,9 @@ class ContinuousTransformer(nn.Module): return_info = False, **kwargs ): + patches_replace = kwargs.get("transformer_options", {}).get("patches_replace", {}) batch, seq, device = *x.shape[:2], x.device + context = kwargs["context"] info = { "hidden_states": [], @@ -643,9 +645,19 @@ class ContinuousTransformer(nn.Module): if self.use_sinusoidal_emb or self.use_abs_pos_emb: x = x + self.pos_emb(x) + blocks_replace = patches_replace.get("dit", {}) # Iterate over the transformer layers - for layer in self.layers: - x = layer(x, rotary_pos_emb = rotary_pos_emb, global_cond=global_cond, **kwargs) + for i, layer in enumerate(self.layers): + if ("double_block", i) in blocks_replace: + def block_wrap(args): + out = {} + out["img"] = layer(args["img"], rotary_pos_emb=args["pe"], global_cond=args["vec"], context=args["txt"]) + return out + + out = blocks_replace[("double_block", i)]({"img": x, "txt": context, "vec": global_cond, "pe": rotary_pos_emb}, {"original_block": block_wrap}) + x = out["img"] + else: + x = layer(x, rotary_pos_emb = rotary_pos_emb, global_cond=global_cond, context=context) # x = checkpoint(layer, x, rotary_pos_emb = rotary_pos_emb, global_cond=global_cond, **kwargs) if return_info: @@ -874,7 +886,6 @@ class AudioDiffusionTransformer(nn.Module): mask=None, return_info=False, control=None, - transformer_options={}, **kwargs): return self._forward( x, From 07f6eeaa134b34ef38ff6d9014061cfeb5d041e5 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 20 Nov 2024 17:07:46 -0500 Subject: [PATCH 07/10] Fix mask issue with attention_xformers. --- comfy/ldm/modules/attention.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/comfy/ldm/modules/attention.py b/comfy/ldm/modules/attention.py index 3f543abd..7b4ee215 100644 --- a/comfy/ldm/modules/attention.py +++ b/comfy/ldm/modules/attention.py @@ -372,10 +372,10 @@ def attention_xformers(q, k, v, heads, mask=None, attn_precision=None, skip_resh ) if mask is not None: - pad = 8 - q.shape[1] % 8 - mask_out = torch.empty([q.shape[0], q.shape[1], q.shape[1] + pad], dtype=q.dtype, device=q.device) - mask_out[:, :, :mask.shape[-1]] = mask - mask = mask_out[:, :, :mask.shape[-1]] + pad = 8 - mask.shape[-1] % 8 + mask_out = torch.empty([q.shape[0], q.shape[2], q.shape[1], mask.shape[-1] + pad], dtype=q.dtype, device=q.device) + mask_out[..., :mask.shape[-1]] = mask + mask = mask_out[..., :mask.shape[-1]] out = xformers.ops.memory_efficient_attention(q, k, v, attn_bias=mask) From 772e620e32e2bc50b1a1c13e5afa4f990786c059 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Wed, 20 Nov 2024 20:42:51 -0500 Subject: [PATCH 08/10] Update readme. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 714a1d9b..2ddb925c 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,7 @@ Put your VAE in: models/vae ### AMD GPUs (Linux only) AMD users can install rocm and pytorch with pip if you don't have it already installed, this is the command to install the stable version: -```pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm6.1``` +```pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm6.2``` This is the command to install the nightly with ROCm 6.2 which might have some performance improvements: From 41444b5236c613ee5ff7d09aa620f94b702f30eb Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Thu, 21 Nov 2024 07:19:17 -0500 Subject: [PATCH 09/10] Add some new weight patching functionality. Add a way to reshape lora weights. Allow weight patches to all weight not just .weight and .bias Add a way for a lora to set a weight to a specific value. --- comfy/lora.py | 37 +++++++++++++++++++++++++++++++------ comfy/model_patcher.py | 21 ++++++++++++--------- 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/comfy/lora.py b/comfy/lora.py index b745ca4d..18602f24 100644 --- a/comfy/lora.py +++ b/comfy/lora.py @@ -49,6 +49,15 @@ def load_lora(lora, to_load): dora_scale = lora[dora_scale_name] loaded_keys.add(dora_scale_name) + reshape_name = "{}.reshape_weight".format(x) + reshape = None + if reshape_name in lora.keys(): + try: + reshape = lora[reshape_name].tolist() + loaded_keys.add(reshape_name) + except: + pass + regular_lora = "{}.lora_up.weight".format(x) diffusers_lora = "{}_lora.up.weight".format(x) diffusers2_lora = "{}.lora_B.weight".format(x) @@ -82,7 +91,7 @@ def load_lora(lora, to_load): if mid_name is not None and mid_name in lora.keys(): mid = lora[mid_name] loaded_keys.add(mid_name) - patch_dict[to_load[x]] = ("lora", (lora[A_name], lora[B_name], alpha, mid, dora_scale)) + patch_dict[to_load[x]] = ("lora", (lora[A_name], lora[B_name], alpha, mid, dora_scale, reshape)) loaded_keys.add(A_name) loaded_keys.add(B_name) @@ -193,6 +202,12 @@ def load_lora(lora, to_load): patch_dict["{}.bias".format(to_load[x][:-len(".weight")])] = ("diff", (diff_bias,)) loaded_keys.add(diff_bias_name) + set_weight_name = "{}.set_weight".format(x) + set_weight = lora.get(set_weight_name, None) + if set_weight is not None: + patch_dict[to_load[x]] = ("set", (set_weight,)) + loaded_keys.add(set_weight_name) + for x in lora.keys(): if x not in loaded_keys: logging.warning("lora key not loaded: {}".format(x)) @@ -282,11 +297,14 @@ def model_lora_keys_unet(model, key_map={}): sdk = sd.keys() for k in sdk: - if k.startswith("diffusion_model.") and k.endswith(".weight"): - key_lora = k[len("diffusion_model."):-len(".weight")].replace(".", "_") - key_map["lora_unet_{}".format(key_lora)] = k - key_map["lora_prior_unet_{}".format(key_lora)] = k #cascade lora: TODO put lora key prefix in the model config - key_map["{}".format(k[:-len(".weight")])] = k #generic lora format without any weird key names + if k.startswith("diffusion_model."): + if k.endswith(".weight"): + key_lora = k[len("diffusion_model."):-len(".weight")].replace(".", "_") + key_map["lora_unet_{}".format(key_lora)] = k + key_map["lora_prior_unet_{}".format(key_lora)] = k #cascade lora: TODO put lora key prefix in the model config + key_map["{}".format(k[:-len(".weight")])] = k #generic lora format without any weird key names + else: + key_map["{}".format(k)] = k #generic lora format for not .weight without any weird key names diffusers_keys = comfy.utils.unet_to_diffusers(model.model_config.unet_config) for k in diffusers_keys: @@ -440,10 +458,17 @@ def calculate_weight(patches, weight, key, intermediate_dtype=torch.float32): logging.warning("WARNING SHAPE MISMATCH {} WEIGHT NOT MERGED {} != {}".format(key, diff.shape, weight.shape)) else: weight += function(strength * comfy.model_management.cast_to_device(diff, weight.device, weight.dtype)) + elif patch_type == "set": + weight.copy_(v[0]) elif patch_type == "lora": #lora/locon mat1 = comfy.model_management.cast_to_device(v[0], weight.device, intermediate_dtype) mat2 = comfy.model_management.cast_to_device(v[1], weight.device, intermediate_dtype) dora_scale = v[4] + reshape = v[5] + + if reshape is not None: + weight = pad_tensor_to_shape(weight, reshape) + if v[2] is not None: alpha = v[2] / mat2.shape[0] else: diff --git a/comfy/model_patcher.py b/comfy/model_patcher.py index 3bba217a..22de7eea 100644 --- a/comfy/model_patcher.py +++ b/comfy/model_patcher.py @@ -373,14 +373,18 @@ class ModelPatcher: lowvram_counter = 0 loading = [] for n, m in self.model.named_modules(): - if hasattr(m, "comfy_cast_weights") or hasattr(m, "weight"): - loading.append((comfy.model_management.module_size(m), n, m)) + params = [] + for name, param in m.named_parameters(recurse=False): + params.append(name) + if hasattr(m, "comfy_cast_weights") or len(params) > 0: + loading.append((comfy.model_management.module_size(m), n, m, params)) load_completely = [] loading.sort(reverse=True) for x in loading: n = x[1] m = x[2] + params = x[3] module_mem = x[0] lowvram_weight = False @@ -416,22 +420,21 @@ class ModelPatcher: if m.comfy_cast_weights: wipe_lowvram_weight(m) - if hasattr(m, "weight"): - mem_counter += module_mem - load_completely.append((module_mem, n, m)) + mem_counter += module_mem + load_completely.append((module_mem, n, m, params)) load_completely.sort(reverse=True) for x in load_completely: n = x[1] m = x[2] - weight_key = "{}.weight".format(n) - bias_key = "{}.bias".format(n) + params = x[3] if hasattr(m, "comfy_patched_weights"): if m.comfy_patched_weights == True: continue - self.patch_weight_to_device(weight_key, device_to=device_to) - self.patch_weight_to_device(bias_key, device_to=device_to) + for param in params: + self.patch_weight_to_device("{}.{}".format(n, param), device_to=device_to) + logging.debug("lowvram: loaded module regularly {} {}".format(n, m)) m.comfy_patched_weights = True From 8f0009aad0591ceee59a147738aa227187b07898 Mon Sep 17 00:00:00 2001 From: comfyanonymous Date: Thu, 21 Nov 2024 08:38:23 -0500 Subject: [PATCH 10/10] Support new flux model variants. --- comfy/clip_model.py | 44 +++++++++++++++++++++++-------- comfy/clip_vision.py | 14 ++++++---- comfy/clip_vision_siglip_384.json | 13 +++++++++ comfy/ldm/flux/model.py | 9 ++++--- comfy/ldm/flux/redux.py | 25 ++++++++++++++++++ comfy/lora_convert.py | 17 ++++++++++++ comfy/model_base.py | 32 ++++++++++++++++++++++ comfy/model_detection.py | 6 +++++ comfy/sd.py | 6 +++++ 9 files changed, 147 insertions(+), 19 deletions(-) create mode 100644 comfy/clip_vision_siglip_384.json create mode 100644 comfy/ldm/flux/redux.py create mode 100644 comfy/lora_convert.py diff --git a/comfy/clip_model.py b/comfy/clip_model.py index 42cdc4f6..23ddea9c 100644 --- a/comfy/clip_model.py +++ b/comfy/clip_model.py @@ -23,6 +23,7 @@ class CLIPAttention(torch.nn.Module): ACTIVATIONS = {"quick_gelu": lambda a: a * torch.sigmoid(1.702 * a), "gelu": torch.nn.functional.gelu, + "gelu_pytorch_tanh": lambda a: torch.nn.functional.gelu(a, approximate="tanh"), } class CLIPMLP(torch.nn.Module): @@ -139,27 +140,35 @@ class CLIPTextModel(torch.nn.Module): class CLIPVisionEmbeddings(torch.nn.Module): - def __init__(self, embed_dim, num_channels=3, patch_size=14, image_size=224, dtype=None, device=None, operations=None): + def __init__(self, embed_dim, num_channels=3, patch_size=14, image_size=224, model_type="", dtype=None, device=None, operations=None): super().__init__() - self.class_embedding = torch.nn.Parameter(torch.empty(embed_dim, dtype=dtype, device=device)) + + num_patches = (image_size // patch_size) ** 2 + if model_type == "siglip_vision_model": + self.class_embedding = None + patch_bias = True + else: + num_patches = num_patches + 1 + self.class_embedding = torch.nn.Parameter(torch.empty(embed_dim, dtype=dtype, device=device)) + patch_bias = False self.patch_embedding = operations.Conv2d( in_channels=num_channels, out_channels=embed_dim, kernel_size=patch_size, stride=patch_size, - bias=False, + bias=patch_bias, dtype=dtype, device=device ) - num_patches = (image_size // patch_size) ** 2 - num_positions = num_patches + 1 - self.position_embedding = operations.Embedding(num_positions, embed_dim, dtype=dtype, device=device) + self.position_embedding = operations.Embedding(num_patches, embed_dim, dtype=dtype, device=device) def forward(self, pixel_values): embeds = self.patch_embedding(pixel_values).flatten(2).transpose(1, 2) - return torch.cat([comfy.ops.cast_to_input(self.class_embedding, embeds).expand(pixel_values.shape[0], 1, -1), embeds], dim=1) + comfy.ops.cast_to_input(self.position_embedding.weight, embeds) + if self.class_embedding is not None: + embeds = torch.cat([comfy.ops.cast_to_input(self.class_embedding, embeds).expand(pixel_values.shape[0], 1, -1), embeds], dim=1) + return embeds + comfy.ops.cast_to_input(self.position_embedding.weight, embeds) class CLIPVision(torch.nn.Module): @@ -170,9 +179,15 @@ class CLIPVision(torch.nn.Module): heads = config_dict["num_attention_heads"] intermediate_size = config_dict["intermediate_size"] intermediate_activation = config_dict["hidden_act"] + model_type = config_dict["model_type"] - self.embeddings = CLIPVisionEmbeddings(embed_dim, config_dict["num_channels"], config_dict["patch_size"], config_dict["image_size"], dtype=dtype, device=device, operations=operations) - self.pre_layrnorm = operations.LayerNorm(embed_dim) + self.embeddings = CLIPVisionEmbeddings(embed_dim, config_dict["num_channels"], config_dict["patch_size"], config_dict["image_size"], model_type=model_type, dtype=dtype, device=device, operations=operations) + if model_type == "siglip_vision_model": + self.pre_layrnorm = lambda a: a + self.output_layernorm = True + else: + self.pre_layrnorm = operations.LayerNorm(embed_dim) + self.output_layernorm = False self.encoder = CLIPEncoder(num_layers, embed_dim, heads, intermediate_size, intermediate_activation, dtype, device, operations) self.post_layernorm = operations.LayerNorm(embed_dim) @@ -181,14 +196,21 @@ class CLIPVision(torch.nn.Module): x = self.pre_layrnorm(x) #TODO: attention_mask? x, i = self.encoder(x, mask=None, intermediate_output=intermediate_output) - pooled_output = self.post_layernorm(x[:, 0, :]) + if self.output_layernorm: + x = self.post_layernorm(x) + pooled_output = x + else: + pooled_output = self.post_layernorm(x[:, 0, :]) return x, i, pooled_output class CLIPVisionModelProjection(torch.nn.Module): def __init__(self, config_dict, dtype, device, operations): super().__init__() self.vision_model = CLIPVision(config_dict, dtype, device, operations) - self.visual_projection = operations.Linear(config_dict["hidden_size"], config_dict["projection_dim"], bias=False) + if "projection_dim" in config_dict: + self.visual_projection = operations.Linear(config_dict["hidden_size"], config_dict["projection_dim"], bias=False) + else: + self.visual_projection = lambda a: a def forward(self, *args, **kwargs): x = self.vision_model(*args, **kwargs) diff --git a/comfy/clip_vision.py b/comfy/clip_vision.py index 64392e27..ed917cfb 100644 --- a/comfy/clip_vision.py +++ b/comfy/clip_vision.py @@ -16,9 +16,9 @@ class Output: def __setitem__(self, key, item): setattr(self, key, item) -def clip_preprocess(image, size=224): - mean = torch.tensor([ 0.48145466,0.4578275,0.40821073], device=image.device, dtype=image.dtype) - std = torch.tensor([0.26862954,0.26130258,0.27577711], device=image.device, dtype=image.dtype) +def clip_preprocess(image, size=224, mean=[0.48145466, 0.4578275, 0.40821073], std=[0.26862954, 0.26130258, 0.27577711]): + mean = torch.tensor(mean, device=image.device, dtype=image.dtype) + std = torch.tensor(std, device=image.device, dtype=image.dtype) image = image.movedim(-1, 1) if not (image.shape[2] == size and image.shape[3] == size): scale = (size / min(image.shape[2], image.shape[3])) @@ -35,6 +35,8 @@ class ClipVisionModel(): config = json.load(f) self.image_size = config.get("image_size", 224) + self.image_mean = config.get("image_mean", [0.48145466, 0.4578275, 0.40821073]) + self.image_std = config.get("image_std", [0.26862954, 0.26130258, 0.27577711]) self.load_device = comfy.model_management.text_encoder_device() offload_device = comfy.model_management.text_encoder_offload_device() self.dtype = comfy.model_management.text_encoder_dtype(self.load_device) @@ -51,7 +53,7 @@ class ClipVisionModel(): def encode_image(self, image): comfy.model_management.load_model_gpu(self.patcher) - pixel_values = clip_preprocess(image.to(self.load_device), size=self.image_size).float() + pixel_values = clip_preprocess(image.to(self.load_device), size=self.image_size, mean=self.image_mean, std=self.image_std).float() out = self.model(pixel_values=pixel_values, intermediate_output=-2) outputs = Output() @@ -94,7 +96,9 @@ def load_clipvision_from_sd(sd, prefix="", convert_keys=False): elif "vision_model.encoder.layers.30.layer_norm1.weight" in sd: json_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "clip_vision_config_h.json") elif "vision_model.encoder.layers.22.layer_norm1.weight" in sd: - if sd["vision_model.embeddings.position_embedding.weight"].shape[0] == 577: + if sd["vision_model.encoder.layers.0.layer_norm1.weight"].shape[0] == 1152: + json_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "clip_vision_siglip_384.json") + elif sd["vision_model.embeddings.position_embedding.weight"].shape[0] == 577: json_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "clip_vision_config_vitl_336.json") else: json_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "clip_vision_config_vitl.json") diff --git a/comfy/clip_vision_siglip_384.json b/comfy/clip_vision_siglip_384.json new file mode 100644 index 00000000..532e03ac --- /dev/null +++ b/comfy/clip_vision_siglip_384.json @@ -0,0 +1,13 @@ +{ + "num_channels": 3, + "hidden_act": "gelu_pytorch_tanh", + "hidden_size": 1152, + "image_size": 384, + "intermediate_size": 4304, + "model_type": "siglip_vision_model", + "num_attention_heads": 16, + "num_hidden_layers": 27, + "patch_size": 14, + "image_mean": [0.5, 0.5, 0.5], + "image_std": [0.5, 0.5, 0.5] +} diff --git a/comfy/ldm/flux/model.py b/comfy/ldm/flux/model.py index ae1ed109..97ad8ffe 100644 --- a/comfy/ldm/flux/model.py +++ b/comfy/ldm/flux/model.py @@ -20,6 +20,7 @@ import comfy.ldm.common_dit @dataclass class FluxParams: in_channels: int + out_channels: int vec_in_dim: int context_in_dim: int hidden_size: int @@ -29,6 +30,7 @@ class FluxParams: depth_single_blocks: int axes_dim: list theta: int + patch_size: int qkv_bias: bool guidance_embed: bool @@ -43,8 +45,9 @@ class Flux(nn.Module): self.dtype = dtype params = FluxParams(**kwargs) self.params = params - self.in_channels = params.in_channels * 2 * 2 - self.out_channels = self.in_channels + self.patch_size = params.patch_size + self.in_channels = params.in_channels * params.patch_size * params.patch_size + self.out_channels = params.out_channels * params.patch_size * params.patch_size if params.hidden_size % params.num_heads != 0: raise ValueError( f"Hidden size {params.hidden_size} must be divisible by num_heads {params.num_heads}" @@ -165,7 +168,7 @@ class Flux(nn.Module): def forward(self, x, timestep, context, y, guidance, control=None, transformer_options={}, **kwargs): bs, c, h, w = x.shape - patch_size = 2 + patch_size = self.patch_size x = comfy.ldm.common_dit.pad_to_patch_size(x, (patch_size, patch_size)) img = rearrange(x, "b c (h ph) (w pw) -> b (h w) (c ph pw)", ph=patch_size, pw=patch_size) diff --git a/comfy/ldm/flux/redux.py b/comfy/ldm/flux/redux.py new file mode 100644 index 00000000..527e8316 --- /dev/null +++ b/comfy/ldm/flux/redux.py @@ -0,0 +1,25 @@ +import torch +import comfy.ops + +ops = comfy.ops.manual_cast + +class ReduxImageEncoder(torch.nn.Module): + def __init__( + self, + redux_dim: int = 1152, + txt_in_features: int = 4096, + device=None, + dtype=None, + ) -> None: + super().__init__() + + self.redux_dim = redux_dim + self.device = device + self.dtype = dtype + + self.redux_up = ops.Linear(redux_dim, txt_in_features * 3, dtype=dtype) + self.redux_down = ops.Linear(txt_in_features * 3, txt_in_features, dtype=dtype) + + def forward(self, sigclip_embeds) -> torch.Tensor: + projected_x = self.redux_down(torch.nn.functional.silu(self.redux_up(sigclip_embeds))) + return projected_x diff --git a/comfy/lora_convert.py b/comfy/lora_convert.py new file mode 100644 index 00000000..05032c69 --- /dev/null +++ b/comfy/lora_convert.py @@ -0,0 +1,17 @@ +import torch + + +def convert_lora_bfl_control(sd): #BFL loras for Flux + sd_out = {} + for k in sd: + k_to = "diffusion_model.{}".format(k.replace(".lora_B.bias", ".diff_b").replace("_norm.scale", "_norm.scale.set_weight")) + sd_out[k_to] = sd[k] + + sd_out["diffusion_model.img_in.reshape_weight"] = torch.tensor([sd["img_in.lora_B.weight"].shape[0], sd["img_in.lora_A.weight"].shape[1]]) + return sd_out + + +def convert_lora(sd): + if "img_in.lora_A.weight" in sd and "single_blocks.0.norm.key_norm.scale" in sd: + return convert_lora_bfl_control(sd) + return sd diff --git a/comfy/model_base.py b/comfy/model_base.py index 7e92ca10..6f1aa570 100644 --- a/comfy/model_base.py +++ b/comfy/model_base.py @@ -710,6 +710,38 @@ class Flux(BaseModel): def __init__(self, model_config, model_type=ModelType.FLUX, device=None): super().__init__(model_config, model_type, device=device, unet_model=comfy.ldm.flux.model.Flux) + def concat_cond(self, **kwargs): + num_channels = self.diffusion_model.img_in.weight.shape[1] // (self.diffusion_model.patch_size * self.diffusion_model.patch_size) + out_channels = self.model_config.unet_config["out_channels"] + + if num_channels <= out_channels: + return None + + image = kwargs.get("concat_latent_image", None) + noise = kwargs.get("noise", None) + device = kwargs["device"] + + if image is None: + image = torch.zeros_like(noise) + + image = utils.common_upscale(image.to(device), noise.shape[-1], noise.shape[-2], "bilinear", "center") + image = utils.resize_to_batch_size(image, noise.shape[0]) + image = self.process_latent_in(image) + if num_channels <= out_channels * 2: + return image + + #inpaint model + mask = kwargs.get("concat_mask", kwargs.get("denoise_mask", None)) + if mask is None: + mask = torch.ones_like(noise)[:, :1] + + mask = torch.mean(mask, dim=1, keepdim=True) + print(mask.shape) + mask = utils.common_upscale(mask.to(device), noise.shape[-1] * 8, noise.shape[-2] * 8, "bilinear", "center") + mask = mask.view(mask.shape[0], mask.shape[2] // 8, 8, mask.shape[3] // 8, 8).permute(0, 2, 4, 1, 3).reshape(mask.shape[0], -1, mask.shape[2] // 8, mask.shape[3] // 8) + mask = utils.resize_to_batch_size(mask, noise.shape[0]) + return torch.cat((image, mask), dim=1) + def encode_adm(self, **kwargs): return kwargs["pooled_output"] diff --git a/comfy/model_detection.py b/comfy/model_detection.py index b98820d8..008e4b19 100644 --- a/comfy/model_detection.py +++ b/comfy/model_detection.py @@ -137,6 +137,12 @@ def detect_unet_config(state_dict, key_prefix): dit_config = {} dit_config["image_model"] = "flux" dit_config["in_channels"] = 16 + patch_size = 2 + dit_config["patch_size"] = patch_size + in_key = "{}img_in.weight".format(key_prefix) + if in_key in state_dict_keys: + dit_config["in_channels"] = state_dict[in_key].shape[1] // (patch_size * patch_size) + dit_config["out_channels"] = 16 dit_config["vec_in_dim"] = 768 dit_config["context_in_dim"] = 4096 dit_config["hidden_size"] = 3072 diff --git a/comfy/sd.py b/comfy/sd.py index 95fc6d27..3dea043f 100644 --- a/comfy/sd.py +++ b/comfy/sd.py @@ -30,9 +30,12 @@ import comfy.text_encoders.genmo import comfy.model_patcher import comfy.lora +import comfy.lora_convert import comfy.t2i_adapter.adapter import comfy.taesd.taesd +import comfy.ldm.flux.redux + def load_lora_for_models(model, clip, lora, strength_model, strength_clip): key_map = {} if model is not None: @@ -40,6 +43,7 @@ def load_lora_for_models(model, clip, lora, strength_model, strength_clip): if clip is not None: key_map = comfy.lora.model_lora_keys_clip(clip.cond_stage_model, key_map) + lora = comfy.lora_convert.convert_lora(lora) loaded = comfy.lora.load_lora(lora, key_map) if model is not None: new_modelpatcher = model.clone() @@ -433,6 +437,8 @@ def load_style_model(ckpt_path): keys = model_data.keys() if "style_embedding" in keys: model = comfy.t2i_adapter.adapter.StyleAdapter(width=1024, context_dim=768, num_head=8, n_layes=3, num_token=8) + elif "redux_down.weight" in keys: + model = comfy.ldm.flux.redux.ReduxImageEncoder() else: raise Exception("invalid style model {}".format(ckpt_path)) model.load_state_dict(model_data)