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

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 分布。

14亿美元砸向世界杯,中国广告包围赛场,存在感刷起来了吗11月21日零点,卡塔尔世界杯首场比赛卡塔尔vs厄瓜多尔开踢,绿茵场周围LED广告屏出现了万达海信蒙牛vivo雅迪和BOSS直聘等中国企业的身影。世界杯作为全球足球赛事,吸引着各国展动力参展2022高交会共襄盛举,助力科技行业人才与智力交流11月1519日,第二十四届中国国际高新技术成果交流会(简称高交会)在广东省深圳市盛大举办。本届高交会以科技改革驱动创新,科技创新驱动发展为主题,采取一展两馆多地模式,对外展示新一中国成为电动汽车最有活力市场孙正义个人欠软银集团近50亿美元上周要闻摘要巴菲特再次押注科技股建仓台积电。孙正义个人欠软银集团近50亿美元。贝索斯计划捐出自己绝大部分财富。亚马逊的裁员行动将延续到明年。推特合同工中有4400人已被解雇。腾讯分加密货币市值跌至8000亿美元以下由于几乎所有数字资产再次深陷红色,加密货币市值跌至8000亿美元以下。在原地站了几天之后,比特币急转直下,跌至一周低位16000美元以下。替代代币的情况也好不到哪里去,ETH十天来为什么说普尔难以撼动克莱的主力位置,勇士若服软等于自毁长城虽然生涯前三个赛季一年一个台阶,但普尔的天赋上限无法撑起勇士后库里时代的核心位置,他可以是不错的副攻,但绝不是库里那样的核心。勇士为栽培他让克莱做替补不值得。从上赛季总决赛可以看出实现智能网联与自动驾驶,汽车为何要云上生长文丨壹观察宿艺汽车数智化变革初期,有三个判断很快达成共识软件定义汽车,自动驾驶,以及新数据引擎。即使从第一辆特斯拉汽车下线算起,汽车数智化革新也已历经14年,甚至可以说与智能手机变重庆资本玩家的不归路前有恒大集团的许家印负债20000亿陷入困境,后有隆鑫老板涂建华负债430个亿。这些老板们都是在自己的主业,做到了顶端,行业遇到了困境,为了寻求突破,他们都转型做房地产。房地产的利我们应该买新能源汽车还是燃油车呢?上次在我的文章里聊到,新能源汽车的在汽车销售中的占比每年都在极速的增加,从2020年的5增加到2021年的14。新车销售的渗透率前十的城市甚至都超过了百20,深圳和上海甚至达到了4桥水基金创始人瑞达利欧美联储加息负面效应外溢新华社日内瓦11月20日电(记者陈俊侠徐驰)全球最大对冲基金桥水基金创始人瑞达利欧日前接受新华社记者书面专访时表示,美联储激进加息负面效应外溢,造成欧洲面临两难经济抉择,一些发展中世界杯怎能缺少好装备?荣耀小米一加3款神器,大屏看球更爽世界杯已经正式开幕,想必有不少球迷昨晚熬夜看完了卡塔尔东道主和厄瓜多尔的开场一战了吧,02的结局估计让很多球迷都始料不及,不过从场上的实力表现来看,这成绩也没啥好说了!看到有一些球北京最新人力资源市场薪酬大数据报告货币金融服务薪酬排名第一近日,北京市人力资源和社会保障局发布2022年北京市人力资源市场薪酬大数据报告(以下简称报告)。报告显示,2021年北京市各行业薪酬水平较2020年整体呈上涨态势。从薪酬中位值看,
婴幼儿每天醒来都在想什么呢?这是哪儿?人呢?去哪了?喂喂喂,人呢,在哪呢?没看见我醒了嘛,看我都没哭,多乖啊,也不过来夸奖一下我,快出现,还不出现,再不出现我就叫了,我数到三,啊!啊啊!啊啊啊!啊啊啊!啊啊啊母乳喂养后乳房下垂可以预防吗?一般在哺乳停止后,因为激素水平的减低,乳腺泡管腺体和脂肪组织都会发生萎缩,而皮肤及支撑组织却相应较多,就会造成乳房下垂。想要预防或改善母乳喂养导致的乳房下垂,第一,一定要戴尺寸合适新能源车变成充电宝供电赚钱?虚拟电厂盈利模式交易链条待厘清你愿意将自己的新能源车变成共享充电宝,为别人供电赚钱吗?如今,虚拟电厂或许可以实现这个想法。储能需求暴增,10月5日晚间,乘联会秘书长崔东树刊文披露数据显示,随着世界能源危机出现,普通人获取快乐的25种实用方式前段时间我们向大家征集了关于我从哪里获得快乐的话题,收到了大家的热烈回复!在阅读大家获得快乐的方式时,我也才意识到,原来生活中有这么多可以获得快乐方式,而我曾经都忽略了。让我们一起ALTF4开发商新作SOWONSteam页面上线10月28日发售今日(10月8日),ALTF4开发商PUMPKIM新作SOWONSteam页面上线,游戏暂不支持中文,预计于10月28日发售,感兴趣的玩家可以进入商店页面。宣传片优酷视频云游戏介绍版本陷阱打野典韦,以前叫砍王,现在是砍弟了王者荣耀典韦打野已经越来越不行了,已经不是那个能和铠爹并列的砍王,现在典韦已经是砍弟了,成为了一个版本陷阱打野。砍王时代落幕岱宗皮肤之后典韦就一直在下坡路上,缺陷大家都明白,典韦这文班亚马,真值得半个联盟都为他摆烂吗?在这个国庆假期过后,世界上还没听过维克托文班亚马名字的篮球迷应该已经不多了。在两场对点燃队的比赛里,18岁的法国青年文班亚马一共得到了73分,三分球18投9中,走上了28次罚球线,广东男篮一切顺利,将包机前往赛区,杜锋晚归几天,大外援已就位头条创作挑战赛新赛季的CBA联赛即将开始,但广东男篮由于出现了突发情况,目前还没有前往赛区。在广东男篮被隔离后,如果广东男篮如果无法正常参加比赛的话,CBA公司会如何处理也成为了球单机版传奇架设服务端制作详细说明做传奇服务端一首先说明一下我们要做为例子使用的工具和服务端传奇私服1。76服务端真正的仿官方1。85版最新封号系统每周7天的活动系统独创的行会升级系统最新的反外挂平台二传奇服务端七重庆垫江县房展会期间买房,多子女家庭公积金贷款额最高120万元10月5日,澎湃新闻获悉,重庆市垫江县于10月1日至11月30日举办2022年秋季房地产暨家装展示交易会。据垫江县融媒体中心消息,活动期间,在垫江县内各房地产开发企业完成房屋交易的练塘古镇上海古镇的别样存在练塘古镇,位于青浦,其周边亦是比她名气要大很多的古镇,南邻金山的枫泾,北接青浦的朱家角,这里没有传统旅游古镇的各式商业繁荣,没有小吃,没有奶茶,只有市河两岸古朴的宁静,是真的古朴。养发小知识防脱篇最近秋天到了,头发掉发量会增加,咨询我防脱的顾客很多,今天我给大家分享一点养发的小知识,希望对大家有用。一头发是怎么长的头发的主要成分是蛋白质。头发长在毛囊里,每个毛囊下面连接着3秋天适合搭配短靴,要选择高跟款式,无论是粗跟还是细跟都很好看转眼间到了秋天,天气也有点冷了,不少人都多穿了一些,这个时节搭配短靴的人不少,有些时尚美女会选择高跟款式,无论是粗跟还是细跟,都会很好衬托身材,也搭配出精致的感觉这位美女选择黑色尖Vogue活动女星各出奇招今天是Vogue130周年展,群星荟萃自然是免不了争妍斗艳。虽然没有公开红毯,路透已经引起网友一片热烈讨论。张小斐绝了高挂热搜,一袭黑色丝绒深V高开叉礼服,配上浓浓的眼妆,顿时气场RICHARDMILLE发布RM88SMiley自动上链陀飞轮腕表,欧米茄发布超霸火星腕表SpeedmasterX33Marstimer当周腕表记者罗以文编辑楼婍沁RICHARDMILLE发布RM88SMiley自动上链陀飞轮腕表历时3年研发,RM88SMiley自动上链陀飞轮腕表就此问世。这款腕表灵感来自于洋溢着欢乐的S孙怡穿薄纱裙参加活动!开叉太高露一截安全裤,全程用手压住走路近日,有网友偶遇了参加活动的孙怡,当天孙怡穿着性感玫红色抹胸薄纱裙,整个人看起来宛如仙子一般,走在人群中回头率百分百。孙怡的造型属实是性感,除了抹胸的设计之外,下摆开叉也超级高再加瑛姑罗海琼胖到不敢认,妆容油腻肚子明显,嫁入豪门放飞自我今天穿什么虽然女性到了中年不可避免会发福,但是自律的女性会保持匀称的线条并且维持紧致感,避免整个人看起来臃肿油腻,导致穿搭也变得低级。曾经的瑛姑美成观众的白月光,而饰演者罗海琼却胖年龄越大却变得越惊艳,容祖儿的颜值进化路,普通女人也能学随着年龄的增长,很多女人都会发生容貌和身材上的变化,有人的皱纹会爬满脸庞身材逐渐发福走样,而有的女人年龄越大却越惊艳,不仅五官神态改变了不少,甚至身姿体态也越来越优美,就比如我们都今日寒露田铺棋局露鸦下,山展画屏烟雨描。(宋)吴龙翰秋深过田家节选时光入深秋,岁月便深情露因渐渐的凉而凝结随秋风滴落和落叶一起,滋养大地露它藏着秋天的万象层林尽染,木叶纷纷天清气朗,大雁高定期体检呵护健康园外园君悦园心怡园宝贝们的健康体检日记健康体检是监测儿童生长发育疾病防治促进提高儿童健康水平的一个重要措施。近日,园外园君悦园和心怡园邀请专业的医护人员对全园幼儿进行了身高体重视力龋齿血色素等方面的常规健康检查,基本涵谷爱凌有望嫁入豪门?LV秀场两位富豪少爷伴左右,1800亿身家惊了在今年的冬奥会中,北京赛场上最瞩目,给大家留下深刻印象的,就是谷爱凌了。谷爱凌作为滑雪界的天才少女。在本次北京冬奥会上表现出众,大家都非常的关注她,她展现出了非凡的实力,表现得非常哈登前女友近照,38岁疑似怀孕!NBA光头花魁,身材堪比卡戴珊当地时间10月8日,美国媒体拍到哈登的前女友艾波罗斯(AmberRose)洛杉矶出街,她独自登上豪车,戴着黑色鸭舌帽,但依然可以看到她的标志性板寸光头,值得一提的是,艾波罗斯步态慵