§
    kŠtj@#  ã                   óv  — d dl Z d dlZd dlZd dlZd dlmZ d dlZd dl	m
Z
mZmZmZ d dlmZ ddlmZ ddlmZ  ej        e¦  «        Z G d„ d¦  «        Zd	„ Zed
k    rÚ e¦   «         Zej        re                     ej        ¦  «         ej        Zej        Z ej!         "                    e ¦  «        r(e #                    de › d�¦  «          e$de › d�¦  «        ‚ ej%        e¦  «        Z& ee&ej'        ej(        ej)        ¬¦  «        Z*e* +                    ¦   «          e*j&         ,                    e d¦  «         dS dS )é    N)Ú
GraphProtoÚ
ModelProtoÚ	NodeProtoÚTensorProto)Úquantize_matmul_bnb4é   )Ú	ONNXModel)Úattribute_to_kwargc                   óÎ   — e Zd ZdZdZdZddededefd„Ze	d	e
e         d
eeef         fd„¦   «         Zdej        d
ej        fd„Zdede
e         d
efd„Zde
e         fd„Zd„ ZdS )ÚMatMulBnb4QuantizerzMPerform 4b quantization of constant MatMul weights using FP4 or NF4 data typer   r   NÚmodelÚ
quant_typeÚ
block_sizec                 ó²   — |pg }|t           j        t           j        fv sJ ‚t          |¦  «        | _        || _        || _        t          |¦  «        | _        d S ©N)	r   ÚFP4ÚNF4r	   r   r   r   ÚsetÚnodes_to_exclude)Úselfr   r   r   r   s        úl/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/quantization/matmul_bnb4_quantizer.pyÚ__init__zMatMulBnb4Quantizer.__init__%   s_   € Ø+Ð1¨rÐØÕ1Ô5Õ7JÔ7NÐOÐOÐOÐOÐOÝ˜uÑ%Ô%ˆŒ
Ø$ˆŒØ$ˆŒÝ #Ð$4Ñ 5Ô 5ˆÔÐÐó    Ú
graph_pathÚreturnc                 ó˜   — t          t          |¦  «        dz
  dd¦  «        D ]'}||         }|j        D ]}|j        | k    r||fc c S ŒŒ(dS )Nr   éÿÿÿÿ)NN)ÚrangeÚlenÚinitializerÚname)r!   r   ÚgidÚgraphÚtensors        r   Ú__get_initializerz%MatMulBnb4Quantizer.__get_initializer-   sw   € å�˜Z™œ¨1Ñ,¨b°"Ñ5Ô5ð 	)ð 	)ˆCØ˜s”OˆEØÔ+ð )ð )�Ø”; $Ò&Ð&Ø! 5˜=Ð(Ð(Ð(Ð(Ð(ð 'ð)ð ˆzr   Úfpweightc           	      óŒ  — t          |j        ¦  «        dk    rt          d¦  «        ‚|                     ¦   «                              ¦   «         }|j        \  }}||z  }| j        }||z   dz
  |z  }|dz   dz  }t          j        |d¬¦  «        }	t          j        ||j        ¬¦  «        }
t          |	||
|| j
        ||¦  «         |	|
