Ë
    cQêjÇ�  ã                   ó$  — d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlZddlmZ ddlmZ  ej"                  d«      Z	 dd	„Zdd„Zdd„Zdd„Zdd„Zd„ Zi d
ddi ddgdfd„Zd„ Zd„ Z	 	 	 	 	 	 	 	 d d„Zi d
ddddddddddgfd„Zy)!zWeightOnly for onnxrt adaptor.é    N)Únumpy_helper)Únp_dtype_to_tensor_dtypeé   )Ú	ONNXModel)Úsimple_progress_barÚneural_compressorc	           	      ó
  — ||z  dz  }	t        j                  |j                  d   |	fd¬«      }
| j                  d   d|›d|›�z   }| j                  d   |g}g }i }d}|d	k(  r1|d
d
…d
d
d…f   |d
d
…dd
d…f   d	z  z  }|d
d
…d
|	…f   |
d
d
…d
d
…f<   n!|dk(  r|}
nt        j                  d|› d�«       t        j                  |
d||	f«      }
t        j                  |d|f«      }|j                  t         j                  k(  s|j                  t         j                  k(  sJ ‚t        j                  j                  | j                  d   dz   t        |j                  «      |j                  |j                  «       d¬«      }|j                  |j                   «       |j                  |«       |��~|dk(  r|j#                  d«      }nÔ|d	k(  rÀt        j$                  |j                  d   dz   dz  dd¬«      }t        j&                  |j                  d   |z  |z  «      j                  d«      }|d
d
d…   }|dd
d…   }||dz     dz  ||   j)                  «       z  ||dz  <   ||dz     dz  ||   j)                  «       d	z  z  ||dz  <   nt+        d|› d�«      ‚t        j                  ||d   df«      }t        j                  j                  | j                  d   dz   d|j                  |j                  «       d¬«      }|j                  |j                   «       |j                  |«       |d   |d<   |d   |d<   ||d<   ||d<   |dkD  r||d<   t        j                  j                  |d|
j                  |
j                  «       d¬«      }|j                  |«       t        j                  j,                  |f|| j.                  | j                   r| j                   dz   t1        |«      z   ndt1        |«      z   ddœ|¤Ž}||fS )aB  Build MatMulNBits node.

    Args:
        node: original matmul node
        weight_shape: original weight shape
        num_bits (int): num_bits
        group_size (int): how many elements share one scale/zp
        k_blocks (int): block number
        q_weight (array): quantized weight
        scale (array): scale
        zero_point (array): zero point
        accuracy_level (int): accuracy level. Support 0 (unset), 1(fp32), 2(fp16), 3(bf16), or 4(int8).

    Returns:
        matmul_weight_only_node: MatMulNBits node
        new_inits: initializers of the new node
    é   r   Úuint8©Údtyper   Ú_QÚGÚMatMulNBitsé   Né   z8MatMulNBits does not have kernel support for num_bits = ú.éÿÿÿÿÚ_scaleT©ÚnameÚ	data_typeÚdimsÚvalsÚrawéˆ   éð   é   Ú_zpÚKÚNÚbitsÚ
block_sizeÚaccuracy_levelzcom.microsoft)ÚinputsÚoutputsr   Údomain)ÚnpÚzerosÚshapeÚinputÚloggerÚerrorÚreshaper   Úfloat32Úfloat16ÚonnxÚhelperÚmake_tensorr   ÚtobytesÚappendr   ÚastypeÚfullÚarangeÚravelÚ
ValueErrorÚ	make_nodeÚoutputÚstr)ÚnodeÚweight_shapeÚnum_bitsÚ
group_sizeÚk_blocksÚq_weightÚscaleÚ
zero_pointr$   Ú	blob_sizeÚpackedÚq_weight_nameÚinput_namesÚ	new_initsÚkwargsÚop_typeÚq_weight_pairsÚscale_tensorÚ	packed_zpÚidxÚeven_idxÚodd_idxÚ	zp_tensorÚq_weight_tensorÚmatmul_weight_only_nodes                            ú{/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/quantization/neural_compressor/weight_only.pyÚmake_matmul_weight_only_noderW   ,   s  € ð8 ˜XÑ%¨Ñ*€IÜ�X‰X�x—~‘~ aÑ(¨)Ð4¸GÔD€FØ—J‘J˜q‘M b¨¨°A°j°^Ð$DÑD€MØ—:‘:˜a‘= -Ð0€KØ€IØ€Fà€Gð �1‚}Ø!¢!¡S q S &Ñ)¨H²Q¸¸¸1¸°WÑ,=ÀÑ,BÑBˆØ%¢a¨¨)¨ mÑ4ˆŠq’!ˆtŠØ	�QŠØ‰ä�‰ÐOÐPXÈzÐYZÐ[Ô\ä�Z‰Z˜  X¨yÐ 9Ó:€Fô �J‰J�u˜r 8˜nÓ-€EØ�;‰;œ"Ÿ*™*Ò$¨¯©´r·z±zÒ(AÐAÐAÜ—;‘;×*Ñ*Ø�Z‰Z˜‰]˜XÑ%Ü*¨5¯;©;Ó7Ø�[‰[Ø�]‰]‹_Øð +ó €Lð ×Ñ�|×(Ñ(Ô)Ø×Ñ�\Ô"ð ÑØ�qŠ=Ø"×)Ñ)¨'Ó2‰IØ˜Š]äŸ™ ×!1Ñ!1°!Ñ!4°qÑ!8¸QÑ >ÀÈ7ÔSˆIä—)‘)˜J×,Ñ,¨QÑ/°8Ñ;¸hÑFÓG×OÑOÐPRÓSˆCà™3˜Q˜3‘xˆHØ˜!˜$˜Q˜$‘iˆGà(1°(¸a±-Ñ(@À4Ñ(GÈ:ÐV^ÑK_×KeÑKeÓKgÑ'gˆI�h !‘mÑ$Ø'0°¸A±Ñ'>ÀÑ'EÈ*ÐU\ÑJ]×JcÑJcÓJeÐijÑJjÑ&kˆI�g ‘lÒ#äÐWÐX`ÐWaÐabÐcÓdÐdä—J‘J˜y¨<¸©?¸BÐ*?Ó@ˆ	Ü—K‘K×+Ñ+Ø—‘˜A‘ Ñ&°!¸)¿/¹/ÐPY×PaÑPaÓPcÐimð ,ó 
ˆ	ð 	×Ñ˜9Ÿ>™>Ô*Ø×Ñ˜Ô#ð ˜q‘/€Fˆ3�KØ˜q‘/€Fˆ3�KØ€Fˆ6�NØ%€Fˆ<ÑØ˜Òà#1ˆÐÑ ä—k‘k×-Ñ-ØØØ�\‰\Ø�^‰^ÓØð .ó €Oð ×Ñ�_Ô%ä"Ÿk™k×3Ñ3ØðàØ—‘Ø15·²ˆT�Y‰Y˜Ñ¤ H£Ò-ÀÄsÈ8Ã}Ñ@TØñð ñÐð # IÐ-Ð-ó    r   é    Úasymc           	      ó.  — t        j                  | d|f«      } |dk(  s|dk(  rd|z  dz
  }d}n'|dk(  r"|dk7  rd|dz
  z  dz
  nd}|dk7  r	d|dz
  z   nd}t        j                  | dd¬	«      |z  }t        j                  | dd¬	«      |z  }	|dk(  rÞt        j                  t        j
                  |«      t        j
                  |	«      «      }
