§
    Ë²ÅjÃ  ã                   ó†  — d dl Z d dlmZmZmZmZmZmZmZm	Z	 d dl
Z
d dlmZ d dlmZ d dlmZ ddgZde	e
j        ee         eed	f         eeef         f         d
ee
j                 fd„Z	 	 ddee         dee         deeeeef                           deeee	ee
j        f                                    d
ee         f
d„ZdS )é    N)ÚAnyÚcastÚDictÚListÚOptionalÚSequenceÚTupleÚUnion)ÚExceptionWrapper©Ú_get_device_index)ÚModuleÚ	get_a_varÚparallel_applyÚobj.Úreturnc                 óœ  — t          | t          j        ¦  «        r| S t          | t          t          f¦  «        r6t          t          | ¦  «        D ] }t          |t          j        ¦  «        r|c S Œ!t          | t          ¦  «        rHt          t          |                      ¦   «         ¦  «        D ] }t          |t          j        ¦  «        r|c S Œ!d S )N)	Ú
isinstanceÚtorchÚTensorÚlistÚtupleÚmapr   ÚdictÚitems)r   Úresults     úQC:\Projects\Historical\venv\Lib\site-packages\torch/nn/parallel/parallel_apply.pyr   r      sÈ   € õ �#•u”|Ñ$Ô$ð Øˆ
å�#��e�}Ñ%Ô%ð Ý�) SÑ)Ô)ð 	ð 	ˆFÝ˜&¥%¤,Ñ/Ô/ð Ø���ðå�#•tÑÔð Ý�) S§Y¢Y¡[¤[Ñ1Ô1ð 	ð 	ˆFÝ˜&¥%¤,Ñ/Ô/ð Ø���ðàˆ4ó    ÚmodulesÚinputsÚ
kwargs_tupÚdevicesc                 ó†  ‡
‡‡‡‡— t          | ¦  «        t          |¦  «        k    s*J dt          | ¦  «        › dt          |¦  «        › �¦   «         ‚|�#t          | ¦  «        t          |¦  «        k    sJ ‚n8t          t          t          t          f         i ¦  «        ft          | ¦  «        z  }|�#t          | ¦  «        t          |¦  «        k    sJ ‚ndgt          | ¦  «        z  }d„ |D ¦   «         }d„ |D ¦   «         }t          j        ¦   «         Ši Št          j        ¦   «         t          j	        ¦   «         cŠŠ	 	 ddt          dt          dt          d	t          t          t          f         d
t          t          t          t          j        f                  dt          t          j        j                 ddfˆˆˆˆfd„Š
t          | ¦  «        dk    r_ˆ
fd„t#          t%          | ||||¦  «        ¦  «        D ¦   «         }|D ]}|                     ¦   «          Œ|D ]}|                     ¦   «          Œn. ‰
d| d         |d         |d         |d         |d         ¦  «         g }t+          t          |¦  «        ¦  «        D ]H}‰|         }	t-          |	t.          ¦  «        r|	                     ¦   «          |                     |	¦  «         ŒI|S )a  Apply each `module` in :attr:`modules` in parallel on each of :attr:`devices`.

    Args:
        modules (Module): modules to be parallelized
        inputs (tensor): inputs to the modules
        devices (list of int or torch.device): CUDA devices

    :attr:`modules`, :attr:`inputs`, :attr:`kwargs_tup` (if given), and
    :attr:`devices` (if given) should all have same length. Moreover, each
    element of :attr:`inputs` can either be a single object as the only argument
    to a module, or a collection of positional arguments.
    zThe number of modules z& is not equal to the number of inputs Nc                 ó.   — g | ]}t          |d ¦  «        ‘ŒS )Tr   ©Ú.0Úxs     r   ú
<listcomp>z"parallel_apply.<locals>.<listcomp>;   s#   € Ð;Ð;Ð;¨aÕ   DÑ)Ô)Ð;Ð;Ð;r   c                 óL   — g | ]!}t           j                             |¦  «        ‘Œ"S © )r   ÚcudaÚcurrent_streamr%   s     r   r(   z"parallel_apply.<locals>.<listcomp><   s(   € Ð=Ð=Ð=°�uŒz×(Ò(¨Ñ+Ô+Ð=Ð=Ð=r   ÚiÚmoduleÚinputÚkwargsÚdeviceÚstreamr   c                 ó�  •— t          j        ‰	¦  «         |€Xt          |¦  «        }|€3‰
5  t          d| › d�¬¦  «        ‰| <   d d d ¦  «         n# 1 swxY w Y   d S |                     ¦   «         }|€t           j                             |¦  «        }	 t           j                             |¦  «        5  t           j                             |¦  «        5  t           j	         
                    d‰¬¦  «        5  t          |t          t          f¦  «        s|f} ||i |¤Ž}d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   ‰
