Ë
    [^(h#¼  ã                   óì  — d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
mZmZ d dlmZ d dlZd dlmZ d dlmZ d dlmZmZmZmZmZmZ d dlmZ d d	lmZ ed
e f   Z!ede f   Z" ejF                  e$«      Z% G d„ dejL                  «      Z'e'jP                  de'jR                  de'jT                  de'jV                  de'jX                  de'jZ                  de'j\                  dddiZ/ e0e/«      D � �ci c]  \  } }|| “Œ
 c}} Z1 G d„ dejL                  «      Z2e2D � ci c]  } | | jf                  “Œ c} Z4 ejj                  ddd¬«       G d„ d
«      «       Z6ejj                   G d„ d«      «       Z7 ejj                  ddd¬«       G d„ de6«      «       Z8ded eeee8   ee8   f      fd!„Z9ded ee8   fd"„Z:ded eeee8   e8f      fd#„Z;d$ee   d eed%f   fd&„Z< G d'„ d(«      Z= G d)„ d*«      Z> G d+„ d,«      Z? ejj                  «        G d-„ d.«      «       Z@ G d/„ d0«      ZA G d1„ d2«      ZBejj                   G d3„ d4«      «       ZCejj                   G d5„ d6«      «       ZD G d7„ d8«      ZE G d9„ d:«      ZFyc c}} w c c} w );é    N)ÚIterator)ÚAnyÚcastÚOptionalÚUnion)ÚLiteral)ÚFunctionSchema)Ú_ProfilerResult)Ú
_EventTypeÚ_ExtraFields_AllocationÚ_ExtraFields_TorchOpÚ_ProfilerEventÚ_TensorMetadataÚRecordScope)Ú_element_size)Ú_utilsÚKeyÚ	TensorKeyc                   óú   — e Zd Z ej                  «       Z ej                  «       Z ej                  «       Z ej                  «       Z ej                  «       Z	 ej                  «       Z
 ej                  «       Zy)ÚCategoryN)Ú__name__Ú
__module__Ú__qualname__ÚenumÚautoÚINPUTÚ	TEMPORARYÚ
ACTIVATIONÚGRADIENTÚAUTOGRAD_DETAILÚ	PARAMETERÚOPTIMIZER_STATE© ó    ú]/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/profiler/_memory_profiler.pyr   r       s]   „ ØˆD�I‰I‹K€EØ�—	‘	“€IØ�—‘“€JØˆt�y‰y‹{€HØ�d—i‘i“k€OØ�—	‘	“€IØ�d—i‘i“k�Or$   r   Ú	darkgreenÚ	goldenrodÚblackÚmediumpurpleÚredÚ
mediumblueÚ	royalblueÚgreyc                   ó”   — e Zd Z ej                  «       Z ej                  «       Z ej                  «       Z ej                  «       Zy)ÚActionN)	r   r   r   r   r   ÚPREEXISTINGÚCREATEÚINCREMENT_VERSIONÚDESTROYr#   r$   r%   r/   r/   8   s7   „ Ø�$—)‘)“+€KØˆT�Y‰Y‹[€FØ!˜Ÿ	™	›ÐØˆd�i‰i‹k�Gr$   r/   TF)ÚeqÚunsafe_hashÚfrozenc                   ó,   — e Zd ZU ej                  ed<   y)r   ÚdeviceN)r   r   r   Útorchr8   Ú__annotations__r#   r$   r%   r   r   B   s   … à�L‰LÔr$   c                   óN   — e Zd ZU dZeed<   eed<   defd„Zdede	fd„Z
defd„Zy	)
Ú_Storagezñ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   — t        | j                  «      d›d| j                  › d�S )Nz>18ú (ú))Úhexr=   r>   ©Úselfs    r%   Ú__repr__z_Storage.__repr__R   s'   € Ü�d—h‘h“- Ð$ B t×'9Ñ'9Ð&:¸!Ð<Ð<r$   Úotherc                 óX   — t        |t        «      xr | j                  |j                  k(  S ©N)Ú
isinstancer<   r>   ©rE   rG   s     r%   Ú__eq__z_Storage.__eq__U   s%   € Ü˜%¤Ó*ÒX¨t×/AÑ/AÀU×EXÑEXÑ/XÐXr$   c                 ó,   — t        | j                  «      S rI   )Úhashr>   rD   s    r%   Ú__hash__z_Storage.__hash__X   s   € Ü�D×&Ñ&Ó'Ð'r$   N)r   r   r   Ú__doc__Úintr:   ÚstrrF   ÚobjectÚboolrL   rO   r#   r$   r%   r<   r<   G   sB   … ñ?ð 
ƒHØÓð=˜#ó =ðY˜Fð Y tó Yð(˜#ô (r$   r<   c                   óþ   — e Zd ZU dZeed<   eed<   defd„Zdd de	fd„Z
edee   d	ee   d
ee   dej                  ded    f
d„«       Zededed    fd„«       Zedee   ded    fd„«       Zedeeeeef   fd„«       Zy)r   a~  Hashable identifier for a storage which has been asigned 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Ústorager?   c                 ój   — d| j                   › dt        | j                  «      d›d| j                  › d�S )Nzid=z: z<24rA   rB   )rV   ÚreprrW   r8   rD   s    r%   rF   zTensorKey.__repr__j   s1   € Ø�T—W‘W�I˜R¤ T§\¡\Ó 2°3Ð7°r¸$¿+¹+¸ÀaÐHÐHr$   rG   c                 ó4   — | j                   |j                   k  S rI   )Ú_as_sortablerK   s     r%   Ú__lt__zTensorKey.__lt__m   s   € Ø× Ñ  5×#5Ñ#5Ñ5Ð5r$   Ú	tensor_idÚstorage_ptrr>   r8   c                 ó>   — | �|�|�t        || t        ||«      «      S y rI   )r   r<   )r]   r^   r>   r8   s       r%   Ú_makezTensorKey._makep   s/   € ð Ð!ØÐ'ØÐ)ä˜V Y´¸ÀmÓ0TÓUÐUØr$   Úallocc                 óz   — | j                  |j                  |j                  |j                  |j                  «      S rI   )r`   rV   r=   r>   r8   )Úclsra   s     r%   Úfrom_allocationzTensorKey.from_allocation   s)   € à�y‰y˜Ÿ™ 5§9¡9¨e×.AÑ.AÀ5Ç<Á<ÓPÐPr$   Útc                 ó€   — |�<| j                  |j                  |j                  |j                  |j                  «      S y rI   )r`   rV   Ústorage_data_ptrr>   r8   )rc   re   s     r%   Úfrom_tensorzTensorKey.from_tensorƒ   s1   € àˆ=Ø—9‘9˜QŸT™T 1×#5Ñ#5°q·±ÈÏÉÓQÐQØr$   c                 óš   — | j                   | j                  j                  | j                  j                  | j                  j
                  fS rI   )rV   rW   r>   r8   ÚtypeÚindexrD   s    r%   r[   zTensorKey._as_sortable‰   s3   € à�w‰w˜Ÿ™×2Ñ2°D·K±K×4DÑ4DÀdÇkÁk×FWÑFWÐWÐWr$   N)r   r   r   rP   rQ   r:   r<   rR   rF   rT   r\   Ústaticmethodr   r9   r8   r`   Úclassmethodr   rd   r   rh   ÚpropertyÚtupler[   r#   r$   r%   r   r   \   s  … ñð 	ƒGØÓðI˜#ó Ið6˜Kð 6¨Dó 6ð ðØ˜C‘=ðà˜c‘]ðð   ‘}ðð —‘ð	ð
 
�+Ñ	òó ðð ðQÐ$;ð QÀÈÑ@Uò Qó ðQð ð˜H _Ñ5ð ¸(À;Ñ:Oò ó ðð
 ðX˜e C¨¨c°3Ð$6Ñ7ò Xó ñXr$   Únoder?   c              #   ó4  K  — | j                   }| j                  d   t        j                  k(  rï| j                  d   j                  t
        j                  k(  rÅ| j                  dk(  r¶|r´|d   j                  d   t        j                  k(  r‘|d   j                  dv r€|d   j                  d   j                  rdt        |d   j                  d   j                  d   t        «      r7d t        j                  |d   j                  d   j                  d   «      f–— y | j                  d   t        j                  k(  rÙ| j                  d   }|j                  �|j                  �J ‚|j                  �K|j                  j                   D ]2  \  }}}t        j                  |«      t        j                  |«      f–— Œ4 |j                  �L|j                  j                   D ]2  \  }}}t        j                  |«      t        j                  |«      f–— Œ4 y y y ­w)Nr   é   ztorch::autograd::AccumulateGrad)zaten::detachz
aten::add_)ÚchildrenÚtypedr   ÚTorchOpÚscoper   ÚBACKWARD_FUNCTIONÚnameÚinputsrJ   r   r   rh   ÚPyCallÚmoduleÚ	optimizerÚ
parameters)rp   rs   Ú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à”I×)Ñ)¨(°1©+×*;Ñ*;¸AÑ*>×*EÑ*EÀaÑ*HÓIÐIÓIð 
�‰�A‰œ*×+Ñ+Ò	+Ø—z‘z !‘}ˆØ×"Ñ"Ð*¨l×.DÑ.DÐ.LÐLÐLØ×ÑÐ*Ø ,× 3Ñ 3× >Ñ >ò N‘��1�fÜ×+Ñ+¨AÓ.´	×0EÑ0EÀfÓ0MÐMÓMðNð ×!Ñ!Ð-Ø ,× 6Ñ 6× AÑ Aò N‘��6˜1Ü×+Ñ+¨AÓ.´	×0EÑ0EÀfÓ0MÐMÓMñNð .ð 
,ùs   ‚HHc              #   ó@   K  — t        | «      D ]  \  }}|€Œ	|–— Œ y ­wrI   ©r‚   )rp   r€   Ú_p_grads      r%   Úextract_parametersr†   ¸   s(   è ø€ Ü7¸Ó=ò ‰
ˆˆ7Ø‰=Ø‹Gñùs   ‚—c              #   óD   K  — t        | «      D ]  \  }}|€Œ	||f–— Œ y ­wrI   r„   )rp   r€   r�   s      r%   Úextract_gradientsrˆ   ¾   s/   è ø€ ô 7°tÓ<ò ‰	ˆˆ6ØÑØ�V�)‹Oñùs   ‚ —	 Úevent.c                 óÎ   — g }| rW| j                   d   t        j                  k(  r(|j                  | j                   d   j                  «       | j
                  } | rŒWt        |«      S ©Nr   rr   )rt   r   ru   Úappendrv   Úparentro   )r‰   Úscopess     r%   Ú
get_scopesr�   Æ   sT   € Ø€FÙ
Ø�;‰;�q‰>œZ×/Ñ/Ò/Ø�M‰M˜%Ÿ+™+ a™.×.Ñ.Ô/Ø—‘ˆò ô �‹=Ðr$   c                   óž   — e Zd ZdZededeee   df   fd„«       Z	ededee
df   fd„«       Zedefd„«       Zededeee
df      fd	„«       Zy
)ÚSchemaMatcheraò  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.
    re   r?   .c           
      ó6  — d}| j                  |«      D ]_  }|xs |j                  D �cg c]  }d‘Œ c}}t        |j                  «      D ]'  \  }}||xx   t        |j                  dd«      z  cc<   Œ) Œa t        |xs d„ |j                  D «       «      S c c}w )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   ó    K  — | ]  }d –— Œ y ­wrI   r#   )Ú.0r   s     r%   ú	<genexpr>z3SchemaMatcher.inputs_are_mutable.<locals>.<genexpr>ì   s   è ø€ Ò 8¨!¤Ñ 8ùs   ‚)Úmatch_schemasÚ	argumentsÚ	enumerateÚgetattrÚ
alias_inforo   ry   )rc   re   ÚmutableÚschemar   ÚiÚargs          r%   Úinputs_are_mutablez SchemaMatcher.inputs_are_mutableÜ   s�   € ð )-ˆØ×'Ñ'¨Ó*ò 	IˆFØÒB°×1AÑ1AÖ!B¨A¢%Ò!BˆGÜ# F×$4Ñ$4Ó5ò I‘��3Ø˜“
œg c§n¡n°jÀ%ÓHÑH”
ñIð	Iô
 �WÒ8Ñ 8¨q¯x©xÔ 8Ó9Ð9ùò	 "Cs   ©	Bc                 ó¼   ‡ ‡‡— t        d„ |j                  D «       «      Šdt        fˆ ˆfd„Št        ˆfd„‰ j                  |j                  «      xs dD «       «      S )Nc              3   óÚ   K  — | ]^  }t        |t        «      rt        j                  |«      n4t        |t        «      r#|D �cg c]  }t        j                  |«      ‘Œ c}n|–— Œ` y c c}w ­wrI   )rJ   r   r   rh   Úlist©r•   rž   Újs      r%   r–   z.SchemaMatcher.match_schemas.<locals>.<genexpr>ð   sb   è ø€ ò 

