ó
    "EñigÁ  ã                   óâ  • S SK r S SKrS SKrS SKrS SKrS SKJr  S SKJ	r	J
r
JrJr  S SKrS SKJr  S SKJr  S SKJrJrJrJrJrJr  S SKJr  S SKJr  \S	\4   r\S
\4   r \RB                  " \"5      r# " S S\RH                  5      r%\%RL                  S\%RN                  S\%RP                  S\%RR                  S\%RT                  S\%RV                  S\%RX                  SSS0r-\." \-5       V Vs0 s H  u  pX_M	     snn r/ " S S\RH                  5      r0\0 V s0 s H  o U Rb                  _M     sn r2\Rf                  " SSSS9 " S S	5      5       r4\Rf                   " S S5      5       r5\Rf                  " SSSS9 " S S
\45      5       r6S\S\\\6S-  \6S-  4      4S  jr7S\S\\6   4S! jr8S\S\\\6S-  \64      4S" jr9S#\S-  S\\S$4   4S% jr: " S& S'5      r; " S( S)5      r< " S* S+5      r=\Rf                  " 5        " S, S-5      5       r> " S. S/5      r? " S0 S15      r@\Rf                   " S2 S35      5       rA\Rf                   " S4 S55      5       rB " S6 S75      rC " S8 S95      rDgs  snn f s  sn f ):é    N)ÚIterator)ÚAnyÚcastÚLiteralÚOptional)ÚFunctionSchema)Ú_ProfilerResult)Ú
_EventTypeÚ_ExtraFields_AllocationÚ_ExtraFields_TorchOpÚ_ProfilerEventÚ_TensorMetadataÚRecordScope)Ú_element_size)Ú_utilsÚKeyÚ	TensorKeyc                   ó  • \ rS rSr\R
                  " 5       r\R
                  " 5       r\R
                  " 5       r\R
                  " 5       r	\R
                  " 5       r
\R
                  " 5       r\R
                  " 5       rSrg)ÚCategoryé   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__ÚenumÚautoÚINPUTÚ	TEMPORARYÚ
ACTIVATIONÚGRADIENTÚAUTOGRAD_DETAILÚ	PARAMETERÚOPTIMIZER_STATEÚ__static_attributes__r   ó    Ú\/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/profiler/_memory_profiler.pyr   r      sO   † Ø�IŠI‹K€EØ—	’	“€IØ—’“€JØ�yŠy‹{€HØ—i’i“k€OØ—	’	“€IØ—i’i“kƒOr&   r   Ú	darkgreenÚ	goldenrodÚblackÚmediumpurpleÚredÚ
mediumblueÚ	royalblueÚgreyc                   óœ   • \ rS rSr\R
                  " 5       r\R
                  " 5       r\R
                  " 5       r\R
                  " 5       r	Sr
g)ÚActioné7   r   N)r   r   r   r   r   r   ÚPREEXISTINGÚCREATEÚINCREMENT_VERSIONÚDESTROYr%   r   r&   r'   r1   r1   7   s/   † Ø—)’)“+€KØ�YŠY‹[€FØŸ	š	›ÐØ�iŠi‹kƒGr&   r1   TF)ÚeqÚunsafe_hashÚfrozenc                   ó4   • \ rS rSr% \R
                  \S'   Srg)r   éA   Údevicer   N)r   r   r   r   Útorchr<   Ú__annotations__r%   r   r&   r'   r   r   A   s   ‡ à�L‰LÖr&   c                   ó\   • \ rS rSr% Sr\\S'   \\S'   S\4S jrS\	S\
4S jrS\4S	 jrS
rg)Ú_StorageéF   zåBundle storage pointer and id.