t        j                  |	j                  «      }|
dkD  }|
|   d
z  j                  t         j                  «      z
  z  ||<   |dk(  rt        j                  |j                  «      n)t        j                  |	j                  d¬«      d|dz
  z  z  }�nt        j                  |	j                  «      }t        j                  |	|z
  ||	k7     j                  «       j                  «       D �cg c]  }t        |«      z
  z  ‘Œ c}«      |||	k7  <   |dk(  r3t        j                  |j                  «      |z
  |z  j                  «       nit        j                  dt        j                   t        j                  |j                  «      |z
  |z  j                  «       «      «      j                  d«      }t        j"                  | |j$                  ¬«      }t        j&                  | ||¬«       t        j(                  |||¬«       t        j                  ||¬«       t        j*                  ||¬«       |||fS c c}w )a	  Quantize tensor per group.

    Args:
        data : input weight
        num_bits (int, optional): num_bits. Defaults to 4.
        group_size (int, optional): how many elements share one scale/zp. Defaults to 4.
        scheme (str, optional): quantization scheme. Defaults to "asym".
        dtype (str, optional): data type. Defaults to "int".
        ratio (float, optional): percentile of clip. Defaults to 1.0.

    Returns:
        output: quantized weight
        scale: scale
        zero_point: zero point
    r   rZ   Úuintr   r   r   ÚsymT©ÚaxisÚkeepdimsg       @Úintr   r   ©Úout)r(   r.   ÚminÚmaxÚmaximumÚabsÚonesr*   r6   Úfloat64r)   ÚarrayÚflattenÚtolistÚfloatÚroundÚminimumÚ
empty_liker   ÚdivideÚaddÚclip)Údatar@   rA   Úschemer   ÚratioÚmaxqÚminqÚrminÚrmaxÚ	max_rangerD   ÚmaskrE   ÚirC   s                   rV   Úquant_tensorr~   Ÿ   s”  € ô  �:‰:�d˜R Ð,Ó-€DØ�Ò˜5 Fš?Ø�(‰{˜Q‰ˆØ‰Ø	�5ŠØ*2°aª-ˆq�X ‘\Ñ" QÒ&¸QˆØ)1°Qª��x !‘|Ñ$Ñ%¸Bˆä�6‰6�$˜Q¨Ô.°Ñ6€DÜ�6‰6�$˜Q¨Ô.°Ñ6€DØ�‚Ü—J‘JœrŸv™v d›|¬R¯V©V°D«\Ó:ˆ	Ü—‘˜Ÿ
™
Ó#ˆØ˜1‰}ˆØ  ‘¨Ñ,×4Ñ4´R·Z±ZÓ@ÀDÈ4ÁKÑPˆˆd‰à%*¨e¢^ŒB�H‰H�U—[‘[Ô!¼¿¹ÀÇÁÐSZÔ9[Ð_`ÐemÐpqÑeqÑ_rÑ9sò 	ô —‘˜Ÿ
™
Ó#ˆÜ Ÿh™hØ04°t±¸TÀT¹\Ñ/J×/RÑ/RÓ/T×/[Ñ/[Ó/]Ö^¨!ŒU�1‹X˜ ™Ó%Ò^ó
ˆˆd�d‰lÑð
 ˜Š~ô �h‰h�u—{‘{Ó# dÑ*¨eÑ3×:Ñ:Ô<ä—‘˜AœrŸz™z¨$´"·(±(¸5¿;¹;Ó2GÈ$Ñ2NÐRWÑ1W×0^Ñ0^Ó0`ÓaÓb×iÑiÐjqÓrð 	ô �}‰}˜T¨¯©Ô5€HÜ‡I�Iˆd�E˜xÕ(Ü‡F�Fˆ8�Z XÕ.Ü‡H�HˆX˜8Õ$Ü‡G�GˆH�d˜D hÕ/à�U˜JÐ&Ð&ùò _s   ÇLc                 óÌ  — t        j                  | d|f«      j                  t         j                  «      } d|z  dz
  }d}t        j                  | dz  dd¬«      }t        j
                  ||z  «      }t        j                  |t        j                  | «      «      }t        j                  | dd¬«      }t        j                  | dd¬«      }	t        j                  |dd¬«      }
t        j                  || z  dd¬«      }t        j                  |	j                  | j                  ¬«      }||	k7  }||z
  |	|   ||   z
  z  ||<   d|z  }t        j                  t        j                  || |z
  z  «      ||«      }||z  |z   | z
  }t        j                  ||dz  z  dd¬«      }d}d	}d}t        |«      D �]Ó  }t        j                  |	j                  | j                  ¬«      }t        j                   |||z  z   |z   |z
  g«      j                  | j                  «      d   }||	k7  }||	|   ||   z
  z  ||<   t        j                  t        j                  || |z
  z  «      ||«      }||z  }t        j                  |dd¬«      }t        j                  ||z  dd¬«      }t        j                  || z  dd¬«      }t        j"                  |
|z  |dz  «      }|
|z  ||z  z
  |z  }||z  ||z  z
  |z  }||z  |z   | z
  }t        j                  ||dz  z  dd¬«      } t        j                   | «      }!t        j                   |«      }"t        j$                  |!|"k  «      d   }#||#d
d
…f   ||#d
d
…f<   | |#   ||#<   ||#   ||#<   ||#   ||#<   �ŒÖ t        j                  | |z  j                  «       d|«      j                  d«      }$|j                  t         j&                  «      }t        j(                  | |j                  ¬«      }%t        j*                  | ||%¬«       t        j                  |%|$|%¬«       t        j                  |%|%¬«       t        j                  |%|||%¬«       |%||$fS )aÄ  Quantize tensor per group based on k quant.

    Ref: https://github.com/ggml-org/llama.cpp/blob/64eda5deb9859e87a020e56bab5d2f9ca956f1de/ggml/src/ggml-quants.c

    Args:
        data : input weight
        num_bits (int, optional): num_bits. Defaults to 4.
        group_size (int, optional): how many elements share one scale/zp. Defaults to 32.

    Returns:
        output: quantized weight
        scale: scale
        zero_point: zero point
    r   r   r   r   Tr^   r   é   çš™™™™™¹?Nr   rb   )r(   r.   r6   r/   ÚsumÚsqrtrr   rg   rd   re   rh   r*   r   rs   rn   Úrangerj   ÚsubtractÚwhereri   rp   rq   )&rt   r@   rA   rw   rx   Úsum_x2Úav_xÚweightsry   rz   Úsum_wÚsum_xÚiscaler|   rD   Ú
