
    ti/                         d dl mZ d dlmZ d dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d	 Zdd
Zd Z G d d      Z G d d      Zy)    N)Image)AutoTokenizer)AutoencoderKL)snapshot_download)ZImageTransformerMLX)TextEncoderMLX)
apply_lorac                    | \  }}}|\  }}}t        j                  |||z         }t        j                  |||z         }	t        j                  |||z         }
t        j                  |d d d d f   |||f      }t        j                  |	d d d d f   |||f      }t        j                  |
d d d d f   |||f      }t        j                  |||gd      j	                  dd      S )Naxis   )mxarangebroadcast_tostackreshape)sizestartd0d1d2s0s1s2ijkgrid_igrid_jgrid_ks                 8/Volumes/fast/ai/experiments/MLX_z-image/mlx_pipeline.pycreate_coordinate_gridr#      s    JBBJBB
		"b2gA
		"b2gA
		"b2gA__Qq$}-B|<F__QtQ}-B|<F__QtT1}-B|<F88VVV,26>>r1EE    c                 8    ||z
  ||z
  z  }|||z  z
  }| |z  |z   S N )image_seq_lenbase_seq_lenmax_seq_len
base_shift	max_shiftmbs          r"   calculate_shiftr/      s5    	Z	K,$>?AQ%%A1q  r$   c                    t         j                  j                  | d      }i }t         j                  j                  |      rt	        d|        t        |d      5 }t        j                  |      }d d d        t        t        t        d   j                                           }|D ]z  }t         j                  j                  | |      }t	        d| d       |j                  t        j                  |             t        t        d      sgt        j                          | |S t         j                  j                  | d      }t         j                  j                  |      rt        j                  |      }|S d	d l}	|	j!                  t         j                  j                  | d
            }
|
D ]&  }|j                  t        j                  |             ( |S # 1 sw Y   oxY w)Nmodel.safetensors.index.jsonz,   [Loader] Detected sharded weights index: r
weight_mapz   [Loader] Loading shard: ...clear_cachemodel.safetensorsr   z*.safetensors)ospathjoinexistsprintopenjsonloadsortedlistsetvaluesupdater   hasattrr5   glob)
model_path
index_pathweightsf
index_datashard_files
shard_file
shard_pathsingle_pathrE   filess              r"   load_sharded_weightsrP   %   se   j*HIJG	ww~~j!<ZLIJ*c"a1J #T#j&>&E&E&G"HIJ%Jj*=J/
|3?@NN277:./r=)2>>+;	 & N ggll:/BC77>>+&ggk*G N	 IIbggll:GHErwwqz* N# #"s   GG)c                   Z    e Zd ZddedefdZddedefdZdedej                  fd	Z
d
 Zy)MLXFlowMatchEulerSchedulershiftuse_dynamic_shiftingc                 .    || _         || _        d | _        y r&   )rS   rT   	timesteps)selfrS   rT   s      r"   __init__z#MLXFlowMatchEulerScheduler.__init__C   s    
$8!r$   Nnum_inference_stepsmuc                     t        j                  dd|dz         }| j                  r|| j                  ||      }t	        j
                  |      j                  t        j                        | _        y )N      ?           )	nplinspacerT   _time_shiftr   arrayastypefloat32rV   )rW   rY   rZ   tss       r"   set_timestepsz(MLXFlowMatchEulerScheduler.set_timestepsH   sY    [[c#6#:; $$!!"b)B",,RZZ8r$   tc                     |dkD  }t        j                  |      }t        j                  |      t        j                  |      d||   z  dz
  z   z  ||<   |S )Nr   r^   )r_   
zeros_likeexp)rW   rZ   rg   maskress        r"   ra   z&MLXFlowMatchEulerScheduler._time_shiftQ   sM    1ummAFF2J"&&*AdGa"@AD	
r$   c                 b    | j                   |   }| j                   |dz      }||z
  }|||z  z   }|S )Nr^   )rV   )rW   model_outputtimestep_idxsamplet_currt_prevdtprev_samples           r"   stepzMLXFlowMatchEulerScheduler.stepY   sA    -q 01f_rL00r$   )      @Tr&   )__name__
__module____qualname__floatboolrX   intrf   r_   ndarrayra   ru   r'   r$   r"   rR   rR   B   sD    e  
9 9% 9e 

 r$   rR   c                   "    e Zd Z	 	 	 ddZddZy)ZImagePipelinec                    || _         || _        || _        || _         || _        || _        t        j                  j                  | j                         sZt        d       dt        j                  d<   t        d| j                   d       	 t        | j                  | j                          y y # t        $ rM}t        d| d       d	t        j                  d<   t        | j                  | j                          Y d }~y d }~ww xY w)
