§
    O�’jöc  ã                   ó  — d dl Z d dlmZ d dlZd dlmZ d dlmc m	Z
 d dlmc mZ d dlmZ d dlmZ d dlmZmZmZmZ d dlmZ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" ej#        j$        Z$dgZ%e j&        d„ ¦   «         Z'de(e"df         de)de)fd„Z*de(e"df         dedefd„Z+dej,        j-        de(e.df         de/e0e.f         defd„Z1d„ Z2dej,        j-        de(e.df         de/e0e.f         de.fd„Z3dej,        j-        de(e.df         de/e0e.f         de.fd„Z4dedededz  dedz  de)d e)d!ej5        d"e)ded#e)de(eef         fd$„Z6dej,        j-        de(e.df         de/e0e.f         de.fd%„Z7d&ededededz  de)d e)d'ed!ej5        d"e)ded#e)defd(„Z8dej,        j-        de(e.df         de/e0e.f         de.fd)„Z9e$j2        j:        e3e$j;        j:        e4e$j<        j:        e7e$j=        j:        e7e$j>        j:        e9e$j?        j:        e9iZ@d*„ ZAd+„ ZBdS ),é    N)Úcast)ÚTensor)Ú
DeviceMesh)ÚDTensorÚPartialÚ	ReplicateÚShard)ÚDTensorSpecÚ
TensorMeta)Ú_MaskPartial)Ú	_skip_dimÚ	ReductionÚreplicate_reduction_dims)Únormalize_dim)Ú	PlacementÚloss_parallelc               #   óJ   K  — t          ¦   «          dV — t          ¦   «          dS )uz  
    A context manager that enables loss parallelism, where efficient parallelized loss computation
    can be performed when the input is sharded on the class dimension. Currently only the cross-entropy
    loss is supported.

    Within this context manager, one can use :func:`~torch.nn.functional.cross_entropy` or
    :class:`~torch.nn.CrossEntropyLoss` as usual, with the following assumptions on the input parameters.
    The corresponding ``backward()`` call, if any, also needs to happen under this context manager.

    Both one-dimensional and multi-dimensional ``DeviceMesh`` are supported. On a
    multi-dimensional mesh, exactly one mesh dim must shard the class dimension â€”
    that dim is treated as the "TP" dim and can be in any position (not necessarily
    last). The remaining mesh dims may be ``Shard`` (e.g. batch-sharded for DP/CP)
    or ``Replicate``.

    Args:
        input (:class:`DTensor`):
            Input logits. Assumed to be sharded on the class dimension on exactly
            one mesh dim.
        target (Union[:class:`torch.Tensor`, :class:`DTensor`]):
            Must be ground truth class indices (class probabilities currently not
            supported). Its placements are derived from ``input``'s placements by
            (1) replacing the TP dim's ``Shard(class_dim)`` with ``Replicate`` and
            (2) shifting any other ``Shard(d)`` with ``d > class_dim`` down by one
            (since the class tensor dim is removed from the output)::

                input tensor shape       input placements             target shape      target placements
                ----------------------   --------------------------   ---------------   ------------------------
                (batch, class)           (Shard(0), Shard(1))         (batch,)          (Shard(0), Replicate())
                (batch, class)           (Replicate(), Shard(1))      (batch,)          (Replicate(), Replicate())
                (batch, class, seq)      (Shard(2), Shard(1))         (batch, seq)      (Shard(1), Replicate())
                (batch, class, seq)      (Shard(0), Shard(1))         (batch, seq)      (Shard(0), Replicate())

            A plain :class:`torch.Tensor` is only accepted when the derived target
            placements are all ``Replicate`` (e.g. on a one-dimensional mesh);
            otherwise a :class:`DTensor` must be passed explicitly so that the
            intended sharding is unambiguous.
        weight (Union[:class:`torch.Tensor`, :class:`DTensor`], optional):
            If given, assumed to be replicated across the ``DeviceMesh``.
        label_smoothing:
            Currently not supported.

    Returns:
        A :class:`DTensor` whose placements depend on ``reduction``:

        - ``reduction="none"`` â€” per-sample loss; inherits the ``target``
          placements (``Shard`` on batch-parallel dims, ``Replicate`` on TP).
        - ``reduction="sum"`` â€” scalar; ``Replicate`` on the TP dim (the custom
          all-reduce makes each rank's local value globally correct over TP),
          ``Partial("sum")`` on every other ``Shard`` mesh dim so that the
          cross-rank reduction happens lazily on materialization/redistribution,
          and ``Replicate`` on ``Replicate`` mesh dims.
        - ``reduction="mean"`` â€” only supported on a one-dimensional mesh; returns
          a fully replicated :class:`DTensor`.

        On a one-dimensional mesh all three cases simplify to a fully replicated
        :class:`DTensor` (the original behavior).

    .. note::
        ``reduction="mean"`` is only supported on a one-dimensional ``DeviceMesh``.
        On a multi-dimensional mesh the per-rank division by ``total_weight`` uses a
        local count, so aggregating across non-TP dims does not yield the correct
        global mean; use ``reduction="sum"`` or ``"none"`` instead and divide by the
        global count yourself if needed.

    Example:
        A sharded DTensor is manually created here to showcase the usage.
        In practice, it is usually the output of a TP module.

        >>> # xdoctest: +SKIP("distributed")
        >>> from torch.distributed.tensor.parallel import loss_parallel
        >>> from torch.distributed.device_mesh import init_device_mesh
        >>> ...
        >>> device_mesh = init_device_mesh("cuda", (8,))
        >>> input = torch.randn(4, 16, device="cuda", requires_grad=True)
        >>> dist_input = distribute_tensor(input, device_mesh, placements=[Shard(1)])
        >>> target = torch.randint(16, (4,), device="cuda")
        >>> with loss_parallel():
        >>>     loss = F.cross_entropy(dist_input, target, reduction="mean")
        >>>     loss.backward()
        >>> ...
    N)Ú_enable_custom_loss_opsÚ_disable_custom_loss_ops© ó    úTC:\Projects\DSCons\.venv\Lib\site-packages\torch\distributed\tensor\parallel\loss.pyr   r      s0   è è € õh ÑÔÐà	€E€E€EåÑÔÐÐÐr   Ú