quant_dataÚdiffÚbest_madÚnstepÚrdeltaÚrrminÚis_Ú
iscale_newÚfactorÚquant_data_newÚmul_weights_quant_data_newÚsum_lÚsum_l2Úsum_xlÚDÚ
this_scaleÚthis_minÚmadÚmad_1Ú
best_mad_1Úidx_to_replacerE   rC   s&                                         rV   Úquant_tensor_k_quant_cpur¢   Õ   sý  € ô �:‰:�d˜R Ð,Ó-×4Ñ4´R·Z±ZÓ@€DØˆh‰;˜‰?€DØ€DÜ�V‰V�D˜!‘G !¨dÔ3€FÜ�7‰7�6˜JÑ&Ó'€DÜ�f‰f�Tœ2Ÿ6™6 $›<Ó(€GÜ�6‰6�$˜Q¨Ô.€DÜ�6‰6�$˜Q¨Ô.€DÜ�F‰F�7 ¨TÔ2€EÜ�F‰F�7˜T‘>¨°DÔ9€EÜ�W‰W�T—Z‘Z t§z¡zÔ2€FØ�4‰<€DØ˜4‘K D¨¡J°°d±Ñ$;Ñ<€Fˆ4�LØ�‰J€EÜ—‘œŸ™ &¨D°4©KÑ"8Ó9¸4ÀÓF€JØ�:Ñ Ñ$ tÑ+€DÜ�v‰v�g  a¡Ñ'¨a¸$Ô?€HØ€EØ€Fà€EÜ�U‹|ó 8ˆÜ—W‘W˜TŸZ™Z¨t¯z©zÔ:ˆ
Ü—‘˜5 6¨C¡<Ñ/°$Ñ6¸Ñ=Ð>Ó?×FÑFÀtÇzÁzÓRÐSTÑUˆØ�t‰|ˆØ! T¨$¡Z°$°t±*Ñ%<Ñ=ˆ
�4ÑÜŸ™¤§¡¨*¸¸t¹Ñ*DÓ!EÀtÈTÓRˆØ%,¨~Ñ%=Ð"Ü—‘Ð1¸ÀDÔIˆÜ—‘Ð2°^ÑCÈ!ÐVZÔ[ˆÜ—‘Ð2°TÑ9ÀÈDÔQˆÜ�K‰K˜ ™¨¨q©Ó1ˆà˜f‘n u¨u¡}Ñ4¸Ñ9ˆ
Ø˜U‘N U¨V¡^Ñ3°qÑ8ˆà˜NÑ*¨XÑ5¸Ñ<ˆÜ�f‰f�W˜t Q™wÑ&¨Q¸Ô>ˆä—‘˜“ˆÜ—X‘X˜hÓ'ˆ
ÜŸ™ %¨*Ñ"4Ó5°aÑ8ˆØ(6°~ÂqÐ7HÑ(Iˆ
�>¢1Ð$Ñ%Ø#& ~Ñ#6ˆ�Ñ Ø *¨>Ñ :ˆˆnÑØ'¨Ñ7ˆˆ^Óð18ô4 —‘˜D˜5 E™/×0Ñ0Ó2°A°tÓ<×CÑCÀGÓL€JØ�L‰LœŸ™Ó$€EÜ�}‰}˜T¨¯©Ô5€HÜ‡I�Iˆd�E˜xÕ(Ü‡F�Fˆ8�Z XÕ.Ü‡H�HˆX˜8Õ$Ü‡G�GˆH�d˜D hÕ/à�U˜JÐ&Ð&rX   c                 ó&	  — 	 ddl }ddl}|j                  j                  «       �r|j	                  | «      } | j                  d|f«      j                  |j                  «      } d|z  dz
  }d}|j                  | dz  dd¬«      }|j                  ||z  «      }|j                  ||j                  | «      «      }	|j                  | dd¬«      }
|j                  | dd¬«      }|j                  |	dd¬«      }|j                  |	| z  dd¬«      }|j                  |j                  | j                   ¬«      }|
|k7  }||z
  ||   |
|   z
  z  ||<   d|z  }|j#                  |j%                  || |
z
  z  «      ||«      }||z  |
z   | z
  }|j                  |	|dz  z  dd¬«      }d	}d
}d}t'        |«      D �]£  }|j                  |j                  | j                   ¬«      }|j)                  |||z  z   |z   |z
  g«      j                  | j                   «      d   }|
|k7  }|||   |
|   z
  z  ||<   |j#                  |j%                  || |
z
  z  «      ||«      }|	|z  }|j                  |dd¬«      }|j                  ||z  dd¬«      }|j                  || z  dd¬«      }|j+                  ||z  |dz  «      }||z  ||z  z
  |z  } ||z  ||z  z
  |z  }!| |z  |!z   | z
  }|j                  |	|dz  z  dd¬«      }"|j)                  |"«      }#|j)                  |«      }$|j-                  |#|$k  «      d   }%||%dd…f   ||%dd…f<   |"|%   ||%<   | |%   ||%<   |!|%   |
|%<   �Œ¦ |j#                  |
 |z  j%                  «       d|«      j                  d«      }&|j                  |j.                  «      }|j1                  | |j                   ¬«      }'|j3                  | ||'¬«       |j                  |'|&|'¬«       |j%                  |'|'¬«       |j#                  |'|||'¬«       |'j5                  «       |j5                  «       |&j5                  «       fS t6        j9                  d«       t;        | ||«      S # t<        $ r% t6        j?                  d«       t;        | ||«      cY S w xY w)aÃ  Quantize tensor per group based on k quant.

    Ref: https://github.com/ggml-org/llama.cpp/blob/64eda5deb9859e87a020e56bab5d2f9ca956f1de/ggml/src/ggml-quants.c

    Args:
        data : input weight
        num_bits (int, optional): num_bits. Defaults to 4.
        group_size (int, optional): how many elements share one scale/zp. Defaults to 4.

    Returns:
        output: quantized weight
        scale: scale
        zero_point: zero point
    r   Nr   r   r   Tr^   r   r€   r�   r   rb   zqTry to use k-quant quantization on CUDA. However, CUDA is not available.Fall back to k-quant quantization on CPU.zÂNow we are using k-quant quantization on cpu, which is time consuming.Please consider install cupy to speed up on CUDA. See https://cupy.dev/Please also install torch to check CUDA availability.) ÚcupyÚtorchÚcudaÚis_availableÚasarrayr.   r6   r/   r‚   rƒ   rr   rg   rd   re   rh   r*   r   rs   rn   r„   rj   r…   r†   ri   rp   rq   Úgetr,   Úwarningr¢   ÚImportErrorÚinfo)(rt   r@   rA   Úcpr¥   rw   rx   r‡   rˆ   r‰   ry   rz   rŠ   r‹   rŒ   r|   rD   r�   rŽ   r�   r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   rš   r›   rœ   r�   rž   rŸ   r    r¡   rE   rC   s(                                           rV   Úquant_tensor_k_quant_cudar®     s´  € ðIDÛÛà�:‰:×"Ñ"Õ$Ø—:‘:˜dÓ#ˆDØ—<‘<  ZÐ 0Ó1×8Ñ8¸¿¹ÓDˆDØ�h‘; ‘?ˆDØˆDØ—V‘V˜D !™G¨!°d�VÓ;ˆFØ—7‘7˜6 JÑ.Ó/ˆDØ—f‘f˜T 2§6¡6¨$£<Ó0ˆGØ—6‘6˜$ Q°�6Ó6ˆDØ—6‘6˜$ Q°�6Ó6ˆDØ—F‘F˜7¨°T�FÓ:ˆEØ—F‘F˜7 T™>°¸D�FÓAˆEØ—W‘W˜TŸZ™Z¨t¯z©z�WÓ:ˆFØ˜4‘<ˆDØ  4™K¨D°©J¸¸d¹Ñ,CÑDˆF�4‰LØ˜‘JˆEØŸ™ §¡¨&°D¸4±KÑ*@Ó!AÀ4ÈÓNˆJØ˜:Ñ%¨Ñ,¨tÑ3ˆDØ—v‘v˜g¨¨a©Ñ/°aÀ$�vÓGˆHØˆEØˆFØˆEÜ˜U“|ó @�ØŸW™W T§Z¡Z°t·z±z˜WÓB�
ØŸ™ 5¨6°C©<Ñ#7¸$Ñ#>ÀÑ#EÐ"FÓG×NÑNÈtÏzÉzÓZÐ[\Ñ]�Ø˜t‘|�Ø#)¨T°$©Z¸$¸t¹*Ñ-DÑ#E�
˜4Ñ Ø!#§¡¨¯©°*ÀÀtÁÑ2LÓ)MÈtÐUYÓ!Z�Ø-4°~Ñ-EÐ*ØŸ™Ð9ÀÈD˜ÓQ�ØŸ™Ð :¸^Ñ KÐRSÐ^b˜Óc�ØŸ™Ð :¸TÑ AÈÐTX˜ÓY�Ø—K‘K ¨¡°°q±Ó9�à# f™n¨u°u©}Ñ<ÀÑA�
Ø" U™N¨U°V©^Ñ;¸qÑ@�à! NÑ2°XÑ=ÀÑD�Ø—f‘f˜W t¨Q¡wÑ.°QÀ�fÓF�àŸ™ ›�ØŸX™X hÓ/�
Ø!#§¡¨%°*Ñ*<Ó!=¸aÑ!@�Ø0>¸~ÊqÐ?PÑ0Q�
˜>ª1Ð,Ñ-Ø+.¨~Ñ+>�˜Ñ(Ø(2°>Ñ(B��nÑ%Ø'/°Ñ'?��^Ó$ð1@ð4 Ÿ™ D 5¨E¡/×!8Ñ!8Ó!:¸A¸tÓD×KÑKÈGÓTˆJØ—L‘L §¡Ó,ˆEØ—}‘} T°·±�}Ó=ˆHØ�I‰I�d˜E xˆIÔ0Ø�F‰F�8˜Z¨XˆFÔ6Ø�H‰H�X 8ˆHÔ,Ø�G‰G�H˜d D¨hˆGÔ7à—<‘<“> 5§9¡9£;°
·±Ó0@Ð@Ð@ä�N‰Nð<ôô ,¨D°(¸JÓGÐGøÜò DÜ�‰ðDô	
ô
 (¨¨h¸
ÓCÒCðDús   ‚P=Q" Ñ !Q" Ñ"+RÒRc                 óz   — | j                   }t        | |||||«      \  }}}	t        j                  |||	z
  z  |«      S )aÞ  Quant dequant tensor per group.

    Args:
        data : input weight
        num_bits (int, optional): num_bits. Defaults to 4.
        group_size (int, optional): how many elements share one scale/zp. Defaults to 4.
        scheme (str, optional): quantization scheme. Defaults to "asym".
        dtype (str, optional): data type. Defaults to "int".
        ratio (float, optional): percentile of clip. Defaults to 1.0.

    Returns:
        output: quant-dequant weight
    )r*   r~   r(   r.   )
rt   r@   rA   ru   r   rv   Ú	org_shapeÚweightrD   Úzps
             rV   Ú
qdq_tensorr³   y  sC   € ð —
‘
€IÜ$ T¨8°ZÀÈÐPUÓVÑ€FˆE�2Ü�:‰:�e˜v¨™{Ñ+¨YÓ7Ð7rX   c                 ó†   — |dk(  r| S | j                   }||z  }||d   z
  }|dkD  rt        j                  | d|fdfd«      } | S )a  Pad tensor rowi so that it can be is divisible by group_size.

    Args:
        weight (array): weight
        group_size (int): how many elements share one scale/zp
        k_blocks (int): the number of block

    Returns:
        weight: paded weight
    r   r   )r   r   Úconstant)r*   r(   Úpad)r±   rA   rB   Úorg_w_shapeÚpadded_rowsÚpad_lens         rV   Ú
pad_tensorrº   Œ  sY   € ð �RÒØˆà—,‘,€KØ˜ZÑ'€KØ˜K¨™NÑ*€Gà�‚{Ü—‘˜ ! W ¨vÐ 6¸
ÓCˆà€MrX   ÚCPUExecutionProviderÚk_quantc	                 ót  — t        | «      } | j                  �)t        j                  j	                  | j                  «      nd}	g }
g }t        | j                  «       D �cg c]  }|j                  dv sŒ|‘Œ c}«      }d}| j                  «       D �]n  }|j                  dv r|dz  }t        ||«       |j                  dv sŒ2| j                  |j                  d   «      €ŒQ|j                  |j                  i «      dk7  sŒq| j                  |j                  d   «      }t        j                  ||	¬«      j                  «       }t        |j                   «      dk7  rŒÍ|j"                  }|j                  |v r6||j                     d	   }||j                     d
   }||j                     d   }|j                   }|dk7  r|n|d   }|d   dz
  |z  dz   }| j%                  |j                  d   «      }t'        |||«      }|dk(  xs |dk(  }|rÒ|dk(  rt)        |j*                  ||«      \  }}}n;t-        |j*                  |||d|j                  |j                  d   d«      «      \  }}}t/        ||||||j1                  d«      |j1                  |«      |dk(  s|dk(  r|nd|¬«	      \  }}| j3                  |«       |j5                  |«       |
j5                  |«       �n	t7        |j*                  |||d|j                  |j                  d   d«      «      }t9        j:                  ||d   df«      }t9        j<                  |«      }|d|d   …dd…f   j1                  |«      }t>        j@                  jC                  |j                  d   d|›d|›�z   tE        |«      |j                   |jG                  «       d¬«      }| jI                  |«       |j                  |j                  d<   |dk(  s�Œ^| jK                  |«       �Œq | jM                  |
«       | jO                  |«       | jQ                  «        | S c c}w )aÔ  Quant the model with round to nearst method.

    Args:
        model (ModelProto or ONNXModel): onnx model
        weight_config (dict): quantization config
                For example,
                weight_config = {
                    'fc2':
                        {
                            'bits': 4,
                            'group_size': 32,
                            'scheme': 'sym',
                            'algorithm': 'RTN'
                        }
                }
        num_bits (int, optional): num_bits. Default is 4.
        group_size (int, optional): how many elements share one scale/zp. Default is 32.
        scheme (str, optional): sym or asym. Defaults to "asym".
        ratios (dict, optional): percentile of clip. Defaults to {}.
        accuracy_level (int): accuracy level. Support 0 (unset),1(fp32), 2(fp16), 3(bf16), or 4(int8).
        providers (list): providers to use

    Returns:
        model: fake quantized ONNXModel
    NÚ ©ÚMatMulr   r   Úfp32)Úbase_dirr   r"   rA   ru   r   r   r
   r¼   r\   r   rZ   ©	r>   r?   r@   rA   rB   rC   rD   rE   r$   ra   r   r   Tr   ))r   Ú