fS )z4b quantize fp32/fp16 weighté   z9Current bnb4 block quantization only supports 2D tensors!r   Úuint8)Údtype)r   ÚshapeÚ
ValueErrorÚ	transposeÚcopyr   ÚnpÚzerosr*   r   r   )r   r&   Ú
fpweight_tÚrowsÚcolsÚnumelr   Ú
num_blocksÚquantized_numelÚpackedÚabsmaxs              r   Úbnb4_block_quantz$MatMulBnb4Quantizer.bnb4_block_quant6   s×   € õ ˆxŒ~ÑÔ !Ò#Ð#ÝÐXÑYÔYÐYð ×'Ò'Ñ)Ô)×.Ò.Ñ0Ô0ˆ
à”^‰
ˆˆdØ�t‘ˆØ”_ˆ
Ø˜jÑ(¨1Ñ,°Ñ;ˆ
Ø  1™9¨Ñ*ˆå”˜/°Ð9Ñ9Ô9ˆÝ”˜*¨H¬NÐ;Ñ;Ô;ˆå˜V Z°¸ÀTÄ_ÐVZÐ\`ÑaÔaÐaà˜ÐÐr   ÚnodeÚgraph_stackc                 óÂ  — |j         dk    r|S t                               d|j        › d�¦  «         |j        | j        v r%t                               d|j        › d�¦  «         |S |j        d         }t                               ||¦  «        \  }}|€t                               d¦  «         |S t          j	         
                    |¦  «        }t          |j        ¦  «        d	k    rt                               d
¦  «         |S |                      |¦  «        \  }}t          j	                             |¦  «        }	|j        dz   |	_        |j        D ])}
|
j        |k    r|j                             |
¦  «          nŒ*t          j	                             |¦  «        }|j        dz   |_        |j                             |	|g¦  «         i }|j        \  }}||d<   ||d<   | j        |d<   | j        |d<   t          j        j        	 d|j        d         |	j        |j        g|j        d         g|j        r
|j        dz   ndddœ|¤Ž}t                               d|j        › d�¦  «         |S )zdIf the node is MatMul with fp32 const weight, quantize the weight with int4, and return the new nodeÚMatMulzstart to quantize z ...zexclude to quantize z$ as specified by nodes_to_exclude...r   Nz2MatMul doesn't have const weight. Skip to quantizer(   z)MatMul weight is not 2D. Skip to quantizeÚ_Bnb4Ú_absmaxÚKÚNr   r   Ú
MatMulBnb4r   Ú úcom.microsoft)ÚinputsÚoutputsr!   Údomainzcomplete quantization of )rB   )Úop_typeÚloggerÚdebugr!   r   Úinputr   Ú%_MatMulBnb4Quantizer__get_initializerÚonnxÚnumpy_helperÚto_arrayr   r+   r9   Ú
from_arrayÚremover    Úextendr   r   ÚhelperÚ	make_nodeÚoutput)r   r:   r;   ÚinputBÚBÚBs_graphÚB_arrayr7   r8   ÚB_quantrK   Úabsmax_tensorÚkwargsr2   r3   Úmatmul_bnb4_nodes                   r   Ú_bnb4_matmul_node_weightz,MatMulBnb4Quantizer._bnb4_matmul_node_weightL   ss  € ð Œ<˜8Ò#Ð#ØˆKå�ŠÐ9¨$¬)Ð9Ð9Ð9Ñ:Ô:Ð:ØŒ9˜Ô-Ð-Ð-Ý�LŠLÐ_°´	Ð_Ð_Ð_Ñ`Ô`Ð`ØˆKà”˜A”ˆÝ)×;Ò;¸FÀKÑPÔP‰ˆˆ8Øˆ9Ý�LŠLÐMÑNÔNÐNØˆKåÔ#×,Ò,¨QÑ/Ô/ˆÝˆwŒ}ÑÔ Ò"Ð"Ý�LŠLÐDÑEÔEÐEØˆKà×.Ò.¨wÑ7Ô7‰ˆ�ÝÔ#×.Ò.¨vÑ6Ô6ˆØ”v Ñ'ˆŒØ”^ð 	ð 	ˆEØŒz˜VÒ#Ð#Ø”×%Ò% eÑ,Ô,Ð,Ø�ð $õ Ô)×4Ò4°VÑ<Ô<ˆØœV iÑ/ˆÔàÔ×#Ò# W¨mÐ$<Ñ=Ô=Ð=àˆØ”]‰
ˆˆdØˆˆs‰Øˆˆs‰Ø#œˆˆ|ÑØ#œˆˆ|Ñåœ;Ô0Øð
à”J˜q”M 7¤<°Ô1CÐDØ”[ ”^Ð$Ø(,¬	Ð9�”˜WÑ$Ð$°rØ"ð
ð 
ð ð
ð 
Ðõ 	�ŠÐ@°´Ð@Ð@Ð@ÑAÔAÐAàÐr   c                 ón  — g }|d         }|j         D �]^}d„ |j        D ¦   «         }|�ri }|j        D ]å}|j        t          j        j        k    r7|                     |j        ¦  «         |j        |  	                    |¦  «        i}n}|j        t          j        j
        k    rTg }	|j        D ]@}
