Ë
    óÍ:j¼,  ã            
       ó�  — 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
mc mc mc 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" 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e+ee(   ee,   f   fd„Z-de&de	ee(df   de)e   de.e,ef   fd„Z/y)é    N)Ú	dataclassÚfield)ÚAnyÚCallableÚOptionalÚUnion)ÚeventsÚmetrics)Ú
WorkerSpec)ÚLocalElasticAgent)ÚDefaultLogsSpecsÚ	LogsSpecsÚSignalException)ÚChildFailedError)ÚRendezvousParameters)Úparse_rendezvous_endpoint)Ú
get_logger)ÚLaunchConfigÚelastic_launchÚlaunch_agentc                   ó<  — 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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_handlerc                 óÌ   — d}| j                   dk7  r| j                   | j                  d<   nd| j                  vr|| j                  d<   | j                  €t        «       | _        y y )Ni„  r%   Útimeout)r&   r$   r   r   )ÚselfÚdefault_timeouts     ús/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/torch/distributed/launcher/api.pyÚ__post_init__zLaunchConfig.__post_init___   sd   € ØˆØ×Ñ Ò"Ø+/×+<Ñ+<ˆD×Ñ˜iÒ(Ø˜d×/Ñ/Ñ/Ø+:ˆD×Ñ˜iÑ(ð �?‰?Ð"Ü.Ó0ˆD�Oð #ó    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚintÚ__annotations__r   r   r   r   Ústrr   r    r"   r   Údictr$   r   r&   r(   r)   Úfloatr+   r,   r-   r.   r0   r6   © r7   r5   r   r   "   sÕ   … ñ'ðR ƒNØƒNØÓØ&*€J�˜Ñ#Ó*Ø€FˆCÓØ€Dˆ#ÓØ€M�3ÓØ€L�#ÓÙ#(¸Ô#>€L�$�s˜C�x‘.Ó>Ø€L�#ÓØ€L�#ÓØ!Ð�eÓ!Ø€L�#ÓØ.2Ð˜h s™mÓ2Ù"'¸Ô"=€K��c˜3�h‘Ó=Ø $€J�˜‘Ó$Ø#Ð�sÓ#ó	1r7   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)r3   rC   rD   s      r5   Ú__init__zelastic_launch.__init__†   s   € ð
 ˆŒØ%ˆÕr7   c                 óV   — t        | j                  | j                  t        |«      «      S rF   )r   rG   rH   Úlist)r3   Úargss     r5   Ú__call__zelastic_launch.__call__Ž   s   € Ü˜DŸL™L¨$×*:Ñ*:¼DÀ»JÓGÐGr7   )
