
    {-j0                         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	m
Z
mZmZmZmZmZmZmZ  eee j        d          Zd	Zd
Zd Zd Z G d d          Z G d d          Z	 	 	 	 ddZdS )    N)static   )
get_logger   )_channelwise_quant_axis1_opsbias_correction_wcalculate_quant_cos_errordequant_tensorload_variable_dataquant_tensorset_variable_datastable_sigmoidz&%(asctime)s-%(levelname)s: %(message)s)fmtgg?c                     t          j        t           j        j                            |           t
          t          z
  z  t          z   dd          S )Nr   r   )minmax)paddleclipnn
functionalsigmoidZETAGAMMAalpha_vs    c/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/paddle/static/quantization/adaround.pycompute_soft_roundingr   ,   sE    ;	$$W-->F       c                 z    t          j        t          |           t          t          z
  z  t          z   dd          S )Nr   r   )a_mina_max)npr   r   r   r   r   s    r   compute_soft_rounding_npr#   4   s8    7w4%<058   r   c                   (    e Zd ZddZd Zd Zd ZdS )	AdaRoundLoss{Gz?   r   c                 "    || _         || _        d S N)default_reg_paramdefault_beta_range)self	reg_paramr,   s      r   __init__zAdaRoundLoss.__init__;   s    !*"4r   c                     t           j        j                            ||          }t          j        t          j        |d                    }|S )N)axis)r   r   r   square_error_costmeansum)r-   ada_quantized_outputorig_outputsquare_cost
recon_losss        r   compute_recon_losszAdaRoundLoss.compute_recon_loss?   sG    i*<< +
 
 [Kb!A!A!ABB
r   c                 ^      fd}t           j                            |d |          }|S )Nc                      t                    } t          j        t          j        t          j        d| z  dz
                       dz             }j        |z  }|S )Nr   r   )r   r   r5   powabsr+   )h_vreg_term
round_lossr   betar-   s      r   round_loss_fnz6AdaRoundLoss.compute_round_loss.<locals>.round_loss_fnG   sa    '00C zFJq3w{33T:::Q> H
 /(:Jr   c                  2    t          j        dgdd          S )Nr   float32        )shapedtype
