U
    <c.                     @   s   d dl Z d dlmZ d dl mZ d dlmZ d dlmZm	Z	 d dl
mZ d dlmZmZmZmZ d dlmZ G dd	 d	eZdS )
    N)nn)DistributedDataParallel)INIT_METHOD_TEMPLATE	dist_init)RpcAgentTestFixture)requires_gloorequires_ncclskip_if_lt_x_gpuskip_if_rocm)Pipec                   @   s  e Zd ZeedddZede ee	dd Z
ede ee	dd Zede ee	d	d
 Zede ee	dd Zede ee	dd Zede ee	dd Zede ee	dd Zede ee	dd ZdddZdS )PipeWithDDPTest)returnc                 C   s   dS )N    selfr   r   Z/tmp/pip-unpacked-wheel-gikjz4vx/torch/testing/_internal/distributed/pipe_with_ddp_test.py
world_size   s    zPipeWithDDPTest.world_size   c                 C   s   |  dd d S )Nncclnever_run_basic_testr   r   r   r   test_basic_nccl_ckpt_never   s    z*PipeWithDDPTest.test_basic_nccl_ckpt_neverc                 C   s   | j dddd d S )Nr   r   Tfind_unused_parametersr   r   r   r   r   &test_basic_nccl_ckpt_never_find_unused   s    z6PipeWithDDPTest.test_basic_nccl_ckpt_never_find_unusedc                 C   s   | j dddd d S )Nr   alwaysTstatic_graphr   r   r   r   r   test_basic_nccl_ckpt_always%   s    z+PipeWithDDPTest.test_basic_nccl_ckpt_alwaysc                 C   s   | j dddd d S )Nr   except_lastTr   r   r   r   r   r    test_basic_nccl_ckpt_except_last,   s    z0PipeWithDDPTest.test_basic_nccl_ckpt_except_lastc                 C   s   |  dd d S )Ngloor   r   r   r   r   r   test_basic_gloo_ckpt_never3   s    z*PipeWithDDPTest.test_basic_gloo_ckpt_neverc                 C   s   | j dddd d S )Nr#   r   Tr   r   r   r   r   r   &test_basic_gloo_ckpt_never_find_unused:   s    z6PipeWithDDPTest.test_basic_gloo_ckpt_never_find_unusedc                 C   s   | j dddd d S )Nr#   r   Tr   r   r   r   r   r   test_basic_gloo_ckpt_alwaysA   s    z+PipeWithDDPTest.test_basic_gloo_ckpt_alwaysc                 C   s   | j dddd d S )Nr#   r!   Tr   r   r   r   r   r    test_basic_gloo_ckpt_except_lastH   s    z0PipeWithDDPTest.test_basic_gloo_ckpt_except_lastFc                    s$  t j|tj| jd| j| jd tjdddd	d| j }G  fdd	d	tj
  d| j d
 }t||}t|d|d}t||d}tdd	d| j | jd
  }|| }	|	   rtdd	d| j | jd
  }
||
    tdD ]@}tdd	d| j | jd
  }|| }	|	   qt|jjt|jjg}t ||jj | |d |d
  t|jjjt|jjjg}t ||jjj | |d |d
  s t|jjjt|jjjg}t ||jjj | |d |d
  d S )N)	file_name)backendZinit_methodr   rank      FZbiasr   c                       s*   e Zd Z fddZfddZ  ZS )z1PipeWithDDPTest._run_basic_test.<locals>.MyModulec                    sB   t  |   tjdddd|| _tjdddd|| _d S )Nr,   r   Fr-   r   )super__init__r   Linearcudafc2fc3)r   Zdevice)MyModule	__class__r   r   r/   \   s    z:PipeWithDDPTest._run_basic_test.<locals>.MyModule.__init__c                    s"    r|  |S | |  |S d S )N)r2   r3   )r   inpr   r   r   forwarda   s    
z9PipeWithDDPTest._run_basic_test.<locals>.MyModule.forward)__name__
__module____qualname__r/   r7   __classcell__r   r4   r   )r5   r   r4   [   s   r4      )chunks
checkpoint)r   r      r   )distZinit_process_groupr   formatr(   r   r*   r   r0   r1   ModuleZ
Sequentialr   r   torchZrandZlocal_valuesumZbackwardrangeZ
empty_likeZweightZgradZ
all_gatherassertEqualr2   r3   )r   r)   r?   r   r   Zfc1Zlayer2modelZmodel_inputoutZunused_param_input_outputr   r<   r   r   O   sN    	"""  zPipeWithDDPTest._run_basic_testN)FF)r8   r9   r:   propertyintr   r	   r   r   r
   r   r   r    r"   r   r$   r%   r&   r'   r   r   r   r   r   r      sV   r   )rD   Ztorch.distributedZdistributedrA   r   Ztorch.nn.parallelr   Z"torch.testing._internal.dist_utilsr   r   Z>torch.testing._internal.distributed.rpc.rpc_agent_test_fixturer   Z*torch.testing._internal.common_distributedr   r   r	   r
   Ztorch.distributed.pipeline.syncr   r   r   r   r   r   <module>   s   