Nz-Enabling High-Speed Download (hf_transfer)...1HF_HUB_ENABLE_HF_TRANSFERzDownloading base model from r4   )repo_id	local_dirzHigh-Speed download failed (z%). Falling back to standard download.0)
rF   text_encoder_pathr   r7   r8   r:   r;   environr   	Exception)rW   rF   r   r   es        r"   rX   zZImagePipeline.__init__h   s     %!2$!2ww~~doo.AC69BJJ230cBCS!$,,$//R /  S4QC7\]^:=

67!$,,$//RR	Ss   !B/ /	D8AD  DNc           
      ,  567 t        j                  d       t        d| d| d|        t        j                         }t        j                         }	t        ddd       t        j
                  j                  | j                  d	      }
t        j                  |
d
      }t        j
                  j                  | j                  d      }t        |d      5 }t        j                  |      }d d d        t              }t        j
                  j                  | j                  d      }t        j
                  j                  |      r8t        ddd       t!        j"                  |dd       |j%                  |       ndt        ddd       t'        | j                        }|j%                  t)        |j+                                      ~t!        j"                  |dd       t        j,                  |       d|dg}	 |j/                  |dd      } ||dddd      } |t        j0                  |d               }t        j,                  |       t3        j0                  |      }|j4                  d    dz  }|dkD  r;t3        j6                  |t3        j8                  |d d dd d d f   |d      gd      }t        j0                  |      j;                  t         j<                        }~~t        j>                          tA        jB                          t        dt        j                         |	z
  d d!       t        j                         }	t        j
                  j                  | j                  d"      }t        d#dd       t        t        j
                  j                  |d      d      5 }t        j                  |      }d d d        tE              7t!        j"                  7dd       t        j
                  j                  t        j
                  j                  |d$            r5t'        |      }7j%                  t)        |j+                                      ~n/7j%                  t        j
                  j                  |d             |r't        d%dd       tG        7||&      7t        d'       7j-                          t        dt        j                         |	z
  d d!       t        d(d)*       tI        d+d,      }t2        jJ                  jM                  dd-|d.z  |d.z        j;                  t2        jN                        }|dt2        jJ                  jQ                  |       t2        jJ                  jM                  dd-|d.z  |d.z        j;                  t2        jN                        }t        j0                  |      j;                  t         j<                        }tS        |j4                  d/   d/z  |j4                  d0   d/z  z        }|jU                  ||1       |j4                  d   } |d.z  d/z  |d.z  d/z  c56t        j0                  tW        d56f| dz   ddf      jY                  dd0      d          j;                  t         j<                        }!t        j0                  tW        | ddfd2      jY                  dd0      d          j;                  t         j<                        }"t        j6                  |!|"gd      }#7j[                  |#      \  }$}%|$j;                  t         j<                        }$|%j;                  t         j<                        }%t         j\                  567fd3       }&t        j                         }'t_        |      D ]  }(t        j                         })|j`                  |(   }*d4|*z
  d    j;                  t         j<                        }+ |&||+||!|"|$|%      },|jc                  |,|(|      }t        j,                  |       t        d5|(dz    d6| d7t        j                         |)z
  d d8        t        d9t        j                         |'z
  |z  d d:       t        d;dd       t        j                         }-7~~&~$~%t_        d0      D ]*  }.t        j>                          tA        jB                          , t        j
                  j                  | j                  d<      }/td        jf                  jh                  jk                         rd=nd>}0tm        j                  |/      jo                  |0      }1|1jq                          te        jr                  t3        j0                  |j;                  t         jN                                    jo                  |0      }2|2|1jt                  jv                  z  ty        |1jt                  d?d@      z   }2te        jz                         5  |1j}                  |2      j~                  }3d d d        3d/z  dAz   j                  dd      j                         j                  dd/d0d      j                         }3t        j                  |3d   dBz  j                         j;                  dC            }4t        dt        j                         |-z
  d d!       t        dDt        j                         |z
  d d8       |4S # 1 sw Y   	xY w#  |}Y xY w# 1 sw Y   2xY w# 1 sw Y   xY w)ENr   zPipeline Started | Size: xz
 | Steps: z[Phase 1] Text Encoding... T)endflush	tokenizer)trust_remote_codezconfig.jsonr2   r6   z(Fast Load: Pre-Quantized)...       )bits
group_sizez'(Slow Load: On-the-fly Quantization)...user)rolecontentF)tokenizeadd_generation_prompt
max_lengthi   r_   )paddingr   
truncationreturn_tensors	input_idsr^   r   r   zDone (z.2fzs)transformerz-[Phase 2] Loading Transformer (4-bit GS32)...r1   z[Phase 2.5] Applying LoRA...)scaleDonez1[Phase 3] Denoising (MLX Scheduler & Compiled)...
)r   rv   )rS   rT            r   )rZ   )r^   r   r   c           
      H   | j                   \  }}}	}
