§
    O�’j]4  ã                  ó0  — d Z ddlmZ ddlZddlmZm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mZmZ dd
lmZ ddlmZmZmZmZ ddlmZ ddlmZ dd„Zddl m!Z!m"Z"m#Z#m$Z$ erddl%m&Z& ddl'm(Z( dd„Z) G d„ de¦  «        Z* G d„ d¦  «        Z+dS ) a  
Decomposition-based sharding propagation for DTensor.

When an operator doesn't have a registered sharding strategy, we derive one by
tracing through its decomposition. The decomposed ops (which do have strategies)
determine how placements propagate through the original op.
é    )ÚannotationsN)ÚAnyÚTYPE_CHECKING)Údecomposition_table)Ú_are_we_tracing)Ú
DeviceMesh)ÚDTensorSpec)ÚOpSchemaÚ
OpStrategyÚRuntimeSchemaInfo)Útry_find_mesh_from_args)Ú_StridedShardÚ	PlacementÚ	ReplicateÚShard)ÚGuardOnDataDependentSymNode)ÚTorchDispatchModeÚopÚ
OpOverloadÚreturnr   c                ól  — | j         }d}t          |j        ¦  «        D ]1\  }}|j        r n$|j                             ¦   «         dk    r|€|} nŒ2g }|j        D ]@}|j        r7|j                             ¦   «         dk    r|                     |j        ¦  «         ŒAi }|�||d<   |r||d<   t          di |¤ŽS )zGInfer RuntimeSchemaInfo from an operator's schema for decomposition opsNÚ
TensorTypeÚstatic_argnumÚstatic_kwargkey© )	Ú_schemaÚ	enumerateÚ	argumentsÚ
kwarg_onlyÚtypeÚkindÚappendÚnamer   )r   Úschemar   ÚiÚargÚkwarg_only_namesÚkwargss          úVC:\Projects\DSCons\.venv\Lib\site-packages\torch\distributed\tensor\_decompositions.pyÚ_infer_schema_info_from_opr*       sï   € àŒZ€Fð €MÝ˜FÔ,Ñ-Ô-ð ð ‰ˆˆ3ØŒ>ð 	ØˆEØŒ8�=Š=‰?Œ?˜lÒ*Ð*¨}Ð/DØˆMØˆEøð ÐØÔð .ð .ˆØŒ>ð 	.˜cœhŸmšm™oœo°Ò=Ð=Ø×#Ò# C¤HÑ-Ô-Ð-øà€FØÐ Ø"/ˆˆÑØð 5à$4ˆÐ Ñ!õ Ð&Ð&˜vÐ&Ð&Ð&ó    )Útree_anyÚtree_flattenÚtree_mapÚtree_map_only)r   )ÚShardingPropagatorÚ	op_schemar
   ú tuple[DTensorSpec | object, ...]c                ó^   — | j         t          | j                             ¦   «         ¦  «        z   S ©N)Úargs_schemaÚtupleÚkwargs_schemaÚvalues)r1   s    r)   Ú_extract_input_specsr9   F   s'   € ØÔ ¥5¨Ô)@×)GÒ)GÑ)IÔ)IÑ#JÔ#JÑJÐJr+   c                  ó4   ‡ — e Zd ZdZdˆ fd„Zdd	„Zdd„Zˆ xZS )ÚPlacementTrackingModezõ
    TorchDispatchMode that tracks DTensor placements through op execution.

    Used during decomposition tracing: intercepts each op, propagates sharding
    via the ShardingPropagator, and records output placements on the result tensors.
    Úsharding_propr0   Úmeshr   c                ód   •— t          ¦   «                              ¦   «          || _        || _        d S r4   )ÚsuperÚ__init__r<   r=   )Úselfr<   r=   Ú	__class__s      €r)   r@   zPlacementTrackingMode.__init__R   s,   ø€ Ý‰Œ×ÒÑÔÐØ*ˆÔØˆŒ	ˆ	ˆ	r+   r   Nc                óÎ  — t          d„ ||pi f¦  «        \  }}t          d„ ||f¦  «        st          d|› �¦  «        ‚t          |||¦  «        }| j        j                             |¦  «        }|€| j        j                             |¦  «        }|�||_        | 	                    ¦   «          t          ¦   «         r| j                             |¦  «        }	n| j                             |¦  «        }	|	j        rL|	j        x}
	 �Bt          |j        |
