ó
    oM‡j÷N  ã            
       óR  • S r SSKrSSKrSSKrSSKrSSKJrJr  SSKJ	r	  SSK
JrJrJrJrJrJrJr  SSKJr  \R(                  " \5      r\(       a  SS	KJr  \" 5       (       a  SS
KJr  \" 5       (       a¬  SSKrSSKJr  \" SS5      (       aq  \R<                  \R>                  \R@                  \RB                  \RD                  \RF                  \RH                  \RJ                  \RL                  \RN                  4
r(O#\R<                  \R>                  \R@                  4r(\" 5       (       a"  SSK)J*r*  \" SS5      (       a  SSK+J,r,J-r-  SSK.J/r/  S r0\" 5       (       a/  \" SS5      (       a!  \" 5       (       a  \" SS5      (       a  \0" 5         S\1S\1S-  4S jr2S r3 " S S\5      r4g)z™
Adapted from
https://github.com/huggingface/transformers/blob/3a8eb74668e9c2cc563b2f5c62fac174797063e0/src/transformers/quantizers/quantizer_torchao.py
é    N)ÚTYPE_CHECKINGÚAny)Úversioné   )Úget_module_from_nameÚis_safetensors_availableÚis_torch_availableÚis_torch_versionÚis_torchao_availableÚis_torchao_versionÚloggingé   )ÚDiffusersQuantizer)Ú
ModelMixin)Ú	safe_openú>=z2.5)Ú	quantize_ú0.16.0)Úflatten_tensor_state_dictÚunflatten_tensor_state_dict)Úis_metadata_torchaoc                  ó¨  • [         R                  S4[         R                  S4[         R                  S4[         R                  S4[         R
                  S4[         R                  S4[         R                  S4/n  SS	KJ	n  SS
K
JnJn  U R                  X2U/5        [        SS5      (       a  OSSKJn  SSKJn  U R                  XT/5         [         R0                  R3                  U S9  g ! [&        [(        4 a4  n[*        R-                  S5        [*        R/                  U5         S nAN]S nAff = f! [         R0                  R3                  U S9  f = f)Nztorch.uint1ztorch.uint2ztorch.uint3ztorch.uint4ztorch.uint5ztorch.uint6ztorch.uint7r   )Ú	NF4Tensor)ÚUintxAQTTensorImplÚUintxTensorÚ>ú0.15.0)ÚFloat8AQTTensorImpl)ÚUInt4TensorzhUnable to import `torchao` Tensor objects. This may affect loading checkpoints serialized with `torchao`)Úsafe_globals)ÚtorchÚuint1Úuint2Úuint3Úuint4Úuint5Úuint6Úuint7Útorchao.dtypesr   Ú!torchao.dtypes.uintx.uintx_layoutr   r   Úextendr   Ú#torchao.dtypes.floatx.float8_layoutr   Ú!torchao.dtypes.uintx.uint4_layoutr   ÚImportErrorÚModuleNotFoundErrorÚloggerÚwarningÚdebugÚserializationÚadd_safe_globals)r    r   r   r   r   r   Úes          Ú¼C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\diffusers/quantizers/torchao/torchao_quantizer.pyÚ_update_torch_safe_globalsr7   X   s  € ä	�‰�mÐ$Ü	�‰�mÐ$Ü	�‰�mÐ$Ü	�‰�mÐ$Ü	�‰�mÐ$Ü	�‰�mÐ$Ü	�‰�mÐ$ð€LðHÝ,ßUà×Ñ˜[¸iÐHÔIô ˜c 8×,Ñ,ØåOÝEà×Ñ Ð BÕCô 	×Ñ×,Ñ,¸,Ð,ÒGøô Ô,Ð-ó Ü�‰Øvô	
ô 	�‰�Q�‰ûð	ûô 	×Ñ×,Ñ,¸,Ð,ÒGús<   Á;2C+ Â-D2 Â.C+ ÃD2 Ã+D/Ã;*D*Ä%D2 Ä*D/Ä/D2 Ä2Ez2.6.0r   Úconfig_nameÚreturnc                 ó‚   • U R                  5       n [        R                  " SU 5      nU(       a  UR                  S5      $ g)zz
Extract the size digit from strings like "4weight", "8weight". Returns the digit as an integer if found, otherwise
None.
z
(\d)weighté   N)ÚlowerÚreÚsearchÚgroup)r8   Ú	str_matchs     r6   Úfuzzy_match_sizerA   …   s7   € ð
 ×#Ñ#Ó%€Kä—	’	˜-¨Ó5€IæØ�‰˜qÓ!Ð!àó    c                 ón  • SSK Jn  [        U R                  U5      (       a   U R                  R                  R
                  OS nUc7  SU R                  R                  S    SU R                  R                  S    S3$ SU R                  R                  S    SU R                  R                  S    SU 3$ )Nr   ©ÚTorchAOBaseTensorzin_features=r;   z, out_features=z, weight=Nonez	, weight=)Útorchao.utilsrE   Ú
isinstanceÚweightÚ	__class__Ú__name__Úshape)ÚselfrE   rH   s      r6   Ú_linear_extra_reprrM   ”   s§   € Ý/ä/9¸$¿+¹+ÐGX×/YÑ/YˆT�[‰[×"Ñ"×+Ò+Ð_c€FØ�~Ø˜dŸk™k×/Ñ/°Ñ2Ð3°?À4Ç;Á;×CTÑCTÐUVÑCWÐBXÐXeÐfÐfà˜dŸk™k×/Ñ/°Ñ2Ð3°?À4Ç;Á;×CTÑCTÐUVÑCWÐBXÐXaÐbhÐaiÐjÐjrB   c                   ó  ^ • \ rS rSrSrSrS/rSrU 4S jrS r	S r
S-S
 jrS\\\\-  4   S	\\\\-  4   4S jrS.S\\\4   S\4S jjrS\\   S\\   S	\\   4S jrS\\   4S jr\S 5       rS\\\4   S	\\\4   4S jr\S	\4S j5       rS rSSSSS\S\\\4   S	\4
S jrSSSSS\SSS\\\4   S \\   4S! jrS" r/ 4SSS#\\   4S$ jjrS/S% jr\S& 5       r \S' 5       r!S(r"\S) 5       r#\S	\4S* j5       r$S+ r%S,r&U =r'$ )0ÚTorchAoHfQuantizeréž   zB
Diffusers Quantizer for TorchAO: https://github.com/pytorch/ao/.
FÚtorchaoTc                 óD   >• [         TU ]  " U40 UD6  0 U l        0 U l        g ©N)ÚsuperÚ__init__Ú	_metadataÚ_pending_flattened_state_dict)rL   Úquantization_configÚkwargsrI   s      €r6   rU   ÚTorchAoHfQuantizer.__init__§   s%   ø€ Ü‰ÒÐ,Ñ7°Ò7àˆŒØ-/ˆÕ*rB   c                 óò  • [        5       (       d  [        S5      e[        R                  " [        R
                  R                  S5      5      nU[        R                  " S5      :  a  [        SU S35      eSU l        UR                  SS 5      n[        U[        5      (       aK  SUR                  5       ;   d  S	UR                  5       ;   a#  U R                  (       a  [        S
5      eSU l        U R                  (       aw  UR                  SS 5      nU(       a]  [        R                  " [        R
                  R                  S5      5      nU[        R                  " S5      :  a  [        SU S35      eg g g )NziLoading a TorchAO quantized model requires the torchao library. Please install with `pip install torchao`rQ   r   zPThe minimum required version of `torchao` is 0.15.0, but the current version is z/. Please upgrade with `pip install -U torchao`.FÚ
device_mapÚcpuÚdiskz±You are attempting to perform cpu/disk offload with a pre-quantized torchao model This is not supported yet. Please remove the CPU or disk device from the `device_map` argument.TÚweights_onlyr!   z2.5.0zlIn order to use TorchAO pre-quantized model, you need to have torch>=2.5.0. However, the current version is Ú.)r   r.   r   ÚparseÚ	importlibÚmetadataÚRuntimeErrorÚoffloadÚgetrG   ÚdictÚvaluesÚpre_quantizedÚ
ValueError)rL   ÚargsrY   Útorchao_versionr\   r_   Útorch_versions          r6   Úvalidate_environmentÚ'TorchAoHfQuantizer.validate_environment­   se  € Ü#×%Ñ%ÜØ{óð ô "Ÿ-š-¬	×(:Ñ(:×(BÑ(BÀ9Ó(MÓNˆØœWŸ]š]¨8Ó4Ó4ÜØbÐcrÐbsð  tcð  dóð ð ˆŒà—Z‘Z ¨dÓ3ˆ
Ü�j¤$×'Ñ'Ø˜
×)Ñ)Ó+Ó+¨v¸×9JÑ9JÓ9LÓ/LØ×%×%Ü$ðzóð ð
 $(�D”Là××Ø!Ÿ:™: n°dÓ;ˆLÞÜ '§¢¬i×.@Ñ.@×.HÑ.HÈÓ.QÓ R�Ø ¤7§=¢=°Ó#9Ó9ä&ð Gð  HUð  GVð  VWð  Xóð ð :ð ð rB   c                 ój  • U R                   R                  R                  R                  nUR	                  S5      =(       d    UR	                  S5      nU(       a0  Ub-  U[
        R                  :w  a  [        R                  SU S35        Uc%  [        R                  S5        [
        R                  nU$ )NÚIntÚUintz%You are trying to set torch_dtype to zm for integer quantization, but only bfloat16 is supported right now. Please set `torch_dtype=torch.bfloat16`.a  Overriding `torch_dtype` with `torch_dtype=torch.bfloat16` due to requirements of `torchao` to enable model loading in different precisions. Pass your own `torch_dtype` to specify the dtype of the remaining non-linear layers, or pass torch_dtype=torch.bfloat16, to remove this warning.)	rX   Ú
quant_typerI   rJ   Ú
startswithr!   Úbfloat16r0   r1   )rL   Útorch_dtyper8   Úis_int_quants       r6   Úupdate_torch_dtypeÚ%TorchAoHfQuantizer.update_torch_dtypeÏ   s�   € Ø×.Ñ.×9Ñ9×CÑC×LÑLˆØ"×-Ñ-¨eÓ4×V¸×8NÑ8NÈvÓ8VˆÞ˜KÑ3¸ÄuÇ~Á~Ó8UÜ�N‰NØ7¸°}ð Eað bôð
 Ñä�N‰Nðxôô
  Ÿ.™.ˆKàÐrB   r9   c                 óÀ   • SSK Jn  U R                  R                  nUR                  R
                  n[        U5      nUS:X  a  UR                  $ [        R                  $ )Nr   )ÚCustomDtypeÚ4)Úaccelerate.utilsr{   rX   rs   rI   rJ   rA   ÚINT4r!   Úint8rG   Ú'SUPPORTED_TORCH_DTYPES_FOR_QUANTIZATIONrj   )rL   Útarget_dtyper{   rs   r8   Ú
size_digitÚpossible_device_mapss          r6   Úadjust_target_dtypeÚ&TorchAoHfQuantizer.adjust_target_dtypeã   sO   € Ý0à×-Ñ-×8Ñ8ˆ
Ø ×*Ñ*×3Ñ3ˆÜ% kÓ2ˆ
à˜ÓØ×#Ñ#Ð#ä—:‘:ÐrB   Ú
max_memoryc                 ó`   • UR                  5        VVs0 s H
  u  p#X#S-  _M     nnnU$ s  snnf )NgÍÌÌÌÌÌì?)Úitems)rL   r†   ÚkeyÚvals       r6   Úadjust_max_memoryÚ$TorchAoHfQuantizer.adjust_max_memoryû   s5   € Ø5?×5EÑ5EÔ5GÔHÒ5G©¨�c ™9’nÑ5Gˆ
ÑHØÐùó Is   ”*Ú
state_dictÚsafe_serializationc                 ó¤   • U(       a   [        5       (       a  [        SS5      (       d  U0 4$ [        U5      n[        U[        5      (       a  U$ U0 4$ )zf
We flatten the state dict of tensor subclasses so that it is compatible with the safetensors format.
r   r   )r   r   r   rG   Útuple)rL   r�   rŽ   Úflattened_state_dicts       r6   Úget_state_dict_and_metadataÚ.TorchAoHfQuantizer.get_state_dict_and_metadataÿ   sS   € ö "Ô)=×)?Ñ)?ÔGYÐZ^Ð`h×GiÑGiØ˜r�>Ð!ä8¸ÓDÐÜÐ*¬E×2Ñ2Ø'Ð'à# RÐ'Ð'rB   Úloaded_keysÚcheckpoint_filesc                 ó|   • U R                  U5        U R                  (       a  [        U R                  5       5      $ U$ rS   )Úset_metadatarV   ÚlistÚget_weight_names)rL   r”   r•   s      r6   Úmaybe_update_loaded_keysÚ+TorchAoHfQuantizer.maybe_update_loaded_keys  s2   € Ø×ÑÐ*Ô+Ø�>�>Ü˜×-Ñ-Ó/Ó0Ð0ØÐrB   c                 óž  • 0 U l         0 U l        [        5       (       a  [        SS5      (       d  g [	        U5      S:X  a  g [        S U 5       5      (       d  g 0 nU H>  n[        USS9 nUR                  UR                  5       =(       d    0 5        S S S 5        M@     [        U5      (       a  X l         g 0 U l         g ! , (       d  f       Mp  = f)Nr   r   r   c              3   ór   #   • U  H-  n[        U[        5      =(       a    UR                  S 5      v •  M/     g7f)z.safetensorsN)rG   ÚstrÚendswith)Ú.0Ú
checkpoints     r6   Ú	<genexpr>Ú2TorchAoHfQuantizer.set_metadata.<locals>.<genexpr>  s/   é € ð 
ÚbrÐT^ŒJ�z¤3Ó'×O¨J×,?Ñ,?ÀÓ,OÔOÒbrùs   ‚57Úpt)Ú	framework)
rV   rW   r   r   ÚlenÚallr   Úupdaterc   r   )rL   r•   rc   r¡   Úfs        r6   r—   ÚTorchAoHfQuantizer.set_metadata  s´   € ØˆŒØ-/ˆÔ*ä'×)Ñ)Ô1CÀDÈ(×1SÑ1SØäÐÓ  AÓ%Øäñ 
Ùbró
÷ 
ñ 
ð àˆÛ*ˆJÜ˜:°Ò6¸!Ø—‘ §
¡
£× 2°Ô3÷ 7Ñ6ñ +ô &9¸×%BÑ%B˜�Èˆ�÷ 7Ö6ús   Á))B=Â=
C	c                 ó   • U R                   $ rS   ©rV   ©rL   s    r6   rc   ÚTorchAoHfQuantizer.metadata(  s   € à�~‰~ÐrB   c           	      óœ  • U R                   (       a+  [        SS5      (       a  [        U R                   5      (       d  U$ 0 U R                  EUEnUR	                  5        VVs0 s H  u  p4SU;  d  M  X4_M     nnnUR	                  5        VVs0 s H  u  p4SU;   d  M  X4_M     nnnU R                   n[
        R                  " US   5      n[        S U 5       5      (       a5  0 UES[
        R                  " U Vs/ s H  nSU;   d  M  UPM     sn5      0En[        X&5      u  o�l        U	R                  U5        U	$ s  snnf s  snnf s  snf )Nr   r   r`   Útensor_namesc              3   ó,   #   • U  H
  nS U;  v •  M     g7f©r`   N© )r    Únames     r6   r¢   Ú=TorchAoHfQuantizer.maybe_update_state_dict.<locals>.<genexpr>8  s   é € Ð8ª< 4ˆs˜$Žª<ùs   ‚)rV   r   r   rW   rˆ   ÚjsonÚloadsÚanyÚdumpsr   r¨   )
rL   r�   Úmerged_state_dictÚkÚvÚroot_tensorsrc   r°   r´   Úreconstructed_state_dicts
             r6   Úmaybe_update_state_dictÚ*TorchAoHfQuantizer.maybe_update_state_dict,  s<  € Ø�~�~Ô%7¸¸h×%GÑ%GÔObÐcg×cqÑcq×OrÑOrØÐàP˜t×AÑAÐPÀZÐPÐð *;×)@Ñ)@Ô)BÔSÒ)B¡ ÀcÐQRÁl›˜šÑ)BˆÑSØ.?×.EÑ.EÔ.GÔTÒ.G¡d aÈ3ÐRSÉ8›T˜QšTÑ.GÐÑTØ—>‘>ˆÜ—z’z (¨>Ñ":Ó;ˆÜÑ8©<Ó8×8Ñ8Øo˜(Ðo N´D·J²JÑQ]Ó?mÒQ]ÈÐadÐhlÑalÇÑQ]Ñ?mÓ4nÑoˆHÜGbØóH
ÑDÐ Ô"Dð 	!×'Ñ'¨Ô5à'Ð'ùó TùÛTùò @ns$   Á"D=Á2D=ÂEÂEÃ;
E	Ä	E	c                 ó$   • U R                   (       + $ rS   r¬   r­   s    r6   Úsupports_parallel_loadingÚ,TorchAoHfQuantizer.supports_parallel_loadingA  s   € ð —>‘>Ô!Ð!rB   c                 ó�   • U R                   (       d
  [        5       $ [        [        R                  " U R                   S   5      5      $ )Nr°   )rV   Úsetr¶   r·   r­   s    r6   r™   Ú#TorchAoHfQuantizer.get_weight_namesF  s-   € Ø�~�~Ü“5ˆLÜ”4—:’:˜dŸn™n¨^Ñ<Ó=Ó>Ð>rB   Úmodelr   Úparam_valueztorch.TensorÚ
param_namec                 ó  ^• UR                  SS 5      n[        U4S jU R                   5       5      (       a  gUS:X  a  U R                  (       a  g[	        UT5      u  px[        U[        R                  R                  5      =(       a    US:H  $ )NÚparam_devicec              3   óJ   >#   • U  H  oS -   T;   =(       d    UT:H  v •  M     g7fr²   r³   )r    r‰   rÉ   s     €r6   r¢   Ú>TorchAoHfQuantizer.check_if_quantized_param.<locals>.<genexpr>U  s'   øé € ÐgÒKfÀC�c‘	˜ZÑ'×?¨S°JÑ->Ô?ÒKfùs   ƒ #Fr]   rH   )	Úpopr¸   Úmodules_to_not_convertre   r   rG   r!   ÚnnÚLinear)	rL   rÇ   rÈ   rÉ   r�   rY   rË   ÚmoduleÚtensor_names	      `     r6   Úcheck_if_quantized_paramÚ+TorchAoHfQuantizer.check_if_quantized_paramK  sp   ø€ ð —z‘z .°$Ó7ˆäÔgÈ4×KfÒKfÓg×gÑgØØ˜UÓ" t§|§|àô #7°u¸jÓ"IÑˆFÜ˜f¤e§h¡h§o¡oÓ6×T¸KÈ8Ñ<SÐTrB   Útarget_deviceztorch.deviceÚunexpected_keysc                 óì  • [        X5      u  p‰U R                  (       az  [        R                  R	                  UR                  US95      UR                  U	'   [        U[        R                  5      (       a!  [        R                  " [        U5      Ul        gg[        R                  R	                  U5      R                  US9UR                  U	'   [        X€R                  R                  5       5        g)z¶
Each nn.Linear layer that needs to be quantized is processed here. First, we set the value the weight tensor,
then we move it to the target device. Finally, we quantize the module.
)ÚdeviceN)r   ri   r!   rÐ   Ú	ParameterÚtoÚ_parametersrG   rÑ   ÚtypesÚ
MethodTyperM   Ú
extra_reprr   rX   Úget_apply_tensor_subclass)
rL   rÇ   rÈ   rÉ   rÖ   r�   r×   rY   rÒ   rÓ   s
             r6   Úcreate_quantized_paramÚ)TorchAoHfQuantizer.create_quantized_param_  sº   € ô 3°5ÓEÑˆà××ô /4¯h©h×.@Ñ.@ÀÇÁÐWdÀÐAeÓ.fˆF×Ñ˜{Ñ+Ü˜&¤"§)¡)×,Ñ,Ü$)×$4Ò$4Ô5GÈÓ$P�Õ!ð -ô /4¯h©h×.@Ñ.@ÀÓ.M×.PÑ.PÐXeÐ.PÐ.fˆF×Ñ˜{Ñ+Ü�f×6Ñ6×PÑPÓRÕSrB   c                 ó€   • U R                   R                  nUR                  R                  n[	        U5      nUS:X  a  gg)aè  
This factor is used in caching_allocator_warmup to determine how many bytes to pre-allocate for CUDA warmup.
- A factor of 2 means we pre-allocate the full memory footprint of the model.
- A factor of 4 means we pre-allocate half of that, and so on

However, when using TorchAO, calculating memory usage with param.numel() * param.element_size() doesn't give
the correct size for quantized weights (like int4 or int8) That's because TorchAO internally represents
quantized tensors using subtensors and metadata, and the reported element_size() still corresponds to the
torch_dtype not the actual bit-width of the quantized data.

To correct for this:
- Use a division factor of 8 for int4 weights
- Use a division factor of 4 for int8 weights
r|   é   é   )rX   rs   rI   rJ   rA   )rL   rs   r8   r‚   s       r6   Úget_cuda_warm_up_factorÚ*TorchAoHfQuantizer.get_cuda_warm_up_factorz  s>   € ð ×-Ñ-×8Ñ8ˆ
Ø ×*Ñ*×3Ñ3ˆÜ% kÓ2ˆ
à˜ÓØàrB   Úkeep_in_fp32_modulesc                 ó\  • U R                   R                  U l        [        U R                  [        5      (       d  U R                  /U l        U R                  R	                  U5        [        U[
        5      (       ad  [        UR                  5       5      S:”  aG  UR                  5        VVs/ s H  u  pVUS;   d  M  UPM     nnnU R                  R	                  U5        U R                   Vs/ s H	  oˆc  M  UPM     snU l        U R                   UR                  l         g s  snnf s  snf )Nr;   )r^   r]   )
rX   rÏ   rG   r˜   r+   rg   r¦   Úkeysrˆ   Úconfig)	rL   rÇ   r\   rè   rY   r‰   ÚvalueÚkeys_on_cpurÒ   s	            r6   Ú$_process_model_before_weight_loadingÚ7TorchAoHfQuantizer._process_model_before_weight_loading’  sð   € ð '+×&>Ñ&>×&UÑ&UˆÔ#ä˜$×5Ñ5´t×<Ñ<Ø+/×+FÑ+FÐ*GˆDÔ'à×#Ñ#×*Ñ*Ð+?Ô@ô �j¤$×'Ñ'¬C°
·±Ó0AÓ,BÀQÓ,FØ1;×1AÑ1AÔ1CÔ`Ò1C¡: 3ÀuÐP_ÑG_Ÿ3Ñ1CˆKÑ`Ø×'Ñ'×.Ñ.¨{Ô;ð =A×<WÒ<WÓ&nÒ<W°&§vÑ<WÑ&nˆÔ#à+/×+CÑ+Cˆ�‰Õ(ùó aùò 'os   Â-D#Â=D#Ã/D)Ã9D)c                 ó   • U$ rS   r³   )rL   rÇ   s     r6   Ú#_process_model_after_weight_loadingÚ6TorchAoHfQuantizer._process_model_after_weight_loading­  s   € ØˆrB   c                 óR   • [        SS5      (       d  [        R                  S5        gg)Nr   r   zƒTorchAO quantized model is not serializable with safe serialization without safetensors support from the installed torchao version.FT)r   r0   r1   r­   s    r6   Ú"supports_safetensors_serializationÚ5TorchAoHfQuantizer.supports_safetensors_serialization°  s(   € ä! $¨×1Ñ1Ü�N‰Nð6ôð àrB   c                 óN  • [         R                  " [        R                  R                  S5      5      [         R                  " S5      :¬  nU(       d  [        R                  S5        U R                  (       a-  U R                  R                  c  [        R                  S5        gU$ )NÚhuggingface_hubz0.25.0zMtorchao quantized model is only serializable after huggingface_hub >= 0.25.0 a  The model contains offloaded modules and these modules are not quantized. We don't recommend saving the model as we won't be able to reload them.If you want to specify modules to not quantize, please specify modules_to_not_convert in the quantization_config.F)	r   ra   rb   rc   r0   r1   re   rX   rÏ   )rL   Ú_is_torchao_serializables     r6   Úis_serializableÚ"TorchAoHfQuantizer.is_serializable»  s�   € ä#*§=¢=´×1CÑ1C×1KÑ1KÐL]Ó1^Ó#_Ôcj×cpÒcpØód
ñ $
Ð ö (Ü�N‰NÐjÔkà�<�<˜D×4Ñ4×KÑKÑSÜ�N‰NðDôð à'Ð'rB   )ÚInt8WeightOnlyConfigÚ%Int8DynamicActivationInt8WeightConfigÚ$Int8StaticActivationInt8WeightConfigÚFloat8WeightOnlyConfigÚ)Float8DynamicActivationFloat8WeightConfigc                 óp   • U R                   R                  R                  R                  U R                  ;   $ rS   )rX   rs   rI   rJ   Ú_TRAINABLE_QUANTIZATION_CONFIGSr­   s    r6   Úis_trainableÚTorchAoHfQuantizer.is_trainableÕ  s+   € à×'Ñ'×2Ñ2×<Ñ<×EÑEÈ×ImÑImÑmÐmrB   c                 ó   • g)NTr³   r­   s    r6   Úis_compileableÚ!TorchAoHfQuantizer.is_compileableÙ  s   € àrB   c                 ó  • SSK Jn  UR                  5        GHn  u  p4[        U[        R
                  5      (       d  M'  [        UR                  U5      (       d  MD  [        UR                  S5      (       d/  [        S[        UR                  5      R                   SU S35      eUR                  R                  nUR                  R                  5       R                  U5      n[        R                  " U5      Ul        [        UR                  S5      (       d  GM  UR                  R                   [        R
                  R                  Ld  GM:  ["        R$                  " [        R
                  R                  U5      Ul        GMq     U$ )Nr   rD   Ú
dequantizez$Dequantization is not supported for z
 (module: z?). Please use a quantization type that supports dequantization.Ú__func__)rF   rE   Únamed_modulesrG   rÐ   rÑ   rH   ÚhasattrÚNotImplementedErrorÚtyperJ   rÙ   r  rÛ   rÚ   rß   r	  rÝ   rÞ   )rL   rÇ   rE   r´   rÒ   rÙ   Údequantized_weights          r6   Ú_dequantizeÚTorchAoHfQuantizer._dequantizeÝ  s  € Ý3à!×/Ñ/×1‰LˆDÜ˜&¤"§)¡)×,Ó,´¸F¿M¹MÐK\×1]Ó1]Ü˜vŸ}™}¨l×;Ñ;Ü-Ø>¼tÀFÇMÁMÓ?R×?[Ñ?[Ð>\ð ]$Ø$( 6Ð)hðjóð ð  Ÿ™×-Ñ-�Ø%+§]¡]×%=Ñ%=Ó%?×%BÑ%BÀ6Ó%JÐ"Ü "§¢Ð-?Ó @�”ä˜6×,Ñ,¨j×9Ô9¸f×>OÑ>O×>XÑ>XÔ`b×`iÑ`i×`tÑ`tÕ>tÜ(-×(8Ò(8¼¿¹×9MÑ9MÈvÓ(V�F×%ñ 2ð ˆrB   )rV   rW   rÏ   re   )r�   útorch.dtyper9   r  )F)rÇ   r   )(rJ   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Úrequires_calibrationÚrequired_packagesÚuse_keep_in_fp32_modulesrU   rn   rx   r„   rg   rž   Úintr‹   r   Úboolr’   r˜   rš   r—   Úpropertyrc   r¿   rÂ   r™   rÔ   rá   ræ   rî   rñ   rô   rù   r  r  r  r  Ú__static_attributes__Ú__classcell__)rI   s   @r6   rO   rO   ž   s?  ø† ñð !ÐØ"˜ÐØ#Ðõ0ò òDô(
ð0¨D°°c¸C±i°Ñ,@ð ÀTÈ#ÈsÐUXÉyÈ.ÑEYô ñ(°d¸3À¸8±nð (ÐZ^õ (ð°D¸±Ið ÐQUÐVYÑQZð Ð_cÐdgÑ_hô ðK¨T°#©Yô Kð, ñó ðð(°$°s¸C°x±.ð (ÀTÈ#ÈsÈ(Á^ô (ð* ð"¨4ó "ó ð"ò?ð
UàðUð $ðUð ð	Uð
 ˜˜c˜‘NðUð 
ôUð(TàðTð $ðTð ð	Tð
 &ðTð ˜˜c˜‘NðTð ˜c™ôTò6ð8 +-ñ	DàðDð # 3™iõ	Dô6ð ñó ðð ñ(ó ð(ð"'Ð#ð ñnó ðnð ð ó ó ð÷ð rB   rO   )5r  rb   r¶   r=   rÝ   Útypingr   r   Ú	packagingr   Úutilsr   r   r	   r
   r   r   r   Úbaser   Ú
get_loggerrJ   r0   Úmodels.modeling_utilsr   Úsafetensorsr   r!   Útorch.nnrÐ   r   Úfloat8_e4m3fnÚfloat8_e5m2r"   r#   r$   r%   r&   r'   r(   r€   Útorchao.quantizationr   Ú1torchao.prototype.safetensors.safetensors_supportr   r   Ú/torchao.prototype.safetensors.safetensors_utilsr   r7   rž   rA   rM   rO   r³   rB   r6   Ú<module>r+     sz  ðñó
 Û Û 	Û ß %å ÷÷ ñ õ &ð 
×	Ò	˜HÓ	%€ö Ý3á×ÑÝ%ñ ×ÑÛÝá˜˜e×$Ñ$ð
 �J‰JØ×ÑØ×ÑØ�K‰KØ�K‰KØ�K‰KØ�K‰KØ�K‰KØ�K‰KØ�K‰Kð3
Ñ/ð" �J‰JØ×ÑØ×Ñð3
Ð/ñ ×ÑÝ.á˜$ ×)Ñ)÷	
õ 	Xò!HñJ ×ÑÙ˜˜w×'Ñ'Ù×ÑÙ˜4 ×*Ñ*áÔ ð #ð ¨#°©*ô òkôPÐ+õ PrB   