| j                  |dddd      j                  ddddddd      j                  dd|dz        } |||||||d 	      }|j                  dddd|      j                  ddddddd      j                  d||	|
       }|S )
Nr^   r   r      r      r   r   )cap_mask)shaper   	transpose)r   rg   featsi_posc_poscossinBCHW
x_reshapedout
noise_predH_tokW_tokmodels                 r"   step_fnz(ZImagePipeline.generate.<locals>.step_fn   s    JAq!Q1aE1eQ?II!QPQSTVWYZ\]^ffghjlnorsnstJ
AueUCtTC++aE5!QBLLQPQSTVWYZ\]_`aiijkmnpqstuuJr$   r\   z   Step /z: sz   Avg Speed: z s/itz[Phase 4] Decoding...vaempscpushift_factorr]         ?   uint8u   ✨ Pipeline Finished in )Gr   set_cache_limitr;   timer7   r8   r9   rF   r   from_pretrainedr   r<   r=   r>   r   r:   nnquantizeload_weightsrP   r@   itemsevalapply_chat_templaterb   r_   r   concatenaterepeatrc   bfloat16r5   gccollectr   r	   rR   randomrandnrd   seedr/   rf   r#   r   prepare_ropecompilerangerV   ru   torchbackendsr   is_availabler   toenable_tiling
from_numpyconfigscaling_factorgetattrno_graddecoderp   clampr   permutenumpyr   	fromarrayround)8rW   promptwidthheightstepsr   	lora_path
lora_scaleglobal_startt_starttokenizer_pathr   te_config_pathrI   	te_configtext_encoderquantized_weights_path
te_weightsmessages
prompt_fmtinputsprompt_embedscap_feats_nppadcap_feats_mx
trans_pathr   rH   	scheduler
latents_nplatentsrZ   	total_lenimg_poscap_posunified_pos_all
cos_cached
sin_cachedr   denoise_startr   
step_startrq   t_inputr   t_dec_vae_pathdevicer   
latents_ptimage	pil_imager   r   r   s8                                                        @@@r"   generatezZImagePipeline.generate   s   
1)%&E7KLyy{
 ))+*DAdoo{C!11.TXY	d&<&<mL.#&!		!I ' &i0!#d.D.DFY!Z77>>0114HKK1<%%&<= ;#TR-d.D.DEJ%%d:+;+;+=&>?KK1<
#78	 "66x%gk6lJ :|X\mqr$RXXf[.A%BC
xx.""1%%+72>><<XY[][^`aXaKbdgnoAp2q78$:Lxx-44R[[A)



tyy{W,S145
 ))+WW\\$//=A
=CtT"'',,z=93?1YYq\F @ %V,
Eb177>>"'',,z3QRS*:6GtGMMO45rww||J8KLM
 0s$GuizBE&M

tyy{W,S145
 	AM.StT	YY__QFaK!DKKBJJW
IINN4 B!UaZHOOPRPZPZ[J((:&--bkk:gmmA.!3a8HA8MNO"- &&q)	!)EQJ1+<u(("Aue#4y1}a6KLTTUWYZ[\`accicijljujucv 	((19a2CYOWWXZ\]^_cdellKK ..'7);!D!&!3!3O!D
J&&r{{3
&&r{{3
		 
	 		uAJ((+FV|T*11"++>G !'<'S]_ijJnnZG<GGGGHQUG1UG2diikJ.Fs-K1MN  			m ;uDSIOP
 	%3d;		9gz:qANNJJL  77<<7..,,99;++H588@%%bhhw~~bjj/I&JKNNvV
 3::#<#<<

Tbdg@hh
]]_JJz*11E  S''1-113;;Aq!QGMMOOOU1X^$:$:$<$C$CG$LM	tyy{U*3/r23)$))+*DS)IKLE '&2	 J2 @?L _s0   k&k3 7k=8l
&k03k:=l
l)zZ-Image-Turbo-MLXzZ-Image-Turbo-MLX/text_encoderzuqer1244/MLX-z-image)   r  	   *   Nr\   )rw   rx   ry   rX   r  r'   r$   r"   r   r   g   s    /#C/S2rr$   r   )   i   r   gffffff?)mlx.corecorer   mlx.nnr   r   r_   r   r=   r7   r   r   PILr   transformersr   	diffusersr   huggingface_hubr   mlx_z_imager   mlx_text_encoderr   
lora_utilsr	   r#   r/   rP   rR   r   r'   r$   r"   <module>r!     sY         	  	  & # - , + !	F!: JL Lr$   