2023年的深度学习入门指南(17) - 深度学习的硬件加速技术

news2024/12/29 8:39:03

2023年的深度学习入门指南(17) - 深度学习的硬件加速技术

有了前面的知识之后,想必大家对于算力需求的理解已经越来越深刻了。

除了使用CPU,GPU这样的通用器件之外,采用专用的硬件来进行加速是一个大家都能想到的选择。

其中的代表器件就是我们上一节刚刚用到的TPU。下图是TPU的样子及其结构图:

那么,TPU为什么设计成以矩阵乘法为核心呢?我们先从深度学习的原理开始了解一下。

神经网络和注意力的计算方法

人工神经网络的基本计算单元是神经元。每个神经元的结构如下图所示:

用公式来表示就是:

y j = Φ ( ∑ k = 0 n − 1 x k w k j + b ) y_j=\Phi\left(\sum_{k=0}^{n-1} x_k w_{k j}+b\right) yj=Φ(k=0n1xkwkj+b)

其中, x k x_k xk是输入, w k j w_{k j} wkj是权重, b b b是偏置, Φ \Phi Φ是激活函数, y j y_j yj是输出。
我们可以看到,每个神经元的计算都是一个矩阵乘法加上一个偏置,再经过一个激活函数。

我们再复习一下之前讲多头自注意力模型的结构图:

我们可以看到,主要的计算仍然是矩阵乘法和加法。

Q u e r y : Q i = X ∗ W i Q Query: Q_i = X * W_i^{Q} Query:Qi=XWiQ

K e y : K i = X ∗ W i K Key: K_i = X * W_i^{K} Key:Ki=XWiK

V a l u e : V i = X ∗ W i V Value: V_i = X * W_i^{V} Value:Vi=XWiV

注意力权重 : A i = s o f t m a x ( Q i ∗ K i T / s q r t ( d k ) ) 注意力权重: A_i = softmax(Q_i * K_i^T / sqrt(d_k)) 注意力权重:Ai=softmax(QiKiT/sqrt(dk))

输出 : O i = A i ∗ V i 输出: O_i = A_i * V_i 输出:Oi=AiVi

有了上面的基础,我们来看一下TPU的结构图:

可以看到右上角占四分之一空间的矩阵乘法单元,与左上部的本地缓存,构成了TPU的最主要部分。

上图中的MAC是Multiply-and-accumulate的缩写,表示乘法加上累加运算。也就是说在最初的TPU上,每个指令周期可以进行64K次乘法和加法运算。

硬件近似方法

矩阵乘法是一个非常耗时的运算,而且在深度学习中,我们并不需要非常精确的结果。因此,我们可以采用一些近似的方法来加速矩阵乘法的运算。

与我们之前学习的量化和剪枝的方法类似,在硬件方法上我们也可以使用量化和计算简化的方法。除此之外,在硬件设计上我们还可以采用近似计算单元来代替精确计的计算器件。

近似计算单元主要有三种方式,首先是采用近似的加法乘法器,其次是通过使用对数的方式将乘法转化为加法运算,最后是干脆去掉乘法器。

前面我们对量化已经有比较详细的介绍了,这里就不再赘述了。我们重要介绍下后面两种方法,也就是计算简化和近似计算单元。

计算简化 - 跳过

计算简化的第一种方法就是跳过不算。

在大模型中,由于数据量很大,其实有很多数据是0,或者是非常接近0的。这些数据对于最终的结果影响非常小,因此我们可以直接跳过这些数据的计算。

我们就可以设计下面这样跳过接近0的数据的计算单元:

计算简化 - 记忆

计算简化的第二种方法就是记忆,也就是说我们可以将之前的计算结果保存下来,下次再用到的时候直接使用。这不就是动态规划的思想吗?这种方法的效率取决于输入的相似性(即替换发生的频率)以及被消除的计算的复杂度。

输入的相似性越高,被消除的计算的复杂度越高,这种方法的效率就越高。

比如,论文《(Pen-) Ultimate DNN Pruning》提出了一种两步的修剪方法,首先通过对每层的输出进行PCA分析来移除冗余节点,然后通过考虑其相对于给定神经元的其他连接的贡献来移除剩余的不重要连接。