placements.ÚdimÚreturnc           
      ót  ‡— ˆfd„t          | ¦  «        D ¦   «         }t          |¦  «        dk    r&t          d‰› d| › dt          |¦  «        › d�¦  «        ‚|d         }t          | ¦  «        D ]J\  }}||k    rŒ|                     ¦   «         s*|                     ¦   «         st          d|› d	|› d
�¦  «        ‚ŒK|S )Nc                 óD   •— g | ]\  }}|                      ‰¦  «        ¯|‘ŒS r   ©Úis_shard)Ú.0ÚiÚpr   s      €r   ú
<listcomp>z-_find_all_reduce_mesh_dim.<locals>.<listcomp>   s,   ø€ ÐNÐNÐN™T˜Q ¸a¿jºjÈ¹o¼oÐN�qÐNÐNÐNr   é   zHloss_parallel() requires exactly one mesh dim to shard tensor dimension z, but got placements z with z such mesh dim(s).r   zGloss_parallel() expects non-TP mesh dims to be Shard or Replicate, got z at dim ú.)Ú	enumerateÚlenÚ
ValueErrorr   Úis_replicate)r   r   Úshard_mesh_dimsÚmesh_dimr!   r"   s    `    r   Ú_find_all_reduce_mesh_dimr,   ~   s  ø€ ØNÐNÐNÐN¥Y¨zÑ%:Ô%:ÐNÑNÔN€OÝ
ˆ?ÑÔ˜qÒ Ð Ýð8Øð8ð 8Ø3=ð8ð 8å�?Ñ#Ô#ð8ð 8ð 8ñ
ô 
ð 	
ð
 ˜qÔ!€HÝ˜*Ñ%Ô%ð ð ‰ˆˆ1Ø�Š=ˆ=ØØ—
