o
    "j                     @   s@   d dl Z d dlZd dlmZmZ ddlmZ G dd deZdS )    N)_quant_config_defaultquant_aware   )MetaOptimizerBasec                       sf   e Zd Z fddZ 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dZ  ZS )QATOptimizerc                    s&   t  | || _g d| _g | _d S )N)ZAMPOptimizerZLarsOptimizerZLambOptimizerZGraphExecutionOptimizerZRecomputeOptimizerZGradientMergeOptimizer)super__init__	inner_optZmeta_optimizers_white_listZmeta_optimizers_black_list)selfZ	optimizer	__class__ w/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/distributed/fleet/meta_optimizers/qat_optimizer.pyr      s   

zQATOptimizer.__init__c                    s   t  |||| d S N)r   _set_basic_info)r
   loss
role_makerZuser_defined_optimizeruser_defined_strategyr   r   r   r   (   s   zQATOptimizer._set_basic_infoc                 C   s   | j jsdS | jjrdS dS )NFT)r   Z_is_collectiver   qat)r
   r   r   r   
_can_apply/   s
   zQATOptimizer._can_applyc                 C   s   d|_ i |_d S )NFr   qat_configs)r
   dist_strategyr   r   r   _disable_strategy8   s   
zQATOptimizer._disable_strategyc                 C   s   d|_ dddg dd|_d S )NT    )channel_wise_abs_maxweight_bitsactivation_bitsnot_quant_patternalgor   )r
   r   contextr   r   r   _enable_strategy<   s   zQATOptimizer._enable_strategyc                 C   s^   | j j}tt}g d|d< |d rdnd|d< |d |d< |d |d< t|d |d< |S )	N)Zconv2dZdepthwise_conv2dmulmatmulZ	matmul_v2Zquantize_op_typesr   Zabs_maxZweight_quantize_typer   r   r   )r   r   copydeepcopyr   list)r
   config
qat_configr   r   r   _gen_qat_configF   s   
	zQATOptimizer._gen_qat_configc                 C   s   | |j d S r   )Z_rebuild_from_descdesc)r
   Zmain_programZrefer_programr   r   r   _replace_program[   s   zQATOptimizer._replace_programNc                 C   s^   | j ||||\}}tj }t|}|  }	t|jj	||	dd}
| 
|jj	|
 ||fS )NT)r(   return_program)r	   ZminimizepaddledeviceZ
get_deviceZ
set_devicer*   r   blockprogramr,   )r
   r   Zstartup_programZparameter_listZno_grad_setZoptimize_opsZparams_gradsr/   placer)   qat_programr   r   r   minimize_impl^   s   

zQATOptimizer.minimize_implc                 C   s8   |d ur|   }t||||ddd}| || d S d S )NT)scoper(   Zfor_testr-   )r*   r   r,   )r
   r2   r5   Ztest_programr)   r3   r   r   r   qat_initp   s   zQATOptimizer.qat_init)NNN)NN)__name__
__module____qualname__r   r   r   r   r"   r*   r,   r4   r6   __classcell__r   r   r   r   r      s    	

r   )r%   r.   Z"paddle.static.quantization.quanterr   r   Zmeta_optimizer_baser   r   r   r   r   r   <module>   s
   