j        ¦  «        D ]'\  }}|j        |j        k    rt%          d|› �¦  «        ‚Œ( ||i |¤Ž}|                      ||	j        ¦  «         |S )Nc                ó\   — t          | t          j        ¦  «        rt          | d| ¦  «        n| S )NÚ_spec)Ú
isinstanceÚtorchÚTensorÚgetattr©Úxs    r)   ú<lambda>z:PlacementTrackingMode.__torch_dispatch__.<locals>.<lambda>Y   s)   € µ
¸1½e¼lÑ0KÔ0KÐR•g˜a ¨!Ñ,Ô,Ð,ÐQR€ r+   c                ó,   — t          | t          ¦  «        S r4   ©rF   r	   rJ   s    r)   rL   z:PlacementTrackingMode.__torch_dispatch__.<locals>.<lambda>^   ó   € •j ¥KÑ0Ô0€ r+   z(No DTensorSpec found in args/kwargs for z*Decomposition requires redistribution for )r.   r,   ÚNotImplementedErrorr
   r<   Úop_to_schema_infoÚgetÚ)op_to_schema_info_for_single_dim_strategyÚschema_infoÚ_recompute_comparison_keyr   Ú propagate_op_sharding_non_cachedÚpropagate_op_shardingÚneeds_redistributeÚredistribute_schemaÚzipÚ	args_specÚ
placementsÚRuntimeErrorÚ_record_output_specsÚoutput_spec)rA   ÚfuncÚtypesÚargsr(   r5   r7   r1   rT   Úoutput_shardingrY   ÚorigÚdesiredÚouts                 r)   Ú__torch_dispatch__z(PlacementTrackingMode.__torch_dispatch__W   sÓ  € Ý%-ØRÐRØ�6�<˜RÐ ñ&
ô &
Ñ"ˆ�]õ
 Ø0Ð0°;ÀÐ2Nñ
ô 
ð 	Yõ &Ð&WÐQUÐ&WÐ&WÑXÔXÐXõ ˜T ;°Ñ>Ô>ˆ	ØÔ(Ô:×>Ò>¸tÑDÔDˆØÐàÔ"ÔL×PÒPÐQUÑVÔVð ð Ð"Ø$/ˆIÔ!Ø×/Ò/Ñ1Ô1Ð1åÑÔð 	RØ"Ô0×QÒQØñô ˆOˆOð #Ô0×FÒFÀyÑQÔQˆOð Ô.ð	ð #Ô6ð7Ð#ð ð	õ "%ØÔ#Ø#Ô-ñ"ô "ð ð ‘��gð ”? gÔ&8Ò8Ð8Ý&ØKÀTÐKÐKñô ð ð 9ð
 ˆd�DÐ#˜FÐ#Ð#ˆà×!Ò! # Ô'BÑCÔCÐCØˆ
r+   Úoutputr   r_   úDTensorSpec | Anyr   ÚNonec                ó   — t          |t          j        ¦  «        r|�	||_        d S t          |t          t
          f¦  «        rHt          |t          t
          f¦  «        r.t          ||¦  «        D ]\  }}|                      ||¦  «         Œd S d S d S r4   )rF   rG   rH   rE   r6   ÚlistrZ   r^   )rA   rh   r_   ÚtÚss        r)   r^   z*PlacementTrackingMode._record_output_specsŽ   s¬   € Ý�f�eœlÑ+Ô+ð 	0°Ð0GØ&ˆFŒLˆLˆLÝ˜¥­ Ñ.Ô.ð 	0µ:Ø�%¥˜ñ4