ð ô )3°1´oÔ(FŒI×!Ñ! !Ô$ô ;EÀQÌÔ:M°AÖ6¨q”)×'Ñ'¨Õ*Ó6ð óñ

ùò
 7ùs   ‚>A+Á A&ÁA+r?   c                 óš   •— t        | j                  «      t        ‰«      k(  xr( t        ˆfd„t        ‰| j                  «      D «       «      S )Nc              3   ó\   •K  — | ]#  \  }}‰j                  ||j                  «      –— Œ% y ­wrI   )Ú_types_matchrj   )r•   ÚobservedÚ
schema_argrc   s      €r%   r–   z?SchemaMatcher.match_schemas.<locals>.matches.<locals>.<genexpr>ý   s0   øè ø€ ò Cá(�H˜jð × Ñ  ¨:¯?©?×;ñCùs   ƒ),)Úlenr˜   ÚallÚzip)r�   rc   Ú	signatures    €€r%   Úmatchesz,SchemaMatcher.match_schemas.<locals>.matchesü   sH   ø€ Ü�v×'Ñ'Ó(¬C°	«NÑ:ò ¼só Cä,/°	¸6×;KÑ;KÓ,LôCó @ð r$   c              3   ó4   •K  — | ]  } ‰|«      sŒ|–— Œ y ­wrI   r#   )r•   Úsr¯   s     €r%   r–   z.SchemaMatcher.match_schemas.<locals>.<genexpr>  s   øè ø€ ÒO˜1ÁGÈAÅJ”QÑOùs   ƒ‘r#   )ro   ry   rT   Úlookup_schemasrx   )rc   re   r¯   r®   s   ` @@r%   r—   zSchemaMatcher.match_schemasî   sS   ú€ äñ 

ð —X‘Xô

ó 

ˆ	ð	œtö 	ô ÓO × 2Ñ 2°1·6±6Ó :Ò @¸bÔOÓOÐOr$   c                 óÊ  — t        |t        j                  j                  «      r(|j	                  «       }|d u xs | j                  ||«      S t        |t        j                  j                  «      ry|j                  t        j                  j                  j                  «       «      r$t        |t        «      xr t        d„ |D «       «      S t        j                  j                  t        ft        j                  j                  t        d «      ft        j                  j                   t"        ft        j                  j$                  t&        ft        j                  j(                  t*        ft        j                  j,                  t.        ft        j                  j0                  t"        t&        t*        t.        fff}|D ]  \  }}t        ||«      sŒt        ||«      c S  |d u S )NTc              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wrI   )rJ   r   ©r•   rž   s     r%   r–   z-SchemaMatcher._types_match.<locals>.<genexpr>  s   è ø€ ò 6Ø-.”
˜1œi×(ñ6ùs   ‚)rJ   r9   Ú_CÚOptionalTypeÚgetElementTyper¨   ÚAnyTypeÚisSubtypeOfÚListTypeÚ	ofTensorsr£   r¬   Ú
TensorTyper   ÚNoneTyperj   ÚBoolTyperT   ÚIntTyperQ   Ú	FloatTypeÚfloatÚComplexTypeÚcomplexÚ
NumberType)rc   r©   Úschema_typeÚtype_mapÚjit_typeÚpy_typess         r%   r¨   zSchemaMatcher._types_match  sp  € ä�k¤5§8¡8×#8Ñ#8Ô9Ø%×4Ñ4Ó6ˆKØ˜tÐ#ÒN s×'7Ñ'7¸À+Ó'NÐNä�k¤5§8¡8×#3Ñ#3Ô4Øà×"Ñ"¤5§8¡8×#4Ñ#4×#>Ñ#>Ó#@Ô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Ð"=Ð>ðK
ˆð #+ò 	6ÑˆH�hÜ˜+ xÕ0Ü! (¨HÓ5Ò5ð	6ð ˜4ÐÐr$   rx   c                 ó|   — 	 d| vry t        t        j                  j                  | «      «      S # t        $ r Y y w xY w)Nz::)ro   r9   r¶   Ú_jit_get_schemas_for_operatorÚRuntimeError)rx   s    r%   r²   zSchemaMatcher.lookup_schemas&  s@   € ð	ð ˜4ÑØÜœŸ™×?Ñ?ÀÓEÓFÐFøÜò 	Ùð	ús   ‚/ ‡'/ ¯	;º;N)r   r   r   rP   rm   r   ro   r   rT   r    r	   r—   r¨   rl   rR   r²   r#   r$   r%   r‘   r‘   Ï   s·   „ ñ
ð ð:Ð#7ð :¸EÀ(È4Á.ÐRUÐBUÑ<Vò :ó ð:ð" ðPÐ2ð P°u¸^ÈSÐ=PÑ7Qò Pó ðPð* ð °Dò  ó ð ðB ð˜Sð  X¨e°NÀCÐ4GÑ.HÑ%Iò ó ñr$   r‘   c                   óN   — e Zd Zdeddfd„Zdee   fd„Zede	edf   fd„«       Z
y)ÚOpTreeÚresultr?   Nc                 ó‚   — |j                  «       | _        t        t        | j	                  «       d„ ¬«      «      | _        y )Nc                 ó   — | j                   S rI   ©Ústart_time_ns©Úxs    r%   ú<lambda>z!OpTree.__init__.<locals>.<lambda>?  s
   € ÀAÇOÁO€ r$   ©Úkey)Úexperimental_event_treeÚ_root_nodesro   ÚsortedÚdfsÚ_sorted_nodes©rE   rÏ   s     r%   Ú__init__zOpTree.__init__=  s.   € Ø!×9Ñ9Ó;ˆÔÜ"¤6¨$¯(©(«*Ñ:SÔ#TÓUˆÕr$   c              /   óf   K  — t        j                  | j                  g|¢­i |¤ŽE d {  –—†  y 7 Œ­wrI   )r   Útraverse_dfsrÚ   ©rE   ÚargsÚkwargss      r%   rÜ   z
OpTree.dfsA  s*   è ø€ Ü×&Ñ& t×'7Ñ'7ÐI¸$ÒIÀ&ÑI×IÒIús   ‚'1©/ª1.c                 ó   — | j                   S rI   )rÝ   rD   s    r%   Úsorted_nodeszOpTree.sorted_nodesD  s   € à×!Ñ!Ð!r$   )r   r   r   r
   rß   r   r   rÜ   rn   ro   ræ   r#   r$   r%   rÎ   rÎ   <  sP   „ ðV˜ð V°4ó VðJ h¨~Ñ&>ó Jð ð"˜e N°CÐ$7Ñ8ò "ó ñ"r$   rÎ   c                   ó^   — e Zd Zdeddfd„Zdee   ddfd„Zede	de
