o
    wiPz                     @   s   d Z ddlZddlmZ ddlmZ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 dd	lmZmZmZmZmZmZ G d
d dZG dd dZdS )z%Unit tests for OneLoggerNeMoCallback.    N)SimpleNamespace)	MagicMockpatch)Callback)ModelCheckpoint)	OmegaConf)BaseCallback)OneLoggerNeMoCallback_get_base_callback_config_should_enable_for_current_rankget_nemo_v1_callback_configget_nemo_v2_callback_configget_one_logger_init_configc                   @   sL   e Zd ZdZdd Zedededededd	d
dd Zd	S )TestOneLoggerNeMoCallbackz%Test suite for OneLoggerNeMoCallback.c           
      C   sB  t d}t dv}t db}t dN}t d:}ddd|_t }||_t }t |_d	|j_||j_t }||_t }	t|	tsDJ t|	t	sKJ W d	   n1 sUw   Y  W d	   n1 sdw   Y  W d	   n1 ssw   Y  W d	   n1 sw   Y  W d	   d	S W d	   d	S 1 sw   Y  d	S )
zKTest that OneLoggerNeMoCallback properly inherits from both parent classes.7nemo.lightning.one_logger_callback.OneLoggerPTLCallback<nemo.lightning.one_logger_callback.TrainingTelemetryProvider=nemo.lightning.one_logger_callback.get_one_logger_init_config2nemo.lightning.one_logger_callback.OneLoggerConfig/nemo.lightning.one_logger_callback.on_app_starttesttest-session)application_namesession_tag_or_fnN)
r   return_valuer   configtelemetry_configinstancer	   
isinstancer   PTLCallback)
selfmock_ptl_callbackmock_providermock_get_configmock_config_classmock_on_app_startmock_config_instancemock_provider_instancemock_ptl_callback_instancecallback r)   e/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/tests/lightning/test_one_logger_callback.pytest_inheritance(   sD     P z*TestOneLoggerNeMoCallback.test_inheritancer   r   r   r   @nemo.lightning.one_logger_callback.OneLoggerPTLCallback.__init__Nr   c           	      C   s   ddddd}||_ t }||_ t }t |_d|j_||j_ t  |  |jd	i | |j| |jj j	  |jj j	j j
  |j|dd |  dS )
z>Test that __init__ properly configures the OneLogger provider.nemor   T   )r   r   enable_for_current_rankworld_size_or_fnNFcall_on_app_startr)   )r   r   r   r   r   r	   assert_called_onceassert_called_once_withwith_base_configwith_export_configconfigure_provider)	r   mock_ptl_callback_initr$   r#   r"   r!   mock_init_configr%   r&   r)   r)   r*   test_init_configures_providerD   s(   z7TestOneLoggerNeMoCallback.test_init_configures_provider)__name__
__module____qualname____doc__r+   r   r;   r)   r)   r)   r*   r   %   s    
r   c                	   @   s  e Zd ZdZejjdd Zejjdd Zejjdd Z	ejjdd	 Z
ejjd
d Zejjdd Zejjdd Zejjdd Zejjdd Zejjdd Zejjdd Zejjdd Zejjdd Zejjdd Zejjdd Zed ed!ed"ed#ed$ed%ed&d'd( Zed ed)ed"ed#ed$ed%ed&d*d+ Zed ed!ed"ed#ed$ed%ed&d,d- Zed ed)ed"ed#ed$ed%ed&d.d/ Zed ed)ed"ed#ed$ed%ed&d0d1 Zd2d3 Zeejd4d5d6ed ed#ed$ed%ed&d7d8 Z ed ed!ed"ed#ed$ed%ed&d9d: Z!d;d< Z"ed ed#ed$ed%ed=d>d?d@dA Z#d>S )BTestOneLoggerCallbackz5Test cases for one_logger_callback utility functions.c                 C   s   t tjddd1 t }t|tsJ |d dksJ |d dks%J d|v s+J |d d	ks3J W d
   d
