范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

PTQ(PostTrainingQuantization)源码阅读一

  PTQ(Post Training Quantization)源码阅读一
  最近在做模型量化相关工作,就研究下PTQ的原理和代码实现。PTQ原理部分已经有很多文章讲的都很好,有时间的话后面自己总结一篇原理篇。本文主要从PTQ代码实现来阐述。
  讲解代码前我们先看下PTQ的使用: # load model model = load_model(model_path) model.eval()  # register quant_handle_hook in forward_post_hooks ptq = PTQ() model = ptq.quantize(model)  # calibration for key, input in reader:    model(input)  # compute quant params ptq.ptq._convert(model)  # save quant model jit.save(model, quant_model_path)
  我们先看下如何收集 activation 量化信息。 ImperativePTQclass ImperativePTQ(object):     """     Static post training quantization.     """      def __init__(self, quant_config=ptq_config.default_ptq_config):         """         Constructor.          Args:             quant_config(PTQConfig): the config of post training quantization.                 The config has weight_quantizer and activation_quantizer.                 In default, the weight_quantizer is PerChannelAbsmaxQuantizer                 and the activation_quantizer is KLQuantizer.         """         super().__init__()          assert isinstance(quant_config, ptq_config.PTQConfig)          self._quant_config = quant_config
  ImperativePTQ 是PTQ的实现类。输出参数为quant_config ,主要指明 weight/activation 的量化方法。默认的 activation_quantizer 使用 KLQuantizer , weight_quntizer 使用 PerChannelAbsmaxQuantizer .class PTQConfig(object):     """     The PTQ config shows how to quantize the inputs and outputs.     """      def __init__(self, activation_quantizer, weight_quantizer):         """         Constructor.          Args:             activation_quantizer(BaseQuantizer): The activation quantizer.                 It should be the instance of BaseQuantizer.             weight_quantizer(BaseQuantizer): The weight quantizer.                 It should be the instance of BaseQuantizer.         """         super().__init__()         assert isinstance(activation_quantizer, tuple(SUPPORT_ACT_QUANTIZERS))         assert isinstance(weight_quantizer, tuple(SUPPORT_WT_QUANTIZERS))          self.in_act_quantizer = copy.deepcopy(activation_quantizer)         self.out_act_quantizer = copy.deepcopy(activation_quantizer)         self.wt_quantizer = copy.deepcopy(weight_quantizer)          self.quant_hook_handle = None          # In order to wrap simulated layers, use in_act_quantizer         # to calculate the input thresholds for conv2d, linear and etc.         self.enable_in_act_quantizer = False   default_ptq_config = PTQConfig(KLQuantizer(), PerChannelAbsmaxQuantizer())
  其中  quant_hook_handle  是 Layer 的 foward post hook的 handle。
  enable_in_act_quantizer  是否使用 in_act_quantizer  计算输入激活的量化参数。activation 默认使用 KLQuantizer 量化器。 weight 默认使用 PerChannelAbsmaxQuantizer 量化器。 _is_skip_layer 和 _is_quant_layer
  模型一般是一层一层堆叠起来的,框架提供的 nn.Conv2d , nn.Linear 层一般作为基础层来搭建模型网络。量化时我们需要知道哪些层需要量化,哪些层不需要量化。可以通过_is_skip_layer 和_is_quant_layer 两个静态类方法获得。     @staticmethod      def _is_skip_layer(layer):         return hasattr(layer, "skip_quant") and layer.skip_quant == True       @staticmethod      def _is_quant_layer(layer):         return hasattr(layer, "_quant_config") is_leaf_layerdef is_leaf_layer(layer):     """     Whether the layer is leaf layer.     """     return isinstance(layer, paddle.nn.Layer) and len(layer.sublayers()) == 0
  layer 的 sublayers 空时为叶子节点。 quantize     def quantize(self, model, inplace=False, fuse=False, fuse_list=None):         """         Add quant config and hook to the target layer.          Args:             model(paddle.nn.Layer): The model to be quantized.             inplace(bool): Whether apply quantization to the input model.                            Default: False.             fuse(bool): Whether to fuse layers.                         Default: False.             fuse_list(list): The layers" names to be fused. For example,                 "fuse_list = [["conv1", "bn1"], ["conv2", "bn2"]]".                 A TypeError would be raised if "fuse" was set as                 True but "fuse_list" was None.                 Default: None.         Return             quantized_model(paddle.nn.Layer): The quantized model.         """         assert isinstance(             model, paddle.nn.Layer         ), "The model must be the instance of paddle.nn.Layer."         if not inplace:             model = copy.deepcopy(model)         if fuse:             model.eval()             model = fuse_utils.fuse_layers(model, fuse_list)
  我们看下模型量化的入口,  model  是模型实例,inplace  指明是否在原图上操作,fuse 和fuse_list 用户指定是否对模型做fuse操作。该接口最终返经过处理(用于收集模型各层 activation 的信息)后的模型。        for name, layer in model.named_sublayers():             if (                 PTQRegistry.is_supported_layer(layer)                 and utils.is_leaf_layer(layer)                 and not self._is_skip_layer(layer)             ):                 # Add quant config                 quant_config = copy.deepcopy(self._quant_config)                 if PTQRegistry.is_simulated_quant_layer(layer):                     ## quant activation                     quant_config.enable_in_act_quantizer = True                 layer._quant_config = quant_config                  # register hook                 hook = ptq_hooks.quant_forward_post_hook                 quant_hook_handle = layer.register_forward_post_hook(hook)                 quant_config.quant_hook_handle = quant_hook_handle                 layer._forward_post_hooks.move_to_end(                     quant_hook_handle._hook_id, last=False                 )          return model
  首先遍历各层,判断该层: 是否支持量化。 是否是叶子层。 是否跳过该层。
  PTQRegistry  是一个字典,后续再看下其实现。
  如果满足上述条件,则对该层添加量化处理: 层中保存量化配置参数 quant_config 。如果是模拟量化层(针对 input/weight 量化)的话,开启 enable_in_act_quantizer .再层中注册 register_forward_post_hook ,其实现为 ptq_hooks.quant_forward_post_hook .
  我们看下 quant_forward_post_hook 的实现:def quant_forward_post_hook(layer, inputs, outputs):     """     The forward_post_hook for PTQ.     """     assert hasattr(         layer, "_quant_config"     ), "The layer should have _quant_config attr"      qc = layer._quant_config     if qc.enable_in_act_quantizer:         qc.in_act_quantizer.sample_data(layer, inputs)     qc.out_act_quantizer.sample_data(layer, (outputs,))
  在 forward 完成后,通过  qc.out_act_quantizer  收集 outputs 的 activation 数据。
  根据  qc.enable_in_act_quantizer  的配置确定是否收集 inputs 的 activation 数据。
  我们知道,只有  PTQRegistry.is_simulated_quant_layer(layer)  真(目前只有 nn.Conv2D/nn.Linaer  时为真)的时候 qc.enable_in_act_quantizer  为真。
  KLQuantizer 、PerChannelAbsmaxQuantizer 的实现我们后面再讨论。
  至此,处理完各层后返回  model  对象。后续使用校准数据过 model ,收集 activation 分布。