All profiling logic should use `allocation_id`, however it is useful to
print storage pointers for debugging and unit tests sometimes look up
values using the storage data pointer of a live Tensor.ÚptrÚallocation_idÚreturnc                 óN   • [        U R                  5      S SU R                   S3$ )Nz>18ú (Ú))ÚhexrB   rC   ©Úselfs    r'   Ú__repr__Ú_Storage.__repr__Q   s'   € Ü�d—h‘h“- Ð$ B t×'9Ñ'9Ð&:¸!Ð<Ð<r&   Úotherc                 ób   • [        U[        5      =(       a    U R                  UR                  :H  $ ©N)Ú
isinstancer@   rC   ©rJ   rM   s     r'   Ú__eq__Ú_Storage.__eq__T   s%   € Ü˜%¤Ó*×X¨t×/AÑ/AÀU×EXÑEXÑ/XÐXr&   c                 ó,   • [        U R                  5      $ rO   )ÚhashrC   rI   s    r'   Ú__hash__Ú_Storage.__hash__W   s   € Ü�D×&Ñ&Ó'Ð'r&   r   N)r   r   r   r   Ú__doc__Úintr>   ÚstrrK   ÚobjectÚboolrR   rV   r%   r   r&   r'   r@   r@   F   sB   ‡ ñ?ð 
ƒHØÓð=˜#ô =ðY˜Fð Y tô Yð(˜#÷ (r&   r@   c                   ó  • \ rS rSr% Sr\\S'   \\S'   S\4S jr	SS S\
4S jr\S	\S
-  S\S
-  S\S
-  S\R                  S\S    4
S j5       r\S\S\S    4S j5       r\S\S
-  S\S    4S j5       r\S\\\\\4   4S j5       rSrg
)r   é[   ag  Hashable identifier for a storage which has been assigned an ID.

A detailed description of Tensor IDs and why they are needed is given in
`torch/csrc/profiler/collection.h` when `TensorID` is declared. To
summarize, multiple Storage buffers can map to the same logical Tensor.
This dataclass is used to refer to a concrete in-memory StorageImpl of
a Tensor.
ÚidÚstoragerD   c                 ój   • SU R                    S[        U R                  5      S SU R                   S3$ )Nzid=z: z<24rF   rG   )r_   Úreprr`   r<   rI   s    r'   rK   ÚTensorKey.__repr__i   s1   € Ø�T—W‘W�I˜R¤ T§\¡\Ó 2°3Ð7°r¸$¿+¹+¸ÀaÐHÐHr&   rM   c                 ó4   • U R                   UR                   :  $ rO   )Ú_as_sortablerQ   s     r'   Ú__lt__ÚTensorKey.__lt__l   s   € Ø× Ñ  5×#5Ñ#5Ñ5Ð5r&   Ú	tensor_idNÚstorage_ptrrC   r<   c                 ó@   • U b  Ub  Ub  [        X0[        X5      5      $ g rO   )r   r@   )rh   ri   rC   r<   s       r'   Ú_makeÚTensorKey._makeo   s+   € ð Ñ!ØÑ'ØÑ)ä˜V´¸Ó0TÓUÐUØr&   Úallocc                 óz   • U R                  UR                  UR                  UR                  UR                  5      $ rO   )rk   r_   rB   rC   r<   )Úclsrm   s     r'   Úfrom_allocationÚTensorKey.from_allocation~   s)   € à�y‰y˜Ÿ™ 5§9¡9¨e×.AÑ.AÀ5Ç<Á<ÓPÐPr&   Útc                 ó‚   • Ub<  U R                  UR                  UR                  UR                  UR                  5      $ g rO   )rk   r_   Ústorage_data_ptrrC   r<   )ro   rr   s     r'   Úfrom_tensorÚTensorKey.from_tensor‚   s1   € à‰=Ø—9‘9˜QŸT™T 1×#5Ñ#5°q·±ÈÏÉÓQÐQØr&   c                 óš   • U R                   U R                  R                  U R                  R                  U R                  R
                  4$ rO   )r_   r`   rC   r<   ÚtypeÚindexrI   s    r'   re   ÚTensorKey._as_sortableˆ   s3   € à�w‰w˜Ÿ™×2Ñ2°D·K±K×4DÑ4DÀdÇkÁk×FWÑFWÐWÐWr&   r   )r   r   r   r   rX   rY   r>   r@   rZ   rK   r\   rf   Ústaticmethodr=   r<   r   rk   Úclassmethodr   rp   r   ru   ÚpropertyÚtuplere   r%   r   r&   r'   r   r   [   s  ‡ ñð 	ƒGØÓðI˜#ô Ið6˜Kð 6¨Dô 6ð ðØ˜‘:ðà˜4‘Zðð ˜T‘zðð —‘ð	ð
 
�+Ñ	óó ðð ðQÐ$;ð QÀÈÑ@Uó Qó ðQð ð˜O¨dÑ2ð °xÀÑ7Ló ó ðð
 ðX˜e C¨¨c°3Ð$6Ñ7ó Xó óXr&   ÚnoderD   c              #   ó€  #   • U R                   nU R                  S   [        R                  :X  Ga  U R                  S   R                  [
        R                  :X  aØ  U R                  S:X  aÈ  U(       aÁ  US   R                  S   [        R                  :X  a�  US   R                  S;   aŠ  US   R                  S   R                  (       ai  [        US   R                  S   R                  S   [        5      (       a7  S [        R                  US   R                  S   R                  S   5      4v •  g U R                  S   [        R                  :X  aè  U R                  S   nUR                  b  UR                  b  [!        S5      eUR                  bL  UR                  R"                   H2  u  p4n[        R                  U5      [        R                  U5      4v •  M4     UR                  bM  UR                  R"                   H2  u  pEn[        R                  U5      [        R                  U5      4v •  M4     g g g 7f)Nr   é   ztorch::autograd::AccumulateGrad)zaten::detachz
aten::add_ú'module and optimizer cannot both be set)ÚchildrenÚtypedr
   ÚTorchOpÚscoper   ÚBACKWARD_FUNCTIONÚnameÚinputsrP   r   r   ru   ÚPyCallÚmoduleÚ	optimizerÚAssertionErrorÚ
parameters)r   rƒ   Útyped_fieldsÚ_ÚpÚp_grads         r'   Ú!_extract_parameters_and_gradientsr“   �   sÖ  é € ð �}‰}€Hð 	�
‰
�1‰œ×+Ñ+Ô+Ø�J‰J�q‰M×Ñ¤;×#@Ñ#@Ó@à�I‰IÐ:Ó:ÞØ�Q‰K×Ñ˜aÑ ¤J×$6Ñ$6Ó6Ø�Q‰K×ÑÐ >Ó>Ø�Q‰K×Ñ˜aÑ ×'×'Ü�x ‘{×(Ñ(¨Ñ+×2Ñ2°1Ñ5´×GÑGà”I×)Ñ)¨(°1©+×*;Ñ*;¸AÑ*>×*EÑ*EÀaÑ*HÓIÐIÓIð 
�‰�A‰œ*×+Ñ+Ó	+Ø—z‘z !‘}ˆØ×ÑÑ*¨|×/EÑ/EÑ/QÜ Ð!JÓKÐKØ×ÑÑ*Ø ,× 3Ñ 3× >Ô >‘��fÜ×+Ñ+¨AÓ.´	×0EÑ0EÀfÓ0MÐMÔMñ !?ð ×!Ñ!Ñ-Ø ,× 6Ñ 6× AÔ A‘�˜1Ü×+Ñ+¨AÓ.´	×0EÑ0EÀfÓ0MÐMÔMò !Bð .ð 
,ùs   ‚H<H>c              #   óF   #   • [        U 5       H  u  pUc  M
  Uv •  M     g 7frO   ©r“   )r   r‘   Ú_p_grads      r'   Úextract_parametersr—   ¸   s    é € Ü7¸Ö=‰
ˆØ‹=ØŒGò >ùs   ‚!˜	!c              #   óH   #   • [        U 5       H  u  pUc  M
  X4v •  M     g 7frO   r•   )r   r‘   r’   s      r'   Úextract_gradientsr™   ¾   s%   é € ô 7°tÖ<‰	ˆØÓØ�)ŒOò =ùs   ‚"˜
"Úevent.c                 óæ   • / nU (       a^  U R                   S   [        R                  :X  a(  UR                  U R                   S   R                  5        U R
                  n U (       a  M^  [        U5      $ ©Nr   r�   )r„   r
   r…   Úappendr†   Úparentr~   )rš   Úscopess     r'   Ú
get_scopesr    Æ   sV   € Ø€FÞ
Ø�;‰;�q‰>œZ×/Ñ/Ó/Ø�M‰M˜%Ÿ+™+ a™.×.Ñ.Ô/Ø—‘ˆ÷ ˆ%ô �‹=Ðr&   c                   ó®   • \ rS rSrSr\S\S\\S-  S4   4S j5       r	\S\S\\
S4   4S j5       r\S\4S	 j5       r\S
\S\\
S4   S-  4S j5       rSrg)ÚSchemaMatcheréÏ   aÒ  Lookup operator schema based on profiled name.

When profiling we record the operator's name but not the schema. However
some analysis requires that information. Fortunately we can look up
registered schema from the recorded name. We do not, however, record the
overload and so we must compare the profiled arguments with all overloads
to determine viable matches.

Note: Once https://github.com/pytorch/pytorch/issues/78871 is completed
this code will be obsolete.
rr   rD   N.c           
      óT  • SnU R                  U5       Hh  nU=(       d    UR                   Vs/ s H  nSPM     snn[        UR                  5       H&  u  pVX%==   [        UR                  SS5      -  ss'   M(     Mj     [        U=(       d    S UR                   5       5      $ s  snf )a  Determine which inputs may have mutated based on function schema.

Note that we don't need to resolve down to a single schema to perform
this analysis. An input is mutable if it is mutable in any overload. In
practice, however, it is overwhelmingly common to match a single
overload. If we cannot find any valid schema then we must be
conservative and assume all inputs are mutable.
NFÚis_writec              3   ó&   #   • U  H  nS v •  M	     g 7frO   r   )Ú.0r�   s     r'   Ú	<genexpr>Ú3SchemaMatcher.inputs_are_mutable.<locals>.<genexpr>í   s   é € Ð 8ªx¨!¥ªxùs   ‚)Úmatch_schemasÚ	argumentsÚ	enumerateÚgetattrÚ
alias_infor~   r‰   )ro   rr   ÚmutableÚschemar�   ÚiÚargs          r'   Úinputs_are_mutableÚ SchemaMatcher.inputs_are_mutableÜ   s‘   € ð &*ˆØ×'Ñ'¨Ö*ˆFØ×B°×1AÒ1AÓ!BÒ1A¨A£%Ñ1AÑ!BˆGÜ# F×$4Ñ$4Ö5‘�à“
œg c§n¡n°jÀ%ÓHÑH•
ó 6ñ +ô �W×8Ñ 8¨q¯xªxÓ 8Ó9Ð9ùò "Cs   ®B%c                 óÌ   ^ ^^• [        S UR                   5       5      mS[        4U U4S jjm[        U4S jT R                  UR                  5      =(       d    S 5       5      $ )Nc              3   óú   #   • U  Hl  n[        U[        5      (       a  [        R                  U5      O<[        U[        5      (       a&  U Vs/ s H  n[        R                  U5      PM     snOUv •  Mn     g s  snf 7frO   )rP   r   r   ru   Úlist©r§   r±   Újs      r'   r¨   Ú.SchemaMatcher.match_schemas.<locals>.<genexpr>ñ   sr   é € ð 
ò �ô ˜!œ_×-Ñ-ô ×!Ñ! !Ô$ô
 ˜!œT×"Ñ"ñ 56Ó6²A¨q”)×'Ñ'¨Ö*±AÒ6ð ôò ùò 7ùs   ‚A	A;ÁA6Á*A;rD   c           	      ó¤   >• [        U R                  5      [        T5      :H  =(       a(    [        U4S j[        TU R                  SS9 5       5      $ )Nc              3   ó^   >#   • U  H"  u  pTR                  XR                  5      v •  M$     g 7frO   )Ú_types_matchrx   )r§   ÚobservedÚ
schema_argro   s      €r'   r¨   Ú?SchemaMatcher.match_schemas.<locals>.matches.<locals>.<genexpr>   s2   øé € ð Cò-Ñ(�Hð × Ñ  ¯?©?×;Ð;ò-ùs   ƒ*-T©Ústrict)Úlenr«   ÚallÚzip)r°   ro   Ú	signatures    €€r'   ÚmatchesÚ,SchemaMatcher.match_schemas.<locals>.matchesÿ   sM   ø€ Ü�v×'Ñ'Ó(¬C°	«NÑ:÷ ¼sô Cä,/Ø˜v×/Ñ/¸ò-óCó @ð r&   c              3   óF   >#   • U  H  nT" U5      (       d  M  Uv •  M     g 7frO   r   )r§   ÚsrÇ   s     €r'   r¨   rº     s   øé € ÐOÒ @˜1ÁGÈAÇJ—Q‘QÒ @ùs   ƒ!˜	!r   )r~   r‰   r\   Úlookup_schemasrˆ   )ro   rr   rÇ   rÆ   s   ` @@r'   rª   ÚSchemaMatcher.match_schemasï   s[   ú€ äñ 
ð —X’Xó
ó 
ˆ	ð	œt÷ 	ð 	ô ÔO × 2Ñ 2°1·6±6Ó :× @¸bÐ @ÓOÓOÐOr&   c                 ó  • [        U[        R                  R                  5      (       a,  UR	                  5       nUS L =(       d    U R                  X5      $ [        U[        R                  R                  5      (       a  gUR                  [        R                  R                  R                  5       5      (       a)  [        U[        5      =(       a    [        S U 5       5      $ [        R                  R                  [        4[        R                  R                  [        S 5      4[        R                  R                   ["        4[        R                  R$                  [&        4[        R                  R(                  [*        4[        R                  R,                  [.        4[        R                  R0                  ["        [&        [*        [.        444nU H"  u  pE[        X$5      (       d  M  [        X5      s  $    US L $ )NTc              3   óB   #   • U  H  n[        U[        5      v •  M     g 7frO   )rP   r   ©r§   r±   s     r'   r¨   Ú-SchemaMatcher._types_match.<locals>.<genexpr>  s   é € ð 6Ú2:¨Q”
˜1œi×(Ð(²(ùs   ‚)rP   r=   Ú_CÚOptionalTypeÚgetElementTyper½   ÚAnyTypeÚisSubtypeOfÚListTypeÚ	ofTensorsr·   rÄ   Ú
TensorTyper   ÚNoneTyperx   ÚBoolTyper\   ÚIntTyperY   Ú	FloatTypeÚfloatÚComplexTypeÚcomplexÚ
NumberType)ro   r¾   Úschema_typeÚtype_mapÚjit_typeÚpy_typess         r'   r½   ÚSchemaMatcher._types_match	  so  € ä�k¤5§8¡8×#8Ñ#8×9Ñ9Ø%×4Ñ4Ó6ˆKØ˜tÐ#×N s×'7Ñ'7¸Ó'NÐNä�k¤5§8¡8×#3Ñ#3×4Ñ4Øà×"Ñ"¤5§8¡8×#4Ñ#4×#>Ñ#>Ó#@×AÑAÜ˜h¬Ó-÷ ´#ñ 6Ù2:ó6ó 3ð ô
 �X‰X× Ñ ¤)Ð,Ü�X‰X×Ñ¤ T£
Ð+Ü�X‰X×Ñ¤Ð%Ü�X‰X×ÑœsÐ#Ü�X‰X×Ñ¤Ð'Ü�X‰X×!Ñ!¤7Ð+Ü�X‰X× Ñ ¤4¬¬e´WÐ"=Ð>ðE
ˆó #+ÑˆHÜ˜+×0Ó0Ü! (Ó5Ò5ñ #+ð ˜4ÐÐr&   rˆ   c                 ó‚   •  SU ;  a  g [        [        R                  R                  U 5      5      $ ! [         a     g f = f)Nz::)r~   r=   rÑ   Ú_jit_get_schemas_for_operatorÚRuntimeError)rˆ   s    r'   rË   ÚSchemaMatcher.lookup_schemas+  s@   € ð	ð ˜4ÓØÜœŸ™×?Ñ?ÀÓEÓFÐFøÜó 	Ùð	ús   ‚1 ‰'1 ±
>½>r   )r   r   r   r   rX   r|   r   r~   r\   r³   r   rª   r½   r{   rZ   rË   r%   r   r&   r'   r¢   r¢   Ï   s¶   † ñ
ð ð:Ð#7ð :¸EÀ$ÈÁ+ÈsÐBRÑ<Só :ó ð:ð$ ðPÐ2ð P°u¸^ÈSÐ=PÑ7Qó Pó ðPð2 ð °Dó  ó ð ðB ð˜Sð  U¨>¸3Ð+>Ñ%?À$Ñ%Fó ó ór&   r¢   c                   ó\   • \ rS rSrS\SS4S jrS\\   4S jr\	S\
\S4   4S j5       rS	rg)
ÚOpTreeiA  ÚresultrD   Nc                 ó|   • UR                  5       U l        [        [        U R	                  5       S S95      U l        g )Nc                 ó   • U R                   $ rO   ©Ústart_time_ns©Úxs    r'   Ú<lambda>Ú!OpTree.__init__.<locals>.<lambda>D  s   € ÀAÇOÂOr&   ©Úkey)Úexperimental_event_treeÚ_root_nodesr~   ÚsortedÚdfsÚ_sorted_nodes©rJ   rì   s     r'   Ú__init__ÚOpTree.__init__B  s.   € Ø!×9Ñ9Ó;ˆÔÜ"¤6¨$¯(©(«*Ñ:SÑ#TÓUˆÕr&   c              /   óh   #   • [         R                  " U R                  /UQ70 UD6 S h  v•N   g  N7frO   )r   Útraverse_dfsrø   ©rJ   ÚargsÚkwargss      r'   rú   Ú
OpTree.dfsF  s)   é € Ü×&Ò& t×'7Ñ'7ÐI¸$ÒIÀ&ÑI×IÓIùs   ‚(2ª0«2.c                 ó   • U R                   $ rO   )rû   rI   s    r'   Úsorted_nodesÚOpTree.sorted_nodesI  s   € à×!Ñ!Ð!r&   )rø   rû   )r   r   r   r   r	   rý   r   r   rú   r}   r~   r  r%   r   r&   r'   rë   rë   A  sP   † ðV˜ð V°4ô VðJ h¨~Ñ&>ô Jð ð"˜e N°CÐ$7Ñ8ó "ó ó"r&   rë   c                   ón   • \ rS rSrS\SS4S jrS\S-  SS4S jr\S\	S\
\   4S	 j5       rS
\4S jrSrg)ÚSizeMapiN  Úop_treerD   Nc                 óª  • 0 U l         UR                   GHq  nUR                  S   [        R                  :X  a8  U R                  UR                  S   5       H  nU R                  U5        M     M]  UR                  S   [        R                  :X  d  M€  UR                  S   nUR                  b  UR                  b  [        S5      eUR                  bB  UR                  R                   H(  u  pVnU R                  U5        U R                  U5        M*     UR                  c  GM  UR                  R                   HD  u  pgnU R                  U5        U R                  U5        U H  u  pSU R                  U5        M     MF     GMt     0 n	UR                   H�  nUR                  S   [        R                  :X  d  M&  UR                  S   n
[        R                  U
5      nU(       d  MS  [        U
R                   5      nU	R#                  X¼5      nXÜ:w  d  M€  U SU 3n[$        R'                  SU5        MŸ     U R                   R)                  U	5        g )Nr   r�   r‚   z vs. z(Mismatch between allocation and free: %s)Ú_valuesr  r„   r
   r…   Ú_flat_tensor_inputsÚ_update_valuesrŠ   r‹   rŒ   r�   rŽ   Ú
Allocationr   rp   ÚabsÚ
alloc_sizeÚ
setdefaultÚlogÚwarningÚupdate)rJ   r
  r   rr   r�   r�   r‘   r’   ÚstateÚallocationsÚalloc_fieldsrö   Únew_sizeÚ
prior_sizeÚdeltas                  r'   rý   ÚSizeMap.__init__O  sò  € Ø-/ˆŒà×(Õ(ˆDØ�z‰z˜!‰}¤
× 2Ñ 2Ó2Ø×1Ñ1°$·*±*¸Q±-Ö@�AØ×'Ñ'¨Ö*ó Að —‘˜A‘¤*×"3Ñ"3Õ3Ø#Ÿz™z¨!™}�à ×'Ñ'Ñ3Ø$×.Ñ.Ñ:ä(Ð)RÓSÐSØ×&Ñ&Ñ2Ø(4×(;Ñ(;×(FÔ(F™˜˜fØ×+Ñ+¨AÔ.Ø×+Ñ+¨FÖ3ñ )Gð  ×)Ñ)Ô5Ø,8×,BÑ,B×,MÔ,MÑ(˜ 5Ø×+Ñ+¨AÔ.Ø×+Ñ+¨FÔ3Û$)™D˜AØ ×/Ñ/°Ö2ó %*ô -Nñ% )ð0 -/ˆØ×(Ô(ˆDØ�z‰z˜!‰}¤
× 5Ñ 5Õ5Ø#Ÿz™z¨!™}�Ü×/Ñ/°Ó=�ß�3Ü" <×#:Ñ#:Ó;�HØ!,×!7Ñ!7¸Ó!F�Jð "Õ-Ø#- ,¨e°H°:Ð >˜ÜŸ™Ð$NÐPUÖVñ! )ð$ 	�‰×Ñ˜KÕ(r&   rr   c           	      óÀ  • [         R                  U5      nUbÆ  UbÂ  UR                  [        R                  :X  a£  [        S [        UR                  =(       d    S/UR                  =(       d    S/SS9 5       5      nU[        UR                  5      -  nUS:  a  [        SU 35      e[        U R                  R                  US5      U5      U R                  U'   g g g g )Nc              3   ó6   #   • U  H  oS    US   -  v •  M     g7f©r   r�   Nr   rÏ   s     r'   r¨   Ú)SizeMap._update_values.<locals>.<genexpr>ƒ  s   é € ð Ú%W �!‘�q˜‘t–Ò%Wùs   ‚r�   TrÁ   r   z$num_bytes must be non-negative, got )r   ru   Úlayoutr=   ÚstridedÚmaxrÅ   ÚsizesÚstridesr   Údtyper�   r  Úget)rJ   rr   rö   ÚnÚ	num_bytess        r'   r  ÚSizeMap._update_values  s¿   € Ü×#Ñ# AÓ&ˆØ‰?˜q™}°·±¼U¿]¹]Ó1Jäñ Ü%(¨¯©¯°Q°C¸¿¹×9IÀqÀcÐRVÒ%Wóó ˆAð œM¨!¯'©'Ó2Ñ2ˆIØ˜1‹}Ü$Ð'KÈIÈ;Ð%WÓXÐXÜ # D§L¡L×$4Ñ$4°S¸!Ó$<¸iÓ HˆD�L‰L˜Òð 2K˜}ˆ?r&   Úopc              #   ó®   #   • U R                    H?  n[        U[        5      (       a  Uv •  M  [        U[        5      (       d  M5  U S h  v•N   MA     g  N	7frO   )r‰   rP   r   r·   )r+  r±   s     r'   r  ÚSizeMap._flat_tensor_inputsŒ  s>   é € à—”ˆAÜ˜!œ_×-Ñ-Ø”Ü˜Aœt×$Ó$Ø—’ò	 ñ ùs   ‚>AÁAÁ	AÁ

Arö   c                 ó    • U R                   U   $ rO   ©r  ©rJ   rö   s     r'   Ú__getitem__ÚSizeMap.__getitem__”  s   € Ø�|‰|˜CÑ Ð r&   r/  )r   r   r   r   rë   rý   r   r  r{   r   r   r  r   r1  r%   r   r&   r'   r	  r	  N  se   † ð.) ð .)¨4ô .)ð`I °$Ñ 6ð I¸4ô Ið ðÐ 4ð ¸À/Ñ9Ró ó ðð!˜y÷ !r&   r	  c                   ón   • \ rS rSr% Sr\S-  \S'   Sr\S-  \S'   \	S\4S j5       r
\	S\4S j5       rS	rg)
ÚDataFlowEdgei˜  NÚinput_versionFÚmutatedrD   c                 ó   • U R                   S L $ rO   )r5  rI   s    r'   Úis_allocationÚDataFlowEdge.is_allocation�  s   € à×!Ñ! TÐ)Ð)r&   c                 ó   • U R                   S L $ rO   )r6  rI   s    r'   Úis_deletionÚDataFlowEdge.is_deletion¡  s   € à�|‰|˜tÐ#Ð#r&   r   )r   r   r   r   r5  rY   r>   r6  r\   r}   r8  r;  r%   r   r&   r'   r4  r4  ˜  sR   ‡ à $€M�3˜‘:Ó$Ø €GˆT�D‰[Ó àð*˜tó *ó ð*ð ð$˜Tó $ó ó$r&   r4  c                   óÊ   • \ rS rSrS\SSSS4S jrS\\\4   4S jr	\
S\\\\\4   4   4S	 j5       r\
S\\\4   4S
 j5       r\
S\\S4   4S j5       r\
S\4S j5       rSrg)ÚDataFlowNodei¦  rš   ÚgraphÚDataFlowGraphrD   Nc           	      ó,  • Xl         X l        U R                  5       U l        U R                  R	                  5        HF  u  p4UR
                  (       d  M  UR                  (       a  M+  U R                  R                  U5        MH     U R                  R	                  5        VVs0 s H"  u  pVXVU R                  R                  U5      4_M$     nnn[        S UR                  5        5       5      (       d  [        SU SU R                   35      eg s  snnf )Nc              3   ó.   #   • U  H  u  pX:H  v •  M     g 7frO   r   r¸   s      r'   r¨   Ú(DataFlowNode.__init__.<locals>.<genexpr>²  s   é € Ð8Ò&7™d˜a�1–6Ò&7ùs   ‚zversion mismatch: z, )Ú_eventÚ_graphÚ_determine_edgesÚ_edgesÚitemsr6  r8  ÚbumpÚoutputsÚlookuprÄ   Úvaluesr�   )rJ   rš   r?  rö   ÚedgeÚkÚvÚversionss           r'   rý   ÚDataFlowNode.__init__§  sÚ   € ØŒØŒØ59×5JÑ5JÓ5LˆŒàŸ™×*Ñ*Ö,‰IˆCØ�|�|‰| D×$6×$6Ñ$6Ø—‘× Ñ  Ö%ñ -ð
 ?C¿l¹l×>PÑ>PÔ>RÔSÒ>R±d°a�A˜4Ÿ;™;×-Ñ-¨aÓ0Ð1Ò1Ñ>RˆÑSÜÑ8 h§o¡oÔ&7Ó8×8Ñ8Ü Ð#5°h°Z¸rÀ$Ç+Á+ÀÐ!OÓPÐPð 9ùó Ts   Â#)Dc                 ó  • [        [        R                  " U R                  /5      5      n0 nS U 5        Hç  n[	        UR
                  [        R                  U5      SS9 H¸  u  pE[        U[        5      (       a@  [        R                  U5      nUR                  U[        5       5      R                  U5        MZ  [        U[        5      (       d  Mq  U HA  n[        R                  U5      nUR                  U[        5       5      R                  U5        MC     Mº     Mé     [         R"                  " [$        5      nUR'                  5        HX  u  piUc  M
  U(       a  U R(                  R+                  U5      OSX†   l        SU	;   =(       d    [        U	5      S:H  n
X¨U   l        MZ     U H¹  nUR0                  S   [2        R4                  :X  d  M&  UR0                  S   R6                  S:  d  ME  [        R9                  UR0                  S   5      nX†   nUb  UR.                  c  [;        SU 35      eS Ul        U(       a  U R(                  R+                  U5      OSUl        M»     U Ho  nUR0                  S   [2        R4                  :X  d  M&  UR0                  S   R6                  S:”  d  ME  S U[        R9                  UR0                  S   5         l        Mq     [=        [?        S	 UR'                  5        5       5      5      $ )
Nc              3   ó„   #   • U  H6  oR                   S    [        R                  :X  d  M%  UR                   S   v •  M8     g7fr  )r„   r
   r…   rÏ   s     r'   r¨   Ú0DataFlowNode._determine_edges.<locals>.<genexpr>º  s-   é € ÐS¢w !·'±'¸!±*Ä
×@RÑ@RÑ2R“:�1—7‘7˜1–:¢wùs
   ‚$A ªA TrÁ   éÿÿÿÿrO   r   r�   zDouble delete: c              3   ó6   #   • U  H  u  pUc  M
  X4v •  M     g 7frO   r   ©r§   rN  rO  s      r'   r¨   rT  ç  s   é € ÐMªm¡d a¸q›6˜A�6ªmùs   ‚	�
) r~   r   r   rD  rÅ   r‰   r¢   r³   rP   r   r   ru   r  ÚsetÚaddr·   ÚcollectionsÚdefaultdictr4  rH  rE  rK  r5  r6  r„   r
   r  r  rp   r�   Údictrù   )rJ   ÚsubtreeÚmutable_by_keyr+  Úop_inputr¯   rö   Ú
op_input_iÚedgesÚmutable_setr6  r±   rM  s                r'   rF  ÚDataFlowNode._determine_edgesµ  s\  € Üœ×+Ò+¨T¯[©[¨MÓ:Ó;ˆð DFˆÙS¡wÖSˆBÜ%(Ø—	‘	œ=×;Ñ;¸BÓ?Èô&Ñ!�ô ˜h¬×8Ñ8Ü#×/Ñ/°Ó9�CØ"×-Ñ-¨c´3³5Ó9×=Ñ=¸gÖFô   ¬$×/Ó/Û&.˜
Ü'×3Ñ3°JÓ?˜Ø&×1Ñ1°#´s³uÓ=×AÑAÀ'ÖJó '/ó&ñ Tô  ×'Ò'¬Ó5ˆØ .× 4Ñ 4Ö 6ÑˆCØ‹ÞFI¨4¯;©;×+=Ñ+=¸cÔ+BÈr�‘
Ô(ð
   ;Ñ.×R´E¸+Ó4FÈ'Ñ4Q�Ø%,�c‘
Ö"ñ !7ó ˆAØ�w‰w�q‰zœZ×2Ñ2Õ2°q·w±w¸q±z×7LÑ7LÈqÕ7PÜ×/Ñ/°·±¸±
Ó;�Ø‘z�Ø‘? t§|¡|Ñ';Ü(¨?¸3¸%Ð)@ÓAÐAØ#�”Þ@C T§[¡[×%7Ñ%7¸Ô%<È�Ö"ñ ó ˆAØ�w‰w�q‰zœZ×2Ñ2Õ2°q·w±w¸q±z×7LÑ7LÈqÕ7PØMQ�”i×/Ñ/°·±¸±
Ó;Ñ<ÖJñ ô
 ”FÑM¨e¯k©k¬mÓMÓMÓNÐNr&   c           
      óî   • U R                   R                  5        VVs0 s HH  u  pUR                  (       a  M  U[        UR                  5      [        [        UR                  5      4_MJ     snn$ s  snnf rO   )rG  rH  r8  r\   r6  r   rY   r5  ©rJ   rN  rO  s      r'   r‰   ÚDataFlowNode.inputsé  s`   € ð Ÿ™×)Ñ)Ô+ô	
ò ,‘�Ø—?•?ó =ˆA”�Q—Y‘Y“¤¤c¨1¯?©?Ó!;Ð<Ò<Ù+ò	
ð 	
ùó 
s
   žA1¹4A1c                 ó  • U R                   R                  5        VVs0 s HX  u  pUR                  (       a  UR                  (       a  UR                  (       d  M:  XR
                  c  SOUR
                  S-   _MZ     snn$ s  snnf rœ   )rG  rH  r8  r;  r6  r5  re  s      r'   rJ  ÚDataFlowNode.outputsó  se   € ð Ÿ™×)Ñ)Ô+ô
â+‘�Ø——¨¯¯¸!¿)½)ó EˆA—O‘OÑ+‰q°·±À1Ñ1DÒDÙ+ò
ð 	
ùó 
s   ž9BÁ"B.c                 óV   • [        S U R                  R                  5        5       5      $ )Nc              3   óv   #   • U  H/  u  pUR                   (       d  M  UR                  (       d  M+  Uv •  M1     g 7frO   )r8  r;  rW  s      r'   r¨   Ú-DataFlowNode.intermediates.<locals>.<genexpr>ý  s&   é € ð 
Ú-‘$�!°·µ‹AÀQÇ]Å]�A‰AÒ-ùs   ‚9�9°	9)r~   rG  rH  rI   s    r'   ÚintermediatesÚDataFlowNode.intermediatesû  s)   € äñ 
ØŸ+™+×+Ñ+Ô-ó
ó 
ð 	
r&   c                 ó.   • U R                   R                  $ rO   )rD  rð   rI   s    r'   Ú
start_timeÚDataFlowNode.start_time  s   € à�{‰{×(Ñ(Ð(r&   )rG  rD  rE  )r   r   r   r   r   rý   r\  r   r4  rF  r}   r~   r\   rY   r‰   rJ  rl  ro  r%   r   r&   r'   r>  r>  ¦  sÊ   † ðQ˜nð Q°_ð QÈô Qð2O $ y°,Ð'>Ñ"?ô 2Oðh ð
˜˜Y¨¨d°C¨iÑ(8Ð8Ñ9ó 
ó ð
ð ð
˜˜i¨˜nÑ-ó 
ó ð
ð ð
˜u Y° ^Ñ4ó 
ó ð
ð
 ð)˜Có )ó ó)r&   r>  c                   óÐ   • \ rS rSrS\SS4S jr\S\\S4   4S j5       r	SS jr
\S\\S4   4S	 j5       r\S\S\\S4   4S
 j5       rS\S\4S jrS\SS4S jrS\SS4S jrSrg)r@  i  r
  rD   Nc                 óþ   • Xl         U R                  U5      U l        0 U l        U R                   Vs/ s H  n[        X 5      PM     snU l        U R                  R                  S S9  U R                  5         g s  snf )Nc                 ó   • U R                   $ rO   )ro  rñ   s    r'   ró   Ú(DataFlowGraph.__init__.<locals>.<lambda>  s   € ¨A¯LªLr&   rõ   )	Ú_op_treeÚ_extract_leaf_eventsÚ_leaf_eventsÚ_active_versionÚleaf_eventsr>  Ú_flow_nodesÚsortÚvalidate)rJ   r
  Úes      r'   rý   ÚDataFlowGraph.__init__  sm   € ØŒØ ×5Ñ5°gÓ>ˆÔØ<>ˆÔØ;?×;KÒ;KÓLÒ;K°aœL¨Ö1Ñ;KÑLˆÔØ×Ñ×ÑÑ"8ÐÑ9Ø�‰�ùò Ms   ²A:.c                 ó,   • [        U R                  5      $ rO   )r~   rz  rI   s    r'   Ú
flow_nodesÚDataFlowGraph.flow_nodes  s   € ä�T×%Ñ%Ó&Ð&r&   c           	      óh  • [        5       nU R                   Hg  n[        UR                  R                  5       5      nX-  nU(       a2  [	        SUR
                  R                   SUR                   SU 35      eX-  nMi     0 nU R                   HŸ  nUR                  R                  5        H0  u  nu  pxUR                  US5      n	X˜:w  d  M!  [	        SU	 SU 35      e   UR                  R                  5        H0  u  phUR                  Xh5      n
XŠ:  a  [	        SU SU
 35      eX…U'   M2     M¡     g )Nzduplicate outputs: Ú r   z%version mismatch for input: expected z, got zversion regression: z < )
rX  r€  rJ  rH  r�   rD  rˆ   rG  r‰   r'  )rJ   rJ  r   Únode_outputsÚ
duplicatesÚtensor_versionsrö   r�   ÚversionÚexpectedÚprior_versions              r'   r|  ÚDataFlowGraph.validate  s6  € ä.1«eˆØ—O”OˆDÜ˜tŸ|™|×1Ñ1Ó3Ó4ˆLØ Ñ/ˆJÞÜ$Ø)¨$¯+©+×*:Ñ*:Ð);¸1¸T¿[¹[¸MÈÈ:È,ÐWóð ð Ñ#ŠGñ $ð 13ˆØ—O”OˆDØ%)§[¡[×%6Ñ%6Ö%8Ñ!�‘\�aØ*×.Ñ.¨s°AÓ6�ØÕ&Ü(Ø?À¸zÈÐPWÈyÐYóð ñ &9ð !%§¡× 2Ñ 2Ö 4‘�Ø /× 3Ñ 3°CÓ A�ØÓ*Ü(Ø.¨w¨i°s¸=¸/ÐJóð ð (/ Ó$ó !5ò $r&   c                 ó   • U R                   $ rO   )rw  rI   s    r'   ry  ÚDataFlowGraph.leaf_events1  s   € à× Ñ Ð r&   c                 óž   ^^• / mS[         S[        4S jmS[         4UU4S jjnU R                  US9 H  nM     [        [	        TS S95      $ )a7  Partially traverse the op tree and extract top level ops.

Consider the following code:
```
with record_function("My annotation"):
    x.zero_()
    y.zero_()
```

The op tree (assuming no Autograd) will look like:
  <Python context>
    TorchOp: "My annotation"
      TorchOp: zero_
        TorchOp: fill_
      TorchOp: zero_
        TorchOp: fill_

The recursive structure of operator calls makes data flow unwieldy.
In order to simplify analysis we would like to select the highest level
ops to represent in the graph. In this case those are the `zero_` ops;
the fact that `fill_` is called is an implementation detail. We also
do not want to group everything under "My annotation" as this could
create overly coarse bundles and lose critical semantics.

To address this issue we walk over the graph and select the topmost
torch ops ** which match at least one operator schema **. These form
the leaves of the first pass through the op tree. (As well as any
allocations or frees which do are not part of a kernel.) These events
form the logical nodes in our data flow graph.
r}  rD   c                 ó  • U R                   S   [        R                  :H  =(       a\    U R                   S   R                  [        R
                  :H  =(       d+    [        [        R                  U R                   S   5      5      $ rœ   )	r„   r
   r…   r†   r   r‡   r\   r¢   rª   )r}  s    r'   Úleaf_opÚ3DataFlowGraph._extract_leaf_events.<locals>.leaf_opX  s_   € Ø—7‘7˜1‘:¤×!3Ñ!3Ñ3÷ Ø—‘˜‘
× Ñ ¤K×$AÑ$AÑA÷ AÜœ×3Ñ3°A·G±G¸A±JÓ?Ó@ðr&   c                 ó˜   >• T" U 5      (       d  U R                   [        R                  :X  a  TR                  U 5        / $ U R                  $ rO   )Útagr
   r  r�   rƒ   )r}  ry  r�  s    €€r'   Úchildren_fnÚ7DataFlowGraph._extract_leaf_events.<locals>.children_fn^  s:   ø€ Ù�q�z‰z˜QŸU™U¤j×&;Ñ&;Ó;Ø×"Ñ" 1Ô%Ø�	à—:‘:Ðr&   )r“  c                 ó   • U R                   $ rO   rï   rñ   s    r'   ró   Ú4DataFlowGraph._extract_leaf_events.<locals>.<lambda>h  s   € °q·²r&   rõ   )r   r\   rú   r~   rù   )r
  r“  r�   ry  r�  s      @@r'   rv  Ú"DataFlowGraph._extract_leaf_events5  s^   ù€ ðB -/ˆð	”~ð 	¬$ô 	ð	œ>÷ 	ð 	ð —‘¨�Ó5ˆAÙñ 6ô ”V˜KÑ-FÑGÓHÐHr&   rö   c                 ób   • U R                   R                  US5      nUc  [        SU S35      eU$ )Nr   zversion for key ú is None©rx  r  r�   )rJ   rö   r‡  s      r'   rK  ÚDataFlowGraph.lookupj  s9   € Ø×&Ñ&×1Ñ1°#°qÓ9ˆØ‰?Ü Ð#3°C°5¸Ð!AÓBÐBØˆr&   c                 ó„   • U R                   R                  US 5      nUc  [        SU S35      eUS-   U R                   U'   g )Nzprior_version for key r™  r�   )rx  r'  r�   )rJ   rö   r‰  s      r'   rI  ÚDataFlowGraph.bumpp  sJ   € Ø×,Ñ,×0Ñ0°°dÓ;ˆØÑ Ü Ð#9¸#¸¸hÐ!GÓHÐHØ$1°AÑ$5ˆ×Ñ˜SÒ!r&   c                 óz   • U R                   R                  US5      c  [        SU S35      eS U R                   U'   g )Nr   zcannot delete key z, already deletedrš  r0  s     r'   ÚdeleteÚDataFlowGraph.deletev  sA   € Ø×Ñ×*Ñ*¨3°Ó2Ñ:Ü Ð#5°c°UÐ:KÐ!LÓMÐMØ$(ˆ×Ñ˜SÒ!r&   )rx  rz  rw  ru  ©rD   N)r   r   r   r   rë   rý   r}   r~   r>  r€  r|  r   ry  r{   rv  r   rY   rK  rI  rŸ  r%   r   r&   r'   r@  r@    sÎ   † ð ð ¨4ô ð ð'˜E ,°Ð"3Ñ4ó 'ó ð'ô/ð< ð!˜U >°3Ð#6Ñ7ó !ó ð!ð ð2I fð 2I°°~ÀsÐ7JÑ1Kó 2Ió ð2Iðh˜)ð ¨ô ð6˜	ð 6 dô 6ð)˜)ð )¨÷ )r&   r@  c                   óÂ   • \ rS rSr% Sr\S-  \S'   \R                  " \	S9r
\	\\4   \S'   \R                  " \	S9r\	\\4   \S'   \R                  " \S9r\\   \S'   Srg)	ÚCategoryElementi|  NÚby_id©Údefault_factoryÚby_keyÚ
by_versionÚ_by_id_keysetr   )r   r   r   r   r¤  r   r>   ÚdataclassesÚfieldr\  r§  r   r¨  ÚTensorAndIDrX  r©  r%   r   r&   r'   r£  r£  |  sj   ‡ à!€Eˆ8�d‰?Ó!Ø(3×(9Ò(9È$Ñ(O€FˆD�˜HÐ$Ñ%ÓOØ.9×.?Ò.?ÐPTÑ.U€J��[ (Ð*Ñ+ÓUð %0×$5Ò$5ÀcÑ$J€M�3�y‘>ÖJr&   r£  c                   óÜ   • \ rS rSr% \R
                  " S S9r\R                  \	\
4   \S'   S\S\SS4S	 jrS\S\SS4S
 jrS\S\	S\SS4S jrS\S\	S\SS4S jrS\S\	S\S-  4S jrSrg)ÚCategoryDicti‡  c                  ó6   • [         R                  " [        5      $ rO   )rZ  r[  r£  r   r&   r'   ró   ÚCategoryDict.<lambda>Š  s   € ¤× 7Ò 7¼Ô Hr&   r¥  r  rö   ÚcategoryrD   Nc                 ó¢   • X R                   UR                     l        U R                   UR                     R                  R	                  U5        g rO   )r  r_   r¤  r©  rY  ©rJ   rö   r±  s      r'   Ú	set_by_idÚCategoryDict.set_by_id�  s6   € Ø%-�‰�S—V‘VÑÔ"Ø�‰�S—V‘VÑ×*Ñ*×.Ñ.¨sÕ3r&   c                 óN   • X R                   UR                     R                  U'   g rO   )r  r_   r§  r³  s      r'   Ú
set_by_keyÚCategoryDict.set_by_key‘  s   € Ø+3�‰�S—V‘VÑ×#Ñ# CÒ(r&   r‡  c                 óP   • X0R                   UR                     R                  X4'   g rO   )r  r_   r¨  ©rJ   rö   r‡  r±  s       r'   Úset_by_versionÚCategoryDict.set_by_version”  s   € Ø:B�‰�S—V‘VÑ×'Ñ'¨¨Ò7r&   c                 ól   • U R                   UR                     R                  R                  X4U5        g rO   )r  r_   r¨  r  rº  s       r'   Úsetdefault_by_versionÚ"CategoryDict.setdefault_by_version—  s)   € ð 	�‰�S—V‘VÑ×'Ñ'×2Ñ2°C°>À8ÕLr&   c                 ó0  • [        U[        5      (       a  [        U[        5      (       d  g U R                  UR                     nUR
                  =(       d@    UR                  R                  US 5      =(       d    UR                  R                  X4S 5      $ rO   )	rP   r   r   r  r_   r¤  r§  r'  r¨  )rJ   rö   r‡  Úelements       r'   r'  ÚCategoryDict.getœ  sr   € Ü�cœ3×Ñ¬
°3¼	×(BÑ(BØØ—,‘,˜sŸv™vÑ&ˆà�M‰M÷ <Ø�~‰~×!Ñ! # tÓ,÷<à×!Ñ!×%Ñ% s n°dÓ;ð	
r&   r   )r   r   r   r   rª  r«  r  rZ  r[  rY   r£  r>   r   r   r´  r·  r»  r¾  r   r'  r%   r   r&   r'   r®  r®  ‡  sÏ   ‡ à=H×=NÒ=NÙHñ>€Gˆ[×$Ñ$ S¨/Ð%9Ñ:ó ð4˜Yð 4°(ð 4¸tô 4ð4˜ið 4°8ð 4Àô 4ðC )ð C°cð CÀXð CÐRVô CðMØðMØ'*ðMØ6>ðMà	ôMð

�sð 
 Sð 
¨X¸©_÷ 
r&   r®  c                   óÜ   • \ rS rSrS\SS4S jr\S\\\\	\
\4   S4   4S j5       rS\4S jrS\\\S-  4   4S	 jrS\\   4S
 jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSrg)ÚMemoryProfilei§  rì   rD   Nc                 óŠ  • [        U5      U l        [        U R                  5      U l        [	        U R                  5      U l        [        5       U l        U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         g rO   )rë   ru  r@  Ú_data_flow_graphr	  Ú	_size_mapr®  Ú_categoriesÚ_set_gradients_and_temporariesÚ#_set_parameters_using_python_tracerÚ_set_inputsÚ_set_parameters_using_data_flowÚ_set_activationsÚ_set_optimizer_stateÚ_set_autograd_detailrü   s     r'   rý   ÚMemoryProfile.__init__¨  sŒ   € Ü˜v›ˆŒÜ -¨d¯m©mÓ <ˆÔÜ  §¡Ó/ˆŒÜ'›>ˆÔà×+Ñ+Ô-Ø×0Ñ0Ô2Ø×ÑÔØ×,Ñ,Ô.Ø×ÑÔØ×!Ñ!Ô#Ø×!Ñ!Õ#r&   .c           	      ó®  ^ • / n0 n0 nT R                   R                  5        GHc  nUR                  S   [        R                  :X  d  M'  UR                  S   nUR
                  nUS:„  nUR                  n[        R                  U5      n	U	b  X‚X—4'   Mr  [        UR                  5      n
UR                  U
R                  4nU(       aW  X³;   a'  UR                  U[        R                  U
S4U45        MÒ  SX;'   UR                  U[        R                  U
S4U45        Mý  UR                  U[        R                   U
S4U* 45        UR#                  US5      (       a  GM=  UR                  S[        R$                  U
S4U* 45        GMf     T R'                  5       n[)        [+        UR-                  5       5      5      nU V
Vs/ s H+  u  p®U
S4U;  d  M  US:X  d  M  S[        R$                  X®44PM-     nn
nT R.                  R0                   GH
  nUR2                  R5                  5        Hè  u  n
nUR6                  (       a+  X*S4   nUR                  U[        R                  U
S445        OgUR8                  (       aV  UR:                  R                  nUR<                  nUc  [?        SU
 35      eUR                  U[        R                  X®445        UR@                  (       d  M¼  X*S4   nUR                  U[        R                   X­U
   445        Mê     GM     URC                  U 4S jU 5       5        URE                  S S	9  [G        U5      $ s  snn
f )
Nr   r�   TFrU  zinput_version is None for key c              3   óT   >#   • U  H  u  pu  p4XX44TR                   U   4v •  M     g 7frO   )rÇ  )r§   ÚtimeÚactionrö   r‡  rJ   s        €r'   r¨   Ú)MemoryProfile.timeline.<locals>.<genexpr>ó  s1   øé € ð 
â06Ñ,�™n˜sð ˜C˜>¨4¯>©>¸#Ñ+>Õ?Ú06ùs   ƒ%(c                 ó*   • U S   U S   R                   4$ rœ   )Úvaluerñ   s    r'   ró   Ú(MemoryProfile.timeline.<locals>.<lambda>ø  s   €  1 Q¡4¨¨1©¯©Ñ"4r&   rõ   )$ru  rú   r„   r
   r  r  rð   r   rp   r   r<   rB   r�   r1   r5   r4   r6   Úpopr3   Ú_category_snapshotr\  rù   ÚkeysrÆ  r€  rG  rH  r8  r6  rD  r5  r�   r;  Úextendr{  r~   )rJ   ÚoutputÚallocation_timesÚlive_unknownrš   r  r  r8  rr   Útkeyrö   Úptr_and_deviceÚsnapshotÚlast_versionr‡  Úeventsr   rM  s   `                 r'   ÚtimelineÚMemoryProfile.timeline¶  sø  ø€ à:<ˆØ>@ÐØFHˆà—]‘]×&Ñ&×(ˆEØ�{‰{˜1‰~¤×!6Ñ!6Õ6Ø$Ÿ{™{¨1™~�Ø)×4Ñ4�
Ø *¨Q¡�Ø×'Ñ'�ä ×0Ñ0°Ó>�ØÑ#Ø>? dÐ%:Ó;ô ˜l×1Ñ1Ó2�CØ&2×&6Ñ&6¸¿
¹
Ð%C�NÞ$Ø)Ó9Ø"ŸM™MØ!"¤F×$<Ñ$<¸sÀA¸hÈ
Ð Söð <@˜LÑ8Ø"ŸM™M¨1¬f¯m©m¸cÀ1¸XÀzÐ*RÖSàŸ™ q¬&¯.©.¸3À¸(ÀZÀKÐ&PÔQØ+×/Ñ/°À×FÔFØ"ŸM™MØ!#¤V×%7Ñ%7¸#¸q¸ÀJÀ;Ð O÷ñ3 )ð: ×*Ñ*Ó,ˆÜœF 8§=¡=£?Ó3Ó4ˆñ !)ô9
â (‘�Ø�Tˆ{Ð"2Ñ2ó 5à7>À!±|ó 5ˆR”×#Ñ# c ^Ó4Ù (ð 	ñ 9
ð ×)Ñ)×4Õ4ˆDØ!Ÿ[™[×.Ñ.Ö0‘	��TØ×%×%Ø(¨t¨Ñ5�AØ—M‘M 1¤f§m¡m°c¸1°XÐ">Õ?à—\—\ØŸ™×1Ñ1�AØ"×0Ñ0�GØ‘Ü,Ð/MÈcÈUÐ-SÓTÐTØ—M‘M 1¤f×&>Ñ&>ÀÀÐ"OÔPà×#×#Ñ#Ø(¨u¨Ñ6�AØ—M‘M 1¤f§n¡n°sÈÑ<MÐ6NÐ"OÖPô 1ñ 5ð" 	�‰ô 
á06ó
ô 	
ð
 	�‰Ñ4ˆÑ5Ü�V‹}Ðùó;9
s   ÇMÇMÇMc                 ó\   • U R                   R                  " U0 UD6[        R                  :H  $ rO   )rÈ  r'  r   r!   r  s      r'   Ú_is_gradientÚMemoryProfile._is_gradientû  s)   € Ø×Ñ×#Ò# TÐ4¨VÑ4¼×8IÑ8IÑIÐIr&   c           	      ób  • [        5       nU R                  R                   H~  nUR                  S UR                  R                  5        5       5        UR                  S UR                   5       5        UR                  UR                  R                  5       5        M€     U R                  R                  R                  5        H%  nUR                  S UR                   5       5        M'     [        U5       VVs0 s H"  u  pEXE4U R                  R                  XE5      _M$     snn$ s  snnf )Nc              3   ó2   #   • U  H  u  nu  p#X4v •  M     g 7frO   r   )r§   rN  r�   rO  s       r'   r¨   Ú3MemoryProfile._category_snapshot.<locals>.<genexpr>  s   é € Ð'TÒ@S±9°1±f°q¨­Ò@Sùó   ‚c              3   ó(   #   • U  H  oS 4v •  M
     g7f©r   Nr   ©r§   rö   s     r'   r¨   rì    s   é € Ð&NÒ;M°C¨Q¥xÒ;Mùó   ‚c              3   ó(   #   • U  H  oS 4v •  M
     g7frï  r   rð  s     r'   r¨   rì    s   é € Ð&Kº?°C¨Q¥xº?ùrñ  )rX  rÆ  r€  r  r‰   rH  rl  rJ  rÈ  r  rL  r©  rù   r'  )rJ   Úall_tensor_versionsr   r±   rö   r‡  s         r'   rÚ  Ú MemoryProfile._category_snapshotþ  sö   € Ü03³Ðà×)Ñ)×4Ô4ˆDØ×&Ñ&Ñ'TÀÇÁ×@QÑ@QÔ@SÓ'TÔUØ×&Ñ&Ñ&N¸4×;MÒ;MÓ&NÔNØ×&Ñ& t§|¡|×'9Ñ'9Ó';Ö<ñ 5ð
 ×!Ñ!×)Ñ)×0Ñ0Ö2ˆAØ×&Ñ&Ñ&K¸1¿?º?Ó&KÖKñ 3ô
 !'Ð':Ô ;ô
â ;‘�ð ˆN˜D×,Ñ,×0Ñ0°Ó>Ò>Ù ;ò
ð 	
ùó 
s   Ã>)D+c                 óf  ^ ^• [        5       m [        T5      nT R                  R                   Hm  n[	        UU 4S jUR
                  R                  5        5       5      nU(       d  M:  TR                  U5        TR                  S UR                   5       5        Mo     [        T5      U:X  a  T$ M¥  )a  Extract IDs of Tensors which depend or will depend on a gradient.

Note that this weakened definition of "depends" requires us to loop
over the data flow graph multiple times because it allows dependency
information to flow backward through edges and removes the guarantee
that nodes are topologically sorted. (Or indeed, even that a valid
topological order exists.) Put another way, we have converted an
acyclic data flow graph into a cyclic graph and we are attempting to
partition cycles involving a gradient from the rest of the graph.
c              3   óä   >#   • U  He  u  nu  p#TR                   R                  X5      [        R                  [        R                  4;   d  UR
                  T;   d  MW  UR
                  v •  Mg     g 7frO   )rÈ  r'  r   r!   r#   r_   )r§   rö   r�   r‡  Údepends_on_gradientrJ   s       €€r'   r¨   ÚAMemoryProfile._any_version_depends_on_gradient.<locals>.<genexpr>  s_   øé € ð â-@Ñ)˜™\˜aØ×'Ñ'×+Ñ+¨CÓ9Ü ×)Ñ)¬8×+=Ñ+=Ð>ó?à—v‘vÐ!4Ñ4ó	 �C—F–FÚ-@ùs   ƒAA0ÁA0c              3   ó8   #   • U  H  oR                   v •  M     g 7frO   )r_   rð  s     r'   r¨   rø  (  s   é € Ð.NÂ¸#¯v®vÂùs   ‚)	rX  rÃ   rÆ  r€  r~   r‰   rH  r  rJ  )rJ   Ú
start_sizer   Úidsr÷  s   `   @r'   Ú _any_version_depends_on_gradientÚ.MemoryProfile._any_version_depends_on_gradient  s�   ù€ ô ),«ÐØÜÐ0Ó1ˆJØ×-Ñ-×8Ô8�Üõ à-1¯[©[×->Ñ->Ô-@óó �÷ �3Ø'×.Ñ.¨sÔ3à'×.Ñ.Ñ.NÀÇÂÓ.NÖNñ 9ô& Ð&Ó'¨:Ó5Ø*Ð*ñ- r&   c                 óv  • U R                   R                  5        HA  n[        U5       H/  u  p#U R                  R	                  U[
        R                  5        M1     MC     U R                  R                   H@  nUR                   H-  nU R                  R                  U[
        R                  5        M/     MB     g)z>Mark Tensors which are unambiguous and simple to reason about.N)ru  rú   r™   rÈ  r´  r   r!   rÆ  r€  rl  r·  r   )rJ   rš   r�   r’   r   r±   s         r'   rÉ  Ú,MemoryProfile._set_gradients_and_temporaries2  sŒ   € ð —]‘]×&Ñ&Ö(ˆEÜ.¨uÖ5‘	�Ø× Ñ ×*Ñ*¨6´8×3DÑ3DÖEó 6ñ )ð ×)Ñ)×4Ô4ˆDØ×'Ô'�Ø× Ñ ×+Ñ+¨A¬x×/AÑ/AÖBó (ò 5r&   c                 óÈ   • U R                   R                  5        HD  n[        U5       H2  nUc  M  U R                  R	                  U[
        R                  5        M4     MF     g rO   )ru  rú   r—   rÈ  r´  r   r#   )rJ   rš   r‘   s      r'   rÊ  Ú1MemoryProfile._set_parameters_using_python_tracerC  sI   € Ø—]‘]×&Ñ&Ö(ˆEÜ'¨Ö.�Ø“=Ø×$Ñ$×.Ñ.¨q´(×2DÑ2DÖEó /ò )r&   c                 ó   ^ ^• T R                  5       n[        5       m[        T R                  R                  5       Hu  nUR
                  R                  5        VVVs1 s H  u  nu  pEX54iM     nnnnXbR                  R                  5       -  n[        UU 4S jU 5       5      (       d  Mp  TU-  mMw     TR                  5       nT R                  R                   HR  n[        R                  [        UR                  5      ;   d  M,  U[        UR                  R                  5       5      -  nMT     U HA  u  p5UR                  U;  d  M  T R                  R!                  X5["        R$                  5        MC     gs  snnnf )aM  Mark inputs based on which Tensors are updated using gradients.

The process for differentiating between inputs and activations is more
involved. Most Tensors in a training loop depend on at least one
gradient: parameters depend on them through updates, and activations
and optimizer state depend on them transitively through parameters.
Critically, we do not need to know which Tensors are parameters to
apply this method; we can simply walk the data flow graph to build the
set of all values which depend on a gradient and then obtain the set
of inputs from the conjugate set.

There is, however, one hiccup. The first time we see a parameter is
generally on the forward pass of the first step. We know from
inspection of the data flow graph that v1 of that Tensor depends on
a gradient (provided we profile an optimizer step), but not v0. To
address this problem we weaken the definition of "depends on a
gradient" to "any version of this Tensor depends on a gradient",
which in turn strengthens the criteria for the input set enough to
filter the activations in the forward pass of the first step.c              3   ó°   >#   • U  HK  nTR                   R                  " U6 [        R                  [        R                  4;   =(       d    UT;   v •  MM     g 7frO   )rÈ  r'  r   r!   r#   )r§   r±   Úproduces_gradientrJ   s     €€r'   r¨   Ú,MemoryProfile._set_inputs.<locals>.<genexpr>j  sT   øé € ð ò !�Að × Ñ ×$Ò$ aÐ(¬X×->Ñ->Ä×@RÑ@RÐ,SÑS÷ *ØÐ)Ñ)ô*â ùs   ƒAAN)rü  rX  ÚreversedrÆ  r€  r‰   rH  rJ  ÚanyÚcopyr   r‡   r    rD  r_   rÈ  r¾  r   r   )	rJ   r÷  r   rö   r�   r‡  ÚtensorsÚinput_candidatesr  s	   `       @r'   rË  ÚMemoryProfile._set_inputsI  s9  ù€ ð2 #×CÑCÓEÐô /2«eÐÜ˜T×2Ñ2×=Ñ=Ö>ˆDØ?C¿{¹{×?PÑ?PÔ?RÕSÒ?RÑ*;¨#©|°˜“~Ñ?RˆGÒSØ—|‘|×)Ñ)Ó+Ñ+ˆGÜõ ñ !ó÷ ó ð
 " WÑ,Ò!ñ ?ð -×1Ñ1Ó3ÐØ×)Ñ)×4Ô4ˆDÜ×,Ñ,´
¸4¿;¹;Ó0GÕGØ ¤C¨¯©×(:Ñ(:Ó(<Ó$=Ñ=Ò ñ 5ó -‰LˆCØ�v‰vÐ0Õ0Ø× Ñ ×6Ñ6°sÄXÇ^Á^ÖTò -ùô! Ts   ÁE9
c                 ó8  ^ ^• T R                  5       n[        5       nUR                  5        VVs1 s H  u  p4U[        R                  :X  d  M  UiM     nnnT R
                  R                   H÷  nUR                  R                  5        VVV	s1 s H  u  nu  p‰Xy4iM     n
nnn	[        R                  [        UR                  5      ;  d  M`  [        U 4S jU
 5       5      (       a  M|  [        U 4S jUR                  R                  5        5       5      (       a  M°  UR                  U
5      (       d  MÈ  XVR                  R                  5       -  nX*R                  U5      -  nMù     [        5       m[!        T R
                  R                  5       Hh  n[        U U4S jUR                  R                  5        5       5      (       d  M8  TR#                  S UR                  R                  5        5       5        Mj     UR%                  T5        U VVs1 s H  u  pxUR&                  iM     nnnUT R)                  5       -  nU HA  u  pxUR&                  U;   d  M  T R*                  R-                  U[        R.                  5        MC     gs  snnf s  sn	nnf s  snnf )aN  Deduce which Tensors are parameters.

Consider the following code for the step of SGD with momentum
(nesterov=False), where `d_p` is the gradient of `param` and `buf` is
the momentum buffer.
```
  buf.mul_(momentum).add_(d_p, alpha=1 - dampening)
  d_p = buf
  param.add_(d_p, alpha=-lr)
```
Both `param` and `buf` take a gradient and perform an in-place update.

The python tracer will inspect calls to `nn.Module.forward` and
`optim.Optimizer.step` to extract parameter and optimizer state
respectively (including parameters), so this is generally a non-issue.

However as a fallback we can also exploit several properties of
parameters to distinguish them from other model state.

First, they are directly used in the forward pass. (At this point we
haven't established which parts of the graph correspond to the forward
pass but we can deduce enough to suffice.) Some mutable state such as
batch norm moving averages also contribute to the forward pass, but
optimizer state does not.

Second, a parameter is by definition used to compute at least one
gradient and depends on at least one gradient.
c              3   óB   >#   • U  H  nTR                   " U6 v •  M     g 7frO   ©rè  ©r§   r±   rJ   s     €r'   r¨   Ú@MemoryProfile._set_parameters_using_data_flow.<locals>.<genexpr>©  s   øé € ÐBº6°a˜D×-Ò-¨qÕ1º6ùó   ƒc              3   óB   >#   • U  H  nTR                   " U6 v •  M     g 7frO   r  r  s     €r'   r¨   r  ª  s   øé € ÐPÒ;O°a˜D×-Ò-¨qÕ1Ò;Oùr  c              3   óZ   >#   • U  H   nTR                   " U6 =(       d    UT;   v •  M"     g 7frO   r  )r§   r±   rJ   Úused_for_gradients     €€r'   r¨   r  µ  s1   øé € ð â-�Að ×!Ò! 1Ð%×?¨Ð.?Ñ)?Ô?Ú-ùs   ƒ(+c              3   ó2   #   • U  H  u  nu  p#X4v •  M     g 7frO   r   )r§   rö   r�   r‡  s       r'   r¨   r  ¹  s   é € ð )Ú<OÑ'8 s©L¨Q�S•NÒ<Oùrí  N)rÚ  rX  rH  r   r   rÆ  r€  r‰   r   r‡   r    rD  r  rJ  ÚintersectionÚ
differencer  r  Úintersection_updater_   rü  rÈ  r´  r#   )rJ   râ  Úcandidate_parametersr±   r±  Úcandidate_fwd_tensorsr   rö   r�   r×  r‰   Úparameter_keysr  s   `           @r'   rÌ  Ú-MemoryProfile._set_parameters_using_data_flow|  s  ù€ ð: ×*Ñ*Ó,ˆô 25³Ðà!)§¡Ô!1ô3
Ú!1‘+�!°XÄÇÁÑ5O�AÑ!1ð 	ñ 3
ð ×)Ñ)×4Ô4ˆDØ:>¿+¹+×:KÑ:KÔ:MÕNÒ:M¡ s©J¨Q�s“lÑ:MˆFÒNô ×-Ñ-´ZÀÇÁÓ5LÕLÜÔB¹6ÓB×BÓBÜÔP¸4¿<¹<×;MÑ;MÔ;OÓP×PÓPð *×6Ñ6°v×>Ó>à%¯©×);Ñ);Ó)=Ñ=Ð%Ø$×(9Ñ(9Ð:OÓ(PÑPÒ$ñ 5ô /2«eÐÜ˜T×2Ñ2×=Ñ=Ö>ˆDÜõ àŸ™×+Ñ+Ô-ó÷ ó ð "×(Ñ(ñ )Ø<@¿K¹K×<MÑ<MÔ<Oó)ö ñ ?ð 	×0Ñ0Ð1BÔCñ 0DÔDÒ/C¡V S˜#Ÿ&œ&Ñ/CˆÑDØ˜$×?Ñ?ÓAÑAˆã‰FˆCØ�v‰v˜Õ'Ø× Ñ ×*Ñ*¨3´×0BÑ0BÖCò ùóE3
ùô
 Oùó4 Es   °J	ÁJ	ÂJ
ÈJc                 ó¬  • [         R                  [         R                  1n[         R                  [         R                  1nU R
                  R                   Hî  nUR                  R                  5        VVVs1 s H  u  nu  pVXF4iM     nnnnU Vs1 s H  o€R                  R                  " U6 iM     n	nX‘-  (       d  Mj  X‘U-  -
  (       a  Mx  [        R                  [        UR                  5      ;  d  M¡  UR                  R                  5        H/  nU R                  R                   " / UQ[         R                  P76   M1     Mð     gs  snnnf s  snf )z(Flood the graph to identify activations.N)r   r   r    r#   r   rÆ  r€  r‰   rH  rÈ  r'  r   r‡   r    rD  rJ  r¾  )
rJ   ÚrequiredÚalso_allowedr   rö   r�   r×  r‰   r±   Úinput_categoriess
             r'   rÍ  ÚMemoryProfile._set_activationsÆ  s  € ô —N‘N¤H×$7Ñ$7Ð8ˆÜ ×*Ñ*¬H×,>Ñ,>Ð?ˆØ×)Ñ)×4Ô4ˆDØ:>¿+¹+×:KÑ:KÔ:MÕNÒ:M¡ s©J¨Q�s“lÑ:MˆFÒNÙBHÓIÂ&¸Q× 0Ñ 0× 4Ò 4°aÓ 8Á&ÐÐIð "×,Ñ,Ø)¸Ñ-D×EÑEô  ×1Ñ1¼ÀDÇKÁKÓ9PÕPàŸ™×+Ñ+Ö-�AØ×$Ñ$×:Ò:ÐS¸AÐS¼x×?RÑ?RÕSó .ò 5ùÜNùÚIs   Á8E

Â"Ec                 óø  • U R                   R                  5        HÜ  nUR                  S   [        R                  :X  d  M&  UR                  S   R
                  (       d  MF  UR                  S   R
                  R                  n[        R                  R                  S U 5       5       HI  u  p4[        R                  U5      nUc  M  U R                  R                  U[        R                  5        MK     MÞ     g )Nr   r�   c              3   ó,   #   • U  H
  u    pUv •  M     g 7frO   r   )r§   r�   r  s      r'   r¨   Ú5MemoryProfile._set_optimizer_state.<locals>.<genexpr>Þ  s   é € Ð9ªj™{˜q !•Uªjùs   ‚)ru  rú   r„   r
   rŠ   rŒ   rŽ   ÚitÚchainÚfrom_iterabler   ru   rÈ  r´  r   r$   )rJ   rš   rŽ   r�   rr   rö   s         r'   rÎ  Ú"MemoryProfile._set_optimizer_stateÙ  s±   € Ø—]‘]×&Ñ&Ö(ˆEØ�{‰{˜1‰~¤×!2Ñ!2Õ2°u·{±{À1±~×7O×7OÑ7OØ"Ÿ[™[¨™^×5Ñ5×@Ñ@�
ÜŸH™H×2Ñ2Ù9©jÓ9ö‘D�Aô $×/Ñ/°Ó2�CØ“Ø×(Ñ(×2Ñ2°3¼×8PÑ8PÖQóò )r&   c                 ó¢  • S [         R                  1nU R                  R                   H£  n[        R
                  [        UR                  5      ;   d  M,  UR                  R                  5        HY  u  p4US:X  d$  U R                  R                  X4S-
  5      U;   d  M/  U R                  R                  X4[         R                  5        M[     M¥     g rœ   )r   r"   rÆ  r€  r   r‡   r    rD  rJ  rH  rÈ  r'  r¾  )rJ   Úpriorr   rö   r‡  s        r'   rÏ  Ú"MemoryProfile._set_autograd_detailä  s›   € Ø”x×/Ñ/Ð0ˆØ×)Ñ)×4Ô4ˆDÜ×,Ñ,´
¸4¿;¹;Ó0GÕGØ$(§L¡L×$6Ñ$6Ö$8‘L�CØ !“| t×'7Ñ'7×';Ñ';¸CÈ1ÁÓ'MÐQVÕ'VØ×(Ñ(×>Ñ>Ø¬(×*BÑ*Böó %9ò 5r&   )rÈ  rÆ  ru  rÇ  r¡  )r   r   r   r   r	   rý   r}   r~   rY   r1   ÚKeyAndIDrå  r\   rè  r\  r¬  r   rÚ  rX  rü  rÉ  rÊ  rË  rÌ  rÍ  rÎ  rÏ  r%   r   r&   r'   rÄ  rÄ  §  s±   † ð$˜ð $°4ô $ð ðB˜%  c¨6°8¸SÐ&@Ñ AÀ3Ð FÑGó Bó ðBðHJ¨tô Jð
 D¨°hÀ±oÐ)EÑ$Fô 
ð "+°#°c±(ô "+ôHCô"Fô1UôfHDôTTô&	R÷r&   rÄ  c                   óJ   • \ rS rSrS	S jrS rS	S jrS	S jr S
 S	S jjrSr	g)ÚMemoryProfileTimelineiï  Nc                 óH   • UR                   U l         UR                  U l        g)a‹  The minimum representation of the memory profile timeline
includes the memory timeline and categories. The timeline
consists of [timestamp, action, (TensorKey, version), numbytes]
elements, to denote any actions (pre-existing, create, destroy,
or increment_version) that occurred to a specific Tensor for a
chunk of memory. The categories help map each (TensorKey,
version) pair into a category.N)rå  rÈ  Ú
categories)rJ   Úmemory_profiles     r'   rý   ÚMemoryProfileTimeline.__init__ð  s   € ð '×/Ñ/ˆŒØ(×4Ñ4ˆ�r&   c                 ób  ^ ^• [         R                  " U5      n/ n/ mSU U4S jjnSnT R                   GHQ  u  pgu  p‰n
UR                  U:w  a  M  US:w  a  [        US-  5      nUS:X  d  Xe:  a  US:”  a  Un[	        U5      S:X  a<  UR                  U5        TR                  S/[         Vs/ s H  nSPM     sn-   5        O;XcS   :w  a3  UR                  U5        TR                  TS   R                  5       5        U[        R                  [        R                  4;   a  U" X‰U
5        Mø  U[        R                  :X  a  U" X‰U
* 5        U" X‰S-   U
5        GM%  U[        R                  :X  a  U" X‰U
* 5        GMF  [        SU 35      e   U Vs/ s H  ofS:  a  UOUPM     nnUT4$ s  snf s  snf )zÉConvert the memory timeline and categories into a memory plot
consisting of timestamps and their respective sizes by category
for a given device.

Input: device
Output: [timestamps, sizes by category]
c                 ó´   >• [        U [        5      (       a  TR                  R                  X5      OS n[        U   S-   nTS   U==   [        U5      -  ss'   g )Nr�   rU  )rP   r   r0  r'  Ú_CATEGORY_TO_INDEXrY   )rö   r‡  r  r±  ry   rJ   r$  s        €€r'   r  Ú8MemoryProfileTimeline._coalesce_timeline.<locals>.update  sW   ø€ ô ˜c¤9×-Ñ-ð —‘×#Ñ# CÔ1àð ô
 ' xÑ0°1Ñ4ˆEØ�"‰I�eÓ¤ E£
Ñ*Ôr&   rU  iè  r   r�   úUnknown action: r¡  )r=   r<   rå  rY   rÃ   r�   r5  r  r1   r3   r4   r5   r6   Ú
ValueError)rJ   Ú
device_strr<   Útimesr  Út_minrr   rÔ  rö   r‡  Únumbytesr�   r$  s   `           @r'   Ú_coalesce_timelineÚ(MemoryProfileTimeline._coalesce_timelineû  s™  ù€ ô —’˜jÓ)ˆØˆØ!#ˆ÷	+ð 	+ð ˆØ37·=µ=Ñ/ˆA‘~˜ xØ�z‰z˜VÓ#Ùð �B‹wÜ˜˜D™“M�ð ˜‹{˜q›y¨Q°«UØ�ô �5‹z˜Q‹Ø—‘˜Q”Ø—‘˜a˜SÕ/AÓ#BÒ/A¨!£AÑ/AÑ#BÑBÕCà˜B‘i“Ø—‘˜Q”Ø—‘˜U 2™YŸ^™^Ó-Ô.ð œ&×,Ñ,¬f¯m©mÐ<Ó<Ù�s XÖ.àœ6×3Ñ3Ó3Ù�s h YÔ/Ù�s a™K¨×2àœ6Ÿ>™>Ó)Ù�s h Y×/ô !Ð#3°F°8Ð!<Ó=Ð=ñC 4AñF 16Ó6²¨1˜a›%‘ QÒ&±ˆÐ6Ø�eˆ|Ðùò+ $Cùò( 7s   Â,F'ÆF,c                 ó¤   • U R                  U5      u  p4SSKn[        US5       nUR                  X4/U5        SSS5        g! , (       d  f       g= f)zxSaves the memory timeline as [times, sizes by category]
as a JSON formatted file to the given path for the given
device.r   NÚw)r=  ÚjsonÚopenÚdump)rJ   Úpathr9  r:  r$  rA  Úfs          r'   Úexport_memory_timelineÚ,MemoryProfileTimeline.export_memory_timeline7  s>   € ð ×.Ñ.¨zÓ:‰ˆãä�$˜Œ_ Ø�I‰I�u�n aÔ(÷ �_Ž_ús   ¤AÁ
Ac                 óæ  ^ • [         R                  " U5      n/ nU 4S jnT R                   GH  u  pgu  p‰n
UR                  U:w  a  M  U[        R                  [        R
                  4;   a$  UR                  U[        U   U
U" X‰5      45        Md  U[        R                  :X  aJ  UR                  U[        U   U
* U" X‰5      45        UR                  U[        U   U
U" X‰S-   5      45        MÂ  U[        R                  :X  a%  UR                  U[        U   U
* U" X‰5      45        Mû  [        SU 35      e   SSKn[        US5       nUR                  XL5        SSS5        g! , (       d  f       g= f)z¬Saves the memory timeline as raw memory event tuples in the
form of (timestamp, action, numbytes, category)
as a JSON formatted file to the given path for the given
device.c                 óz   >• [        U [        5      (       a  TR                  R                  X5      OS n[        U   $ rO   )rP   r   r0  r'  r5  )rö   r‡  r±  rJ   s      €r'   Úget_category_indexÚLMemoryProfileTimeline.export_memory_timeline_raw.<locals>.get_category_indexJ  s;   ø€ ô ˜c¤9×-Ñ-ð —‘×#Ñ# CÔ1àð ô
 & hÑ/Ð/r&   r�   r7  r   Nr@  )r=   r<   rå  r1   r3   r4   r�   Ú_ACTION_TO_INDEXr5   r6   r8  rA  rB  rC  )rJ   rD  r9  r<   Ú
raw_eventsrJ  rr   rÔ  rö   r‡  r<  rA  rE  s   `            r'   Úexport_memory_timeline_rawÚ0MemoryProfileTimeline.export_memory_timeline_rawB  sn  ø€ ô
 —’˜jÓ)ˆØ68ˆ
õ	0ð 48·=µ=Ñ/ˆA‘~˜ xØ�z‰z˜VÓ#Ùàœ&×,Ñ,¬f¯m©mÐ<Ó<Ø×!Ñ!ð Ü(¨Ñ0Ø Ù*¨3Ó8ð	öð œ6×3Ñ3Ó3Ø×!Ñ!ð Ü(¨Ñ0Ø!˜	Ù*¨3Ó8ð	ôð ×!Ñ!ð Ü(¨Ñ0Ø Ù*¨3¸!±Ó<ð	öð œ6Ÿ>™>Ó)Ø×!Ñ!ð Ü(¨Ñ0Ø!˜	Ù*¨3Ó8ð	öô !Ð#3°F°8Ð!<Ó=Ð=ñ_ 4Aób 	ä�$˜Œ_ Ø�I‰I�jÔ$÷ �_Ž_ús   ÅE"Å"
E0c           	      óf  • SSK nUR                  R                  S5      nUc  [        S5        gSSKJn  SSKJn  SSKJ	n	  SSK
n
U R                  U5      nU
R                  US   5      U
R                  US   5      pÜ[        U5      nXÎ-  nU
R                  USS9S	-  n[        R                   " U5      n[        R"                  R%                  U5      n[        R"                  R'                  U5      nU	R)                  US
S9nUR+                  5       n[,        R/                  5        H6  u  nn[0        U   nUR3                  US-  USS2U4   USS2US-   4   USS9  M8     UR5                  [,         Vs/ s H  nUc  SOUR6                  PM     sn5        UR9                  S5        UR;                  S5        SR=                  U(       a  U/O/ SUS	-  S SUS	-  S S3/-   5      nUR?                  U5        U" SSS9 nURA                  USS9  URC                  SS5        U" URE                  5       5      RG                  S5      nU(       d  [I        S5      eSU S3n[K        US SS!9 nURM                  U5        SSS5        SSS5        gs  snf ! , (       d  f       N= f! , (       d  f       g= f)"zkExports the memory timeline as an HTML file which contains
the memory timeline plot embedded as a PNG file.r   NÚ
matplotlibzDexport_memory_timeline_html failed because matplotlib was not found.)Ú	b64encode)ÚNamedTemporaryFiler�   )Úaxisi   @éP   )ÚfigsizeÚdpig     @�@gffffffæ?)ÚcolorÚalphaÚUnknownz	Time (ms)zMemory (GB)z

zMax memory allocated: z.2fz GiB 
Max memory reserved: z GiBzw+bz.png)ÚsuffixÚpng)Úformatzutf-8z failed to encode image as base64z}<html>
<head><meta charset="utf-8" /><title>GPU Memory Timeline HTML</title></head>
<body>
  <img src='data:image/png;base64,z'>
</body>
</html>r@  )Úencoding)'Úimportlib.utilÚutilÚ	find_specÚprintÚbase64rR  ÚtempfilerS  Úmatplotlib.pyplotÚpyplotÚnumpyr=  ÚarrayÚminÚcumsumr=   r<   ÚcudaÚmax_memory_allocatedÚmax_memory_reservedÚfigureÚgcaÚ_CATEGORY_TO_COLORSrH  r5  Úfill_betweenÚlegendrˆ   Ú
set_xlabelÚ
set_ylabelÚjoinÚ	set_titleÚsavefigÚseekÚreadÚdecoder�   rB  Úwrite)rJ   rD  r9  rV  ÚtitleÚ	importlibÚmatplotlib_specrR  rS  ÚpltÚnpÚmtr:  r$  r;  Ústackedr<   rl  rm  ÚfigÚaxesr±  rX  r±   ÚtmpfileÚencodedÚhtmlrE  s                               r'   Úexport_memory_timeline_htmlÚ1MemoryProfileTimeline.export_memory_timeline_htmlˆ  s�  € ó 	à#Ÿ.™.×2Ñ2°<Ó@ˆØÑ"ÜØVôð å$Ý/å'Ûà×$Ñ$ ZÓ0ˆØ—x‘x  1¡“¨¯©°°A±«ˆuä�E“
ˆØ‰ˆØ—)‘)˜E¨�)Ð*¨WÑ4ˆÜ—’˜jÓ)ˆÜ$Ÿz™z×>Ñ>¸vÓFÐÜ#Ÿj™j×<Ñ<¸VÓDÐð �j‰j ¨bˆjÐ1ˆØ�w‰w‹yˆÜ2×8Ñ8Ö:‰OˆH�eÜ" 8Ñ,ˆAØ×ÑØ˜‘˜W¢Q¨ T™]¨G²A°q¸1±u°HÑ,=ÀUÐRUð ó ñ  ;ð
 	�
‰
Õ@SÓTÒ@S¸1 ¡‘I°·±Ò6Ñ@SÑTÔUà�‰˜Ô$Ø�‰˜Ô&Ø—‘Þˆe‰W 2à(Ð)=ÀÑ)IÈ#Ð(Nð O(Ø(;¸wÑ(GÈÐ'LÈDðRðñó
ˆð 	�‰�uÔñ   ¨fÒ5¸Ø�K‰K˜¨ˆKÑ.à�L‰L˜˜AÔÙ §¡£Ó/×6Ñ6°wÓ?ˆGÞÜ$Ð%GÓHÐHð#ð $+ )ð ,ðˆDô �d˜C¨'Ò2°aØ—‘˜”÷ 3÷ 6Ð5ùò U÷8 3Õ2ú÷ 6Õ5ús+   Å4JÇ>A+J"É)JÉ;J"Ê
J	ÊJ"Ê"
J0)r0  rå  r¡  ))é   é   N)
r   r   r   r   rý   r=  rF  rN  rˆ  r%   r   r&   r'   r.  r.  ï  s3   † ô	5ò:ôx	)ôD%ðN 9=ðDà	÷Dð Dr&   r.  )ErZ  rª  r   Ú	itertoolsr%  ÚloggingÚcollections.abcr   Útypingr   r   r   r   r=   Útorch._Cr   Útorch._C._autogradr	   Útorch._C._profilerr
   r   r   r   r   r   Útorch._utilsr   Útorch.profilerr   r~   rY   r,  r¬  Ú	getLoggerr   r  ÚEnumr   r#   r$   r   r   r    r!   r"   rp  r¬   r5  r1   r×  rL  Ú	dataclassr   r@   r   r“   r—   r™   r    r¢   rë   r	  r4  r>  r@  r£  r®  rÄ  r.  )r±   Úcs   00r'   Ú<module>r™     sò  ðã Û Û Û Û Ý $ß /Ó /ã Ý #Ý .÷÷ õ 'Ý !ð �˜�Ñ€Ø�K Ð$Ñ%€à×Ò˜Ó!€ô"ˆt�y‰yô "ð ×Ñ˜Ø×Ñ˜kØ‡N�N�GØ×Ñ˜Ø×Ñ˜Ø×Ñ�|Ø×Ñ˜kØˆ&ð	Ð ñ (1Ð1DÔ'EÔFÒ'E™t˜q�a’dÑ'EÒFÐ ôˆT�Y‰Yô ñ )/Ó/ª 1�q—w‘w’J©Ñ/Ð ð ×Ò˜$¨E¸$Ñ?÷ð ó @ðð ×Ñ÷(ð (ó ð(ð( ×Ò˜$¨D¸Ñ>ô.X�ó .Xó ?ð.Xðb(NØ
ð(Nàˆe�I Ñ$ i°$Ñ&6Ð6Ñ7Ñ8ô(NðV˜^ð °¸Ñ0Cô ðØ
ðàˆe�I Ñ$ iÐ/Ñ0Ñ1ôð�n tÑ+ð °°kÀ3Ð6FÑ0Gô ÷oñ o÷d
"ñ 
"÷G!ñ G!ðT ×ÒÓ÷
$ð 
$ó ð
$÷])ñ ])÷@s)ñ s)ðl ×Ñ÷Kð Kó ðKð ×Ñ÷
ð 
ó ð
÷>Eñ E÷P
]ò ]ùów Gùò 0s   Ã+I&ÄI,