当前位置: 首页 > news >正文

优质做网站阳江北京网站建设

优质做网站,阳江北京网站建设,江西鄱阳专业做网站,泰州建设信息网站本文将会介绍BERT模型训练后动态量化#xff08;Post Training Dynamic Quantization#xff0c;PTDQ#xff09;。 量化 在深度学习中#xff0c;量化#xff08;Quantization#xff09;指的是使用更少的bit来存储原本以浮点数存储的tensor#xff0c;以及使用更少的…  本文将会介绍BERT模型训练后动态量化Post Training Dynamic QuantizationPTDQ。 量化 在深度学习中量化Quantization指的是使用更少的bit来存储原本以浮点数存储的tensor以及使用更少的bit来完成原本以浮点数完成的计算。这么做的好处主要有如下几点 更少的模型体积接近4倍的减少可以更快地计算由于更少的内存访问和更快的int8计算可以快2~4倍 PyTorch中的模型参数默认以FP32精度储存。对于量化后的模型其部分或者全部的tensor操作会使用int类型来计算而不是使用量化之前的float类型。当然量化还需要底层硬件支持x86 CPU(支持AVX2)、ARM CPU、Google TPU、Nvidia Volta/Turing/Ampere、Qualcomm DSP这些主流硬件都对量化提供了支持。 PTDQ PyTorch对量化的支持目前有如下三种方式 Post Training Dynamic Quantization模型训练完毕后的动态量化Post Training Static Quantization模型训练完毕后的静态量化QAT (Quantization Aware Training)模型训练中开启量化 本文仅介绍Post Training Dynamic QuantizationPTDQ。   对训练后的模型权重执行动态量化将浮点模型转换为动态量化模型仅对模型权重进行量化偏置不会量化。默认情况下仅对Linear和RNN变体量化 (因为这些layer的参数量很大收益更高)。 torch.quantization.quantize_dynamic(model, qconfig_specNone, dtypetorch.qint8, mappingNone, inplaceFalse) 参数解释 model模型默认为FP32qconfig_spec 集合比如 qconfig_spec{nn.LSTM, nn.Linear} 。列出要量化的神经网络模块。字典 qconfig_spec {nn.Linear: default_dynamic_qconfig, nn.LSTM: default_dynamic_qconfig} dtype float16 或 qint8mapping就地执行模型转换原始模块发生变异inplace将子模块的类型映射到需要替换子模块的相应动态量化版本的类型 例子 # -*- coding: utf-8 -*- # 动态量化模型只量化权重 import torch from torch import nnclass DemoModel(torch.nn.Module):def __init__(self):super(DemoModel, self).__init__()self.conv nn.Conv2d(in_channels1, out_channels1, kernel_size1)self.relu nn.ReLU()self.fc torch.nn.Linear(2, 2)def forward(self, x):x self.conv(x)x self.relu(x)x self.fc(x)return xif __name__ __main__:model_fp32 DemoModel()# 创建一个量化的模型实例model_int8 torch.quantization.quantize_dynamic(modelmodel_fp32, # 原始模型qconfig_spec{torch.nn.Linear}, # 要动态量化的算子dtypetorch.qint8) # 将权重量化为qint8print(model_fp32)print(model_int8)# 运行模型input_fp32 torch.randn(1, 1, 2, 2)output_fp32 model_fp32(input_fp32)print(output_fp32)output_int8 model_int8(input_fp32)print(output_int8) 输出结果如下 DemoModel((conv): Conv2d(1, 1, kernel_size(1, 1), stride(1, 1))(relu): ReLU()(fc): Linear(in_features2, out_features2, biasTrue) ) DemoModel((conv): Conv2d(1, 1, kernel_size(1, 1), stride(1, 1))(relu): ReLU()(fc): DynamicQuantizedLinear(in_features2, out_features2, dtypetorch.qint8, qschemetorch.per_tensor_affine) ) tensor([[[[0.3120, 0.3042],[0.3120, 0.3042]]]], grad_fnAddBackward0) tensor([[[[0.3120, 0.3042],[0.3120, 0.3042]]]])模型量化策略 当前由于量化算子的覆盖有限因此对于不同的深度学习模型其量化策略不同见下表 模型量化策略原因LSTM/RNNDynamic Quantization模型吞吐量由权重的计算/内存带宽决定BERT/TransformerDynamic Quantization模型吞吐量由权重的计算/内存带宽决定CNNStatic Quantization模型吞吐量由激活函数的内存带宽决定CNNQuantization Aware Training模型准确率不能由Static Quantization获取的情况 下面对BERT模型进行训练后动态量化分析模型在量化前后推理效果和推理性能的变化。 实验 我们使用的训练后的模型为中文文本分类模型其训练过程可以参考文章NLP六十六使用HuggingFace中的Trainer进行BERT模型微调 。    训练后的BERT模型动态量化实验的设置如下 base model: bert-base-chineseCPU info: x86-64, Intel® Core™ i5-10210U CPU 1.60GHzbatch size: 1thread: 1 具体的实验过程如下 加载模型及tokenizer import torch from transformers import AutoModelForSequenceClassificationMAX_LENGTH 128 device torch.device(cuda:0 if torch.cuda.is_available() else cpu) checkpoint f./sougou_test_trainer_{MAX_LENGTH}/checkpoint-96 model AutoModelForSequenceClassification.from_pretrained(checkpoint).to(device) from transformers import AutoTokenizer, DataCollatorWithPaddingtokenizer AutoTokenizer.from_pretrained(checkpoint)测试数据集 import pandas as pdtest_df pd.read_csv(./data/sougou/test.csv)test_df.head()textlabel0届数比赛时间比赛地点参加国家和地区冠军亚军决赛成绩第一届1956-1957英国11美国丹麦6...01商品属性材质软橡胶带加浮雕工艺合金彩色队徽吊牌规格162mm数量这一系列产品不限量发行图案...02今天下午沈阳金德和长春亚泰队将在五里河相遇。在这两支球队中沈阳籍球员居多因此这场比赛实际...03本报讯中国足协准备好了与特鲁西埃谈判的合同文本也在北京给他预订好了房间但特鲁西埃爽约了...04网友点击发表评论祝贺中国队夺得五连冠搜狐体育讯北京时间5月6日2006年尤伯杯羽毛球赛在日...0 量化前模型的推理时间及评估指标 import numpy as np import times_time time.time() true_labels, pred_labels [], [] for i, row in test_df.iterrows():row_s_time time.time()true_labels.append(row[label])encoded_text tokenizer(row[text], max_lengthMAX_LENGTH, truncationTrue, paddingTrue, return_tensorspt).to(device)# print(encoded_text)logits model(**encoded_text)label_id np.argmax(logits[0].detach().cpu().numpy(), axis1)[0]pred_labels.append(label_id)print(i, (time.time() - row_s_time)*1000, label_id)print(avg time: , (time.time() - s_time) * 1000 / test_df.shape[0])0 229.3872833251953 0 100 362.0314598083496 1 200 311.16747856140137 2 300 324.13792610168457 3 400 406.9099426269531 4 avg time: 352.44047810332944from sklearn.metrics import classification_reportprint(classification_report(true_labels, pred_labels, digits4))precision recall f1-score support0 0.9900 1.0000 0.9950 991 0.9691 0.9495 0.9592 992 0.9900 1.0000 0.9950 993 0.9320 0.9697 0.9505 994 0.9895 0.9495 0.9691 99accuracy 0.9737 495macro avg 0.9741 0.9737 0.9737 495 weighted avg 0.9741 0.9737 0.9737 495设置量化后端 # 模型量化 cpu_device torch.device(cpu)torch.backends.quantized.supported_engines[none, onednn, x86, fbgemm]torch.backends.quantized.engine x86量化后模型的推理时间及评估指标 # 8-bit 量化 quantized_model torch.quantization.quantize_dynamic(model, {torch.nn.Linear}, dtypetorch.qint8 ).to(cpu_device)q_s_time time.time() q_true_labels, q_pred_labels [], [] for i, row in test_df.iterrows():row_s_time time.time()q_true_labels.append(row[label])encoded_text tokenizer(row[text], max_lengthMAX_LENGTH, truncationTrue, paddingTrue, return_tensorspt).to(cpu_device)logits quantized_model(**encoded_text)label_id np.argmax(logits[0].detach().numpy(), axis1)[0]q_pred_labels.append(label_id)print(i, (time.time() - row_s_time) * 1000, label_id)print(avg time: , (time.time() - q_s_time) * 1000 / test_df.shape[0])0 195.47462463378906 0 100 247.33805656433105 1 200 219.41304206848145 2 300 206.44831657409668 3 400 187.4992847442627 4 avg time: 217.63229466447928from sklearn.metrics import classification_reportprint(classification_report(q_true_labels, q_pred_labels, digits4))precision recall f1-score support0 0.9900 1.0000 0.9950 991 0.9688 0.9394 0.9538 992 0.9900 1.0000 0.9950 993 0.9320 0.9697 0.9505 994 0.9896 0.9596 0.9744 99accuracy 0.9737 495macro avg 0.9741 0.9737 0.9737 495 weighted avg 0.9741 0.9737 0.9737 495量化前后模型大小对比 import osdef print_size_of_model(model):torch.save(model.state_dict(), temp.p)print(Size (MB): , os.path.getsize(temp.p)/1e6)os.remove(temp.p)print_size_of_model(model) print_size_of_model(quantized_model)Size (MB): 409.155273 Size (MB): 152.627621量化后端Quantization backend取决于CPU架构不同计算机的CPU架构不同因此默认的动态量化不一定在所有的CPU上都能生效需根据自己计算机的CPU架构设置好对应的量化后端。另外不同的量化后端也有些许差异。Linux服务器使用uname -a可查看CPU信息。   重复上述实验过程以模型的最大输入长度为变量取值为128,256,384每种情况各做3次实验结果如下 实验最大长度量化前平均推理时间(ms)量化前weighted F1值量化前平均推理时间(ms)量化前weighted F1值实验138410660.97976860.9838实验23841047.60.9899738.10.9879实验33841020.90.9817714.00.9838实验1256668.70.9717431.40.9718实验2256675.10.9717449.90.9718实验3256656.00.9717446.50.9718实验1128335.80.9737200.50.9737实验2128336.50.9737227.20.9737实验3128352.40.9737217.60.9737 综上所述对于训练后的BERT模型文本分类模型进行动态量化其结论如下 模型推理效果量化前后基本相同量化后略有下降模型推理时间量化后平均提速约1.52倍 总结 本文介绍了量化基本概念PyTorch模型量化方式以及对BERT模型训练后进行动态量化后在推理效果和推理性能上的实验。   本文项目已开源至Github项目https://github.com/percent4/dynamic_quantization_on_bert 。   本人已开通个人博客网站网址为https://percent4.github.io/ 欢迎大家访问~
http://www.hkea.cn/news/14309277/