ô 4
ð 	0õ ˜F KÑ0Ô0ð 0ð 0‘��1Ø×)Ò)¨!¨QÑ/Ô/Ð/Ð/ð		0ð 	0ð 	0ð 	0ð0ð 0r+   )r<   r0   r=   r   )r   N)rh   r   r_   ri   r   rj   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r@   rg   r^   Ú__classcell__)rB   s   @r)   r;   r;   J   sp   ø€ € € € € ðð ðð ð ð ð ð ð
5ð 5ð 5ð 5ðn0ð 0ð 0ð 0ð 0ð 0ð 0ð 0r+   r;   c                  ój   — e Zd ZdZdd„Zdd	„Zedd„¦   «         Zdd„Zd d„Z	d!d„Z
ed"d„¦   «         ZdS )#ÚDecompShardingStrategyaA  
    Generates sharding strategies for ops by tracing through their decompositions.

    For each candidate input placement combination, runs the decomposition on meta
    tensors under PlacementTrackingMode to determine the output placement. These
    single-dimension strategies are then expanded to the full mesh.
    r<   r0   c                ó"   — || _         i | _        d S r4   )r<   Ú_fake_meshes)rA   r<   s     r)   r@   zDecompShardingStrategy.__init__¡   s   € Ø*ˆÔð 46ˆÔÐÐr+   Údevice_typeÚstrr   r   c                óz   — | j                              |¦  «        }|€t          |dgdd¬¦  «        }|| j         |<   |S )Nr   F)Ú_init_backendÚ_rank)rw   rR   r   )rA   rx   Ú	fake_meshs      r)   Ú_get_fake_meshz%DecompShardingStrategy._get_fake_meshª   sJ   € ØÔ%×)Ò)¨+Ñ6Ô6ˆ	ØÐÝ" ;°°À5ÐPQÐRÑRÔRˆIØ-6ˆDÔ˜kÑ*ØÐr+   r   r   Úboolc                ó<   — | t           v p|                      ¦   «         S r4   )r   Ú_can_decompose)r   s    r)   Ú
has_decompz!DecompShardingStrategy.has_decomp±   s!   € ð Õ(Ð(Ð?¨B×,=Ò,=Ñ,?Ô,?Ð?r+   rj   c                ób   — || j         j        vr t          |¦  «        }|| j         j        |<   dS dS )z�
        Register schema_info for decomposition op on first invocation.
        Needed for correct shard prop cache key.
        N)r<   rQ   r*   )rA   r   rT   s      r)   Úensure_schema_infoz)DecompShardingStrategy.ensure_schema_info¶   s@   € ð
 �TÔ'Ô9Ð9Ð9Ý4°RÑ8Ô8ˆKØ7BˆDÔÔ0°Ñ4Ð4Ð4ð :Ð9r+   r1   r
   úOpStrategy | Nonec                ó  — t          d„ |j        |j        f¦  «        sd S |                      |¦  «        }t	          |j        |j        t          |j                             ¦   «         ¦  «        z   ¦  «        }|                      |j	        ¦  «        }g }g }|D ]ž}	 |  
                    |||¦  «        }n7# t          $ r Y  d S t          $ r Y  d S t          t          t          f$ r Y ŒNw xY wt!          |t          ¦  «        s|gnt#          |¦  «        }|                     |t#          |¦  «        z   ¦  «         ŒŸ|st'          d¦  «        ‚t)          |¦  «        }	| j                             |¦  «        }
