
    sg?                        d dl Z d dlZd dlmZmZmZmZmZ d dlZd dl	m
Z ddlmZmZ ddlmZmZ g dZ e j(                  ddd	g      Zd
 ZdZ ej0                  di       aet2        _        t2        j6                  ret2        _        d Zd Zej<                  ej>                  fdZ d Z!d Z"ejF                  ddfdZ$d Z%d Z&	 ddZ'd Z(d Z)d Z*d Z+d Z, ede$e,       y)    N)castDictListSetTuple   )api	constants)_group_membership_management_update_group_membership)backend_registeredregister_backendconstruct_rpc_backend_optionsinit_backendBackendValueBackendTyper   %construct_rpc_backend_options_handlerinit_backend_handlerc                      d| j                   z   S )NzBackendType.)name)selfs    Y/var/www/html/venv/lib/python3.12/site-packages/torch/distributed/rpc/backend_registry.py_backend_type_reprr      s    DII%%    z
    An enum class of available backends.

    PyTorch ships with a builtin ``BackendType.TENSORPIPE`` backend.
    Additional ones can be registered using the
    :func:`~torch.distributed.rpc.backend_registry.register_backend` function.
r   valuenamesc                 B    | t         j                  j                         v S )z
    Checks if backend_name is registered as an RPC backend.

    Args:
        backend_name (str): string to identify the RPC backend.
    Returns:
        True if the backend has been registered with ``register_backend``, else
        False.
    )r   __members__keys)backend_names    r   r   r   3   s     ;2277999r   c                 ^   t        |       rt        d|  d      t        D ci c]  }|j                  |j                   }}t        | t        ||      ifi |}t        j                  d|      at        t        _
        t        j                  rt        t        _        t        |    S c c}w )a  Registers a new RPC backend.

    Args:
        backend_name (str): backend string to identify the handler.
        construct_rpc_backend_options_handler (function):
            Handler that is invoked when
            rpc_backend.construct_rpc_backend_options(**dict) is called.
        init_backend_handler (function): Handler that is invoked when the
            `_init_rpc_backend()` function is called with a backend.
             This returns the agent.
    zRPC backend z: already registered)r   r   r   r   )r   RuntimeErrorr   r   r   dictr   enumEnumr   __repr____doc___backend_type_doc)r!   r   r   memberexisting_enum_dictextended_enum_dicts         r   r   r   @   s     ,'\,7KLMMBMN&++v||3NN,6[%9	
  ))-7IJK-K/|$$! Os   B*c                 >     | j                   j                  ||fi |S N)r   r   )backendrpc_timeoutinit_methodkwargss       r   r   r   e   s*     ?7==>>[$* r   c                 :     | j                   j                  |i |S r.   )r   r   )r/   argsr2   s      r   r   r   p   s    -7==--t>v>>r   c                 D   t         j                  }t        j                  | |||      }|J d       |dk7  r2||j	                         k7  rt        d| d|j	                                |dk7  r2||j                         k7  rt        d| d|j                                |S )Nz*Failed to initialize default ProcessGroup.zrank argument z doesn't match pg rank zworld_size argument z doesn't match pg size )rpc_constantsDEFAULT_PROCESS_GROUP_TIMEOUTdistProcessGroupGloorankr#   size)storer;   
world_sizeprocess_group_timeoutgroups        r   _init_process_grouprA   t   s    )GG !!%z;PQEJJJ
-^D61HWXXbzUZZ\9":,.Eejjl^T
 	
 Lr   c                 (    ddl m}  || ||||      S )Nr   )TensorPipeRpcBackendOptions)r0   r1   num_worker_threads_transports	_channels) rC   )r0   r1   rD   rE   rF   r2   rC   s          r   1_tensorpipe_construct_rpc_backend_options_handlerrH      s#     .&- r   c                 ,    t        fd| D              S )Nc              3      K   | ]@  }|j                   d k(  xs+ |j                   dk(  xr d|j                  cxk  xr k  nc  B yw)cpucudar   N)typeindex).0ddevice_counts     r   	<genexpr>z/_tensorpipe_validate_devices.<locals>.<genexpr>   sE       	