S 1 s>w   Y  d
S )zFTest get_one_logger_init_config returns correct minimal configuration.test_job4SLURM_JOB_NAME
WORLD_SIZEr   r.   r   r0   r1      N)r   dictosenvironr   r   r   r   r)   r)   r*   test_get_one_logger_init_confign   s   "z5TestOneLoggerCallback.test_get_one_logger_init_configc                 C   sb   t jtjddidd t }|d dksJ |d dksJ W d	   d	S 1 s*w   Y  d	S )
z?Test get_one_logger_init_config when SLURM_JOB_NAME is not set.rE   1Tclearr   znemo-runr1   r/   N)r   rG   rH   rI   r   rJ   r)   r)   r*   (test_get_one_logger_init_config_no_slurmz   s
   "z>TestOneLoggerCallback.test_get_one_logger_init_config_no_slurmc                 C   s  t  }d|_g |_d|_d|_d|_ttj	dddd` t
|d	d
d}|d dks-J |d d	ks5J |d dks=J |d d
ksEJ |d dksMJ |d dksUJ |d dks]J |d du seJ |d du smJ |d dksuJ W d   dS 1 sw   Y  dS )z8Test _get_base_callback_config with basic trainer setup.  g      ?N
   rA   rB   z1.0.0)rD   rE   PERF_VERSION_TAG       trainerglobal_batch_size
seq_lengthperf_tag_or_fnztest_job_1.0.0_bf32_se512_ws4global_batch_size_or_fnmicro_batch_size_or_fn   seq_length_or_fntrain_iterations_target_or_fntrain_samples_target_or_fni }  log_every_n_train_iterations&is_validation_iterations_enabled_or_fnT is_save_checkpoint_enabled_or_fnFsave_checkpoint_strategysync)r   	max_steps	callbacksval_check_intervalstrategylog_every_n_stepsr   rG   rH   rI   r
   r   rV   r   r)   r)   r*   test_get_base_callback_config   s&   "z3TestOneLoggerCallback.test_get_base_callback_configc                 C   s   t  }d|_d|_tddd}|g|_ttjddd  t	|d	d
d}|d du s-J |d du s5J W d   dS 1 s@w   Y  dS )zCTest _get_base_callback_config when checkpoint callback is present.rP   r   .)dirpath
save_top_krA   2rC         rU   rb   Tra   FN)
r   re   rg   r   rf   r   rG   rH   rI   r
   )r   rV   checkpoint_callbackr   r)   r)   r*   6test_get_base_callback_config_with_checkpoint_callback   s   "zLTestOneLoggerCallback.test_get_base_callback_config_with_checkpoint_callbackc                 C   s   t  }d|_g |_d|_t  }d|_||_ttj	ddi t
|ddd}|d	 d
ks.J W d   dS 1 s9w   Y  dS )z8Test _get_base_callback_config with async save strategy.rP   r   TrE   rL   r\      rU   rc   asyncN)r   re   rf   rg   
async_saverh   r   rG   rH   rI   r
   )r   rV   rh   r   r)   r)   r*   (test_get_base_callback_config_async_save   s   "z>TestOneLoggerCallback.test_get_base_callback_config_async_savec                 C   sx   t  }d|_g |_d|_ddi|_ttjddi t	|ddd	}|d
 dks*J W d   dS 1 s5w   Y  dS )z2Test _get_base_callback_config with dict strategy.rP   r   rw   TrE   rL   r\   ru   rU   rc   rv   N)
r   re   rf   rg   rh   r   rG   rH   rI   r
   rj   r)   r)   r*   +test_get_base_callback_config_dict_strategy   s   
"zATestOneLoggerCallback.test_get_base_callback_config_dict_strategyc                 C   s   t  }d|_d|_t  }tddiddid|_||_tt	j
dd	i% t|}|d
 dks2J |d dks:J |d dksBJ W d   dS 1 sMw   Y  dS )z:Test get_nemo_v1_callback_config with model configuration.i  r   
batch_sizer\   d_modeli   train_dsencoderrE   rp   rZ   rq   r]   r^   Nr   re   rg   r   createcfglightning_moduler   rG   rH   rI   r   r   rV   	pl_moduler   r)   r)   r*    test_get_nemo_v1_callback_config   s   "z6TestOneLoggerCallback.test_get_nemo_v1_callback_configc                 C   s   t  }d|_d|_t  }tdg diddid|_||_tt	j
dd	i t|}|d
 dks4J |d dks<J W d   dS 1 sGw   Y  dS )zDTest get_nemo_v1_callback_config with bucket batch sizes (ASR case).rP   r   bucket_batch_size)rF   r\      r{   rT   r|   rE   rL   rZ   r\   r]   Nr   r   r)   r)   r*   2test_get_nemo_v1_callback_config_bucket_batch_size   s   "zHTestOneLoggerCallback.test_get_nemo_v1_callback_config_bucket_batch_sizec                 C   sf   t  }d|_d|_t  }ti |_||_t|}|d dks!J |d dks)J |d dks1J dS )z6Test get_nemo_v1_callback_config with fallback values.d   r   rZ   r/   r]   r^   N)r   re   rg   r   r   r   r   r   r   r)   r)   r*   )test_get_nemo_v1_callback_config_fallback   s   z?TestOneLoggerCallback.test_get_nemo_v1_callback_config_fallbackc                 C   s   t  }d|_d|_t  }d|_d|_ttjddi' t	||d}|d dks*J |d	 dks2J |d
 dks:J W d   dS 1 sEw   Y  dS )z2Test get_nemo_v2_callback_config with data module.   r   @      rE   rB   rV   datarZ   r]   r^   N)
