PTQ(PostTrainingQuantization)源码阅读二
PTQ(Post Training Quantization)源码阅读二
上文提到了 PTQRegistry 这个类,主要功能是作为dict来存储 nn.Layer -> LayerInfo 的映射。我们看下这个类的实现。LayerInfoclass LayerInfo(object): """ Store the argnames of the inputs and outputs. """ def __init__(self, layer, input_names: List[TEXT], weight_names: List[TEXT], output_names: List[TEXT]): super().__init__() self.layer = layer self.input_names = input_names self.weight_names = weight_names self.output_names = output_names
主要存储 nn.Layer ,及其对应的输入、权重和输出名。
全局参数 PTQ_LAYERS_INFO , QUANT_LAYERS_INFO 和 SIMULATED_LAYERS 汇总目前支持量化的层的 LayerInfo 如下: PTQ_LAYERS_INFO = [ LayerInfo(paddle.nn.Conv2D, ["Input"], ["Filter"], ["Output"]), LayerInfo(paddle.nn.Linear, ["X"], ["Y"], ["Out"]), LayerInfo(paddle.nn.BatchNorm2D, ["X"], [], ["Y"]), LayerInfo(paddle.nn.AdaptiveMaxPool2D, ["X"], [], ["Out"]), LayerInfo(paddle.nn.AdaptiveAvgPool2D, ["X"], [], ["Out"]), LayerInfo(paddle.nn.AvgPool2D, ["X"], [], ["Out"]), LayerInfo(paddle.nn.MaxPool2D, ["X"], [], ["Out"]), LayerInfo(paddle.nn.ReLU, ["X"], [], ["Out"]), LayerInfo(paddle.nn.ReLU6, ["X"], [], ["Out"]), LayerInfo(paddle.nn.Hardswish, ["X"], [], ["Out"]), LayerInfo(paddle.nn.Swish, ["X"], [], ["Out"]), LayerInfo(paddle.nn.Sigmoid, ["X"], [], ["Out"]), LayerInfo(paddle.nn.Softmax, ["X"], [], ["Out"]), LayerInfo(paddle.nn.Tanh, ["X"], [], ["Out"]), LayerInfo(paddle.nn.quant.add, ["X", "Y"], [], ["Out"]), ] QUANT_LAYERS_INFO = [ LayerInfo( paddle.nn.quant.quant_layers.QuantizedConv2D, ["Input"], ["Filter"], ["Output"], ), LayerInfo( paddle.nn.quant.quant_layers.QuantizedLinear, ["X"], ["Y"], ["Out"] ), ] SIMULATED_LAYERS = [paddle.nn.Conv2D, paddle.nn.Linear]
PTQ_LAYERS_INFO 中存储目前支持量化的层和对应的输入、输出、权重名字。
QUANT_LAYERS_INFO 是量化新实现支持的 LayerInfo。这种实现方式等价 torch 基于 nn.QuantModule 的实现。
SIMULATED_LAYERS 存储的针对 input/weight 量化的层。模拟量化层会采集层的 input 的分布。weight 分布不需要采集。
模拟量化这里应该指的是 Fake Quantization.
PTQRegistry
PTQRegistry 用于对上面三个全局变量查询访问使用.class PTQRegistry(object): """ Register the supported layers for PTQ and provide layers info. """ supported_layers_map = {} registered_layers_map = {} is_inited = False def __init__(self): super().__init__() @classmethod def _init(cls): if not cls.is_inited: for layer_info in PTQ_LAYERS_INFO: cls.supported_layers_map[layer_info.layer] = layer_info all_layers_info = PTQ_LAYERS_INFO + QUANT_LAYERS_INFO for layer_info in all_layers_info: cls.registered_layers_map[layer_info.layer] = layer_info cls.is_inited = True
cls.supported_layers_map 存储 PTQ_LAYERS_INFO 的内容。
cls.registered_layers_map 存储 PTQ_LAYERS_INFO + QUANT_LAYERS_INFO 的内容。
注意,这里的 key 是 nn.Layer 子类。
四个查询接口如下,不做过多介绍了。: @classmethod def is_supported_layer(cls, layer): """ Analyze whether the layer supports quantization. Args: layer(Layer): The input layer can be a python class or an instance. Returns: flag(bool): Whther the layer is supported. """ cls._init() return layer in cls.supported_layers_map or isinstance( layer, tuple(cls.supported_layers_map.keys()) ) @classmethod def is_registered_layer(cls, layer): """ Analyze whether the layer is register layer_info. Args: layer(Layer): The input layer can be a python class or an instance. Returns: flag(bool): Wether the layer is register layer_info. """ cls._init() return layer in cls.registered_layers_map or isinstance( layer, tuple(cls.registered_layers_map.keys()) ) @classmethod def is_simulated_quant_layer(cls, layer): """ Analyze whether the layer is simulated quant layer. Args: layer(Layer): The input layer can be a python class or an instance. Returns: flag(bool): Whther the layer is supported. """ return layer in SIMULATED_LAYERS or isinstance( layer, tuple(SIMULATED_LAYERS) ) @classmethod def layer_info(cls, layer): """ Get the infomation for the layer. Args: layer(Layer): The input layer can be a python class or an instance. Returns: layer_info(LayerInfo): The layer info of the input layer. """ assert cls.is_registered_layer( layer ), "The input layer is not register." for layer_key, layer_info in cls.registered_layers_map.items(): if layer == layer_key or isinstance(layer, layer_key): return layer_info 参考文献利用 NVIDIA TensorRT 量化感知训练实现 INT8 推理的 FP32 精度
老李带你走新疆(原创连载5)天山伊犁概述天山,位于欧亚大陆腹地,横跨中国哈萨克斯坦吉尔吉斯斯坦和乌兹别克斯坦四国,全长约2500千米,主峰托木尔峰海拔7443米,是世界上距离海洋最远的山系和全球干旱地区最大的山系。天
吴忠琼宣布开工!2023年赣州首个预制菜项目在信丰开建1月6日上午,总投资10亿元年生产各类肉制品10万吨的得利斯华南预制食品产业园项目在信丰县正式签约开工。这是我市2023年开工的首个预制菜项目,是全市推进预制菜产业发展三年行动的重
秦创原西咸新区氢能产业政策发布首批加氢站和氢能商用车投用来源西部网(陕西新闻网)西部网讯(记者刘望)今天(1月6日),秦创原西咸新区氢能产业政策发布,首批加氢站和氢能商用车投用。秦创原西咸新区氢能产业政策发布,首批加氢站和氢能商用车投用
工联网2023年1月6日工业互联网产业新闻河北发布2022年工业互联网创新发展试点项目(第二批)名单50个项目入日前,河北省工业和信息化厅发布2022年工业互联网创新发展试点项目(第二批)名单,河钢集团石家庄钢铁有限责任公
我家孩子什么时候可以开始使用代币了?家长提问1我的孩子对强化物太依赖了,有强化物就做任务,没有强化物就不做任务,怎么样才可以不需要每次都用强化物呢?家长提问2孩子每次做完任务我都会给强化物,开始的时候还能好好配合我做
有种新型啃老悄然兴起,父母还不知情,对外夸赞孩子前途无量自古以来,父母养育子女是一个惯例和社会责任的问题。然而,孩子有一天会长大,父母也有一天变老。因此,一代又一代的年轻人长大后倾向于赡养年迈的父母,作为对他们养育的回报。然而,随着社会
顺产派VS剖宫流,你站哪个?近年来,我国产妇剖宫产率逐年递增,许多城市的剖宫产率甚至超过50,大大超出了世界卫生组织规定的15到20的标准。这一数字或许已经为产妇该选择剖宫产还是顺产给出了答案。但小编提醒你,
橙邀您来采摘甜蜜贡井区建设镇2023年白庙血橙采摘月启幕自贡网记者周嘉摄影宋姿熠一串串沉甸甸的果实缀满枝头,阵阵橘香沁人心脾,成片的柑橘园里到处是丰收的景象。1月6日,贡井区建设镇2023年白庙血橙采摘月拉开帷幕,以摘白庙血橙品农家美食
和平精英全国大赛,参与破圈与爆发当四名主播组成的广东男团站在舞台中央接受冠军的加冕时,历时七个月,从特点迥异的四条赛道走出的20支队伍,最终实现了2022和平精英全国大赛赛事宣传片里提到的从八十亿分之一成为百分之
王鹤棣陈钰琪浮图缘一周播放破千万,登顶全球Top1,凭什么?开场先给大家说一个喜报古偶剧浮图缘在爱奇艺海外站内预约第一名,一周破千万播放,并在美国加拿大新加坡越南泰国等地登顶TOP1。看来被肖铎美色所误的人真不少!不少网友还风趣地表示海外的
全球首款数字电源快充充电器,来了如果说这两年关于充电,大家听到最多的词是什么,我相信大部分人都会脱口而出GaN氮化镓。这要从近两年充电器上的疯狂内卷开始说起。好像从某个时间点开始,一夜之间,氮化镓就如雨后春笋般出