
    iY/              
          d dl Z d dlZd dlmZmZ d dlmZmZmZm	Z	 d dl
Z
d dlmc mc mc mZ d dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZmZmZ d d	lmZ d d
l m!Z! d dl"m#Z# d dl$m%Z% d dl&m'Z' g dZ( e%e)      Z*e G d d             Z+ G d d      Z,de	ee-df   de.e   de-fdZ/de!de0ee-   ee1   f   fdZ2de+de	ee-df   de.e   de3e1ef   fdZ4y)    N)	dataclassfield)AnyCallableOptionalUnion)get_default_numa_options)eventsmetrics)
WorkerSpec)LocalElasticAgent)DefaultLogsSpecs	LogsSpecsSignalException)ChildFailedError)RendezvousParameters)parse_rendezvous_endpoint)
get_logger)NumaOptions)LaunchConfigelastic_launchlaunch_agentc                   P   e Zd ZU dZeed<   eed<   eed<   dZee   ed<   dZ	e
ed<   d	Ze
ed
<   dZe
ed<   dZe
ed<    ee      Zee
ef   ed<   dZeed<   dZeed<   dZeed<   dZe
ed<   dZee
   ed<    ee      Zee
e
f   ed<   dZee
   ed<   dZe
ed<   dZee   ed<   d Zy)r   a	  
    Creates a rendezvous config.

    Args:
        min_nodes: Minimum amount of nodes that the user function will
                        be launched on. Elastic agent ensures that the user
                        function start only when the min_nodes amount enters
                        the rendezvous.
        max_nodes: Maximum amount of nodes that the user function
                        will be launched on.
        nproc_per_node: On each node the elastic agent will launch
                            this amount of workers that will execute user
                            defined function.
        rdzv_backend: rdzv_backend to use in the rendezvous (zeus-adapter, etcd).
        rdzv_endpoint: The endpoint of the rdzv sync. storage.
        rdzv_configs: Key, value pair that specifies rendezvous specific configuration.
        rdzv_timeout: Legacy argument that specifies timeout for the rendezvous. It is going
            to be removed in future versions, see the note below. The default timeout is 900 seconds.
        run_id: The unique run id of the job (if not passed a unique one will be
                deduced from run environment - flow workflow id in flow - or auto generated).
        role: User defined role of the worker (defaults to "trainer").
        max_restarts: The maximum amount of restarts that elastic agent will conduct
                    on workers before failure.
        monitor_interval: The interval in seconds that is used by the elastic_agent
                        as a period of monitoring workers.
        start_method: The method is used by the elastic agent to start the
                    workers (spawn, fork, forkserver).
        metrics_cfg: configuration to initialize metrics.
        local_addr: address of the local node if any. If not set, a lookup on the local
                machine's FQDN will be performed.
        local_ranks_filter: ranks for which to show logs in console. If not set, show from all.
        event_log_handler: name of the event logging handler as registered in
          `elastic/events/handlers.py <https://docs.pytorch.org/docs/stable/elastic/events.html>`_.


    .. note::
        `rdzv_timeout` is a legacy argument that will be removed in future.
        Set the timeout via `rdzv_configs['timeout']`

    	min_nodes	max_nodesnproc_per_nodeN
logs_specs run_iddefault_rolerolerdzv_endpointetcdrdzv_backend)default_factoryrdzv_configsrdzv_timeout   max_restartsg?monitor_intervalspawnstart_methodlog_line_prefix_templatemetrics_cfg
local_addrnullevent_log_handlernuma_optionsc                    d}| j                   dk7  r| j                   | j                  d<   nd| j                  vr|| j                  d<   | j                  t               | _        | j                  {t
        j                  j                         r\t
        j                  j                         | j                  k(  r0t               | _        t        j                  d| j                         y y y y )Ni  r'   timeoutzUsing default numa options = %r)r(   r&   r   r   r3   torchcudais_availabledevice_countr   r	   loggerinfo)selfdefault_timeouts     X/var/www/html/engine/venv/lib/python3.12/site-packages/torch/distributed/launcher/api.py__post_init__zLaunchConfig.__post_init__c   s    "+/+<+<Di(d///+:Di( ??".0DO %

'')

