Ë
    ÄÓ^j3  ã                  ó"  — 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+y)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)ÚTorchDispatchModec                ó¤  — | j                   }d}t        |j                  «      D ]7  \  }}|j                  r n&|j                  j                  «       dk7  sŒ2|�Œ5|} n g }|j                  D ]H  }|j                  sŒ|j                  j                  «       dk7  sŒ.|j                  |j                  «       ŒJ i }|�||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   )ÚopÚschemar   ÚiÚargÚkwarg_only_namesÚkwargss          ús/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/distributed/tensor/_decompositions.pyÚ_infer_schema_info_from_opr(       sÕ   € à�Z‰Z€Fð €MÜ˜F×,Ñ,Ó-ò ‰ˆˆ3Ø�>Š>ÙØ�8‰8�=‰=‹?˜lÓ*¨}Ñ/DØˆMÙðð ÐØ×Ñò .ˆØ�>‹>˜cŸh™hŸm™m›o°Ó=Ø×#Ñ# C§H¡HÕ-ð.ð €FØÐ Ø"/ˆˆÑÙà$4ˆÐ Ñ!ô Ñ&˜vÑ&Ð&ó    )Útree_anyÚtree_flattenÚtree_mapÚtree_map_only)Ú
OpOverload)ÚShardingPropagatorc                ób   — | j                   t        | j                  j                  «       «      z   S ©N)Úargs_schemaÚtupleÚkwargs_schemaÚvalues)Ú	op_schemas    r'   Ú_extract_input_specsr7   F   s'   € Ø× Ñ ¤5¨×)@Ñ)@×)GÑ)GÓ)IÓ#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.
    c                ó>   •— t         ‰| �  «        || _        || _        y r1   )ÚsuperÚ__init__Úsharding_propÚmesh)Úselfr=   r>   Ú	__class__s      €r'   r<   zPlacementTrackingMode.__init__R   s   ø€ Ü‰ÑÔØ*ˆÔØˆ�	r)   c                óî  — t        d„ ||xs i f«      \  }}t        d„ ||f«      st        d|› �«      ‚t        |||«      }| j                  j
                  j                  |«      }|€%| j                  j                  j                  |«      }|�||_        |j                  «        t        «       r| j                  j                  |«      }	n| j                  j                  |«      }	|	j                  r^|	j                  x}
	 �Ot        |j                   |
j                   «      D ],  \  }}|j"                  |j"                  k7  sŒ t%        d|› �«      ‚  ||i |¤Ž}| j'                  ||	j(                  «       |S )Nc                óT   — t        | t        j                  «      rt        | d| «      S | S )NÚ_spec)Ú
isinstanceÚtorchÚTensorÚgetattr©Úxs    r'   ú<lambda>z:PlacementTrackingMode.__torch_dispatch__.<locals>.<lambda>Y   s!   € ´
¸1¼e¿l¹lÔ0K”g˜a ¨!Ó,€ ÐQR€ r)   c                ó"   — t        | t        «      S r1   ©rD   r	   rH   s    r'   rJ   z:PlacementTrackingMode.__torch_dispatch__.<locals>.<lambda>^   ó   € ”j ¤KÓ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)r?   ÚfuncÚtypesÚargsr&   r2   r4   r6   rR   Úoutput_shardingrW   ÚorigÚdesiredÚouts                 r'   Ú__torch_dispatch__z(PlacementTrackingMode.__torch_dispatch__W   s›  € Ü%-ÙRØ�6’<˜RÐ ó&
Ñ"ˆ�]ô
 Ù0°;ÀÐ2Nô
