
    Vh                     \   d dl Z d dlmZ d dlmZ d dlZd dlmZ  e j                  e      Z	d Z
d Z G d de      Zd	 Zd
eeej                      eej                   df   f   deeej                      eej                   df   f   fdZ	 ddedededeeef   fdZe G d d             Zy)    N)	dataclass)Union)fxc                 Z    g fd}t         j                  j                  | |      }|fS )z\
    Flatten the args into a list form and detach the tensors from computational graph.
    c                     t        | t        j                        r<| j                         j	                  | j
                        }j                  |       |S j                  |        | S N)
isinstancetorchTensordetachrequires_grad_requires_gradappend)avalflat_detached_argss     S/home/dcms/DCMS/lib/python3.12/site-packages/torch/distributed/pipelining/_utils.pyextract_tensor_argsz0flatten_args_detach.<locals>.extract_tensor_args   sQ    a&((*++AOO<C%%c*J%%a(H    r   nodemap_aggregate)argsr   new_argsr   s      @r   flatten_args_detachr      s:      ww$$H
 '''r   c                 V    g fd}t         j                  j                  | |       S )z,
    Flatten the args into a list form.
    c                 *    j                  |        | S r   )r   )r   	flat_argss    r   r   z)flatten_args.<locals>.extract_tensor_args,   s    r   r   )r   r   r   s     @r   flatten_argsr   &   s1     I
 GG
 r   c                       e Zd ZdZy)PipeliningShapeErrorz5Shape mismatch between configured and runtime values.N)__name__
__module____qualname____doc__ r   r   r!   r!   9   s    ?r   r!   c                    |j                   |j                   k(  s't        |  d|j                    d|j                          |j                  |j                  k(  s't        |  d|j                   d|j                         |j                         |j                         k(  s/t        |  d|j                          d|j                                y )Nz  has a shape mismatch: expected z actual z  has a dtype mismatch: expected z! has a stride mismatch: expected )shaper!   dtypestride)descexpectedgivens      r   validate_tensor_metadatar.   =   s    >>U[[("f4X^^4DHU[[MZ
 	
 >>U[[("f4X^^4DHU[[MZ
 	
 ??."f5hoo6G5HQVQ]Q]Q_P`a
 	
 /r   expected_tensors.actual_tensorsc           	          t        |      t        |      k7  r&t        |  dt        |       dt        |       d      t        t        |            D ]  }t        |  d| ||   ||           y )Nz: Number of values (z") does not match expected number ()z: value )lenr!   ranger.   )r+   r/   r0   is       r   validate_tensors_metadatar6   L   s    
 N 33"f(^)<(==_`cdt`u_vvwx
 	
 3'() 
 fHQC "21"5~a7H	

r   pp_size
num_stagesstylereturnc                    i }|dk(  rt        |      D ]
  }|| z  ||<    |S |dk(  rU|| z  dk7  rt        d| d|  d      d}t        |      D ])  }|||<   |dz   | z  dk(  r|| z  dz  dk(  r|dz  }%|dz  }+ |S t        d	| d
      )z
    Compute the stage id to rank mapping for either a looped or V-style schedule.

    Most commonly num_stages == pp_size * 2, but this function can be used to
    compute the mapping for any number of stages per rank.
    loopvr   znum_stages z% must be evenly divisible by pp_size z for V schedules      zStyle z is not supported.)r4   
ValueError)r7   r8   r9   mappingstage_index
rank_indexs         r   generate_stage_to_rank_mappingrD   [   s     G , 	9K#.#8GK 	9( N% 
#1$j\)NwiWgh  
 , 	 K#-GK a7*a/w&!+q0a
a
	  N 6%(:;<<r   c                   D    e Zd ZU dZej
                  ed<   eed<   eed<   y)PipeInfoz>
    Captures information for a pipeline (`Pipe` object).
    graphr8   has_loss_and_backwardN)	r"   r#   r$   r%   r   Graph__annotations__intboolr&   r   r   rF   rF   }   s     88OOr   rF   )r<   )loggingdataclassesr   typingr   r
   r   	getLoggerr"   loggerr   r   RuntimeErrorr!   r.   listr   tupler6   rK   strdictrD   rF   r&   r   r   <module>rW      s     !    
		8	$(0&@< @

D.ellC6G0HHI
 $u||,eELL#4E.FFG
  17!*-	#s(^D      r   