e   fd„«       Zd	efd
„Zy)ÚSizeMapÚop_treer?   Nc                 ób  — i | _         |j                  D �]X  }|j                  d   t        j                  k(  r5| j                  |j                  d   «      D ]  }| j                  |«       Œ ŒY|j                  d   t        j                  k(  sŒz|j                  d   }|j                  �|j                  �J ‚|j                  �A|j                  j                  D ](  \  }}}| j                  |«       | j                  |«       Œ* |j                  €Œý|j                  j                  D ]C  \  }}}| j                  |«       | j                  |«       |D ]  \  }}| j                  |«       Œ ŒE �Œ[ i }	|j                  D ]”  }|j                  d   t        j                  k(  sŒ$|j                  d   }
t        j                  |
«      }|sŒKt        |
j                  «      }|	j!                  ||«      }||k7  sŒx|› d|› �}t"        j%                  d|«       Œ– | j                   j'                  |	«       y )Nr   rr   z vs. z(Mismatch between allocation and free: %s)Ú_valuesræ   rt   r   ru   Ú_flat_tensor_inputsÚ_update_valuesrz   r{   r|   r}   Ú
Allocationr   rd   ÚabsÚ
alloc_sizeÚ
setdefaultÚlogÚwarningÚupdate)rE   ré   rp   re   r~   r   r€   r�   ÚstateÚallocationsÚalloc_fieldsrØ   Únew_sizeÚ
prior_sizeÚdeltas                  r%   rß   zSizeMap.__init__J  s  € Ø-/ˆŒà×(Ñ(ó 	3ˆDØ�z‰z˜!‰}¤
× 2Ñ 2Ò2Ø×1Ñ1°$·*±*¸Q±-Ó@ò +�AØ×'Ñ'¨Õ*ñ+ð —‘˜A‘¤*×"3Ñ"3Ó3Ø#Ÿz™z¨!™}�Ø#×*Ñ*Ð2°l×6LÑ6LÐ6TÐTÐTØ×&Ñ&Ð2Ø(4×(;Ñ(;×(FÑ(Fò 4™˜˜1˜fØ×+Ñ+¨AÔ.Ø×+Ñ+¨FÕ3ð4ð  ×)Ñ)Ñ5Ø,8×,BÑ,B×,MÑ,Mò 3Ñ(˜˜6 5Ø×+Ñ+¨AÔ.Ø×+Ñ+¨FÔ3Ø$)ò 3™D˜A˜qØ ×/Ñ/°Õ2ñ3ò3ð	3ð( -/ˆØ×(Ñ(ò 	WˆDØ�z‰z˜!‰}¤
× 5Ñ 5Ó5Ø#Ÿz™z¨!™}�Ü×/Ñ/°Ó=�ÚÜ" <×#:Ñ#:Ó;�HØ!,×!7Ñ!7¸¸XÓ!F�Jð " XÓ-Ø#- ,¨e°H°:Ð >˜ÜŸ™Ð$NÐPUÕVð!	Wð$ 	�‰×Ñ˜KÕ(r$   re   c                 óš  — t         j                  |«      }|�´|�±|j                  t        j                  k(  r“t        d„ t        |j                  xs dg|j                  xs dg«      D «       «      }|t        |j                  «      z  }|dk\  sJ |› «       ‚t        | j                  j                  |d«      |«      | j                  |<   y y y y )Nc              3   ó2   K  — | ]  }|d    |d   z  –— Œ y­w©r   rr   Nr#   rµ   s     r%   r–   z)SizeMap._update_values.<locals>.<genexpr>z  s   è ø€ ÒO A�A�a‘D˜1˜Q™4•KÑOùs   ‚rr   r   )r   rh   Úlayoutr9   ÚstridedÚmaxr­   ÚsizesÚstridesr   Údtyperë   Úget)rE   re   rØ   ÚnÚ	num_bytess        r%   rí   zSizeMap._update_valuesv  s¬   € Ü×#Ñ# AÓ&ˆØˆ?˜q˜}°·±¼U¿]¹]Ò1JäÑO¬¨Q¯W©Wª^¸¸¸Q¿Y¹YÒ=MÈ1È#Ó)NÔOÓOˆAàœM¨!¯'©'Ó2Ñ2ˆIØ ’>Ð1 i [Ó1�>Ü # D§L¡L×$4Ñ$4°S¸!Ó$<¸iÓ HˆD�L‰L˜Òð 2K˜}ˆ?r$   Úopc              #   ó’   K  — | j                   D ]2  }t        |t        «      r|–— Œt        |t        «      sŒ)|E d {  –—†  Œ4 y 7 Œ­wrI   )ry   rJ   r   r£   )r  rž   s     r%   rì   zSizeMap._flat_tensor_inputs€  s>   è ø€ à—‘ò 	ˆAÜ˜!œ_Ô-Ø“Ü˜AœtÕ$Ø—‘ñ		ð ús   ‚5A¸A½A¾ArØ   c                 ó    — | j                   |   S rI   )rë   ©rE   rØ   s     r%   Ú__getitem__zSizeMap.__getitem__ˆ  s   € Ø�|‰|˜CÑ Ð r$   )r   r   r   rÎ   rß   r   r   rí   rl   r   r   rì   r   r  r#   r$   r%   rè   rè   I  se   „ ð*) ð *)¨4ó *)ðXI ¨Ñ 9ð I¸dó Ið ðÐ 4ð ¸À/Ñ9Rò ó ðð!˜yô !r$   rè   c                   ób   — e Zd ZU dZee   ed<   dZee   ed<   e	defd„«       Z
e	defd„«       Zy)ÚDataFlowEdgeNÚinput_versionFÚmutatedr?   c                 ó   — | j                   d u S rI   )r  rD   s    r%   Úis_allocationzDataFlowEdge.is_allocation‘  s   € à×!Ñ! TÐ)Ð)r$   c                 ó   — | j                   d u S rI   )r  rD   s    r%   Úis_deletionzDataFlowEdge.is_deletion•  s   € à�|‰|˜tÐ#Ð#r$   )r   r   r   r  r   rQ   r:   r  rT   rn   r  r  r#   r$   r%   r  r  Œ  sR   … à#'€M�8˜C‘=Ó'Ø#€GˆX�d‰^Ó#àð*˜tò *ó ð*ð ð$˜Tò $ó ñ$r$   r  c                   ó¶   — e Zd Zdeddddfd„Zdeeef   fd„Ze	deee
eef   f   fd„«       Ze	deeef   fd	„«       Ze	de
ed
f   fd„«       Ze	defd„«       Zy)ÚDataFlowNoder‰   ÚgraphÚDataFlowGraphr?   Nc           	      ó   — || _         || _        | j                  «       | _        | j                  j	                  «       D ]:  \  }}|j
                  sŒ|j                  rŒ | j                  j                  |«       Œ< | j                  j	                  «       D ��ci c]#  \  }}||| j                  j                  |«      f“Œ% }}}t        d„ |j                  «       D «       «      sJ |› d| j                  › �«       ‚y c c}}w )Nc              3   ó,   K  — | ]  \  }}||k(  –— Œ y ­wrI   r#   r¤   s      r%   r–   z(DataFlowNode.__init__.<locals>.<genexpr>¦  s   è ø€ Ò8™d˜a �1˜•6Ñ8ùs   ‚z, )Ú_eventÚ_graphÚ_determine_edgesÚ_edgesÚitemsr  r  ÚbumpÚoutputsÚlookupr¬   Úvalues)rE   r‰   r  rØ   ÚedgeÚkÚvÚversionss           r%   rß   zDataFlowNode.__init__›  sÖ   € ØˆŒØˆŒØ59×5JÑ5JÓ5LˆŒàŸ™×*Ñ*Ó,ò 	&‰IˆC�Ø�|‹| D×$6Ó$6Ø—‘× Ñ  Õ%ð	&ð
 ?C¿l¹l×>PÑ>PÓ>R×S±d°a¸�A˜˜4Ÿ;™;×-Ñ-¨aÓ0Ð1Ñ1ÐSˆÑSÜÑ8 h§o¡oÓ&7Ô8Ô8ÐV¸X¸JÀbÈÏÉÈÐ:VÓVÑ8ùó Ts   Â(C:c                 ó   — t        t        j                  | j                  g«      «      }i }d„ |D «       D ]Ø  }t	        |j
                  t        j                  |«      «      D ]ª  \  }}t        |t        «      r?t        j                  |«      }|j                  |t        «       «      j                  |«       ŒUt        |t        «      sŒf|D ]@  }t        j                  |«      }|j                  |t        «       «      j                  |«       ŒB Œ¬ ŒÚ t!        j"                  t$        «      }|j'                  «       D ]M  \  }}	|€Œ	|r| j(                  j+                  |«      nd||   _        d|	v xs t        |	«      dk(  }