ô &Ð(PÐQUÐPVÐ&WÓXÐXô ˜T ;°Ó>ˆ	Ø×(Ñ(×:Ñ:×>Ñ>¸tÓDˆØÐà×"Ñ"×LÑL×PÑPÐQUÓVð ð Ð"Ø$/ˆIÔ!Ø×/Ñ/Ô1äÔØ"×0Ñ0×QÑQØó‰Oð #×0Ñ0×FÑFÀyÓQˆOð ×.Ò.ð #×6Ñ6ð7Ð#ð ð	ô "%Ø×#Ñ#Ø#×-Ñ-ó"ò ‘��gð —?‘? g×&8Ñ&8Ó8Ü&ØDÀTÀFÐKóð ðñ �DÐ#˜FÑ#ˆà×!Ñ! # ×'BÑ'BÔCØˆ
r)   c                óô   — t        |t        j                  «      r
|�||_        y t        |t        t
        f«      r>t        |t        t
        f«      r't        ||«      D ]  \  }}| j                  ||«       Œ y y y r1   )rD   rE   rF   rC   r3   ÚlistrX   r\   )r?   Úoutputr]   ÚtÚss        r'   r\   z*PlacementTrackingMode._record_output_specsŽ   sn   € Ü�fœeŸl™lÔ+°Ð0GØ&ˆF�LÜ˜¤¬ Ô.´:Øœ%¤˜ô4
ô ˜F KÓ0ò 0‘��1Ø×)Ñ)¨!¨QÕ/ñ0ð4
Ð.r)   )r=   r/   r>   r   )r   N)rh   r   r]   zDTensorSpec | AnyÚreturnÚNone)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r<   re   r\   Ú__classcell__)r@   s   @r'   r9   r9   J   s   ø„ ñõó
5÷n0r)   r9   c                  ó|   — 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y	)Ú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.
    c                ó    — || _         i | _        y r1   )r=   Ú_fake_meshes)r?   r=   s     r'   r<   zDecompShardingStrategy.__init__¡   s   € Ø*ˆÔð 46ˆÕr)   c                ó~   — | j                   j                  |«      }|€t        |dgdd¬«      }|| j                   |<   |S )Nr   F)Ú_init_backendÚ_rank)ru   rP   r   )r?   Údevice_typeÚ	fake_meshs      r'   Ú_get_fake_meshz%DecompShardingStrategy._get_fake_meshª   sG   € Ø×%Ñ%×)Ñ)¨+Ó6ˆ	ØÐÜ" ;°°À5ÐPQÔRˆIØ-6ˆD×Ñ˜kÑ*ØÐr)   c                ó6   — | t         v xs | j                  «       S r1   )r   Ú_can_decompose)r!   s    r'   Ú
has_decompz!DecompShardingStrategy.has_decomp±   s   € ð Ô(Ð(Ò?¨B×,=Ñ,=Ó,?Ð?r)   c                ó~   — || j                   j                  vr%t        |«      }|| j                   j                  |<   yy)z�
        Register schema_info for decomposition op on first invocation.
        Needed for correct shard prop cache key.
        N)r=   rO   r(   )r?   r!   rR   s      r'   Úensure_schema_infoz)DecompShardingStrategy.ensure_schema_info¶   s=   € ð
 �T×'Ñ'×9Ñ9Ñ9Ü4°RÓ8ˆKØ7BˆD×Ñ×0Ñ0°Ò4ð :r)   c                óÈ  — t        d„ |j                  |j                  f«      sy | j                  |«      }t	        |j
                  |j                  t        |j                  j                  «       «      z   «      }| j                  |j                  «      }g }g }|D ]Q  }	 | j                  |||«      }t!        |t        «      s|gn
