Ë
    ‡\;jFa  ã                   ó  — d dl Z d dlZd dlZd dlZd dlZd dl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mZmZ d d	lmZ g Z G d
„ d«      Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z# G d„ d«      Z$dd„Z%y)é    N)Úcore)Ú
get_device)Ú_get_trainers_numÚget_cluster_and_pod)Úuse_paddlecloud)Úget_cluster_from_args)Ú
DeviceModeÚblock_windows_and_macosÚcheck_backend)Ú_prepare_trainer_envÚ_print_argumentsÚget_host_name_ip)Ú	set_flagsc                   ó   — e Zd Zd„ Zy)ÚParallelEnvArgsc                 óX   — d | _         d | _        d | _        d | _        d| _        d | _        y )NT)Úcluster_node_ipsÚnode_ipr   Ústarted_portÚprint_configÚselected_devices)Úselfs    úaG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\paddle/distributed/spawn.pyÚ__init__zParallelEnvArgs.__init__/   s;   € à $ˆÔð ˆŒð  $ˆÔð !ˆÔð !ˆÔð !%ˆÕó    N)Ú__name__Ú
__module__Ú__qualname__r   © r   r   r   r   .   s   „ ó%r   r   c                 óŠ   — g d¢}g d¢}| D ]6  }||vsŒ||v rt        j                  d|z  t        «       Œ*t        d|z  «      ‚ y )N)Ústart_methodÚipsÚgpusÚxpusr   Úbackend)r   r   r   r   r   z‘The config option (%s) of `paddle.distributed.spawn` is deprecated. Please use the latest config options stated in the `spawn` API documentation.zFThe config option (%s) of `paddle.distributed.spawn` is not supported.)ÚwarningsÚwarnÚDeprecationWarningÚ
ValueError)ÚoptionsÚsupported_optionsÚdeprecated_optionsÚkeys       r   Ú_options_valid_checkr.   G   si   € òÐòÐó ˆØÐ'Ò'ØÐ(Ñ(Ü—‘ðdàñô 'õ	ô !Ø\Øñóð ñ r   c                  ó>  — t        «       } d| v rt        j                  «       S d| v rt        j                  «       S d| v rt	        j
                  «       S | t        j                  «       v r't        j                  | j                  d«      d   «      S t        d| › d�«      ‚)NÚgpuÚxpuÚcpuÚ:r   úI`paddle.distributed.spawn` does not support parallel training on device `ú` now.)
r   r   Úget_cuda_device_countÚget_xpu_device_countÚmultiprocessingÚ	cpu_countÚget_available_custom_deviceÚget_custom_device_countÚsplitÚRuntimeError©Údevices    r   Ú_get_default_nprocsr@   h   s—   € Ü‹\€FØ��Ü×)Ñ)Ó+Ð+Ø	�&‰Ü×(Ñ(Ó*Ð*Ø	�&‰Ü×(Ñ(Ó*Ð*Ø	”4×3Ñ3Ó5Ñ	5Ü×+Ñ+¨F¯L©L¸Ó,=¸aÑ,@ÓAÐAäØWÐX^ÐW_Ð_eÐfó
ð 	
r   c                  ó€   — t        «       } d| v ryd| v ryd| v ry| t        j                  «       v ryt        d| › d	�«      ‚)
Nr0   Úncclr1   Úbkclr2   ÚglooÚxcclr4   r5   )r   r   r:   r=   r>   s    r   Ú_get_default_backendrF   x   sW   € Ü‹\€FØ��ØØ	�&‰ØØ	�&‰ØØ	”4×3Ñ3Ó5Ñ	5ØäØWÐX^ÐW_Ð_eÐfó
ð 	
r   c                 ó°   — d }| j                  d«      D �cg c]  }|j                  «       ‘Œ }}t        |«      dk(  r|d   }|S t        «       \  }}|S c c}w )NÚ,é   r   )r<   ÚstripÚlenr   )r"   r   ÚxÚnode_ipsÚ_s        r   Ú_get_node_iprO   ˆ   s]   € Ø€GØ#&§9¡9¨S¤>Ó2¡>˜a�—‘•	 >€HÐ2Ü
ˆ8ƒ}˜ÒØ˜1‘+ˆð €Nô &Ó'‰
ˆˆ7Ø€Nùò 3s   –Ac           	      óú  — d|vs|d   dk(  rt        «       |d<   t        |d   «       t        |d   «       g }t        «       }|j	                  dd «      |_        |j
                  €*|j	                  dd «      |_        |j
                  €d|_        |d   dk(  �r„|j	                  dd «      |_        |j                  €|j	                  dd «      |_        t        j                  d	d «      }|�|d
