
    x-jL                     B   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	 Z ed
           G d de                      ZdS )    N)IrGraphcore)AddQuantDequantForInferencePassAddQuantDequantPassV2OutScaleForTrainingPassQuantizationTransformPassV2quant_config   )	Converter)OperatorDistAttrTensorDistAttr   )PassBaseregister_passc                 f    | j                                         | j                                         fS )N)nodegraph_idid)r   s    t/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/paddle/distributed/passes/auto_parallel_quantization.py_node_idr   ,   s%    I  $),,..11    auto_parallel_quantizationc                   B     e Zd Z fdZd Zd Zd Zd Zd Zd Z	 xZ
S )QuantizationPassc                     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__s    r   r"   zQuantizationPass.__init__2   so    nd+++nd+++fg&&&fd#####r   c                 b    |                      d          dS |                      d          dS dS )Nr   Fr   T)get_attr)r$   s    r   _check_selfzQuantizationPass._check_self9   s5    ==((05==((05tr   c                     dS )NT )r$   
other_passs     r   _check_conflictz QuantizationPass._check_conflict@   s    tr   c                 J	   |                      d          }|                      d          }|                      d          }|                      d          }t          j                                        }t          j                            t          j                                        j                  }	i }
|j	        D ]}|j
        |
|j        <   |dk    rdnd}t          t          j        |j                  |dk              }g }g }g d	}|D ]?}|t           v r|                    |           !|t$          v r|                    |           @|                      d
          rd
nd}t'          |          dk    rt)          ||	|                      d          |                      d          |                      d          d||d d d d d d |          }|                                D ]}|                    |           t'          |          dk    rgt/          ||	|                      d          |                      d          ||          }|                                D ]}|                    |           t1          ||	|          }|                                D ]}|                    |           |dk    rW|                      d          rB	 t3          ||	|                      d                    }n#  t5          j        d           Y nxY w|                                }|                     |          }g }|D ]\  }}|j        |                                j         vr&|                                j         |j                 }|                                j         |j                 }|                    ||f           d }|r$|                                j         |j                 }|j	        D ]'}|j        !                    |
|j                            (| "                    |||           | #                    ||||	           |$                    d|           |$                    d|           |$                    d|           |$                    d|           d S )Nr   r   r   r    r   TF)for_test)conv2ddepthwise_conv2dmulmatmul	matmul_v2channel_wise_abs_maxabs_maxr   weight_bitsactivation_bitsnot_quant_patternmoving_average_abs_max)scopeplacer6   r7   skip_patternactivation_quantize_typequantizable_op_typeweight_quantize_typeweight_quantize_funcact_quantize_funcweight_preprocess_funcact_preprocess_funcoptimizer_funcexecutoris_test)r:   r;   
quant_bitsr<   r>   rF   )r:   r;   rF   onnx_format)r:   r;   rG   zXUnable to convert quant model with onnx_format=True, please update PaddlePaddle >= 2.4.0main_programstartup_program)%r'   paddlestaticglobal_scope	framework	CUDAPlacedistributedParallelEnvdev_idblocks
parent_idxidxr   r   GraphdescTRANSFORM_PASS_OP_TYPESappendQUANT_DEQUANT_PASS_OP_TYPESlenr   all_sub_graphsapplyr   r   r   loggingwarning
to_program move_persist_var_to_global_blocknameglobal_blockvars_set_forward_block_idxset_dist_attr_for_qat_programreset_scope_varr#   )r$   rI   rJ   contextr   r   r   r    r:   r;   parent_idx_dictblockrF   
main_graphtransform_pass_opsquant_dequant_opsquantize_op_typesop_typer?   transform_pass	sub_graphquant_dequant_passout_scale_training_passout_scale_infer_passquant_programnew_params_gradsparamgrad	new_paramnew_gradnew_losss                                  r   _apply_single_implz#QuantizationPass._apply_single_implC   s>   }}^44}}^44}}V$$}}V$$ **,, ****,,3
 

 !( 	: 	:E).)9OEI&&'//$$uJ|())DGO
 
 


  
 
 
 ) 	2 	2G111"))'2222777!((111 }}344"" 	 !""Q&&8 MM-88 $.? @ @!]]+>??)A$6%9%)"&'+$(#  N" (6688 0 0	$$Y////  !!A%%!6==):;;!]]+>??$5" " " (6688 4 4	"((3333 #:ug#
 #
 #
 $2244 	5 	5I#)))4444 7??t}}];;?'F#}}->??( ( ($$n    
 #--//==mLL ' 	; 	;KE4z!;!;!=!=!BBB%22449%*EI$11338CH##Y$9::::  	D$11338CH #) 	J 	JEJ--oei.HIIII 	**<	
 	
 	

 	]L%GGG777*O<<<)9:::*****s   %K7 7Lc                    |                                 }|j        D ]}|j        dk    r|                    d          j        }|                    |          }g }|j                                        D ]6\  }}|j        r*|	                    |           |
                    |           7|D ]}|                    |           |                    |                    d                     |j                            d|           |S )Nwhile	sub_blockX)rc   opstypeattrr   rj   rd   itemspersistable_clone_variablerY   _remove_varextendinputrW   	set_input)	r$   programrc   _op	_block_id_blockpersistables_name_vars	            r   ra   z1QuantizationPass.move_persist_var_to_global_block   s   ++--# 	6 	6Cx7""HH[114	 y11!#);#4#4#6#6 3 3KE4' 3$44T:::$++E222) . .E&&u----##CIIcNN333""3555r   c                    |                                 D ]}|                    |j                  }|r&|                                                                sE|                                }|j        |j        k    rj|                    |          }|j        |j        j        |j        j	        d}	t          j        t          j        |          |	          }
