o
    "jL                     @   s   d dl Z d dlZd dlZd dlmZmZ d dlmZm	Z	m
Z
mZmZ ddlmZ ddlmZmZ ddlmZmZ eej Zeej Zd	d
 ZedG dd deZdS )    N)IrGraphcore)AddQuantDequantForInferencePassAddQuantDequantPassV2OutScaleForTrainingPassQuantizationTransformPassV2quant_config   )	Converter)OperatorDistAttrTensorDistAttr   )PassBaseregister_passc                 C   s   | j  | j  fS )N)nodeZgraph_idid)r    r   u/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/distributed/passes/auto_parallel_quantization.py_node_id,   s   r   Zauto_parallel_quantizationc                       sL   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	  Z
S )QuantizationPassc                    s>   t    | dd  | dd  | dd | dd  d S )Ndist_contextparams_gradsmodetrainloss)super__init__set_attrself	__class__r   r   r   2   s
   
zQuantizationPass.__init__c                 C   s(   |  dd u r	dS |  dd u rdS dS )Nr   Fr   T)get_attrr   r   r   r   _check_self9   s
   zQuantizationPass._check_selfc                 C   s   dS )NTr   )r   Z
other_passr   r   r   _check_conflict@   s   z QuantizationPass._check_conflictc                 C   s  |  d}|  d}|  d}|  d}tj }tjtj j}	i }
|j	D ]}|j
|
|j< q(|dkr7dnd}tt|j|dkd}g }g }g d	}|D ]}|tv r[|| qO|tv rd|| qO|  d
rld
nd}t|dkrt||	|  d|  d|  dd||d d d d d d |d}| D ]}|| qt|dkrt||	|  d|  d||d}| D ]}|| qt||	|d}| D ]}|| q|dkr|  drzt||	|  dd}W n	   td Y | }| |}g }|D ]%\}}|j| j vrq| j |j }| j |j }|||f qd }|r0| j |j }|j	D ]}|j!|
|j  q3| "||| | #||||	 |$d| |$d| |$d| |$d| d S )Nr   r   r   r   r   TF)Zfor_test)Zconv2dZdepthwise_conv2dmulmatmulZ	matmul_v2Zchannel_wise_abs_maxZabs_maxr   weight_bitsactivation_bitsZnot_quant_patternZmoving_average_abs_max)scopeplacer'   r(   skip_patternZactivation_quantize_typequantizable_op_typeweight_quantize_typeZweight_quantize_funcZact_quantize_funcZweight_preprocess_funcZact_preprocess_funcZoptimizer_funcexecutoris_test)r)   r*   
quant_bitsr+   r,   r/   )r)   r*   r/   Zonnx_format)r)   r*   r0   zXUnable to convert quant model with onnx_format=True, please update PaddlePaddle >= 2.4.0main_programstartup_program)%r"   paddleZstaticZglobal_scopeZ	frameworkZ	CUDAPlacedistributedZParallelEnvZdev_idblocksZ
parent_idxidxr   r   ZGraphdescTRANSFORM_PASS_OP_TYPESappendQUANT_DEQUANT_PASS_OP_TYPESlenr   Zall_sub_graphsapplyr   r   r   loggingwarningZ
to_program move_presist_var_to_global_blocknameglobal_blockvarsZ_set_forward_block_idxset_dist_attr_for_qat_programreset_scope_varr   )r   r1   r2   contextr   r   r   r   r)   r*   Zparent_idx_dictblockr/   Z
main_graphZtransform_pass_opsZquant_dequant_opsZquantize_op_typesZop_typer-   Ztransform_passZ	sub_graphZquant_dequant_passZout_scale_training_passZout_scale_infer_passquant_programZnew_params_gradsparamZgrad	new_paramZnew_gradZnew_lossr   r   r   _apply_single_implC   s   










z#QuantizationPass._apply_single_implc           	      C   s   |  }|jD ]D}|jdkrK|dj}||}g }|j D ]\}}|jr1|	| |
| q |D ]}|| q4||d |jd| q|S )NwhileZ	sub_blockX)rA   opstypeattrr   rF   rB   itemsZpersistableZ_clone_variabler9   Z_remove_varextendinputr7   Z	set_input)	r   programrA   Z_opZ	_block_id_blockZpersistables_nameZ_varr   r   r   r?      s"   




