
    
9jq                     X    S SK Jr  S SKJr  SSKJrJr  SSKJr  S
S jr	S r
SS jrS	 rg)    )
MethodTypeN   )is_hpu_availableis_transformer_engine_available)GatheredParametersc           	      	   [        5       (       d  [        S5      e[        5       (       a+  SSKn[	        US5      (       d  [
        R                  Ul        OSSKJn  U R                  5        GH  u  pV[        U[
        R                  5      (       Ga/  U(       Ga'  U(       Ga  UR                  SLnUR                  /nU(       a  UR                  UR                  5        [        USS9   [!        S UR                  R"                   5       5      (       a   SSS5          gUR                  UR$                  UR&                  XvR                  R(                  S9n	U	R                  R+                  UR                  5        U(       a%  U	R                  R+                  UR                  5        [-        XU	5        SSS5        GMU  [        U[
        R                  5      (       a  U(       a  U(       a  [        UR                  UR                  /SS9   UR                  SLnUR                  UR.                  S   UR0                  UR                  R(                  S9n	U	R                  R+                  UR                  5        U(       a%  U	R                  R+                  UR                  5        SSS5        [-        XW	5        GMU  [        XdR                  5      (       a  U(       d  U(       a  UR                  SLn[
        R                  " UR$                  UR&                  XvR                  R(                  S9n
U
R                  R+                  UR                  5        U(       a%  U
R                  R+                  UR                  5        [-        XU
5        GM)  [        XdR                  5      (       a  U(       d  U(       a  [
        R                  " UR.                  S   UR0                  UR                  R(                  S9n
U
R                  R+                  UR                  5        U
R                  R+                  UR                  5        [-        XU
5        GM  [3        UUUUS	9  GM     g! , (       d  f       GM  = f! , (       d  f       GN= f)
zm
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              3   0   #    U  H  oS -  S:g  v   M     g7f)   r   N ).0ps     ]/home/wildlama/miniconda3/lib/python3.13/site-packages/accelerate/utils/transformer_engine.py	<genexpr> convert_model.<locals>.<genexpr>2   s     @,?q2v{,?s   )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_modules              r   r,   r,      s(    +,,^__-r;''<<BL/,,.fbii((-B{{$.H & ''4#$4AF@FMM,?,?@@@ GF II&&(;(;(YfYfYlYl & 	   &&v}}5NN((5Y/ GF --2GK#V]]FKK$@PQR!;;d2LL)@)@)CbhbobobubuLv	  &&v}}5NN((5 S E+		**3H_{{$.H""F$7$7hUbUbUhUhJ ##FMM2%%fkk2E,--6KP[f&=&=a&@fjj_e_l_l_r_rsJ##FMM2OO!!&++.E,&; /'	[ / GF SRs    (-Q(BQ(BQ;(
Q8	;
R
	c                    [        5       (       d  [        S5      e[        5       (       a  SSKnUR                  nO)SSKJn  UR                  UR                  UR                  4nU R                  5        H  n[        X25      (       d  M    g   g)zK
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ms       r   has_transformer_engine_layersr:   _   sp     +,,noo- ii/!||RYY8K8KL]]_a--      c                    ^ ^^^ [        5       (       d  [        S5      e[        5       (       a  SSKJm  OSSKJm  UUU U4S jnT Ul        U$ )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                    > T=(       d    U R                   nT" UTS9   T" U0 UD6sS S S 5        $ ! , (       d  f       g = f)N)enabled
fp8_recipe)training)selfargskwargsr?   r=   r@   model_forwarduse_during_evals       r   forward(contextual_fp8_autocast.<locals>.forward   s5    !2T]]'jA $1&1 BAAs   0
>)r   r   r   r   r=   r   __wrapped__)rE   r@   rF   rG   r=   s   ``` @r   contextual_fp8_autocastrJ   v   sB    
 +,,hii9;2 2 (GNr;   c                    [        5       (       d  [        S5      e[        5       (       a  SSKJn  SnSnOSSKJs  Jn  SSKJn  U" 5       u  p4Ub  UR                  5       O0 nSU;   a  [        UR                  US   5      US'   UR                  SS5      nUR                  S	S5      nU(       a  U(       d  [        S
U 35      eU(       a5  SU;   a  [        S5      eSU;   a  [        S5      eUR                  " S0 UD6n	OUR                  " S0 UD6n	[!        U R"                  X5      n
[%        U R"                  S5      (       a  ['        X5      U l        U $ Xl        U $ )z;
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.)check_mxfp8_support
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commontransformer_engine.pytorch.fp8rL   	to_kwargsgetattrFormatpop
ValueErrorMXFP8BlockScalingDelayedScalingrJ   rG   r   r   )r-   fp8_recipe_handler	te_recipeis_fp8_block_scaling_availablemessagerL   rD   rF   rO   r@   new_forwards              r   apply_fp8_autowraprd      sO    +,,cdd;).&@ 	=<F2E2G/&/A/M))+SUFv&y'7'79MN|jj!;UCO$jj)BEJ'EA'KLL&(\]]'[\\00:6:
--77
)%--UKu}}j))";6 L $Lr;   )TTT)F)typesr   torch.nnr   importsr   r   
operationsr   r,   r:   rJ   rd   r   r;   r   <module>ri      s)      F *BJ.0,r;   