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年不结婚,转身娶了蒋勤勤后,怎样了陈建斌说当时我女朋友建议我拍这部戏,她觉得剧本不错,后来我听了她的话。当时他口中的女朋友是吴越。那时的陈建斌很爱吴越,还规划着在2005年步入婚姻殿堂。然而这一切被电视剧乔家大院改
油灯下的妈妈1950年前后,正是我童龄无忌的大好年华。在那些岁月里,油灯下的妈妈,牢牢定格在我的生命中,成了我一生中永不磨灭的记忆我家有几间土木结构的泥瓦房,有几亩地,谈不上富有,但也不十分穷
王楠女儿受伤就医!双腿多处疼痛表情痛苦,妈妈满不在乎笑出声饿了吗?戳右边关注我们,每天给您送上最新出炉的娱乐硬核大餐!11月18日,王楠的丈夫郭斌晒出了女儿练球受伤的视频,6岁的笑笑双腿多处疼痛,但依旧坚持练球,画面曝光后引发热议。露面的
读书氛围营造得太好了,卫生间里装书柜,妈妈主持召开家庭读书会现如今父母和孩子都说没时间读书,父母忙于工作,回来还要应付一日三餐,还有柴米油盐酱醋茶,有空儿还得刷手机,哪有时间读书?孩子更忙,忙着上学,忙着考试,忙着做作业,哪有时间读课外书?
女儿夹腿被妈妈批评,为什么女生不能夹腿?家里有女儿的要知道许多父母在生下孩子后,由于没有带娃的经验,会不知所措以至乱了手脚。其实大家都是第一次成为父母,宝宝们在长大的过程中,总会出现各种问题。但如果我们作为家长没有使用正确的教育方式来引导
德国童装设计师中国妈妈们提供了产品灵感作为一名服装设计师,来自德国的芭芭拉非常喜欢中国的传统面料纹样和剪裁工艺。从德国到中国,五年来她一直在探寻新的设计风格,她的作品将家乡的设计风格与中国元素更好地结合在一起,赢得了很
婆婆抹着眼泪说,你妈妈怎么这样能忍呢?2020年11月中旬的一天,我下班回家看到妈妈坐在沙发上,摆弄着手机里的微信,似乎是和谁刚聊完天。妈,我回来了,她没有回应我。我脱下外套换了鞋,走过去看到妈妈眼圈红红的,好像刚哭过
向往美好的平安之愿海晏河清万象平护国佑民妈祖神作者唐裕民普天均雨露,大海静波涛。衢州市区天皇巷内,有一座白石粉墙乌瓦的庙宇,二百年来默默地为城内的百姓祈福,祈求风调雨顺,国泰民安。这便是浙江省文物保护单位天后宫,供奉着海神妈祖
收藏一些喜欢的句子最近很喜欢的一段话照顾好自己的健康和情绪,这场人生,你就赢了一大半了,其余的其余,人生自有安排。再贵的东西365都会变得很便宜,再小的努力365都会变得很伟大。走过的路,见过的人各
心灵鸡汤有用吗?如今一说到心灵鸡汤,感觉大家都很反感。为什么呢?大家说因为如今的时代已经不是过去的时代了。人们都清醒了,已经意识到不是我们听听心灵鸡汤就能够过得好,也不是我们读读心灵鸡汤就能获得成
散文让高雅的兴趣爱好,点亮我们平凡的生活我们平凡的生活中,有一地鸡毛的生活琐事,有工作的困扰等,如果没有高雅的兴趣爱好相伴,那么此生,都有可能活得黯淡无光。唐僧去西天取经的路上,心中有着对佛经的虔诚追求,才能克服九九八十