’
‘”ð 	 §¢Ñ 0Ô 0ð 	Ýð;Ø+,ð;ð ;Ø67ð;ð ;ð ;ñô ð øð €Or   Úmeshc                 óv  — t          | t          ¦  «        r(| j        |k    r| S t          d|› d| j        › d�¦  «        ‚t          | t          j        ¦  «        rDt          d„ |D ¦   «         ¦  «        rt          d|› d�¦  «        ‚t          j        | ||d¬¦  «        S t          d	t          | ¦  «        › �¦  «        ‚)
Nz	Expected z	 but got r%   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S ©Nr   )r    r"   s     r   ú	<genexpr>z#_cast_to_dtensor.<locals>.<genexpr>›   s*   è è € Ð0Ð0 ˆq�zŠz‰|Œ|Ð0Ð0Ð0Ð0Ð0Ð0r   zZloss_parallel() requires a DTensor (not a plain torch.Tensor) when the derived placements u¸    contain Shard â€” this happens on a multi-dimensional mesh with a batch-sharded non-TP dim. Wrap the tensor with DTensor.from_local or distribute_tensor to make the sharding explicit.F)Údevice_meshr   Ú	run_checkzUnsupported type )Ú
isinstancer   r   ÚRuntimeErrorÚtorchr   Úanyr(   Ú
from_localÚ	TypeErrorÚtype)Útensorr   r-   s      r   Ú_cast_to_dtensorr<   ’   sð   € õ �&�'Ñ"Ô"ð <ØÔ 
Ò*Ð*ØˆMåÐT¨:ÐTÐTÀÔ@QÐTÐTÐTÑUÔUÐUÝ	�F�EœLÑ	)Ô	)ð <ÝÐ0Ð0 ZÐ0Ñ0Ô0Ñ0Ô0ð 
	õ ð2Ø/9ð2ð 2ð 2ñô ð õ Ô!Ø °Àuð
ñ 
ô 
ð 	
õ Ð:­D°©L¬LÐ:Ð:Ñ;Ô;Ð;r   Úop_callÚargsÚkwargsc                 ój  — t           j                             | ||¦  «        }|j        €t	          d¦  «        ‚t           j        j                             |j        ¦  «        }t          |t          ¦  «        r|S t          |t          ¦  «        r|d         S t          dt          |¦  «        › d�¦  «        ‚)Nz9op_info.schema should not be None after unwrap_to_op_infor   zUnexpected tensor meta type: r%   )r   Ú_op_dispatcherÚunwrap_to_op_infoÚschemaÚAssertionErrorÚsharding_propagatorÚ_propagate_tensor_metar4   r   Útupler5   r:   )r=   r>   r?   Úop_infoÚtensor_metas        r   rF   rF   ­   s·   € õ
 Ô$×6Ò6°wÀÀfÑMÔM€GØ„~ÐÝØGñ
ô 
ð 	
õ Ô(Ô<×SÒSØŒñô €Kõ �+�zÑ*Ô*ð QØÐÝ	�K¥Ñ	'Ô	'ð Qà˜1Œ~ÐåÐO½4ÀÑ;LÔ;LÐOÐOÐOÑPÔPÐPr   c                 ó¨  — |r| j         t          j        k    rt          ‚t	          j        | t          j        j        ¬¦  «        \  }}|                      |t          j	        ¬¦  «        } |  
                    ¦   «         dk    r| }nIt          j        | |d¬¦  «        }t          j        |t          j        j        j        ||f¬¦  «        }| |z
  }t          j        t          j        |¦  «        |d¬¦  «        }	t          j        |	t          j        j        j        ||f¬¦  «        }	t          j        |	¦  «        }
||
z
  }|s|                     |¦  «        }|S )N)Útype_promotion_kind)ÚdtypeÚmemory_formatr   T)Úkeepdim)ÚreduceOpÚgroup)rL   r6   ÚhalfrD   ÚutilsÚelementwise_dtypesÚELEMENTWISE_TYPE_PROMOTION_KINDÚDEFAULTÚtoÚcontiguous_formatÚnumelÚamaxÚfuncolÚ