|
||   _        ŒO |D ]ª  }|j0                  d   t2        j4                  k(  sŒ$|j0                  d   j6                  dk  sŒAt        j9                  |j0                  d   «      }||   }|�|j.                  €
J d|› �«       ‚d |_        |r| j(                  j+                  |«      nd|_        Œ¬ |D ]j  }|j0                  d   t2        j4                  k(  sŒ$|j0                  d   j6                  dkD  sŒAd |t        j9                  |j0                  d   «         _        Œl t;        t=        d„ |j'                  «       D «       «      «      S )	Nc              3   ó|   K  — | ]4  }|j                   d    t        j                  k(  sŒ$|j                   d   –— Œ6 y­wrý   )rt   r   ru   rµ   s     r%   r–   z0DataFlowNode._determine_edges.<locals>.<genexpr>­  s-   è ø€ ÒS !°!·'±'¸!±*Ä
×@RÑ@RÓ2R�1—7‘7˜1•:ÑSùs   ‚%<¨<éÿÿÿÿTrI   r   rr   zDouble delete: c              3   ó0   K  — | ]  \  }}|€Œ	||f–— Œ y ­wrI   r#   ©r•   r$  r%  s      r%   r–   z0DataFlowNode._determine_edges.<locals>.<genexpr>Ù  s   è ø€ ÒM¡d a¨¸q¹}˜A˜qœ6ÑMùs   ‚
�	)ro   r   rá   r  r­   ry   r‘   r    rJ   r   r   rh   rñ   ÚsetÚaddr£   ÚcollectionsÚdefaultdictr  r  r  r!  r  r  rt   r   rî   rð   rd   ÚdictrÛ   )rE   ÚsubtreeÚmutable_by_keyr  Úop_inputrœ   rØ   Ú
op_input_iÚedgesÚmutable_setr  rž   r#  s                r%   r  zDataFlowNode._determine_edges¨  s‡  € Üœ×+Ñ+¨T¯[©[¨MÓ:Ó;ˆð JLˆÙS wÔSò 	KˆBÜ%(Ø—	‘	œ=×;Ñ;¸BÓ?ó&ò KÑ!�˜'ô ˜h¬Ô8Ü#×/Ñ/°Ó9�CØ"×-Ñ-¨c´3³5Ó9×=Ñ=¸gÕFô   ¬$Õ/Ø&.ò K˜
Ü'×3Ñ3°JÓ?˜Ø&×1Ñ1°#´s³uÓ=×AÑAÀ'ÕJñKñKð	Kô  ×'Ñ'¬Ó5ˆØ .× 4Ñ 4Ó 6ò 	-ÑˆC�Ø‰ÙFI¨4¯;©;×+=Ñ+=¸cÔ+BÈr��c‘
Ô(ð
   ;Ð.ÒR´E¸+Ó4FÈ'Ñ4Q�Ø%,��c‘
Õ"ð	-ð ò 	LˆAØ�w‰w�q‰zœZ×2Ñ2Ó2°q·w±w¸q±z×7LÑ7LÈqÓ7PÜ×/Ñ/°·±¸±
Ó;�Ø˜S‘z�Ø�{ d§l¡lÐ&>ÐWÀ/ÐRUÐQVÐ@WÓWÐ>Ø#�”Ù@C T§[¡[×%7Ñ%7¸Ô%<È�Õ"ð	Lð ò 	RˆAØ�w‰w�q‰zœZ×2Ñ2Ó2°q·w±w¸q±z×7LÑ7LÈqÓ7PØMQ�”i×/Ñ/°·±¸±
Ó;Ñ<ÕJð	Rô
 ”FÑM¨e¯k©k«mÔMÓMÓNÐNr$   c           
      óÜ   — | j                   j                  «       D ��ci c]A  \  }}|j                  s0|t        |j                  «      t        t        |j                  «      f“ŒC c}}S c c}}w rI   )r  r  r  rT   r  r   rQ   r  ©rE   r$  r%  s      r%   ry   zDataFlowNode.inputsÛ  s[   € ð Ÿ™×)Ñ)Ó+÷	
ñ ��1Ø—?’?ð ”�Q—Y‘Y“¤¤c¨1¯?©?Ó!;Ð<Ñ<ó
ð 	
ùó 
s   žAA(c                 óè   — | j                   j                  «       D ��ci c]G  \  }}|j                  r|j                  r|j                  r||j
                  €dn|j
                  dz   “ŒI c}}S c c}}w r‹   )r  r  r  r  r  r  r8  s      r%   r   zDataFlowNode.outputså  sa   € ð Ÿ™×)Ñ)Ó+÷
á��1Ø—’¨¯ª¸!¿)º)ð �A—O‘OÐ+‰q°·±À1Ñ1DÑDó
ð 	
ùó 
s   žAA..c                 óV   — t        d„ | j                  j                  «       D «       «      S )Nc              3   óZ   K  — | ]#  \  }}|j                   sŒ|j                  sŒ |–— Œ% y ­wrI   )r  r  r+  s      r%   r–   z-DataFlowNode.intermediates.<locals>.<genexpr>ï  s%   è ø€ ò 
Ù�!�Q°·³ÀQÇ]Ã]ŒAñ
ùs   ‚+—+¤+)ro   r  r  rD   s    r%   ÚintermediateszDataFlowNode.intermediatesí  s)   € äñ 
ØŸ+™+×+Ñ+Ó-ô
ó 
ð 	
r$   c                 ó.   — | j                   j                  S rI   )r  rÓ   rD   s    r%   Ú
start_timezDataFlowNode.start_timeó  s   € à�{‰{×(Ñ(Ð(r$   )r   r   r   r   rß   r0  r   r  r  rn   ro   rT   rQ   ry   r   r<  r>  r#   r$   r%   r  r  š  sÊ   „ ðW˜nð W°_ð WÈó Wð1O $ y°,Ð'>Ñ"?ó 1Oðf ð
˜˜Y¨¨d°C¨iÑ(8Ð8Ñ9ò 
ó ð
ð ð
˜˜i¨˜nÑ-ò 
ó ð
ð ð
˜u Y° ^Ñ4ò 
ó ð
ð
 ð)˜Cò )ó ñ)r$   r  c                   ó¶   — e Zd Zdeddfd„Zedeedf   fd„«       Zd„ Z	edee
df   fd„«       Zededee
df   fd	„«       Zd
edefd„Zd
eddfd„Zd
eddfd„Zy)r  ré   r?   Nc                 ó  — || _         | j                  |«      | _        i | _        | j                  D �cg c]  }t        || «      ‘Œ c}| _        | j                  j                  d„ ¬«       | j                  «        y c c}w )Nc                 ó   — | j                   S rI   )r>  rÔ   s    r%   rÖ   z(DataFlowGraph.__init__.<locals>.<lambda>þ  s
   € ¨A¯L©L€ r$   r×   )	Ú_op_treeÚ_extract_leaf_eventsÚ_leaf_eventsÚ_active_versionÚleaf_eventsr  Ú_flow_nodesÚsortÚvalidate)rE   ré   Úes      r%   rß   zDataFlowGraph.__init__ù  sk   € ØˆŒØ ×5Ñ5°gÓ>ˆÔØ?AˆÔØ;?×;KÑ;KÖL°aœL¨¨DÕ1ÒLˆÔØ×Ñ×ÑÑ"8ÐÔ9Ø�‰�ùò Ms   ³A<.c                 ó,   — t        | j                  «      S rI   )ro   rG  rD   s    r%   Ú
