
    קg                        d dl mZmZ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dS )    )DictListOptionalUnionN) _TensorPipeRpcBackendOptionsBase   )	constantsTensorPipeRpcBackendOptionsdevicereturnc                 t    t          j        |           } | j        dk    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    Y/var/www/html/ai-engine/env/lib/python3.11/site-packages/torch/distributed/rpc/options.py
_to_devicer      sP    \&!!F{f*!;* * *
 
 	
 M    
device_mapc           	          i }i }|                                  D ]Y\  }}t          j        |          t          j        |          }}||v rt          d| d||          d|           |||<   |||<   Z|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;O46K  ""  1|AQ1A!"A A)4QA A=>A A   Ar   devicesc                 F    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d |                                 D             }|g nt          |          }	t                                          |||||||	           d S )Nc                 4    i | ]\  }}|t          |          S  )r   ).0r   r   s      r   
<dictcomp>z8TensorPipeRpcBackendOptions.__init__.<locals>.<dictcomp>^   s&    GGG41a!^A&&GGGr   )r   r$   super__init__)selfr&   r'   r(   r)   r    r*   r+   full_device_mapsfull_device_list	__class__s             r   r2   z$TensorPipeRpcBackendOptions.__init__P   s     " BGG;3D3D3F3FGGG 	
 ")22og6N6N	
 	
 	
 	
 	
r   tor   c           
      L   t          |          }t                      j        }||v rZ|                                D ]E\  }}|||         v r6|||         |         k    r$t	          d| d| d||         |                    Ft                                          ||           dS )a4  
        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   r1   r)   r   r   _set_device_map)r3   r7   r   r   curr_device_mapsr   r   r6   s          r   set_device_mapz*TensorPipeRpcBackendOptions.set_device_mapk   s    Z )44 77.!!!'--//  1(,,,6Fr6J16M1M1M$L#$L L*+L L2B22Fq2IL L  
 	O44444r   c                 .    t          |          | _        dS )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    )r3   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   r   
DeviceTyper   r2   r;   r=   __classcell__)r6   s   @r   r
   r
   .   s:        H #/"I)A';IM.2&*$(
 
 
  
 	

 
 d3Z-C(D#DEF
 $z*+
 d^
 D>
 
 
 
 
 
685 85$z:7M2N 85 85 85 85 85 85t
04
#3 
0 
0 
0 
0 
0 
0 
0 
0r   )typingr   r   r   r   r   torch._C._distributed_rpcr    r	   rB   rF   rH   r   rI   __all__r   r   r$   r
   r.   r   r   <module>rO      s@   . . . . . . . . . . . .  F F F F F F ' ' ' ' ' ' 3U\)*
(
)z el    Z+,	%,
$%   "*T*- *$u|2D * * * *A0 A0 A0 A0 A0"B A0 A0 A0 A0 A0r   