o
    }oi                     @   s   d dl mZ d dlmZ d dlZd dlmZ d dlmZ d dl	m
Z d dlmZ G dd	 d	ZG d
d dZG dd dZG dd dZdS )    )defaultdict	MagicMockN)parallel_state)nn)	lightning)megatron_parallelc                   @   st   e Zd ZdZejdd Zejdd Zejdd Zejdd	 Z	ejd
d Z
ejdd Zdd Zdd ZdS )TestMegatronParallelz*Unit tests for the MegatronParallel class.c                 C   s   G dd dt j}| S )z"Fixture to create a mock pipeline.c                       s&   e Zd Zd fdd	Zdd Z  ZS )z7TestMegatronParallel.mock_pipeline.<locals>.DummyModuleNc                    s   || _ t   d S N)	dummy_argsuper__init__)selfr   	__class__ Z/home/ubuntu/.local/lib/python3.10/site-packages/tests/lightning/test_megatron_parallel.pyr   "   s   z@TestMegatronParallel.mock_pipeline.<locals>.DummyModule.__init__c                 S   s   |S r
   r   )r   xr   r   r   forward&      z?TestMegatronParallel.mock_pipeline.<locals>.DummyModule.forwardr
   )__name__
__module____qualname__r   r   __classcell__r   r   r   r   DummyModule!   s    r   )r   Module)r   mockerr   r   r   r   mock_pipeline   s   z"TestMegatronParallel.mock_pipelinec                 C   s   t jddS )z*Fixture to create a mock precision plugin.z
bf16-mixed)	precision)nlMegatronMixedPrecisionr   r   r   r   r   mock_precision_plugin+   s   z*TestMegatronParallel.mock_precision_pluginc                 C   s   |j tjdS )z,Fixture to create a mock callback connector.)spec)r   mpCallbackConnectorr!   r   r   r   mock_callbacks0   s   z#TestMegatronParallel.mock_callbacksc                 C      |  S )z,Fixture to create a mock data step function.r   r!   r   r   r   mock_data_step5      z#TestMegatronParallel.mock_data_stepc                 C   r'   )z/Fixture to create a mock forward step function.r   r!   r   r   r   mock_forward_step:   r)   z&TestMegatronParallel.mock_forward_stepc                 C   r'   )z1Fixture to create a mock loss reduction function.r   r!   r   r   r   mock_loss_reduction?   r)   z(TestMegatronParallel.mock_loss_reductionc                 C   s   |j ddd |j ddd tj|dd}|j|ksJ |jdu s#J t|jtjs,J |jtj	ks4J |j
tjks<J |jdu sCJ dS )	z&Test __init__ with default parameters.Cmegatron.core.parallel_state.get_pipeline_model_parallel_world_size   return_value:megatron.core.parallel_state.model_parallel_is_initializedFT)pipelinecpuN)patchr$   MegatronParallelr1   precision_plugin
isinstance	callbacksr%   	data_stepdefault_data_stepforward_stepdefault_forward_steploss_reduction)r   r   r   r   r   r   r   test_init_with_defaultsD   s   z,TestMegatronParallel.test_init_with_defaultsc           	   	   C   s   |j ddd |j ddd tj||||||dd}|j|ks!J |j|ks(J |j|ks/J |j|ks6J |j|ks=J |j|ksDJ dS )	z%Test __init__ with custom parameters.r,   r-   r.   r0   FT)r1   r5   r7   r8   r:   r<   r2   N)	r3   r$   r4   r1   r5   r7   r8   r:   r<   )	r   r   r   r"   r&   r(   r*   r+   r   r   r   r    test_init_with_custom_parametersR   s"   
z5TestMegatronParallel.test_init_with_custom_parametersN)r   r   r   __doc__pytestfixturer   r"   r&   r(   r*   r+   r=   r>   r   r   r   r   r	      s     





r	   c                   @   sB   e Zd ZdddZdddZdddZd	d
 Zdd Zdd ZdS )TestCallbackConnectorreturnNc                 C   s@   t  }t }|| ||jd v sJ ||jd v sJ d S )Non_megatron_step_starton_megatron_microbatch_startr$   r%   TestCallbackaddr7   r   callback_connectorcallbackr   r   r   test_add_callbackss   s
   