LPL网友热议TES不敌RGE,上上签打成死亡之组,建议游泳回家TES在小组赛最后一场不敌RGE,第一轮打完TES的战绩是12排名第三,这个结果出乎所有人意料,赛前所有人都认为TES在这一组可以轻松出现,毕竟LPL二号种子,但是TES让所有人都TES爆冷不敌RGE两连败,G2掏绝活被JDG拿下,TES淘汰是最好结局?英雄联盟S12小组赛第四日的比赛已经全部结束,LPL依旧是有三场比赛,但很可惜的是,这次我们再一次没能取得三场全胜。第一场JDG是战胜了G2战队,双方打得有来有回,不过最后还是JD学习笔记(281)丨不要动不动批评孩子,那会暴露你的缺失大家好,我是扈俊丽。一个陪妈妈们科学育儿的家庭教育创业者。除了原创文章,每天精选3篇学习笔记。学习笔记内容来自书籍公众号知乎微博付费社群群聊朋友圈等,不代表个人观点,也不清楚原始出要走的居然是乔丹普尔,总经理直言留下格林,勇士这番操作辣眼睛要走的居然是乔丹普尔,总经理直言留下格林,勇士这番操作辣眼睛文姜诗华格林拳打普尔事件,使得外界对于勇士的球队管理文化产生了普遍的质疑,对于格林的行为更是感到无比震惊。正当所有人都以王者七周年来袭,盘点那些火爆的周年庆皮肤2015年10月28日是王者荣耀不限号正式开启的日子。为了纪念这一日子,官方将每年的10月28号定为周年庆纪念日,并开启持续约1周的周年庆活动,其中最火爆的活动莫过于获取周年皮肤了蛋仔派对X红小豆联动回来啦!新地图过关秘籍分享蛋仔派对与红小豆的联动再次开启!红小豆这次带着它最好的朋友李建勋,再次造访蛋仔岛来看我们喽!现在在主城大电子屏下面的长椅上,就能看到它俩坐在上面,还不快来合影!蛋仔的技能效果也是能TES的s12摇摇欲坠,左手和阿水争相揽锅我们不能继续送了前导s12小组赛赛场进行过半,形式也逐渐明朗了没想到,被大家寄予厚望的C组爆冷。本以为TES能轻松出线,小组第一不在话下。谁知他们连续输给DRX和RGE战队,所谓最轻松的小组名不副做好这些事儿,与HPV说再见大部分女性一生中都可能感染过HPV病毒,只是依靠自身的免疫力通常在2年内会清除这些病毒,但凡事都有例外,少部分HPV病毒会长期附着在子宫颈位置,从而造成宫颈细胞病变,甚至最终导致宫俗语午睡一刻钟,浑身真轻松,上年纪的人,牢记4个不要中国老祖宗给我们这样一句警世良言午睡一刻钟,浑身真轻松。就是说,每天中午饭后,睡上个一刻钟左右的时间,下午人会感觉神清气爽,浑身轻松。可是也有人说午睡可能影响寿命和健康。这到底是咋这样梳头,疏通气血,健脑安神!每天只需10分钟,好处看得见头部分布着众多穴位,时不时的梳梳头能刺激多条经络和穴位,改善局部血液循环,帮助疏通经络。梳头是最为简单的养生方式之一,但应掌握正确的梳头方式,这样才能达到养生保健功效。坚持梳头有哪养成这3种健康习惯!身体更棒,疾病不来缠着你1。定期运动生命在于运动,经常锻炼可以增强体质提高免疫力。但是需要注意的是,不要过量运动,以免造成身体损伤。建议每周保持至少3次的适量有氧锻炼每次3060分钟为宜。运动员在补充水2
下调500元,苹果第二代HomePod并无新意IT之家1月20日消息,苹果近日推出了第二代HomePod,国行零售价为2299元。相比较初代HomePod的2799元,苹果下调了新款500元,并配备了更强大的S7芯片。不过国外国产手机春秋争霸之天语兴衰史前引春秋五霸有四种说法,但其中只有二霸齐国和晋国是公认的霸主。到了战国时期,其它五霸说法中的楚国和秦国又脱颖而出加入了战国七雄行列(还包括三晋齐和燕)。经过此番梳理,其它五霸说法中4个人做了5个月美国iOS霸榜时长第3的社交App,被Discord收了!震惊脸,Gas,又卖了。Gas创始人NikitaBier官宣Gas已被Discord收购图片来源Twitter今天,笔者浏览外网的时候一声XX(自动消音)吓坏了旁边的同事,因为3个小米失去在印度持续20个季度的出货量桂冠,三星首次登顶据印度经济时报1月19日报道,Canalys称,自2017年第三季度以来,三星在2022年10月至12月的第四季度首次占据第一,出货量为670万台,市场份额为21,而Vivo则以6普陀这家电商除夕夜外卖预订开启!众多品牌加入临近除夕,消费者除了可以选择知名老字号的年夜饭预制菜套餐礼盒,也可以上饿了么预定热腾腾的团圆饭在除夕当日配送。近日,饿了么开启年夜饭外卖预订,消费者可提前预定南京大牌档海底捞丰收日节气养生大寒全家一定这样做,健脾补肾,为身体攒够能量!今天是大寒,是冬季的最后一个节气了,此时处在三九四九时段,寒潮频繁,是一年中最寒冷的节气。此时饮食养生的基本原则是要顺应体内阳气的潜藏,以敛阳护阴为根本,不仅要符合闭藏的要求,还要大寒寒雪消处春意升来源光明日报云南丽江古城黑龙潭公园,梅花绽放。新华社发云南腾冲市马站乡响水沟山谷里,叶片上凝结了晶莹的冰。新华社发在重庆市南川区北坡景区拍摄的雪鸭。新华社发河南省焦作市温县,月季花明日大寒,建议大家多吃这5种防寒食物,能量满满不受寒明天就是腊月二十九,也是冬天的最后一个节气大寒了。,大寒期间寒冷到极点,比小寒的体感温度更低,很多地区还会有较为频繁的雨雪天气,因此,外出游玩或采购年货之时千万要注意安全和防寒保暖这一年最浪漫的事,就是与你看遍深圳的24节气从蛰虫萌动的春,到芙蕖亭亭的夏从层林尽染的秋,到寒风萧萧的冬节气流转间,一年又终结让我们一起回顾这一年相伴走过的24节气吧二十四张海报,我们陪你看遍深圳的一年四季,每一时令都值得细大寒喝3汤,郎中不用忙,明日大寒,3汤指的是啥?早懂早受益冬日生活打卡季大寒,二十四节气的最后一个节气,也是一年中最寒冷的时节,在日常生活中除了要注意保暖作息规律之外,还要在饮食上多补充营养和热量,推荐喝各种营养汤,营养易消化,热腾腾的汤中国人民政治协商会议第十二届安徽省委员会常务委员会工作报告(2023年1月12日)唐良智各位委员我代表中国人民政治协商会议第十二届安徽省委员会常务委员会,向大会报告工作,请予审议。一2022年和过去五年工作回顾2022年,省政协及其常务委