o
    0ia                     @   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du}|j|jd |j|jjd	}	|	j|j |r|	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rF|sF|rFt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
   e/sda-disk/www/egybert/egybert_env/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(      st   



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_autocastv   s   rB   c                 C   s.  t  stdt rddlm} d}d}nddlm  m} ddlm} |j	
 \}}|dur3| ni }d|v rCt|j|d |d< |dd}|dd}|rZ|sZtd	| |rud
|v rdtdd|v rltd|jdi |}	n|jdi |}	t| j|	|}
t| jdrt|
| | _| S |
| _| S )zC
    Applies FP8 context manager to the model's forward method
    zGUsing `apply_fp8_autowrap` requires transformer_engine to be installed.r   NFz,MXFP8 block scaling is not available on HPU.
fp8_formatuse_autocast_during_evaluse_mxfp8_block_scalingz&MXFP8 block scaling is not available: amax_compute_algoz=`amax_compute_algo` is not supported for MXFP8 block scaling.amax_history_lenz<`amax_history_len` is not supported for MXFP8 block scaling.__func__r
   )r   r   r   intel_transformer_engine.reciperecipe transformer_engine.common.recipecommonr   r   fp8check_mxfp8_support	to_kwargsgetattrFormatpop
ValueErrorMXFP8BlockScalingDelayedScalingrB   r@   r   r   )r)   fp8_recipe_handler	te_recipeis_fp8_block_scaling_availablemessager*   r<   r?   rE   r8   new_forwardr
   r
   r   apply_fp8_autowrap   s:   r[   )TTT)F)typesr   torch.nnr   importsr   r   
operationsr   r(   r5   rB   r[   r
   r
   r
   r   <module>   s   
E
