o
    h                     @   sn  d dl Z d dlZd dlmZmZmZ d dlZg dZd Z	dd Z
dd Zdd	 Zd
d Zdeejeej f ddfddZde	ddfddZdd e	ddfdddeej deeejeej f  dededeeejj  deeej  ddfddZ	d deej deddfddZ		d!deej deej ddfddZe	ddfdeej deej deddfddZdS )"    N)OptionalSequenceUnion)
all_reducereduce	broadcast
all_gatherreduce_scatterc                 C   st   t tjdstd dS t }| D ]%}|jr dS | s! dS |js' dS |	 }||v r2 dS |
| qdS )N_nccl_all_reducez)PyTorch is not compiled with NCCL supportFT)hasattrtorch_Cwarningswarnset	is_sparseis_contiguousis_cuda
get_deviceadd)tensorsdevicestensordevice r   E/var/www/html/ai/venv/lib/python3.10/site-packages/torch/cuda/nccl.pyis_available   s    
r   c                  C   s0   t j } | d? }| d? d@ }| d@ }|||fS )N       i  )r   r   _nccl_version)vermajorminorpatchr   r   r   version"   s
   

r$   c                   C   s
   t j S N)r   r   _nccl_unique_idr   r   r   r   	unique_id*   s   
r'   c                 C   s   t j| ||S r%   )r   r   _nccl_init_rank)	num_ranksuidrankr   r   r   	init_rank.   s   r,   inputsreturnc                 C   s&   t | tjjrt | tjrtdd S )Nz(Inputs should be a collection of tensors)
isinstancecollectionsabc	Containerr   Tensor	TypeError)r-   r   r   r   _check_sequence_type2   s
   r5   c                 C   s4   t |  |d u r
| }t | tj| |||| d S r%   )r5   r   r   r
   r-   outputsopstreamscommsr   r   r   r   9   s
   r   )r7   outputrootr8   r9   r7   c                C   s   t |  |d ur|d urtdtd || }n!t|tjs1t|tjj	r1td || }n
|d u r9| | n|}tj
| ||||| d S )Nz'output' and 'outputs' can not be both specified. 'outputs' is deprecated in favor of 'output', taking in a single output tensor. The signature of reduce is: reduce(inputs, output=None, root=0, op=SUM, streams=None, comms=None).znccl.reduce with an output tensor list is deprecated. Please specify a single output tensor with argument 'output' instead instead.z\nccl.reduce with an output tensor list is deprecated. Please specify a single output tensor.)r5   
ValueErrorr   r   r/   r   r3   r0   r1   r   r   _nccl_reduce)r-   r;   r<   r8   r9   r:   r7   _outputr   r   r   r   C   s&   


r   c                 C   s   t |  tj| ||| d S r%   )r5   r   r   _nccl_broadcast)r-   r<   r9   r:   r   r   r   r   j   s   r   c                 C   s&   t |  t | tj| ||| d S r%   )r5   r   r   _nccl_all_gather)r-   r7   r9   r:   r   r   r   r   q   s   r   c                 C   s(   t |  t | tj| |||| d S r%   )r5   r   r   _nccl_reduce_scatterr6   r   r   r   r	   |   s   r	   )r   NN)NN)r0   r   typingr   r   r   
torch.cudar   __all__SUMr   r$   r'   r,   r3   r5   r   intcudaStreamr   r   r   r	   r   r   r   r   <module>   s~    "	
(


