
    
3ju@                     f   S SK r S SKrS SKJr  S SKJr  S SKrS SKJr	  \R                  R                  5       (       a	  S SKJs  Jr  SSKJrJrJrJrJr  SSKJr  SSKJrJrJr  SS	KJrJr  \" \5      rS
rSr \ " S S5      5       r!S\RD                  RF                  S\S\$\%\4   SS4S jr&S\RD                  RF                  S\$\%\4   SS4S jr' " S S\5      r( " S S\5      r) " S S\RT                  RV                  5      r, " S S5      r- " S S\RT                  RV                  5      r. " S S5      r/\" S S!9S"\0\1   S#\0\1   S$\1S%\1S\2\2\1      4
S& j5       r3\S'\Rh                  S$\1S(\	Rj                  Rl                  S\Rh                  4S) j5       r7S*\RD                  RF                  S+\%S\RD                  RF                  \2\RD                  RF                     -  4S, jr8S*\RD                  RF                  S+\%S\RD                  RF                  \2\RD                  RF                     -  4S- jr9g).    N)	dataclass)Type   )ContextParallelConfigContextParallelInputContextParallelModelPlanContextParallelOutputgather_size_by_comm)
get_logger)lru_cache_unless_exportmaybe_allow_in_graphunwrap_module   )HookRegistry	ModelHookzcp_input---{}zcp_output---{}c                   N    \ rS rSr% Sr\\\4   \S'   Sr	\
\S'   SS\4S jjrSrg)	ModuleForwardMetadata-   Ncached_parameter_indices_cls
identifierc                    U=(       d    0 nX;   a  X1   SS 4$ U R                   b5  U R                   R                  US 5      nUc  [        SU S35      eX$   SU4$ U R                  c  [        S5      e[	        [
        R                  " U R                  R                  5      R                  R                  5       5      nUSS  n[        U5       VVs0 s H  u  pgXv_M	     snnU l         XR                   ;  a  [        SU S35      eU R                   U   nU[        U5      :  a  [        SU S	[        U5       S
35      eX$   SU4$ s  snnf )NTzParameter 'z' not found in cached indices.Fz$Model class is not set for metadata.r   z4' not found in function signature but was requested.z	Expected z arguments but got .)r   get
ValueErrorr   listinspect	signatureforward
parameterskeys	enumeratelen)selfr   argskwargsindexr    iparams           Z/home/wildlama/miniconda3/lib/python3.13/site-packages/diffusers/hooks/context_parallel.py_get_parameter_from_args_kwargs5ModuleForwardMetadata._get_parameter_from_args_kwargs2   sP   2%tT11((41155j$GE} ;zl:X!YZZ;u,,99CDD'++DII,=,=>IINNPQ
^
BKJBW(XBWhaBW(X%:::{:,6jkll--j9CIy/B3t9+QOPP{E5(( )Ys   E)r   ) N)__name__
__module____qualname____firstlineno__r   dictstrint__annotations__r   r   r+   __static_attributes__r-       r*   r   r   -   s0    /3d38n3D$)# ) )r7   r   moduleparallel_configplanreturnc           	         [         R                  SUR                   SU 35        UR                  5        GHJ  u  p4[	        X5      n[        U[        5      (       d  U/n[         R                  SU< S[        U5       S35        U H  n[        U[        5      (       a!  [        XA5      n[        R                  U5      nO[        U[        [        [        45      (       a^  [        U[        5      (       a  U/n[        S U 5       5      (       d  [        SU 35      e[!        XA5      n["        R                  U5      nO[        S[%        U5       35      e[&        R(                  " U5      n	U	R+                  Xx5        M     GMM     g	)
z"Apply context parallel on a model.z(Applying context parallel with CP mesh: z and plan: z*Applying ContextParallelHook to module_id=z identifying a total of z modulesc              3   B   #    U  H  n[        U[        5      v   M     g 7fN)
isinstancer	   .0xs     r*   	<genexpr>)apply_context_parallel.<locals>.<genexpr>f   s     WA:a)>??s   z?Expected all elements of cp_model_plan to be CPOutput, but got .Unsupported context parallel model plan type: N)loggerdebug_meshitems_get_submodule_by_namer?   r   r#   r2   ContextParallelSplitHook%_CONTEXT_PARALLEL_INPUT_HOOK_TEMPLATEformatr	   tupleallr   ContextParallelGatherHook&_CONTEXT_PARALLEL_OUTPUT_HOOK_TEMPLATEtyper   check_if_exists_or_initializeregister_hook)
r8   r9   r:   	module_idcp_model_plan	submodulemhook	hook_nameregistrys
             r*   apply_context_parallelr\   P   sS    LL;O<Q<Q;RR]^b]cde$(JJL 	*6=	)T**"IB	|C[\_`i\j[kkstuA-../OAHHS	M,A4+OPPm-BCC%2OMWWWW$'fgtfu%vww0PBII)T	 #QRVWdReQf!ghh#AA!DH""43  %1r7   c                    UR                  5        H  u  p#[        X5      n[        U[        5      (       d  U/nU H  n[        R
                  " U5      n[        U[        5      (       a  [        R                  U5      nOM[        U[        [        [        45      (       a  [        R                  U5      nO[        S[        U5       35      eUR                  U5        M     M     g )NrE   )rI   rJ   r?   r   r   rS   r2   rL   rM   r	   rN   rQ   r   rR   remove_hook)r8   r:   rU   rV   rW   rX   r[   rZ   s           r*   remove_context_parallelr_   p   s    $(JJL 	*6=	)T**"IA#AA!DH-..AHHS	M,A4+OPPBII)T	 #QRVWdReQf!ghh  +  %1r7   c                      ^  \ rS rSrS\S\SS4U 4S jjrS rS rS	 r	S