ddlm}  |||
||	¬¦  «        S )Nc                ó,   — t          | t          ¦  «        S r4   rN   rJ   s    r)   rL   z;DecompShardingStrategy.propagate_strategy.<locals>.<lambda>Ä   rO   r+   zGSharding propagation should have produced at least Replicate() strategyr   )Úexpand_to_full_mesh_op_strategy)Úinput_index)r,   r5   r7   Ú_get_candidate_placementsr   r   r6   r8   r~   rx   Ú_propagate_through_decomprP   r   r]   ÚKeyErrorÚ
IndexErrorrF   rl   r"   ÚAssertionErrorÚlenr<   Ú_wrap_with_op_strategyÚ#torch.distributed.tensor._ops.utilsrˆ   )rA   r1   Úcandidate_placementsr=   r}   Úsingle_dim_strategiesÚoutput_placementsÚinput_placementsrh   Ú	n_outputsÚstrategy_schemarˆ   s               r)   Úpropagate_strategyz)DecompShardingStrategy.propagate_strategy¿   sý  € õ Ø0Ð0ØÔ" IÔ$;Ð<ñ
ô 
ð 	ð �4à#×=Ò=¸iÑHÔHÐÝ&ØŒLØÔ!¥E¨)Ô*A×*HÒ*HÑ*JÔ*JÑ$KÔ$KÑKñ
ô 
ˆð
 ×'Ò'¨Ô(8Ñ9Ô9ˆ	Ø "ÐØEGÐØ 4ð 	Uð 	UÐðØ×7Ò7ØØ$Øñô ��øõ
 'ð ð ð Ø�t�t�tÝ.ð ð ð Ø�t�t�tÝ ¥(­JÐ7ð ð ð ð �ðøøøõ !+¨6µ5Ñ 9Ô 9ÐK���½tÀF¹|¼|ð ð "×(Ò(Ð):½TÐBRÑ=SÔ=SÑ)SÑTÔTÐTÐTà$ð 	Ý ØYñô ð õ Ð)Ñ*Ô*ˆ	ØÔ,×CÒCÀIÑNÔNˆàWÐWÐWÐWÐWÐWà.Ð.Ø�/Ð#8Àið
ñ 
ô 
ð 	
s   ÂB1Â1
C%Â?	C%ÃC%Ã$C%Ú	placementútuple[Placement | None]r=   ú!Placement | tuple[Placement, ...]c                ó¤  ‡‡— |j         }|t          v rt          |         }n.|                     ¦   «         r|j        }nt	          d|› �¦  «        ‚t          |¦  «        Šˆˆfd„}ddlm}  |¦   «         5  t          ||j	        ¦  «        }t          ||j
        ¦  «        }	t          | j        ‰¦  «        5   ||i |	¤Ž}