flow_nodeszDataFlowGraph.flow_nodes  s   € ä�T×%Ñ%Ó&Ð&r$   c                 ó0  — t        «       }| j                  D ]^  }t        |j                  j                  «       «      }||z  }|r-J |j                  j
                  › d|j                  › d|› �«       ‚||z  }Œ` i }| j                  D ]Ž  }|j                  j                  «       D ](  \  }\  }}|j                  |d«      }	|	|k(  rŒ!J |	|f«       ‚ |j                  j                  «       D ]*  \  }}|j                  ||«      }
||
k\  s	J ||
f«       ‚|||<   Œ, Œ� y )Nú r   )	r,  rL  r   r  r  rx   r  ry   r  )rE   r   rp   Únode_outputsÚ
duplicatesÚtensor_versionsrØ   r   ÚversionÚexpectedÚprior_versions              r%   rI  zDataFlowGraph.validate  s5  € ä.1«eˆØ—O‘Oò 	$ˆDÜ˜tŸ|™|×1Ñ1Ó3Ó4ˆLØ  <Ñ/ˆJÙ!ÐS d§k¡k×&6Ñ&6Ð%7°q¸¿¹¸ÀQÀzÀlÐ#SÓS�>Ø�|Ñ#‰Gð		$ð 13ˆØ—O‘Oò 	/ˆDØ%)§[¡[×%6Ñ%6Ó%8ò @Ñ!�‘\�a˜Ø*×.Ñ.¨s°AÓ6�Ø 7Ó*Ð?¨X°wÐ,?Ó?Ð*ð@ð !%§¡× 2Ñ 2Ó 4ò /‘��WØ /× 3Ñ 3°C¸Ó A�Ø -Ò/ÐI°'¸=Ð1IÓIÐ/Ø'.� Ò$ñ/ñ	/r$   c                 ó   — | j                   S rI   )rD  rD   s    r%   rF  zDataFlowGraph.leaf_events  s   € à× Ñ Ð r$   c                 ó    ‡‡— g Šdt         dt        fd„Šdt         fˆˆfd„}| j                  |¬«      D ]  }Œ t        t	        ‰d„ ¬«      «      S )aÿ  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.
        rJ  r?   c                 óô   — | j                   d   t        j                  k(  xrW | j                   d   j                  t        j
                  k(  xs+ t        t        j                  | j                   d   «      «      S r‹   )	rt   r   ru   rv   r   rw   rT   r‘   r—   )rJ  s    r%   Úleaf_opz3DataFlowGraph._extract_leaf_events.<locals>.leaf_opA  s_   € Ø—7‘7˜1‘:¤×!3Ñ!3Ñ3ò Ø—‘˜‘
× Ñ ¤K×$AÑ$AÑAò AÜœ×3Ñ3°A·G±G¸A±JÓ?Ó@ðr$   c                 óŒ   •—  ‰| «      s| j                   t        j                  k(  r‰j                  | «       g S | j                  S rI   )Útagr   rî   rŒ   rs   )rJ  rF  rX  s    €€r%   Úchildren_fnz7DataFlowGraph._extract_leaf_events.<locals>.children_fnG  s8   ø€ Ù�qŒz˜QŸU™U¤j×&;Ñ&;Ò;Ø×"Ñ" 1Ô%Ø�	à—:‘:Ðr$   )r[  c                 ó   — | j                   S rI   rÒ   rÔ   s    r%   rÖ   z4DataFlowGraph._extract_leaf_events.<locals>.<lambda>Q  s
   € °q·±€ r$   r×   )r   rT   rÜ   ro   rÛ   )ré   r[  r   rF  rX  s      @@r%   rC  z"DataFlowGraph._extract_leaf_events  s^   ù€ ðB -/ˆð	”~ð 	¬$ó 	ð	œ>ö 	ð —‘¨�Ó5ò 	ˆAØð	ô ”V˜KÑ-FÔGÓHÐHr$   rØ   c                 óF   — | j                   j                  |d«      }|€J ‚|S ©Nr   ©rE  rñ   )rE   rØ   rR  s      r%   r!  zDataFlowGraph.lookupS  s+   € Ø×&Ñ&×1Ñ1°#°qÓ9ˆØÐ"Ð"Ð"Øˆr$   c                 óh   — | j                   j                  |d «      }|€J ‚|dz   | j                   |<   y )Nrr   )rE  r  )rE   rØ   rT  s      r%   r  zDataFlowGraph.bumpX  s;   € Ø×,Ñ,×0Ñ0°°dÓ;ˆØÐ(Ð(Ð(Ø$1°AÑ$5ˆ×Ñ˜SÒ!r$   c                 ó^   — | j                   j                  |d«      €J ‚d | j                   |<   y r^  r_  r
  s     r%   ÚdeletezDataFlowGraph.delete]  s1   € Ø×#Ñ#×.Ñ.¨s°AÓ6ÐBÐBÐBØ$(ˆ×Ñ˜SÒ!r$   )r   r   r   rÎ   rß   rn   ro   r  rL  rI  r   rF  rl   rC  r   rQ   r!  r  rb  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                   óÌ   — e Zd ZU dZee   ed<    ej                  e	¬«      Z
e	eef   ed<    ej                  e	¬«      Ze	eef   ed<    ej                  e¬«      Zee   ed<   y)ÚCategoryElementNÚby_id©Údefault_factoryÚby_keyÚ
by_versionÚ_by_id_keyset)r   r   r   re  r   r   r:   ÚdataclassesÚfieldr0  rh  r   ri  ÚTensorAndIDr,  rj  r#   r$   r%   rd  rd  b  sq   … à $€Eˆ8�HÑÓ$Ø(9¨×(9Ñ(9È$Ô(O€FˆD�˜HÐ$Ñ%ÓOØ.?¨k×.?Ñ.?ÐPTÔ.U€J��[ (Ð*Ñ+ÓUð %6 K×$5Ñ$5ÀcÔ$J€M�3�y‘>ÔJr$   rd  c                   óÐ   — e Zd ZU  ej                  d„ ¬«      Zej                  ee	f   e
d<   dededdfd„Zdededdfd	„Zded
ededdfd„Zded
ededdfd„Zded
edee   fd„Zy)ÚCategoryDictc                  ó4   — t        j                  t        «      S rI   )r.  r/  rd  r#   r$   r%   rÖ   zCategoryDict.<lambda>p  s   € ¤× 7Ñ 7¼Ó H€ r$   rf  rë   rØ   Úcategoryr?   Nc                 ó¤   — || j                   |j                     _        | j                   |j                     j                  j	                  |«       y rI   )rë   rV   re  rj  r-  ©rE   rØ   rq  s      r%   Ú	set_by_idzCategoryDict.set_by_ids  s8   € Ø%-ˆ�‰�S—V‘VÑÔ"Ø�‰�S—V‘VÑ×*Ñ*×.Ñ.¨sÕ3r$   c                 óP   — || j                   |j                     j                  |<   y rI   )rë   rV   rh  rs  s      r%   Ú
set_by_keyzCategoryDict.set_by_keyw  s   € Ø+3ˆ�‰�S—V‘VÑ×#Ñ# CÒ(r$   rR  c                 óT   — || j                   |j                     j                  ||f<   y rI   )rë   rV   ri  ©rE   rØ   rR  rq  s       r%   Úset_by_versionzCategoryDict.set_by_versionz  s#   € Ø:Bˆ�‰�S—V‘VÑ×'Ñ'¨¨g¨Ò7r$   c                 ón   — | j                   |j                     j                  j                  ||f|«       y rI   )rë   rV   ri  rñ   rx  s       r%   Úsetdefault_by_versionz"CategoryDict.setdefault_by_version}  s+   € ð 	�‰�S—V‘VÑ×'Ñ'×2Ñ2°C¸°>À8ÕLr$   c                 ó
  — t        |t        «      rt        |t        «      sy | j                  |j                     }|j
                  xs< |j                  j                  |d «      xs |j                  j                  ||fd «      S rI   )	rJ   r   r   rë   rV   re  rh  r  ri  )rE   rØ   rR  Úelements       r%   r  zCategoryDict.get‚  sn   € Ü�cœ3Ô¬
°3¼	Ô(BØØ—,‘,˜sŸv™vÑ&ˆà�M‰Mò <Ø�~‰~×!Ñ! # tÓ,ò<à×!Ñ!×%Ñ% s¨G n°dÓ;ð	
r$   )r   r   r   rk  rl  rë   r.  r/  rQ   rd  r:   r   r   rt  rv  ry  r{  r   r   r  r#   r$   r%   ro  ro  m  sÒ   … à=N¸[×=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°hÑ-?ô 
r$   ro  c                   óº   — e Zd Zdeddfd„Zedeeeee	ef   df   fd„«       Z
defd„Zdeeee   f   fd„Zdee   fd	„Zdd
„Zdd„Zdd„Zdd„Zdd„Zdd„Zd„ Zy)ÚMemoryProfilerÏ   r?   Nc                 óŠ  — t        |«      | _        t        | j                  «      | _        t	        | j                  «      | _        t        «       | _        | j                  «        | j                  «        | j                  «        | j                  «        | j                  «        | j                  «        | j                  «        y rI   )rÎ   rB  r  Ú_data_flow_graphrè   Ú	_size_mapro  Ú_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ß   zMemoryProfile.__init__Ž  sŒ   € Ü˜v›ˆŒÜ -¨d¯m©mÓ <ˆÔÜ  §¡Ó/ˆŒÜ'›>ˆÔà×+Ñ+Ô-Ø×0Ñ0Ô2Ø×ÑÔØ×,Ñ,Ô.Ø×ÑÔØ×!Ñ!Ô#Ø×!Ñ!Õ#r$   .c           	      ó^  ‡ — g }i }i }‰ j                   j                  «       D �]S  }|j                  d   t        j                  k(  sŒ%|j                  d   }|j
                  }|dkD  }|j                  }t        j                  |«      }	|	�|||	|f<   Œpt        |j                  «      }
|j                  |
j                  f}|rU||v r&|j                  |t        j                  |
df|f«       ŒÉd||<   |j                  |t        j                  |
df|f«       Œô|j                  |t        j                   |
df| f«       |j#                  |d«      r�Œ.|j                  dt        j$                  |
df| f«       �ŒV ‰ j'                  «       }t)        t+        |j-                  «       «      «      }|j-                  «       D �
�cg c]%  \  }
}|
df|vr|dk(  rdt        j$                  |
|ff‘Œ' }}
}‰ j.                  j0                  D ]í  }|j2                  j5                  «       D ]Î  \  }
}|j6                  r,||
df   }|j                  |t        j                  |
dff«       nV|j8                  rJ|j:                  j                  }|j<                  }|€J ‚|j                  |t        j                  |
|ff«       |j>                  sŒ¡||
df   }|j                  |t        j                   |
||
   ff«       ŒÐ Œï |jA                  ˆ fd„|D «       «       |jC                  d„ ¬«       tE        |«      S c c}}
w )	Nr   rr   TFr)  c              3   óV   •K  — | ]   \  }}\  }}||||f‰j                   |   f–— Œ" y ­wrI   )r‚  )r•   ÚtimeÚactionrØ   rR  rE   s        €r%   r–   z)MemoryProfile.timeline.<locals>.<genexpr>×  s9   øè ø€ ò 
á,��f™n˜s Gð �6˜C ˜>¨4¯>©>¸#Ñ+>Ô?ñ
ùs   ƒ&)c                 ó*   — | d   | d   j                   fS r‹   )ÚvaluerÔ   s    r%   rÖ   z(MemoryProfile.timeline.<locals>.<lambda>Ü  s   €  1 Q¡4¨¨1©¯©Ð"4€ r$   r×   )#rB  rÜ   rt   r   rî   rð   rÓ   r   rd   r   r8   r=   rŒ   r/   r2   r1   r3   Úpopr0   Ú_category_snapshotr0  rÛ   Úkeysr�  rL  r  r  r  r  r  r  r  ÚextendrH  ro   )rE   ÚoutputÚallocation_timesÚlive_unknownr‰   r÷   rð   r  re   ÚtkeyrØ   Úptr_and_deviceÚsnapshotÚlast_versionrR  Úeventsrp   r#  s   `                 r%   ÚtimelinezMemoryProfile.timelineœ  s	  ø€ à:<ˆØ>@ÐØFHˆØ—]‘]×&Ñ&Ó(ó 	ˆEØ�{‰{˜1‰~¤×!6Ñ!6Ó6Ø$Ÿ{™{¨1™~�Ø)×4Ñ4�
Ø *¨Q¡�Ø×'Ñ'�ä ×0Ñ0°Ó>�ØÐ#Ø>?Ð$ d¨MÐ%:Ò;ô ˜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Ø"ŸM™MØ!#¤V×%7Ñ%7¸#¸q¸ÀJÀ;Ð Oöð3	ð: ×*Ñ*Ó,ˆÜœF 8§=¡=£?Ó3Ó4ˆð !)§¡£÷9
á��WØ�Tˆ{Ð"2Ñ2°wÀ!²|ð ”×#Ñ# c¨7 ^Ò4ð9
ˆñ 9
ð ×)Ñ)×4Ñ4ò 	QˆDØ!Ÿ[™[×.Ñ.Ó0ò Q‘	��TØ×%Ò%Ø(¨#¨t¨Ñ5�AØ—M‘M 1¤f§m¡m°c¸1°XÐ">Õ?à—\’\ØŸ™×1Ñ1�AØ"×0Ñ0�GØ"Ð.Ð.Ð.Ø—M‘M 1¤f×&>Ñ&>ÀÀgÀÐ"OÔPà×#Ó#Ø(¨#¨u¨Ñ6�AØ—M‘M 1¤f§n¡n°s¸LÈÑ<MÐ6NÐ"OÕPñQð	Qð  	�‰ó 
à06ô
ô 	
ð
 	�‰Ñ4ˆÔ5Ü�V‹}Ðùó99
s   Æ>*L)c                 ó\   —  | j                   j                  |i |¤Žt        j                  k(  S rI   )rƒ  r  r   r   râ   s      r%   Ú_is_gradientzMemoryProfile._is_gradientß  s+   € Ø#ˆt×Ñ×#Ñ# TÐ4¨VÑ4¼×8IÑ8IÑIÐIr$   c           	      óZ  — t        «       }| j                  j                  D ]}  }|j                  d„ |j                  j                  «       D «       «       |j                  d„ |j                  D «       «       |j                  |j                  j                  «       «       Œ | j                  j                  j                  «       D ]$  }|j                  d„ |j                  D «       «       Œ& t        |«      D ��ci c]$  \  }}||f| j                  j                  ||«      “Œ& c}}S c c}}w )Nc              3   ó0   K  — | ]  \  }\  }}||f–— Œ y ­wrI   r#   )r•   r$  r   r%  s       r%   r–   z3MemoryProfile._category_snapshot.<locals>.<genexpr>æ  s   è ø€ Ò'T±9°1±f°q¸!¨¨A¬Ñ'Tùó   ‚c              3   ó$   K  — | ]  }|d f–— Œ
 y­w©r   Nr#   ©r•   rØ   s     r%   r–   z3MemoryProfile._category_snapshot.<locals>.<genexpr>ç  s   è ø€ Ò&N°C¨¨Q¤xÑ&Nùó   ‚c              3   ó$   K  — | ]  }|d f–— Œ
 y­wr¤  r#   r¥  s     r%   r–   z3MemoryProfile._category_snapshot.<locals>.<genexpr>ë  s   è ø€ Ò&K°C¨¨Q¤xÑ&Kùr¦  )r,  r�  rL  rô   ry   r  r<  r   rƒ  rë   r"  rj  rÛ   r  )rE   Úall_tensor_versionsrp   rž   rØ   rR  s         r%   r’  z MemoryProfile._category_snapshotâ  s  € Ü03³Ðà×)Ñ)×4Ñ4ò 	=ˆDØ×&Ñ&Ñ'TÀÇÁ×@QÑ@QÓ@SÔ'TÔUØ×&Ñ&Ñ&N¸4×;MÑ;MÔ&NÔNØ×&Ñ& t§|¡|×'9Ñ'9Ó';Õ<ð	=ð
 ×!Ñ!×)Ñ)×0Ñ0Ó2ò 	LˆAØ×&Ñ&Ñ&K¸1¿?¹?Ô&KÕKð	Lô
 !'Ð':Ó ;÷
á��Wð �'ˆN˜D×,Ñ,×0Ñ0°°gÓ>Ñ>ó
ð 	
ùó 
s   Ã:)D'c                 óP  ‡ ‡— t        «       Š	 t        ‰«      }‰ j                  j                  D ]e  }t	        ˆˆ fd„|j
                  j                  «       D «       «      }|sŒ3‰j                  |«       ‰j                  d„ |j                  D «       «       Œg t        ‰«      |k(  r‰S Œš)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   óÖ   •K  — | ]`  \  }\  }}‰j                   j                  ||«      t        j                  t        j                  fv s|j
                  ‰v r|j
                  –— Œb y ­wrI   )rƒ  r  r   r   r!   rV   )r•   rØ   r   rR  Údepends_on_gradientrE   s       €€r%   r–   zAMemoryProfile._any_version_depends_on_gradient.<locals>.<genexpr>  sa   øè ø€ ò á)˜™\˜a Ø×'Ñ'×+Ñ+¨C°Ó9Ü ×)Ñ)¬8×+=Ñ+=Ð>ñ?à—v‘vÐ!4Ñ4ð	 —F•Fñùs   ƒA&A)c              3   ó4   K  — | ]  }|j                   –— Œ y ­wrI   )rV   r¥  s     r%   r–   zAMemoryProfile._any_version_depends_on_gradient.<locals>.<genexpr>  s   è ø€ Ò.N¸#¨s¯v­vÑ.Nùs   ‚)	r,  r«   r�  rL  ro   ry   r  rô   r   )rE   Ú
start_sizerp   Úidsr«  s   `   @r%   Ú _any_version_depends_on_gradientz.MemoryProfile._any_version_depends_on_gradientò  s¢   ù€ ô ),«ÐØÜÐ0Ó1ˆJØ×-Ñ-×8Ñ8ò O�Üô à-1¯[©[×->Ñ->Ó-@ôó �ò Ø'×.Ñ.¨sÔ3Ø'×.Ñ.Ñ.NÀÇÁÔ.NÕNðOô$ Ð&Ó'¨:Ò5Ø*Ð*ð+ r$   c                 óh  — | j                   j                  «       D ]?  }t        |«      D ]/  \  }}| j                  j	                  |t
        j                  «       Œ1 ŒA | j                  j                  D ]=  }|j                  D ],  }| j                  j                  |t
        j                  «       Œ. Œ? y)z>Mark Tensors which are unambiguous and simple to reason about.N)rB  rÜ   rˆ   rƒ  rt  r   r   r�  rL  r<  rv  r   )rE   r‰   r   r�   rp   rž   s         r%   r„  z,MemoryProfile._set_gradients_and_temporaries  sª   € ð —]‘]×&Ñ&Ó(ò 	FˆEÜ.¨uÓ5ò F‘	��6Ø× Ñ ×*Ñ*¨6´8×3DÑ3DÕEñFð	Fð ×)Ñ)×4Ñ4ò 	CˆDØ×'Ñ'ò C�Ø× Ñ ×+Ñ+¨A¬x×/AÑ/AÕBñCñ	Cr$   c                 ó¼   — | j                   j                  «       D ]?  }t        |«      D ]/  }|€Œ| j                  j	                  |t
        j                  «       Œ1 ŒA y rI   )rB  rÜ   r†   rƒ  rt  r   r!   )rE   r‰   r€   s      r%   r…  z1MemoryProfile._set_parameters_using_python_tracer&  sW   € Ø—]‘]×&Ñ&Ó(ò 	FˆEÜ'¨Ó.ò F�Ø‘=Ø×$Ñ$×.Ñ.¨q´(×2DÑ2DÕEñFñ	Fr$   c                 óÞ  ‡ ‡— ‰ j                  «       }t        «       Št        ‰ j                  j                  «      D ]m  }|j
                  j                  «       D ���ch c]  \  }\  }}||f’Œ }}}}||j                  j                  «       z  }t        ˆˆ fd„|D «       «      sŒi‰|z  ŠŒo ‰j                  «       }‰ j                  j                  D ]N  }t        j                  t        |j                  «      v sŒ)|t        |j                  j                  «       «      z  }ŒP |D ]?  \  }}|j                  |vsŒ‰ j                  j!                  ||t"        j$                  «       ŒA yc c}}}w )aÍ  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   óœ   •K  — | ]C  } ‰j                   j                  |Ž t        j                  t        j                  fv xs |‰v –— ŒE y ­wrI   )rƒ  r  r   r   r!   )r•   rž   Úproduces_gradientrE   s     €€r%   r–   z,MemoryProfile._set_inputs.<locals>.<genexpr>M  sW   øè ø€ ò ð ð %�× Ñ ×$Ñ$ aÐ(¬X×->Ñ->Ä×@RÑ@RÐ,SÐSò *ØÐ)Ð)ó*ñùs   ƒA	AN)r¯  r,  Úreversedr�  rL  ry   r  r   ÚanyÚcopyr   rw   r�   r  rV   rƒ  r{  r   r   )	rE   r«  rp   rØ   r   rR  ÚtensorsÚinput_candidatesr´  s	   `       @r%   r†  zMemoryProfile._set_inputs,  sO  ù€ ð2 #×CÑCÓEÐô /2«eÐÜ˜T×2Ñ2×=Ñ=Ó>ò 	-ˆDØ?C¿{¹{×?PÑ?PÓ?R×SÐSÑ*;¨#©|°°7˜˜W’~ÐSˆGÒSØ�t—|‘|×)Ñ)Ó+Ñ+ˆGÜô ð !ôõ ð
 " WÑ,Ñ!ð	-ð -×1Ñ1Ó3ÐØ×)Ñ)×4Ñ4ò 	>ˆDÜ×,Ñ,´