all_reduceÚc10dÚReduceOpÚMAXÚnameÚsumÚexpÚSUMÚlog)Úxr   Úhalf_to_floatr-   r+   Úcomputation_dtypeÚresult_dtypeÚshiftedÚx_maxÚshifted_sumexpÚshifted_logsumexpÚresults               r   Ú_log_softmaxrm   Å   sL  € Øð !ØŒ7•e”jÒ Ð Ý Ð Ý&+Ô&>Ø	�uÔDÔLð'ñ 'ô 'Ñ#Ð�|ð 	
�ŠÐ$µEÔ4KˆÑLÔL€AØ‡w‚w�y„y�A‚~€~Øˆˆå”
˜1˜c¨4Ð0Ñ0Ô0ˆÝÔ!Ø�DœMÔ-Ô2¸4ÀÐ:Jð
ñ 
ô 
ˆð �e‘)ˆÝ”Y�uœy¨Ñ1Ô1°3ÀÐEÑEÔE€NÝÔ&Ø¥¤Ô!2Ô!7ÀÀhÐ?Oðñ ô €Nõ œ	 .Ñ1Ô1ÐØÐ(Ñ(€FØð )Ø—’˜<Ñ(Ô(ˆØ€Mr   c                 óâ  — t          t          |d         ¦  «        }t          t          |d         ¦  «        }t          t          |d         ¦  «        }|j        }t          ||                     ¦   «         ¦  «        }t          |j        |¦  «        }t          | ||¦  «        }t          |j        |||j        |¦  «        }	t          |j        |j        |¬¦  «        }
t          |	|
|	j        ¬¦  «        S )Nr   r$   é   ©rI   ©Úrequires_grad)r   r   ÚintÚboolÚ_specr   r   r,   r   rF   rm   Ú_local_tensorr-   r
   rr   )r=   r>   r?   rd   r   re   Úspecr+   Úoutput_tensor_metaÚresÚres_specs              r   Ú_log_softmax_handlerr{   à   sÝ   € õ
 	�W�d˜1”gÑÔ€AÝ
�s�D˜”GÑ
Ô
€CÝ�˜t AœwÑ'Ô'€MàŒ7€DÝ
˜˜QŸUšU™WœWÑ
%Ô
%€CÝ(¨¬¸#Ñ>Ô>€Hå/°¸¸vÑFÔFÐå
�q”¨¨]¸D¼IÀxÑ
PÔ
P€CåØŒ	ØŒØ&ðñ ô €Hõ àØàÔ'ðñ ô ð r   c                 ó¢   — t          t          |d         ¦  «        }t          t          j        |d         ¦  «        }|                     |¦  «        S )Nr   é   )r   r   r6   rL   rV   )r=   r>   r?   Úgrad_outputÚinput_dtypes        r   Ú_log_softmax_backward_handlerr€     s>   € õ
 •w  Q¤Ñ(Ô(€KÝ•u”{ D¨¤GÑ,Ô,€KØ�>Š>˜+Ñ&Ô&Ð&r   rd   ÚtargetÚweightÚlocal_weightÚ	reductionÚignore_indexÚinput_shapeÚchannel_dimr+   c
                 ó¤  ‡‡— |                       ¦   «         ŠdŠ‰dk     rdŠdt          dt          fˆˆfd„}
|�$ |
|¦  «        }|€t          ‚ |
|¦  «        }| |z  } t          j        ||k    |d¦  «        }|                     ‰¦  «        }t          |‰¬¦  «        }|                     |||	¦  «        }t          j        | ‰|¦  «        }| 	                    |||	¦  «        }| 
                    ‰¦  «         }t          j        ||k    |d¦  «        }|t          j        j        k    r ‰dk    r|                      dd	¦  «        }||fS |�†t          | j        ¦  «        }d
|‰<   |                     |¦  «        }t          j        |‰|¦  «         
                    ‰¦  «        }t          j        ||k    |d¦  «        }|                     ¦   «         }n+||k                         ¦   «                              | ¦  «        }|t          j        j        k    r|                     ¦   «         }n,|t          j        j        k    r|                     ¦   «         |z  }||fS )Nr$   ro   r   r‚   r   c                 óp   •— ‰dk    r,dg‰z  }| j         d         |‰<   |                      |¦  «        }n| }|S )Nr$   r   )ÚshapeÚview)r‚   rŠ   Úwr‡   Ún_dimss      €€r   Ú_weight_viewz'_nll_loss_forward.<locals>._weight_view   sM   ø€ Ø�AŠ:ˆ:àðàñˆEð "(¤¨a¤ˆE�+ÑØ—’˜EÑ"Ô"ˆAˆAàˆAØˆr   ©Úoffset_shapeÚ