model_pathÚosÚpathÚdirnameÚlenÚnodesrL   r   Úget_initializerr+   r©   r   r   Úto_arrayÚcopyr*   r   Úget_initializer_share_numrº   r®   ÚTr~   rW   r6   Úadd_initializersr5   r³   r(   r.   Ú	transposer1   r2   r3   r   r4   Úadd_initializerÚremove_initializerÚ	add_nodesÚremove_nodesÚtopological_sort)ÚmodelÚweight_configr@   rA   ru   Úratiosr$   Ú	providersÚ	algorithmrÂ   Ú	new_nodesrÔ   r}   Ú	total_numÚcurr_idr>   Úweight_tensorr±   r   r·   rB   Úinit_share_numÚsatisfy_MatMulNBits_conditionrC   rD   r²   Úq_matmul_noderJ   rT   s                                rV   Úrtn_quantizerâ   ¤  sý  € ôH �eÓ€EØ49×4DÑ4DÐ4PŒr�w‰w�‰˜u×/Ñ/Ô0ÐVX€HØ€IØ€LÜ §¡£ÖI˜1°·±¸jÒ1H’QÒIÓJ€IØ€GØ—‘“ó E8ˆØ�<‰<˜:Ñ%Ø�q‰LˆGÜ 	¨7Ô3à�L‰L˜JÒ&Ø×%Ñ% d§j¡j°¡mÓ4Ñ@Ø×!Ñ! $§)¡)¨RÓ0°FÓ:à!×1Ñ1°$·*±*¸Q±-Ó@ˆMÜ!×*Ñ*¨=À8ÔL×QÑQÓSˆFÜ�6—<‘<Ó  AÒ%Øà—L‘LˆEà�y‰y˜MÑ)Ø(¨¯©Ñ3°FÑ;�Ø*¨4¯9©9Ñ5°lÑC�
Ø& t§y¡yÑ1°(Ñ;�à Ÿ,™,ˆKØ'1°RÒ'7™¸[È¹^ˆJà# A™¨Ñ*¨zÑ9¸AÑ=ˆHØ"×<Ñ<¸T¿Z¹ZÈ¹]ÓKˆNä ¨
°HÓ=ˆFà,4¸©MÒ,J¸XÈ¹]Ð)á,Ø 	Ò)Ü*CÀFÇHÁHÈhÐXbÓ*cÑ'�H˜e¡Rä*6ØŸ™ (¨J¸ÀÈÏ
É
ÐSW×S]ÑS]Ð^_ÑS`ÐbcÓHdó+Ñ'�H˜e Rô ,HØØ!,Ø%Ø)Ø%Ø%Ÿ_™_¨WÓ5ØŸ,™, uÓ-Ø%+¨vÒ%5¸ÀiÒ9O™rÐUYØ#1ô
,Ñ(�˜yð ×&Ñ& yÔ1Ø×#Ñ# DÔ)Ø× Ñ  Ö/ä% f§h¡h°¸*ÀfÈeÐU[×U_ÑU_Ð`d×`jÑ`jÐklÑ`mÐopÓUqÓr�ÜŸ:™: h°¸Q±ÀÐ0DÓE�ÜŸ<™<¨Ó1�Ø#Ð$4 k°!¡nÐ$4²aÐ$7Ñ8×?Ñ?ÀÓF�Ü"&§+¡+×"9Ñ"9ØŸ™ A™¨2¨h¨\¸¸:¸.Ð)IÑIÜ6°uÓ=ØŸ™Ø!×)Ñ)Ó+Øð #:ó #�ð ×%Ñ% oÔ6Ø /× 4Ñ 4�—
‘
˜1‘Ø Ô"Ø×(Ñ(¨Ö7ðKE8ðN 
‡O�O�IÔØ	×Ñ�|Ô$Ø	×ÑÔØ€LùòY Js   ÁP5Á2P5c           
      ó0  — | j                   }|dk7  rt        j                  | d|f«      n| } t        j                  t        j                  t        j                  | «      t        j
                  t        j                  | «      dd¬«      z  |«      d¬«      }|S )zGet the scale of weight.r   r   Tr^   r   ©r_   )r*   r(   r.   Úmeanrg   re   )r±   rA   r°   rD   s       rV   Úget_weight_scaleræ     sn   € à—‘€IØ5?À2Ò5EŒR�Z‰Z˜  ZÐ 0Ô1È6€FÜ�G‰G”B—J‘JœrŸv™v f›~´·±´r·v±v¸f³~ÈAÐX\Ô0]Ñ]Ð_hÓiÐpqÔr€EØ€LrX   c                 ó�  — ddl m} ddlm} t	        j
                  «       }t        j                  dk  r$ |d«      rddlm	} |j                   |«       «       | j                  r1t        j                  | j                  | j                  dz   d	d	d
¬«       | j                  s0t	        j                   | j                  j#                  «       ||¬«      n$t	        j                   | j                  dz   ||¬«      }|j%                  «       D �	cg c]  }	|	j&                  ‘Œ }
}	~g }t)        |«      D �]~  \  }	}|dk7  r|	dz   |j*                  z  |kD  r ||fS t-        |
«      dk7  st/        |d   t0        «      r<t-        |d   «      t-        |
«      k(  s"J dt-        |
«      › dt-        |d   «      › �«       ‚t/        |d   t0        «      rG|j3                  t1        |d   j5                  «       D ��cg c]  \  }}| ||«      f‘Œ c}}«      «       ŒÝt/        |d   t6        j8                  «      rA|j3                  t1        t;        |
|d   gd
¬«      D ��cg c]	  \  }}||f‘Œ c}}«      «       �Œ;|j3                  t1        t;        |
|d   d
¬«      D ��cg c]  \  }}| ||«      f‘Œ c}}«      «       �Œ� ||fS c c}	w c c}}w c c}}w c c}}w )as  Prepare inputs for weight only quantization.

    Args:
        model (ModelProto or ONNXModel): onnx model
        n_samples (int, optional): calibration sample number. -1 means all samples.
        dataloader (object): dataloader for calibration.
        providers (list): providers to use

    Returns:
        inputs: prepared inputs.
        so: session options
    r   )Ú	find_specr   )Úto_numpy)é   é   Úonnxruntime_extensions)Úget_library_pathú_augment.onnxTF©Úsave_as_external_dataÚall_tensors_to_one_fileÚconvert_attribute©rÙ   r   zInput number mismatch, require z	 but get ©Ústrict)Úimportlib.utilrè   Úutilré   ÚortÚSessionOptionsÚsysÚversion_inforì   rí   Úregister_custom_ops_libraryÚis_large_modelr1   Ú
save_modelrÖ   rÄ   ÚInferenceSessionÚSerializeToStringÚ
get_inputsr   Ú	enumerateÚ
batch_sizerÈ   Ú
isinstanceÚdictr5   Úitemsr(   ÚndarrayÚzip)rÖ   Ú	n_samplesÚ
dataloaderrÙ   rè   ré   Úsorí   Úsessionr}   Úinputs_namesr%   rt   r   Úinp_dataÚinps                   rV   Úprepare_inputsr  #  s~  € õ )åä	×	Ñ	Ó	€BÜ
×Ñ˜'Ò!¡iÐ0HÔ&IÝ;à
×&Ñ&Ñ'7Ó'9Ô:Ø×ÒÜ�‰Ø�K‰KØ×Ñ˜Ñ.Ø"&Ø$(Ø#õ	
ð ×#Ò#ô 	×Ñ˜UŸ[™[×:Ñ:Ó<¸bÈIÕVä×!Ñ! %×"2Ñ"2°_Ñ"DÀbÐT]Ô^ð ð
 %,×$6Ñ$6Ó$8Ö9˜q�A—F“FÐ9€LÐ9Øà€FÜ˜ZÓ(ó s‰ˆˆ4Ø˜Š?  Q¡¨*×*?Ñ*?Ñ ?À9ÒLØð �2ˆ:Ðô ˆ|Ó Ò!¤Z°°Q±¼Ô%>Ü�t˜A‘w“<¤3 |Ó#4Ò4ð Ø1´#°lÓ2CÐ1DÀIÌcÐRVÐWXÑRYËlÈ^Ð\óÐ4ô �d˜1‘gœtÔ$Ø�M‰Mœ$ÐQUÐVWÑQX×Q^ÑQ^ÓQ`×a¹~¸tÀX ¡x°Ó'9Ò :ÓaÓbÕcÜ˜˜Q™¤§¡Ô,Ø�M‰Mœ$¼SÀÐPTÐUVÑPWÈyÐafÔ=g×h±	°°c  s¢ÓhÓiÖjà�M‰Mœ$ÄsÈ<ÐY]Ð^_ÑY`ÐinÔGo×p¹)¸$À ¡x°£}Ò 5ÓpÓqÖrðsð �2ˆ:Ðùò% :ùó  bùãhùãps   ÄJ1Ç'J6É