k(  r4t        t        j                  «       «      D �cg c]  }t        |«      ‘Œ }}n|j                  d«      }|j                  €ct        |«      | k  rt        dt        |«      | fz  «      ‚dj!                  t        d| «      D �cg c]  }t        ||   «      ‘Œ c}«      |_        �nŒ|j                  j                  d«      }t        |«      | k7  rt#        dt        |«      | fz  «      ‚|D ]0  }||vsŒt#        dj%                  |dj!                  |«      «      «      ‚ �n|d   dk(  �r„|j	                  dd «      |_        |j                  €|j	                  dd «      |_        t        j                  dd «      }|�|d
k(  r4t        t        j&                  «       «      D �cg c]  }t        |«      ‘Œ }}n|j                  d«      }|j                  €ct        |«      | k  rt        dt        |«      | fz  «      ‚dj!                  t        d| «      D �cg c]  }t        ||   «      ‘Œ c}«      |_        �nÿ|j                  j                  d«      }t        |«      | k7  rt#        dt        |«      | fz  «      ‚|D ]0  }||vsŒt#        dj%                  |dj!                  |«      «      «      ‚ �n†|d   dk(  r�t)        j*                  d«       d|_        d |_        |j
                  |_        |j	                  dd «      �J d«       ‚t        |j
                  j                  d«      «      dk  sJ d«       ‚t1        «       dk(  söJ d«       ‚|d   dk(  rçd |_        t        j2                  «       d   }	t        j                  d|	› d �d «      }|�|d
k(  r5t        t        j4                  |	«      «      D �cg c]  }t        |«      ‘Œ }}n|j                  d«      }t        |«      | k  rt        d!t        |«      | |	fz  «      ‚dj!                  t        d| «      D �cg c]  }t        ||   «      ‘Œ c}«      |_        |j	                  d"d «      |_        |j6                  €t9        |j
                  «      |_        |j	                  d#d «      |_        |j	                  dd «      |_        |j<                  €t=        «       |_        |d   dk(  r4t?        t        d| «      «      }