¸4¿;¹;Ó0GÒGØ ¤C¨¯©×(:Ñ(:Ó(<Ó$=Ñ=Ñ ð	>ð -ò 	U‰LˆC�Ø�v‰vÐ0Ò0Ø× Ñ ×6Ñ6°s¸GÄXÇ^Á^ÕTñ	Uùô! Ts   ÁE(
c                 óþ  ‡ ‡— ‰ j                  «       }t        «       }|j                  «       D ��ch c]  \  }}|t        j                  k(  sŒ|’Œ }}}‰ j
                  j                  D ]à  }|j                  j                  «       D ���	ch c]  \  }\  }}	||	f’Œ }
}}}	t        j                  t        |j                  «      vsŒ\t        ˆ fd„|
D «       «      rŒqt        ˆ fd„|j                  j                  «       D «       «      rŒž|j                  |
«      sŒ°||j                  j                  «       z  }||
j                  |«      z  }Œâ t        «       Št!        ‰ j
                  j                  «      D ]`  }t        ˆ ˆfd„|j                  j                  «       D «       «      sŒ1‰j#                  d„ |j                  j                  «       D «       «       Œb |j%                  ‰«       |D ��ch c]  \  }}|j&                  ’Œ }}}|‰ j)                  «       z  }|j+                  «       D ]>  \  }}|j&                  |v sŒ‰ j,                  j/                  |t        j0                  «       Œ@ yc c}}w c c}	}}w c c}}w )aþ  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   ó<   •K  — | ]  } ‰j                   |Ž –— Œ y ­wrI   ©rŸ  ©r•   rž   rE   s     €r%   r–   z@MemoryProfile._set_parameters_using_data_flow.<locals>.<genexpr>Œ  s   øè ø€ ÒB°aÐ-˜D×-Ñ-¨qÔ1ÑBùó   ƒc              3   ó<   •K  — | ]  } ‰j                   |Ž –— Œ y ­wrI   r¼  r½  s     €r%   r–   z@MemoryProfile._set_parameters_using_data_flow.<locals>.<genexpr>�  s   øè ø€ ÒP°aÐ-˜D×-Ñ-¨qÔ1ÑPùr¾  c              3   óH   •K  — | ]  } ‰j                   |Ž xs |‰v –— Œ y ­wrI   r¼  )r•   rž   rE   Úused_for_gradients     €€r%   r–   z@MemoryProfile._set_parameters_using_data_flow.<locals>.<genexpr>˜  s4   øè ø€ ò àð "�×!Ñ! 1Ð%Ò?¨Ð.?Ð)?Ó?ñùs   ƒ"c              3   ó0   K  — | ]  \  }\  }}||f–— Œ y ­wrI   r#   )r•   rØ   r   rR  s       r%   r–   z@MemoryProfile._set_parameters_using_data_flow.<locals>.<genexpr>œ  s!   è ø€ ò )Ù'8 s©L¨Q°�S˜'”Nñ)ùr¢  N)r’  r,  r  r   r   r�  rL  ry   r   rw   r�   r  r¶  r   ÚintersectionÚ
differencerµ  rô   Úintersection_updaterV   r¯  r“  rƒ  rt  r!   )rE   rš  Úcandidate_parametersrž   rq  Úcandidate_fwd_tensorsrp   rØ   r   r�  ry   Úparameter_keysrÁ  s   `           @r%   r‡  z-MemoryProfile._set_parameters_using_data_flow_  s*  ù€ ð: ×*Ñ*Ó,ˆô 25³Ðà!)§¡Ó!1÷3
Ù�!�X°XÄÇÁÓ5OŠAð3
Ðñ 3
ð ×)Ñ)×4Ñ4ò 	QˆDØ:>¿+¹+×:KÑ:KÓ:M×NÐN¡ s©J¨Q°�s˜E’lÐNˆFÒNô ×-Ñ-´ZÀÇÁÓ5LÒLÜÓB¸6ÔBÕBÜÓP¸4¿<¹<×;MÑ;MÓ;OÔPÕPð *×6Ñ6°vÕ>à%¨¯©×);Ñ);Ó)=Ñ=Ð%Ø$¨×(9Ñ(9Ð:OÓ(PÑPÑ$ð	Qô /2«eÐÜ˜T×2Ñ2×=Ñ=Ó>ò 	ˆDÜô àŸ™×+Ñ+Ó-ôõ ð "×(Ñ(ñ )Ø<@¿K¹K×<MÑ<MÓ<Oô)õ ð	ð 	×0Ñ0Ð1BÔCð 0D×D¡V S¨!˜#Ÿ&›&ÐDˆÑDØ˜$×?Ñ?ÓAÑAˆà—m‘m“oò 	D‰FˆC�Ø�v‰v˜Ò'Ø× Ñ ×*Ñ*¨3´×0BÑ0BÕCñ	DùóE3
ùô
 Oùó4 Es   °I,ÁI,Â
I2
Ç.I9c                 ó„  — t         j                  t         j                  h}t         j                  t         j                  h}| j
                  j                  D ]Û  }|j                  j                  «       D ���ch c]  \  }\  }}||f’Œ }}}}|D �ch c]  } | j                  j                  |Ž ’Œ }	}|	|z  sŒb|	||z  z
  rŒkt        j                  t        |j                  «      vsŒ‘|j                  j                  «       D ].  } | j                  j                   g |¢t         j                  ‘­Ž  Œ0 ŒÝ yc c}}}w c c}w )z(Flood the graph to identify activations.N)r   r   r   r!   r   r�  rL  ry   r  rƒ  r  r   rw   r�   r  r   r{  )