offset_dimr   g        éÿÿÿÿ)r   r   rD   r6   ÚwhereÚ	unsqueezer   Ú_partition_valueÚgatherÚ_reduce_valueÚsqueezer   ÚNONEÚvalueÚnew_fullÚlistrŠ   Úexpandr`   rV   rb   ÚMEAN)rd   r�   r‚   rƒ   r„   r…   r†   r‡   r-   r+   rŽ   rŒ   Úlocal_wÚsafe_targetÚsafe_target_Úpartial_placementÚsafe_target_partial_Úresult_partialÚresult_reducedrl   Útotal_weightÚ	new_shapeÚwsumr�   s          `               @r   Ú_nll_loss_forwardr©     sh  øø€ ð �UŠU‰WŒW€FØ€KØ�‚z€zØˆð	�Vð 	­ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð ÐØˆL˜Ñ Ô ˆØÐÝ Ð Ø�,˜|Ñ,Ô,ˆØ�‰KˆÝ”+˜f¨Ò4°f¸aÑ@Ô@€KØ×(Ò(¨Ñ5Ô5€Lõ %°+È+ÐVÑVÔVÐØ,×=Ò=Ø�d˜Hñô Ðõ ”\ ! [Ð2FÑGÔG€Nà&×4Ò4°^ÀTÈ8ÑTÔT€NØ×$Ò$ [Ñ1Ô1Ð1€FåŒ[˜ <Ò/°¸Ñ;Ô;€Fà•I”NÔ(Ò(Ð(¨V°aªZ¨ZØ—z’z " cÑ*Ô*ˆØ�|Ð#Ð#àÐÝ˜œ‘M”Mˆ	Ø!#ˆ	�+Ñà�HŠH�YÑÔˆÝŒ|˜A˜{¨LÑ9Ô9×AÒAÀ+ÑNÔNˆÝŒ{˜6 \Ò1°4¸Ñ;Ô;ˆØ—x’x‘z”zˆˆà ,Ò.×3Ò3Ñ5Ô5×8Ò8¸Ñ;Ô;ˆð •I”MÔ'Ò'Ð'Ø—’‘”ˆˆØ	•i”nÔ*Ò	*Ð	*Ø—’‘” Ñ,ˆà�<ÐÐr   c                 ó   ‡— t          t          |d         ¦  «        }|d         }|d         }t          t          |d         ¦  «        }t          t          |d         ¦  «        }|                     ¦   «         dk    rdnd}|j        }	t          |	j        |¦  «        Št          t          |	j        |g¦  «        |¦  «        }
t          ¦   «         f|	j
        j        z  }t          ||
|	j
        ¦  «        }d }|�ƒt          |||	j
        ¦  «        }ˆfd„t          |	j
        j        ¦  «        D ¦   «         }|                     |	j
        |¦  «        j        }|j        d         |j        j        |         k    rt"          ‚|t$          j        j        k    r|
}nà|t$          j        j        k    r-|	j
        j        dk    rt-          d|	j
        j        › d�¦  «        ‚g }t/          |	j        ¦  «        D ]x\  }}|‰k    r"|                     t          ¦   «         ¦  «         Œ-|                     ¦   «         r"|                     t5          ¦   «         ¦  «         Œc|                     |¦  «         Œyt7          |¦  «        }t9          |¦  «        }||c|d<   |d<   t;          | t7          |¦  «        |¦  «        }t=          |j        |j        |�|j        nd ||||j        ||	j
        ‰¦
  «
        \  }}t?          |	j
        ||¬	¦  «        }t          |||j         ¬
¦  «        |fS )Nr   r$   ro   r}   é   c                 óV   •— g | ]%}|‰k    rt          d ¦  «        nt          ¦   «         ‘Œ&S )r   )r	   r   )r    r!   r+   s     €r   r#   z-_nll_loss_forward_handler.<locals>.<listcomp>y  s<   ø€ ð 
ð 
ð 
Ø;<˜˜Xš˜�E�!‰HŒHˆH­9©;¬;ð
ð 
ð 
r   zjloss_parallel() with reduction='mean' is only supported on one-dimensional DeviceMesh; got mesh with ndim=z(. Use reduction='sum' or 'none' instead.rp   rq   )!r   r   rs   r   ru   r,   r   r   r   r   r-   Úndimr<   ÚrangeÚredistributerv   rŠ   rD   r   r™   rš   rž   ÚNotImplementedErrorr&   Úappendr   r   rG   rœ   rF   r©   r
   rr   )r=   r>   r?   rd   r�   r‚   r„   r…   r‡   rw   Útarget_placementsÚall_replicate_placementsrƒ   Úsharded_placementsÚoutput_placementsÚout_placements_listr!   r"   rx   rl   r¦   Úout_specr+   s                         @r   Ú_nll_loss_forward_handlerr¸   ]  s3  ø€ õ
 	�W�d˜1”gÑÔ€AØ�!ŒW€FØ�!ŒW€FÝ•S˜$˜qœ'Ñ"Ô"€IÝ�˜T !œWÑ%Ô%€Là—u’u‘w”w !’|�|�!�!¨€KØŒ7€DÝ(¨¬¸+ÑFÔF€Hõ "Ý  ¤°;°-Ñ@Ô@À+ñô Ðõ !*¡¤˜~°´	´Ñ>ÐÝ˜fÐ&7¸¼ÑCÔC€FØ€LØÐÝ! &Ð*BÀDÄIÑNÔNˆð