r   re   rg   rW   rX   r   rG   rH   rI   r   r   rV   r   r   r)   r)   r*    test_get_nemo_v2_callback_config  s   "z6TestOneLoggerCallback.test_get_nemo_v2_callback_configc                 C   s   t  }d|_d|_tddd}ttjddi t||d}W d	   n1 s)w   Y  |d
 dks6J |d dks>J |d dksFJ d	S )zcTest v2 config computes global_batch_size via micro_batch_size * WORLD_SIZE when global is missing.r   r   r\      )micro_batch_sizerX   rE   rB   r   NrZ   rS   r]   r^   )	r   re   rg   r   r   rG   rH   rI   r   r   r)   r)   r*   ?test_get_nemo_v2_callback_config_uses_micro_when_global_missing  s   zUTestOneLoggerCallback.test_get_nemo_v2_callback_config_uses_micro_when_global_missingc                 C   sR   t  }d|_d|_t|dd}|d dksJ |d dksJ |d dks'J dS )	z5Test get_nemo_v2_callback_config without data module.i,  r   Nr   rZ   r/   r]   r^   )r   re   rg   r   rj   r)   r)   r*   (test_get_nemo_v2_callback_config_no_data(  s   z>TestOneLoggerCallback.test_get_nemo_v2_callback_config_no_datac                 C   sJ   t jtji dd t }|du sJ W d   dS 1 sw   Y  dS )z8Test _should_enable_for_current_rank if rank is not set.TrM   FNr   rG   rH   rI   r   r   resultr)   r)   r*   2test_should_enable_for_current_rank_single_process5  s   "zHTestOneLoggerCallback.test_should_enable_for_current_rank_single_processc                 C   L   t tjddd t }|du sJ W d   dS 1 sw   Y  dS )zHTest _should_enable_for_current_rank for rank 0 in distributed training.0rB   RANKrE   TNr   r   r)   r)   r*   5test_should_enable_for_current_rank_distributed_rank0<     "zKTestOneLoggerCallback.test_should_enable_for_current_rank_distributed_rank0c                 C   r   )zMTest _should_enable_for_current_rank for middle rank in distributed training.rL   rB   r   FNr   r   r)   r)   r*   ;test_should_enable_for_current_rank_distributed_middle_rankC  r   zQTestOneLoggerCallback.test_should_enable_for_current_rank_distributed_middle_rankr   z>nemo.lightning.one_logger_callback.get_nemo_v1_callback_configz:nemo.lightning.one_logger_callback.TrainingTelemetryConfigr   r   r   r   c                 C   s   ddi|_ t |_ t }t |_d|j_||j_ t |_ ddddd}	|	|_ t }
|
|_ t }t }|jd	|d
 |j|d |jdi |	 |j|
 dS )z*Test update_config with nemo_version='v1'.r   r   Ntest-jobr/   rS   r   job_name
world_sizerW   rX   v1nemo_versionrV   rV   r)   	r   r   r   r   r   r	   update_configr5   set_training_telemetry_configr   r    r$   r#   r"   mock_telemetry_config_classmock_get_v1_configr!   r&   mock_v1_configmock_telemetry_config_instancer(   rV   r)   r)   r*   test_update_config_v1J  s"   
z+TestOneLoggerCallback.test_update_config_v1z>nemo.lightning.one_logger_callback.get_nemo_v2_callback_configc                 C   s   ddi|_ t |_ t }t |_d|j_||j_ t |_ ddddd}	|	|_ t }
|
|_ t }t }t }|jd	||d
 |j||d |jdi |	 |j|
 dS )z:Test update_config with nemo_version='v2' and data module.r   r   Ntest-job-v2   r   r   r   v2)r   rV   r   r   r)   r   r   r    r$   r#   r"   r   mock_get_v2_configr!   r&   mock_v2_configr   r(   rV   data_moduler)   r)   r*   test_update_config_v2w  s$   
