a
    d0
                     @   sh   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dZ
dd ZdddZd	d
 Zdd ZdS )    Nncclc                 K   s`   t jddd u rt d | dkr4t|fi | n(| dkrNt|fi | ntd|  d S )NT)
allow_nonespawnZpytorchZslurmzInvalid launcher type: )mpZget_start_methodZset_start_method_init_dist_pytorch_init_dist_slurm
ValueError)launcherbackendkwargs r   `/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/basicsr/utils/dist_util.py	init_dist
   s    
r   c                 K   s@   t tjd }tj }tj||  tjf d| i| d S )NRANKr
   )	intosenvirontorchcudadevice_count
set_devicedistinit_process_group)r
   r   ranknum_gpusr   r   r   r      s    
r   c                 C   s   t tjd }t tjd }tjd }tj }tj||  td| d}|durjt	|tjd< ndtjv rvn
dtjd< |tjd	< t	|tjd
< t	|| tjd< t	|tjd< t
j| d dS )a  Initialize slurm distributed training environment.

    If argument ``port`` is not specified, then the master port will be system
    environment variable ``MASTER_PORT``. If ``MASTER_PORT`` is not in system
    environment variable, then a default port ``29500`` will be used.

    Args:
        backend (str): Backend of torch.distributed.
        port (int, optional): Master port. Defaults to None.
    ZSLURM_PROCIDZSLURM_NTASKSZSLURM_NODELISTzscontrol show hostname z | head -n1NZMASTER_PORTZ29500ZMASTER_ADDRZ
WORLD_SIZEZ
LOCAL_RANKr   )r
   )r   r   r   r   r   r   r   
subprocess	getoutputstrr   r   )r
   portZproc_idZntasksZ	node_listr   addrr   r   r   r      s     




r   c                  C   s<   t  rt  } nd} | r,t  }t  }nd}d}||fS )NFr      )r   Zis_availableZis_initializedZget_rankZget_world_size)Zinitializedr   Z
world_sizer   r   r   get_dist_info<   s    

r!   c                    s   t   fdd}|S )Nc                     s$   t  \}}|dkr  | i |S d S )Nr   )r!   )argsr   r   _funcr   r   wrapperL   s    
zmaster_only.<locals>.wrapper)	functoolswraps)r%   r&   r   r$   r   master_onlyJ   s    r)   )r   )N)r'   r   r   r   Ztorch.distributedZdistributedr   Ztorch.multiprocessingmultiprocessingr   r   r   r   r!   r)   r   r   r   r   <module>   s   

 