近似计算单元 - 近似乘法加法器

在近似电路的实现中,一个比较有效的方法是笛卡尔遗传编程GCP方法。最基本的实现如下所示:

Cartesian Genetic Programming (CGP) 是一种遗传编程的形式,它使用图形表示法来编码计算机程序。它起源于Julian F. Miller和Peter Thomson在1997年开发的一种演化数字电路的方法,它被称为“笛卡尔”因为它使用二维网格的节点来表示一个程序​

遗传编程是一种启发式搜索技术,用于优化或发现可以执行用户定义任务的计算机程序。基本的遗传编程系统使用遗传算法,这是一种根据生物进化的原理(包括遗传、变异、自然选择和重组)运行的搜索算法。

在笛卡尔遗传编程中,程序是由图表表示的,图表由节点组成,每个节点代表一个函数或操作。这些节点在二维网格中排列,形成一种计算流,这是计算从输入节点流向输出节点的路径。通过这种方式,CGP能够演变出能够完成特定任务的复杂程序。

笛卡尔遗传编程生成的乘法器满足给定的最坏情况误差约束,并确保对0的乘法始终准确无误。它采用迭代优化过程来确定CGP优化中的近似乘法器生成的误差约束,以满足推断准确性损失的阈值。并且,在迭代过程中,将准确的乘法器替换为近似乘法器后,对网络进行重新训练以获得最佳质量结果。

以应用GCP的基础论文《Design of power-efficient approximate multipliers for approximate artificial neural networks.》为始,后面有一系列的改进,比如使用weighted mean error distance (WMED)来进行误差度量。计算WMED时,每个误差的重要性由网络权重分布的概率质量函数确定。

论文《Neural Networks with Few Multiplications》提出了一种两步的方法:首先,作者通过随机二值化权重,将计算隐藏状态所需的乘法操作转化为符号更改。其次,在反向传播误差导数的过程中,除了二值化权重,作者还对每一层的表示进行量化,将剩余的乘法操作转换为二进制位移。
另外,再使用了三值连接(Ternary Connect)、量化反向传播(Quantized Backprop)和批量归一化(Batch Normalization)后,误差率可以降至1.15%,这比全精度训练的误差率1.33%要低。这表明,即使去除了大部分乘法,这种方法的性能仍然可以与全精度训练相媲美,甚至略有提高。性能的提高可能是由于随机采样所带来的正则化效应。

论文《ALWANN:Automatic layer-wise approximation of deep neural network accelerators without retraining》提出的方法包括两个部分:第一部分是将一个完全训练好的DNN转换为在卷积层中使用8位权重和8位乘法器的操作;第二部分是从一个近似乘法器的库中为每个计算单元选择一个合适的近似乘法器,使得(i)一个近似乘法器可以服务于多个层,(ii)整体的分类误差和能耗最小化。

下图是寒武纪的DaDianNao芯片计算近似乘法的架构图。

论文《Design automation of approximate circuits with runtime reconfigurable accuracy》提出了一种自动的设计框架,可以生成具有运行时可重配置精度的近似电路。论文的方法包括两个部分:第一部分是使用遗传算法对给定的电路进行门级近似,从而在不影响功能正确性的前提下,减少电路的开销;第二部分是在近似电路中添加可重配置单元,使得电路可以在运行时根据应用需求和环境条件,切换不同的精度级别。

近似计算单元 - 无乘法器设计

看过了专用硬件TPU,DaDianNao,我们来看一种新的器件FPGA。

论文《AddNet: Deep Neural Networks Using FPGA-Optimized Multipliers》
提出了一种使用FPGA优化的乘法器来实现深度神经网络的方法,称为AddNet。该方法利用了可重配置的常数系数乘法器(RCCM),它们可以用加法器、减法器、位移和多路复用器(MUX)来实现乘法运算,从而在FPGA上进行高度优化。作者设计了一系列适合FPGA逻辑元件的RCCM,以保证它们的高效利用。为了减少量化造成的信息损失,作者还开发了一种新颖的训练技术,将RCCM的可能系数表示映射到神经网络权重参数分布上。这使得在硬件上使用RCCM时,仍能保持高精度。