tA        |tB        jD                  |
«      \  }}ntG        |«      \  }}|jH                  D ]!  }|jK                  tM        |||d   «      «       Œ# |j	                  d$d%«      |_'        |jN                  rtQ        |«       |S c c}w c c}w c c}w c c}w c c}w c c}w )&Nr%   Úautor"   r   z	127.0.0.1rB   r#   r   ÚCUDA_VISIBLE_DEVICESÚ rH   zØthe number of visible devices(%d) is less than the number of spawn processes(%d), please ensure that the correct `nprocs` argument is passed or the environment variable `CUDA_VISIBLE_DEVICES` is correctly configured.r   zžThe number of selected devices(%s) is not equal to the number of spawn processes(%d), please ensure that the correct `nprocs` and `gpus` arguments are passed.zCThe selected gpu card {} cannot found in CUDA_VISIBLE_DEVICES ({}).rC   r$   ÚXPU_VISIBLE_DEVICESz×the number of visible devices(%d) is less than the number of spawn processes(%d), please ensure that the correct `nprocs` argument is passed or the environment variable `XPU_VISIBLE_DEVICES` is correctly configured.zžThe number of selected devices(%s) is not equal to the number of spawn processes(%d), please ensure that the correct `nprocs` and `xpus` arguments are passed.zBThe selected xpu card {} cannot found in XPU_VISIBLE_DEVICES ({}).rD   zšYour model will be trained under CPUONLY mode by using GLOO,because CPUPlace is specified manually or your installed PaddlePaddle only support CPU Device.Tr   z.CPUONLY spawn doesn't support use paddle cloudrI   zJCPUONLY spawn only support single trainer, that is len(ips)=1, but got %s.z+CPUONLY spawn doesn't support multi-trainerrE   ÚFLAGS_selected_ÚszÖthe number of visible devices(%d) is less than the number of spawn processes(%d), please ensure that the correct `nprocs` argument is passed or the environment variable `FLAGS_selected_%ss` is correctly configured.r   r   r   F))rF   r   r
   r   Úgetr   r   ÚosÚgetenvÚranger   r6   Ústrr<   rK   r=   Újoinr)   Úformatr7   r&   r'   Úpaddle_cpuonlyr"   r   Úget_all_custom_device_typer;   r   rO   r   r   Úlistr   r	   ÚCPUr   ÚtrainersÚappendr   r   r   )Únprocsr*   Úprocesses_env_listÚargsÚenv_devicesrL   Úenv_devices_listÚselected_device_listÚcard_idÚcustom_device_nameÚdevices_per_procÚclusterÚpodÚtrainers                 r   Ú_get_subprocess_env_listrp   ’   sè  € ð ˜Ñ 7¨9Ñ#5¸Ò#?Ü1Ó3ˆ�	ÑÜ�'˜)Ñ$Ô%Ü˜G IÑ.Ô/ð Ðô Ó€Dð $ŸK™K¨¨tÓ4€DÔØ×ÑÐ$Ø '§¡Ð,>ÀÓ EˆÔØ× Ñ Ð(Ø$/ˆDÔ!ð ˆyÑ˜VÓ#Ø '§¡¨F°DÓ 9ˆÔØ× Ñ Ð(Ø$+§K¡KÐ0BÀDÓ$IˆDÔ!Ü—i‘iÐ 6¸Ó=ˆØÐ +°Ò"3ä %¤d×&@Ñ&@Ó&BÔ Có Ù C˜1”�A•Ð Cð ñ  ð  +×0Ñ0°Ó5ÐØ× Ñ Ð(ÜÐ#Ó$ vÒ-Ü"ðFô Ð+Ó,¨fÐ5ñ	6óð ð %(§H¡HÜ38¸¸FÔ3CÓDÑ3C¨a”Ð% aÑ(Õ)Ð3CÑDó%ˆDÖ!ð $(×#8Ñ#8×#>Ñ#>¸sÓ#CÐ ÜÐ'Ó(¨FÒ2Ü ðHô Ð/Ó0°&Ð9ñ:óð ó 0�ØÐ"2Ò2Ü$ð5ß5;±VØ# S§X¡XÐ.>Ó%?ó6óð ò 0ð 
�Ñ	˜vÓ	%Ø '§¡¨F°DÓ 9ˆÔØ× Ñ Ð(Ø$+§K¡KÐ0BÀDÓ$IˆDÔ!Ü—i‘iÐ 5°tÓ<ˆØÐ +°Ò"3ä %¤d×&?Ñ&?Ó&AÔ Bó Ù B˜1”�A•Ð Bð ñ  ð  +×0Ñ0°Ó5ÐØ× Ñ Ð(ÜÐ#Ó$ vÒ-Ü"ðEô Ð+Ó,¨fÐ5ñ	6óð ð %(§H¡HÜ38¸¸FÔ3CÓDÑ3C¨a”Ð% aÑ(Õ)Ð3CÑDó%ˆDÖ!ð $(×#8Ñ#8×#>Ñ#>¸sÓ#CÐ ÜÐ'Ó(¨FÒ2Ü ðHô Ð/Ó0°&Ð9ñ:óð ó 0�ØÐ"2Ò2Ü$ð4ß4:±FØ# S§X¡XÐ.>Ó%?ó5óð ò 0ð 
�Ñ	˜vÒ	%ä�‰ðmô	
ð #ˆÔØ $ˆÔØ×(Ñ(ˆŒà�K‰KÐ)¨4Ó0Ð8ð	<à;ó	<Ø8ô �×%Ñ%×+Ñ+¨CÓ0Ó1°QÒ6ð	XàWó	XØ6ô Ó 1Ò$ð	9à8ó	9Ø$à	�Ñ	˜vÒ	%Ø $ˆÔÜ!×<Ñ<Ó>¸qÑAÐÜ—i‘i /Ð2DÐ1EÀQÐ GÈÓNˆØÐ +°Ò"3ô œt×;Ñ;Ð<NÓOÔPó áP�Aô �A•ØPð ñ  ð
  +×0Ñ0°Ó5ÐäÐÓ  6Ò)Üð@ô Ð'Ó(¨&Ð2DÐEñ	Fóð ð !$§¡Ü/4°Q¸Ô/?Ó@Ñ/?¨!ŒSÐ! !Ñ$Õ%Ð/?Ñ@ó!
ˆÔð
 —;‘;˜y¨$Ó/€D„LØ‡|�|ÐÜ# D×$9Ñ$9Ó:ˆŒàŸ™ N°DÓ9€DÔà"Ÿ;™;Ð'8¸$Ó?€DÔØ×ÑÐ#Ü.Ó0ˆÔð ˆyÑ˜VÒ#Ü¤ a¨Ó 0Ó1ÐÜ,Ø”*—.‘.Ð"2ó
‰ˆ‘ô +¨4Ó0‰ˆ�ð —<”<ˆØ×!Ñ!Ü  ¨'°7¸9Ñ3EÓFõ	
ð  ð  Ÿ™ N°EÓ:€DÔØ×ÒÜ˜ÔàÐùòi ùò Eùò4 ùò EùòT ùò  As$   ÄYÆ Y$ÊY)ÌY.Ò'Y3ÔY8c                  ó„   — t         j                  j                  dd «       t         j                  j                  dd «       y )NÚ
http_proxyÚhttps_proxy)rX   ÚenvironÚpopr   r   r   Ú_remove_risky_envrv   O  s(   € ô ‡J�J‡N�N�< Ô&Ü‡J�J‡N�N�= $Õ'r   c                 ó˜   — |dk(  rt        d| d   i«       n|dk(  rt        d| d   i«       n	 | D ]  }| |   t        j                  |<   Œ y )NrB   ÚFLAGS_selected_gpusrC   ÚFLAGS_selected_xpus)r   rX   rt   )Úenv_dictr%   Úvar_names      r   Ú_set_trainer_envr|   V  s^   € ð �&ÒÜÐ(¨(Ð3HÑ*IÐJÕKØ	�FÒ	ÜÐ(¨(Ð3HÑ*IÐJÕKð
 	ãˆØ'¨Ñ1Œ�
‰
�8Òñ r   c                 ó   — 	 t        «        t        ||«        | |Ž }|j                  |«       y # t        $ r Y y t        $ r; dd l}|j                  |j                  «       «       t        j                  d«       Y y w xY w)Nr   rI   )	rv   r|   ÚputÚKeyboardInterruptÚ	ExceptionÚ	tracebackÚ
format_excÚsysÚexit)Úfuncrf   Úerror_queueÚreturn_queuerz   r%   Úresultr�   s           r   Ú_func_wrapperr‰   n  sk   € ðäÔÜ˜ 7Ô+á�t�ˆà×Ñ˜Õ øÜò ÙÜò Ûà�‰˜	×,Ñ,Ó.Ô/Ü�‰�Žð	ús   ‚,/ ¯	A=ºA A=Á<A=c                   ó    — e Zd Zd„ Zdd„Zd„ Zy)ÚMultiprocessContextc                 ó–   — || _         || _        || _        t        |«      D ��ci c]  \  }}|j                  |“Œ c}}| _        y c c}}w ©N)Úerror_queuesÚreturn_queuesÚ	processesÚ	enumerateÚsentinelÚ	sentinels)r   r�   rŽ   r�   ÚindexÚprocesss         r   r   zMultiprocessContext.__init__�  sP   € Ø(ˆÔð +ˆÔØ"ˆŒä:CÀIÔ:Nô
Ù:N©¨¨wˆG×Ñ˜eÑ#Ð:Nò
ˆ�ùó 
s   ¤ANc                 ó,  — t        | j                  «      dk(  ryt        j                  j	                  | j                  j                  «       |¬«      }d }|D ]O  }| j                  j                  |«      }| j                  |   }|j                  «        |j                  dk7  sŒM|} n |€t        | j                  «      dk(  S | j                  D ]2  }|j                  «       r|j                  «        |j                  «        Œ4 | j                  |«       y )Nr   T)Útimeout)rK   r“   r8   Ú
connectionÚwaitÚkeysru   r�   r\   ÚexitcodeÚis_aliveÚ	terminateÚ_throw_exception)r   r—   ÚreadyÚerror_indexr’   r”   r•   s          r   r\   zMultiprocessContext.joinŽ  sð   € Üˆt�~‰~Ó !Ò#Øä×*Ñ*×/Ñ/Ø�N‰N×ÑÓ!¨7ð 0ó 
ˆð ˆÛˆHØ—N‘N×&Ñ& xÓ0ˆEØ—n‘n UÑ+ˆGØ�L‰LŒNØ×Ñ 1Ó$Ø#�Ùð ð ÐÜ�t—~‘~Ó&¨!Ñ+Ð+à—~”~ˆGØ×ÑÔ!Ø×!Ñ!Ô#Ø�L‰L�Nð &ð
 	×Ñ˜kÕ*r   c                 ó\  — | j                   |   j                  «       r^| j                  |   j                  }|dk  r0t	        j
                  | «      j                  }t        d||fz  «      ‚t        d||fz  «      ‚| j                   |   j                  «       }d|z  }||z  }t        |«      ‚)Nr   z%Process %d terminated with signal %s.z(Process %d terminated with exit code %d.z‘

----------------------------------------------
Process %d terminated with the following error:
----------------------------------------------

)	rŽ   Úemptyr�   r›   ÚsignalÚSignalsÚnamer€   rW   )r   r    r›   r¥   Úoriginal_traceÚmsgs         r   rž   z$MultiprocessContext._throw_exception©  sË   € Ø×Ñ˜[Ñ)×/Ñ/Ô1Ø—~‘~ kÑ2×;Ñ;ˆHØ˜!Š|Ü—~‘~ x iÓ0×5Ñ5�ÜØ;Ø" DÐ)ñ*óð ô
  Ø>Ø" HÐ-ñ.óð ð
 ×*Ñ*¨;Ñ7×;Ñ;Ó=ˆðAàCNñOð 	ð
 	ˆ~ÑˆÜ˜‹nÐr   r�   )r   r   r   r   r\   rž   r   r   r   r‹   r‹   €  s   „ ò
