首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如果只能做整数Integer运算还能用BERT吗?

如果只能做整数Integer运算还能用BERT吗?

作者头像
AI部落联盟
发布于 2021-04-08 05:15:59
发布于 2021-04-08 05:15:59
1.6K0
举报
文章被收录于专栏:AI部落联盟AI部落联盟

想当年,其实估摸着也就大半年前,多多同学还在实验室瞪大眼睛盯着一种叫做xilinx系列的板子,调试着一种叫做VHDL的语言,还记得那个写代码的工具叫做Vivado,不知道大家听说过没有?那个时候,我想实现一个复杂的公式,涉及的计算稍微复杂点(比如来个开方)就要写一大串代码(虽然常用的复杂函数是有IP核可以调的),同时调试过程十分麻烦,甚至要具体到clock对齐。总而言之,十分难忘。那个时候业余时间写下一行Python代码解决一个问题,简直可以直呼“爽啊”。当然,硬件代码虽然难写,但毕竟计算速度、能耗比、并行优势一直很好,所以即便不好写,还是依旧使用广泛。

那么回到今天的主题,在这样只能进行整型数计算的设备上,我们的无敌的BERT如何部署上去呢?当多多看到这篇文章的时候,立刻就来分享给大家了。以下内容主要参考文章:I-BERT: Integer-only BERT Quantization。代码已开源,HuggingFace Git 仓库也有。

相关背景

  1. 最近两年,以BERT为代表的预训练模型大火,在自然语言处理/最近计算机视觉超越各种达到新SOTA,当然预训练模型虽然效果一个比一个好,参数大小也是越来越大。
  2. 想要把这些大模型高效(存储空间小,运算速度快)跑起来大致有这么几个办法: A. Pruning,去掉不太重要的参数; B. 知识蒸馏,找个小一点的模型仿大模型; C. 更快更好的计算框架设计; D. 结合计算硬件对模型进行针对性的优化设计; E. Quantization,量化,比如32bit浮点数变成16bit浮点数甚至8bit整型数。
  3. 目前已有很多压缩Transformer的研究,其中Quantization方面的也不少,但这些Quantization的方法大多不是完完全全的整型数量化(GELU、Softmax、LayerNorm部分都还是用浮点数计算的)。
  4. 新的Integer-only优秀硬件不断更新,比如ARM处理器。

I-BERT主要贡献

  1. 针对激活函数GELU,Softmax函数,I-BERT提出了一种高效并且正确的integer-only的估算方法,该方法为基于整型计算实现的轻量级二阶多项式。
  2. 针对Transformer里的LayerNorm,使用integer-only迭代算法对平方根进行估算。
  3. 基于GELU、Softmax、LayerNorm的估算,将Transformer进行了量化。 具体的Transformer量化为:用INT8乘法和INT32累加器处理Embedding和Matrix multiplication;然后基于INT32的累加结果计算GELU、Softmax和LayerNorm,然后再将INT32量化回INT8。整个计算图中的参数和激活函数计算都是用Intergers。图1展示了I-BERT和其他工作的区别。
  4. I-BERT在基于Roberta-base/large进行了实现,并在GLUE上取得了和全精度模型相近的效果; 和32位浮点计算相比,将I-BERT基于TensorRT部署到T4 GPU上,有4倍的加速效果。

图1 对比I-BERT和之前的工作

I-BERT实现

I-BERT全文都在传递一个思想,其实和我上一篇写的贝叶斯优化很相似:如果一个函数的计算解决不了,就找个近似函数,如果近似函数不好找,就限定自变量范围来找!

1

基本量化方法

这里简单介绍以基本的量化概念和方法,在uniform symmetric quantization框架下(对称、均匀的量化),一个实数x会被映射成一个整数q,q的范围是[-2^(b-1), 2^(b-1) -1],b为量化的bit数,正式定义为:

简单来讲为:

  1. 如果一个数x不在[-a,a]范围内则直接用x=a或者x=-a,如果在范围内则保持x。
  2. 得到x除以2^(b-1)-1得到的整数商作为量化结果。

把量化的结果转化为原始值也就是用q乘以上式中的分母,可以看到量化是损失的,一般来说,量化之后再反量化过程无法得到和原来一摸一样的数字。除了均匀量化,还有很多非均匀、不对称的量化方法,这里不再深入介绍。