r8   r9   r:   r;   r   r   r   r>   rI   rM   rA   r7   r5   r   r   k   s0   „ ñð4&àð&ð ˜( C¨Ð-Ñ.ó&óHr7   r   rD   rL   Ú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   ú-NrA   )Ú.0Úargs     r5   ú	<genexpr>z'_get_entrypoint_name.<locals>.<genexpr>¡   s   è ø€ Ò> °°A±¸#³œÑ>ùs   ‚�r   )Ú
isinstancer   r8   r>   ÚsysÚ
executableÚnext)rD   rL   s     r5   Ú_get_entrypoint_namerY   ’   sL   € ô �*œhÔ'Ø×"Ñ"Ð"Ü	�J¤Ô	$ØœŸ™Ò'ÜÑ>¨Ô>ÀÓCÐCàÐàr7   Ú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   )rZ   r_   Úmaster_addrÚmaster_ports       r5   Ú_get_addr_and_portrd   ¨   s‚   € ð ×Ñ (Ò*ØØ×'Ñ'€HØ�~‰~Ó€HÙÜØYó
ð 	
ô  9¸ÐPRÔSÑ€K�Ø�bÒÜØ+¨H¨:Ð5SÐTó
ð 	
ð ˜Ð%Ð%r7   rC   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(                  dœ«       t+        d
| j                  | j                  | j                   | j                  | j                  | j,                  dœ| j                  ¤Ž}t/        |«      \  }}t1        | j2                  | j                  |t5        |«      t7        j8                  |«      | j                  | j                   ||| j,                  | j(                  ¬«      }t;        || j"                  | j<                  | j>                  ¬«      }	d}
	 tA        jB                  tA        jD                  | j&                  «      «       |	jG                  «       }tI        jJ                  |	jM                  «       | j(                  «       |jO                  «       rtQ        ||jR                  ¬«      ‚|jT                  |
r|jV                  jY                  «        S S # tP        $ r ‚ tZ        $ r2 d	}
tI        jJ                  |	j]                  «       | j(                  «       ‚ t^        $ r0 tI        jJ                  |	j]                  «       | j(                  «       ‚ w xY w# |
r|jV                  jY                  «        w w xY w)Nz3config has no run_id, generated a random run_id: %sa/  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
)rD   r   r   r   r   r"   r    r$   r(   r)   Úlog_dirr-   r0   )r^   r_   r   r   r   r.   )r   Úlocal_world_sizerD   rL   Úrdzv_handlerr(   r)   rb   rc   r.   r0   )Úspecr   r+   r,   T)ÚnameÚfailuresFrA   )0r   r>   ÚuuidÚuuid4r<   ÚloggerÚwarningrY   Úinfor   r   r   r"   r    r$   r(   r)   r   Úroot_log_dirr-   r0   r   r.   rd   r   r   ÚtupleÚrdzv_registryÚget_rendezvous_handlerr   r+   r,   r
   Úinitialize_metricsÚMetricsConfigÚrunr	   ÚrecordÚget_event_succeededÚ	is_failedr   rk   Úreturn_valuesrh   Úshutdownr   Úget_event_failedÚ	Exception)rC   rD   rL   r   Úentrypoint_namerZ   rb   rc   ri   ÚagentÚshutdown_rdzvÚresults               r5   r   r   »   sâ  € ð
 �=Š=Ü”T—Z‘Z“\×%Ñ%Ó&ˆÜ�‰ÐLÈfÔUØˆŒä*¨:°tÓ<€Oä
‡K�Kð	9ð *Ø×)Ñ)Ø×)Ñ)Ø$×3Ñ3Ø—m‘mØ"×/Ñ/Ø#×1Ñ1Ø"×/Ñ/Ø"×/Ñ/Ø &× 7Ñ 7Ø×(Ñ(×5Ñ5Ø!×-Ñ-Ø!'×!9Ñ!9ñ	
ôô@ +ð Ø×#Ñ#Ø×%Ñ%Ø�}‰}Ø×"Ñ"Ø×"Ñ"Ø×$Ñ$ñð ×
Ñ
ñ€Oô  2°/ÓBÑ€K�äØ�[‰[Ø×.Ñ.ØÜ�4‹[Ü"×9Ñ9¸/ÓJØ×(Ñ(Ø×0Ñ0ØØØ×$Ñ$Ø ×2Ñ2ô€Dô ØØ×$Ñ$Ø×(Ñ(Ø!'×!@Ñ!@ô	€Eð €Mð )Ü×"Ñ"¤7×#8Ñ#8¸×9KÑ9KÓ#LÔMà—‘“ˆä�‰�e×/Ñ/Ó1°6×3KÑ3KÔLà×ÑÔô
 #Ø$ØŸ™ôð ð
 ×#Ñ#ñ Ø×Ñ×&Ñ&Õ(ð øô ò ØÜò ð ˆÜ�‰�e×,Ñ,Ó.°×0HÑ0HÔIØÜò Ü�‰�e×,Ñ,Ó.°×0HÑ0HÔIØðûñ Ø×Ñ×&Ñ&Õ(ð ús   ÈB"K ËA;MÍM ÍM$)0rV   rl   Údataclassesr   r   Útypingr   r   r   r   Ú-torch.distributed.elastic.rendezvous.registryÚdistributedÚelasticÚ
rendezvousÚregistryrs   Ú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   Ú__all__r8   rn   r   r   r>   rK   rY   rr   r<   rd   r?   r   rA   r7   r5   ú<module>r“      s  ðó Û ß (ß 1Ó 1ç EÖ Eß 5Ý AÝ X÷ñ õ
 NÝ EÝ PÝ >ò =€á	�HÓ	€ð ÷E1ð E1ó ðE1÷P$Hñ $HðNØ�h  TÐ)Ñ*ðØ26°s±)ðàóð,&Ø)ð&à
ˆ8�C‰=˜( 3™-Ð'Ñ(ó&ð&n)Øðn)à�h  TÐ)Ñ*ðn)ð ˆs‰)ðn)ð 
ˆ#ˆsˆ(�^ô	n)r7   