fill_value)r   full r   r   <lambda>z1AdaRoundLoss.compute_round_loss.<locals>.<lambda>X   s    FKqcsKKK r   )r   r   cond)r-   r   
warm_startrB   rC   rA   s   `` `  r   compute_round_losszAdaRoundLoss.compute_round_lossF   sS    	 	 	 	 	 	 	 Y^^KK
 

 r   c                     | j         \  }}||z  }||z
  ||z
  z  }|d||z
  z  dt          j        |t          j        z            z   z  z   }|S )Ng      ?r   )r,   r"   cospi)	r-   max_itercur_iterrN   
start_betaend_betawarm_start_end_iterrel_iterrB   s	            r   compute_betazAdaRoundLoss.compute_beta^   st    #6
H )83 22**
 #h!67x"%'(((
 
 r   N)r&   r'   )__name__
__module____qualname__r/   r:   rO   rY   rK   r   r   r%   r%   :   sU        5 5 5 5    0    r   r%   c                   J    e Zd Z	 	 	 	 	 ddZd Zd Zd Zd Zd	 Zd
 Z	d Z
dS )AdaRoundNT  c                 >   || _         || _        d| _        d| _        d| _        t                      | _        || _        || _        || _	        d| _
        |t          v rd| _
        || _        |dz   | _        |                     |                                ||           d S )Ng?   rF   r   r   .alpha)is_trainnum_iterationsrN   weight_bitsoffsetr%   adaround_lossori_weight_tensorscalescope
quant_axisr   weight_var_name
alpha_nameinitialize_alphacopy)r-   ri   weight_tensorrj   rl   weight_op_typerc   rd   s           r   r/   zAdaRound.__init__q   s     !,)^^!.

999DO.)H4m0022E?KKKKKr   c                 T   t          ||| j                  }t          j        |          }||z
  }t          j        t
          t          z
  |t          z
  z  dz
             }t          j        |j	        d|dz   t          j
        j                            |                    | _        dS )zN
        Initializes alpha parameter, same shape as the weight tensor
        rk   r   rE   rb   )rG   rH   namedefault_initializerN)r   rk   r"   floorlogr   r   r   create_parameterrG   r   initializerAssignr   )r-   tensorri   var_nametensor_scaletensor_flooralphas          r   rn   zAdaRound.initialize_alpha   s     $FEdoNNNx--,&5.9A=>>>.+H$ &	 5 < <U C C	
 
 
r   c                 ~    t          | j        || j        |           |                    |||gd| j                  }|S )NTprogramfeed
fetch_listreturn_numpyrj   )r   rj   rl   run)r-   r   placeexedatafp32_fetch_listweight_tensor_dequantadaround_out_tensors           r   )_calculate_output_with_adarounded_weightsz2AdaRound._calculate_output_with_adarounded_weights   s\     	Jt35J	
 	
 	
 "gg'(* & 
 
 #"r   c                    t          | j        | j                  }t          |          }t	          | j                                        | j        | j                  }t          j
        |          }t          j        ||          }|S Nrs   )r   rj   rm   r#   r   rh   ro   ri   rk   r"   rv   add)r-   np_alphah_alphar}   rp   weight_tensor_quants         r   _calculate_quant_weightz AdaRound._calculate_quant_weight   s    %dj$/BB*844 $"''))J
 
 
 .. !f]G<<""r   c                 v    |                                  }t          || j        z   | j        | j                  }|S r   )r   r
   rf   ri   rk   )r-   r   r   s      r   _calculate_adarounded_weightsz&AdaRound._calculate_adarounded_weights   sG    "::<< !/$+-J!
 !
 !

 %$r   c                 .    |                                  }|S r*   )r   )r-   r   s     r   update_final_weightszAdaRound.update_final_weights   s    "::<<""r   c                     | j                             | j        ||          }| j                             ||          }||z   }|||d}|S )N)lossrA   r9   )rg   rO   r   r:   )	r-   rB   rN   r   orig_out_tensorrA   r9   r   lossess	            r   get_losszAdaRound.get_loss   sj    '::L*d
 

 '::
 

 J&$$
 

 r   c                 |    || j         | j        z  k     }| j                            | j         || j                  }||fS r*   )rd   rN   rg   rY   )r-   cur_iterationrN   rB   s       r   update_beta_warmzAdaRound.update_beta_warm   sG    "T%84?%JJ
!..
 
 Zr   )NNNTr_   )rZ   r[   r\   r/   rn   r   r   r   r   r   r   rK   r   r   r^   r^   p   s        
 L L L L4
 
 
# # # # # #"	% 	% 	%# # #           r   r^   r_   MbP?FTc                 2	   |d         j         }i }|                                D ]B\  }}t                              d|            ||         }t	          ||          }||         }d }|                                j        D ]L}|j        dk    r?|                    ||           |                                	                    |          }|}Mt          j                    }t          j                    }t          j        ||          5  t          j        j                                        5  t#          ||||||	          }t          j        ddg|j        R d          }t          j        d	dg|j        R d          }t          j        d
ddgd          }t          j        dddgd          }|                    ||||          }t          j                            |
          }|d         }|                    |           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                    |           t3          j                    } | }!t5           |                       D ]\  }"}#| }!t3          j                    } |                    ||#|gd|          }$|                                }%|                    ||||#||%          }&t;          |$d         |&d                   }'|r#|'dk    rt                              d            n|                    |"          \  }(})|$d         |&d         |(|)d}*|                    ||*d |                                D             d          }+t                              d|"dd|
ddtA          j!        |+d                   ddtA          j!        |+d                   ddtA          j!        |+d                   dd| |!z
  dd            tD          j#        $                                 |"|	k    r n|%                                ||<   |r'tM          |||         ||j'        |j(        !          ||<   ~D|)                                D ]}tU          |||||                    d S )"Nr   zStart adaround op: fetch)rj   rl   rq   rd   r   r1   rE   )rt   rG   rH   r   rB   r   rN   bool)learning_rater   Tr   gGz?z)The cosine error is small, skip training.)r   r   rB   rN   c                     g | ]	}|j         
S rK   )rt   ).0vs     r   
<listcomp>z run_adaround.<locals>.<listcomp>Z  s    HHHqAFHHHr   )r   r   r   zIter dz, lr z.5fz, loss z, loss_round z, loss_recon r   z, time s)re   )+rt   items_loggerinfor   global_blockopstype_rename_inputvarr   Programprogram_guardr   utilsunique_nameguardr^   r   rG   r   	optimizerAdamminimizer   time	enumerater   r   r	   r   valuesr"   r4   sysstdoutflushr   r   rk   re   keysr   ),data_loaderfp32_programr   r   rj   r   quantized_op_pairsweight_op_pairs
scale_dictrd   lrbias_correction	fast_modefetch_op_namefinal_weight_tensor_quant_dictrl   quant_op_out_namerq   weight_var_tensorri   r   _opstartup_programtrain_programadaroundr   r   beta_tensorwarm_start_tensortrain_fetches_lossr   r   
start_timeprev_start_timeir   np_orig_out_tensoradaround_weight_tensor_dequantnp_adaround_out_tensor	cos_errorrB   rN   	feed_dictouts,                                               r   run_adaroundr      sa    qM&M%'".@.F.F.H.H ~ ~**<?<<===(9.uoFF?+,,..2 	2 	2Cx7""!!-1BCCC".";";"="="A"A%# # !2 !.**(( @@&	% &	%L$**,,&	% &	%
  ! /--  H %k&2O122  O
 #)+*2O122# # #
 !+B7)  K !'!"a! ! ! "*!2!2!#	" " (--B-??I%f-Dt$$$M&	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	% &	%N 	   Y[[
$ // 3	 3	GAt(OJ!$$+,! ") " " 6688 + BB #2  # 2"1%'=a'@ I  Y--HIII'88;;D*#5a#8'=a'@(	 I ''HH,>,E,E,G,GHHH!	   C LL u  u  u  u"  u  u  uQ  u  u  uSUSZ[^_`[aSbSb  u  u  uuwu|  ~A  BC  ~D  vE  vE  u  u  u  R\  _n  Rn  u  u  u  u   JN"" # ))++ 	'7  	>O!.?#$0? ? ?*?; H .2244 
 
*?;		
 	
 	
 	

 
s7   
$H..CHH.HH.HH..H2	5H2	)r_   r   FT)loggingr   r   numpyr"   r   r   
log_helperr   r   r   r   r	   r
   r   r   r   r   rZ   INFOr   r   r   r   r#   r%   r^   r   rK   r   r   <module>r      s    



             # # # # # #	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 *gl H   	
    3 3 3 3 3 3 3 3ln  n  n  n  n  n  n  n v X
 X
 X
 X
 X
 X
r   