Ë
    GêñiÈ7  ã                   ó”  — d dl mZ ddlmZ ddlmZ ddlmZmZ ddl	m
Z
mZmZmZmZ  e«       r
d dlZd dlmZ  e
«       rd d	lmZ  e«       Z e«       resd dlZ ej,                  e«      Z G d
„ de«      Z G d„ dej                   j4                  «      Z G d„ dej8                  «      Z ed¬«      d„ «       Z	 ddee    dz  fd„Z!y)é    )Ú	lru_cacheé   )ÚACT2FN)ÚConversionOps)Úget_module_from_nameÚshould_convert_module)Úis_accelerate_availableÚis_fbgemm_gpu_availableÚis_torch_availableÚis_torch_xpu_availableÚloggingN)Únn)Úinit_empty_weightsc            	       ó´   — e Zd Zd„ Z	 ddeeej                  eej                     z  f   dej                  j                  dz  deeej                  f   fd„Zy)ÚFbgemmFp8Quantizec                 ó   — || _         y ©N)Úhf_quantizer)Úselfr   s     úf/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/transformers/integrations/fbgemm_fp8.pyÚ__init__zFbgemmFp8Quantize.__init__-   s
   € Ø(ˆÕó    NÚ
input_dictÚmodelÚreturnc                 óz  — t        |j                  «       «      d   \  }}|d   }ddlm} t	        ||«      \  }}t        ||«      �r|dk(  r~|j                  dd«      }	|	j                  }
|	j                  d|
d   «      }t        |«      \  }}|j                  |
«      }|j                  dd«      }|j                  |
d   d|
d   «      }nÍ|dk(  rÈ|j                  dd«      }	|	j                  }
|	j                  d|
d   «      }t        |«      \  }}|j                  |
«      }|j                  dd«      }|j                  |
d   |
d   d«      }nJt        |«      \  }}t        j                  j                  |j                  |j                  d   d«      «      }|t        j                  j                  «      |› d�iS )	Nr   r   )ÚFbgemmFp8Llama4TextExpertsÚgate_up_projé   éÿÿÿÿÚ	down_projÚ_scale)ÚtupleÚitemsÚintegrationsr   r   Ú
isinstanceÚ	transposeÚshapeÚreshapeÚquantize_fp8_per_rowÚtorchr   Ú	ParameterÚview)r   r   r   ÚkwargsÚ
target_keyÚvaluer   ÚmoduleÚtensor_nameÚtransposed_paramÚoriginal_shapeÚflattened_paramÚnew_value_flatÚweight_scale_flatÚ	new_valueÚweight_scales                   r   ÚconvertzFbgemmFp8Quantize.convert0   s×  € ô " *×"2Ñ"2Ó"4Ó5°aÑ8Ñˆ
�EØ�a‘ˆå=ä2°5¸*ÓEÑˆ�ä�fÐ8Õ9Ø˜nÒ,ð $)§?¡?°1°aÓ#8Ð ð "2×!7Ñ!7�Ø"2×":Ñ":¸2¸~ÈbÑ?QÓ"R�ô 5IÈÓ4YÑ1�Ð 1ð +×2Ñ2°>ÓB�	Ø%×/Ñ/°°1Ó5�	Ø0×8Ñ8¸ÈÑ9JÈAÈ~Ð^_ÑO`Óa‘Ø Ò+ð $)§?¡?°1°aÓ#8Ð ð "2×!7Ñ!7�Ø"2×":Ñ":¸2¸~ÈbÑ?QÓ"R�ô 5IÈÓ4YÑ1�Ð 1ð +×2Ñ2°>ÓB�	Ø%×/Ñ/°°1Ó5�	Ø0×8Ñ8¸ÈÑ9JÈNÐ[\ÑL]Ð_`Óa‘ä&:¸5Ó&AÑ#ˆI�|Ü Ÿ8™8×-Ñ-¨l×.?Ñ.?À×@RÑ@RÐSTÑ@UÐWXÓ.YÓZˆLàœEŸH™H×.Ñ.¨yÓ9¸j¸\ÈÐ;PÐR^Ð_Ð_r   r   )Ú__name__Ú
__module__Ú__qualname__r   ÚdictÚstrr+   ÚTensorÚlistr   ÚModuler:   © r   r   r   r   ,   sh   „ ò)ð )-ñ2`à˜˜eŸl™l¨T°%·,±,Ñ-?Ñ?Ð?Ñ@ð2`ð �x‰x�‰ Ñ%ð2`ð
 
ˆc�5—<‘<ÐÑ	 ô2`r   r   c                   ó<   ‡ — e Zd Zej                  fˆ fd„	Zd„ Zˆ xZS )ÚFbgemmFp8Linearc                 ór  •— t         ‰| �  |||«       || _        || _        t        j
                  j                  t	        j                  ||f|¬«      «      | _        t        j
                  j                  t	        j                  |dft        j                  ¬«      «      | _
        | j                  dt	        j                  dgt        j                  ¬«      d¬«       |rRt        j
                  j                  t	        j                  | j                  t        j                  ¬«      «      | _        y d | _        y )N©Údtyper   Úinput_scale_ubF©Ú
