Ë
    g^(h’  ã                   ó  — d dl mZmZ d dlZd dlmZ ddlmZ ee	e
ej                  f   ZdgZdedej                  fd	„Zd
eeef   deej                  ej                  f   fd„Zdee   deej                     fd„Z G d„ de«      Zy)é    )ÚOptionalÚUnionN)Ú _TensorPipeRpcBackendOptionsBaseé   )Ú	constantsÚTensorPipeRpcBackendOptionsÚdeviceÚreturnc                 ó€   — t        j                  | «      } | j                  dk7  rt        d| j                  › d�«      ‚| S )NÚcudazA`set_devices` expect a list of CUDA devices, but got device type ú.)Útorchr	   ÚtypeÚ
ValueError)r	   s    ú[/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/distributed/rpc/options.pyÚ
_to_devicer      sE   € Ü�\‰\˜&Ó!€FØ‡{�{�fÒÜðØ!Ÿ;™;˜- qð*ó
ð 	
ð €Mó    Ú
device_mapc           	      óÜ   — i }i }| j                  «       D ]T  \  }}t        j                  |«      t        j                  |«      }}||v rt        d|› d||   › d|› �«      ‚|||<   |||<   ŒV |S )Nz9`device_map` only supports 1-to-1 mapping, trying to map ú and ú to )Úitemsr   r	   r   )r   Úfull_device_mapÚreverse_mapÚkÚvs        r   Ú_to_device_mapr      s–   € ð 9;€OØ46€KØ× Ñ Ó"ò ‰ˆˆ1Ü�|‰|˜A‹¤§¡¨Q£ˆ1ˆØ�ÑÜð!Ø!"  5¨°Q©Ð(8¸¸Q¸CðAóð ð ˆ˜ÑØˆ�AŠðð Ðr   Údevicesc                 ó4   — t        t        t        | «      «      S ©N)ÚlistÚmapr   )r   s    r   Ú_to_device_listr#   *   s   € Ü””J Ó(Ó)Ð)r   c                   óð   ‡ — e Zd ZdZej
                  ej                  ej                  dddddœdede	de
deee
eeef   f      deee      d	ee   d
ee   fˆ fd„Zde
deeef   fˆ fd„Zdee   fd„Zˆ xZS )r   a'  
    The backend options for
    :class:`~torch.distributed.rpc.TensorPipeAgent`, derived from
    :class:`~torch.distributed.rpc.RpcBackendOptions`.

    Args:
        num_worker_threads (int, optional): The number of threads in the
            thread-pool used by
            :class:`~torch.distributed.rpc.TensorPipeAgent` to execute
            requests (default: 16).
        rpc_timeout (float, optional): The default timeout, in seconds,
            for RPC requests (default: 60 seconds). If the RPC has not
            completed in this timeframe, an exception indicating so will
            be raised. Callers can override this timeout for individual
            RPCs in :meth:`~torch.distributed.rpc.rpc_sync` and
            :meth:`~torch.distributed.rpc.rpc_async` if necessary.
        init_method (str, optional): The URL to initialize the distributed
            store used for rendezvous. It takes any value accepted for the
            same argument of :meth:`~torch.distributed.init_process_group`
            (default: ``env://``).
        device_maps (Dict[str, Dict], optional): Device placement mappings from
            this worker to the callee. Key is the callee worker name and value
            the dictionary (``Dict`` of ``int``, ``str``, or ``torch.device``)
            that maps this worker's devices to the callee worker's devices.
            (default: ``None``)
        devices (List[int, str, or ``torch.device``], optional): all local
            CUDA devices used by RPC agent. By Default, it will be initialized
            to all local devices from its own ``device_maps`` and corresponding
            devices from its peers' ``device_maps``. When processing CUDA RPC
            requests, the agent will properly synchronize CUDA streams for
            all devices in this ``List``.
    N)Únum_worker_threadsÚrpc_timeoutÚinit_methodÚdevice_mapsr   Ú_transportsÚ	_channelsr%   r&   r'   r(   r   r)   r*   c          	      ó¼   •— |€i n,|j                  «       D ��	ci c]  \  }}	|t        |	«      “Œ c}	}}
|€g n
t        |«      }t        ‰| �  ||||||
|«       y c c}	}w r    )r   r   r#   ÚsuperÚ__init__)Úselfr%   r&   r'   r(   r   r)   r*   r   r   Úfull_device_mapsÚfull_device_listÚ	__class__s               €r   r-   z$TensorPipeRpcBackendOptions.__init__P   su   ø€ ð Ð"ñ à3>×3DÑ3DÓ3F×G©4¨1¨a�!”^ AÓ&Ñ&ÓGð 	ð
 ") ™2´oÀgÓ6NÐÜ‰ÑØØØØØØØõ	