t#        |«      }|j%                  |t#        |«      z   «       ŒS |st'        d«      ‚t)        |«      }	| j*                  j-                  |«      }
ddlm}  |||
||	¬«      S # t        $ r Y  y t        $ r Y  y t        t        t        f$ r Y ŒÅw xY w)Nc                ó"   — t        | t        «      S r1   rL   rH   s    r'   rJ   z;DecompShardingStrategy.propagate_strategy.<locals>.<lambda>Ä   rM   r)   zGSharding propagation should have produced at least Replicate() strategyr   )Úexpand_to_full_mesh_op_strategy)Úinput_index)r*   r2   r4   Ú_get_candidate_placementsr   r!   r3   r5   r{   ry   Ú_propagate_through_decomprN   r   r[   ÚKeyErrorÚ
IndexErrorrD   rg   r   ÚAssertionErrorÚlenr=   Ú_wrap_with_op_strategyÚ#torch.distributed.tensor._ops.utilsrƒ   )r?   r6   Úcandidate_placementsr>   rz   Úsingle_dim_strategiesÚoutput_placementsÚinput_placementsrh   Ú	n_outputsÚstrategy_schemarƒ   s               r'   Úpropagate_strategyz)DecompShardingStrategy.propagate_strategy¿   s|  € ô Ù0Ø×"Ñ" I×$;Ñ$;Ð<ô
ð à#×=Ñ=¸iÓHÐÜ&Ø�L‰LØ×!Ñ!¤E¨)×*AÑ*A×*HÑ*HÓ*JÓ$KÑKó
ˆð
 ×'Ñ'¨×(8Ñ(8Ó9ˆ	Ø "ÐØEGÐØ 4ò 	UÐðØ×7Ñ7ØØ$Øó�ô !+¨6´5Ô 9�‘¼tÀF»|ð ð "×(Ñ(Ð):¼TÐBRÓ=SÑ)SÕTð'	Uñ* %Ü ØYóð ô Ð)Ó*ˆ	Ø×,Ñ,×CÑCÀIÓNˆåWá.Ø�/Ð#8Àiô
ð 	
øô1 'ò ÚÜ.ò ÚÜ ¤(¬JÐ7ò ñ ðús   ÂD4Ä4	E!Å E!ÅE!Å E!c                ót  ‡‡— |j                   }|t        v r
t        |   }n+|j                  «       r|j                  }nt	        d|› �«      ‚t        |«      Šˆˆfd„}ddlm}  |«       5  t        ||j                  «      }t        ||j                  «      }	t        | j                  ‰«      5   ||i |	¤Ž}
d d d «       d d d «       d„ }t        |
«      }t        |t        t        f«      r0|D �cg c]  }|€Œ|‘Œ	 }}t!        |«      dk(  r|d   S t        |«      S |S # 1 sw Y   ŒhxY w# 1 sw Y   ŒlxY wc c}w )NzNo decomposition found for c                óê   •— t        ‰«      }t        | t        «      rVt        j                  | j
                  | j                  j                  d¬«      }t        ‰|f| j                  ¬«      |_        |S | S )NÚmeta)ÚdtypeÚdevice)Útensor_meta)	ÚnextrD   r	   rE   ÚemptyÚshaper™   r—   rC   )rI   Úpr–   r>   Úplacement_iters      €€r'   Úto_metazADecompShardingStrategy._propagate_through_decomp.<locals>.to_meta  sW   ø€ Ü�^Ó$ˆAÜ˜!œ[Ô)ä—{‘{ 1§7¡7°!·-±-×2EÑ2EÈfÔU�ä(¨°¨tÀÇÁÔO�”