%MAFFf,Lagg1L1LMs   AA	)all)devicesrQ   s    `r   _tensorpipe_validate_devicesrU      s       r   c           	         t        |j                               D cg c]  }ddi g f
 c}}t        j                  || |||f|       |D cg c]	  \  }}}}| }}}|D 	ci c]
  \  }}	}}||	 }
}	}}|D ci c]
  \  }}}}|| }}}}|D ci c]
  \  }}}}|| }}}}t	        ||
||       t        | ||      }t        |||      }||fS c c}w c c}}w c c}}	}w c c}}}w c c}}}w )NrG   r   )ranger<   r9   all_gather_object_validate_device_maps_create_reverse_mapping_create_device_list)my_namemy_device_countmy_device_maps
my_devicesr@   _gatheredr   	all_namescountall_device_countsmap_all_device_mapsrT   all_devicesreverse_device_mapss                   r   ._tensorpipe_exchange_and_check_all_device_mapsri      s   
 #(

"56Q"aR6  	7O^ZH% ,44-$1a4I4>FGG):uauGG:BCC&6dAtQtTzCOC<DEE%8T1a4=EKE)%6U 2'9oV$ZATUJ
** 	7 5GCEs   CC#C<C&C-c                 l   | D ]^  }||   }t        t        |            t        |      k7  rt        d| d|       t        |||         rIt        d| d| d||           | D ]  }|rPt        ||   j	                               j                  |       s%t        d| d||   j	                          d|        ||   j                         D ]_  \  }}	t        t        |	j                                     t        |	      k7  rt        d| d| d|	       ||   rEt        |	j	                               j                  ||         sQt        d| d	| d|	 d
||          t        |	j	                         ||         st        d| d| d|	 d||          |j                  |g       rGt        |	j                               j                  ||         r	t        d| d| d|	 d
||          ||v s)t        |	j                         ||         rHt        d| d| d|	 d||            y )NzNode z" has duplicated devices
devices = z, has devices with invalid indices
devices = z
device count = z@ has invalid target node names in its device maps
device maps = z
node names = z5 has duplicated target devices in its device map for z
device map = z5 has unexpected source devices in its device map for z
devices = z? has source devices with invalid indices in its device map for z5 has unexpected target devices in its device map for z? has target devices with invalid indices in its device map for )	lenset
ValueErrorrU   r    issubsetitemsvaluesget)
rb   rd   rf   rg   is_static_groupnoderT   source_nodetarget_nodere   s
             r   rY   rY      s
     d#s7|G,vDWIN  ,G5Ft5LMv $I &""3D"9!:<  ! 23{'C'H'H'J#K#T#T$
 } %!!0!=!B!B!D E F  ){, 
 "1!=!C!C!E (	K3t{{}%&#d)3 K= )--8M :$$(6+ 
 ;'499;'00[1IJ$} -11< >((,v .%%0%=$>@  2		.{; !K= )--8M :$$(6 *&&7&D%EG  {B/4;;=)22;{3KL$} -11< >((,v .%%0%=$>@   11:V0=; !K= )--8M :$$(6 *&&7&D%EG G(	2r   c                 h   | st               }|j                         D ]!  }|j                  |j                                # |j                         D ]!  }|j                  |j                                # |j	                  t        j                  d             t        |      } t        | d       } | S )NrK   c                     | j                   S r.   )rN   )rP   s    r   <lambda>z%_create_device_list.<locals>.<lambda>  s
    !'' r   )key)	rl   rp   updater    discardtorchdevicelistsorted)r_   r^   rh   devices_setre   s        r   r[   r[      s    ),"))+ 	,Dtyy{+	,'..0 	,Dtyy{+	,ELL/0+&

(9:Jr   c                     i }|D ]7  }| ||   v s||   |    j                         D ci c]  \  }}||
 c}}||<   9 |S c c}}w r.   )ro   )r\   rb   rf   rh   rs   kvs          r   rZ   rZ     sg    GI od++!0!6w!?!E!E!G)A1)%
 )s   Ac                  h   ddl m}  t        | t        j                               }|j                         }t        j                  j                         }t        j                  j                         r*|j                  rt        j                  j                          ||j                  |j                  fS )Nr   TensorPipeAgent)rG   r   r   r	   _get_current_rpc_agent_get_backend_optionsr|   rL   rQ   is_availablerT   initdevice_maps)r   agentoptsrQ   s       r   _get_device_infosr     su    !#"<"<">?E%%'D::**,Lzz T\\

))4<<77r   c           	         ddl m} t        ||       } | j                         }|j                  }| j                         }i i i g f\  }}}}|D ]  }	|	j                  }
|
|k7  rt        j                  |
t              \  }}}nF| j                         }t        j                  j                         |j                  |j                  }}}|||
<   |||
<   |||
<   |j                  |
        t!        ||||d       t#        |||      }|D ];  }
t%        ||
   ||
   |      ||
<   t        j                  |
t&        |||
   |df       = y )Nr   r   F)rr   T)r4   )rG   r   r   get_worker_infor   get_worker_infosr	   rpc_syncr   r   r|   rL   rQ   r   rT   appendrY   rZ   r[   r   )r   r   my_worker_infor\   all_worker_infosrd   rf   rg   rb   worker_infoworker_namerQ   
device_maprT   r   rh   s                   r   #_set_devices_and_reverse_device_mapr      sz   !%(E **,N!!G--/ACRR>Y' &!&&'!03.1-L*g --/D

'')   '.*L
 *6+&'1$#*K %#&&  2'9oV ! 	
#6$ok&BDW$
K  	$ +k":<OQUV	
	
r   c           
      x   ddl m}m} t        | t        j
                        st        d|        t        ||      st        d|       t        j                  j                         }|rdnd}|rt        | ||      }	t        |||j                  |j                  |	      \  }
}t        j                  j                         r |rt        j                  j                           || |||||
|      }t!        j"                  |       t!        j$                  d |j&                         |	j)                         j+                          |S t-        | |d      5   || ||||i g       }t!        j"                  |       	 t/        |       |cd d d        S # t0        $ r t!        j2                           w xY w# 1 sw Y   y xY w)Nr   )r   rC   z`store` must be a c10d::Store. z?`rpc_backend_options` must be a `TensorPipeRpcBackendOptions`. TF)timeout)rG   r   rC   
isinstancer9   Store	TypeErrorr|   rL   rQ   rA   ri   r   rT   r   r   r	   _init_rpc_states_all_gatherr0   barrierwaitr   r   	Exceptionshutdown)r=   r   r;   r>   rpc_backend_optionsr   rC   rQ   rr   r@   rh   rT   r   s                r    _tensorpipe_init_backend_handlerr   T  s    ?eTZZ(9%ABB)+FGMNaMbc
 	
 ::**,L(deO $E4<'U++''(
$W ::""$ JJOO  
 	U# 	&9&E&EF 	 *%t< 	 $#E   ' 4E: +	 	$  %	 	s$   $F08FF0F--F00F9
TENSORPIPE)T)-collectionsr%   typingr   r   r   r   r   r|   torch.distributeddistributedr9   rG   r	   r
   r7   _utilsr   r   __all__
namedtupler   r   r)   r&   r   r'   r(   r   r   DEFAULT_RPC_TIMEOUT_SECDEFAULT_INIT_METHODr   r   rA   DEFAULT_NUM_WORKER_THREADSrH   rU   ri   rY   r[   rZ   r   r   r    r   r   <module>r      s     / /    - J &{%%<>TU
&  diim26) +K
:"%N 5511?, %??&+. QUBJ
81
hUp 5$r   