相关文章:

  • 济南营销型网站大庆做网站
  • 佛山顺德容桂做网站的公司手机端开发网站模板下载
  • 做网站的像素是多少钱无代码制作网页
  • 一般网站字体大小用二级域名做网站
  • 合肥电信网站备案重庆seo排名扣费
  • 在线免费网站排名优化网页模板下载完整版
  • 个人网站备案入口南京百度快照优化排名
  • 怎么用dw设计网站页面wordpress 下载弹窗插件
  • 怎么给网站做缓存wordpress快应用
  • 建设卡开通网银网站wordpress营销
  • 清华紫光网站建设网站开发项目心得
  • 响应网站建设wordpress投票插件
  • 网站建设内部链接网站seo优化教程
  • 广州新公司网站建设建筑公司网站怎么设计
  • ppt如何做链接打开一个网站优质院校建设网站
  • 上海网站建设公司兴田德润放心如何做网站首页收录
  • 用dede做的网站首页游戏开服表网站开发
  • 那个软件可以做三个视频网站网站 创意 方案
  • 盱眙县住房和城乡建设局网站南通高端网站设计
  • 在线查询网站开发语言中英文外贸网站模板
  • 哪些网站可以做养殖的广告佛山外贸建站
  • wordpress4性能防疫优化措施
  • 设立网站百度文库登录入口
  • 做网站什么需要好网站建设十年杜绝模板
  • 做兼职女的网站做外贸推广哪个网站好
  • 专业网站制作设新手做网站视频
  • 网站建设利润 有多少wordpress用户功能扩展
  • 色系网站.上海单位建设报建网站
  • 网站设计课程总结贵阳金阳网站建设公司
  • 国外极简网站东莞设计企业网站的有哪些