Ø�ØˆHr)   r   )Úmaybe_disable_local_tensor_modec                óx   — t        | t        j                  «      r t        | dd «      }|r|j                  d   S d S y )NrC   r   )rD   rE   rF   rG   rZ   )ri   Úspecs     r'   Úget_placementzGDecompShardingStrategy._propagate_through_decomp.<locals>.get_placement  s7   € Ü˜!œUŸ\™\Ô*Ü˜q '¨4Ó0�Ù-1�t—‘ qÑ)Ð;°tÐ;Ør)   é   )r!   r   r}   Ú	decomposerN   ÚiterÚtorch.distributed._local_tensorr    r,   r2   r4   r9   r=   rD   r3   rg   rŠ   )r?   r6   Ú	placementr>   r!   Ú	decomp_fnrŸ   r    Ú	args_metaÚkwargs_metarh   r£   Úresultr�   Úflatrž   s      `           @r'   r†   z0DecompShardingStrategy._propagate_through_decompõ   s.  ù€ ð �\‰\ˆØÔ$Ñ$Ü+¨BÑ/‰IØ×ÑÔ ØŸ™‰Iä%Ð(CÀBÀ4Ð&HÓIÐIä˜i›ˆõ	õ 	Tá,Ó.ñ 	>ä  ¨)×*?Ñ*?Ó@ˆIÜ" 7¨I×,CÑ,CÓDˆKä& t×'9Ñ'9¸4Ó@ñ >Ù" IÐ=°Ñ=�÷>÷	>ò	ô ˜-¨Ó0ˆÜ�fœu¤d˜mÔ,Ø%Ö7˜!¨©’AÐ7ˆDÐ7Ü! $›i¨1šn�4˜‘7Ð=´%¸³+Ð=Øˆ÷>ð >ú÷	>ð 	>üò  8s1   Á*AD)Â-	DÂ6D)Ã/D5Ã7D5ÄD&	Ä"D)Ä)D2c           
     ó˜  ‡	— t        | «      }t        t        |«      «      \  }}t        «       hŠ	t	        t
        ˆ	fd„|«       g }|D ]Ý  }t        |t
        «      s|j                  d g«       Œ&t        ‰	«      }‰	D ]Ž  }t        |t        «      r<|t        |j                  «      D �ch c]  }t        ||j                  ¬«      ’Œ c}z  }ŒOt        |t        «      sŒ`|t        |j                  «      D �ch c]  }t        |«      ’Œ c}z  }Œ� |j                  t        |«      «       Œß t        t        j                  |Ž «      S c c}w c c}w )Nc                ó:   •— ‰j                  | j                  «      S r1   )ÚupdaterZ   )r¢   Úall_placementss    €r'   rJ   zBDecompShardingStrategy._get_candidate_placements.<locals>.<lambda>2  s   ø€ ˜×.Ñ.¨t¯©Ó?€ r)   )Úsplit_factor)r7   r+   rg   r   r-   r	   rD   r   Úsetr   ÚrangeÚndimr²   r   Ú	itertoolsÚproduct)
r6   Útensor_specsÚ
flat_specsÚ_Ú
candidatesr¢   Úoptionsr�   r#   r±   s
            @r'   r…   z0DecompShardingStrategy._get_candidate_placements'  s,  ø€ ô ,¨IÓ6ˆÜ$¤T¨,Ó%7Ó8‰ˆ
�Aô +4«+¨ˆÜÜÛ?Øô	
ð 46ˆ
Øò 	1ˆDÜ˜d¤KÔ0Ø×!Ñ! 4 &Õ)ä˜nÓ-�Ø'ò H�AÜ! !¤]Ô3Øä%*¨4¯9©9Ó%5ö$à !ô *¨!¸!¿.¹.ÖIò$ñ ™ô $ A¤uÕ-Ø´e¸D¿I¹IÓ6FÖ#G°¤E¨!¥HÒ#GÑG™ðHð ×!Ñ!¤$ w£-Õ0ð	1ô  ”I×%Ñ% zÐ2Ó3Ð3ùò$ùò
 $Hs   Â%E
Ã2E
N)r=   r/   )ry   Ústrrk   r   )r!   r.   rk   Úbool)r!   r.   rk   rl   )r6   r
   rk   zOpStrategy | None)r6   r
   r¨   ztuple[Placement | None]r>   r   rk   z!Placement | tuple[Placement, ...])r6   r
   rk   zlist[tuple[Placement | None]])rm   rn   ro   rp   r<   r{   Ústaticmethodr~   r€   r“   r†   r…   r   r)   r'   rs   rs   ˜   s•   „ ñó6óð ò@ó ð@óCð4
àð4
ð 
ó4
ðl0àð0ð +ð0ð ð	0ð
 
+ó0ðd ð 4Øð 4à	&ò 4ó ñ 4r)   rs   )r!   r.   rk   r   )r6   r
   rk   z tuple[DTensorSpec | object, ...]),rp   Ú
__future__r   r¶   Útypingr   r   rE   Ú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_propr/   r7   r9   rs   r   r)   r'   ú<module>rÎ      s{   ðñõ #ã ß %ã Ý -Ý EÝ 4Ý >ß WÑ WÝ C÷ó õ NÝ :ó'÷< PÓ Oñ Ý%ÝJóKôK0Ð-ô K0÷\p4ò p4r)   