ó
    EñiQ  ã                   ó.  • S SK Jr  S SKrSSKJrJr  \\\\R                  4   r
S/rS\
S\R                  4S jrS	\\
\
4   S\\R                  \R                  4   4S
 jrS\\
   S\\R                     4S jr\(       a  S SKJr  O\r " S S\5      rg)é    )ÚUnionNé   )Ú_is_tensorpipe_availableÚ	constantsÚTensorPipeRpcBackendOptionsÚdeviceÚreturnc                 ó„   • [         R                  " U 5      n U R                  S:w  a  [        SU R                   S35      eU $ )NÚcudazA`set_devices` expect a list of CUDA devices, but got device type Ú.)Útorchr   ÚtypeÚ
ValueError)r   s    ÚZ/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/distributed/rpc/options.pyÚ
_to_devicer      sE   € Ü�\Š\˜&Ó!€FØ‡{�{�fÓÜðØ!Ÿ;™;˜- qð*ó
ð 	
ð €Mó    Ú
device_mapc           	      óÜ   • 0 n0 nU R                  5        HS  u  p4[        R                  " U5      [        R                  " U5      pCXB;   a  [        SU SX$    SU 35      eXAU'   X2U'   MU     U$ )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Ø× Ñ Ö"‰ˆÜ�|Š|˜A‹¤§¢¨Q£ˆ1ØÓÜð!Ø!"  5¨©Ð(8¸¸Q¸CðAóð ð ˜ÑØ�A‹ñ #ð Ðr   Údevicesc                 ó4   • [        [        [        U 5      5      $ ©N)ÚlistÚmapr   ©r   s    r   Ú_to_device_listr#   )   s   € Ü””J Ó(Ó)Ð)r   )Ú _TensorPipeRpcBackendOptionsBasec                   ó  ^ • \ rS rSrSr\R                  \R                  \R                  SSSSS.S\	S\
S\S\\\\\4   4   S-  S	\\   S-  S
\S-  S\S-  4U 4S jjjrS\S\\\4   4U 4S jjrS	\\   4S jrSrU =r$ )r   é4   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          	      óÄ   >• Uc  0 O.UR                  5        VV	s0 s H  u  p‰U[        U	5      _M     sn	nn
Uc  / O
[        U5      n[        TU ]  UUUUUU
U5        g s  sn	nf 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/   Ú$TensorPipeRpcBackendOptions.__init__V   sy   ø€ ð Ñ"ñ à3>×3DÑ3DÔ3FÔGÒ3F©4¨1�!”^ AÓ&Ò&Ñ3FÒGð 	ð
 ")¡™2´oÀgÓ6NÐÜ‰ÑØØØØØØØõ	
ùó Hs   šAÚtor   c           
      óæ   >• [        U5      n[        TU ]  nX;   aG  UR                  5        H3  u  pVXTU   ;   d  M  XdU   U   :w  d  M  [	        SU SU SXA   U    35      e   [        TU ]  X5        g)aè  
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)r0   r5   r   r   Úcurr_device_mapsr   r   r3   s          €r   Úset_device_mapÚ*TensorPipeRpcBackendOptions.set_device_mapq   s’   ø€ ôZ )¨Ó4ˆÜ ™7Ñ.ÐàÓ!Ø'×-Ñ-Ö/‘�Ø¨Ñ,Õ,°ÀrÑ6JÈ1Ñ6MÕ1MÜ$ð#Ø#$ # T¨!¨¨EÐ2BÑ2FÀqÑ2IÐ1JðLóð ñ 0ô 	‰Ñ Õ4r   c                 ó$   • [        U5      U l        g)a*  
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   )r0   r   s     r   Úset_devicesÚ'TensorPipeRpcBackendOptions.set_devices«   s   € ô ' wÓ/ˆ�r   r"   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Úrpc_contantsÚDEFAULT_NUM_WORKER_THREADSÚDEFAULT_RPC_TIMEOUT_SECÚDEFAULT_INIT_METHODÚintÚfloatÚstrÚdictÚ
DeviceTyper    r/   r9   r<   Ú__static_attributes__Ú__classcell__)r3   s   @r   r   r   4   sá   ø† ñðH #/×"IÑ"IØ)×AÑAØ'×;Ñ;ØFJØ+/Ø#'Ø!%ò
ð  ð
ð ð	
ð
 ð
ð ˜#˜t J°
Ð$:Ñ;Ð;Ñ<¸tÑCð
ð �jÑ! DÑ(ð
ð ˜D‘[ð
ð ˜$‘;÷
ð 
ð685 ð 85°$°zÀ:Ð7MÑ2N÷ 85ðt
0 4¨
Ñ#3÷ 
0ò 
0r   )Útypingr   r   Ú r   r   rC   rG   rI   r   rK   Ú__all__r   rJ   r   r    r#   Útorch._C._distributed_rpcr$   Úobjectr   © r   r   Ú<module>rT      s³   ðå ã ç Að �3˜˜UŸ\™\Ð)Ñ*€
à(Ð
)€ð�zð  e§l¡lô ðØ�Z Ð+Ñ,ðà	ˆ%�,‰,˜Ÿ™Ð
$Ñ%ôð"*˜T *Ñ-ð *°$°u·|±|Ñ2Dô *ö ÞJà'-Ð$ôA0Ð"Bõ A0r   