'')T-@-@@ 8 :DKK94;L;LM A * &    )__name__
__module____qualname____doc__int__annotations__r   r   r   r   strr!   r"   r$   r   dictr&   r   r(   r*   r+   floatr-   r.   r/   r0   r2   r3   r   r?    r@   r>   r   r   %   s    'R NN&*J#*FCD#M3L##(#>L$sCx.>L#L#!e!L#.2hsm2"'"=Kc3h= $J$#s#*.L(;'.Nr@   r   c                   2    e Zd ZdZdedeeedf   fdZd Z	y)r   a  
    Launches an torchelastic agent on the container that invoked the entrypoint.

        1. Pass the ``entrypoint`` arguments as non ``kwargs`` (e.g. no named parameters)/
           ``entrypoint`` can be a function or a command.
        2. The return value is a map of each worker's output mapped
           by their respective global rank.

    Usage

    ::

    def worker_fn(foo):
        # ...

    def main():
        # entrypoint is a function.
        outputs = elastic_launch(LaunchConfig, worker_fn)(foo)
        # return rank 0's output
        return outputs[0]

        # entrypoint is a command and ``script.py`` is the python module.
        outputs = elastic_launch(LaunchConfig, "script.py")(args)
        outputs = elastic_launch(LaunchConfig, "python")("script.py")
    config
entrypointNc                      || _         || _        y N)_config_entrypoint)r<   rL   rM   s      r>   __init__zelastic_launch.__init__   s    
 %r@   c                 V    t        | j                  | j                  t        |            S rO   )r   rP   rQ   list)r<   argss     r>   __call__zelastic_launch.__call__   s    DLL$*:*:DJGGr@   )
rA   rB   rC   rD   r   r   r   rG   rR   rV   rJ   r@   r>   r   r   x   s0    4&& (C-.&Hr@   r   rM   rU   returnc                     t        | t              r| j                  S t        | t              r(| t        j
                  k(  rt        d |D        d      S | S y)a  Retrieve entrypoint name with the rule:
    1. If entrypoint is a function, use ``entrypoint.__qualname__``.
    2. If entrypoint is a string, check its value:
        2.1 if entrypoint equals to ``sys.executable`` (like "python"), use the first element from ``args``
            which does not start with hifen letter (for example, "-u" will be skipped).
        2.2 otherwise, use ``entrypoint`` value.
    3. Otherwise, return empty string.
    c              3   2   K   | ]  }|d    dk7  s|  yw)r   -NrJ   ).0args     r>   	<genexpr>z'_get_entrypoint_name.<locals>.<genexpr>   s     >A#>s   r   )
isinstancer   rA   rG   sys
executablenext)rM   rU   s     r>   _get_entrypoint_namerb      sL     *h'"""	J	$'>>CCr@   rdzv_parametersc                     | j                   dk7  ry| j                  }|j                         }|st        d      t	        |d      \  }}|dk(  rt        d| d      ||fS )Nstatic)NNzKEndpoint is missing in endpoint. Try to add --master-addr and --master-portr'   )default_portzport is missing in endpoint: z. Try to specify --master-port)backendendpointstrip
ValueErrorr   )rc   rh   master_addrmaster_ports       r>   _get_addr_and_portrm      s     (*''H~~HY
 	
  9PRSKb+H:5ST
 	
 %%r@   rL   c                    | j                   sDt        t        j                         j                        }t
        j                  d|       || _         t        ||      }t
        j                  d|| j                  | j                  | j                  | j                   | j                  | j                  | j                  | j                  | j                   | j"                  j$                  | j&                  | j(                  | j*                  d       t-        d