J<Ê
Ké€   ç{®Gáz„?FTc
                 ó|  ‡‡‡	‡#‡$‡%‡&— d|z  dz
  Š$dŠ#dŠ%dŠ&ˆ#ˆ$ˆ%ˆˆ&ˆ	ˆfd„}
| j                   } |
| «      \  }}t        j                  |«      dk(  }d|||f<   d| |dd…f<   |rGt        j                  t        j                  |«      «      ddd	…   }| |dd…f   } ||dd…f   dd…|f   }t        j                  | «      }t        j                  | «      }|t        j
                  t        j                  |«      «      z  }t        j                  |d   «      }|||fxx   |z  cc<   t        j                  j                  t        j                  j                  |«      «      j                  }|}t        d|d   |«      D �]ú  }t        ||z   |d   «      }||z
  }t        j                  | ||…dd…f   «      }t        j                  |«      }t        j                  |«      }t        j                  |«      }|||…||…f   }t        |«      D �]   }||dd…f   }|||f   }|d	k7  r(||z   |z  dk(  r |
| ||z   ||z   |z   …dd…f   «      \  }}|t        j                  t        j                   |dd…t        j"                  f   |z  «      |z   d‰$«      |z
  z  j%                  «       } | ||dd…f<   || z
  dz  |dz  z  ||dd…f<   || z
  |z  }!||d…dd…fxx   t        j&                  t        j(                  ||d…|f   d¬
«      t        j(                  |!d¬
«      «      z  cc<   |!||dd…f<   �Œ# ||||…dd…f<   |dz  |||…dd…f<   | |d…dd…fxx   t        j&                  ||d…||…f   |«      z  cc<   �Œý |rt        j                  «      }"||"dd…f   }t        j*                  || j                   «      }~ |S )a  Quant the weight with GPTQ method.

    Args:
        W (array): weight.
        H (array): Hessian matrix.
        num_bits (int, optional): num_bits. Default is 4.
        group_size (int, optional): how many elements share one scale/zp. Default is 32.
        scheme (str, optional): sym or asym. Defaults to "asym".
        blocksize (int, optional): blocksize to quantize weight.
        percdamp (float, optional): percent of the average Hessian diagonal to use for dampening.
        actorder (bool, optional): whether rearrange Hessian matrix considering the diag's value.
        mse (bool, optional): whether get scale and zero point with mse error.
        perchannel (bool, optional): whether quantize weight per-channel.

    Returns:
        Q: fake quantized weight
    r   r   éd   gš™™™™™é?g333333@c                 ó  •— | j                   }‰s%t        j                  | j                  «       d¬«      } t        j                  | j                   d   «      }t        j
                  t        j                  | d¬«      |«      }t        j                  t        j                  | d¬«      |«      }‰dk(  rLt        j                  t        j                  |«      |«      }|dk  }t        j                  |«      r	||    ||<   |dk(  |dk(  z  }d||<   d||<   ||z
  ‰z  }‰dk(  r)t        j                  |j                   «      ‰dz   z  dz  }nt        j                  | |z  «      }‰�r,t        j                  | j                   d   g«      t        d«      z  }t        t        ‰‰z  «      «      D ]ã  }d|‰z  z
  }	|	|z  }
|	|z  }||
z
  ‰z  }‰dk7  rt        j                  |
 |z  «      n|}t        j                   t        j                  | |z  «      |z   d‰«      }|| z  }t        j"                  t        j                  |«      ‰«      }t        j$                  |d«      }||k  }t        j                  |«      sŒÌ||   ||<   ||   ||<   ||   ||<   Œå ‰s1|d   }t        j&                  ||«      }t        j&                  ||«      }dgdgt)        |«      dz
  z  z   }t        j*                  ||«      }t        j*                  ||«      }||fS )Nr   rä   r   r]   r   r   Úinf)r*   r(   Úexpand_dimsrk   r)   ro   rd   rf   re   rg   Úanyrh   rn   rm   r„   ra   rs   Úpowerr‚   ÚrepeatrÈ   r.   )r±   r°   ÚtmpÚxminÚxmaxrD   ÚzeroÚbestr}   ÚpÚxmin1Úxmax1Úscale1Úzero1ÚqÚerrr*   Úgridrw   Ú	maxshrinkÚmseÚnormÚ