d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   d„ }t          ||
¦  «        }t          |t          t          f¦  «        r6d„ |D ¦   «         }t!          |¦  «        dk    r|d         nt          |¦  «        S |S )NzNo decomposition found for c                óÚ   •— t          ‰¦  «        }t          | t          ¦  «        rEt          j        | j        | j        j        d¬¦  «        }t          ‰|f| j        ¬¦  «        |_        |S | S )NÚmeta)ÚdtypeÚdevice)Útensor_meta)	ÚnextrF   r	   rG   ÚemptyÚshaper¡   rŸ   rE   )rK   Úprž   r=   Úplacement_iters      €€r)   Úto_metazADecompShardingStrategy._propagate_through_decomp.<locals>.to_meta  sc   ø€ Ý�^Ñ$Ô$ˆAÝ˜!�[Ñ)Ô)ð å”{ 1¤7°!´-Ô2EÈfÐUÑUÔU�å(¨°¨tÀÄÐOÑOÔO�”
Ø�ØˆHr+   r   )Úmaybe_disable_local_tensor_modec                ó~   — t          | t          j        ¦  «        r"t          | dd ¦  «        }|r|j        d         nd S d S )NrE   r   )rF   rG   rH   rI   r\   )rm   Úspecs     r)   Úget_placementzGDecompShardingStrategy._propagate_through_decomp.<locals>.get_placement  sC   € Ý˜!�Uœ\Ñ*Ô*ð <Ý˜q '¨4Ñ0Ô0�Ø-1Ð;�t” qÔ)Ð)°tÐ;Ø�4r+   c                ó   — g | ]}|®|‘ŒS r4   r   )Ú.0r¥   s     r)   ú
<listcomp>zDDecompShardingStrategy._propagate_through_decomp.<locals>.<listcomp>#  s   € Ð7Ð7Ð7˜!¨¨�A¨¨¨r+   é   )r   r   r�   Ú	decomposerP   ÚiterÚtorch.distributed._local_tensorr¨   r.   r5   r7   r;   r<   rF   r6   rl   r�   )rA   r1   r™   r=   r   Ú	decomp_fnr§   r¨   Ú	args_metaÚkwargs_metarh   r«   ÚresultÚflatr¦   s      `          @r)   r‹   z0DecompShardingStrategy._propagate_through_decompõ   s  øø€ ð Œ\ˆØÕ$Ð$Ð$Ý+¨BÔ/ˆIˆIØ×ÒÑ Ô ð 	JØœˆIˆIå%Ð&HÀBÐ&HÐ&HÑIÔIÐIå˜i™œˆð	ð 	ð 	ð 	ð 	ð 	ð 	TÐSÐSÐSÐSÐSà,Ð,Ñ.Ô.ð 	>ð 	>å  ¨)Ô*?Ñ@Ô@ˆIÝ" 7¨IÔ,CÑDÔDˆKå& tÔ'9¸4Ñ@Ô@ð >ð >Ø"˜ IÐ=°Ð=Ð=�ð>ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >ð	>ð 	>ð 	>ñ 	>ô 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>øøøð 	>ð 	>ð 	>ð 	>ð	ð 	ð 	õ ˜-¨Ñ0Ô0ˆÝ�f�u¥d˜mÑ,Ô,ð 	>Ø7Ð7˜vÐ7Ñ7Ô7ˆDÝ! $™iœi¨1šn˜n�4˜”7�7µ%¸±+´+Ð=Øˆs7   Á4A C Â4	C	Â=C Ã	C	ÃC ÃC	ÃC Ã C$Ã'C$úlist[tuple[Placement | None]]c                ó˜  ‡‡— t          | ¦  «        }t          t          |¦  «        ¦  «        \  }}t          ¦   «         hŠt	          t
          ˆfd„|¦  «         g }|D ]Ó}t          |t
          ¦  «        s|                     d g¦  «         Œ.t          ‰¦  «        }‰D ]qŠt          ‰t          ¦  «        r$|ˆfd„t          |j        ¦  «        D ¦   «         z  }Œ;t          ‰t          ¦  «        r!|d„ t          |j        ¦  «        D ¦   «         z  }Œr|                     t          |¦  «        ¦  «         ŒÔt          t          j        |Ž ¦  «        S )Nc                ó8   •— ‰                      | j        ¦  «        S r4   )Úupdater\   )rª   Úall_placementss    €r)   rL   zBDecompShardingStrategy._get_candidate_placements.<locals>.<lambda>2  s   ø€ ˜×.Ò.¨t¬Ñ?Ô?€ r+   c                ó<   •— h | ]}t          |‰j        ¬ ¦  «        ’ŒS ))Úsplit_factor)r   r¾   )r­   r%   r¥   s     €r)   ú	<setcomp>zCDecompShardingStrategy._get_candidate_placements.<locals>.<setcomp>?  s8   ø€ ð $ð $ð $à !õ *¨!¸!¼.ÐIÑIÔIð$ð $ð $r+   c                ó,   — h | ]}t          |¦  «        ’ŒS r   )r   )r­   r%   s     r)   r¿   zCDecompShardingStrategy._get_candidate_placements.<locals>.<setcomp>D  s   € Ð#GÐ#GÐ#G°¥E¨!¡H¤HÐ#GÐ#GÐ#Gr+   )r9   r-   rl   r   r/   r	   rF   r"   Úsetr   ÚrangeÚndimr   Ú	itertoolsÚproduct)	r1   Útensor_specsÚ