1

Integer-Only的非线性函数GELU计算

我们先放出非线性GELU的表达式,然后思考下这么复杂的函数如何用整数计算进行近似估计,orz我感觉挺难的反正:

I-BERT是这么解决这个问题的?

由于整型计算可以计算2阶多项式,比如a(x+b)^2 + c。那么先用2阶多项式估计GELU函数,再用整型计算2阶多项式。为什么是2阶不是更高阶呢?因为阶数约高,估算函数也越复杂,作者发现2阶多项式足够估计GELU了。

2阶多项式估算GLUE又可以转化为优化如下目标函数,主要是对erf函数进行估计:找到一个2阶多项式,系数为a,b,c,能让GELU函数与2阶多项式误差最小。

erf函数有这么两个特点:对于输入很大的值而言,erf结果基本趋近于1或者-1,并且erf函数还是一个奇函数,因此只考虑优化正实数域的优化。在这两个特点下,作者找到一个相对较优的2阶多项式:

其中a=-0.2888,b=-1.769。sgn为符号函数。最终GELU的近视表达为:

整个GELU的估算和效果如图所示:

图2 GELU算法和效果

1

Integer-Only的softmax计算

个人觉得这几个估算十分精妙!

softmax函数的表达式是和特点:

然后可以发现x=x-x_max之后都会变成非正数,然后任何一个非正数可以表达为x=(-ln2)z + p,其中z是一个非负整数,p是一个在[-ln2,0]之间的实数,因此x的指数可以表示为:

>>是移位运算,在整型逻辑计算硬件中十分常见。最终将估计问题变化为简单的:估计[-ln2,0]之间的p的指数值。同样使用2阶多项式进行估计,最终得到:

到这里,整个integer-only的softmax计算逻辑如图所示:

图3 Softmax估计算法

1

Integer-Only的Layer Norm

Layer Norm在Transformer中大量使用,并且使用了非线性函数来计算方差和均值。

而且,注意LayerNorm的计算是在模型运行的是时候动态计算的,所以这些开方、平方运算也需要跟着一起算。不过这些平方、开方运算在整型运算里面还算常见,常见的方法就是迭代求解。如下图所示,便不再详细介绍啦:

图4 Layer Norm中的平方根估算方法

1

I-BERT的效果

虽然说I-BERT能完成用整型计算得到Transformer的结果了,但也不能损失太多的效果。总体上I-BERT的效果是不错的。如下图所示:

图5 GLUE任务上的效果

同时I-BERT在硬件上的运算速度也很好,相比于浮点数计算有2-4倍的加速。

图6 硬件运行加速对比

总结