perchannelru   s                    €€€€€€€rV   Úfind_paramszgptq.<locals>.find_params~  s°  ø€ Ø—L‘Lˆ	áÜ—^‘^ F§N¡NÓ$4¸1Ô=ˆFÜ�h‰h�v—|‘| A‘Ó'ˆÜ�z‰zœ"Ÿ&™& ¨aÔ0°#Ó6ˆÜ�z‰zœ"Ÿ&™& ¨aÔ0°#Ó6ˆØ�UŠ?Ü—:‘:œbŸf™f T›l¨DÓ1ˆDØ˜‘(ˆCÜ�v‰v�cŒ{Ø! #™Y˜J��S‘	Ø�q‰y˜T Q™YÑ'ˆØˆˆS‰	ØˆˆS‰	à˜‘ Ñ$ˆØ�UŠ?Ü—7‘7˜5Ÿ;™;Ó'¨4°!©8Ñ4°qÑ8‰Dä—8‘8˜T˜E E™MÓ*ˆDÚÜ—7‘7˜FŸL™L¨™OÐ,Ó-´°e³Ñ<ˆDÜœ3˜y¨4Ñ/Ó0Ó1ò +�Ø˜˜D™‘L�Ø˜D™�Ø˜D™�Ø %™-¨4Ñ/�Ø5;¸u²_œŸ™ % ¨&¡Ô1È$�Ü—G‘GœBŸH™H V¨f¡_Ó5¸Ñ=¸qÀ$ÓG�Ø�V‘�Ü—H‘HœRŸV™V A›Y¨Ó-�Ü—f‘f˜Q “l�Ø˜D‘j�Ü—6‘6˜#•;Ø # C¡�D˜‘IØ!'¨¡�E˜#‘JØ % c¡
�D˜’Ið+ñ Ø˜A‘,ˆCÜ—I‘I˜e SÓ)ˆEÜ—9‘9˜T 3Ó'ˆDØ�˜�sœc )›n¨qÑ0Ñ1Ñ1ˆÜ—
‘
˜5 %Ó(ˆÜ�z‰z˜$ Ó&ˆØ�dˆ{ÐrX   r   Nr   rä   )r*   r(   ÚdiagÚargsortÚ
zeros_likerå   r8   ÚlinalgÚcholeskyÚinvrÎ   r„   rd   rÌ   Údeepcopyrs   rn   Únewaxisrk   Úmatmulr  r.   )'ÚWÚHr@   rA   ru   Ú	blocksizeÚpercdampÚactorderr)  r+  r,  r*   rD   r²   ÚdeadÚpermÚLossesÚQÚdampr-  ÚHinvÚi1Úi2ÚcountÚW1ÚQ1ÚErr1ÚLosses1ÚHinv1r}   ÚwÚdr%  Úerr1Úinvpermr'  rw   r(  r*  s'       `   ``                         @@@@rV   ÚgptqrM  \  s   þ€ ð: ˆh‰;˜‰?€DØ€DØ€IØ€D÷.ò .ð` �G‰G€EÙ˜A“�I€Eˆ2Ü�7‰7�1‹:˜‰?€DØ€A€dˆD€j�MØ€A€dŠA€g�Jñ Ü�z‰zœ"Ÿ'™' !›*Ó%¡d¨ dÑ+ˆØˆd’Aˆg‰JˆØˆd’Aˆg‰J’q˜$�wÑˆÜ�]‰]˜1Ó€FÜ
�‰�aÓ€AØ”b—g‘gœbŸg™g a›jÓ)Ñ)€DÜ�9‰9�U˜1‘XÓ€DØ€dˆD€jƒM�TÑƒMÜ
�	‰	×Ñœ2Ÿ9™9Ÿ=™=¨Ó+Ó,×.Ñ.€AØ€DÜ�A�u˜Q‘x Ó+ó 7ˆÜ��i‘  q¡Ó*ˆØ�R‘ˆä�]‰]˜1˜R ˜U¢A˜X™;Ó'ˆÜ�]‰]˜2ÓˆÜ�}‰}˜RÓ ˆÜ—-‘- Ó#ˆØ�R˜�U˜B˜r˜E�\Ñ"ˆä�u“ó 	ˆAØ�1’a�4‘ˆAØ�a˜�d‘ˆAà˜RÒØ˜‘F˜jÑ(¨AÒ-Ù +¨A¨r°A©v¸"¸q¹&À:Ñ:MÐ.NÒPQÐ.QÑ,RÓ S‘I�E˜2àœ"Ÿ'™'¤"§(¡(¨1ªQ´·
±
¨]Ñ+;¸eÑ+CÓ"DÀrÑ"IÈ1ÈdÓSÐVXÑXÑY×bÑbÓdˆAØˆBˆq’!ˆt‰HØ ™U q™L¨1¨a©4Ñ/ˆG�A’q�D‰Mà˜‘E˜Q‘;ˆDØˆq‰r’1ˆu‹IœŸ™¤2§>¡>°%¸¹¸A¸±,ÀQÔ#GÌÏÉÐX\ÐcdÔIeÓfÑf‹IØˆD�’A�‹Jð	ð  ˆˆ"ˆRˆ%’ˆ(‰Ø" Q™;ˆˆr�"ˆu’aˆxÑà	ˆ"‰#Šqˆ&‹	”R—Y‘Y˜t B¡C¨¨B¨ JÑ/°Ó6Ñ6�	ð;7ñ> Ü—*‘*˜TÓ"ˆØˆg’qˆj‰Mˆä
�
‰
�1�a—g‘gÓ€AØ	Ø€HrX   c                 óà  — t        | «      } | j                  �)t        j                  j	                  | j                  «      nd}t        | |||«      \  }}~t        j                  | j                  j                  j                  «      }| j                  |D �cg c]  }|j                  ‘Œ c}«       g }| j                  «       D ]  }|j                  dv sŒ|j                  |j                  i «      dk7  sŒ2|j                  |j                  i «      j                  dd«      dk(  sŒb|j!                  |j"                  d   «       Œ� t%        t'        |«      «      }| j)                  |«       | j*                  r1t-        j.                  | j                  | j                  dz   d	d	d
¬«       | j*                  s0t1        j2                  | j                  j5                  «       ||¬«      n$t1        j2                  | j                  dz   ||¬«      }t7        |«      D �]¤  \  }}t9        t;        |«      |dz   «       g }g }| j<                  |   D �].  }|j                  dv sŒ|j                  |j                  i «      dk7  sŒ3|j                  |j                  i «      j                  dd«      dk(  sŒc| j?                  |j"                  d   «      €Œ‚tA        jB                  | j?                  | jE                  |j                  «      j"                  d   «      |«      j                  «       }t;        |jF                  «      dk7  rŒô|j!                  |«       |j!                  | jE                  |j                  «      «       �Œ1 t;        |«      dk(  r�Œt|D �cg c]3  }tI        jJ                  |jF                  d   |jF                  d   f«      ‘Œ5 }}d}|D ]´  }|jM                  |g|«      d   }|jF                  d   }tI        jN                  |d|jF                  d   f«      }|D �cg c]  }||||z   z  z  ‘Œ }}||z  }tI        jP                  d|z  «      |z  }|D �cg c]%  }|tI        jR                  |jT                  |«      z   ‘Œ' }}Œ¶ tW        |||d
¬«      D �]%  \  }}} |j                  |v r6||j                     d   }||j                     d   }||j                     d   }|dk7  r|n|jF                  d   }|jX                  }!t[        || ||||||	|
|¬«
      }"| j?                  |j"                  d   «      }#| j]                  |j"                  d   «      }$|dk(  }%|%r´|jF                  }&|&d   |z   dz
  |z  }'t_        |"||'«      }"ta        |"jT                  |||d«      \  }"}(})tc        ||&|||'|"je                  d«      |(je                  |!«      |dk(  r|)nd|¬«	      \  }*}+| jg                  |+«       | ji                  |«       | jk                  |*«       n”t,        jl                  jo                  |j"                  d   d|›d|›�z   tq        |!«      |"jF                  |"je                  |!«      js                  «       d	¬«      },| ju                  |,«       |,j                  |j"                  d<   |$dk(  s�Œ| jw                  |#«       �Œ( �Œ§ | j                  |«       | j                  j                  j                  jy                  |«       | j{                  «        | j*                  rCddl>m?}-  |-| j                  t        j                  j�                  | j                  «      d   «       | S c c}w c c}w c c}w c c}w )a›  Quant the model with GPTQ method.

    Args:
        model (ModelProto or ONNXModel): onnx model
        dataloader (object): dataloader for calibration.
        weight_config (dict): quantization config
                For example,
                weight_config = {
                    'fc2':
                        {
                            'bits': 4,
                            'group_size': 32,
                            'scheme': 'sym',
                            'algorithm': 'GPTQ'
                        }
                }
        num_bits (int, optional): num_bits. Default is 4.
        group_size (int, optional): how many elements share one scale/zp. Default is 32.
        scheme (str, optional): sym or asym. Defaults to "asym".
        n_samples (int, optional): calibration sample number.
        percdamp (float, optional): percent of the average Hessian diagonal to use for dampening.
        blocksize (int, optional): blocksize to quantize weight.
        actorder (bool, optional): whether rearrange Hessian matrix considering the diag's value.
        mse (bool, optional): whether get scale and zero point with mse error.
        perchannel (bool, optional): whether quantize weight per-channel.
        accuracy_level (int): accuracy level. Support 0 (unset), 1(fp32), 2(fp16), 3(bf16), or 4(int8).
        providers (list): providers to use

    Returns:
        model: fake quantized ONNXModel
    Nr¾   r¿   rÁ   rÚ   ÚGPTQr   rî   TFrï   ró   r   r   r   rô   r"   rA   ru   )r@   rA   ru   r8  r9  r:  r)  r+  r   r\   r   rZ   rÃ   r   r   r   )Úload_external_data_for_model)Ar   rÄ   rÅ   rÆ   rÇ   r  rÌ   r3  rÖ   Úgraphr<   Úremove_tensors_from_outputsr   rÉ   rL   r©   r5   r+   ÚlistÚsetÚadd_tensors_to_outputsrý   r1   rþ   rø   rÿ   r   r  r   rÈ   Úinput_name_to_nodesrÊ   r   rË   Úget_noder*   r(   r)   Úrunr.   rƒ   r5  rÎ   r  r   rM  rÍ   rº   r~   rW   r6   rÏ   Úremove_nodeÚadd_noder2   r3   r   r4   rÑ   rÒ   Ú	MergeFromrÕ   Úonnx.external_data_helperrP  Úsplit).rÖ   r
  r×   r@   rA   ru   r	  r9  r8  r:  r)  r+  r$   rÙ   rÂ   r%   r  Ú