|                                 |                    |
|           d S )N)dims_mappingprocess_shapeprocess_group)	list_varsfind_varrb   
get_tensor_is_initializedshape get_tensor_dist_attr_for_programr   process_meshprocess_idsr   slice_with_dist_attrnparray_clearset)r$   ru   r   r:   r;   var	scope_vartensorvar_dist_attr	dist_attrsliced_tensors              r   rg   z QuantizationPass.reset_scope_var   s    **,, 	- 	-Csx00I )"6"6"8"8"H"H"J"J ))++FyFL(((II#NNM - :!.!;!A!.!;!G I &:  ) M MMOOOJJ}e,,,,)	- 	-r   c                     t          |j                  D ]\  }}d}t          |j                  D ]K\  }}t                      }	d|j        v s|j        dk    r0|j                            d          d         }
d|
v r|
d |
                    d                   }
|j        dk    s&||z
  t          |j        |         j                  k    r&|j        |         	                    |
          j
        }n|j        |         j        ||z
           }|                    |          j        }|j        }|
|j        v r|j        |
         }n|j        |
         }d|	_        d|	_        ||	_        |	                    |j                            d          d         |           |j                                        D ]7}|j                            |          d         }|	                    |          }d |j        D             }|dk    rP|dv r|                    d	          r|                    d	          d
k    rm|j                            d          d         }|	                    |          }|	                    |          }|                    d	          }|j        |         g}t3                      }||_        ||_        |                    ||           |	                    ||           9|j                                        D ]e}|j                            |          d         }|	                    |          }d |j        D             }|dk    r-|                    ||           |	                    ||           ||dk    r|                    d	          r|                    d	          d
k    rm|j                            d          d         }|	                    |          }|	                    |          }|                    d	          }|j        |         g}t3                      }||_        ||_        |                    ||           |	                    ||           g|                    dd           |dz  }n|j        |         j        ||z
           }|j                            |j                                                    |                    |          }|