|                     |
¦  «         |	                     |  	                    |¦  «        g¦  «         ŒA|j        |	i}nt          |¦  «        }|                     |¦  «         Œæt          j        j        |j        |j        |j        fd|j        i|¤Ž}|                     |                      ||¦  «        ¦  «         �Œ`|                     d¦  «         |j                              |¦  «         |                     ¦   «          |S )Nr   c                 óz   — g | ]8}|j         t          j        j        k    s|j         t          j        j        k    ¯6|‘Œ9S © )ÚtyperM   ÚAttributeProtoÚGRAPHÚGRAPHS)Ú.0Úattrs     r   ú
<listcomp>z9MatMulBnb4Quantizer._process_subgraph.<locals>.<listcomp>ˆ   sG   € ð ð ð àØ”9¥Ô 3Ô 9Ò9Ð9¸T¼YÍ$ÔJ]ÔJdÒ=dÐ=dð à=dÐ=dÐ=dr   r!   r:   )r:   Ú	attributerb   rM   rc   rd   ÚappendÚgr!   Ú_process_subgraphre   ÚgraphsrR   r
   ÚupdaterS   rT   rH   rK   rU   r^   Ú
ClearFieldÚpop)r   r;   Ú	new_nodesr#   r:   Úgraph_attrsr\   rg   ÚkvÚvalueÚsubgraphs              r   rl   z%MatMulBnb4Quantizer._process_subgraphƒ   sÝ  € Øˆ	Ø˜B”ˆà”Jð 	Oñ 	OˆDðð à œNðñ ô ˆKð
 ñ Ø�Ø œNð &ð &�DØ”y¥DÔ$7Ô$=Ò=Ð=à#×*Ò*¨4¬6Ñ2Ô2Ð2Ø"œi¨×)?Ò)?ÀÑ)LÔ)LÐM˜˜Øœ¥dÔ&9Ô&@Ò@Ð@Ø "˜Ø(,¬ð Pð P˜Hà'×.Ò.¨xÑ8Ô8Ð8Ø!ŸLšL¨$×*@Ò*@ÀÑ*MÔ*MÐ)NÑOÔOÐOÐOØ"œi¨Ð/˜˜å/°Ñ5Ô5˜Ø—M’M "Ñ%Ô%Ð%Ð%Ý”{Ô,Ø”L $¤*¨d¬kðð Ø@DÄ	ðØMSðð �ð ×Ò˜T×:Ò:¸4ÀÑMÔMÑNÔNÐNÑNà×Ò˜Ñ Ô Ð ØŒ
×Ò˜)Ñ$Ô$Ð$Ø�ŠÑÔÐØˆr   c                 ó\  — | j                              ¦   «         g}| j                              ¦   «         }d}|D ]}|j        dk    rd}Œ|s4|                     t
          j                             dd¦  «        g¦  «         |                      |¦  «         | j          	                    ¦   «          d S )NFrD   Tr   )
r   r#   Úopset_importrG   rR   rM   rS   Úmake_opsetidrl   Úclean_initializers)r   r;   rw   Úhas_ms_domainÚopsets        r   ÚprocesszMatMulBnb4Quantizer.process©   s²   € à”z×'Ò'Ñ)Ô)Ð*ˆØ”z×.Ò.Ñ0Ô0ˆàˆØ!ð 	%ð 	%ˆEØŒ|˜Ò.Ð.Ø $�øØð 	PØ×Ò¥¤×!9Ò!9¸/È1Ñ!MÔ!MÐ NÑOÔOÐOà×Ò˜{Ñ+Ô+Ð+ØŒ
×%Ò%Ñ'Ô'Ð'Ð'Ð'r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   Úintr   ÚstaticmethodÚlistr   Útupler   rL   ÚnptÚ	ArrayLiker/   Úndarrayr9   r   r^   rl   r|   ra   r   r   r   r      s  € € € € € ØWÐWð €Cð €Cð6ð 6˜jð 6°cð 6Àsð 6ð 6ð 6ð 6ð ð¨D°Ô,<ð ÀÀ{ÐT^ÐG^ÔA_ð ð ð ñ „\ðð ¨¬ð  ¸2¼:ð  ð  ð  ð  ð,5 ¨Yð 5 ÀTÈ*ÔEUð 5 ÐZcð 5 ð 5 ð 5 ð 5 ðn$¨T°*Ô-=ð $ð $ð $ð $ðL(ð (ð (ð (ð (r   r   c                  óä  — t          j        d¬¦  «        } |                      ddd¬¦  «         |                      ddd¬¦  «         |                      d	d
dt          j        t          j        gd¬¦  «         |                      dd
dd¬¦  «         |                      ddd
d¬¦  «         |                      d
¬¦  «         |                      ddt          d
g d¬¦  «         |                      ¦   «         S )Na  Blockwise FP4/NF4 quantization for MatMul 2D weight matrices.

A weight matrix is partitioned into blocks, where each block is a contiguous
subset inside the flattened transposed weight matrix. Each block is quantized
into a set of 4b integers with an absolute value scaling factor.
)Údescriptionz--input_modelTzPath to the input model file)ÚrequiredÚhelpz--output_modelzPath to the output model filez--quant_typeFr   z&Quantization data type. 0: FP4, 1: NF4)rŠ   ÚdefaultÚchoicesr‹   z--block_sizeé@   zVBlock size for blockwise quantization. Note: bnb.nn.Linear4bit only uses block_size=64)rŠ   rŒ   r‹   z-vz	--verboseÚ
store_true)rŠ   Úaction)Úverbosez--nodes_to_excludeú+zBSpecify the nodes to be excluded from quantization with node names)Únargsrb   rŠ   rŒ   r‹   )	ÚargparseÚArgumentParserÚadd_argumentr   r   r   Úset_defaultsÚstrÚ
parse_args)Úparsers    r   r™   r™   ¹   s5  € ÝÔ$ððñ ô €Fð ×Ò˜°$Ð=[ÐÑ\Ô\Ð\Ø
×ÒÐ(°4Ð>]ÐÑ^Ô^Ð^Ø
×ÒØØØÝ$Ô(Õ*=Ô*AÐBØ5ð ñ ô ð ð ×ÒØØØØeð	 ñ ô ð ð ×Ò˜˜k°EÀ,ÐÑOÔOÐOØ
×Ò ÐÑ&Ô&Ð&Ø
×ÒØØÝØØØQð ñ ô ð ð ×ÒÑÔÐr   Ú__main__zfile z already exists)r   T)-r”   ÚloggingÚosÚnumpyr/   Únumpy.typingÚtypingr…   rM   Úonnx.onnx_pbr   r   r   r   Úonnxruntime.capi._pybind_stater   Ú
onnx_modelr	   Úquant_utilsr
   Ú	getLoggerr}   rI   r   r™   Úargsr‘   ÚsetLevelÚDEBUGÚinput_modelÚinput_model_pathÚoutput_modelÚoutput_model_pathÚpathÚexistsÚerrorÚ	ExceptionÚloadr   r   r   r   Úquantr|   Úsave_model_to_filera   r   r   ú<module>r´      sù  ðð €€€Ø €€€Ø 	€	€	€	à Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø €€€Ø GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ Gà ?Ð ?Ð ?Ð ?Ð ?Ð ?à !Ð !Ð !Ð !Ð !Ð !Ø +Ð +Ð +Ð +Ð +Ð +à	ˆÔ	˜8Ñ	$Ô	$€ð^(ð ^(ð ^(ð ^(ð ^(ñ ^(ô ^(ð ^(ðB$ð $ð $ðN ˆzÒÐØˆ:‰<Œ<€DØ„|ð 'Ø�Š˜œÑ&Ô&Ð&àÔ'ÐØÔ)Ðà	„w‡~‚~Ð'Ñ(Ô(ð DØ�ŠÐ?Ð.Ð?Ð?Ð?Ñ@Ô@Ð@ØˆiÐBÐ 1ÐBÐBÐBÑCÔCÐCàˆDŒIÐ&Ñ'Ô'€EØÐ  t¤¸¼ÐZ^ÔZoÐpÑpÔp€EØ	‡M‚M�O„O€OØ	„K×"Ò"Ð#4°dÑ;Ô;Ð;Ð;Ð;ð Ðr   