org_outputr}   Úoutput_namesr>   r  rP   Ú
input_nameÚ	node_listr‰   r±   ÚHsÚnsamplesrt   r  r  r7  r   rC   rÞ   rß   rà   r°   rB   rD   r²   rá   rJ   rT   rP  s.                                                 rV   Úgptq_quantizerd  è  s¯  € ô^ �eÓ€EØ49×4DÑ4DÐ4PŒr�w‰w�‰˜u×/Ñ/Ô0ÐVX€Hä  y°*¸iÓH�J€FˆBØÜ—‘˜uŸ{™{×0Ñ0×7Ñ7Ó8€JØ	×%Ñ%°zÖ&B°! q§v£vÒ&BÔCØ€LØ—‘“ò /ˆà�L‰L˜JÒ&Ø×!Ñ! $§)¡)¨RÓ0°FÓ:Ø×!Ñ! $§)¡)¨RÓ0×4Ñ4°[À&ÓIÈVÓSà×Ñ §
¡
¨1¡Õ.ð/ô œ˜LÓ)Ó*€LØ	× Ñ  Ô.Ø×ÒÜ�‰Ø�K‰KØ×Ñ˜Ñ.Ø"&Ø$(Ø#õ	
ð ×#Ò#ô 	×Ñ˜UŸ[™[×:Ñ:Ó<¸bÈIÕVä×!Ñ! %×"2Ñ"2°_Ñ"DÀbÐT]Ô^ð ô % \Ó2ó `8‰ˆˆZÜœC Ó-¨s°Q©wÔ7Øˆ	Øˆà×-Ñ-¨jÑ9ó 	<ˆDà—‘ 
Ò*Ø!×%Ñ% d§i¡i°Ó4¸Ó>Ø!×%Ñ% d§i¡i°Ó4×8Ñ8¸ÀfÓMÐQWÓWØ×)Ñ)¨$¯*©*°Q©-Ó8ÑDä%×.Ñ.Ø×)Ñ)¨%¯.©.¸¿¹Ó*C×*IÑ*IÈ!Ñ*LÓMÈxóç‘$“&ð ô �v—|‘|Ó$¨Ò)Øà—‘˜vÔ&Ø× Ñ  §¡°·	±	Ó!:Ö;ð	<ô  ˆw‹<˜1ÒÙà:AÖB°QŒb�h‰h˜Ÿ™ ™
 A§G¡G¨A¡JÐ/Õ0ÐBˆÐBØˆØò 	9ˆDØ—+‘+˜z˜l¨DÓ1°!Ñ4ˆCØ—)‘)˜A‘,ˆCÜ—*‘*˜S 2 s§y¡y°¡}Ð"5Ó6ˆCØ=?Ö@¸�!�x 8¨c¡>Ñ2Ó3Ð@ˆBÐ@Ø˜‰OˆHÜ—'‘'˜!˜h™,Ó'¨#Ñ-ˆCØ57Ö8°�!”b—i‘i §¡ sÓ+Ó+Ð8ˆBÑ8ð	9ô �˜G R°Ô6ó	=	8ñ 
ØØØà�y‰y˜MÑ)Ø(¨¯©Ñ3°FÑ;�Ø*¨4¯9©9Ñ5°lÑC�
Ø& t§y¡yÑ1°(Ñ;�Ø'1°RÒ'7™¸V¿\¹\È!¹_ˆJØ—L‘LˆEäØØØ!Ø%ØØ#Ø!Ø!ØØ%ôˆHð "×1Ñ1°$·*±*¸Q±-Ó@ˆMØ"×<Ñ<¸T¿Z¹ZÈ¹]ÓKˆNà,4¸©MÐ)á,Ø"ŸL™L�	Ø% a™L¨:Ñ5¸Ñ9¸jÑH�Ü% h°
¸HÓE�Ü&2°8·:±:¸xÈÐU[Ð]cÓ&dÑ#�˜% Ü+GØØ!*Ø%Ø)Ø%Ø%Ÿ_™_¨WÓ5ØŸ,™, uÓ-Ø%+¨vÒ%5™r¸4Ø#1ô
,Ñ(�˜yð ×&Ñ& yÔ1Ø×!Ñ! $Ô'Ø—‘˜}Õ-ä"&§+¡+×"9Ñ"9ØŸ™ A™¨2¨h¨\¸¸:¸.Ð)IÑIÜ6°uÓ=Ø!Ÿ™Ø!Ÿ™¨Ó/×7Ñ7Ó9Øð #:ó #�ð ×%Ñ% oÔ6Ø /× 4Ñ 4�—
‘
˜1‘Ø Ô"Ø×(Ñ(¨Ö7ò{=	8ðG`8ðD 
×%Ñ% lÔ3Ø	‡K�K×Ñ×Ñ×&Ñ& zÔ2à	×ÑÔð ×ÒÝJá$ U§[¡[´"·'±'·-±-À×@PÑ@PÓ2QÐRSÑ2TÔUà€LùòO 'Cùòd Cùò Aùò 9s   Â]Î8]!Ð]&Ñ*]+)r   )r   rY   rZ   ra   g      ð?)r   rY   )r   rY   rZ   r  r  FFT)Ú__doc__rÌ   ÚloggingrÅ   rú   Únumpyr(   r1   r   Úonnx.helperr   Úonnxruntimerø   Ú
onnx_modelr   r÷   r   Ú	getLoggerr,   rW   r~   r¢   r®   r³   rº   râ   ræ   r  rM  rd  © rX   rV   ú<module>rm     sè   ðñ0 %ã Û Û 	Û 
ã Û Ý Ý 0ã å !Ý %à	ˆ×	Ñ	Ð.Ó	/€ð óp.óf3'ólF'óRXDóv8ò&ð4 ØØØØØØ%Ð&Øótònò6ðx ØØØØØØØóIð^ ØØØØØØØØØØØ%Ð&ô|rX   