flat_specsÚ_Ú
candidatesrª   Úoptionsr¼   r¥   s	          @@r)   rŠ   z0DecompShardingStrategy._get_candidate_placements'  sy  øø€ õ ,¨IÑ6Ô6ˆÝ$¥T¨,Ñ%7Ô%7Ñ8Ô8‰ˆ
�Aõ +4©+¬+¨ˆÝÝØ?Ð?Ð?Ð?Øñ	
ô 	
ð 	
ð 46ˆ
Øð 	1ð 	1ˆDÝ˜d¥KÑ0Ô0ð 1Ø×!Ò! 4 &Ñ)Ô)Ð)Ð)å˜nÑ-Ô-�Ø'ð Hð H�AÝ! !¥]Ñ3Ô3ð HØð $ð $ð $ð $å%*¨4¬9Ñ%5Ô%5ð$ñ $ô $ñ ˜˜õ $ A¥uÑ-Ô-ð HØÐ#GÐ#Gµe¸D¼IÑ6FÔ6FÐ#GÑ#GÔ#GÑG˜øØ×!Ò!¥$ w¡-¤-Ñ0Ô0Ð0Ð0õ •IÔ% zÐ2Ñ3Ô3Ð3r+   N)r<   r0   )rx   ry   r   r   )r   r   r   r   )r   r   r   rj   )r1   r
   r   r…   )r1   r
   r™   rš   r=   r   r   r›   )r1   r
   r   r¸   )ro   rp   rq   rr   r@   r~   Ústaticmethodr‚   r„   r˜   r‹   rŠ   r   r+   r)   ru   ru   ˜   sÌ   € € € € € ðð ð6ð 6ð 6ð 6ðð ð ð ð ð@ð @ð @ñ „\ð@ðCð Cð Cð Cð4
ð 4
ð 4
ð 4
ðl0ð 0ð 0ð 0ðd ð 4ð  4ð  4ñ „\ð 4ð  4ð  4r+   ru   )r   r   r   r   )r1   r
   r   r2   ),rr   Ú
__future__r   rÄ   Útypingr   r   rG   Útorch._decompr   Ú)torch.distributed._functional_collectivesr   Útorch.distributed.device_meshr   Ú&torch.distributed.tensor._dtensor_specr	   Ú#torch.distributed.tensor._op_schemar
   r   r   Útorch.distributed.tensor._utilsr   Ú(torch.distributed.tensor.placement_typesr   r   r   r   Ú%torch.fx.experimental.symbolic_shapesr   Útorch.utils._python_dispatchr   r*   Útorch.utils._pytreer,   r-   r.   r/   Ú
torch._opsr   Ú'torch.distributed.tensor._sharding_propr0   r9   r;   ru   r   r+   r)   ú<module>rÚ      s  ððð ð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à €€€Ø -Ð -Ð -Ð -Ð -Ð -Ø EÐ EÐ EÐ EÐ EÐ EØ 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø >Ð >Ð >Ð >Ð >Ð >Ø WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WØ CÐ CÐ CÐ CÐ CÐ Cðð ð ð ð ð ð ð ð ð ð ð ð NÐ MÐ MÐ MÐ MÐ MØ :Ð :Ð :Ð :Ð :Ð :ð'ð 'ð 'ð 'ð< PÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ Oð ð KØ%Ð%Ð%Ð%Ð%Ð%ØJÐJÐJÐJÐJÐJðKð Kð Kð KðK0ð K0ð K0ð K0ð K0Ð-ñ K0ô K0ð K0ð\p4ð p4ð p4ð p4ð p4ñ p4ô p4ð p4ð p4ð p4r+   