J d            |j        }|j        |	_        |j        |	_        |j        |	_        d}t          |j!                  D ]^\  }}
|j        dk    r|
|j!        vrd|
v sd|
v sJ |dz  })||z  }|j!        |         }|j        |         } |	                    |
|            _t          |j"                  D ]\  }}|j"        |         }!|j        |!         }"|	                    ||"           |j        |         #                    |          se|j        |         	                    |!          }#|$                    |#          j        }$|	                    |          }%|                    |%|$           |%                    ||	           M|j&        '                                D ]d\  }&}'|&|j        |         j&        v rK|j        |         j&        |&         }(|$                    |(          })|)sI|                    |'|)j                   ed S )Nr   quantizemoving_average_abs_max_scaler   z
.quantizeddefaultc                     g | ]}d S r*   .0is     r   
<listcomp>zBQuantizationPass.set_dist_attr_for_qat_program.<locals>.<listcomp>1  s    +H+H+H1B+H+H+Hr   )Scale	ZeroPoint
quant_axisr   c                     g | ]}d S r   r*   r   s     r   r   zBQuantizationPass.set_dist_attr_for_qat_program.<locals>.<listcomp>R  s    +I+I+I1B+I+I+Ir   YOutScale	op_device r   zorigin op must have dist attr.r~   z@scalez@zero_point)(	enumeraterS   r   r   r   rW   r   indexr[   _var_recursiveopget_dist_op_for_programr   r   outputs_dist_attrsinputs_dist_attrsimpl_idx	impl_typeset_input_dist_attrinput_namesr   has_attrr   get_input_dist_attrr   r    set_tensor_dist_attr_for_programoutput_namesoutputset_output_dist_attr	_set_attrset_original_idoriginal_idinput_arg_namesoutput_arg_names_find_var_recursiveget_dist_tensor_for_programset_op_dist_attr_for_programrd   r   )*r$   ru   rI   r   ibrj   
qat_offsetipquant_opquant_op_dist_attr
input_name
consume_opconsume_op_dist_attrref_process_meshconsume_input_dist_attr	slot_namein_name	input_varref_dims_mappingx_namex_varx_dist_attrr   tensor_dist_attroutput_name
output_var	origin_opdist_origin_oporigin_op_dist_attrscale_offsetrU   origin_input_nameorigin_input_dist_attrorigin_output_nameorigin_output_dist_attrorigin_output_varorigin_out_tensor_dist_attrquant_output_varrb   dst_varsrc_vardist_tensors*                                             r   rf   z.QuantizationPass.set_dist_attr_for_qat_program   sc    #=#788 T	 T	IBJ )%) 4 4 D DH%5%7%7" (-//}(FFF "*!4!4S!9!9!!<J!Z//%/<j..|<<<&

 !)GGG
?c,2Eb2I2M.N.NNN )/3+^J77 #
 &2%8%<%@O&
 ,8+O+O", , ) (<'H$!%9%LLL0CJO 0/
 1B:N 0 34&/3<&06F&3&:: ++C0035L   &.]%>%>%@%@  	"*-"5"5i"@"@"C$)$8$8$A$A	+H+H	+H+H+H($++$&*@@@ ( 1 1, ? ?"$,MM,$?$?2$E$E)1)<)<S)A)A!)D(-(<(<V(D(D$6$J$J(.%& %& !,
 .6]]<-H-H
$/$<Z$H4" 0 ,:+;+;(8H(58H(5$EE%'7   +>>#%5    &.]%?%?%A%A % %	&.m&:&:9&E&Ea&H%*%9%9+%F%F
+I+I
8H+I+I+I($++(II *,C   /CC +-D   %&*44 ( 1 1, ? ?"$,MM,$?$?2$E$E)1)<)<S)A)A!)D(-(<(<V(D(D$6$J$J(.%& %& !,
 .6]]<-H-H
$/$<Z$H4" 0 ,:+;+;(8H(58H(5$EE&(8   +??')9    &&{B777!OJJ !- 3B 7 ;BO LIM11).2L2L2N2NOOO%1%I%I!& &N *558 655 +9*B'2E2N&/3F3P&0+8 '3 $%L+4X5M+N+N  Z%Ng55 *)2K K K !)J 6 6#0J#>#>#>!? )A-L$|+,5,Ec,J)/A 1 /
 +>>&(>    -6 1- -  ([ .7-G-L*/B 2 0
 +??')@    ,226JJ'     1=0C "1,n-?@@ . !- H H$5!" !""+ 8
 05/C/CK/P/P,(II 02M   990   
 "'!1!1!3!3 
 
g<.r2777*1"5:4@G"."J"J# #K ' !  AA!6  
UT	 T	r   )__name__
__module____qualname__r"   r(   r,   r|   ra   rg   rf   __classcell__)r%   s   @r   r   r   0   s        $ $ $ $ $    I+ I+ I+V  "- - -0X X X X X X Xr   r   )r^   numpyr   rK   paddle.frameworkr   r   paddle.static.quantizationr   r   r   r   r	   auto_parallel.static.converterr   #auto_parallel.static.dist_attributer   r   	pass_baser   r   list#SUPPORT_WEIGHT_QUANTIZATION_OP_DICTkeysrX    SUPPORT_ACT_QUANTIZATION_OP_DICTrZ   r   r   r*   r   r   <module>r     s         * * * * * * * *              7 6 6 6 6 6        / . . . . . . .$499;;   #d16688  
2 2 2 +,,^ ^ ^ ^ ^x ^ ^ -,^ ^ ^r   