ð 
ð 
ð 
Ý@EÀdÄiÄnÑ@UÔ@Uð
ñ 
ô 
Ðð ×*Ò*¨4¬9Ð6HÑIÔIÔWˆØÔ˜aÔ  A¤OÔ$9¸+Ô$FÒFÐFÝ Ð à•I”NÔ(Ò(Ð(Ø-ÐÐð �	œÔ,Ò,Ð,°´´À!Ò1CÐ1CÝ%ðLà”9”>ðLð Lð Lñô ð ð 02ÐÝ˜dœoÑ.Ô.ð 	.ð 	.‰DˆAˆqØ�HŠ}ˆ}Ø#×*Ò*­9©;¬;Ñ7Ô7Ð7Ð7Ø—’‘”ð .Ø#×*Ò*­7©9¬9Ñ5Ô5Ð5Ð5à#×*Ò*¨1Ñ-Ô-Ð-Ð-Ý!Ð"5Ñ6Ô6Ðõ �‰:Œ:€Dà˜vÐ€Dˆ�GˆT�!‰WÝ/°½¸t¹¼ÀfÑMÔMÐå,Ø	ŒØÔØ &Ð 2ˆÔÐ¸ØØØØ	ŒØØŒ	Øñô Ñ€FˆLõ ˜4œ9Ð&7ÐEWÐXÑXÔX€Hõ 	àØà Ô.ð	
ñ 	
ô 	
ð 	ð
ð 
r   r~   r¦   c                 óÚ  — |                      ¦   «         dk     rdnd}|t          j        j        k    r| |z  } |                     |¦  «        }t          j        ||k    |d¦  «        }t          j        |¦  «        }t          ||¬¦  «        }| 	                    |¦  «         
                    ¦   «         }|                     ||	|
¦  «        }|j        j        €t          ‚|j        j                             |j        ¦  «        dz
  }t          j        |j        d         |j        ¬¦  «        }|                      ¦   «         dk    r|||<   nŽ|                      ¦   «         dk    r||||f<   nn|                     |d¦  «        }|j        }|                     d|j        |         ¦  «        }||||f<   |                     |¦  «                             |d¦  «        }|                      ¦   «         |                       ¦   «         cxk    rdk    rn n|                      |¦  «        } |�™d„ t/          |                      ¦   «         ¦  «        D ¦   «         }|j        d         ||<   |                     |¦  «        }t1          |j        ¦  «        }d||<   |                     |¦  «        }t          j        |||¦  «        }| |z  } t          j        ||k    | d¦  «        } |t          j        |¦  «        z   | z  S )	Nro   r   r$   r�   g      ð?)Údevicer’   c                 ó   — g | ]}d ‘ŒS )r$   r   )r    Ú_s     r   r#   z6_nll_loss_and_log_softmax_backward.<locals>.<listcomp>õ  s   € Ð/Ð/Ð/˜1�QÐ/Ð/Ð/r   )r   r   rž   rš   r”   r6   r“   Ú
