ó
    oM‡j3  ã                   ó  • S SK r SSKJr  SSKJr  \" \5      rSr " S S5      r " S S	5      r	S
\
SSSS4S jrS\ R                  R                  S\S\4S jrS\S\4S jrS\ R                  R                  S\S\SS4S jrg)é    Né   )ÚTensorParallelConfig)Ú
get_logger)ÚcudaÚneuronc                   ó&   • \ rS rSrSrSSS jjrSrg)ÚPackedColwiseParallelé   a´  Column-wise sharding for fused projections with heterogeneous block structure.

`blocks` is a list of proportional integers whose sum divides the weight's row count. For example, `[1, 1]` for a
SwiGLU gate+linear projection (two equal halves) or `[1, 1, 1, 3, 3]` for a Q+K+V+gate+linear projection with
`mlp_ratio=3`. If `blocks` is `None`, the Linear module must carry a `_tp_packed_col_blocks` attribute set during
model `__init__`.
Nc                 ó   • Xl         g ©N©Úblocks©Úselfr   s     Ú­C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\diffusers/hooks/tensor_parallel.pyÚ__init__ÚPackedColwiseParallel.__init__#   ó   € Ø�ó    r   r   ©r   zlist[int] | None©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__static_attributes__© r   r   r	   r	      s   † ñ÷ñ r   r	   c                   ó&   • \ rS rSrSrSSS jjrSrg)ÚPackedRowwiseParallelé'   aO  Row-wise sharding for fused projections with heterogeneous block structure.