类似地,论文《Energyefficient neural computing with approximate multipliers》这篇文章的主要观点是提出了一种使用近似乘法器来实现能量高效的神经计算的方法。该方法利用了神经网络应用的错误恢复能力,使用计算共享的概念来实现低精度的乘法运算,从而节省硅面积或提高吞吐量。作者设计了一种近似乘法器,它使用加法器、减法器、位移和多路复用器(MUX)来实现乘法运算,从而在FPGA上进行高度优化。通过用简化的移位和加法操作替换乘法器,并由一个单元控制,使用无乘法器的神经元。所谓的字母集乘法器(ASMs)由预计算器库组成,根据一些称为字母表({1, 2, 3, 5, . . .})的小位序列,一个加法器,以及一个或多个选择、移位和控制逻辑单元来计算输入的低阶倍数。字母表的大小定义了ASM的准确性和能量收益。最后进行有效的重新训练,以调整权重并减轻由于ASMs引起的准确性下降。

近似计算单元 - 近似对数乘法器

通过使用对数和指数来将乘法运算变成加法运算的研究由来已久了,John N. Mitchell在1962年的论文"Computer multiplication and division using binary logarithms"中提出了一种使用二进制对数进行计算机乘法和除法的方法。该方法通过简单的移位和计数,可以从二进制数本身大致确定其对数。只需要一个简单的加法或减法和移位操作,就可以完成乘法或除法。

下面是一种改进的算法的示意图,涉及到的公式较多,就不细讲了:

小结

这一节只想给大家普及一点,就是因为神经网络的宽容性,给各种硬件优化带来了不小的空间。虽然目前大模型的训练基本只能使用NVidia GPU,但是未来的训练和推理一定还有很多可以优化的空间。

请大家随时关注硬件的发展情况,如果发现可以用于自己业务场景的硬件可以节省成本或者推升性能,一定保持开放心态去尝试一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/668540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docke是什么,一文带你了解

Docker的优势、与虚拟机技术的区别、三个重要概念和架构及工作原理详细讲解 随着云计算和容器化技术的发展,Docker作为一种轻量级的容器化技术,受到了越来越多的关注和应用。本文将详细介绍Docker的优势、与虚拟机技术的区别、三个重要概念和架构及工作…

memcpy 和 memmove的模拟实现

文章目录 1.函数的介绍 2.模拟实现 文章内容 1.函数的介绍 memcpy指的是C和C使用的内存拷贝函数,函数原型为void *memcpy(void*dest,void*src, size_t count);函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从…

内网穿透(NAT 穿透)原理+工具(部分无需管理员权限)

内网穿透,即 NAT(Network Address Translation) 穿透 内网穿透的实质是内网映射,内网地址转换成外网地址的实现。实现过程要有端对端数据传输,也有端口转发原理。内网映射方式,可以解决无公网IP问题&#…

Android问题笔记-Android studio 出现Failed to compile values file.错误

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&…

docker compose 容器编排工具

目录 docker compose是什么? 官网网站:Docker Compose overview | Docker Documentation 安装使用compose: 步骤: 1、下载并安装compose的命令行插件 2、安装完成后授予权限,测试compose是否可以使用 3、实例测试…

AI大模型迈入应用时代,每日互动推动“可控大模型”落地

垂直行业更需要可控大模型 当下,大模型正在不断精进,以GPT-4、文心一言为代表的大模型(LLM)表现出了强大的逻辑推理能力,并能够很好地处理复杂任务,使得社会生产力得到了飞跃式提升。 面对大模型热度的持…

全网最详细,自动化测试与自动化框架总结,你不知道的都在这了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 单元测试框架 单…

网络:IP地址、子网掩码、网络地址、广播地址、网段、网关

目录 一、IP地址 二、子网掩码 三、网络地址 四、广播地址 五、网段 六、网关 七、IP地址、子网掩码、网络地址、广指地址、网殷、网关的关系 参考链接 一、IP地址 IP地址是因特网协议(IP)中使用的一种数字标识符,用于唯一地标识网络…

LLM - 基于 Vicuna-13B 参数计算搭建私有 ChatGPT 在线聊天

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/131312366 LLaMA 和 Vicuna 都是大语言模型(LLM),两者的差异如下: LLaMA (Large Language Model Meta AI)&#…

