o
    z“©i!  ã                   @   sZ   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	 e  
e¡ZG dd„ deƒZdS )é    N)Úoverride)ÚClusterEnvironment)Úrank_zero_warnc                   @   sö   e Zd ZdZeedefdd„ƒƒZeedefdd„ƒƒZ	eede
fdd„ƒƒZeedefd	d
„ƒƒZede
fdd„ƒZede
ddfdd„ƒZede
fdd„ƒZede
ddfdd„ƒZede
fdd„ƒZede
fdd„ƒZede
de
ddfdd„ƒZdS )ÚTorchElasticEnvironmentzgEnvironment for fault-tolerant and elastic training with `torchelastic <https://pytorch.org/elastic/>`_Úreturnc                 C   s   dS )NT© ©Úselfr   r   úf/home/ubuntu/.local/lib/python3.10/site-packages/lightning_fabric/plugins/environments/torchelastic.pyÚcreates_processes_externally   s   z4TorchElasticEnvironment.creates_processes_externallyc                 C   s<   dt jvrtdƒ dt jd< t dt jd › ¡ t jd S )NÚMASTER_ADDRzAMASTER_ADDR environment variable is not defined. Set as localhostz	127.0.0.1zMASTER_ADDR: )ÚosÚenvironr   ÚlogÚdebugr   r   r   r
   Úmain_address#   s
   


z$TorchElasticEnvironment.main_addressc                 C   s@   dt jvrtdƒ dt jd< t dt jd › ¡ tt jd ƒS )NÚMASTER_PORTz=MASTER_PORT environment variable is not defined. Set as 12910Ú12910zMASTER_PORT: )r   r   r   r   r   Úintr   r   r   r
   Ú	main_port,   s
   

z!TorchElasticEnvironment.main_portc                   C   s   t j ¡ o	t j ¡ S )zTReturns ``True`` if the current process was launched using the torchelastic command.)ÚtorchÚdistributedÚis_availableÚis_torchelastic_launchedr   r   r   r
   Údetect6   s   zTorchElasticEnvironment.detectc                 C   ó   t tjd ƒS )NÚ
WORLD_SIZE©r   r   r   r   r   r   r
   Ú
world_size=   ó   z"TorchElasticEnvironment.world_sizeÚsizeNc                 C   ó   t  d¡ d S )NzbTorchElasticEnvironment.set_world_size was called, but setting world size is not allowed. Ignored.©r   r   )r	   r    r   r   r
   Úset_world_sizeA   r   z&TorchElasticEnvironment.set_world_sizec                 C   r   )NÚRANKr   r   r   r   r
   Úglobal_rankE   r   z#TorchElasticEnvironment.global_rankÚrankc                 C   r!   )NzdTorchElasticEnvironment.set_global_rank was called, but setting global rank is not allowed. Ignored.r"   )r	   r&   r   r   r
   Úset_global_rankI   s   ÿz'TorchElasticEnvironment.set_global_rankc                 C   r   )NÚ
LOCAL_RANKr   r   r   r   r
   Ú
local_rankO   r   z"TorchElasticEnvironment.local_rankc                 C   s   t tj dd¡ƒS )NÚ
GROUP_RANKr   )r   r   r   Úgetr   r   r   r
   Ú	node_rankS   s   z!TorchElasticEnvironment.node_rankÚnum_devicesÚ	num_nodesc                 C   s@   || |   ¡ krtd|› d|› d|› d|› d|   ¡ › dƒ‚d S )NzYou set `devices=z` and `num_nodes=z!` in Lightning, but the product (z * z!) does not match the world size (z).)r   Ú
ValueError)r	   r-   r.   r   r   r
   Úvalidate_settingsW   s   ÿÿÿÿÿz)TorchElasticEnvironment.validate_settings)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr   Úboolr   Ústrr   r   r   Ústaticmethodr   r   r#   r%   r'   r)   r,   r0   r   r   r   r
   r      s8    r   )Úloggingr   Útorch.distributedr   Útyping_extensionsr   Ú9lightning_fabric.plugins.environments.cluster_environmentr   Ú$lightning_fabric.utilities.rank_zeror   Ú	getLoggerr1   r   r   r   r   r   r
   Ú<module>   s   
