o
    wi                     @   s   d dl Z d dlmZmZ d dlZd dlZd dlmZ d dlm	Z	 defddZ
	ddeeeejjf  d	ee d
ee deejjddf fddZdejjdefddZdS )    N)	GeneratorIterable)LightningModule)loggingmodelc                 C   s   t | ds	J dd| jv sJ dt|  | jdg | jdg d}tjj| jj|dd	}d|i}d
| jv rJtj| jj	|}|ddd|d
< |S )a  
    Re-usable optimizer configuration function for top-level PyTorch Lightning modules in this collection.
    It sets up parameter freezing, optimizer, and LR scheduler.

    The ``model`` object is expected to have a ``model.cfg`` attribute with OmegaConf configuration.
    The following fields are expected:

    * ``optimizer`` with hydra-style ``_target_`` pointing to optimizer class, and the remaining options
        passed directly to its ``__init__`` method.

    * (optional) ``freeze_params`` with a list of regex pattern for identifying frozen parameters.

    * (optional) ``prevent_freeze_params`` with a list of regex pattern for keeping specific parameters trainable
        (overrides ``freeze_params``).

    * (optional) ``lr_scheduler`` with hydra-style ``_target_`` pointing to LR scheduler class,
        and the remaining options passed directly to its ``__init__`` method.

    Returns:
        PyTorch Lightning Trainer-compatible dict with structure::

            {
                "optimizer": <optimizer>,
                "lr_scheduler": {"scheduler": <lr_scheduler>, "interval": "step", "frequency": 1}
            }

    cfgz(Expected `model.cfg` attribute to exist.	optimizerz:Expected `model.cfg` to contain 'optimizer' configuration.freeze_paramsprevent_freeze_params)exclude_patternskeep_patternsall)	_convert_lr_schedulerstep   )	schedulerinterval	frequency)
hasattrr   freeze_and_subsetnamed_parametersgethydrautilsinstantiater   r   )r   
parametersr   ansr    r   i/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/nemo/collections/speechlm2/parts/optim_setup.pyconfigure_optimizers   s   
r    r   r   r   returnc                 #   s   dd |D |si dt fdd}ndd |D dd |D d	tdt ffd
d}dd |D  d	tdt f fdd}d\}}| D ]%\}}d}	||rZ||sZd|_d}	|	sf|V  || 7 }qG|| 7 }qG|| }
td| d||
 dd|
  dd  D  }rdd| d }td| d dd  D  }rdd| d }td| d dS dS )a  
    Utility used to freeze select model parameters, and skip them for the purpose
    of initializing an optimizer's parameter group.

    Args:
        named_parameters: The output of `torch.nn.Module.named_parameters()`
        exclude_patterns: A list of regex patterns matching parameter names to be frozen
            and excluded from optimization.
        keep_patterns: A list of regex patterns matching parameter names to be trained.
            This list overrides all matches to `exclude_patterns`.

    Returns:
        A generator over parameters, equivalent to calling `torch.nn.Module.parameters()`,
            that will be passed to the optimizer and trained.

    Example:

        >>> model = MyModel()
        ... # freeze all LLM parameters in "model.llm"
        ... params = freeze_and_subset(model.named_parameters(), [r'^llm\.\..+$'])
        ... optimizer = torch.optim.AdamW(params, lr=1e-3)

    c                 S      i | ]}|d qS r   r   .0pr   r   r   
<dictcomp>_       z%freeze_and_subset.<locals>.<dictcomp>r!   c                 S   s   dS )NFr   )_r   r   r   
_must_keepd   s   z%freeze_and_subset.<locals>._must_keepc                 S   r"   r#   r   r$   r   r   r   r'   h   r(   c                 S      g | ]}t |qS r   recompiler$   r   r   r   
<listcomp>i       z%freeze_and_subset.<locals>.<listcomp>namec                    4    D ]}| | d ur|j  d7  <  dS qdS Nr   TFmatchpatternr1   r&   )compiled_keep_patternskeep_counterr   r   r*   k      c                 S   r+   r   r,   r$   r   r   r   r/   r   r0   c                    r2   r3   r4   r7   )compiled_exclude_patternsexclude_counterr   r   _excludet   r:   z#freeze_and_subset.<locals>._exclude)r   r   FTzParameters | trainable=z (z.2%z
) | total=c                 S      g | ]
\}}|d kr|qS r#   r   r%   kvr   r   r   r/          z['z', 'z']z=Parameter freezing patterns UNMATCHED against any parameter: z (bad regexp?)c                 S   r>   r#   r   r?   r   r   r   r/      rB   zFParameter freeze-preventing patterns UNMATCHED against any parameter: N)	boolstrrequires_gradnumelr   infoitemsjoinwarning)r   r   r   r*   r=   	trainablenontrainabler1   paramdiscardtotalunused_excluded_patternsmsgunused_keep_patternsr   )r;   r8   r<   r9   r   r   C   s:   "r   modulec                 C   s   t dd |  D S )Nc                 s   s    | ]}|j  V  qd S N)rE   r$   r   r   r   	<genexpr>   s    zis_frozen.<locals>.<genexpr>)r   r   )rS   r   r   r   	is_frozen   s   rV   rT   )r-   typingr   r   r   torch	lightningr   
nemo.utilsr   r    tuplerD   nn	Parameterlistr   ModulerC   rV   r   r   r   r   <module>   s$   .
P