
    /h                     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                  UR.                  S   UR0                  UR                  R(                  S9n	U	R                  R+                  UR                  5        U	R                  R+                  UR                  5        SSS5        [-        XW	5        GM@  [        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/james-whalen/.local/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LL)@)@)CbhbobobubuLv	  &&v}}5$$V[[1 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,&; /'	W / GF SRs    (-QBQBQ&
Q#	&
Q5	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   t   sB    
 +,,hii9;2 2 (GNr;   c                    [        5       (       d  [        S5      e[        5       (       a  SSKJn  O	SSKJs  Jn  U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0 UD6n[        U R                  XT5      n[        U R                  S5      (       a  [        X`5      U l        U $ X`l        U $ )	z;
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DelayedScalingrJ   rG   r   r   )r-   fp8_recipe_handler	te_reciperD   rF   r@   new_forwards          r   apply_fp8_autowrapr[      s     +,,cdd;<</A/M))+SUFv&y'7'79MN|jj!;UCO))3F3J)%--UKu}}j))";6 L $Lr;   )TTT)F)typesr   torch.nnr   importsr   r   
operationsr   r,   r:   rJ   r[   r   r;   r   <module>r`      s)      F *@F.0r;   