o
    Ti                     @   s@   d dl Z d dlZd dlmZ d dlmZ dZG dd deZdS )    N)logger)ds_quantizer   c                   @   sv   e Zd Z									dddZdd Zi fd	d
Zdd Zdd Zdd Zdd Z	dd Z
dddZdd ZdS )	Quantizer   F{Gz?r   c
           
      C   sF   || _ || _|| _|| _d| _d| _|| _|| _|| _|| _	|	| _
d S )Nr         ?)q_groupsq_mixed_fp16q_change_ratioq_typeqstepsquantize_real_ratio	q_verboseq_eigenvalueuse_quantizer_kernel
q_rounding	layer_num)
selfr	   r
   r   r   r   r   r   r   r    r   N/home/ubuntu/.local/lib/python3.10/site-packages/deepspeed/runtime/quantize.py__init__   s   
zQuantizer.__init__c                 C   sf   | j dkrdS d}t| j D ]"}| j| | jkr0| jt| j dkr#| j nd  }|| j| kr0d}q|S )Nr   TFr   )r   rangeq_start_bitsq_target_bitsr   TWO_D_PARAMSq_period)r   resultindex	next_stepr   r   r   any_precision_switch'   s   
zQuantizer.any_precision_switchc                 C   s   |r|sd S |    |   tt|D ]P}|| D ]I}t| dkrct|drc|jrct|}|d u r9d\}}	n||v rA|| nd\}}	|d ur\dt	|d  }
| 
|j|	|
|_q| 
||	|_qqd S )Nr   
start_bits)Nr      )stepupdate_fp16_ratior   lensizehasattrr!   idmathfloorcompute_quantizationdata)r   parameter_groupoverfloweigenvalue_enabledblock_eigenvalueipparam_id
eigenvaluelayer_idfactorr   r   r   quantize3   s$    
zQuantizer.quantizec                 C   s   |  j d7  _ d S Nr   )r   r   r   r   r   r#   K   s   zQuantizer.stepc                 C   s  d| }| | jd}|jddd}|jddd}| jdkr!d}n
||jdd}| jd	krXdt	
t	|t	| | }d}	|| |  |d
?  |d
? d
 | }n'| jdkr|| | }||  | }	||	 | |  d|d
 | |	 }| |j }
|
S )N   T)dimkeepdimnearest        g      g      ?	symmetricr   
asymmetricr   )reshaper	   aminamaxr   newshapeuniform_r   torchmaxabsroundclamp
contiguous)r   inputsnum_bitsq_range
input_flatg_ming_maxr2   scale
zero_pointoutputr   r   r   quantize_highbitN   s"   

 ,
(zQuantizer.quantize_highbitc                 C   s   | | jd}|jd }|jddd|}d| dd}||k| }|| k | }| |k| }||  jdd|jdd dd}	|	| |	|  }
|
 |j	 }
|
S )Nr;   r   )r2   r<   gffffff?)r<   )
rB   r	   rF   normdivviewtyperJ   sumrM   )r   rN   rQ   nmthresposnegmaskalpharV   r   r   r   quantize_tenaryf   s   
(zQuantizer.quantize_tenaryc                 C   sP   | | jd}|jd }|jdddd|}| |}| |j }|S )Nr;   r   T)r2   r<   r=   )rB   r	   rF   rX   rY   signmulrM   )r   rN   rQ   r]   r^   rV   r   r   r   quantize_binarys   s   
zQuantizer.quantize_binaryc                 C   s:   | j r| j| | jd kr|| j d| j |  }|S |S r8   )r
   r   r   r   )r   inputinput_qr   r   r   r   mixed_fp16_quantize{   s   zQuantizer.mixed_fp16_quantizec              
   C   s  |j |jkr;| j|jkr;d| _| jdK  _| j|9  _| j d8  _ | jr;td|j  d| j d|j d|  |j |jksEJ d| jrn|j dkrQt	d	t
|j | j|j | jd
kradnd| jdkridndd}nI|j dkr|| |j|j }n;|j dkr| jd
ksJ d| jdksJ d| |j}n|j dkr| jd
ksJ d| jdksJ d| |j}| jr| |j||S | jr|j |jd kr| j|j d| j |  }|S )Nr   r   z/Quantization settings: current bit-precision = z	, step = z, quantization period = z
, index = z5Quantization bit is lower than target precision bits!r:   zFQuantization bit is too low, please do it without quantization kernel!r@   FTnearest_neighbor)asymsr   z#Quantization type is not symmetric!r>   z.Quantization rounding is not nearest_neighbor!)r!   target_bitsr   r   r   r   r   infor   
ValueErrorr   r,   cloner	   r   r   rW   rd   rg   rj   r
   )r   rh   r   r6   ri   rQ   r   r   r   r+      sN    





zQuantizer.compute_quantizationc                 C   s2   | j r| jdkr|  j| j8  _d S d| _d S d S )Nr   r?   )r
   r   r   r9   r   r   r   r$      s
   

zQuantizer.update_fp16_ratioN)	r   Fr   r   r   FFFr   )r   r   )__name__
__module____qualname__r   r    r7   r#   rW   rd   rg   rj   r+   r$   r   r   r   r   r      s(    

.r   )	rH   r)   deepspeed.utilsr   deepspeed.ops.quantizerr   r   objectr   r   r   r   r   <module>   s   