o
    3wi                     @   s\   d dl mZ d dlmZ ddlmZmZ ddlmZ dddZ	d	d
 Z
dddZdd ZdS )    )
MethodTypeN   )is_hpu_availableis_transformer_engine_available)GatheredParametersTc              	   C   s  t  stdt rddl}t|dstj|_nddlm} | 	 D ]$\}}t
|tjr|r|r|jdu}|jg}|rB||j t|dd@ tdd |jjD r^	 W d    dS |j|j|j||jjd}	|	j|j |r{|	j|j t| ||	 W d   n1 sw   Y  q"t
|tjr|r|rt|j|jgdd$ |j|jd |j|jjd	}	|	j|j |	j|j W d   n1 sw   Y  t| ||	 q"t
||jr|s|r|jdu}tj|j|j||jjd}
|
j|j |r|
j|j t| ||
 q"t
||jr?|s?|r?tj|jd |j|jjd	}
|
j|j |
j|j t| ||
 q"t||||d
 q"dS )zu
    Recursively converts the linear and layernorm layers of a model to their `transformers_engine` counterpart.
    zBUsing `convert_model` requires transformer_engine to be installed.r   N	LayerNorm)modifier_rankc                 s   s    | ]	}|d  dkV  qdS )   r   N ).0pr
   r
   `/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/accelerate/utils/transformer_engine.py	<genexpr>2   s    z convert_model.<locals>.<genexpr>)biasparams_dtype)epsr   )to_transformer_engine_convert_linear_convert_ln)r   ImportErrorr   intel_transformer_enginehasattrnnr   transformer_engine.pytorchpytorchnamed_children
isinstanceLinearr   weightappendr   anyshapein_featuresout_featuresdtypecopy_setattrnormalized_shaper   convert_model)modelr   r   r   tenamemodulehas_biasparams_to_gather	te_module
new_moduler
   r
   r   r(      sn   


r(   c                 C   sb   t  stdt rddl}|j}nddlm} |j|j|jf}| 	 D ]
}t
||r. dS q$dS )zS
    Returns whether a given model has some `transformer_engine` layer or not.
    zRUsing `has_transformer_engine_layers` requires transformer_engine to be installed.r   NTF)r   r   r   r   r   r   r   r   TransformerLayermodulesr   )r)   r*   module_cls_to_checkmr
   r
   r   has_transformer_engine_layers]   s   
r5   Fc                    sJ   t  stdt rddlm  nddlm   fdd}|_|S )z
    Wrapper for a model's forward method to apply FP8 autocast. Is context aware, meaning that by default it will
    disable FP8 autocast during eval mode, which is generally better for more accurate metrics.
    zLUsing `contextual_fp8_autocast` requires transformer_engine to be installed.r   )fp8_autocastc                    sH   p| j } |d |i |W  d    S 1 sw   Y  d S )N)enabled
fp8_recipe)training)selfargskwargsr7   r6   r8   model_forwarduse_during_evalr
   r   forward   s   
$z(contextual_fp8_autocast.<locals>.forward)r   r   r   r   r6   r   __wrapped__)r>   r8   r?   r@   r
   r=   r   contextual_fp8_autocastt   s   rB   c                 C   s   t  stdt rddlm} n	ddlm  m} |dur"| ni }d|v r2t|j	|d |d< |
dd}|jdi |}t| j||}t| jdrUt|| | _| S || _| S )	zC
    Applies FP8 context manager to the model's forward method
    zGUsing `apply_fp8_autowrap` requires transformer_engine to be installed.r   N
fp8_formatuse_autocast_during_evalF__func__r
   )r   r   r   intel_transformer_engine.reciperecipe transformer_engine.common.recipecommon	to_kwargsgetattrFormatpopDelayedScalingrB   r@   r   r   )r)   fp8_recipe_handler	te_reciper<   r?   r8   new_forwardr
   r
   r   apply_fp8_autowrap   s    rR   )TTT)F)typesr   torch.nnr   importsr   r   
operationsr   r(   r5   rB   rR   r
   r
   r
   r   <module>   s   
C
