o
    „o™iR  ã                   @   sV   d dl Z d dlZd dlmZ d dlmZ d dlmZ G dd„ deƒZde	fdd	„Z
dS )
é    N)Úoverride)ÚClusterEnvironment)Úrank_zero_onlyc                       sü   e Zd ZdZd‡ 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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dd„ƒZ‡  ZS )ÚLightningEnvironmentaX  The default environment used by Lightning for a single node or free cluster (not managed).

    There are two modes the Lightning environment can operate with:

    1.  The user only launches the main process by :code:`python train.py ...` with no additional environment variables
        set. Lightning will spawn new worker processes for distributed training in the current node.
    2.  The user launches all processes manually or with utilities like :code:`torch.distributed.launch`.
        The appropriate environment variables need to be set, and at minimum :code:`LOCAL_RANK`.

    If the main address and port are not provided, the default environment will choose them
    automatically. It is recommended to use this default environment for single-node distributed
    training as it provides a convenient way to launch the training script.

    ÚreturnNc                    s    t ƒ  ¡  d| _d| _d| _d S )Néÿÿÿÿr   é   )ÚsuperÚ__init__Ú
_main_portÚ_global_rankÚ_world_size©Úself©Ú	__class__© úc/home/ubuntu/.local/lib/python3.10/site-packages/lightning/fabric/plugins/environments/lightning.pyr
   (   s   

zLightningEnvironment.__init__c                 C   s
   dt jv S )a  Returns whether the cluster creates the processes or not.

        If at least :code:`LOCAL_RANK` is available as environment variable, Lightning assumes the user acts as the
        process launcher/job scheduler and Lightning will not launch new processes.

        Ú
LOCAL_RANK©ÚosÚenvironr   r   r   r   Úcreates_processes_externally.   s   
	z1LightningEnvironment.creates_processes_externallyc                 C   s   t j dd¡S )NÚMASTER_ADDRz	127.0.0.1)r   r   Úgetr   r   r   r   Úmain_address9   s   z!LightningEnvironment.main_addressc                 C   s0   | j dkrdtjv rttjd ƒntƒ | _ | j S )Nr   ÚMASTER_PORT)r   r   r   ÚintÚfind_free_network_portr   r   r   r   Ú	main_port>   s   
ÿzLightningEnvironment.main_portc                   C   s   dS )NTr   r   r   r   r   ÚdetectG   s   zLightningEnvironment.detectc                 C   ó   | j S ©N©r   r   r   r   r   Ú
world_sizeL   ó   zLightningEnvironment.world_sizeÚsizec                 C   s
   || _ d S r"   r#   )r   r&   r   r   r   Úset_world_sizeP   s   
z#LightningEnvironment.set_world_sizec                 C   r!   r"   )r   r   r   r   r   Úglobal_rankT   r%   z LightningEnvironment.global_rankÚrankc                 C   s   || _ |t_d S r"   )r   r   r)   )r   r)   r   r   r   Úset_global_rankX   s   
z$LightningEnvironment.set_global_rankc                 C   s   t tj dd¡ƒS )Nr   r   )r   r   r   r   r   r   r   r   Ú
local_rank]   s   zLightningEnvironment.local_rankc                 C   s    t j dd¡}tt j d|¡ƒS )NÚ
GROUP_RANKr   Ú	NODE_RANK)r   r   r   r   )r   Ú
group_rankr   r   r   Ú	node_ranka   s   zLightningEnvironment.node_rankc                 C   s   dt jv rt jd= d S d S )NÚ
WORLD_SIZEr   r   r   r   r   Úteardownf   s   
ÿzLightningEnvironment.teardown)r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   Úpropertyr   Úboolr   Ústrr   r   r   Ústaticmethodr    r$   r'   r(   r*   r+   r/   r1   Ú__classcell__r   r   r   r   r      s:    	r   r   c                  C   s2   t   t jt j¡} |  d¡ |  ¡ d }|  ¡  |S )z½Finds a free port on localhost.

    It is useful in single-node training when we don't want to connect to a real main node but have to set the
    `MASTER_PORT` environment variable.

    )Ú r   r   )ÚsocketÚAF_INETÚSOCK_STREAMÚbindÚgetsocknameÚclose)ÚsÚportr   r   r   r   l   s
   
r   )r   r<   Útyping_extensionsr   Ú9lightning.fabric.plugins.environments.cluster_environmentr   Ú$lightning.fabric.utilities.rank_zeror   r   r   r   r   r   r   r   Ú<module>   s   T