z1QuantizationPass.move_presist_var_to_global_blockc                 C   s   |  D ]?}||j}|r|  sq| }|j|jkr q||}|j|jj|jj	d}	t
t||	}
|  ||
| qd S )N)dims_mappingZprocess_shapeZprocess_group)Z	list_varsZfind_varr@   Z
get_tensorZ_is_initializedshapeZ get_tensor_dist_attr_for_programrV   process_meshZprocess_idsr
   Zslice_with_dist_attrnparray_clearset)r   rG   r   r)   r*   varZ	scope_varZtensorZvar_dist_attr	dist_attrZsliced_tensorr   r   r   rD      s$   

z QuantizationPass.reset_scope_varc           *      C   s  t |jD ]I\}}d}t |jD ]\}}t }	d|jv s$|jdkro|jdd }
d|
v r9|
d |
d }
|jdksJ|| t|j| jkrT|j| 	|
j
}n
|j| j||  }||j}|j}|
|jv rr|j|
 }n|j|
 }d|	_d|	_||	_|	|jdd | |j D ]^}|j|d }|	|}dd |jD }|dkrq|d	v r|d
r|d
dkr|jdd }|	|}|	|}|d
}|j| g}t }||_||_||| |	|| q|j D ]n}|j|d }|	|}dd |jD }|dkr||| |	|| q|dkrN|d
rN|d
dkrN|jdd }|	|}|	|}|d
}|j| g}t }||_||_||| |	|| q|dd |d7 }n|j| j||  }|j|j   ||}|d usJ d|j}|j|	_|j|	_|j|	_d}t |j!D ]7\}}
|jdkr|
|j!vrd|
v sd|
v sJ |d7 }q||8 }|j!| }|j| } |	|
|  qt |j"D ]7\}}|j"| }!|j|! }"|	||" |j| #|s|j| 	|!}#|$|#j}$|	|}%||%|$ q|%||	 q|j&' D ]'\}&}'|&|j| j&v rM|j| j&|& }(|$|(})|)sFq'||'|)j q'qd S )Nr   quantizeZmoving_average_abs_max_scalerL   z
.quantizeddefaultc                 S      g | ]}d qS r   .0ir   r   r   
<listcomp>1      zBQuantizationPass.set_dist_attr_for_qat_program.<locals>.<listcomp>)ZScaleZ	ZeroPoint
quant_axisrc   c                 S   ra   rb   r   rd   r   r   r   rg   R  rh   YZOutScaleZ	op_device r   zorigin op must have dist attr.rK   z@scalez@zero_point)(	enumerater5   rM   r   rN   r7   rR   indexr;   Z_var_recursiveopZget_dist_op_for_programr^   rX   Zoutputs_dist_attrsZinputs_dist_attrsZimpl_idxZ	impl_typeZset_input_dist_attrZinput_namesrW   Zhas_attrrO   Zget_input_dist_attrrV   r   Z set_tensor_dist_attr_for_programZoutput_namesoutputZset_output_dist_attrZ	_set_attrZset_original_idZoriginal_idZinput_arg_namesZoutput_arg_namesZ_find_var_recursiveZget_dist_tensor_for_programZset_op_dist_attr_for_programrB   rP   )*r   rG   r1   r   ZibrF   Z
qat_offsetipZquant_opZquant_op_dist_attrZ
input_nameZ
consume_opZconsume_op_dist_attrZref_process_meshZconsume_input_dist_attrZ	slot_nameZin_nameZ	input_varZref_dims_mappingZx_nameZx_varZx_dist_attrri   Ztensor_dist_attrZoutput_nameZ
output_varZ	origin_opZdist_origin_opZorigin_op_dist_attrZscale_offsetr6   Zorigin_input_nameZorigin_input_dist_attrZorigin_output_nameZorigin_output_dist_attrZorigin_output_varZorigin_out_tensor_dist_attrZquant_output_varr@   Zdst_varZsrc_varZdist_tensorr   r   r   rC      sd  

















 z.QuantizationPass.set_dist_attr_for_qat_program)__name__
__module____qualname__r   r#   r$   rJ   r?   rD   rC   __classcell__r   r   r    r   r   0   s     r   )r=   numpyrY   r3   Zpaddle.frameworkr   r   Zpaddle.static.quantizationr   r   r   r   r   Zauto_parallel.static.converterr
   Z#auto_parallel.static.dist_attributer   r   Z	pass_baser   r   listZ#SUPPORT_WEIGHT_QUANTIZATION_OP_DICTkeysr8   Z SUPPORT_ACT_QUANTIZATION_OP_DICTr:   r   r   r   r   r   r   <module>   s"   