5  |‰| <   d d d ¦  «         d S # 1 swxY w Y   d S # t          $ r9 ‰
5  t          d| › d|› �¬¦  «        ‰| <   d d d ¦  «         Y d S # 1 swxY w Y   Y d S w xY w)Nzin replica zQ, no device was provided and no tensor input was found; device cannot be resolved)Úwherer+   )Úenabledz on device )r   Úset_grad_enabledr   r   Ú
get_devicer+   r,   r1   r2   ÚampÚautocastr   r   r   Ú	Exception)r-   r.   r/   r0   r1   r2   ÚtÚoutputÚautocast_enabledÚgrad_enabledÚlockÚresultss           €€€€r   Ú_workerzparallel_apply.<locals>._workerD   s–  ø€ õ 	Ô˜|Ñ,Ô,Ð,Øˆ>Ý˜%Ñ Ô ˆAØˆyØð ð Ý!1ð4¨Að 4ð 4ð 4ð"ñ "ô "�G˜A‘Jðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð
 �Ø—\’\‘^”^ˆFØˆ>Ý”Z×.Ò.¨vÑ6Ô6ˆFð	Ý”×"Ò" 6Ñ*Ô*ð 2ð 2­E¬J×,=Ò,=Øñ-ô -ð 2ð 2åŒy×!Ò! &Ð2BÐ!ÑCÔCð2ð 2õ " %­$µ¨Ñ7Ô7ð %Ø"˜H�EØ˜ Ð1¨&Ð1Ð1�ð2ð 2ð 2ñ 2ô 2ð 2ð 2ð 2ð 2ð 2ð 2øøøð 2ð 2ð 2ð 2ð 2ð 2ð 2ñ 2ô 2ð 2ð 2ð 2ð 2ð 2ð 2øøøð 2ð 2ð 2ð 2ð 2ð 2ð 2ñ 2ô 2ð 2ð 2ð 2ð 2ð 2ð 2øøøð 2ð 2ð 2ð 2ð ð $ð $Ø#�˜‘
ð$ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $ð $ð $øåð 	ð 	ð 	Øð ð Ý-Ø>¨Ð>Ð>°fÐ>Ð>ðñ ô �˜‘
ðð ð ñ ô ð ð ð ð ð ð ð ð øøøð ð ð ð ð ð ð ð	øøøs×   «AÁAÁAÂF Â1 EÃ"D>Ã3(D'ÄD>Ä'D+Ä+D>Ä.D+Ä/D>Ä2EÄ>E	ÅEÅE	ÅEÅ	F ÅEÅF ÅEÅF Å"E5Å(F Å5E9Å9F Å<E9Å=F ÆGÆF6Æ(GÆ6F:	Æ:GÆ=F:	Æ>GÇGé   c                 óZ   •— g | ]'\  }\  }}}}}t          j        ‰||||||f¬ ¦  «        ‘Œ(S ))ÚtargetÚargs)Ú	threadingÚThread)r&   r-   r.   r/   r0   r1   r2   rA   s          €r   r(   z"parallel_apply.<locals>.<listcomp>j   s^   ø€ ð 
ð 
ð 
ñ ;�Ñ:�F˜E 6¨6°6õ ÔØ a¨°¸ÀÈÐ%Oðñ ô ð
ð 
ð 
r   r   ©NN)Úlenr   r   Ústrr   rF   ÚLockr   Úis_grad_enabledÚis_autocast_enabledÚintr   r   r
   r1   r+   ÚStreamÚ	enumerateÚzipÚstartÚjoinÚranger   r   ÚreraiseÚappend)r   r    r!   r"   ÚstreamsÚthreadsÚthreadÚoutputsr-   r<   rA   r=   r>   r?   r@   s             @@@@@r   r   r      s  øøøøø€ õ$ ˆw‰<Œ<�3Øñô ò ð ð àa¥ G¡¤ÐaÐaÕTWÐX^ÑT_ÔT_ÐaÐañô ð ð ÐÝ�7‰|Œ|�s :™œÒ.Ð.Ð.Ð.Ð.å�4¥¥S œ>¨2Ñ.Ô.Ð0µ3°w±<´<Ñ?ˆ
ØÐÝ�7‰|Œ|�s 7™|œ|Ò+Ð+Ð+Ð+Ð+à�&�3˜w™<œ<Ñ'ˆØ;Ð;°7Ð;Ñ;Ô;€GØ=Ð=°WÐ=Ñ=Ô=€GÝŒ>ÑÔ€DØ€GåÔÑÔÝÔ!Ñ#Ô#ð #€LÐ"ð 6:Ø.2ð#ð #Ýð#åð#õ ð#õ •S�#�X”ð	#õ
 ��s¥E¤LÐ0Ô1Ô2ð#õ �œÔ*Ô+ð#ð 
ð#ð #ð #ð #ð #ð #ð #ð #ð #õJ ˆ7�|„|�aÒÐð
ð 
ð 
ð 
õ ?HÝ�G˜V Z°¸'ÑBÔBñ?ô ?ð	
ñ 
ô 
ˆð ð 	ð 	ˆFØ�LŠL‰NŒNˆNˆNØð 	ð 	ˆFØ�KŠK‰MŒMˆMˆMð	ð 	ˆ��7˜1”:˜v aœy¨*°Q¬-¸À¼ÀWÈQÄZÑPÔPÐPà€GÝ•3�v‘;”;ÑÔð ð ˆØ˜”ˆÝ�fÕ.Ñ/Ô/ð 	Ø�NŠNÑÔÐØ�Š�vÑÔÐÐØ€Nr   rH   )rF   Útypingr   r   r   r   r   r   r	   r
   r   Útorch._utilsr   Útorch.cuda._utilsr   Útorch.nn.modulesr   Ú__all__r   r   rJ   rN   r1   r   r*   r   r   ú<module>r`      s‡  ðØ Ð Ð Ð Ø JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ Jà €€€Ø )Ð )Ð )Ð )Ð )Ð )Ø /Ð /Ð /Ð /Ð /Ð /Ø #Ð #Ð #Ð #Ð #Ð #ð Ð(Ð
)€ðØ	ˆuŒ|˜T #œY¨¨c°3¨h¬¸¸cÀ3¸h¼ÐGÔ	HðàˆeŒlÔðð ð ð ð( 6:ØFJð	bð bØ�fÔðbà�SŒMðbð ˜ $ s¨C x¤.Ô1Ô2ðbð �h˜x¨¨c°5´<Ð.?Ô(@ÔAÔBÔCð	bð
 
ˆ#„Yðbð bð bð bð bð br   