\
R                  S\S\
R                  4S jrSrU =r$ )rK      metadatar9   r;   Nc                 H   > [         TU ]  5         Xl        X l        S U l        g r>   )super__init__rb   r9   module_forward_metadatar$   rb   r9   	__class__s      r*   re   !ContextParallelSplitHook.__init__   s!     .'+$r7   c                 L    [        U5      R                  n[        US9U l        U$ )N)r   )r   rh   r   rf   )r$   r8   clss      r*   initialize_hook(ContextParallelSplitHook.initialize_hook   s$    F#--'<#'F$r7   c           	         [        U5      nU R                  R                  5        GH  u  pV[        U[        5      (       a  UR
                  (       a  M.  U R                  R                  XTU5      u  pxn	Uc  MR  [        U[        R                  5      (       a  U R                  Xv5      nO[        U[         [        45      (       a  [        U5      [        U5      :w  a$  [        S[        U5       S[        U5       S35      e/ n
[        U5       HX  u  p[        R                  " U5      (       a'  Xk   R
                  (       d  U R                  XU   5      nU
R!                  U5        MZ     U
nO[        S[#        U5       35      eU(       a  XsU'   GMk  U	b  U	[        U5      :  a  XtU	'   GM  [        SU S35      e   [        U5      U4$ )Nz"Expected input model plan to have  elements, but got r   zUnsupported input type: z9An unexpected error occurred while processing the input 'z'. Please open an issue at https://github.com/huggingface/diffusers/issues and provide a minimal reproducible example along with the full stack trace.)r   rb   rI   r?   r   split_outputrf   r+   torchTensor_prepare_cp_inputrN   r#   r   r"   	is_tensorappendrR   )r$   r8   r%   r&   	args_listnamecpm	input_valis_kwargr'   sharded_input_valr(   rB   s                r*   pre_forward$ContextParallelSplitHook.pre_forward   s   J	,,.ID#3449I9I *.)E)E)e)e*&I   )U\\22 229B	Ie}55y>SX-$<S^<LL_`cdg`h_iijk  %'!%i0DAq))#&2E2E 221!f=%,,Q/ 1 .	 #;DO;L!MNN(t"us9~'=#,%  OPTv V? @ G /R Y''r7   c           	      T   [        U[        R                  5      n[        U[        [        45      =(       a    [        S U 5       5      nU(       d  U(       d  [        S[        U5       S35      eU(       a  U/O
[        U5      nU R                  R                  5        Hp  u  pV[        U[        5      (       a  UR                  (       d  M-  U[        U5      :  a  [        SU S[        U5       S35      eX%   nU R                  Xv5      nXrU'   Mr     U(       a  US   $ [	        U5      $ )Nc              3   V   #    U  H  n[        U[        R                  5      v   M!     g 7fr>   r?   rq   rr   r@   s     r*   rC   8ContextParallelSplitHook.post_forward.<locals>.<genexpr>   s$     Bohncd:aQVQ]Q]C^C^hn   ')CExpected output to be a tensor or a list/tuple of tensors, but got r   zIndex z$ out of bounds for output of length r   )r?   rq   rr   r   rN   rO   r   rR   rb   rI   r   rp   r#   rs   )r$   r8   outputrt   is_tensor_listr'   rx   current_outputs           r*   post_forward%ContextParallelSplitHook.post_forward   s    vu||4	#FT5M:osBohnBo?obcghncobppqrss&&DL----/JEc#788@P@PF# 6%0TUXY_U`Taab!cdd#]N!33NHN*5M 0 &vay85=8r7   rB   cp_inputc                     UR                   bT  UR                  5       UR                   :w  a6  [        R                  SUR                    SUR                  5        S35        U$ U R                  R
                  (       d  U R                  R                  (       a4  [        R                  XR                  U R                  R                  5      $ [        R                  XR                  U R                  R                  5      $ )NzExpected input tensor to have z dimensions, but got z' dimensions, split will not be applied.)expected_dimsdimrF   warning_oncer9   ulysses_anythingring_anythingPartitionAnythingShardershard_anything	split_dim_flattened_meshEquipartitionShardershard)r$   rB   r   s      r*   rs   *ContextParallelSplitHook._prepare_cp_input   s    !!-!%%'X=S=S2S01G1G0HH]^_^c^c^e]f  gN  O H##448L8L8Z8Z/>>))4+?+?+O+O  (--a1C1CTEYEYEiEijjr7   )rb   rf   r9   )r.   r/   r0   r1   r   r   re   rl   r|   r   rq   rr   r   rs   r6   __classcell__rh   s   @r*   rK   rK      s`    ,!9 ,La ,fj ,
,(\9&k5<< k;O kTYT`T` k kr7   rK   c                   >   ^  \ rS rSrS\S\SS4U 4S jjrS rSrU =r	$ )	rP      rb   r9   r;   Nc                 :   > [         TU ]  5         Xl        X l        g r>   )rd   re   rb   r9   rg   s      r*   re   "ContextParallelGatherHook.__init__   s     .r7   c                 ^   [        U[        R                  5      nU(       a  U/nOJ[        U[        [        45      (       a  [        S U 5       5      (       d  [        S[        U5       S35      e[        U5      n[        U5      [        U R                  5      :w  a.  [        S[        U R                  5       S[        U5       S35      e[        U R                  5       H  u  pEUc  M
  U R                  R                  (       d  U R                  R                  (       a;  [        R                  X$   UR                   U R                  R"                  5      X$'   M{  [$        R'                  X$   UR                   U R                  R"                  5      X$'   M     U(       a  US   $ [	        U5      $ )Nc              3   V   #    U  H  n[        U[        R                  5      v   M!     g 7fr>   r   r@   s     r*   rC   9ContextParallelGatherHook.post_forward.<locals>.<genexpr>   s!     ;hag\]Jq%,,<W<Wagr   r   r   zExpected output to have ro   r   )r?   rq   rr   r   rN   rO   r   rR   r#   rb   r"   r9   r   r   r   unshard_anything
gather_dimr   r   unshard)r$   r8   r   rt   r(   rx   s         r*   r   &ContextParallelGatherHook.post_forward   sR   vu||4	XFVdE]33;hag;h8h8hbcghncobppqrssfv;#dmm,,7DMM8J7KK^_bci_j^kklmnn.FA{##448L8L8Z8Z4EEIs~~t/C/C/S/S	 188Is~~t/C/C/S/S	 / &vay85=8r7   )rb   r9   )
r.   r/   r0   r1   r   r   re   r   r6   r   r   s   @r*   rP   rP      s*    /!9 /La /fj /
9 9r7   rP   c                   4    \ rS rSr\S 5       r\S 5       rSrg)AllGatherFunction   c                     X l         X0l        [        R                  R	                  U5      U l        [        R                  R                  U5      U l        [        R                  " XUS9$ )Ngroup)
r   r   rq   distributedget_world_size
world_sizeget_rankrankfuncolall_gather_tensor)ctxtensorr   r   s       r*   r   AllGatherFunction.forward   sO    	**99%@$$--e4''5AAr7   c                 v    [         R                  " XR                  U R                  S9nX R                     S S 4$ Nr   )rq   chunkr   r   r   )r   grad_outputgrad_chunkss      r*   backwardAllGatherFunction.backward  s.    kk+~~377K88$dD00r7   r-   N)r.   r/   r0   r1   staticmethodr   r   r6   r-   r7   r*   r   r      s*    B B 1 1r7   r   c            	       $   \ rS rSr\S\R                  S\S\R                  R                  R                  S\R                  4S j5       r\S\R                  S\S\R                  R                  R                  S\R                  4S j5       rSrg	)
r   i  r   r   meshr;   c                     UR                  5       U   UR                  5       -  S:X  d   S5       eUR                  UR                  5       US9[        R                  R	                  UR                  5       5         $ )Nr   zHTensor size along dimension to be sharded must be divisible by mesh sizer   )sizer   rq   r   r   	get_grouprk   r   r   r   s       r*   r   EquipartitionSharder.shard  sj     {{}S!DIIK/14 	
V	
4 ||DIIKS|1%2C2C2L2LT^^M]2^__r7   c                 n    UR                  5       n[        R                  XUR                  5       5      nU$ r>   )
contiguousr   applyr   r   s       r*   r   EquipartitionSharder.unshard  s.    ""$"((dnn6FGr7   r-   N)r.   r/   r0   r1   classmethodrq   rr   r4   r   device_mesh
DeviceMeshr   r   r6   r-   r7   r*   r   r     s    
`5<< 
`c 
`9J9J9V9V9a9a 
`fkfrfr 
` 
` U\\  5;L;L;X;X;c;c hmhtht  r7   r   c                       \ rS rSr\S\R                  S\S\R                  R                  4S j5       r\S 5       rSrg)	AllGatherAnythingFunctioni"  r   r   r   c                     X l         X0l        [        R                  " U5      U l        [        R
                  " U5      U l        [        XU5      nU$ r>   )r   r   distr   r   r   r   _all_gather_anything)r   r   r   r   gathered_tensors        r*   r   !AllGatherAnythingFunction.forward#  s@    	,,U3=='.vEBr7   c                 v    [         R                  " XR                  U R                  S9nX R                     S S 4$ r   )rq   tensor_splitr   r   r   )r   r   grad_splitss      r*   r   "AllGatherAnythingFunction.backward,  s2     ((nn#''R88$dD00r7   r-   N)r.   r/   r0   r1   r   rq   rr   r4   r   r   r   r   r   r6   r-   r7   r*   r   r   "  sM    U\\  D<L<L<W<W   1 1r7   r   c            	       $   \ rS rSr\S\R                  S\S\R                  R                  R                  S\R                  4S j5       r\S\R                  S\S\R                  R                  R                  S\R                  4S j5       rSrg	)
r   i4  r   r   r   r;   c                 ,   UR                  5       U   UR                  5       :  d-   SUR                  5        SU SUR                  5        S35       eUR                  UR                  5       US9[        R                  " UR	                  5       5         $ )NzCannot shard tensor of size z along dim z across mesh of size r   r   )r   r   r   r   r   r   s       r*   r   'PartitionAnythingSharder.shard_anything5  s     {{}S!TYY[0 	
*6;;=/SEI^_c_h_h_j^kklm	
0
 ""499;C"8t~~GW9XYYr7   c                 n    UR                  5       n[        R                  XUR                  5       5      nU$ r>   )r   r   r   r   r   s       r*   r   )PartitionAnythingSharder.unshard_anything@  s0     ""$*00dnn>NOr7   r-   N)r.   r/   r0   r1   r   rq   rr   r4   r   r   r   r   r   r6   r-   r7   r*   r   r   4  s    Z\\Z(+Z383D3D3P3P3[3[Z	Z Z \\(+383D3D3P3P3[3[	 r7   r   @   )maxsizeshapegather_dimsr   r   c                     / n[        U5       H9  n[        [        R                  " U 5      5      nX   Xb'   UR	                  U5        M;     U$ r>   )ranger   copydeepcopyru   )r   r   r   r   gather_shapesr(   
rank_shapes          r*   _fill_gather_shapesr   I  sH    M:$--./
%.
Z(  r7   r   r   c           	         [         R                  " US9nU R                  5       n U R                  nXA   n[	        XR5      n[        [        U5      [        U5      X5      nU Vs/ s H,  n[        R                  " X@R                  U R                  S9PM.     nn[         R                  " XUS9  [        R                  " XS9n	U	$ s  snf )Nr   )devicedtyper   )r   r   r   r   r
   r   rN   rq   emptyr   r   
all_gathercat)
r   r   r   r   r   rank_dimr   r   gathered_tensorsr   s
             r*   r   r   S  s    $$51J FLLEzH%h6K'eeK6H#ZMbopboY^E--v||TbopOO$E:ii 0:O	 qs   #3Cmodelrw   c                 X    UR                  S5      S:  a  [        S5      e[        X5      $ )N*r   z.Wildcard '*' can only be used once in the name)countr   _find_submodule_by_name)r   rw   s     r*   rJ   rJ   e  s)    zz#IJJ"5//r7   c                    US:X  a  U $ SU;   a  UR                  SS5      OUS4u  p#US:X  au  [        U [        R                  R                  5      (       d  [        S5      e/ nU  H7  n[        XS5      n[        U[        5      (       d  U/nUR                  U5        M9     U$ [        X5      (       a  [        X5      n[        XS5      $ [        SU SU R                  R                   S35      e)N r   r   r   z-Wildcard '*' can only be used with ModuleList'z' is not a submodule of ')splitr?   rq   nn
ModuleListr   r   r   extendhasattrgetattrrh   r.   )r   rw   
first_atomremaining_name
submodulesrW   subsubmoduless          r*   r   r   k  s    rz7:d{C!3r
JS%!4!455LMM
I3INMmT22!.m,	 
 5%%2I*9EEq,EeooF^F^E__`abbr7   ):r   r   dataclassesr   typingr   rq   torch.distributedr   r   is_available)torch.distributed._functional_collectives_functional_collectivesr   models._modeling_parallelr   r   r   r	   r
   utilsr   utils.torch_utilsr   r   r   hooksr   r   r.   rF   rL   rQ   r   r   Moduler2   r3   r\   r_   rK   rP   autogradFunctionr   r   r   r   rN   r4   r   r   rr   r   r   r   rJ   r   r-   r7   r*   <module>r     sj     !     	!!##>>   \ \ * 
H	(7 %)9 & ) ) )D4HHOO4*4 s,,
-4 
	4@,EHHOO ,4E]@];^ ,cg ,"Xky Xkv9	 9D1// 1 *1 7 7 1$ * $uSz c
  Z] bfgklogpbq  %  C @P@P@[@[ `e`l`l  "0%((// 0 0SWX]X`X`XgXgShAh 0c588?? c# c%((//TXY^YaYaYhYhTiBi cr7   