ó
    pyüi¹  ã                  ó¬  • S SK Jr  S SKrS SKJr  S SKJr  S SKrS SKJ	r	  S SKJ
r  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJrJrJr  SSKJr  SSKJrJr  \R:                  " \5      r\R@                  r!\RD                  " \!5      RF                  r$\RD                  " \!5      RJ                  r&Sr'S r(\" SS9 " S S5      5       r)\RT                  S,S j5       r+\" SS9 " S S5      5       r,\RT                  S-S j5       r-S.S jr.\R^                  4             S/S jjr0 " S S\	Rb                  5      r2          S0S jr3          S0S jr4          S1S jr5          S2S  jr6      S3S! jr7          S0S" jr8 " S# S$\	Rr                  5      r: " S% S&\5      r;\;" 5       r< S4 S5S' jjr= " S( S)\5      r> " S* S+\5      r?g)6é    )ÚannotationsN)ÚCallable)Ú	dataclass)Ú
functionalé   )ÚACT2FN)ÚConversionOps)Úshould_convert_module)Úlogging)Úget_cuda_runtime_versionÚis_kernels_availableÚresolve_internal_importé   )Úlazy_load_kernel)ÚExpertsInterfaceÚuse_experts_implementationé€   c                ó”   • U H   n[        X5      (       d  M  [        X5      s  $    [        [        U 5      R                   SU 35      e)Nz has none of: )ÚhasattrÚgetattrÚAttributeErrorÚtypeÚ__name__)ÚobjÚnamesÚnames      Úf/home/mande/repo/quber/.venv/lib/python3.13/site-packages/transformers/integrations/finegrained_fp8.pyÚ_first_attrr   /   sE   € ÛˆÜ�3×ÓÜ˜3Ó%Ò%ñ ô œD ›I×.Ñ.Ð/¨~¸e¸WÐEÓ
FÐFó    T)Úfrozenc                  óB   • \ rS rSr% SrS\S'   S\S'   S\S'   S\S'   Srg	)
ÚFineGrainedFP8é6   zNEntry points exposed by the `kernels-community/finegrained-fp8` Triton kernel.r   Ú
fp8_matmulÚfp8_act_quantÚbatched_fp8_matmulÚgrouped_fp8_matmul© N©r   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__Ú__static_attributes__r(   r   r   r"   r"   6   s   ‡ áXàÓØÓØ Ó Ø Ö r   r"   c                 óŒ  • [        5       (       d  [        S5      e[        S5      n U c  [        S5      e[        U SS5      n[        U SS5      n[        U SS5      n[        U SS5      nSU4SU4SU4SU44 VVs/ s H  u  pVUb  M
  UPM     nnnU(       a  [        S	S
R	                  U5       S35      e[        UUUUS9$ s  snnf )z¸
Load the finegrained-fp8 Triton kernel once and return its entry points.

Raises `ImportError` if the `kernels` package is missing, or the kernel or required
symbols cannot be found.
z`finegrained-fp8 kernel requires the `kernels` package. Install it with `pip install -U kernels`.zfinegrained-fp8Nu‰   Failed to load the finegrained-fp8 kernel â€” check that `kernels-community/finegrained-fp8` has a build matching the current torch/CUDA.Úw8a8_fp8_matmulr%   Úw8a8_fp8_matmul_batchedÚw8a8_fp8_matmul_groupedz4finegrained-fp8 kernel is missing required symbols: ú, úA. Please update the `kernels` package (`pip install -U kernels`).)r$   r%   r&   r'   )r   ÚImportErrorr   r   Újoinr"   )Úkernelr$   r%   r&   r'   r   ÚattrÚmissings           r   Ú_load_finegrained_fp8_kernelr;   @   s!  € ô  ×!Ñ!ÜØnó
ð 	
ô Ð/Ó0€FØ�~Üð;ó
ð 	
ô
 ˜Ð!2°DÓ9€JÜ˜F O°TÓ:€MÜ  Ð)BÀDÓIÐÜ  Ð)BÀDÓIÐð
  
Ð+Ø˜mÐ,Ø&Ð(:Ð;Ø&Ð(:Ð;ñ	
ô	ò
‰JˆDð ÷ 	ñ
ð ñ 	ö ÜØBÀ4Ç9Á9ÈWÓCUÐBVð WNð Nó
ð 	
ô
 ØØ#Ø-Ø-ñ	ð ùó!	s   Á9	C ÂC c                  ó8   • \ rS rSr% SrS\S'   S\S'   S\S'   Srg)	ÚDeepGEMMéq   zAEntry points exposed by the `kernels-community/deep-gemm` kernel.r   r$   r'   Úper_token_cast_to_fp8r(   Nr)   r(   r   r   r=   r=   q   s   ‡ áKàÓØ Ó Ø#Ö#r   r=   c                 óŒ  • [        5       (       d  [        S5      e[        R                  R	                  5       (       d  [        S5      e[        R                  R                  5       S   n U S:  a  [        SU  S35      e[        5       u  pUS:  d  US:X  a  US:  a  [        S	U S
U S35      e[        S5      nUc  [        S5      e[        USS5      n[        USS5      n[        USS9nSU4SU4SU44 VVs/ s H  u  pxUb  M
  UPM     n	nnU	(       a  [        SSR                  U	5       S35      e[        UUUS9$ s  snnf )z£
Load DeepGEMM once and return its entry points.

Raises `ImportError` if CUDA/hardware requirements are not met, or the kernel or
required symbols are not found.
zYDeepGEMM kernel requires the `kernels` package. Install it with `pip install -U kernels`.zcDeepGEMM kernel requires CUDA, but CUDA is not available. Use a different `experts_implementation`.r   é	   z_DeepGEMM requires a Hopper (SM90+) or newer GPU, but the current device has compute capability z-.x. Use a different `experts_implementation`.é   é   z0DeepGEMM requires CUDA runtime 12.3+, but found Ú.zO. Please upgrade your CUDA toolkit or use a different `experts_implementation`.z	deep-gemmNu|   Failed to load the DeepGEMM kernel â€” check that `kernels-community/deep-gemm` has a build matching the current torch/CUDA.Úfp8_gemm_ntÚ m_grouped_fp8_gemm_nt_contiguouszutils.per_token_cast_to_fp8)Úchained_pathz-DeepGEMM kernel is missing required symbols: r4   r5   )r$   r'   r?   )r   r6   ÚtorchÚcudaÚis_availableÚget_device_capabilityr   r   r   r   r7   r=   )
ÚmajorÚ
cuda_majorÚ
cuda_minorr8   r$   r'   r?   r   r9   r:   s
             r   Ú_load_deepgemm_kernelrO   z   s«  € ô  ×!Ñ!ÜÐuÓvÐvä�:‰:×"Ñ"×$Ñ$ÜØqó
ð 	
ô
 �J‰J×,Ñ,Ó.¨qÑ1€EØˆqƒyÜð&Ø&+ WÐ,Yð[ó
ð 	
ô 6Ó7Ñ€JØ�Bƒ˜:¨Ó+°
¸Q³ÜØ>¸z¸lÈ!ÈJÈ<ð X\ð \ó
ð 	
ô
 ˜kÓ*€FØ�~Üð;ó
ð 	
ô
 ˜ °Ó5€JÜ  Ð)KÈTÓRÐÜ3°FÐIfÑgÐð
 ˜JÐ'Ø/Ð1CÐDØ*Ð,AÐBñ
ôò
‰JˆDð
 ÷ 	ñ
ð ñ ö ÜØ;¸D¿I¹IÀgÓ<NÐ;Oð PNð Nó
ð 	
ô
 ØØ-Ø3ñð ùós   Ã:	E ÄE c                ó   • X-   S-
  U-  $ )zCeiling division.r   r(   )ÚaÚbs     r   Ú_cdivrS   »   s   € à‰E�A‰I˜!ÑÐr   c                ó€  • Ubú  US   US   s=:X  a  S:X  aç  O  Oä [        5       nU R                  SU R                  S   5      nUR                  SUR                  S   5      n[        R                  " UR                  S   UR                  S   U R
                  US9n	UR                  XxR                  5       4XR                  5       4U	5        U	R                  U R                  SS UR                  S   4-   5      $ [        5       n
U
R                  XX#XE5      $ ! [         a    [        R                  S5         N>f = f)uL  FP8 matmul: C = dequant(A, As) @ dequant(B, Bs)^T.

Supports both per-tensor and block-wise quantization:
  - block_size=None or block_size=[N, K]: per-tensor mode (As is scalar/per-row, Bs is scalar)
  - block_size=[block_n, block_k]: block-wise mode (As and Bs are per-block scale grids)

Dispatch order:
  1. DeepGEMM (Hopper+, block_size 128x128) if available
  2. Triton finegrained-fp8 kernel (universal fallback)

Args:
    A:  (M, K) float8_e4m3fn â€” quantized activations
    B:  (N, K) float8_e4m3fn â€” quantized weights
    As: block-wise: (M, K//block_k) float32; per-tensor: (M,) per-row scales
    Bs: block-wise: (N//block_n, K//block_k) float32; per-tensor: scalar or (1,) single weight scale
    block_size: [block_n, block_k] for block-wise quantization, or None/[N, K] for per-tensor
    output_dtype: desired output dtype
Nr   r   r   éÿÿÿÿ©ÚdeviceÚdtypea  DeepGEMM kernel is not available or compatible, falling back to Triton finegrained-fp8 kernel. To use DeepGEMM FP8 matmul, ensure you have a Hopper (SM90+) or newer GPU with CUDA runtime 12.3+, and that the `kernels` package is installed and up to date (`pip install -U kernels`).)rO   ÚviewÚshaperH   ÚemptyrW   r$   Úfloatr6   ÚloggerÚwarning_oncer;   )ÚAÚBÚAsÚBsÚ
block_sizeÚoutput_dtypeÚdeepgemmÚA_2dÚAs_2dÚoutputÚfinegrained_fp8s              r   r1   r1   À   s  € ð4 Ñ *¨Q¡-°:¸a±=Õ"GÀCÖ"Gð	=Ü,Ó.ˆHð —6‘6˜"˜aŸg™g b™kÓ*ˆDØ—G‘G˜B §¡¨¡Ó-ˆEÜ—[’[ §¡¨A¡°·±¸±
À1Ç8Á8ÐS_Ñ`ˆFØ×Ñ §{¡{£}Ð 5¸¿8¹8»:°ÈÔOØ—;‘;˜qŸw™w s¨˜|¨q¯w©w°q©z¨mÑ;Ó<Ð<ä2Ó4€OØ×%Ñ% a¨B°JÓMÐMøô ó 	Ü×Ñðiöð	ús   ›
D ÄD=Ä<D=c                  óT   ^ • \ rS rSrSSS\4         SU 4S jjjrS	S jrSrU =r$ )
Ú	FP8Linearéï   NÚdynamicFc                óÊ  >• [         T	U ]  X5        XPl        X0l        X@l        [
        R                  R                  [
        R                  " X!US95      U l	        U R                  c=  [        R                  " [
        R                  " S[
        R                  S95      U l        O„X R                  S   -   S-
  U R                  S   -  nXR                  S   -   S-
  U R                  S   -  n[        R                  " [
        R                  " Xx[
        R                  S95      U l        U R                  S:X  a=  [        R                  " [
        R                  " S[
        R                  S95      U l        OU R                  SS 5        U R                  (       a:  [        R                  " [
        R                  " U R                  5      5      U l        g U R                  SS 5        g )N©rX   ç      ð?r   r   ÚstaticÚactivation_scaleÚbias)ÚsuperÚ__init__Úhas_biasrc   Úactivation_schemerH   ÚnnÚ	Parameterr[   ÚweightÚtensorÚfloat32Úweight_scale_invrr   Úregister_parameterÚout_featuresrs   )
ÚselfÚin_featuresr   rc   rw   rv   rX   Úscale_out_featuresÚscale_in_featuresÚ	__class__s
            €r   ru   ÚFP8Linear.__init__ð   sU  ø€ ô 	‰Ñ˜Ô3à ŒØ$ŒØ!2ÔÜ—h‘h×(Ñ(¬¯ª°\ÐV[Ñ)\Ó]ˆŒà�?‰?Ñ"ä$&§L¢L´·²¸cÌÏÉÑ1WÓ$XˆDÕ!à".·±ÀÑ1CÑ"CÀaÑ"GÈDÏOÉOÐ\]ÑL^Ñ!^ÐØ!,¯©¸qÑ/AÑ!AÀAÑ!EÈ$Ï/É/ÐZ[ÑJ\Ñ \ÐÜ$&§L¢LÜ—’Ð.ÌÏÉÑWó%ˆDÔ!ð ×!Ñ! XÓ-Ü$&§L¢L´·²¸cÌÏÉÑ1WÓ$XˆDÕ!à×#Ñ#Ð$6¸Ô=à�=�=ÜŸš¤U§[¢[°×1BÑ1BÓ%CÓDˆD�Ià×#Ñ# F¨DÕ1r   c           	     óÜ  • U R                   R                  5       S:”  a+  [        R                  " XR                   U R                  5      $ U R                   nU R
                  n[        U[        R                  R                  R                  5      (       a   UR                  5       nUR                  5       nU R                  S:X  aG  [        5       nUR                  XR                  b  U R                  S   OUR                   S   5      u  pVOU R                  S:X  aW  U R"                  R%                  [        R&                  5      nX-  R)                  [*        [,        S9R%                  [.        5      nO[1        SU R                   35      e[3        UUUUU R                  UR4                  S9nU R                  b  UR7                  U R                  5        UR%                  UR4                  S9$ )	Nr   rm   rU   rq   ©ÚminÚmaxzUnsupported activation scheme: ©rd   ro   )rz   Úelement_sizeÚFÚlinearrs   r}   Ú
isinstancerH   Údistributedr{   ÚDTensorÚto_localrw   r;   r%   rc   rZ   rr   Útor|   ÚclampÚ_FP8_MINÚ_FP8_MAXÚ
_FP8_DTYPEÚNotImplementedErrorr1   rX   Úadd_)r€   Úinputrz   Ú	scale_invri   ÚqinputÚscalerh   s           r   ÚforwardÚFP8Linear.forward  s‚  € Ø�;‰;×#Ñ#Ó%¨Ó)Ü—8’8˜E§;¡;°·	±	Ó:Ð:à—‘ˆØ×)Ñ)ˆ	Ü�fœe×/Ñ/×6Ñ6×>Ñ>×?Ñ?Ø—_‘_Ó&ˆFØ!×*Ñ*Ó,ˆIà×!Ñ! YÓ.Ü:Ó<ˆOØ+×9Ñ9Ø¯_©_Ñ-H�t—‘ qÒ)ÈeÏkÉkÐZ\Éoó‰MˆF�Eð ×#Ñ# xÓ/Ø×)Ñ)×,Ñ,¬U¯]©]Ó;ˆEØ‘m×*Ñ*¬x¼XÐ*ÐF×IÑIÌ*ÓU‰Fä%Ð(GÈ×H^ÑH^ÐG_Ð&`ÓaÐaä ØØØØØ�O‰OØŸ™ñ
ˆð �9‰9Ñ Ø�K‰K˜Ÿ	™	Ô"à�y‰y˜uŸ{™{ˆyÐ+Ð+r   )rr   rw   rs   rc   rv   rz   r}   )
r�   Úintr   rŸ   rc   útuple[int, int] | Nonerw   Ústrrv   Úbool)r™   útorch.TensorÚreturnr£   )	r   r*   r+   r,   r–   ru   r�   r/   Ú__classcell__©r„   s   @r   rk   rk   ï   sV   ø† ð
 .2Ø!*ØØð"2àð"2ð ð"2ð +ð	"2ð
 ð"2ð ÷"2ð "2÷H!,ò !,r   rk   c                óÀ  • U R                   S:X  a  [        S5      e[        5       nUR                  S5      nUR                  S5      nUR                  S5      nUR	                  USS9nUR                  S5      n	UR                  S5      n
U
R                  SU R                  S-
  5        UR                  UU R                  (       a  U R                  OU R                  U R                  (       a  U R                  OU R                  U R                  U
S9nU R                  (       a  U R                  U5      nOU R!                  U5      nUR                  UU R"                  U R$                  U R                  U
S9nX¹R'                  UR(                  5      R+                  S5      -  nUR-                  XeU5      R/                  SS9nUR'                  UR(                  5      $ )Nrq   z‘batched_mm experts dispatch does not support activation_scheme='static'. Use the default eager dispatch or switch to activation_scheme='dynamic'.rU   r   ©Údimr   )rc   Ú
expert_ids)rw   r—   r;   ÚsizeÚrepeat_interleaveÚreshapeÚclamp_Únum_expertsr&   Úhas_gateÚgate_up_projÚup_projÚgate_up_proj_scale_invÚup_proj_scale_invrc   Ú_apply_gateÚact_fnÚ	down_projÚdown_proj_scale_invr’   rX   Ú	unsqueezerY   Úsum)r€   Úhidden_statesÚtop_k_indexÚtop_k_weightsri   Ú	num_top_kÚ
num_tokensÚ
hidden_dimÚselected_hidden_statesÚsample_weightsrª   Úproj_outÚweighted_outÚfinal_hidden_statess                 r   Úfp8_batched_mm_experts_forwardrÆ   8  sÀ  € ð ×Ñ Ó)Ü!ðWó
ð 	
ô
 3Ó4€Oà× Ñ  Ó$€IØ×#Ñ# AÓ&€JØ×#Ñ# BÓ'€Jð +×<Ñ<¸YÈAÐ<ÐNÐØ"×*Ñ*¨2Ó.€NØ×$Ñ$ RÓ(€Jð
 ×Ñ�a˜×)Ñ)¨AÑ-Ô.ð ×1Ñ1ØØ!Ÿ]Ÿ]ˆ×Ò°·±Ø'+§}§}ˆ×#Ò#¸$×:PÑ:PØ—?‘?Øð 2ð €Hð ‡}‡}à×#Ñ# HÓ-‰ð —;‘;˜xÓ(ˆð ×1Ñ1ØØ�‰Ø× Ñ Ø—?‘?Øð 2ð €Hð ×/Ñ/°·±Ó?×IÑIÈ"ÓMÑM€Lð '×+Ñ+¨JÀ:ÓN×RÑRÐWXÐRÐYÐà×!Ñ! -×"5Ñ"5Ó6Ð6r   c           	     ó   • U R                   S:X  a  [        S5      e[        5       nUR                  nUR	                  S5      nUR	                  S5      nUR	                  S5      nUR                  S5      n	UR                  S5      n
[        R                  " U
5      u  p¼XU-     nXœ   nUR                  S:X  a  UR                  5       OUR                  5       n[        R                  " XðR                  SU R                  S-
  S9n[        R                  " US[        R                  S9nX°R                  :¬  R                  S5      nU R                   (       a  U R"                  OU R$                  nU R                   (       a  U R&                  OU R(                  nU R*                  nU R,                  n[/        U[        R0                  R2                  R4                  5      (       a@  UR7                  5       nUR7                  5       nUR7                  5       nUR7                  5       nUR9                  UUUUU R:                  US	9nU R                   (       a  U R=                  U5      nOU R?                  U5      nUR9                  UUUUU R:                  US	9nUURA                  URB                  5      R                  S5      -  nURE                  US
5        [        RF                  " U5      n[        RH                  " UR	                  S5      US9UU'   UU   nURK                  XvU5      RM                  SS9nURA                  URB                  5      $ )Nrq   z‘grouped_mm experts dispatch does not support activation_scheme='static'. Use the default eager dispatch or switch to activation_scheme='dynamic'.rU   r   Úcpur   ©Úbinsrˆ   r‰   )r©   rX   )Útokens_per_expertrc   Úoffsetsç        ©rW   r¨   )'rw   r—   r;   rW   r«   r­   rH   Úsortr   r\   rŸ   Úhistcr¯   ÚcumsumÚint32r¹   r°   r±   r²   r³   r´   r·   r¸   rŽ   r�   r{   r�   r‘   r'   rc   rµ   r¶   r’   rX   Úmasked_fill_Ú
empty_likeÚarangerY   rº   )r€   r»   r¼   r½   ri   rW   r¾   r¿   rÀ   rÂ   rª   Úexpert_ids_gÚpermÚselected_hidden_states_gÚsample_weights_gÚhistc_inputrË   rÌ   Úsentinel_maskÚw_upÚws_upÚw_downÚws_downrÃ   rÄ   Úinv_permrÅ   s                              r   Úfp8_grouped_mm_experts_forwardrá   y  sù  € ð ×Ñ Ó)Ü!ðWó
ð 	
ô
 3Ó4€Oà×!Ñ!€FØ× Ñ  Ó$€IØ×#Ñ# AÓ&€JØ×#Ñ# BÓ'€Jð #×*Ñ*¨2Ó.€NØ×$Ñ$ RÓ(€Jô Ÿš JÓ/Ñ€LØ,°YÑ->Ñ?ÐØ%Ñ+Ðð
 +1¯+©+¸Ó*>�,×$Ñ$Ô&ÀL×DTÑDTÓDV€KÜŸš K×6FÑ6FÈAÐSW×ScÑScÐfgÑSgÑhÐÜ�lŠlÐ,°!¼5¿;¹;ÑG€Gð "×%5Ñ%5Ñ5×@Ñ@ÀÓD€Mð !%§§ˆ4×Ò°4·<±<€DØ+/¯=¯=ˆD×'Ò'¸d×>TÑ>T€EØ�^‰^€FØ×&Ñ&€GÜ�$œ×)Ñ)×0Ñ0×8Ñ8×9Ñ9Ø�}‰}‹ˆØ—‘Ó ˆØ—‘Ó"ˆØ×"Ñ"Ó$ˆð ×1Ñ1Ø ØØØ+Ø—?‘?Øð 2ð €Hð ‡}‡}à×#Ñ# HÓ-‰ð —;‘;˜xÓ(ˆð ×1Ñ1ØØØØ+Ø—?‘?Øð 2ð €Hð Ð.×1Ñ1°(·.±.ÓA×KÑKÈBÓOÑO€Lð ×Ñ˜m¨SÔ1ô ×Ò Ó%€HÜ—\’\ $§)¡)¨A£,°vÑ>€HˆT�NØ Ñ)€Lð '×+Ñ+¨JÀ:ÓN×RÑRÐWXÐRÐYÐà×!Ñ! -×"5Ñ"5Ó6Ð6r   c                óŒ  • U R                   nU R                  S5      n[        R                  " U R	                  5       USUS-
  S9R                  5       nXb-   S-
  U-  U-  nU[        XQ5      US-
  -  -   nXv-
  n	[        R                  R                  R                  U	R                  S5      S5      n
[        R                  " XTS9X    -   nU(       a   UR                  S5      R	                  5       nOP[        R                  " U4SU[        R                  S9n[        R                  " X:  U R	                  5       S5      XË'   X¼U4$ )a  Build the TMA-aligned layout DeepGEMM's grouped GEMM expects.

Returns `(sorted_to_padded, grouped_layout, total_padded_rows)`. `grouped_layout` encodes
expert boundaries as a cumsum of aligned counts on Blackwell (`use_psum_layout=True`) or
per-row expert ids with -1 for padding on Hopper.

Accepts EP sentinels: values in `expert_ids_sorted` equal to `num_experts` (unclamped sentinels)
are routed past the last aligned expert block and marked `-1` in the Hopper layout (and
excluded from the Blackwell cumsum), so DeepGEMM skips them.
r   r   rÉ   )r   r   rÎ   rU   rV   )rW   r«   rH   rÐ   rŸ   Úlongrˆ   rx   r   ÚpadrÑ   rÕ   ÚfullrÒ   Úwhere)Úexpert_ids_sortedr¯   Ú	alignmentÚuse_psum_layoutrW   r¿   rË   Úaligned_tokens_per_expertÚtotal_padded_rowsÚpadding_per_expertÚcumulative_paddingÚsorted_to_paddedÚgrouped_layouts                r   Ú!_build_deepgemm_contiguous_layoutrð   Þ  s=  € ð ×%Ñ%€FØ"×'Ñ'¨Ó*€JäŸšÐ$5×$9Ñ$9Ó$;À+ÐSTÐZeÐhiÑZiÑj×oÑoÓqÐØ"3Ñ"?À!Ñ"CÈ	Ñ!QÐU^Ñ ^Ðà"¤S¨Ó%AÀYÐQRÁ]Ñ%SÑSÐð 3ÑFÐÜŸ™×,Ñ,×0Ñ0Ð1C×1JÑ1JÈ1Ó1MÈvÓVÐÜ—|’| JÑ>ÐASÑAfÑfÐæð
 3×9Ñ9¸!Ó<×@Ñ@ÓB‰ô ŸšÐ%6Ð$8¸"ÀVÔSX×S^ÑS^Ñ_ˆÜ+0¯;ª;Ð7HÑ7VÐXi×XmÑXmÓXoÐqsÓ+tˆÑ(àÐ->Ð>Ð>r   c                óü   • [         R                  " X0R                  S   U R                  U R                  S9nXU'   [         R                  " X1R                  S   U R                  [         R
                  S9nXU'   XE4$ )zKPad sorted hidden states and scales into the TMA-aligned contiguous layout.r   rV   )rH   ÚzerosrZ   rW   rX   r|   )r»   Úscalesrî   rë   Úhidden_paddedÚscales_paddeds         r   Ú"_pad_to_deepgemm_contiguous_layoutrö   	  sv   € ô —K’KØ×.Ñ.¨qÑ1¸-×:NÑ:NÐVc×ViÑViñ€Mð '4Ð"Ñ#Ü—K’KÐ 1·<±<À±?È=×K_ÑK_Ôgl×gtÑgtÑu€MØ&,Ð"Ñ#ØÐ'Ð'r   c                ó
   • X   $ )z;Remove padding rows from the TMA-aligned contiguous layout.r(   )Úhidden_states_paddedrî   s     r   Ú&_unpad_from_deepgemm_contiguous_layoutrù     s   € ð  Ñ1Ð1r   c                ó  • U R                   S:X  a  [        S5      eU R                  c  [        S5      eU R                  S   S:w  d  U R                  S   S:w  a  [        SU R                   35      e[	        5       nUR
                  nUR                  S5      nUR                  S5      nUR                  S5      nUR                  S5      n	UR                  S5      n
[        R                  " U
5      u  p¼XU-     nXœ   n[        R                  R                  U5      S   S	:¬  n[        X°R                  [        US
9u  nnnX°R                  :¬  R                  S5      nU R                   (       a  U R"                  OU R$                  nU R                   (       a  U R&                  OU R(                  nU R*                  nU R,                  n[/        U[        R0                  R2                  R4                  5      (       a@  UR7                  5       nUR7                  5       nUR7                  5       nUR7                  5       nUR9                  USS9u  nn[;        UUUU5      u  nn[        R<                  " UUR>                  S   U[        R@                  S9nURC                  UU4UURE                  5       4UUUS9  U R                   (       a  U RG                  U5      nOU RI                  U5      nUR9                  USS9u  nn[        R<                  " UX…[        R@                  S9nURC                  UU4UURE                  5       4UUUS9  [K        UU5      nUURM                  URN                  5      R                  S5      -  nURQ                  US5        [        RR                  " U5      n[        RT                  " UR                  S5      US9UU'   UU   nURW                  XvU5      RY                  SS9nURM                  URN                  5      $ )Nrq   z�DeepGEMM experts dispatch does not support activation_scheme='static'. Use the default eager dispatch or switch to activation_scheme='dynamic'.zuDeepGEMM requires block-wise quantization (block_size=[128, 128]), but got per-tensor quantization (block_size=None).r   r   r   z-DeepGEMM requires block_size=(128, 128), got rU   é
   )rè   ré   F)Ú	use_ue8m0rV   )ré   rÍ   rÎ   r¨   )-rw   r—   rc   Ú
ValueErrorrO   rW   r«   r­   rH   rÏ   rI   rK   rð   r¯   Ú_DEEPGEMM_M_ALIGNMENTr¹   r°   r±   r²   r³   r´   r·   r¸   rŽ   r�   r{   r�   r‘   r?   rö   r[   rZ   Úbfloat16r'   r\   rµ   r¶   rù   r’   rX   rÓ   rÔ   rÕ   rY   rº   ) r€   r»   r¼   r½   re   rW   r¾   r¿   rÀ   rÂ   rª   rÖ   r×   rØ   rÙ   ré   rî   rï   rë   rÛ   rÜ   rÝ   rÞ   rß   Úact_fp8Ú
act_scalesrÃ   Úproj_fp8Úproj_scalesrÄ   rà   rÅ   s                                    r   Úfp8_deepgemm_experts_forwardr     sÎ  € ð ×Ñ Ó)Ü!ðWó
ð 	
ð ‡�ÑÜðAó
ð 	
ð ‡��qÑ˜SÓ  D§O¡O°AÑ$6¸#Ó$=ÜÐHÈÏÉÐHYÐZÓ[Ð[ä$Ó&€Hà×!Ñ!€FØ× Ñ  Ó$€IØ×#Ñ# AÓ&€JØ×#Ñ# BÓ'€Jð #×*Ñ*¨2Ó.€NØ×$Ñ$ RÓ(€Jô Ÿš JÓ/Ñ€LØ,°YÑ->Ñ?ÐØ%Ñ+Ðä—j‘j×6Ñ6°vÓ>¸qÑAÀRÑG€OÜ:[Ø×&Ñ&Ô2GÐYhñ;Ñ7Ð�nÐ&7ð "×%5Ñ%5Ñ5×@Ñ@ÀÓD€Mð !%§§ˆ4×Ò°4·<±<€DØ+/¯=¯=ˆD×'Ò'¸d×>TÑ>T€EØ�^‰^€FØ×&Ñ&€GÜ�$œ×)Ñ)×0Ñ0×8Ñ8×9Ñ9Ø�}‰}‹ˆØ—‘Ó ˆØ—‘Ó"ˆØ×"Ñ"Ó$ˆð #×8Ñ8Ð9QÐ]bÐ8ÐcÑ€GˆZÜ<¸WÀjÐRbÐduÓvÑ€GˆZÜ�{Š{Ð,¨d¯j©j¸©mÀFÔRW×R`ÑR`Ña€HØ×ÑØ	�*Ð  e§k¡k£mÐ4°hÀÐ`oð  ñ ð
 ‡}‡}Ø×#Ñ# HÓ-‰à—;‘;˜xÓ(ˆð %×:Ñ:¸8ÈuÐ:ÐUÑ€HˆkÜ�{Š{Ð,¨jÌuÏ~É~Ñ^€HØ×ÑØ	�;ÐØ	�—‘“Ð!ØØØ'ð  ñ ô 6°hÐ@PÓQ€Hð Ð.×1Ñ1°(·.±.ÓA×KÑKÈBÓOÑO€Lð ×Ñ˜m¨SÔ1ô ×Ò Ó%€HÜ—\’\ $§)¡)¨A£,°vÑ>€HˆT�NØ Ñ)€Lð '×+Ñ+¨JÀ:ÓN×RÑRÐWXÐRÐYÐà×!Ñ! -×"5Ñ"5Ó6Ð6r   c                  óŽ   ^ • \ rS rSrSSSS\4       SU 4S jjjrSS jr        SS jr S         SS	 jjrS
r	U =r
$ )Ú
FP8ExpertsiŠ  Nrm   FTc           	     óH  >• [         TU ]  5         USL d   S5       eXl        X@l        XPl        X l        UR                  U l        X0l        [        USS5      U l
        [        USS5      U l        [        [        USS5         U l        U R                  (       aû  S	U R                  -  U R                  p‡[        R                  " [         R"                  " U R                  XxUS
95      U l        U R
                  b  ['        XpR
                  S   5      OSn	U R
                  b  ['        X€R
                  S   5      OSn
[        R                  " [         R"                  " U R                  Xš[         R(                  S
95      U l        U R-                  SS 5        O÷U R                  U R                  pË[        R                  " [         R"                  " U R                  X¼US
95      U l        U R
                  b  ['        X°R
                  S   5      OSnU R
                  b  ['        XÀR
                  S   5      OSn[        R                  " [         R"                  " U R                  XÞ[         R(                  S
95      U l        U R-                  SS 5        U R                  U R                  nn[        R                  " [         R"                  " U R                  UUUS
95      U l        U R
                  b  ['        XðR
                  S   5      OSnU R
                  b  ['        UU R
                  S   5      OSn[        R                  " [         R"                  " U R                  UU[         R(                  S
95      U l        U R-                  SS 5        U R                  S:X  a�  [        R                  " [         R6                  " U R                  [         R(                  S
95      U l        [        R                  " [         R6                  " U R                  [         R(                  S
95      U l        g g )NFzWFP8Experts does not support bias for now, please open an issue if you want this featureÚnum_local_expertsr¯   Úmoe_intermediate_sizeÚintermediate_sizeÚhidden_activationÚ
hidden_actr   ro   r   r   Úgate_up_proj_biasÚup_proj_biasÚdown_proj_biasrq   )rt   ru   Úconfigrv   r°   rc   Úhidden_sizerÀ   rw   r   r¯   Úintermediate_dimr   r¶   rx   ry   rH   r[   r±   rS   r|   r³   r~   r²   r´   r·   r¸   ÚonesÚgate_up_proj_activation_scaleÚdown_proj_activation_scale)r€   r  rc   rw   rv   r°   rX   Úgu_proj_outÚ
gu_proj_inÚgu_scale_outÚgu_scale_inÚ
u_proj_outÚ	u_proj_inÚu_scale_outÚ
u_scale_inÚ
d_proj_outÚ	d_proj_inÚd_scale_outÚ
d_scale_inr„   s                      €r   ru   ÚFP8Experts.__init__‹  s  ø€ ô 	‰ÑÔà˜5Ò ð 	
Øeó	
Ð ð ŒØ ŒØ ŒØ$ŒØ ×,Ñ,ˆŒØ!2ÔÜ& vÐ/BÀMÓRˆÔÜ +¨FÐ4KÐM`Ó aˆÔÜœ[¨Ð1DÀlÓSÑTˆŒà�=�=Ø&'¨$×*?Ñ*?Ñ&?ÀÇÁ˜Ü "§¢¬U¯[ª[¸×9IÑ9IÈ;ÐjoÑ-pÓ qˆDÔØEIÇ_Á_ÑE`œ5 ¯o©o¸aÑ.@ÔAÐfgˆLØCGÇ?Á?ÑC^œ% 
¯O©O¸AÑ,>Ô?ÐdeˆKÜ*,¯,ª,Ü—’˜D×,Ñ,¨lÌuÏ}É}Ñ]ó+ˆDÔ'ð ×#Ñ#Ð$7¸Õ>à$(×$9Ñ$9¸4¿?¹?˜	ÜŸ<š<¬¯ª°D×4DÑ4DÀjÐchÑ(iÓjˆDŒLØCGÇ?Á?ÑC^œ% 
¯O©O¸AÑ,>Ô?ÐdeˆKØAEÇÁÑA\œ˜y¯/©/¸!Ñ*<Ô=ÐbcˆJÜ%'§\¢\Ü—’˜D×,Ñ,¨kÌUÏ]É]Ñ[ó&ˆDÔ"ð ×#Ñ# N°DÔ9à $§¡°×1FÑ1F�Iˆ
ÜŸš¤e§k¢k°$×2BÑ2BÀJÐPYÐafÑ&gÓhˆŒØ?C¿¹Ñ?Z”e˜J¯©¸Ñ(:Ô;Ð`aˆØ=A¿_¹_Ñ=X”U˜9 d§o¡o°aÑ&8Ô9Ð^_ˆ
Ü#%§<¢<Ü�KŠK˜×(Ñ(¨+°zÌÏÉÑWó$
ˆÔ ð 	×ÑÐ 0°$Ô7à×!Ñ! XÓ-Ü13·²¼e¿jºjÈ×IYÑIYÔaf×anÑanÑ>oÓ1pˆDÔ.Ü.0¯lªl¼5¿:º:Àd×FVÑFVÔ^c×^kÑ^kÑ;lÓ.mˆDÕ+ð .r   c                óN   • UR                  SSS9u  p#U R                  U5      U-  $ )Nr   rU   r¨   )Úchunkr¶   )r€   Úgate_upÚgateÚups       r   rµ   ÚFP8Experts._apply_gateÄ  s*   € Ø—=‘= ¨�=Ð+‰ˆØ�{‰{˜4Ó  2Ñ%Ð%r   c                ó  • [         R                  " U[         R                  S9n[         R                  " 5          [         R                  R
                  R                  X R                  S9nUR                  SSS5      n[         R                  " UR                  SS9S5      R                  SS	9R                  S
5      nS S S 5        W GH�  nXpR                  :X  a  M  [         R                  " WU   5      u  p‰X   n
U R                  S:X  a  U R                  U   OS nU R!                  U
U R"                  (       a  U R$                  U   OU R&                  U   U R"                  (       a  U R(                  U   OU R*                  U   US9nU R"                  (       a  U R-                  U5      OU R/                  U5      nU R                  S:X  a  U R0                  U   OS nU R!                  UU R2                  U   U R4                  U   US9nX9US 4   nXÎR7                  UR8                  5      -  nUR;                  SXŸR7                  UR8                  5      5        GM“     UR7                  UR8                  5      $ ! , (       d  f       GNÁ= f)Nro   )Únum_classesr   r   r   )rU   éþÿÿÿr¨   F)Úas_tuplerU   rq   )rr   )rH   Ú
zeros_liker|   Úno_gradrx   r   Úone_hotr¯   ÚpermuteÚgreaterrº   ÚnonzerorY   ræ   rw   r  r�   r°   r±   r²   r³   r´   rµ   r¶   r  r·   r¸   r’   rX   Ú
index_add_)r€   r»   r¼   r½   rÅ   Úexpert_maskÚ
expert_hitÚ
expert_idxÚ	top_k_posÚ	token_idxÚcurrent_stateÚgate_up_act_scalerÃ   Údown_act_scaleÚrouting_weightsrÄ   s                   r   r�   ÚFP8Experts.forwardÈ  s7  € ô
 $×.Ò.¨}ÄEÇMÁMÑRÐä�]Š]�_ÜŸ(™(×-Ñ-×5Ñ5°k×O_ÑO_Ð5Ð`ˆKØ%×-Ñ-¨a°°AÓ6ˆKÜŸš {§¡¸8 Ð'DÀaÓH×PÑPÐZ_ÐPÐ`×eÑeÐfhÓiˆJ÷ ô
 %ˆJØ×-Ñ-Ó-Ùä#(§;¢;¨{¸:Ñ/FÓ#GÑ ˆIØ)Ñ4ˆMàBF×BXÑBXÐ\dÓBd�×2Ñ2°:Ò>Ðjnð ð —{‘{ØØ15··�×!Ñ! *Ò-ÀDÇLÁLÐQ[ÑD\Ø;?¿=¿=�×+Ñ+¨JÒ7Èd×NdÑNdÐeoÑNpØ!2ð	 #ð ˆHð 6:·]·]�t×'Ñ'¨Ô1ÈÏÉÐT\ÓH]ˆHà?C×?UÑ?UÐYaÓ?a�×/Ñ/°
Ò;Ðgkð ð —{‘{ØØ—‘˜zÑ*Ø×(Ñ(¨Ñ4Ø!/ð	 #ð ˆHð ,°yÀ$Ð,FÑGˆOØ#×&8Ñ&8¸¿¹Ó&HÑHˆLØ×*Ñ*¨1¨i¿¹ÐI\×IbÑIbÓ9c×dñ7 %ð8 #×%Ñ% m×&9Ñ&9Ó:Ð:÷C Ž_ús   ¹BI8É8
Jc           	     ó  • UR                  5       S:”  a  [        R                  " XS 5      $ U R                  S:X  aP  UbM  UR	                  [
        R                  5      nX-  R                  [        [        S9R	                  [        5      nOF[        5       nUR                  XR                  b  U R                  S   OUR                  S   5      u  pe[        UUUUU R                  UR                   S9nUR	                  UR                   S9$ )Nr   rq   r‡   rU   rŠ   ro   )r‹   rŒ   r�   rw   r’   rH   r|   r“   r”   r•   r–   r;   r%   rc   rZ   r1   rX   )	r€   r™   rz   r}   rr   rœ   r›   ri   rh   s	            r   r�   ÚFP8Experts.linearò  sç   € ð ×ÑÓ  1Ó$Ü—8’8˜E¨4Ó0Ð0à×!Ñ! XÓ-Ð2BÑ2NØ$×'Ñ'¬¯©Ó6ˆEØ‘m×*Ñ*¬x¼XÐ*ÐF×IÑIÌ*ÓU‰Fä:Ó<ˆOØ+×9Ñ9Ø¯_©_Ñ-H�t—‘ qÒ)ÈeÏkÉkÐZ\Éoó‰MˆFô !ØØØØØ�O‰OØŸ™ñ
ˆð �y‰y˜uŸ{™{ˆyÐ+Ð+r   )r¶   rw   rc   r  r·   r  r¸   r±   r  r³   rv   r°   rÀ   r  r¯   r²   r´   )rc   r    rw   r¡   rv   r¢   r°   r¢   )r%  r£   r¤   r£   )r»   r£   r¼   r£   r½   r£   r¤   r£   ©N)
r™   r£   rz   r£   r}   r£   rr   ztorch.Tensor | Noner¤   r£   )r   r*   r+   r,   r–   ru   rµ   r�   r�   r/   r¥   r¦   s   @r   r  r  Š  s·   ø† ð .2Ø!*ØØØð7nð +ð7nð ð	7nð
 ð7nð ÷7nð 7nôr&ð(;Ø)ð(;Ø8Dð(;ØUað(;à	ô(;ð^ 15ð,àð,ð ð,ð 'ð	,ð
 .ð,ð 
÷,ó ,r   r  c                  ó$   • \ rS rSrSr\\\S.rSr	g)ÚFP8ExpertsInterfacei  z?Interface for registering custom FP8 experts forward functions.)Ú
batched_mmÚ
grouped_mmre   r(   N)
r   r*   r+   r,   r-   rÆ   rá   r  Ú_global_mappingr/   r(   r   r   rB  rB    s   † ÙIð 5Ø4Ø0ñƒOr   rB  c                óP  • UR                   (       a  U $ SnU R                  5        GHL  u  pV[        XQ5      (       d  M  U(       a  0 OSS0nSn[        R                  " S5         UR                  S5      (       av  [        USS5      n	[        USS5      n
[        US	U R                  R                  5       5      n[        [        [        U
U	S
9nU" SUUR                  UR                  U
U	S.UD6nOd[        U[        R                   5      (       aE  [#        SUR$                  UR&                  UR                  UR                  UR(                  SLS.UD6nUb  U R+                  XX5        SnSSS5        GMO     U(       d  [,        R/                  S5        U $ ! , (       d  f       GM  = f)a}  
A helper function to replace all `torch.nn.Linear` modules by `FP8Linear` modules.

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
FrX   NÚmetaz.expertsr°   Trv   r  )Úexperts_classÚexperts_interfacerv   r°   )r  rc   rw   rv   r°   )r�   r   rc   rw   rv   z�You are loading your model using fp8 but no linear modules were found in your model. Please double check your model architecture.r(   )Ú
dequantizeÚnamed_modulesr
   rH   rW   Úendswithr   r  Úget_text_configr   r  ÚALL_FP8_EXPERTS_FUNCTIONSÚweight_block_sizerw   rŽ   rx   ÚLinearrk   r�   r   rs   Úset_submoduler]   Úwarning)ÚmodelÚmodules_to_not_convertÚquantization_configÚpre_quantizedÚhas_been_replacedÚmodule_nameÚmoduleÚmodule_kwargsÚ
new_moduler°   rv   r  Ú	new_classs                r   Úreplace_with_fp8_linearr]    s˜  € ð" ×%×%ØˆàÐØ$×2Ñ2×4ÑˆÜ$ [×IÑIÙö ,™°'¸4°ˆØˆ
Ü�\Š\˜&Õ!Ø×#Ñ# J×/Ñ/Ü" 6¨:°tÓ<�Ü" 6¨:°uÓ=�Ü  ¨°5·<±<×3OÑ3OÓ3QÓR�Ü6Ü",Ü&?Ø%Ø%ñ	�	ñ 'ð Ø!Ø2×DÑDØ&9×&KÑ&KØ%Ø%ñð $ñ‘
ô ˜F¤B§I¡I×.Ñ.Ü&ð Ø &× 2Ñ 2Ø!'×!4Ñ!4Ø2×DÑDØ&9×&KÑ&KØ#Ÿ[™[°Ð4ñð $ñ�
ð Ñ%Ø×#Ñ# KÔ<Ø$(Ð!÷= "Ò!ñ  5öN Ü�‰ð<ô	
ð €L÷K "×!ús   Á#DFÆ
F%	c                  óP   • \ rS rSrSrS rS
S jrSS jrSS jr\	SS j5       r
Srg	)ÚFp8Quantizeia  zV
A quantization operation that creates two tensors, weight and scale out of a weight.
c                ó   • Xl         g r@  ©Úhf_quantizer©r€   rb  s     r   ru   ÚFp8Quantize.__init__f  ó   € Ø(Õr   c                ól  • S nU R                   R                  bp  [        U R                   R                  [        5      (       a&  U R                   R                  R	                  S5      nO![        U R                   R                  SS 5      nUc  UR                  S   UR                  S   4n[        U5      $ )NrO  r+  rU   )rb  rU  rŽ   ÚdictÚgetr   rZ   Útuple)r€   Úvaluerc   s      r   Ú_resolve_block_sizeÚFp8Quantize._resolve_block_sizei  s–   € Øˆ
Ø×Ñ×0Ñ0Ñ<Ü˜$×+Ñ+×?Ñ?Ä×FÑFØ!×.Ñ.×BÑB×FÑFÐGZÓ[‘
ä$ T×%6Ñ%6×%JÑ%JÐL_ÐaeÓf�
ØÑØŸ+™+ b™/¨5¯;©;°r©?Ð;ˆJÜ�ZÓ Ð r   c                óò  • UR                   S:  a  X0$ U R                  U5      u  p4UR                  S   UR                  S   peXS-  S:w  d  Xd-  S:w  a  X0$ UR                  S S nXS-  nXd-  n	UR                  n
UR                  [        R
                  5      nUR                  " / UQUPUPU	PUP76 nUR                  5       R                  SS9n[        R                  " US:„  U[        R                  " U5      5      n[        U-  n[        R                  " US:„  U[        R                  " U5      5      nUR                  S5      R                  S5      nUU-  n[        R                  " U[        [        S9R                  [        5      nUR                  U
5      nS	U-  R                  [        R
                  5      nUR!                  S
5      (       a  UR#                  SS5      S   S-   OUS-   nUUUU0$ )Nr   r+  rU   r   )éýÿÿÿrU   r¨   rn  r‡   rp   rz   rD   r   ú.weight_scale_invÚ
_scale_inv)Úndimrk  rZ   r’   rH   r|   r­   ÚabsÚamaxræ   Ú	ones_liker•   r¹   r“   r”   r–   rL  Úrsplit)r€   Úkeyrj  Úblock_mÚblock_nÚrowsÚcolsÚleading_shapeÚ
rows_tilesÚ
cols_tilesÚoriginal_shapeÚ
value_fp32ÚreshapedÚmax_absÚsafe_max_absró   Úscales_broadcastÚscaledÚ	quantizedÚ
inv_scalesÚ	scale_keys                        r   Ú_quantize_oneÚFp8Quantize._quantize_onet  sÎ  € ð �:‰:˜‹>Ø�<ÐØ×3Ñ3°EÓ:ÑˆØ—[‘[ ‘_ e§k¡k°"¡oˆdØ‰>˜QÓ $¡.°AÓ"5Ø�<Ðð Ÿ™ C RÐ(ˆØ‘_ˆ
Ø‘_ˆ
ØŸ™ˆØ—X‘XœeŸm™mÓ,ˆ
à×%Ò%Ð_ }Ð_°jÐ_À'Ð_È:Ð_ÐW^Ò_ˆà—,‘,“.×%Ñ%¨(Ð%Ð3ˆÜ—{’{ 7¨Q¡;°¼¿ºÈÓ9QÓRˆä˜LÑ(ˆÜ—’˜W q™[¨&´%·/²/À&Ó2IÓJˆà!×+Ñ+¨BÓ/×9Ñ9¸"Ó=ÐØÐ,Ñ,ˆÜ—K’K ¬H¼(ÑC×FÑFÄzÓRˆ	Ø×%Ñ% nÓ5ˆ	Ø˜F‘l×&Ñ&¤u§}¡}Ó5ˆ
ØCFÇ<Á<ÐPX×CYÑCY�C—J‘J˜s AÓ& qÑ)Ð,?Ò?Ð_bÐeqÑ_qˆ	Ø�Y 	¨:Ð6Ð6r   c                ó´   • 0 nUR                  5        HA  u  pE[        U[        5      (       a  US   OUnUR                  U R	                  XF5      5        MC     U$ )Nr   )ÚitemsrŽ   ÚlistÚupdaterˆ  )r€   Ú
input_dictÚkwargsÚresultrv  rj  r{   s          r   ÚconvertÚFp8Quantize.convert–  sS   € ð +-ˆØ$×*Ñ*Ö,‰JˆCÜ!+¨E´4×!8Ñ!8�U˜1’X¸eˆFØ�M‰M˜$×,Ñ,¨SÓ9Ö:ñ -ð ˆr   c                ó,   • [        U R                  5      $ r@  )ÚFp8Dequantizerb  ©r€   s    r   Ú
reverse_opÚFp8Quantize.reverse_op   s   € ä˜T×.Ñ.Ó/Ð/r   ra  N)rj  r£   r¤   ztuple[int, int])rv  r¡   rj  r£   r¤   údict[str, torch.Tensor])rŽ  r£   r¤   r˜  ©r¤   r	   )r   r*   r+   r,   r-   ru   rk  rˆ  r‘  Úpropertyr–  r/   r(   r   r   r_  r_  a  s0   † ñò)ô	!ô 7ôDð ó0ó ó0r   r_  c                  ón   • \ rS rSrSrS rSS jrSrSS jrSS jr	 S     SS	 jjr
\SS
 j5       rSrg)r”  i¥  ux  Dequantize FP8 weights using their per-block ``weight_scale_inv``.

Designed to run as the *first* op in any :class:`WeightConverter` chain when
loading with ``dequantize=True`` â€” :meth:`update_weight_conversions` on the
FP8 quantizer attaches it to each existing model-specific converter so that
per-expert (weight, scale) pairs are folded into full-precision tensors before
the chain's merge / concat ops collapse the per-expert structure.

Pattern semantics
    Input ``input_dict`` carries one entry per source pattern; each value is a
    list of tensors (one per ``*`` match). For every weight pattern that has a
    sibling ``*.weight_scale_inv`` pattern in the dict, this op pairs them up by
    index, dequantizes per-pair, and emits the dequantized list under the
    original *weight* key. Scale entries are dropped from the output so the
    remaining ops only see weights.
c                ó   • Xl         g r@  ra  rc  s     r   ru   ÚFp8Dequantize.__init__·  re  r   c                óÊ   • UR                  S5      nU(       a  US S OUnUR                  S5      (       a  US [        S5      *  S-   nOUS:X  a  SnOUS-   nU(       a  US-   $ U$ )NÚ$rU   z.weightro  rz   r}   rp  )rL  Úlen)r€   Úweight_patternÚanchoredÚbaserœ   s        r   Ú_scale_pattern_forÚ Fp8Dequantize._scale_pattern_forº  sr   € à!×*Ñ*¨3Ó/ˆÞ&.ˆ~˜c˜rÑ"°NˆØ�=‰=˜×#Ñ#ØÐ*œC 	›N˜?Ð+Ð.AÑA‰EØ�XÓØ&‰Eà˜<Ñ'ˆEÞ&ˆu�s‰{Ð1¨EÐ1r   )rÍ   g      à?rp   g      ø?g       @g      @g      @g      @g       €g      à¿g      ð¿g      ø¿g       Àg      Àg      Àg      Àc                ó¶  • [         R                  " U R                  [         R                  UR                  S9nUR                  5       R                  [         R                  5      nUS-  R                  5       nUS-	  S-  R                  5       n[         R                  " X$   X%   /SS9nUR                  " / UR                  SS QSUR                  S   -  P76 $ )uR   Two ``e2m1`` FP4 values per byte â†’ float32 tensor twice as wide on the last dim.)rX   rW   é   é   rU   r¨   Nr   )rH   r{   Ú_FP4_E2M1_LUTr|   rW   Ú
contiguousrY   Úuint8rã   Ústackr­   rZ   )r€   ÚpackedÚlutÚu8ÚlowÚhighÚunpackeds          r   Ú_unpack_fp4ÚFp8Dequantize._unpack_fp4Ë  s°   € ä�lŠl˜4×-Ñ-´U·]±]È6Ï=É=ÑYˆØ×ÑÓ ×%Ñ%¤e§k¡kÓ2ˆØ�C‰x�o‰oÓˆØ�q‘˜C‘×%Ñ%Ó'ˆÜ—;’; ¡¨#©)Ð4¸"Ñ=ˆØ×ÒÐI §¡¨c¨rÐ!2ÐI°A¸¿¹ÀRÑ8HÑ4HÒIÐIr   c                óB  • [        [        SS 5      nUR                  [        R                  :X  d  Ub"  UR                  U:X  a  U R	                  U5      nOUR                  [        R                  5      nUR                  SS  u  pVUR                  SS  u  pxXW-  (       d	  Xh-  (       a  [        SU SU SU SU S3	5      eXW-  n	Xh-  n
UR                  R                  (       a   UR                  5       S:¼  a  UR                  O[        R                  nUR                  nUR                  SXyXŠ5      nUR                  [        R                  5      R                  SXx5      R                  S5      R                  S5      nXÞ-  R                  U5      R                  U5      $ )	NÚfloat4_e2m1fn_x2r+  zWeight shape (r4   z) not divisible by scale grid (z).r   rU   )r   rH   rX   Úint8r³  r’   r|   rZ   rý   Úis_floating_pointr‹   rÿ   r­   r¹   )r€   r…  ró   Ú	fp4_dtypeÚquantized_fp32ry  rz  Ú
scale_rowsÚ
scale_colsrw  rx  Ú	out_dtyper~  ÚqÚss                  r   Ú_dequantize_oneÚFp8Dequantize._dequantize_oneÔ  so  € ô œEÐ#5°tÓ<ˆ	Ø�?‰?œeŸj™jÓ(¨YÑ-BÀyÇÁÐZcÓGcØ!×-Ñ-¨iÓ8‰Nà&Ÿ\™\¬%¯-©-Ó8ˆNØ#×)Ñ)¨"¨#Ð.‰
ˆð "(§¡¨b¨cÐ!2Ñˆ
Ø× × 1ÜØ    b¨¨Ð.MÈjÈ\ÐY[Ð\fÐ[gÐgiÐjóð ð Ñ$ˆØÑ$ˆð %+§L¡L×$B×$BÀv×GZÑGZÓG\Ð`aÓGa�F—L’LÔgl×guÑguˆ	Ø'×-Ñ-ˆØ×"Ñ" 2 z¸JÓPˆØ�I‰I”e—m‘mÓ$×,Ñ,¨R°ÓH×RÑRÐSUÓV×`Ñ`ÐabÓcˆØ‘�z‰z˜)Ó$×,Ñ,¨^Ó<Ð<r   Nc                ó²  • SU;   a]  US   n[        U[        5      (       a  US   OUnSU;   a3  US   n[        U[        5      (       a  US   OUnX R                  XE5      0$ X$0$ 0 nUR                  5        H×  u  pxSU;   d  SU;   a  M  U R	                  U5      n	X‘;  a  X†U'   M/  [        U[        5      (       a  UOU/n
X   n[        U[        5      (       a  UOU/n[        U
5      [        U5      :w  a'  [        SU S[        U
5       S[        U5       S35      e[        X¥5       VVs/ s H  u  p¼U R                  X¼5      PM     snnXg'   MÙ     U$ s  snnf )	Nzweight$r   r}   rr   z/Fp8Dequantize: weight/scale count mismatch for z (z weights vs z	 scales).)rŽ   rŒ  rÀ  r‹  r¤  r   rý   Úzip)r€   rŽ  Úfull_layer_namer�  r…  ró   r�  rv  rj  r‡  ÚweightsÚwr¿  s                r   r‘  ÚFp8Dequantize.convertð  sw  € ð ˜
Ó"Ø" 9Ñ-ˆIÜ(2°9¼d×(CÑ(C˜	 !šÈˆIØ! ZÓ/Ø#Ð$6Ñ7�Ü&0°¼×&>Ñ&>˜ šÀF�Ø'×)=Ñ)=¸iÓ)PÐQÐQØ#Ð/Ð/ð @BˆØ$×*Ñ*Ö,‰JˆCØ! SÓ(Ð,>À#Ó,EÙØ×/Ñ/°Ó4ˆIØÓ*à#�s‘ÙÜ)¨%´×6Ñ6‘e¸U¸GˆGØÑ*ˆFÜ)¨&´$×7Ñ7‘V¸f¸XˆFÜ�7‹|œs 6›{Ó*Ü ØEÀcÀUð KÜ˜G›�~ \´#°f³+°¸iðIóð ô CFÀgÔBVÔWÒBV¹$¸!˜4×/Ñ/°Ö5ÑBVÒWˆF‹Kñ! -ð" ˆùó Xs   Ä*Ec                ó,   • [        U R                  5      $ r@  )r_  rb  r•  s    r   r–  ÚFp8Dequantize.reverse_op  s   € ô
 ˜4×,Ñ,Ó-Ð-r   ra  )r¡  r¡   r¤   r¡   )r­  r£   r¤   r£   )r…  r£   ró   r£   r¤   r£   r@  )rŽ  ú,dict[str, list[torch.Tensor] | torch.Tensor]rÄ  z
str | Noner¤   rÊ  r™  )r   r*   r+   r,   r-   ru   r¤  r©  r³  rÀ  r‘  rš  r–  r/   r(   r   r   r”  r”  ¥  s_   † ñò")ô
2ð m€MôJô=ð> '+ð&à@ð&ð $ð&ð
 
6õ&ðP ó.ó ó.r   r”  )r¤   r"   )r¤   r=   )rQ   rŸ   rR   rŸ   r¤   rŸ   )r_   r£   r`   r£   ra   r£   rb   r£   rc   z	list[int]rd   ztorch.dtyper¤   r£   )
r€   ztorch.nn.Moduler»   r£   r¼   r£   r½   r£   r¤   r£   )
rç   r£   r¯   rŸ   rè   rŸ   ré   r¢   r¤   ri  )
r»   r£   ró   r£   rî   r£   rë   rŸ   r¤   z!tuple[torch.Tensor, torch.Tensor])rø   r£   rî   r£   r¤   r£   )NNF)rT  zlist[str] | None)@Ú
__future__r   Ú	functoolsÚcollections.abcr   Údataclassesr   rH   Útorch.nnrx   r   rŒ   Úactivationsr   Úcore_model_loadingr	   Úquantizers.quantizers_utilsr
   Úutilsr   Úutils.import_utilsr   r   r   Úhub_kernelsr   Úmoer   r   Ú
get_loggerr   r]   Úfloat8_e4m3fnr–   Úfinforˆ   r”   r‰   r•   rþ   r   r"   Úcacher;   r=   rO   rS   r|   r1   rP  rk   rÆ   rá   rð   rö   rù   r  ÚModuler  rB  rN  r]  r_  r”  r(   r   r   Ú<module>rÜ     sí  ðõ #ã Ý $Ý !ã Ý Ý $å  Ý .Ý ?Ý ß hÑ hÝ )ß =ð 
×	Ò	˜HÓ	%€ð × Ñ €
Ø�;Š;�zÓ"×&Ñ&€Ø�;Š;�zÓ"×&Ñ&€ð Ð òGñ �$Ñ÷!ð !ó ð!ð ‡�ó-ó ð-ñ` �$Ñ÷$ð $ó ð$ð ‡�ó=ó ð=ô@ð !&§¡ð,NØð,Nàð,Nð 	ð,Nð 	ð	,Nð
 ð,Nð ð,Nð õ,Nô^F,�—	‘	ô F,ðR>7Ø
ð>7àð>7ð ð>7ð  ð	>7ð
 ô>7ðBb7Ø
ðb7àðb7ð ðb7ð  ð	b7ð
 ôb7ðJ(?Ø#ð(?Ø25ð(?ØBEð(?ØX\ð(?à
ô(?ðV(Øð(àð(ð #ð(ð ð	(ð
 'ô(ð 2Ø&ð2Ø:Fð2àô2ðg7Ø
ðg7àðg7ð ðg7ð  ð	g7ð
 ôg7ôTC,�—‘ô C,ôLÐ*ô ñ 0Ó1Ð ð ejðAØ#3õAôHA0�-ô A0ôHx.�Mõ x.r   