§
    ÎÐj†  ã                   ó   — d Z ddlZ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
 ej                             ej        ¦  «        Zd„ Z G d„ de¦  «        Zd„ Zej        d	„ ¦   «         Zej        dd„¦   «         Zd„ ZdS )aÍ  Torch default device policy for a model's generate() call.

mmgp installs torch.set_default_device("cuda") when it loads a pipeline, so tensors created without an explicit device
land on the GPU. That default is a TorchFunctionMode: every torch call made by the thread goes through Python first,
which costs a measurable share of host time in host-bound phases. Models whose model definition declares
"device_explicit": True create every tensor with an explicit device and run their generate() without any default device.

WANGP_AUDIT_DEFAULT_DEVICE=<log path> keeps the current default and appends, for each generate() call, every
factory call that relied on it (file:line, calling function, torch function, count).
é    N)ÚTorchFunctionMode)Ú_device_constructorsc                 ó.   — |                       dd¦  «        S )NÚdevice_explicitF)Úget)Ú	model_defs    úCC:\Users\johnn\OneDrive\Documents\AI\shared\utils\default_device.pyr   r      s   € Ø�=Š=Ð*¨EÑ2Ô2Ð2ó    c                   ó&   ‡ — e Zd Zˆ fd„Zdd„Zˆ xZS )Ú_DefaultDeviceAuditc                 óx   •— t          ¦   «                              ¦   «          t          j        ¦   «         | _        d S ©N)ÚsuperÚ__init__ÚcollectionsÚCounterÚsites)ÚselfÚ	__class__s    €r	   r   z_DefaultDeviceAudit.__init__   s-   ø€ Ý‰Œ×ÒÑÔÐÝ Ô(Ñ*Ô*ˆŒ
ˆ
ˆ
r
   © Nc                 ó&  — |pi }|                      d¦  «        €ñ|t          ¦   «         v rát          j        d¦  «        }|�{|j        j                             t          ¦  «        s|j        j        t          k    rB|j	        }|�9|j        j                             t          ¦  «        °-|j        j        t          k    °B|�N| j
        |j        j        |j        |j        j        t          |dt          |¦  «        ¦  «        fxx         dz  cc<    ||i |¤ŽS )NÚdeviceé   Ú__name__)r   r   ÚsysÚ	_getframeÚf_codeÚco_filenameÚ
startswithÚ
_TORCH_DIRÚ__file__Úf_backr   Úf_linenoÚco_nameÚgetattrÚstr)r   ÚfuncÚtypesÚargsÚkwargsÚframes         r	   Ú__torch_function__z&_DefaultDeviceAudit.__torch_function__"   sJ  € Ø�˜2ˆØ�:Š:�hÑÔÐ'¨DÕ4HÑ4JÔ4JÐ,JÐ,JÝ”M !Ñ$Ô$ˆEØÐ#¨¬Ô)A×)LÒ)LÍZÑ)XÔ)XÐ#Ð\aÔ\hÔ\tõ  yAò  ]Að  ]AØœ�ð Ð#¨¬Ô)A×)LÒ)LÍZÑ)XÔ)XÐ#Ð\aÔ\hÔ\tõ  yAò  ]Að  ]AàÐ Ø”
˜EœLÔ4°e´nÀeÄlÔFZÕ\cÐdhÐjtÕvyÐz~ÑvÔvñ  ]Aô  ]Að  Bð  Cð  Cô  Cð  GHñ  Hð  Cð  Cñ  CØˆt�TÐ$˜VÐ$Ð$Ð$r
   )r   N)r   Ú
__module__Ú__qualname__r   r,   Ú__classcell__)r   s   @r	   r   r      sL   ø€ € € € € ð+ð +ð +ð +ð +ð%ð %ð %ð %ð %ð %ð %ð %r
   r   c                 ó‚  — dt          j        d¦  «        › d|› dt          | ¦  «        › d�g}|d„ |                      ¦   «         D ¦   «         z  }t	          |dd¬	¦  «        5 }|                     d
                     |¦  «        d
z   ¦  «         d d d ¦  «         n# 1 swxY w Y   t          |d         d|› d�z   ¦  «         d S )Nz== z%Y-%m-%d %H:%M:%Sú z: z( call sites relied on the default devicec                 óB   — g | ]\  \  }}}}}|d ›d|› d|› d|› d|› d�
‘ŒS )Ú8dz  ú:r1   z [ú]r   )Ú.0ÚfileÚlineÚfunctionr'   Úcounts         r	   ú
<listcomp>z _write_audit.<locals>.<listcomp>/   sU   € Ð~Ð~Ð~ÑCfÑC_ÀDÈ$ÐPXÐZ^Ðaf�Ð>Ð>Ð>˜TÐ>Ð> DÐ>Ð>¨8Ð>Ð>°tÐ>Ð>Ð>Ð~Ð~Ð~r
   Úazutf-8)Úencodingú