| j                  | j                  | j                   | j                  | j                  | j.                  d| j                  }t1        |      \  }}t3        | j4                  | j                  |t7        |      t9        j:                  |      | j                  | j                   ||| j.                  | j(                  | j*                        }t=        || j"                  | j>                  | j@                        }	d}
	 tC        jD                  tC        jF                  | j&                               |	jI                         }tK        jL                  |	jO                         | j(                         |jQ                         rtS        ||jT                        |jV                  |
r|jX                  j[                          S S # tR        $ r  t\        $ r2 d	}
tK        jL                  |	j_                         | j(                          t`        $ r0 tK        jL                  |	j_                         | j(                          w xY w# |
r|jX                  j[                          w w xY w)Nz3config has no run_id, generated a random run_id: %saW  Starting elastic_operator with launch configs:
  entrypoint         : %(entrypoint)s
  min_nodes          : %(min_nodes)s
  max_nodes          : %(max_nodes)s
  nproc_per_node     : %(nproc_per_node)s
  run_id             : %(run_id)s
  rdzv_backend       : %(rdzv_backend)s
  rdzv_endpoint      : %(rdzv_endpoint)s
  rdzv_configs       : %(rdzv_configs)s
  max_restarts       : %(max_restarts)s
  monitor_interval   : %(monitor_interval)s
  log_dir            : %(log_dir)s
  metrics_cfg        : %(metrics_cfg)s
  event_log_handler  : %(event_log_handler)s
  numa_options       : %(numa_options)s
)rM   r   r   r   r   r$   r"   r&   r*   r+   log_dirr/   r2   r3   )rg   rh   r   r   r   r0   )r!   local_world_sizerM   rU   rdzv_handlerr*   r+   rk   rl   r0   r2   r3   )specr   r-   r.   T)namefailuresFrJ   )1r   rG   uuiduuid4rE   r:   warningrb   r;   r   r   r   r$   r"   r&   r*   r+   r   root_log_dirr/   r2   r3   r   r0   rm   r   r!   tuplerdzv_registryget_rendezvous_handlerr   r-   r.   r   initialize_metricsMetricsConfigrunr
   recordget_event_succeeded	is_failedr   rt   return_valuesrq   shutdownr   get_event_failed	Exception)rL   rM   rU   r   entrypoint_namerc   rk   rl   rr   agentshutdown_rdzvresults               r>   r   r      s   
 ==TZZ\%%&LfU*:t<O
KK	4  *))))$33mm"//#11"//"// & 7 7((55!--!'!9!9"//	
! D + ##%%}}""""$$ 

O  2/BK[[..4["99/J((00$$ 22((D $$((!'!@!@	E M )""7#8#89K9K#LMe//163K3KL
 #$ 
 ## &&(     e,,.0H0HI e,,.0H0HI &&( s   B"K A;MM M:)5r_   ru   dataclassesr   r   typingr   r   r   r   r6   -torch.distributed.elastic.rendezvous.registrydistributedelastic
rendezvousregistryrz   torch._utils_internalr	   torch.distributed.elasticr
   r   *torch.distributed.elastic.agent.server.apir   :torch.distributed.elastic.agent.server.local_elastic_agentr   )torch.distributed.elastic.multiprocessingr   r   r   0torch.distributed.elastic.multiprocessing.errorsr   $torch.distributed.elastic.rendezvousr   *torch.distributed.elastic.rendezvous.utilsr   'torch.distributed.elastic.utils.loggingr   torch.numa.bindingr   __all__rA   r:   r   r   rG   rT   rb   ry   rE   rm   rH   r   rJ   r@   r>   <module>r      s     ( 1 1  E E : 5 A X 
 N E P > * =	H	 ON ON ONd$H $HNhT)*26s),&)&
8C=(3-'(&&q)q)hT)*q) s)q) 
#s(^	q)r@   