本文对I-BERT进行了介绍,整体上I-BERT能完全基于整型计算进行,并且对于GELU、Softmax、LayerNorm的估算非常有借鉴意义。笔者能从这几个估算过程感受懂啊数学之美啊!!!!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI部落联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot整合websocket
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
用户3467126
2019/09/04
2.2K1
SpringBoot整合websocket
SprinBoot——SpringBoot项目WebSocket推送
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/106472.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/04
9860
WebSocket在Spring Boot中的使用
“WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。”
小诸葛
2020/04/14
5.1K0
WebSocket在Spring Boot中的使用
springboot整合篇-springboot整合websocket
ServerEndpoint的实现主要针对业务领域对websocket消息进行处理,主要使用@OnOpen对websocket连接建立时需要实现的逻辑,@OnClose对websocket连接关闭时需要实现的逻辑,@OnMessage对websocket收到消息时的处理以及@OnError对websocket发生错误时的处理方式。
Java开发者之家
2021/06/17
2.1K0
Spring Boot 整合使用Websocket
使用websocket有两种方式:1是使用sockjs,2是使用h5的标准。使用Html5标准自然更方便简单,所以记录的是配合h5的使用方法。
BUG弄潮儿
2020/06/12
1.1K0
WebSocket & ws协议
解决了常规AJAX轮询、传统长连接的性能损失。因为传统的方式是 连接打开、连接关闭型性能损失很大。Websocker实现的方式是在单位时间内,不会频繁的连接打开与关闭。我们真正解决还是需要依赖Tomcat或者Netty开发!
收心
2022/01/19
1.3K0
SpringBoot集成WebSocket(原生注解方式)
WebSockets 它可以在用户的浏览器和服务器之间打开交互式通信会话。使用此API,可以向服务器发送消息并接收事件驱动的响应,而无需通过轮询服务器的方式以获得响应。 WebSocket 对象提供了用于创建和管理 WebSocket 连接,以及可以通过该连接发送和接收数据的API。 1.添加依赖 <!-- websocket--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot
甄士隐
2022/01/26
1.7K0
SpringBoot集成WebSocket(原生注解方式)
Spring Boot集成websocket
像目前的直播、弹幕、小游戏等方面都用到了websocet进行长链接,相对于http的一次请求一次响应websocket只需要进行一次握手即长久性的建立链接进行消息互通。
余生大大
2022/11/02
1.9K0
Spring Boot集成websocket
WebSocket JAVA
源码:https://github.com/jxq0816/WebSocket websocket 要求jdk 1.8 一、pom.xml <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency> 二、WebSocketTest
week
2018/08/24
1.2K0
Java 与 JavaScript 对websocket的使用
ebsocket,HTML5中新一代全双工通信协议。其底层仍然是http协议。 传统 HTTP 请求响应客户端服务器交互图 WebSocket 请求响应客户端服务器交互图 WebSocket 客户端支
庞小明
2018/03/07
2.1K0
Java 与 JavaScript 对websocket的使用
WebSocket | 为什么你前后端推送不会用?因为你少了WebSocket的帮忙
WebSocket是一种基于TCP的网络协议,实现了客户端和服务端的全双工通信,即,后端可以推送数据到客户端,客户端可以推送数据到后端。其模型如下所示:
netkiller old
2021/01/11
8620
WebSocket | 为什么你前后端推送不会用?因为你少了WebSocket的帮忙
SpringBoot集成WebSocket,实现后台向前端推送信息
在一次项目开发中,使用到了Netty网络应用框架,以及MQTT进行消息数据的收发,这其中需要后台来将获取到的消息主动推送给前端,于是就使用到了MQTT,特此记录一下。
JAVA葵花宝典
2021/01/03
1.1K0
SpringBoot集成WebSocket,实现后台向前端推送信息
Java后端WebSocket的Tomcat实现
文章摘要随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据。 我们知道,传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如浏览器)主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据;这种客户端是主动方,服务端是被动方的传统Web模式对于信息变化不频繁的Web应用来说造成
庞小明
2018/03/07
2.9K1
SpringBoot+webSocket实现扫码登录功能
好了!分析完了这些。你们一定在想。。还有完没完啊。。不要在BB了。。赶紧贴代码吧。。
好好学java
2021/07/05
1.3K0
分享基于 websocket 网页端聊天室
有一个月没有写博客了,也是因为年前需求多、回家过春节的原因,现在返回北京的第二天,想想,应该也要分享技术专题的博客了!!
Krry
2019/02/18
1.7K0
Spring Boot 集成 WebSocket,轻松实现信息推送!
在一次项目开发中,使用到了Netty 网络应用框架,以及 MQTT 进行消息数据的收发,这其中需要后台来将获取到的消息主动推送给前端,于是就使用到了MQTT,特此记录一下。
Java技术栈
2021/04/21
1.2K0
扫码登录的实现方案
开发工具:MacOS、IDEA 技术栈:JDK1.8、SpringBoot、Thymeleaf、websocket、ZXing、jjwt
每天学Java
2020/06/02
2K0
SpringBoot集成WebSocket的基本实现
此时我们第一反应,前端定时使用HTTP协议调用后端接口,刷新界面。OK,需求实现,下班回家!
用户10714507
2023/10/08
1.1K0
WebSocket的初次使用及调试
4.0.0 WeeeebSkt WeeeebSkt 0.0.1-SNAPSHOT war
ZONGLYN
2019/08/08
2.1K0
springboot整合websocket
我们都知道HTPP协议是基于请求响应模式,并且无状态的。HTTP通信只能由客户端发起,HTTP 协议做不到服务器主动向客户端推送信息。
全栈程序员站长
2022/09/19
1K0
springboot整合websocket
相关推荐
SpringBoot整合websocket
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档