rE   ÚrequiredÚalso_allowedrp   rØ   r   r�  ry   rž   Úinput_categoriess
             r%   rˆ  zMemoryProfile._set_activations©  s  € ô —N‘N¤H×$7Ñ$7Ð8ˆÜ ×*Ñ*¬H×,>Ñ,>Ð?ˆØ×)Ñ)×4Ñ4ò 	TˆDØ:>¿+¹+×:KÑ:KÓ:M×NÐN¡ s©J¨Q°�s˜E’lÐNˆFÒNØBHÖI¸QÐ 4 × 0Ñ 0× 4Ñ 4°aÒ 8ÐIÐÐIð " HÓ,Ø)¨X¸Ñ-DÓEô  ×1Ñ1¼ÀDÇKÁKÓ9PÒPàŸ™×+Ñ+Ó-ò T�AØ:�D×$Ñ$×:Ñ:ÐS¸AÐS¼x×?RÑ?RÔSñTñ	TùÜNùÚIs   Á8D6
Â D=c                 óÞ  — | j                   j                  «       D ]Ð  }|j                  d   t        j                  k(  sŒ$|j                  d   j
                  sŒ>|j                  d   j
                  j                  }t        j                  j                  d„ |D «       «      D ]G  \  }}t        j                  |«      }|€Œ| j                  j                  |t        j                  «       ŒI ŒÒ y )Nr   rr   c              3   ó(   K  — | ]
  \  }}}|–— Œ y ­wrI   r#   )r•   r   rõ   s      r%   r–   z5MemoryProfile._set_optimizer_state.<locals>.<genexpr>Á  s   è ø€ Ò9™{˜q ! U”UÑ9ùs   ‚)rB  rÜ   rt   r   rz   r|   r}   ÚitÚchainÚfrom_iterabler   rh   rƒ  rt  r   r"   )rE   r‰   r}   r   re   rØ   s         r%   r‰  z"MemoryProfile._set_optimizer_state¼  s¾   € Ø—]‘]×&Ñ&Ó(ò 	RˆEØ�{‰{˜1‰~¤×!2Ñ!2Ó2°u·{±{À1±~×7OÓ7OØ"Ÿ[™[¨™^×5Ñ5×@Ñ@�
ÜŸH™H×2Ñ2Ù9¨jÔ9óò R‘D�A�qô $×/Ñ/°Ó2�CØ‘Ø×(Ñ(×2Ñ2°3¼×8PÑ8PÕQñRñ	Rr$   c                 ó’  — d t         j                  h}| j                  j                  D ]œ  }t        j
                  t        |j                  «      v sŒ)|j                  j                  «       D ]W  \  }}|dk(  s"| j                  j                  ||dz
  «      |v sŒ-| j                  j                  ||t         j                  «       ŒY Œž y r‹   )r   r    r�  rL  r   rw   r�   r  r   r  rƒ  r  r{  )rE   Úpriorrp   rØ   rR  s        r%   rŠ  z"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õññ	r$   ©r?   N)r   r   r   r
   rß   rn   ro   rQ   r/   ÚKeyAndIDr�  rT   rŸ  r0  rm  r   r   r’  r,  r¯  r„  r…  r†  r‡  rˆ  r‰  rŠ  r#   r$   r%   r  r  �  s²   „ ð$˜ð $°4ó $ð ð@˜%  c¨6°8¸SÐ&@Ñ AÀ3Ð FÑGò @ó ð@ðDJ¨tó Jð
 D¨°h¸xÑ6HÐ)HÑ$Ió 
ð !+°#°c±(ó !+óFCó"Fó1UófHDóTTó&	Rór$   r  c                   ó6   — e Zd Zd„ Zd„ Zdd„Zdd„Z	 d	 dd„Zy)	ÚMemoryProfileTimelinec                 óH   — |j                   | _         |j                  | _        y)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)rE   Úmemory_profiles     r%   rß   zMemoryProfileTimeline.__init__Ó  s   € ð '×/Ñ/ˆŒØ(×4Ñ4ˆ�r$   c                 ó>  ‡ ‡— t        j                  |«      }g }g Šˆ ˆfd„}d}‰ j                  D �]G  \  }}\  }}	}
|j                  |k7  rŒ|dk7  rt        |dz  «      }|dk(  s
||k  r|dkD  r|}t	        |«      dk(  r9|j                  |«       ‰j                  dgt        D �cg c]  }d‘Œ c}z   «       n;||d   k7  r3|j                  |«       ‰j                  ‰d   j                  «       «       |t        j                  t        j                  fv r |||	|
«       Œï|t        j                  k(  r |||	|
 «        |||	dz   |
«       �Œ|t        j                  k(  r |||	|
 «       �Œ<t        d|› �«      ‚ |D �cg c]  }|dk  r|n|‘Œ }}|‰fS c c}w c c}w )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                 ó¬   •— t        | t        «      r‰j                  j                  | |«      nd }t        |   dz   }‰d   |xx   t        |«      z  cc<   y )Nrr   r)  )rJ   r   rÙ  r  Ú_CATEGORY_TO_INDEXrQ   )rØ   rR  rú   rq  rk   rE   r  s        €€r%   rô   z8MemoryProfileTimeline._coalesce_timeline.<locals>.updateê  sV   ø€ ô ˜c¤9Ô-ð —‘×#Ñ# C¨Ô1àð ô
 ' xÑ0°1Ñ4ˆEØ�"‰I�eÓ¤ E£
