o
    + i                     @   s\   d dl Z d dlZd dlmZ d dlmZmZ ddlmZ ddl	m
Z
 G dd de jd	ZdS )
    N)Layer)ConvertibleQuantedLayerLinearQuanterDequanter   )BaseQuanter)QuantConfigc                   @   s   e Zd ZdZdefddZejddefddZ	ddefd	d
Z
dedefddZdedefddZdd Zdd Zdd ZdS )Quantizationz
    Abstract class used to prepares a copy of the model for quantization calibration or quantization-aware training.
    Args:
        config(QuantConfig): Quantization configuration
    configc                 C   s   t || _d S N)copydeepcopy_config)selfr	    r   h/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/paddle/quantization/quantize.py__init__#   s   zQuantization.__init__Fmodelc                 C   s   dS )zMCreate a model for quantization-aware training or post-training quantization.Nr   )r   r   inplacer   r   r   quantize&   s   zQuantization.quantizec                 C   s   |r|nt |}i }| D ]C\}}d}t|tr7|jrqt|dr0|jdu s/|j du r0q|j	|d nt|t
rBt|}n| j|d|d |durR|||< q| D ]	\}	}
|
|j|	< qW|S )a   Convert the quantization model to ONNX style. And the converted
        model can be saved as inference model by calling paddle.jit.save.
        Args:
            model(Layer): The quantized model to be converted.
            inplace(bool, optional): Whether to modify the model in-place, default is False.
            remain_weight(bool, optional): Whether to remain weights in floats, default is False.

        Return: The converted model

        Examples:
            .. code-block:: python

                >>> import paddle
                >>> from paddle.quantization import QAT, QuantConfig
                >>> from paddle.quantization.quanters import FakeQuanterWithAbsMaxObserver
                >>> from paddle.vision.models import LeNet

                >>> quanter = FakeQuanterWithAbsMaxObserver(moving_rate=0.9)
                >>> q_config = QuantConfig(activation=quanter, weight=quanter)
                >>> qat = QAT(q_config)
                >>> model = LeNet()
                >>> quantized_model = qat.quantize(model)
                >>> converted_model = qat.convert(quantized_model)
                >>> dummy_data = paddle.rand([1, 1, 32, 32], dtype="float32")
                >>> paddle.jit.save(converted_model, "./quant_deploy", [dummy_data])
        Nweight_quanter)remain_weightT)r   r   )r   r   named_children
isinstancer   Z	convertedhasattrr   scales_convertr   r   Zfrom_quanterconvertitems_sub_layers)r   r   r   r   _modelreplacednamechildZquant_dequantkeyvaluer   r   r   r   +   s*   



zQuantization.convertc                 C   sj   i }|  D ]\}}||rt||jv r||||< q| || q| D ]	\}}||j|< q)d S r
   )r   Z_is_quantifiabletypeZqat_layer_mappingsZ_get_qat_layer_convert_to_quant_layersr   r   r   r   r	   r    r!   r"   r#   r$   r   r   r   r&   ]   s   z%Quantization._convert_to_quant_layersc                 C   s   i }|  D ])\}}||r||||< qt||j vr/t||j vr/| || q| D ]	\}}||j	|< q4d S r
   )
r   Z_need_observeZ_get_observe_wrapperr%   Z_qat_layer_mappingvaluesZ_customized_qat_layer_mapping_insert_activation_observersr   r   r'   r   r   r   r)   j   s   
z)Quantization._insert_activation_observersc                 C   s
   | j  S r
   )r   detailsr   r   r   r   _detailsy   s   
zQuantization._detailsc                 C      |   S r
   )r,   r+   r   r   r   __str__|      zQuantization.__str__c                 C   r-   r
   )r.   r+   r   r   r   __repr__   r/   zQuantization.__repr__N)F)FF)__name__
__module____qualname____doc__r   r   abcabstractmethodr   r   r   r&   r)   r,   r.   r0   r   r   r   r   r      s    2r   )	metaclass)r5   r   Z	paddle.nnr   Zpaddle.nn.quant.formatr   r   Zbase_quanterr   r	   r   ABCMetar   r   r   r   r   <module>   s   