ó+ó6r   r‹   c                 óT  — t        |«       |dk(  r
t        «       }t        ||«      }|j                  dd«      }|€d}t	        j
                  |«      }g }	g }
g }t        |«      D ]�  }|j                  «       }|j                  «       }|j                  t        | |||||   |d   f¬«      }||_
        |j                  «        |	j                  |«       |
j                  |«       |j                  |«       Œ‘ t        ||	|
«      }|s|S |j                  «       s	 |j                  «       sŒ|S )a  
    Start multiple processes with ``spawn`` method for parallel training.

    .. note::
        ``spawn`` now only supports GPU or XPU collective mode. The collective mode
        of GPU and XPU cannot be started at the same time, so the option `gpus` and
        `xpus` cannot be configured at the same time.

    Args:
        func (function): The target function is called by spawned process.
            This function need to be able to pickled, so it must be defined
            at the top level of a module.
        args (list|tuple, optional): Arguments passed to ``func``.
        nprocs (int, optional): Number of processed to start. Default: -1.
            when nprocs is -1, the available device will be obtained from
            the environment variable when the model is executed: If use GPU,
            the currently available device ID is obtained from the environment
            variable CUDA_VISIBLE_DEVICES; If use XPU, the currently available
            device ID is obtained from the environment variable XPU_VISIBLE_DEVICES.
        join (bool, optional): Perform a blocking join on all spawned processes.
            Default: True.
        daemon (bool, optional): The spawned processes' daemon flag. Default: False.
        **options(dict, optional): Other initial parallel execution environment
            configuration options. The following options are currently supported:
            (1) start_method (string): the way to start a process.
            The start method can be ``spawn`` , ``fork`` , ``forkserver`` .
            Because the CUDA runtime does not support the ``fork`` start method,
            when use CUDA in subprocesses, we should start process by ``spawn``
            or ``forkserver`` method. Default: "spawn" ;
            (2) gpus (string): The training process will run on the
            selected gpus, such as "0,1,2,3". Default: None;
            (3) xpus (string): The training process will run on the
            selected xpus, such as "0,1,2,3". Default: None;
            (5) ips (string): Paddle cluster nodes ips, such as
            "192.168.0.16,192.168.0.17". Default: "127.0.0.1" .

    Returns:
        ``MultiprocessContext`` object, it hold the spawned processes.

    Examples:
        .. code-block:: python

            >>> # doctest: +REQUIRES(env:DISTRIBUTED)
            >>> import paddle
            >>> import paddle.nn as nn
            >>> import paddle.optimizer as opt
            >>> import paddle.distributed as dist

            >>> class LinearNet(nn.Layer):
            ...     def __init__(self):
            ...         super().__init__()
            ...         self._linear1 = nn.Linear(10, 10)
            ...         self._linear2 = nn.Linear(10, 1)
            ...     def forward(self, x):
            ...         return self._linear2(self._linear1(x))

            >>> def train(print_result=False):
            ...     # 1. initialize parallel environment
            ...     group = dist.init_parallel_env()
            ...     process_group = group.process_group if group else None
            ...     # 2. create data parallel layer & optimizer
            ...     layer = LinearNet()
            ...     dp_layer = paddle.DataParallel(layer, group = process_group)
            ...     loss_fn = nn.MSELoss()
            ...     adam = opt.Adam(
            ...         learning_rate=0.001, parameters=dp_layer.parameters())
            ...     # 3. run layer
            ...     inputs = paddle.randn([10, 10], 'float32')
            ...     outputs = dp_layer(inputs)
            ...     labels = paddle.randn([10, 1], 'float32')
            ...     loss = loss_fn(outputs, labels)
            ...     if print_result is True:
            ...         print("loss:", loss.numpy())
            ...     loss.backward()
            ...     adam.step()
            ...     adam.clear_grad()

            >>> # Usage 1: only pass function.
            >>> # If your training method no need any argument, and
            >>> # use all visible devices for parallel training.
            >>> if __name__ == '__main__':
            ...     dist.spawn(train)

            >>> # Usage 2: pass function and arguments.
            >>> # If your training method need some arguments, and
            >>> # use all visible devices for parallel training.
            >>> if __name__ == '__main__':
            ...     dist.spawn(train, args=(True,))

            >>> # Usage 3: pass function, arguments and nprocs.
            >>> # If your training method need some arguments, and
            >>> # only use part of visible devices for parallel training.
            >>> # If your machine hold 8 cards {0,1,2,3,4,5,6,7},
            >>> # this case will use cards {0,1}; If you set
            >>> # CUDA_VISIBLE_DEVICES=4,5,6,7, this case will use
            >>> # cards {4,5}
            >>> if __name__ == '__main__':
            ...     dist.spawn(train, args=(True,), nprocs=2)

            >>> # Usage 4: pass function, arguments, nprocs and gpus.
            >>> # If your training method need some arguments, and
            >>> # only use part of visible devices for parallel training,
            >>> # but you can't set your machine's environment variable
            >>> # CUDA_VISIBLE_DEVICES, such as it is None or all cards
            >>> # {0,1,2,3,4,5,6,7}, you can pass `gpus` to
            >>> # select the GPU cards you want to use. For example,
            >>> # this case will use cards {4,5} if your machine hold 8 cards.
            >>> if __name__ == '__main__':
            ...     dist.spawn(train, args=(True,), nprocs=2, gpus='4,5')

    éÿÿÿÿr!   NÚspawnr%   )Útargetrf   )r.   r@   rp   rW   r8   Úget_contextrZ   ÚSimpleQueueÚProcessr‰   ÚdaemonÚstartrc   r‹   r\   )r…   rf   rd   r\   r¯   r*   Úprocs_env_listr!   ÚmprŽ   r�   r�   Úir†   r‡   r•   Úcontexts                    r   rª   rª   Â  s9  € ôd ˜Ô!ð �‚|Ü$Ó&ˆô .¨f°gÓ>€Nð —;‘;˜~¨tÓ4€LØÐØˆÜ	×	$Ñ	$ \Ó	2€Bà€LØ€MØ€IÜ�6Ž]ˆØ—n‘nÓ&ˆØ—~‘~Ó'ˆØ—*‘*Ü àØØØØ˜qÑ!Ø˜	Ñ"ðð ó 

ˆð  ˆŒØ�‰ŒØ×Ñ˜KÔ(Ø×Ñ˜\Ô*Ø×Ñ˜Õ!ð% ô( " )¨\¸=ÓI€GÙØˆð �l‰lŒnØð �l‰l�nð €Nr   )r   r©   TF)&r8   rX   r£   rƒ   r&   Úpaddle.baser   Úpaddle.devicer   Úpaddle.distributed.cloud_utilsr   r   Ú$paddle.distributed.fleet.cloud_utilsr   Úpaddle.distributed.fleet.launchr   Ú%paddle.distributed.fleet.launch_utilsr	   r
   r   Ú%paddle.distributed.utils.launch_utilsr   r   r   Úpaddle.frameworkr   Ú__all__r   r.   r@   rF   rO   rp   rv   r|   r‰   r‹   rª   r   r   r   Ú<module>r¾      s�   ðó Û 	Û Û 
Û õ Ý $÷õ AÝ A÷ñ ÷
ñ õ
 'à
€÷%ñ %ò2òB
ò 
ò òzòz(ò2ò0÷$?ñ ?ôDhr   