`blocks` describes the input-column partition of the fused Linear (e.g. `[1, 3]` when the input concatenates an
attention projection and an MLP projection with `mlp_ratio=3`). If `blocks` is `None`, the module must carry a
`_tp_packed_row_blocks` attribute.
Nc                 ó   • Xl         g r   r   r   s     r   r   ÚPackedRowwiseParallel.__init__/   r   r   r   r   r   r   r   r   r   r    r    '   s   † ñ÷ñ r   r    Ú
total_sizer   z	list[int]Úreturnc                 óš   • [        U5      nX-  S:w  a  [        SU  SU SU SU SU  S35      eX-  nU Vs/ s H  oDU-  PM	     sn$ s  snf )aK  Convert proportional block counts to absolute sizes.

`blocks` is a list of positive integers interpreted as proportional weights. Their sum must divide `total_size`
evenly. Returns a list of absolute sizes that sum to `total_size`. For example, `_blocks_to_block_sizes(1152, [1,
1, 1, 3, 3])` returns `[128, 128, 128, 384, 384]`.
r   zCannot split z into proportional blocks z: sum(z)=z does not divide Ú.)ÚsumÚ
ValueError)r$   r   ÚtotalÚunitÚbs        r   Ú_blocks_to_block_sizesr-   3   sw   € ô �‹K€EØÑ˜QÓÜØ˜J˜<Ð'AÀ&Àð JØ�(˜"˜U˜GÐ#4°Z°LÀðCó
ð 	
ð Ñ€DÙ$Ó%šf˜�ŒH™fÑ%Ð%ùÒ%s   ·AÚmodelÚtp_planc           
      óÌ  • 0 n/ nUR                  5        GH2  u  pEUR                  S5      S:”  a  [        SU S35      eSU;   aÅ  UR                  S5      u  pgnU n	UR	                  S5      R                  S5       H  n
[        Xš5      n	M     [        U	[        R                  R                  5      (       d8  [        SU SUR	                  S5       SU	R                  R                   S35      eUR	                  S5      [        U	5      pËOX@/pËU H4  n[        U5      nXâ;  a  U0 4X.'   UR                  U5        XRU   S   U'   M6     GM5     U Vs/ s H  oâU   PM	     sn$ s  snf )	ap  Group a flat `_tp_plan` into per-block `(submodule, {relative_path: style})` plans.

Each glob is split at its single `*`; the prefix must resolve to a `ModuleList` and the suffix is the per-element
key. Grouping by block lets the caller issue one `parallelize_module` call per block, which `RowwiseParallel` needs
to attach its input redistribution at the block boundary.

Example: when `transformer_blocks` is a `ModuleList` of length 2, the input `{"transformer_blocks.*.ff.linear_out":
"rowwise"}` returns `[(transformer_blocks[0], {"ff.linear_out": "rowwise"}), (transformer_blocks[1],
{"ff.linear_out": "rowwise"})]`.
Ú*é   z=Wildcard '*' can only be used once in a `_tp_plan` key, got 'z'.r'   z`_tp_plan` wildcard 'z(' must expand over a `ModuleList`, but 'z' resolved to ')ÚitemsÚcountr)   Ú	partitionÚstripÚsplitÚgetattrÚ
isinstanceÚtorchÚnnÚ
ModuleListÚ	__class__r   ÚlistÚidÚappend)r.   r/   ÚgroupedÚorderÚpatternÚstyleÚprefixÚ_ÚsuffixÚ	containerÚatomÚrelativer   ÚblockÚkeys                  r   Ú_resolve_tp_planrM   D   sf  € ð !#€GØ€Eà!Ÿ-™-Ÿ/‰ˆØ�=‰=˜Ó Ó!ÜÐ\Ð]dÐ\eÐegÐhÓiÐià�'‹>Ø '× 1Ñ 1°#Ó 6ÑˆF�vØˆIØŸ™ SÓ)×/Ñ/°Ö4�Ü# IÓ4’	ñ 5ä˜i¬¯©×)<Ñ)<×=Ñ=Ü Ø+¨G¨9ð 5ØŸ™ SÓ)Ð*¨/¸)×:MÑ:M×:VÑ:VÐ9WÐWYð[óð ð  &Ÿ|™|¨CÓ0´$°y³/‘fà&¨�fãˆEÜ�U“)ˆCØÓ!Ø % r˜{�‘Ø—‘˜SÔ!Ø(-�C‰L˜‰O˜HÓ%ô ñ% *ñ2 %*Ó*¢E˜S�CŒL¡EÑ*Ð*ùÒ*s   ÅE!Úrelative_planc                 óþ  ^^	^
^^^^• SSK Jm  SSKJm	Jm
JmJm  SSKJmJ	m  S[        ST4UU	U
UUU4S jjnS[        ST4U	U
UUUU4S jjnS	[        ST4U4S
 jjnS	[        ST4U4S jjn0 nU R                  5        H{  u  pgUS:X  a  U" U5      XV'   M  US:X  a  U" U5      XV'   M)  [        U[        5      (       a  U" U5      XV'   MJ  [        U[        5      (       a  U" U5      XV'   Mk  [        SU SU S35      e   U$ )ao  Map a `{relative_path: style}` plan to `parallelize_module` style instances.

Values may be plain strings (`"colwise"` / `"rowwise"`) or `PackedColwiseParallel` / `PackedRowwiseParallel` marker
instances. Returns `{relative_path: ColwiseParallel() | RowwiseParallel() | <packed impl>}`, each subclassed to
reject a sharded dim that is not divisible by the TP degree.
r   N)ÚDTensorÚ	ReplicateÚShardÚdistribute_tensor)ÚColwiseParallelÚRowwiseParallelÚmarkerr%   c                 óR   >^• U R                   m " UUUUUU4S jST5      nU" 5       $ )Nc                   ó,   >• \ rS rSrU UUUUU4S jrSrg)Ú=_styles.<locals>._make_packed_col.<locals>._PackedColwiseImplé|   c                 óŠ  >• Tb  TO[        US5      nUR                  5       nUR                  5       nUR                  5        Hý  u  pxT" XƒT" 5       /U R                  S9R                  5       n	[        U	R                  S   U5      n
/ SpËU
 HY  nXÖ-  S:w  a  [        SU SU SU SU S3	5      eXÖ-  nUR                  XœX^-  -   XÅS	-   U-  -    R                  5       5        XÍ-  nM[     [        R                  " USS
9nTR                  TR                  XóT" S5      /SS9UR                  S9nUR!                  UU5        Mÿ     g )NÚ_tp_packed_col_blocks©Úsrc_data_rankr   ú"Cannot shard packed block of size ú across ú tensor-parallel ranks: ú is not divisible by r'   r2   ©ÚdimF©Ú	run_check©Úrequires_grad©r8   Úget_local_rankÚsizeÚnamed_parametersr^   Úto_localr-   Úshaper)   r@   Ú
contiguousr:   ÚcatÚ	ParameterÚ
from_localrh   Úregister_parameter©r   ÚnameÚmoduleÚdevice_meshr   ÚrankÚtp_sizeÚ
param_nameÚparamÚfullÚblock_sizesÚpartsÚoffsetÚbsÚchunkÚlocalÚ
dist_paramrP   rQ   rR   Ú_blocksrS   r;   s                    €€€€€€r   Ú_partition_linear_fnÚR_styles.<locals>._make_packed_col.<locals>._PackedColwiseImpl._partition_linear_fn}   sp  ø€ Ø$+Ñ$7™¼WÀVÐMdÓ=e�Ø"×1Ñ1Ó3�Ø%×*Ñ*Ó,�ð *0×)@Ñ)@Ö)BÑ%�JÙ,Ø©Y«[¨MÈ×I[ÑI[ñç‘h“jð ô #9¸¿¹ÀA¹ÈÓ"O�KØ$&¨˜6Û)˜Ø™<¨1Ó,Ü",Ø"DÀRÀDÈÐQXÐPYÐYqØ#% $Ð&;¸G¸9ÀAð!Gó#ð ð !#¡˜ØŸ™ T°4±<Ñ*?À&ÐSTÉHÐX]ÑK]ÑB]Ð%^×%iÑ%iÓ%kÔlØ™šñ *ô "ŸIšI e°Ñ3�EØ!#§¡Ø×*Ñ*¨5ÁÀaÃ¸zÐUZÐ*Ð[Ø&+×&9Ñ&9ð ".ð "�Jð ×-Ñ-¨j¸*ÖEò) *Cr   r   N©r   r   r   r   r…   r   ©rP   rQ   rR   r„   rS   r;   s   €€€€€€r   Ú_PackedColwiseImplrY   |   s   ø† ÷Fõ Fr   r‰   r   )	rV   r‰   r„   rT   rP   rQ   rR   rS   r;   s	     @€€€€€€r   Ú_make_packed_colÚ!_styles.<locals>._make_packed_coly   s+   ù€ Ø—-‘-ˆ÷	Fô 	F ô 	Fñ: "Ó#Ð#r   c                 óR   >^• U R                   m " UUUUUU4S jST5      nU" 5       $ )Nc                   ó,   >• \ rS rSrU UUUUU4S jrSrg)Ú=_styles.<locals>._make_packed_row.<locals>._PackedRowwiseImpléž   c                 ó
  >• Tb  TO[        US5      nUR                  5       nUR                  5       nUR                  5        GH<  u  pxUS:X  aî  T" XƒT" 5       /U R                  S9R                  5       n	[        U	R                  S   U5      n
/ SpËU
 H`  nXÖ-  S:w  a  [        SU SU SU S	U S
3	5      eXÖ-  nUR                  U	S S 2XÅU-  -   XÅS-   U-  -   24   R                  5       5        XÍ-  nMb     [        R                  " USS9nTR                  TR                  XóT" S5      /SS9UR                  S9nO0TR                  T" XƒT" 5       /U R                  S9UR                  S9nUR!                  UU5        GM?     g )NÚ_tp_packed_row_blocksÚweightr]   r2   r   r_   r`   ra   rb   r'   rc   Fre   rg   ri   rt   s                    €€€€€€r   r…   ÚR_styles.<locals>._make_packed_row.<locals>._PackedRowwiseImpl._partition_linear_fnŸ   s¶  ø€ Ø$+Ñ$7™¼WÀVÐMdÓ=e�Ø"×1Ñ1Ó3�Ø%×*Ñ*Ó,�Ø)/×)@Ñ)@×)BÑ%�JØ! XÓ-Ù0Ø!±³°ÈT×M_ÑM_ñ ç"™(›*ð ô '=¸T¿Z¹ZÈ¹]ÈFÓ&S˜Ø(*¨A˜vÛ"-˜BØ!™|¨qÓ0Ü&0Ø&HÈÈÈHÐU\ÐT]Ð]uØ') dÐ*?À¸yÈð%Kó'"ð !"ð %'¡M˜EØ!ŸL™L¨ªa°À¹,Ñ1FÈÐZ[ÑS[Ð_dÑRdÑIdÐ1dÐ.dÑ)e×)pÑ)pÓ)rÔsØ"™LšFñ #.ô !&§	¢	¨%°QÑ 7˜Ø%'§\¡\Ø#×.Ñ.¨uÁEÈ!ÃHÀ:ÐY^Ð.Ð_Ø*/×*=Ñ*=ð &2ð &™
ð
 &(§\¡\Ù-¨eÁ9Ã;À-Ð_c×_qÑ_qÑrØ*/×*=Ñ*=ð &2ð &˜
ð ×-Ñ-¨j¸*×Eò5 *Cr   r   Nr‡   rˆ   s   €€€€€€r   Ú_PackedRowwiseImplrŽ   ž   s   ø† ÷Fõ Fr   r”   r   )	rV   r”   r„   rP   rQ   rU   rR   rS   r;   s	     @€€€€€€r   Ú_make_packed_rowÚ!_styles.<locals>._make_packed_row›   s,   ù€ Ø—-‘-ˆ÷	Fô 	F ô 	FñB "Ó#Ð#r   Úpathc                 ó0   >^ •  " U 4S jST5      nU" 5       $ )Nc                   ó,   >^ • \ rS rSrU U4S jrSrU =r$ )Ú?_styles.<locals>._make_checked_col.<locals>._CheckedColwiseImpléÆ   c                 ó¸   >• UR                  5       nUR                  R                  S   nXT-  S:w  a  [        ST SU SU SU S3	5      e[        TU ]  XU5        g )Nr   zCannot colwise-shard 'z' weight rows (ú	) across ú) tensor-parallel ranks: not divisible by r'   ©rk   r’   rn   r)   Úsuperr…   )r   ru   rv   rw   ry   Úout_featuresr=   r—   s         €€r   r…   ÚT_styles.<locals>._make_checked_col.<locals>._CheckedColwiseImpl._partition_linear_fnÇ   sx   ø€ Ø%×*Ñ*Ó,�Ø%Ÿ}™}×2Ñ2°1Ñ5�ØÑ)¨QÓ.Ü$Ø0°°°oÀlÀ^ÐS\Ð]dÐ\eð fCØCJÀ)È1ðNóð ô ‘Ñ,¨T¸;ÕGr   r   ©r   r   r   r   r…   r   Ú__classcell__©r=   r—   s   @€r   Ú_CheckedColwiseImplrš   Æ   ó   ù† ÷Hô Hr   r¦   r   )r—   r¦   rT   s   ` €r   Ú_make_checked_colÚ"_styles.<locals>._make_checked_colÅ   ó   ù€ ÷		H /ô 		Hñ #Ó$Ð$r   c                 ó0   >^ •  " U 4S jST5      nU" 5       $ )Nc                   ó,   >^ • \ rS rSrU U4S jrSrU =r$ )Ú?_styles.<locals>._make_checked_row.<locals>._CheckedRowwiseImpléÔ   c                 ó¸   >• UR                  5       nUR                  R                  S   nXT-  S:w  a  [        ST SU SU SU S3	5      e[        TU ]  XU5        g )Nr2   r   zCannot rowwise-shard 'z' weight columns (r�   rž   r'   rŸ   )r   ru   rv   rw   ry   Úin_featuresr=   r—   s         €€r   r…   ÚT_styles.<locals>._make_checked_row.<locals>._CheckedRowwiseImpl._partition_linear_fnÕ   sy   ø€ Ø%×*Ñ*Ó,�Ø$Ÿm™m×1Ñ1°!Ñ4�ØÑ(¨AÓ-Ü$Ø0°°Ð6HÈÈÐU^Ð_fÐ^gð hCØCJÀ)È1ðNóð ô ‘Ñ,¨T¸;ÕGr   r   r£   r¥   s   @€r   Ú_CheckedRowwiseImplr­   Ô   r§   r   r²   r   )r—   r²   rU   s   ` €r   Ú_make_checked_rowÚ"_styles.<locals>._make_checked_rowÓ   rª   r   ÚcolwiseÚrowwisez#Unsupported tensor-parallel style 'z' for 'zR'. Expected 'colwise', 'rowwise', PackedColwiseParallel, or PackedRowwiseParallel.)Útorch.nnr;   Útorch.distributed.tensorrP   rQ   rR   rS   Ú!torch.distributed.tensor.parallelrT   rU   r	   r    Ústrr3   r9   r)   )rN   rŠ   r•   r¨   r³   Úresolvedr—   rD   rT   rP   rQ   rU   rR   rS   r;   s           @@@@@@@r   Ú_stylesr¼   n   s  þ€ õ ßUÓUßRð $Ô!6ð  $¸?÷  $ô  $ðD$$Ô!6ð $$¸?÷ $$ô $$ðT%¤ð %¨÷ %ð%¤ð %¨÷ %ð €HØ$×*Ñ*Ö,‰ˆØ�IÓÙ.¨tÓ4ˆH‹NØ�iÓÙ.¨tÓ4ˆH‹NÜ˜Ô4×5Ñ5Ù-¨eÓ4ˆH‹NÜ˜Ô4×5Ñ5Ù-¨eÓ4ˆH‹NäØ5°e°W¸GÀDÀ6ð Jbð cóð ñ -ð €Or   Úconfigc           	      ó²  • UR                   nUc  [        S5      eUR                  [        ;  a)  [        SUR                   S[	        [        5       S35      eUR                  S:X  a  SOSn[        X5      n[        R                  SU S	[        U5       S
U S35        US:X  a  SSK	J
n  U" XU5        gSSKJn  U H  u  p‰U" Xƒ[        U	5      5        M     g)z:Apply tensor parallel on a model from its flat `_tp_plan`.NzY`config._mesh` is None. Call `config.setup(rank, world_size, device)` before applying TP.z4Tensor parallelism is not supported on device type 'z'. Supported device types are z‘. The device type comes from the `mesh` passed to `TensorParallelConfig`, or from the active accelerator when the mesh is built from `tp_degree`.r   Údefaultz"Applying tensor parallel (backend=z) over z module group(s) on mesh r'   r2   )Ú_apply_tp_neuronr   )Úparallelize_module)Ú_meshr)   Údevice_typeÚ_SUPPORTED_TP_DEVICESr>   rM   ÚloggerÚdebugÚlenÚtensor_parallel_neuronrÀ   r¹   rÁ   r¼   )
r.   r½   r/   Útp_meshÚbackendÚgroupsrÀ   rÁ   Ú	submodulerN   s
             r   Úapply_tensor_parallelrÍ   ó   sä   € ð �l‰l€GØ�ÜÐtÓuÐuà×ÑÔ"7Ó7ÜØBÀ7×CVÑCVÐBWÐWuÜÔ)Ó*Ð+ð ,VðWó
ð 	
ð "×-Ñ-°Ó9‰h¸y€GÜ˜eÓ-€FÜ
‡L�LÐ5°g°Y¸gÄcÈ&ÃkÀ]ÐRkÐlsÐktÐtuÐvÔwà�(ÓÝ<á˜¨Ô0ØåDã$*Ñ ˆ	Ù˜9¬w°}Ó/EÖFò %+r   )r:   Úmodels._modeling_parallelr   Úutilsr   r   rÅ   rÄ   r	   r    Úintr-   r;   ÚModuleÚdictr>   rM   r¼   rÍ   r   r   r   Ú<module>rÓ      sÀ   ðó å <Ý ñ 
�HÓ	€à*Ð ÷
ñ 
÷	ñ 	ð& sð &°Kð &ÀKô &ð"'+˜EŸH™HŸO™Oð '+°dð '+¸tô '+ðTB˜4ð B Dô BðJGØ�8‰8�?‰?ðGà ðGð ðGð 
õ	Gr   