英飞凌MCU芯片选型推荐参考

前言: 英飞凌Infineon作为一家芯片大厂,有众多芯片产品可供选型,这里重点推荐下庞大的MCU系列如何选项。首先,对于英飞凌产品构成要有深刻的认识,需要熟悉一个半导体产业并购的历程。2013年5月,Spansion 1.1亿美元并购了对富士通(Fujitsu)半导体微控制器和模拟业务部门…

聚类Clustering方法定位船舶站点

背景 现有船舶的航线中采样的数据库,采样的总时长为3个月,仅采样航速静止(小于1节)的数据,关键有效数据主要有经纬度/实时吃水量。 思路 基于站点附近轮船有停靠且航行速度慢,故取样点多的基础认识&…

正确的认识泥石流以及做好泥石流的防范

泥石流是山区沟谷中由暴雨、冰雪融水或地下含水层的渗入所形成的携带大量泥沙、石块等固体物质的特殊洪流,具有流量大、历时短、破坏力强等特征,泥石流携带的泥沙、石块等可高达数十米,并从山坡上倾泻而下,往往会形成一个“堰塞湖…

Python自动化测试利器selenium详解

Selenium是一种常用的Web自动化测试工具,支持多种编程语言和多种浏览器,可以模拟用户的交互行为,自动化地执行测试用例和生成测试报告。Selenium基于浏览器驱动实现,结合多种定位元素的方法,可以实现各种复杂的Web应用…

二进制搭建Kubernetes集群(一)——部署etcd集群和单master

单master集群架构图: 实验环境(二进制搭建 Kubernetes v1.20) 注意:生产环境中,etcd集群和master、node节点都应该部署在不同的机器上,此处为了实验方便,将三台etcd节点分别部署在了master和no…

探究Vue源码:mustache模板引擎(3) 通过编写简单正则了解mustache转换思路

我们会基本使用显然不够啊 我们要去了解mustache的原理 乃至自己去写一个mustache 首先 mustache 不是不能用简单的正则表达式来实现 但是 这里为了让大家理解 为什么不能 我们还是用简单正则写一下 我们创建一个 html文件 然后 编写代码如下 <!DOCTYPE html> <htm…

API性能监控 【ApiHelp】-- 组件Monitor 核心功能实现

上篇文章介绍了组件Monitor主要设计和功能Monitor组件设计&#xff0c;现在来具体看看Monitor组件的实现。 1、Java Agent实现AgentMain 前面已经介绍了Java Agent相关知识&#xff0c;现在来具体实现下。 实现AgentMain类&#xff1a; AgentMain为agent的入口类&#xff0c;程…

【C语言】项目实战——快速0基础上手五子棋游戏(内附源码)

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 如果你是从现在关注的老粉的话&#xff0c;你可能会有点疑惑“how old are you&#xff1f;”(怎么老是你&#xff1f;) 唉&#xff0c;没办法我也不想的&#xff0c;但是月末了参加新星计划和2023年博客之星的评选只能更…

职业生涯规划书600字范文

职业生涯规划书600字范文篇1 记得高中时老师就告诉我们要认识自己&#xff0c;“认识自己”&#xff0c;仅仅四个字&#xff0c;实践起来是何等的艰难&#xff0c;古往今来那么多仁人志士为了能认识自己&#xff0c;不断实践&#xff0c;不断创新&#xff0c;可又有几个能在生命…

软件安全技术复习内容

软件安全技术 边复习边写的&#xff0c;有错误及时指正第一章 软件安全概述零日漏洞安全威胁分类CIA安全基本属性PDRR模型软件安全的主要方法和技术基本方法主要技术 第二章 软件漏洞概述概念软件漏洞成因分析软件漏洞分类基于漏洞成因的分类基于漏洞利用位置的分类基于威胁类型…

FPGA基础知识-编程语言接口

目录 学习目标&#xff1a; 学习内容&#xff1a; 1.PLI的使用 2.PLI任务的连接和调用 3.内部数据的获取 4.PLI库子程序 学习时间&#xff1a; 学习产出&#xff1a; 学习目标&#xff1a; 解释在Verilog仿真中如何使用PLI子程序。 描述PLI的用途。 定义用户自定义系…