ùó Hs   ™AÚtor   c           
      óâ   •— t        |«      }t        ‰| �  }||v rE|j                  «       D ]2  \  }}|||   v sŒ|||   |   k7  sŒt	        d|› d|› d||   |   › �«      ‚ t        ‰| �  ||«       y)a0  
        Set device mapping between each RPC caller and callee pair. This
        function can be called multiple times to incrementally add
        device placement configurations.

        Args:
            to (str): Callee name.
            device_map (Dict of int, str, or torch.device): Device placement
                mappings from this worker to the callee. This map must be
                invertible.

        Example:
            >>> # xdoctest: +SKIP("distributed")
            >>> # both workers
            >>> def add(x, y):
            >>>     print(x)  # tensor([1., 1.], device='cuda:1')
            >>>     return x + y, (x + y).to(2)
            >>>
            >>> # on worker 0
            >>> options = TensorPipeRpcBackendOptions(
            >>>     num_worker_threads=8,
            >>>     device_maps={"worker1": {0: 1}}
            >>> # maps worker0's cuda:0 to worker1's cuda:1
            >>> )
            >>> options.set_device_map("worker1", {1: 2})
            >>> # maps worker0's cuda:1 to worker1's cuda:2
            >>>
            >>> rpc.init_rpc(
            >>>     "worker0",
            >>>     rank=0,
            >>>     world_size=2,
            >>>     backend=rpc.BackendType.TENSORPIPE,
            >>>     rpc_backend_options=options
            >>> )
            >>>
            >>> x = torch.ones(2)
            >>> rets = rpc.rpc_sync("worker1", add, args=(x.to(0), 1))
            >>> # The first argument will be moved to cuda:1 on worker1. When
            >>> # sending the return value back, it will follow the invert of
            >>> # the device map, and hence will be moved back to cuda:0 and
            >>> # cuda:1 on worker0
            >>> print(rets[0])  # tensor([2., 2.], device='cuda:0')
            >>> print(rets[1])  # tensor([2., 2.], device='cuda:1')
        z=`set_device_map` only supports 1-to-1 mapping, trying to map r   r   N)r   r,   r(   r   r   Ú_set_device_map)r.   r2   r   r   Úcurr_device_mapsr   r   r1   s          €r   Úset_device_mapz*TensorPipeRpcBackendOptions.set_device_mapk   s¦   ø€ ôZ )¨Ó4ˆÜ ™7Ñ.ÐàÐ!Ñ!Ø'×-Ñ-Ó/ò ‘��1ØÐ(¨Ñ,Ò,°Ð6FÀrÑ6JÈ1Ñ6MÓ1MÜ$ð#Ø#$ # T¨!¨¨EÐ2BÀ2Ñ2FÀqÑ2IÐ1JðLóð ðô 	‰Ñ  OÕ4r   c                 ó$   — t        |«      | _        y)ab  
        Set local devices used by the TensorPipe RPC agent. When processing
        CUDA RPC requests, the TensorPipe RPC agent will properly synchronize
        CUDA streams for all devices in this ``List``.

        Args:
            devices (List of int, str, or torch.device): local devices used by
                the TensorPipe RPC agent.
        N)r#   r   )r.   r   s     r   Úset_devicesz'TensorPipeRpcBackendOptions.set_devices¥   s   € ô ' wÓ/ˆ�r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úrpc_contantsÚDEFAULT_NUM_WORKER_THREADSÚDEFAULT_RPC_TIMEOUT_SECÚDEFAULT_INIT_METHODÚintÚfloatÚstrr   ÚdictÚ
DeviceTyper!   r-   r6   r8   Ú__classcell__)r1   s   @r   r   r   .   s×   ø„ ñðH #/×"IÑ"IØ)×AÑAØ'×;Ñ;ØIMØ.2Ø&*Ø$(ò
ð  ð
ð ð	
ð
 ð
ð ˜d 3¨¨Z¸Ð-CÑ(DÐ#DÑEÑFð
ð ˜$˜zÑ*Ñ+ð
ð ˜d‘^ð
ð ˜D‘>õ
ð685 ð 85°$°zÀ:Ð7MÑ2Nõ 85ðt
0 4¨
Ñ#3÷ 
0r   )Útypingr   r   r   Útorch._C._distributed_rpcr   Ú r   r=   rA   rC   r	   rE   Ú__all__r   rD   r   r!   r#   r   © r   r   ú<module>rL      s¨   ðç "ã Ý Få 'ð �3˜˜UŸ\™\Ð)Ñ*€
à(Ð
)€ð�zð  e§l¡ló ðØ�Z Ð+Ñ,ðà	ˆ%�,‰,˜Ÿ™Ð
$Ñ%óð"*˜T *Ñ-ð *°$°u·|±|Ñ2Dó *ôA0Ð"Bõ A0r   