Ñ*Ôr$   r)  iè  r   rr   úUnknown action: )r9   r8   r�  rQ   r«   rŒ   rÝ  r·  r/   r0   r1   r2   r3   Ú
ValueError)rE   Ú
device_strr8   Útimesrô   Út_minre   rŽ  rØ   rR  Únumbytesr   r  s   `           @r%   Ú_coalesce_timelinez(MemoryProfileTimeline._coalesce_timelineÞ  s£  ù€ ô —‘˜jÓ)ˆØˆØ!#ˆõ	+ð ˆØ37·=±=ó !	>Ñ/ˆAˆv‘~˜˜W xØ�z‰z˜VÒ#Øð �BŠwÜ˜˜D™“M�ð ˜Š{˜q 5šy¨Q°ªUØ�ô �5‹z˜QŠØ—‘˜Q”Ø—‘˜a˜SÔ/AÖ#B¨!¢AÒ#BÑBÕCà�e˜B‘i’Ø—‘˜Q”Ø—‘˜U 2™YŸ^™^Ó-Ô.ð œ&×,Ñ,¬f¯m©mÐ<Ñ<Ù�s˜G XÕ.àœ6×3Ñ3Ò3Ù�s˜G h YÔ/Ù�s˜G a™K¨Ö2àœ6Ÿ>™>Ò)Ù�s˜G h YÖ/ô !Ð#3°F°8Ð!<Ó=Ð=ðC!	>ðF 16Ö6¨1˜!˜aš%‘ QÑ&Ð6ˆÐ6Ø�eˆ|Ðùò+ $Cùò( 7s   Â$	FÅ?FNc                 óž   — | j                  |«      \  }}ddl}t        |d«      5 }|j                  ||g|«       ddd«       y# 1 sw Y   yxY w)zˆSaves 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)rE   Úpathrà  rá  r  rç  Úfs          r%   Úexport_memory_timelinez,MemoryProfileTimeline.export_memory_timeline  sM   € ð ×.Ñ.¨zÓ:‰ˆˆuãä�$˜‹_ð 	) Ø�I‰I�u˜e�n aÔ(÷	)÷ 	)ñ 	)ús   ¥AÁAc                 óÒ  ‡ — t        j                  |«      }g }ˆ fd„}‰ j                  D �]  \  }}\  }}	}
|j                  |k7  rŒ|t        j                  t        j
                  fv r$|j                  |t        |   |
 |||	«      f«       Œb|t        j                  k(  rK|j                  |t        |   |
  |||	«      f«       |j                  |t        |   |
 |||	dz   «      f«       ŒÀ|t        j                  k(  r%|j                  |t        |   |
  |||	«      f«       Œøt        d|› �«      ‚ ddl}t        |d«      5 }|j                  ||«       ddd«       y# 1 sw Y   yxY w)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                 ór   •— t        | t        «      r‰j                  j                  | |«      nd }t        |   S rI   )rJ   r   rÙ  r  rÝ  )rØ   rR  rq  rE   s      €r%   Úget_category_indexzLMemoryProfileTimeline.export_memory_timeline_raw.<locals>.get_category_index-  s:   ø€ ô ˜c¤9Ô-ð —‘×#Ñ# C¨Ô1àð ô
 & hÑ/Ð/r$   rr   rÞ  r   Nræ  )r9   r8   r�  r/   r0   r1   rŒ   Ú_ACTION_TO_INDEXr2   r3   rß  rç  rè  ré  )rE   rê  rà  r8   Ú
raw_eventsrï  re   rŽ  rØ   rR  rã  rç  rë  s   `            r%   Úexport_memory_timeline_rawz0MemoryProfileTimeline.export_memory_timeline_raw%  sƒ  ø€ ô
 —‘˜jÓ)ˆØ68ˆ
ô	0ð 48·=±=ó +	>Ñ/ˆAˆv‘~˜˜W 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Ð!<Ó=Ð=ðW+	>óZ 	ä�$˜‹_ð 	% Ø�I‰I�j !Ô$÷	%÷ 	%ñ 	%ús   ÅEÅE&c           	      ó¦  — ddl }|j                  j                  d«      }|€t        d«       yddlm} ddlm} ddlm	}	 ddl
m}
 ddl}| j                  |«      }|j                  |d   «      |j                  |d   «      }}t        |«      }||z  }|j!                  |d¬	«      d
z  }t#        j$                  |«      }t"        j&                  j)                  |«      }t"        j&                  j+                  |«      }|
j-                  |d¬«      }|j/                  «       }t0        j3                  «       D ]8  \  }}t4        |   }|j7                  |dz  |dd…|f   |dd…|dz   f   |d¬«       Œ: |j9                  t0        D �cg c]  }|€dn|j:                  ‘Œ c}«       |j=                  d«       |j?                  d«       djA                  |r|gng d|d
z  d›d|d
z  d›d�gz   «      }|jC                  |«        |	ddd¬«      }|jE                  «        |jG                  |j:                  d¬«       tI        |j:                  d«      5 } ||jK                  «       «      jM                  d«      }d |› d!�}tI        |d"«      5 }|jO                  |«       ddd«       ddd«        ||j:                  «       yc c}w # 1 sw Y   Œ)xY w# 1 sw Y   Œ-xY w)#zsExports 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)Úremove)ÚNamedTemporaryFilerr   )Ú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 GiBÚwbz.pngF)Úsuffixrb  Úpng)ÚformatÚrbzutf-8z}<html>
<head><meta charset="utf-8" /><title>GPU Memory Timeline HTML</title></head>
<body>
  <img src='data:image/png;base64,z'>
</body>
</html>ræ  )(Úimportlib.utilÚutilÚ	find_specÚprintÚbase64rõ  Úosrö  Útempfiler÷  Úmatplotlib.pyplotÚpyplotÚnumpyrä  ÚarrayÚminÚcumsumr9   r8   ÚcudaÚmax_memory_allocatedÚmax_memory_reservedÚfigureÚgcaÚ_CATEGORY_TO_COLORSr  rÝ  Úfill_betweenÚlegendrx   Ú
set_xlabelÚ
set_ylabelÚjoinÚ	set_titleÚcloseÚsavefigrè  ÚreadÚdecodeÚwrite)rE   rê  rà  rú  ÚtitleÚ	importlibÚmatplotlib_specrõ  rö  r÷  ÚpltÚnpÚmtrá  r  râ  Ústackedr8   r  r  ÚfigÚaxesrq  rü  rž   ÚtmpfileÚtmpÚencodedÚhtmlrë  s                                 r%   Úexport_memory_timeline_htmlz1MemoryProfileTimeline.export_memory_timeline_htmlg  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¸1  ‘I°·±Ñ6ÒTÔUà�‰˜Ô$Ø�‰˜Ô&Ø—‘Ùˆe‰W 2à(Ð)=ÀÑ)IÈ#Ð(Nð O(Ø(;¸wÑ(GÈÐ'LÈDðRðñó
ˆð 	�‰�uÔñ % T°&ÀÔGˆØ�‰ŒØ�‰�G—L‘L¨ˆÔ/ä�'—,‘, Ó%ð 
	¨Ù §¡£
Ó+×2Ñ2°7Ó;ˆGð#ð $+ )ð ,ðˆDô �d˜C“ð  AØ—‘˜”÷÷
	ñ 	ˆw�|‰|Õùò; U÷6ð ú÷
	ð 
	ús*   ÆJ6É	8KÊJ;ÊKÊ;K	Ë KËKrÔ  ))é   é   N)r   r   r   rß   rä  rì  rò  r/  r#   r$   r%   r×  r×  Ò  s-   „ ò	5ò:óx	)ó@%ðF 9=ðEà	ôEr$   r×  )Gr.  rk  r   Ú	itertoolsrÏ  ÚloggingÚcollections.abcr   Útypingr   r   r   r   Útyping_extensionsr   r9   Útorch._Cr	   Útorch._C._autogradr
   Útorch._C._profilerr   r   r   r   r   r   Útorch._utilsr   Útorch.profilerr   ro   rQ   rÕ  rm  Ú	getLoggerr   rò   ÚEnumr   r!   r"   r   r   r   r   r    r  r™   rÝ  r/   r�  rð  Ú	dataclassr   r<   r   r‚   r†   rˆ   r�   r‘   rÎ   rè   r  r  r  rd  ro  r  r×  )rž   Úcs   00r%   ú<module>r@     sù  ðã Û Û Û Û Ý $ß -Ó -Ý %ã Ý #Ý .÷÷ õ 'Ý !ð �˜�Ñ€Ø�K Ð$Ñ%€à€g×Ñ˜Ó!€ô"ˆt�y‰yô "ð ×Ñ˜Ø×Ñ˜kØ‡N�N�GØ×Ñ˜Ø×Ñ˜Ø×Ñ�|Ø×Ñ˜kØˆ&ð	Ð ñ (1Ð1DÓ'E×F™t˜q !�a˜‘dÓFÐ ôˆT�Y‰Yô ð )/Ö/ 1�A�q—w‘w‘JÒ/Ð ð €×Ñ˜$¨E¸$Ô?÷ð ó @ðð ×Ñ÷(ð (ó ð(ð( €×Ñ˜$¨D¸Ô>ô.X�ó .Xó ?ð.Xðb'NØ
ð'Nàˆe�H˜YÑ'¨°)Ñ)<Ð<Ñ=Ñ>ó'NðT˜^ð °¸Ñ0Có ðØ
ðàˆe�H˜YÑ'¨Ð2Ñ3Ñ4óð�h˜~Ñ.ð °5¸ÀcÐ9IÑ3Jó ÷jñ j÷Z
"ñ 
"÷@!ñ @!ðF €×ÑÓ÷
$ð 
$ó ð
$÷[)ñ [)÷|g)ñ g)ðT ×Ñ÷Kð Kó ðKð ×Ñ÷
ð 
ó ð
÷>Bñ B÷J
Zò Zùó{ Gùò 0s   Ã1I+ÄI1