zeros_liker   r˜   Úflattenr•   Úmask_bufferÚdatarD   rV   rL   ÚarangerŠ   rº   Ú	transposeÚreshaper‹   r®   rœ   r�   r–   ra   )r~   rd   r�   r‚   r„   r…   r¦   r†   r‡   r-   r+   r    Ú
grad_inputr¢   Úmasked_safe_targetÚgrad_updateÚ	arange_1dÚgrad_input_tÚintermidate_shapeÚgrad_input_2dr§   rŒ   Úw_targets                          r   Ú"_nll_loss_and_log_softmax_backwardrÌ   Ã  sÖ  € ð —u’u‘w”w ’{�{�!�!¨€KØ•I”NÔ(Ò(Ð(Ø! LÑ0ˆà×Ò˜kÑ*Ô*€FÝ”+˜f¨Ò4°f¸aÑ@Ô@€KÝÔ! !Ñ$Ô$€Jõ %°+È+ÐVÑVÔVÐØ×%Ò% kÑ2Ô2×:Ò:Ñ<Ô<€KØ*×;Ò;¸KÈÈxÑXÔXÐàÔ$Ô)Ð1ÝÐØ#Ô/Ô4×7Ò7¸
Ô8HÑIÔIÈCÑO€KÝ”ØÔ  Ô#Ð,>Ô,Eðñ ô €Ið
 	‡u‚u�w„w�!‚|€|Ø)4ˆ
Ð%Ñ&Ð&Ø	
�Š‰Œ�AŠˆØ4?ˆ
�9Ð0Ð0Ñ1Ð1à!×+Ò+¨K¸Ñ<Ô<ˆØ(Ô.ÐØ$×,Ò,¨R°´¸Ô1EÑFÔFˆØ7Bˆ�iÐ!3Ð3Ñ4Ø"×'Ò'Ð(9Ñ:Ô:×DÒDÀ[ÐRTÑUÔUˆ
à‡~‚~ÑÔ˜+Ÿ/š/Ñ+Ô+Ð/Ð/Ò/Ð/¨aÒ/Ð/Ð/Ð/Ð/Ø!×+Ò+¨KÑ8Ô8ˆàÐØ/Ð/¥ a§e¢e¡g¤g¡¤Ð/Ñ/Ô/ˆ	Ø!'¤¨a¤ˆ	�+ÑØ—’ 	Ñ*Ô*ˆõ ˜œ‘M”Mˆ	Ø!#ˆ	�+ÑØ�MŠM˜)Ñ$Ô$ˆÝ”<  ;°Ñ7Ô7ˆØ! HÑ,ˆå”+˜f¨Ò4°kÀ1ÑEÔE€Kð �œ 1™œÑ%¨Ñ4Ð4r   c                 ód  — t          t          |d         ¦  «        }t          t          |d         ¦  «        }|d         }|d         }t          t          |d         ¦  «        }t          t          |d         ¦  «        }t          t          |d         ¦  «        }	|                     ¦   «         dk    rdnd}
|j        }t          |j        |
¦  «        }t          t          |j        |
g¦  «        |
¦  «        }t          ¦   «         f|j        j        z  }t          |||j        ¦  «        }|�t          |||j        ¦  «        }|t          j        j        k    r|                     |j        |¦  «        }t%          |¦  «        }||d<   ||c|d<   |d<   t          |	||j        ¦  «        |d<   t'          | t)          |¦  «        |¦  «        }t+          |j        |j        |j        |�|j        nd |||	|j        |
|j        |¦  «        }t1          |j        |j        |¬¦  «        }t          |||j        ¬	¦  «        S )
Nr   r$   ro   r}   r«   é   é   rp   rq   )r   r   rs   r   r   ru   r,   r   r   r   r   r-   r­   r<   r   r™   rš   r¯   rœ   rF   rG   rÌ   rv   rŠ   r
   rr   )r=   r>   r?   r~   rd   r�   r‚   r„   r…   r¦   r‡   rw   r+   r²   r³   rx   rl   r·   s                     r   Ú_nll_loss_backward_handlerrÐ   	  s%  € õ
 •w  Q¤Ñ(Ô(€KÝ�W�d˜1”gÑÔ€AØ�!ŒW€FØ�!ŒW€FÝ•S˜$˜qœ'Ñ"Ô"€IÝ�˜T !œWÑ%Ô%€LÝ�  Q¤Ñ(Ô(€Là—u’u‘w”w !’|�|�!�!¨€KØŒ7€DÝ(¨¬¸+ÑFÔF€Hõ "Ý  ¤°;°-Ñ@Ô@À+ñô Ðõ !*¡¤˜~°´	´Ñ>ÐÝ˜fÐ&7¸¼ÑCÔC€FØÐÝ! &Ð*BÀDÄIÑNÔNˆð •I”NÔ(Ò(Ð(Ø!×.Ò.¨t¬yÐ:KÑLÔLˆõ �‰:Œ:€Dà€Dˆ�Gà˜vÐ€Dˆ�GˆT�!‰Wå˜|Ð-EÀtÄyÑQÔQ€Dˆ�GÝ/°½¸t¹¼ÀfÑMÔMÐå/ØÔ!Ø	ŒØÔØ &Ð 2ˆÔÐ¸ØØØØ	ŒØØŒ	Øñô €Fõ ØŒ	ØŒØ&ðñ ô €Hõ àØàÔ*ðñ ô ð r   c                  óX   — t           j        j                             t          ¦  «         d S r0   )r   rA   Ú_custom_op_handlersÚupdateÚcustomized_loss_opsr   r   r   r   r   `  s#   € ÝÔÔ.×5Ò5Õ6IÑJÔJÐJÐJÐJr   c                  ób   — t           D ]&} t          j        j                             | ¦  «         Œ'd S r0   )rÔ   r   rA   rÒ   Úpop)Ú	custom_ops    r   r   r   d  s<   € Ý(ð Bð Bˆ	ÝÔÔ2×6Ò6°yÑAÔAÐAÐAðBð Br   )CÚ