r   z (details in ú))ÚtimeÚstrftimeÚlenÚmost_commonÚopenÚwriteÚjoinÚprint)r   ÚlabelÚpathÚlinesÚhandles        r	   Ú_write_auditrL   -   s  € Øu•4”=Ð!4Ñ5Ô5ÐuÐu¸ÐuÐuÅÀUÁÄÐuÐuÐuÐv€EØ	Ð~Ð~Ðjo×j{Òj{Ñj}Ôj}Ð~Ñ~Ô~Ñ~€EÝ	ˆd�C 'Ð	*Ñ	*Ô	*ð .¨fØ�Š�T—Y’Y˜uÑ%Ô%¨Ñ,Ñ-Ô-Ð-ð.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .å	ˆ%�Œ(Ð, TÐ,Ð,Ð,Ñ
,Ñ-Ô-Ð-Ð-Ð-s   Á ,BÂBÂBc               #   óÈ   K  — t          t          j        dd¦  «        } 	 dV — t          j        | €dn| j        ¦  «         dS # t          j        | €dn| j        ¦  «         w xY w)z¡Restores the thread's default device on exit, e.g. around an mmgp offload.profile() call made during generate(): it
    leaves the CUDA default device installed.Údevice_contextN)r%   ÚtorchÚ_GLOBAL_DEVICE_CONTEXTÚset_default_devicer   )Úcontexts    r	   Úkeep_default_devicerS   5   sn   è è € õ •eÔ2Ð4DÀdÑKÔK€GðNØˆˆˆåÔ ¨¨  ¸g¼nÑMÔMÐMÐMÐMø�Ô ¨¨  ¸g¼nÑMÔMÐMÐMøøøs   ŸA ÁA!Ú c              #   ó¸  K  — t           j                             dd¦  «        }|rat          ¦   «         }	 |5  d V — d d d ¦  «         n# 1 swxY w Y   t	          |j        ||¦  «         n# t	          |j        ||¦  «         w xY wd S t          | ¦  «        sd V — d S t          ¦   «         5  t          j	        d ¦  «         d V — d d d ¦  «         d S # 1 swxY w Y   d S )NÚWANGP_AUDIT_DEFAULT_DEVICErT   )
ÚosÚenvironr   r   rL   r   r   rS   rO   rQ   )r   rH   Ú
audit_pathÚmodes       r	   Úgeneration_default_devicer[   @   sx  è è € å”—’Ð <¸bÑAÔA€JØð Ý"Ñ$Ô$ˆð	8Øð ð Ø���ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ ˜œ U¨JÑ7Ô7Ð7Ð7ø�L˜œ U¨JÑ7Ô7Ð7Ð7øøøØˆÝ˜9Ñ%Ô%ð ØˆˆˆØˆÝ	Ñ	Ô	ð ð ÝÔ  Ñ&Ô&Ð&Øˆˆˆðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s?   ´A) ¶A»A) ÁAÁA) ÁAÁA) Á)BÂ)CÃCÃCc                 óf   — t          | |¦  «        5   ||i |¤Žcd d d ¦  «         S # 1 swxY w Y   d S r   )r[   )r   rH   Úfnr)   r*   s        r	   Úcall_with_default_devicer^   S   sˆ   € Ý	" 9¨eÑ	4Ô	4ð #ð #Øˆr�4Ð"˜6Ð"Ð"ð#ð #ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #ð #ð #s   ‘&¦*­*)rT   )Ú__doc__r   Ú
contextlibrW   r   r@   rO   Útorch.overridesr   Útorch.utils._devicer   rI   Údirnamer!   r    r   r   rL   ÚcontextmanagerrS   r[   r^   r   r
   r	   ú<module>re      s.  ðð	ð 	ð Ð Ð Ð Ø Ð Ð Ð Ø 	€	€	€	Ø 
€
€
€
Ø €€€à €€€Ø -Ð -Ð -Ð -Ð -Ð -Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4àŒW�_Š_˜Uœ^Ñ,Ô,€
ð3ð 3ð 3ð%ð %ð %ð %ð %Ð+ñ %ô %ð %ð .ð .ð .ð ÔðNð Nñ ÔðNð Ôðð ð ñ Ôðð$#ð #ð #ð #ð #r
   