persistent)Úsuperr   Úin_featuresÚout_featuresr+   r   r,   ÚzerosÚweightÚfloat32r9   Úregister_bufferÚfloatÚbias)r   rM   rN   rT   rH   Ú	__class__s        €r   r   zFbgemmFp8Linear.__init__f   sÙ   ø€ Ü‰Ñ˜ l°DÔ9Ø&ˆÔØ(ˆÔä—h‘h×(Ñ(¬¯©°lÀKÐ5PÐX]Ô)^Ó_ˆŒÜ!ŸH™H×.Ñ.¬u¯{©{¸LÈ!Ð;LÔTY×TaÑTaÔ/bÓcˆÔØ×ÑÐ-¬u¯{©{¸A¸3ÄeÇkÁkÔ/RÐ_dÐÔeáÜŸ™×*Ñ*¬5¯;©;¸×8IÑ8IÔRW×R_ÑR_Ô+`ÓaˆD�IàˆD�Ir   c                 óæ  — g |j                   d d ¢d‘­}t        |j                  d|j                   d   «      j                  «       | j                  ¬«      \  }}| j
                  j                  t        j                  «      }t        ret        j                  || j                  j                  «       |j                  d«      |j                  «       |j                  | j                  ¬«      }nUt        j                   j"                  j%                  || j                  ||d¬«      }| j                  �|| j                  z   n|}|j                  |j&                  «      }|j)                  |«      }~~|S )Nr    )Úscale_ub)Úscale_aÚscale_bÚ	out_dtyperT   T©Úuse_fast_accum)r(   r*   r-   Ú
contiguousrI   r9   Útor+   rQ   Ú_is_torch_xpu_availableÚ
_scaled_mmrP   ÚtÚ	unsqueezerH   rT   ÚopsÚfbgemmÚf8f8bf16_rowwiseÚdevicer)   )r   ÚxÚoutput_shapeÚx_quantizedÚx_scaleÚweight_scale_float32Úoutputs          r   ÚforwardzFbgemmFp8Linear.forwardt   s0  € à*˜Ÿ™  "˜Ð* rÑ*ˆô  4°A·F±F¸2¸q¿w¹wÀr¹{Ó4K×4VÑ4VÓ4XÐcg×cvÑcvÔwÑˆ�Wð
  $×0Ñ0×3Ñ3´E·M±MÓBÐÝ"Ü×%Ñ%ØØ—‘—‘“Ø×)Ñ)¨"Ó-Ø,×.Ñ.Ó0ØŸ'™'Ø—Y‘Yô‰Fô —Y‘Y×%Ñ%×6Ñ6Ø˜TŸ[™[¨'Ð3GÐX\ð 7ó ˆFð ,0¯9©9Ð+@�V˜dŸi™iÒ'ÀfˆFà—‘˜1Ÿ8™8Ó$ˆØ—‘ Ó-ˆØ˜Øˆr   )r;   r<   r=   r+   Úfloat8_e4m3fnr   rm   Ú__classcell__©rU   s   @r   rE   rE   e   s   ø„ Ø>C×>QÑ>Qõ ör   rE   c                   ó<   ‡ — e Zd Zej                  fˆ fd„	Zd„ Zˆ xZS )r   c                 ón  •— t         ‰| �  «        |j                  | _        |j                  | _        |j
                  | _        | j                  | _        t        |j                     | _	        t        j                  j                  t        j                  | j                  | j
                  d| j                  z  ft        j                  ¬«      «      | _        t        j                  j                  t        j                  | j                  d| j                  dz  ft        j                   ¬«      «      | _        t        j                  j                  t        j                  | j                  | j                  | j
                  ft        j                  ¬«      «      | _        t        j                  j                  t        j                  | j                  | j
                  dft        j                   ¬«      «      | _        | j)                  dt        j                  dgt        j*                  ¬«      d¬«       y )Nr   rG   r   rI   FrJ   )rL   r   Únum_local_expertsÚnum_expertsÚintermediate_sizeÚhidden_sizeÚ
expert_dimr   Ú
hidden_actÚact_fnr+   r   r,   rO   rn   r   rQ   Úgate_up_proj_scaler!   Údown_proj_scalerR   rS   )r   ÚconfigrH   rU   s      €r   r   z#FbgemmFp8Llama4TextExperts.__init__•   sŒ  ø€ Ü‰ÑÔØ!×3Ñ3ˆÔØ!'×!9Ñ!9ˆÔØ!×-Ñ-ˆÔØ×0Ñ0ˆŒÜ˜V×.Ñ.Ñ/ˆŒä!ŸH™H×.Ñ.Ü�K‰K˜×)Ñ)¨4×+;Ñ+;¸QÀÇÁÑ=PÐQÔY^×YlÑYlÔmó
ˆÔô #(§(¡(×"4Ñ"4Ü�K‰K˜×)Ñ)¨1¨d¯o©oÀÑ.AÐBÌ%Ï-É-ÔXó#
ˆÔô Ÿ™×+Ñ+Ü�K‰K˜×)Ñ)¨4¯?©?¸D×<LÑ<LÐMÔUZ×UhÑUhÔió
ˆŒô  %Ÿx™x×1Ñ1Ü�K‰K˜×)Ñ)¨4×+;Ñ+;¸QÐ?ÄuÇ}Á}ÔUó 
ˆÔð 	×ÑÐ-¬u¯{©{¸A¸3ÄeÇkÁkÔ/RÐ_dÐÕer   c           
      ó¦	  — |j                  | j                  d| j                  «      }d}t        j                  |«      }t        | j                  «      D �]D  }||   }|j                  d| j                  «      }t        ||| j                  «      \  }}| j                  j                  d   dz  }	| j                  j                  t        j                  «      }
t        �rJt        j                  || j                  |   j!                  dd«      d|	 j#                  «       j%                  «       |j'                  d«      |
|   d   d|	 j                  dd«      j#                  «       j%                  «       |j(                  ¬«      }t        j                  || j                  |   j!                  dd«      |	d j#                  «       j%                  «       |j'                  d«      |
|   d   |	d j                  dd«      j#                  «       j%                  «       |j(                  ¬«      }�nt        j*                  j,                  j/                  || j                  |   j!                  dd«      d|	 j#                  «       ||
|   d   d|	 j                  dd«      j#                  «       d¬«      }t        j*                  j,                  j/                  || j                  |   j!                  dd«      |	d j#                  «       ||
|   d   |	d j                  dd«      j#                  «       d¬«      }|| j1                  |«      z  }t        ||| j                  «      \  }}| j2                  j                  t        j                  «      }t        rŽt        j                  || j4                  |   j!                  dd«      j#                  «       |j'                  d«      ||   j                  dd«      j#                  «       j%                  «       |j(                  ¬«      }nzt        j*                  j,                  j/                  || j4                  |   j!                  dd«      j#                  «       |||   j                  dd«      j#                  «       d¬«      }|||<   �ŒG |j                  |j6                  «      }|j                  d| j                  «      S )	z¸
        Args:
            hidden_states (torch.Tensor): (batch_size * token_num, hidden_size)
        Returns:
            torch.Tensor: (batch_size * token_num, hidden_size)
        r    Nr   r   r   )rX   rY   rZ   Tr[   )r-   rt   rv   r+   Ú
empty_likeÚranger)   r*   rI   r   r(   rz   r^   rQ   r_   r`   r'   r]   ra   rb   rH   rc   rd   re   ry   r{   r!   rf   )r   Úhidden_statesÚ
num_tokensÚnext_statesÚiÚexpert_hiddenÚexpert_hidden_reshapedÚexpert_quantizedÚexpert_scaleÚsharded_expert_dimÚgate_up_proj_scale_float32ÚgateÚupÚ	activatedÚactivated_quantizedÚactivated_scaleÚdown_proj_scale_float32Úexpert_outputs                     r   rm   z"FbgemmFp8Llama4TextExperts.forward­   st  € ð &×*Ñ*¨4×+;Ñ+;¸RÀ×AQÑAQÓRˆØˆ
ô ×&Ñ& }Ó5ˆä�t×'Ñ'Ó(ó @	+ˆAà)¨!Ñ,ˆMØ%2×%:Ñ%:¸2¸t×?OÑ?OÓ%PÐ"ä-AØ&¨
°D×4GÑ4Gó.Ñ*Ð˜lð "&×!2Ñ!2×!8Ñ!8¸Ñ!<ÀÑ!AÐØ)-×)@Ñ)@×)CÑ)CÄEÇMÁMÓ)RÐ&Þ&Ü×'Ñ'Ø$Ø×%Ñ% aÑ(×2Ñ2°1°aÓ8Ð9LÐ:LÐM×XÑXÓZ×\Ñ\Ó^Ø(×2Ñ2°2Ó6Ø6°qÑ9¸!Ñ<Ð=PÐ>PÐQ×VÑVÐWYÐ[\Ó]×hÑhÓj×lÑlÓnØ+×1Ñ1ô�ô ×%Ñ%Ø$Ø×%Ñ% aÑ(×2Ñ2°1°aÓ8Ð9KÐ9LÐM×XÑXÓZ×\Ñ\Ó^Ø(×2Ñ2°2Ó6Ø6°qÑ9¸!Ñ<Ð=OÐ=PÐQ×VÑVÐWYÐ[\Ó]×hÑhÓj×lÑlÓnØ+×1Ñ1ô’ô —y‘y×'Ñ'×8Ñ8Ø$Ø×%Ñ% aÑ(×2Ñ2°1°aÓ8Ð9LÐ:LÐM×XÑXÓZØ Ø.¨qÑ1°!Ñ4Ð5HÐ6HÐI×NÑNÈrÐSTÓU×`Ñ`ÓbØ#'ð 9ó �ô —Y‘Y×%Ñ%×6Ñ6Ø$Ø×%Ñ% aÑ(×2Ñ2°1°aÓ8Ð9KÐ9LÐM×XÑXÓZØ Ø.¨qÑ1°!Ñ4Ð5GÐ5HÐI×NÑNÈrÐSTÓU×`Ñ`ÓbØ#'ð 7ó �ð ˜TŸ[™[¨Ó.Ñ.ˆIä3GÈ	ÐS]Ð_c×_rÑ_rÓ3sÑ0Ð à&*×&:Ñ&:×&=Ñ&=¼e¿m¹mÓ&LÐ#Ý&Ü %× 0Ñ 0Ø'Ø—N‘N 1Ñ%×/Ñ/°°1Ó5×@Ñ@ÓBØ+×5Ñ5°bÓ9Ø3°AÑ6×;Ñ;¸BÀÓB×MÑMÓO×QÑQÓSØ+×1Ñ1ô!‘ô !&§	¡	× 0Ñ 0× AÑ AØ'Ø—N‘N 1Ñ%×/Ñ/°°1Ó5×@Ñ@ÓBØ#Ø+¨AÑ.×3Ñ3°B¸Ó:×EÑEÓGØ#'ð !Bó !�ð +ˆK˜‹NðA@	+ðB "—n‘n ]×%9Ñ%9Ó:ˆØ×Ñ  D×$4Ñ$4Ó5Ð5r   )r;   r<   r=   r+   rQ   r   rm   ro   rp   s   @r   r   r   ”   s   ø„ Ø%*§]¡]õ fö0P6r   r   r   )Úmaxsizec                  ó†   — t         rddlm}   | d«      j                  S t        j
                  j                  j                  S )Nr   ©Ú