contextlibÚtypingr   r6   Útorch._prims_commonÚ_prims_commonrR   Ú)torch.distributed._functional_collectivesÚdistributedÚ_functional_collectivesrZ   Ú"torch.distributed.distributed_c10dÚdistributed_c10dr\   r   Útorch.distributed.device_meshr   Útorch.distributed.tensorr   r   r   r	   Ú&torch.distributed.tensor._dtensor_specr
   r   Ú,torch.distributed.tensor._ops._embedding_opsr   Ú'torch.distributed.tensor._ops._math_opsr   r   r   Ú#torch.distributed.tensor._ops.utilsr   Ú(torch.distributed.tensor.placement_typesr   ÚopsÚatenÚ__all__Úcontextmanagerr   rG   rs   r,   r<   Ú_opsÚ
OpOverloadÚobjectÚdictÚstrrF   rm   r{   r€   ÚSizer©   r¸   rÌ   rÐ   ÚdefaultÚ_log_softmax_backward_dataÚnll_loss_forwardÚnll_loss2d_forwardÚnll_loss_backwardÚnll_loss2d_backwardrÔ   r   r   r   r   r   ú<module>rø      sV  ðð Ð Ð Ð Ø Ð Ð Ð Ð Ð à €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø Ð Ð Ð Ð Ð Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GØ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JØ EÐ EÐ EÐ EÐ EÐ Eðð ð ð ð ð ð ð ð ð ð
 >Ð =Ð =Ð =Ð =Ð =Ø >Ð >Ð >Ð >Ð >Ð >ð „y„~€ð Ð
€ð ÔðWð Wñ ÔðWð~¨%°	¸3°Ô*?ð Àcð Ècð ð ð ð ð(<Ø˜i¨˜nÔ-ð<Ø5?ð<àð<ð <ð <ð <ð6QØŒZÔ"ðQà
�˜�Ô
ðQð ��f�ÔðQð ð	Qð Qð Qð Qð0ð ð ð6ØŒZÔ"ðà
�˜�Ô
ðð ��f�Ôðð ð	ð ð ð ðF'ØŒZÔ"ð'à
�˜�Ô
ð'ð ��f�Ôð'ð ð	'ð 'ð 'ð 'ðK ØðK àðK ð �T‰MðK ð ˜4‘-ð	K ð
 ðK ð ðK ð ”ðK ð ðK ð ðK ð ðK ð ˆ6�6ˆ>ÔðK ð K ð K ð K ð\\ØŒZÔ"ð\à
�˜�Ô
ð\ð ��f�Ôð\ð ð	\ð \ð \ð \ðLC5ØðC5àðC5ð ðC5ð �T‰Mð	C5ð
 ðC5ð ðC5ð ðC5ð ”ðC5ð ðC5ð ðC5ð ðC5ð ðC5ð C5ð C5ð C5ðLJØŒZÔ"ðJà
�˜�Ô
ðJð ��f�ÔðJð ð	Jð Jð Jð Jð\ 	ÔÔÐ3ØÔ#Ô+Ð-JØÔÔ!Ð#<ØÔÔ#Ð%>ØÔÔ"Ð$>ØÔÔ$Ð&@ðÐ ðKð Kð KðBð Bð Bð Bð Br   