Ë
    ÄÓ^j0  ã                  ó   — U d dl mZ d dlZd dlZd dlmZmZ d dlmZ d dl	Z	d dl
Zd dlmZ d dlZd dlmZ ddlmZmZ ddlmZmZmZ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$ erd dl%m&Z&m'Z' dZ(da)de*d<   ejV                   G d„ d«      «       Z,ejV                   G d„ d«      «       Z-dd„Z.d d„Z/ej`                  d!d„«       Z1	 	 	 	 	 	 	 	 	 	 d"d„Z2 G d„ de«      Z3d#d„Z4 G d„ d«      Z5	 	 	 	 d$d„Z6	 	 	 	 	 	 d%d„Z7y)&é    )ÚannotationsN)ÚAnyÚTYPE_CHECKING)Úpatch)Ú
OrderedSeté   )ÚconfigÚselect_algorithm)ÚBufferÚChoiceCallerÚLayoutÚMultiTemplateBufferÚOperationBufferÚ
StorageBoxÚ	TensorBox)ÚKernelInputsÚMMKernelInputs)ÚSchedulerNode)ÚNullHandlerÚV)Ú	GeneratorÚSequenceÚdistributed_autotuneúdist.ProcessGroup | NoneÚ_AUTOTUNE_PGc                  ó.   — e Zd ZU dZdZded<   dZded<   y)Ú_DistributedAutotuneStatezA
    State used to track autotuning during a graph_context()
    r   ÚintÚautotuned_indexÚautotuned_local_countN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r    © ó    úo/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_inductor/distributed_autotune.pyr   r   '   s    … ñð €O�SÓð "#Ð˜3Ô"r'   r   c                  ó"   — e Zd ZU ded<   ded<   y)Ú_DistributedAutotuneInfor   ÚindexÚboolÚlocalN)r!   r"   r#   r%   r&   r'   r(   r*   r*   6   s   … àƒJØ„Kr'   r*   c                 ó¬   — t        j                  «       r@t        j                  «       r,t        € t         j                  j                  d¬«      at        S y )NÚpt2_distributed_autotune_pg)Úpg_tag)ÚdistÚis_availableÚis_initializedr   Údistributed_c10dÚ_new_group_with_tagr&   r'   r(   Úget_autotune_pgr6   <   sI   € Ü×ÑÔœt×2Ñ2Ô4äÐÜ×0Ñ0×DÑDØ4ð Eó ˆLô Ðàr'   c                ól   — t         j                  sJ ‚t        | «      }t        |«      }t	        | |«       y)z 
    Finish the distributed autotuning by propagating the autotuning results
    between the ranks and then replacing the placeholder with the real Buffer.
    N)r	   Údistributed_max_autotune_gemmÚ_autotune_local_nodesÚ_syncÚ_autotune_remote_nodes)Ú	schedulerÚautotune_resultsÚchoices_by_indexs      r(   Úscheduler?   H   s5   € ô
 ×/Ò/Ð/Ð/Ü,¨YÓ7ÐÜÐ-Ó.ÐÜ˜9Ð&6Õ7r'   c               #  ó  K  — t        t        j                  d¬«      t        «      rJ ‚t        j                  t        «       «       	 d–— t        j                  t        «       «       y# t        j                  t        «       «       w xY w­w)zd
    Wrapped around processing a graph, sets up figuring out which ranks tune
    which shapes.
    F)Úcheck_poisonedN)Ú
isinstancer   Úget_distributed_autotune_stater   Úset_distributed_autotune_stater   r&   r'   r(   Úgraph_contextrE   S   sg   è ø€ ô Ü	×(Ñ(¸Ô>Ü!ôð ð ô ×$Ñ$Ô%>Ó%@ÔAð8Ûä	×(Ñ(¬«Õ7øŒ×(Ñ(¬«Õ7üs   ‚ABÁA) ÁBÁ)BÂBc                ó  — t         j                  syt        «       x}syt        |«      dk  ryt        j
                  }|j                  }|xj                  dz  c_        ||j                  «       z  |j                  «       k(  }t        ||«      t        j                  j                  t        <   |r|xj                  dz  c_        yt        j                  j                   j"                  j%                  t'        | ||«      «      S )z•
    Used by an op (like `mm`) to determine if the op should be autotuned
    locally (returns None) or remotely (returns a placeholder Buffer).
    Nr   )r	   r8   r6   Úlenr   Údistributed_autotune_stater   ÚsizeÚrankr*   Úcurrent_nodeÚmetaÚ_DISTRIBUTED_AUTOTUNE_KEYr    ÚtorchÚ	_inductorÚirr   ÚcreateÚ_DistributedAutotuneBuffer)ÚnameÚchoicesÚinputsÚlayoutÚautotune_pgÚstater+   r-   s           r(   Úmaybe_autotune_remoterY   d   sß   € ô ×/Ò/Øä*Ó,Ð,ˆKÐ,Øä
ˆ7ƒ|�qÒØä×(Ñ(€EØ×!Ñ!€EØ	×Ò˜QÑÕØ�K×$Ñ$Ó&Ñ&¨+×*:Ñ*:Ó*<Ñ<€Eä5MØˆuó6„A‡N�N×ÑÔ1Ñ2ñ Ø×#Ò# qÑ(Õ#Øä�?‰?×Ñ×'Ñ'×.Ñ.Ü" 4¨°Ó8óð r'   c                  óX   ‡ — e Zd ZU dZded<   	 	 	 	 	 	 	 	 dˆ fd„Z	 	 	 	 dd„Zd	d„Zˆ xZS )
rR   z¬
    A MultiTemplateBuffer which represents a kernel being autotuned on a
    different rank. When `schedule` is called this will be replaced by the
    "real" buffer.
    ÚstrÚ_kernel_namec           	     ób   •— t         ‰| �  ||| j                  g t        i «      ¬«       || _        y )N)Úchoice_timings_fnÚunfiltered_choicesÚallowed_prologue_inps)ÚsuperÚ__init__Ú_dummy_choice_timingsr   r\   )ÚselfÚkernel_namerU   rV   Ú	__class__s       €r(   rb   z#_DistributedAutotuneBuffer.__init__�   s:   ø€ ô 	‰ÑØØØ"×8Ñ8Ø!Ü",¨R£.ð 	ô 	
ð (ˆÕr'   c                ó   — t         ‚©N)ÚNotImplementedError)rd   Ú_hint_overrides     r(   rc   z0_DistributedAutotuneBuffer._dummy_choice_timingsŸ   s
   € ô
 "Ð!r'   c                ó¬  — ddl m} t        j                  t        j
                  dd«      5  t        g | j                  ¢«      }t        | j                  t        «      sJ ‚|j                  | j                  |«      } || j                  |g|j                  «       | j                  «      \  }}t        |t        «      sJ ‚|cddd«       S # 1 sw Y   yxY w)zu
        Given a _SerializedChoice (autotune results from another rank)
        compute the final TensorBox.
        r   )Úautotune_select_algorithmr<   N)r
   rl   r   Úobjectr   Úgraphr   Úoriginal_inputsrB   rV   r   Ú
get_choicer\   Únodesr   )rd   Ú
ser_choicerl   Úkernel_inputsÚchoiceÚbufferÚ_s          r(   Úautotunez#_DistributedAutotuneBuffer.autotune¦   sµ   € õ 	@ä�\‰\œ!Ÿ'™' ;°Ó5ñ 	Ü*Ð+B¨T×-AÑ-AÐ+BÓCˆMÜ˜dŸk™k¬6Ô2Ð2Ð2Ø×*Ñ*¨4¯;©;¸ÓFˆFÙ1Ø×!Ñ!Ø�Ø×#Ñ#Ó%Ø—‘ó	‰IˆF�Aô ˜f¤iÔ0Ð0Ð0Ø÷	÷ 	ò 	ús   ¬BC
Ã
C)re   r[   rU   úlist[Buffer]rV   r   ÚreturnÚNone)rj   z
int | Nonery   zdict[ChoiceCaller, float])rr   Ú_SerializedChoicery   r   )	r!   r"   r#   r$   r%   rb   rc   rw   Ú__classcell__)rf   s   @r(   rR   rR   …   sU   ø… ñð Óð(àð(ð ð(ð ð	(ð
 
õ(ð "Ø(ð"à	"ó"÷r'   rR   c                óp  — t        «       }|sJ ‚dg|j                  «       z  }t        j                  j	                  || |¬«       t        d„ |D «       «      }dg|z  }d}|D ]@  }|D ]9  }t        |t        «      sJ ‚||j                     �J ‚|||j                  <   |dz  }Œ; ŒB ||k(  sJ d|› d|› �«       ‚|S )zT
    Perform the all_gather to collect the autotune results from all the ranks.
    N)Úgroupc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrh   )rG   )Ú.0Úxs     r(   ú	<genexpr>z_sync.<locals>.<genexpr>É   s   è ø€ Ò0 ”S˜—VÑ0ùs   ‚r   r   zcount mismatch: ú != )	r6   rI   rN   ÚdistributedÚall_gather_objectÚsumrB   r{   r+   )r=   rW   Ú
all_statesÚ
node_countr>   Úcheck_countÚother_resultsrt   s           r(   r:   r:   ½   sï   € ô
 "Ó#€KÙÐˆ;ð 26°¸×9IÑ9IÓ9KÑ0K€JÜ	×Ñ×'Ñ'¨
Ð4DÈKÐ'ÔXäÑ0 ZÔ0Ó0€Jà15°¸Ñ0CÐà€KØ#ò ˆØ#ò 	ˆFÜ˜fÔ&7Ô8Ð8Ð8Ø# F§L¡LÑ1Ð9Ð9Ð9Ø-3Ð˜VŸ\™\Ñ*Ø˜1Ñ‰Kñ		ðð ˜Ò$ÐVÐ(8¸¸ÀDÈÈÐ&VÓVÐ$ØÐr'   c                  óL   — e Zd ZdZdd„Zd	d„Zed
d„«       Zedd„«       Zdd„Z	y)r{   zÖ
    This is a serializer for the autotune choice. KernelTemplateChoice can't
    be serialized directly (the template and inputs prevent this) so we need to
    serialize it by parts and reconstruct later on.
    c                ó†   — || _         t        j                  |«      | _        | j	                  |j
                  «      | _        y rh   )r+   r{   Ú_template_uid_from_choiceÚtemplate_uidÚ_compute_kwargsÚdescriptionÚkwargs)rd   r+   rt   s      r(   rb   z_SerializedChoice.__init__à   s4   € ØˆŒ
Ü-×GÑGÈÓOˆÔØ×*Ñ*¨6×+=Ñ+=Ó>ˆ�r'   c                ó&  — | j                  «       }i | j                  ¥}d|v rF|j                  «       d   j                  «       d   }t	        j
                  ||d   «      |d   k(  |d<   i }ddlm}m}  ||«      }	 |||	|||«      }
|
j                  S )z=
        Deserialize the ChoiceCaller and return it.
        ÚBLOCK_Kr   r   ÚEVEN_K)ÚDictKernelTemplateParamsÚKernelTemplateChoice)
Ú_template_from_uidr‘   rq   Úget_sizeÚsympyÚgcdÚkernel_template_choicer•   r–   rt   )rd   rV   rU   Útemplater‘   ÚkÚextra_kwargsr•   r–   ÚparamsÚktcs              r(   rp   z_SerializedChoice.get_choiceå   s�   € ð
 ×*Ñ*Ó,ˆà �D—K‘K�ˆØ˜Ñð
 —‘“˜qÑ!×*Ñ*Ó,¨QÑ/ˆAÜ$Ÿy™y¨¨F°9Ñ,=Ó>À&ÈÑBSÑSˆF�8Ñà')ˆ÷	
ñ
 *¨&Ó1ˆÙ" 8¨V°\À6È6ÓRˆØ�z‰zÐr'   c                ój  — | si S i }| j                  d«      D ]˜  }|j                  dd«      \  }}|j                  «       |j                  «       }}|dk(  rd||<   ŒC|dk(  rd||<   ŒN|j                  «       rt        |«      ||<   Œm|j	                  d«      r|j                  d«      sJ ‚|dd	 ||<   Œš |S )
zI
        Given a template description turn it into input kwargs.
        ú,ú=r   ÚTrueTÚFalseFú'éÿÿÿÿ)ÚsplitÚstripÚisdigitr   Ú
startswithÚendswith)r�   r‘   ÚcfgÚkeyÚvals        r(   r�   z!_SerializedChoice._compute_kwargsÿ   s¿   € ñ
 ØˆIð /1ˆØ×$Ñ$ SÓ)ò 	(ˆCØ—y‘y  aÓ(‰HˆC�Ø—y‘y“{ C§I¡I£K�ˆCØ�fŠ}Ø"��s’Ø˜’Ø#��s’Ø—‘”Ü! #›h��s’à—~‘~ cÔ*¨s¯|©|¸CÔ/@Ð@Ð@Ø! ! B˜i��s’ð	(ð ˆr'   c                ó  — t        | t        j                  «      r<| j                  j                  dk(  ryt        d| j                  j                  ›�«      ‚t        | t        j                  «      ryt        dt        | «      › �«      ‚)z�
        Given a ChoiceCaller figure out which template represents it. This
        is reversed by _template_from_uid().
        Úmmz!torch._inductor.kernel.mm.aten_mmzTODO: kernel z%torch._inductor.kernel.mm.mm_templatezTODO: )rB   r
   ÚExternKernelCallerrt   rS   ÚRuntimeErrorÚTritonTemplateCallerÚtype)rt   s    r(   r�   z+_SerializedChoice._template_uid_from_choice  sq   € ô �fÔ.×AÑAÔBØ�}‰}×!Ñ! TÒ)Ø:ä" ]°6·=±=×3EÑ3EÐ2HÐ#IÓJÐJÜ˜Ô 0× EÑ EÔFØ:ä ¬¨V« ~Ð6Ó7Ð7r'   c                óˆ   — | j                   j                  d«      }t        «       |d      }|dd D ]  }t        ||«      }Œ |S )z2
        See _template_uid_from_choice().
        ú.r   r   N)rŽ   r¨   ÚglobalsÚgetattr)rd   ÚpartsÚobjr�   s       r(   r—   z$_SerializedChoice._template_from_uid+  sO   € ð ×!Ñ!×'Ñ'¨Ó,ˆÜ‹i˜˜a™Ñ!ˆØ�q�r�ò 	"ˆAÜ˜#˜q“/‰Cð	"àˆ
r'   N)r+   r   rt   r   ry   rz   )rV   r   rU   r   ry   zChoiceCaller | None)r�   r[   ry   zdict[str, int | str | bool])rt   r   ry   r[   )ry   r   )
r!   r"   r#   r$   rb   rp   Ústaticmethodr�   r�   r—   r&   r'   r(   r{   r{   Ù   s>   „ ñó?ó
ð4 òó ðð0 ò8ó ð8ô$r'   r{   c                ó>  — g }| j                   D ]Â  }t        |t        «      sŒ|j                  x}€Œ#t        |t        «      rŒ4t        |t
        «      sŒE|j                  x}€ŒT|j                  x}€Œc|j                  t        «      }|€Œ{|j                  sJ ‚|j                  «       \  }}t        |j                  |«      }	|j                  |	«       ŒÄ t        j                   }
t#        |«      |
j$                  k(  s!J dt#        |«      › d|
j$                  › d�«       ‚|S )zt
    Go through the nodes in the scheduler and autotune the kernels which
    should be autotuned by this rank.
    z'incorrect local autotuned nodes found (rƒ   ú))rq   rB   r   ÚnoderR   r   Úorigin_noderL   ÚgetrM   r-   Úget_min_choicer{   r+   Úappendr   rH   rG   r    )r<   r=   r¿   Ú
inner_noderÀ   rL   ÚinfoÚ
min_choicerv   rt   rX   s              r(   r9   r9   6  s.  € ð 13Ðà—‘ò  (ˆÜ˜$¤Ô.ØàŸ)™)Ð#ˆJÐ,Øä�jÔ"<Ô=àä˜*Ô&9Ô:Øà%×1Ñ1Ð1ˆKÐ:Øà×$Ñ$Ð$ˆDÐ-Øà�x‰xÔ1Ó2ˆØˆ<Øà�zŠzÐˆzð
 #×1Ñ1Ó3‰ˆ
�Aä" 4§:¡:¨zÓ:ˆØ×Ñ Õ'ðA (ôD ×(Ñ(€EÜÐÓ  E×$?Ñ$?Ò?ð Ø
1´#Ð6FÓ2GÐ1HÈÈU×MhÑMhÐLiÐijÐkóÐ?ð Ðr'   c                ó  — t        | j                  «      D ]ç  \  }}t        |t        «      sŒt        |j                  x}t
        «      sŒ4|j                  €J ‚|j                  j                  t           }|j                  ||j                     «      }|j                  }t        |t        «      sJ ‚|j                  }t        |t        «      sJ ‚|j                  |j                  k(  sJ ‚| j                  ||||«       Œé y)zo
    Go through the nodes in the scheduler and autotune the nodes that were
    autotuned on remote ranks.
    N)Ú	enumeraterq   rB   r   r¿   rR   rÀ   rL   rM   rw   r+   Údatar   r   rV   Ú_replace_node)	r<   r>   Úir¿   Ú	dist_noderÅ   Úout_tensorboxÚout_storageÚ
out_buffers	            r(   r;   r;   i  së   € ô ˜YŸ_™_Ó-ò D‰ˆˆ4Ü�dœMÕ*¬zØŸ)™)Ð#ˆYÔ&@õ0
ð ×(Ñ(Ð4Ð4Ð4Ø×(Ñ(×-Ñ-Ô.GÑHˆDØ%×.Ñ.Ð/?ÀÇ
Á
Ñ/KÓLˆMà'×,Ñ,ˆKÜ˜k¬:Ô6Ð6Ð6Ø$×)Ñ)ˆJÜ˜j¬/Ô:Ð:Ð:à×$Ñ$¨	×(8Ñ(8Ò8Ð8Ð8à×#Ñ# J°	¸1¸dÕCñDr'   )ry   r   )r<   ú#torch._inductor.scheduler.Schedulerry   rz   )ry   zGenerator[None, None, None])
rS   r[   rT   zlist[ChoiceCaller]rU   rx   rV   r   ry   zTensorBox | None)r=   úlist[_SerializedChoice]ry   úSequence[_SerializedChoice])r<   rÐ   ry   rÑ   )r<   rÐ   r>   rÒ   ry   rz   )8Ú
__future__r   Ú
contextlibÚdataclassesÚtypingr   r   Úunittest.mockr   r™   Útorch._loggingrN   Útorch.distributedr„   r1   Útorch.fxÚtorch.utils._ordered_setr   Ú r	   r
   rP   r   r   r   r   r   r   r   rs   r   r   r<   r   Úvirtualizedr   r   Úcollections.abcr   r   rM   r   r%   Ú	dataclassr   r*   r6   r?   ÚcontextmanagerrE   rY   rR   r:   r{   r9   r;   r&   r'   r(   ú<module>rá      sD  ðÞ "ã Û ß %Ý ã ã Ý  Û Ý /ç &÷÷ ñ ÷ 8Ý $ß 'ñ ß3ð 3Ð à)-€Ð&Ó -ð ×Ñ÷#ð #ó ð#ð ×Ñ÷ð ó ðó
	ó8ð ×Ñò8ó ð8ð Ø
ðØ*ðØ4@ðØJPðàóôB4Ð!4ô 4óp÷8Zñ Zðz0Ø2ð0àó0ðfDØ2ðDà1ðDð 
ôDr'   