z(TestCallbackConnector.test_add_callbacksc                 C   s`   t  }t }|| t |_t |_|d |d |jjdks&J |jjdks.J d S )NrD   rE   r-   )	r$   r%   rG   rH   r   rD   rE   event
call_countrI   r   r   r   
test_event{   s   


z TestCallbackConnector.test_eventc                 C   s`   t  }t  }t }t }|| || ||7 }||jd v s%J ||jd v s.J d S )NrD   rF   )r   callback_connector1callback_connector2	callback1	callback2r   r   r   test_add_connector   s   

z(TestCallbackConnector.test_add_connectorc                 C   s(   t  }t }|| ||v sJ d S r
   )r$   r%   rG   rH   rI   r   r   r   test_contains   s   
z#TestCallbackConnector.test_containsc                 C   s,   t  }t }|| ||v sJ ddS )z5Test adding a CountCallback to the CallbackConnector.z0CountCallback should be in the CallbackConnectorN)r$   r%   CountCallbackrH   r   	connectorcount_callbackr   r   r   test_add_count_callback   s   
z-TestCallbackConnector.test_add_count_callbackc                 C   s<   t  }t }|| |d |jd dksJ ddS )z7Test if the event triggers the method in CountCallback.rD   r-   z6CountCallback's method should have been triggered onceN)r$   r%   rV   rH   rM   countsrW   r   r   r   &test_event_trigger_with_count_callback   s   

z<TestCallbackConnector.test_event_trigger_with_count_callbackrC   N)	r   r   r   rL   rO   rT   rU   rZ   r\   r   r   r   r   rB   r   s    


	rB   c                   @   s   e Zd Zdd Zdd ZdS )rG   c                 C      d S r
   r   r   r   r   r   rD      r   z#TestCallback.on_megatron_step_startc                 C   r^   r
   r   r_   r   r   r   rE      r   z)TestCallback.on_megatron_microbatch_startN)r   r   r   rD   rE   r   r   r   r   rG      s    rG   c                   @   sf   e Zd ZdddZdddZdddZdd	d
ZdddZdddZdddZ	dddZ
dddZdS )rV   rC   Nc                 C   s   t t| _d S r
   )r   intr[   r_   r   r   r   r      s   zCountCallback.__init__c                 O      | j d  d7  < d S )NrD   r-   r[   r   argskwargsr   r   r   rD         z$CountCallback.on_megatron_step_startc                 O   ra   )NrE   r-   rb   rc   r   r   r   rE      rf   z*CountCallback.on_megatron_microbatch_startc                 O   ra   )N!on_megatron_microbatches_callbackr-   rb   rc   r   r   r   on_megatron_microbatch_callback      z-CountCallback.on_megatron_microbatch_callbackc                 O   ra   )Non_megatron_microbatches_endr-   rb   rc   r   r   r   on_megatron_microbatch_end   ri   z(CountCallback.on_megatron_microbatch_endc                 O   ra   )N%on_megatron_reduce_microbatches_startr-   rb   rc   r   r   r   rl      ri   z3CountCallback.on_megatron_reduce_microbatches_startc                 O   ra   )N#on_megatron_reduce_microbatches_endr-   rb   rc   r   r   r   rm      ri   z1CountCallback.on_megatron_reduce_microbatches_endc                 O   ra   )Non_megatron_log_step_endr-   rb   rc   r   r   r   rn      ri   z&CountCallback.on_megatron_log_step_endc                 O   ra   )Non_megatron_step_endr-   rb   rc   r   r   r   ro      ri   z"CountCallback.on_megatron_step_endr]   )r   r   r   r   rD   rE   rh   rk   rl   rm   rn   ro   r   r   r   r   rV      s    







rV   )collectionsr   unittest.mockr   r@   megatron.corer   torchr   nemor   r   nemo.lightningr   r$   r	   rB   rG   rV   r   r   r   r   <module>   s   XE