z+TestOneLoggerCallback.test_update_config_v2c                 C   s   ddi|_ t |_ t }t |_d|j_||j_ t |_ ddi}	|	|_ t }
|
|_ t }t }|jd|d |j|d |jd	i |	 |j|
 dS )
z7Test update_config with unknown version defaults to v1.r   r   Nr   r   unknownr   r   r)   r   r   r)   r)   r*   1test_update_config_unknown_version_defaults_to_v1  s"   
zGTestOneLoggerCallback.test_update_config_unknown_version_defaults_to_v1c                 C   s   ddi|_ t |_ t }t |_d|j_||j_ t |_ ddi}	|	|_ t }
|
|_ t }t }|jd|d |j|dd |jd	i |	 |j|
 dS )
zFTest update_config with nemo_version='v2' but no data module provided.r   r   Nr   r   r   r   r   r)   r   )r   r    r$   r#   r"   r   r   r!   r&   r   r   r(   rV   r)   r)   r*   "test_update_config_v2_without_data  s"   
z8TestOneLoggerCallback.test_update_config_v2_without_datac                 C   s   ddi|_ t |_ t }t |_d|j_||j_ t |_ ddi}	|	|_ t }
|
|_ t }t }t }|jd||ddd	 |j||d
 |jdi |	 |j|
 dS )z;Test update_config with nemo_version='v2' and extra kwargs.r   r   Nr   r   r   value1value2)r   rV   r   extra_param1extra_param2r   r)   r   r   r)   r)   r*   'test_update_config_v2_with_extra_kwargs  s(   

z=TestOneLoggerCallback.test_update_config_v2_with_extra_kwargsc                 C   s   ddl m} d|v sJ dS )z0Test that __all__ contains the expected symbols.r   )__all__r	   N)"nemo.lightning.one_logger_callbackr   )r   r   r)   r)   r*   test_export_all_symbols/  s   z-TestOneLoggerCallback.test_export_all_symbolstest-experimentrB   )EXP_NAMErE   c                 C   s   dddd|_ t |_ t }t |_d|j_||j_ t |_ t  |  |  |jd }|d dks6J |d dks>J dS )	z3Test initialization with environment variables set.r.   r   rF   )r   r   r1   Nr/   r   r1   )r   r   r   r   r   r	   r4   	call_args)r   r    r$   r#   r"   r!   r&   r   r)   r)   r*   $test_init_with_environment_variables5  s    
z:TestOneLoggerCallback.test_init_with_environment_variablesc                 C   s   ddi|_ t |_ t }t |_d|j_||j_ t |_ i |_ t }	|	|_ t }
t }|
jd|d |jdi i  |j|	 dS )z7Test update_config with empty configuration dictionary.r   r   Nr   r   r)   r   )r   r    r$   r#   r"   r   r   r!   r&   r   r(   rV   r)   r)   r*   $test_update_config_with_empty_configX  s   
z:TestOneLoggerCallback.test_update_config_with_empty_configc              	   C   sz   t dtdd+ tjtdd t  W d   n1 sw   Y  W d   dS W d   dS 1 s6w   Y  dS )zPTest that callback instantiation without proper mocks raises appropriate errors.r,   zHwith_base_config can be called only before configure_provider is called.)side_effect)matchN)r   	Exceptionpytestraisesr	   )r   r)   r)   r*   =test_callback_instantiation_without_mocks_raises_import_error  s   "zSTestOneLoggerCallback.test_callback_instantiation_without_mocks_raises_import_errorr,   Nr-   c           	      C   s   ddi|_ t }||_ t }t |_d|j_||j_ t  |j| |jj }|j	  |jj j
	  |j|dd |  dS )zFTest that the provider configuration chain is called in correct order.r   r   NFr2   )r   r   r   r   r   r	   r6   r5   r7   r4   r8   )	r   r9   r$   r#   r"   r!   r%   r&   chain_resultr)   r)   r*   test_init_provider_chain_calls  s   


z4TestOneLoggerCallback.test_init_provider_chain_calls)$r<   r=   r>   r?   r   markunitrK   rO   rk   rt   rx   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rG   rH   rI   r   r   r   r   r)   r)   r)   r*   r@   k   s    














&'&&)%
r@   )r?   rH   typesr   unittest.mockr   r   r   lightning.pytorch.callbacksr   r   r   	omegaconfr   nemo.lightning.base_callbackr   r   r	   r
   r   r   r   r   r   r@   r)   r)   r)   r*   <module>   s    
F