get_kernelzkernels-community/fp8-fbgemm)r_   Úhub_kernelsr”   r*   r+   rc   rd   r“   s    r   Úget_quantize_fp8_per_rowr–      s0   € åÝ+áÐ8Ó9×NÑNÐNÜ�9‰9×Ñ×0Ñ0Ð0r   Úmodules_to_not_convertc                 ót  — t        «       ad}|ri nddi}| j                  «       D ]í  \  }}t        ||«      sŒd}	t	        d¬«      5  |j
                  j                  dk(  r;t        | j                  d| j                  «      }
t        |
xs | j                  «      }	nYt        |t        j                  «      r?t        |j                  |j                  |j                   dufi |¤Ž}	|	j#                  d«       ddd«       |	€ŒÚ| j%                  ||	«       d}Œï |st&        j)                  d«       | S # 1 sw Y   Œ;xY w)	a  
    A helper function to replace all `torch.nn.Linear` modules by `FbgemmFp8Linear` modules.
    This will enable running your models using high performance fp8 kernel from FBGEMM library.

    Parameters:
        model (`torch.nn.Module`):
            Input model or `torch.nn.Module` as the function is run recursively.
        modules_to_not_convert (`list[`str`]`, *optional*, defaults to `None`):
            Names of the modules to not convert. In practice we keep the `lm_head` in full precision for numerical stability reasons.
        quantization_config (`FbgemmFp8Config`):
            The quantization config object that contains the quantization parameters.
        pre_quantized (`book`, defaults to `False`):
            Whether the model is pre-quantized or not
    FrH   NT)Úinclude_buffersÚLlama4TextExpertsÚtext_configzÇYou are loading your model using FP8 quantization but no linear modules were found in your model. Please double check your model architecture, or submit an issue on github if you think this is a bug.)r–   r*   Únamed_modulesr   r   rU   r;   Úgetattrr|   r   r&   r   ÚLinearrE   rM   rN   rT   Úrequires_grad_Úset_submoduleÚloggerÚwarning)r   r—   Úquantization_configÚpre_quantizedÚtp_planÚhas_been_replacedÚmodule_kwargsÚmodule_namer1   Ú
new_moduler›   s              r   Úreplace_with_fbgemm_fp8_linearrª   	  s;  € ô$ 4Ó5ÐàÐÙ'‘B¨g°t¨_€Mà$×2Ñ2Ó4ò !Ñˆ�VÜ$ [Ð2HÔIØàˆ
Ü°Ô5ñ 	1Ø×Ñ×(Ñ(Ð,?Ò?ô
 & e§l¡l°MÀ5Ç<Á<ÓP�Ü7¸Ò8SÀuÇ|Á|ÓT‘
Ü˜F¤B§I¡IÔ.Ü,Ø×&Ñ&Ø×'Ñ'Ø—K‘K tÐ+ñð $ñ	�
ð ×)Ñ)¨%Ô0÷	1ð" ÐØà×Ñ˜K¨Ô4Ø Ñð5!ñ8 Ü�‰ðô	
ð €L÷=	1ð 	1ús   ÁB.D.Ä.D7	)NNFN)"Ú	functoolsr   Úactivationsr   Úcore_model_loadingr   Úquantizers.quantizers_utilsr   r   Úutilsr	   r
   r   r   r   r+   r   Ú
accelerater   r_   Úfbgemm_gpu.experimental.gen_aiÚ
fbgemm_gpuÚ
get_loggerr;   r¡   r   rž   rE   rB   r   r–   rA   r?   rª   rC   r   r   ú<module>r´      sÈ   ðõ  å  Ý .ß U÷õ ñ ÔÛÝáÔÝ-á0Ó2Ð áÔÑ%<Û)à	ˆ×	Ñ	˜HÓ	%€ô6`˜ô 6`ôr,�e—h‘h—o‘oô ,ô^i6 §¡ô i6ñX �1Ôñ1ó ð1ð txñ:Ø#'¨¡9¨tÑ#3ô:r   