Memory Wall in Neural Network Inference

Memory Wall in Neural Network Inference

神经网络推理的瓶颈在于访存带宽,通常无法发挥出加速器的全部算力。本文总结了目前常用的推理加速器及其设计,并分析了常用神经网络的访存瓶颈。文章大部分内容参考自Computer Architecture: A Quantitative Approach。

1 Compute centric accelerators

1.1 CPU

一般来说,CPU擅长于做控制逻辑复杂的workload。但是,CPU里面也存在SIMD的加速器设计。

  • Vector Architecture in RISC

    • Basic idea

      • Read sets of data elements into “vector registers”
      • Operate on those registers
      • Disperse the results back into memory
    • Y = a × X + Y

      左边使用Loop的原始汇编代码,右边是使用Vector Architecture优化后的汇编代码。

      在这里插入图片描述

      • 如果 X 和 Y 均为32维向量,1 lane

        那么使用Vector Architecture加速,需要32×3个cycle

    • Optimization

      可以优化的地方很多,讲两个有意思的优化。

      • Multiple Lanes

        如果是4 lane的话,上述例子仅需要32×3/4个cycle就可以完成。

        在这里插入图片描述

      • Scatter-Gather

        读取的向量可以不存储在连续的内存中。

        例如,执行这段代码:

        for (int i=0; i<n; i++){
            A[K[i]]=A[K[i]]+C[M[i]];
        }
        

        使用Scatter-Gather优化后的汇编代码如下:

        在这里插入图片描述

        这种优化技术用在稀疏矩阵场景很有用。

  • SIMD extensions for x86

    简单来讲,就是利用长寄存器,一次处理多个数据。比如寄存器长度是256 bit,一个数据的长度是64 bit,这时候,就可以一次处理4个数据。

    使用SIMD extensions优化Y = a × X + Y 后的汇编指令:

    在这里插入图片描述

    • 这种优化要求向量必须存储在连续的内存空间中
  • Vector Arch. vs. SIMD Extensions

    看这张图,对于神经网络推理加速场景,x86完全干不过RISC(哈哈,连高性能计算都干不过RISC,x86是不是要凉啊)。

    在这里插入图片描述

1.2 GPU

简单来讲,GPU的架构就是堆很多的寄存器和ALU,获取高算力。对应到下图,你可以看到很多的SIMD Lane 和 DP Unit。

在这里插入图片描述

但是,GPU里面的处理器算力很强,访存带宽跟不上怎么办?首先,它使用了HBM,内存带宽很高;另外,其中的SIMT (Single Instruction, Multiple Thread) 编程模型利用多线程来掩盖访存时延。

如下图,简单来讲,当thread 8运行的时候,其他的线程(比如thread 1, 3)也没闲着,它们正在取数据。这样的话,GPU里面的处理器时刻处于满负载状态,不需要傻傻地等到数据加载到寄存器才运行。(熟悉GPU的同学应该发现了,图里面的thread改成warp更合适,懒得改了)

在这里插入图片描述

1.3 TPU

听过好多人吹google的TPU多么牛逼,其实也就那样,就是一个专门用来加速GEMM的设备。下图是TPU的架构图,右边的Matrix multiply unit 就是TPU的核心部件。

在这里插入图片描述

通用的加速器GPU可以用来加速向量加法,甚至有人整活,直接在GPU上构建了一个数据库。然而,TPU是一个专用的加速器,只能用来加速GEMM算子,其他的活统统干不了。

不过,TPU里面加速GEMM的硬件设计很有意思。专业的名字叫做Systolic Execution,不过,我喜欢叫它脉冲阵列。如果矩阵的维数是N×N,TPU使用2N-1个cycle就可以把GEMM算子计算完。

在这里插入图片描述

2 Neural network and Memory wall

在当前以计算为中心的编程模型中,需要先从内存中把数据加载到cache,然后ALU进行计算任务,最后将结果保存至内存中。

目前,ALU算的很快,把内存中数据加载到cache的带宽有限,这时候,ALU的算力就会被浪费,性能瓶颈卡会在内存带宽上,这就是“内存墙”。如果我们读入cache一个数据,对它进行N次计算操作后才保存结果,N定义为Operational Density。如果Operational Density,就没有“内存墙”的问题。如果Operational Density比较低,程序就会卡在“内存墙”上。

接下来,我们分析一下MLP、CNN、LSTM和Transformer的Operational Density,判断它们是否会卡在内存墙上。

2.1 MLP

MLPs (Multi-Layer Perceptions) ,多层感知机,大家应该都挺熟悉的,里面的算子是GEMV。

在这里插入图片描述

  • Operational Density为2×batch size每一个矩阵参数乘和加操作各一次。

2.2 CNN

CNN 里面的基础的算子是卷积算子。convolution kernel 复用很多次,Operational Density很高。

在这里插入图片描述

  • Operational Density为 2 x DimFM[i]^2

2.3 LSTM

LSTM里面主要也是GEMV算子。

在这里插入图片描述

  • Operational Density为~2

2.4 Transformer

Transformer中的参数Operational Density与sequence len有关。假设输入token数量为N,generate token 数量为S。主要是GEMM和GEMV算子。

  • 参数Operational Density为 (N×2+S×2)/(1+S)

在这里插入图片描述

在推理过程中,不仅仅需要访问参数,还需要访问KV cache (>30%)

  • KV cache Operational Density为 2
  • pagedAttention
  • 参数Operational Density随batch递增,但是,KV cache Operational Density仍然是2。

在这里插入图片描述

3 Roofline

  • 除了CNN,其他Neural network 的 Operational Density比较低,推理的时候卡在内存带宽,发挥不出硬件算力。
  • 增大batch从而增大Operational Density,是缓解这个问题的一种方法。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

审稿变慢?还疯狂拒稿?这本毕业神刊如今争议不断,还值得一投吗?

【SciencePub学术】 IEEE ACCESS 期刊评说 网友辣评 评说1&#xff1a;麻了&#xff0c;11月17收到外审&#xff0c;现在意见还没回来啊&#xff0c;神刊肿么了&#xff1f; 评说2&#xff1a;两个审稿人评审的&#xff0c;一个拒绝&#xff08;最终意见大修&#xff09;&…

SpringBoot 把PageHelper分页信息返回给前端

第1步&#xff1a;定义线程容器收纳HttpHeaders和HttpStatus import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus;public class ResponseUtils {private static ThreadLocal<HttpHeaders> ThreadLocalHeaders new InheritableT…

07- OpenCV:模糊图像

目录 一、模糊原理 二、模糊的相关处理方法&#xff1a; 1、均值滤波&#xff08;归一化盒子滤波&#xff09; 2、高斯滤波&#xff08;正态分布的形状&#xff09; 3、中值模糊 4、双边模糊算法&#xff08;美容软件&#xff09; 5、相关代码&#xff1a; 6、几种模糊算法的比…

网页设计达人的首选!这6款顶级工具助你设计完美网页!

即时设计 即时设计是国内为当地设计师量身定制的完全免费的网页设计工具。是集成原型、设计、交互、交付等所有网页设计需求的一站式设计平台。内部集成了大量优秀的插件&#xff0c;包括组件、图标、字体、色板、填充等功能&#xff0c;基本涵盖了网页设计师常用的大部分工具…

Redis常见命令

我们可以通过Redis的中文文档&#xff1a;Redis命令中心&#xff08;Redis commands&#xff09; -- Redis中国用户组&#xff08;CRUG&#xff09;&#xff0c;来学习各种命令。 也可以通过菜鸟教程官网来学习&#xff1a;Redis 键(key) | 菜鸟教程 一、Redis数据结构介绍 Red…

Elasticsearch--Master选举

角色 主节点&#xff08;active master&#xff09;&#xff1a;一般指的是活跃的主节点&#xff0c;避免负载任务&#xff0c;主节点主要用来管理集群&#xff0c;专用master节点仍将充当协调节点 候选节点&#xff08;master-eligible nodes&#xff09;&#xff1a;默认具备…

堆叠线:实现高效连接和数据传输的利器

堆叠线是一种常见的网络连接解决方案&#xff0c;主要应用于数据中心和企业网络等领域。本文将介绍堆叠线的定义、分类、作用以及与光纤线的区别&#xff0c;同时提供详细的堆叠线接法和相关问题的解答。 第一部分&#xff1a;堆叠线是什么 堆叠线是一种用于连接网络设备的高…

一行代码给Button添加一个光标焦点动画:得着焦点按钮放大,失去焦点按钮恢复

当光标进入Button的时候&#xff0c;也就是Button得着焦点时&#xff0c;Button出现放大效果&#xff0c;失去焦点的时候&#xff0c;恢复原来的尺寸。 本例仅供学习交流之用 一、效果 按钮得着焦点&#xff0c;放大 按钮失去焦点&#xff0c;恢复 二、给按钮添加动效 得着…

vbs读取数据库值前端FlexGrid前导0出不来的原因

vbs读取数据库值前端FlexGrid前导0出不来的原因 原因 系统设置问题 解决 修改系统默认数值显示&#xff1a; 1&#xff09;控制面板找到“区域”&#xff0c;点击“更改日期、时间和数字模式”&#xff0c;在弹出窗口点击“其他设置” 2&#xff09;在数字一栏中的“显示前…

Java的helloworld、IDEA一些快捷键、导入模块

一、Java的helloworld IDEA管理Java程序的结构 1.project&#xff08;项目、工程&#xff09; 2.moudule&#xff08;模块&#xff09; 3.package&#xff08;包&#xff09; 4.class&#xff08;类&#xff09; 上级包含多个下级&#xff0c;开发程序也是创建工程再创建…

【Web】CTFSHOW PHP文件包含刷题记录(全)

温故知新。 目录 web78 web79 web80 web81 web82 web83 web84 web85 web86 web87 web88 web78 伪协议base64编码直接读出文件内容就行 ?filephp://filter/convert.base64-encode/resourceflag.php web79 一眼data伪协议包含php脚本 ?filedata://text/plain,<…

2020年认证杯SPSSPRO杯数学建模C题(第二阶段)抗击疫情,我们能做什么全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 C题 抗击疫情&#xff0c;我们能做什么 原题再现&#xff1a; 2020 年 3 月 12 日&#xff0c;世界卫生组织&#xff08;WHO&#xff09;宣布&#xff0c;席卷全球的冠状病毒引发的病毒性肺炎&#xff08;COVID-19&#xff09;是一种大流行病。…

JAVA微信营销平台源码带使用文档

JAVA微信营销平台源码带使用文档 开发环境&#xff1a; Eclipse版本&#xff1a;Eclipse Java EE IDE for Web Developers. JDK版本&#xff1a;jdk7 Tomcat版本&#xff1a;tomcat7 Mysql&#xff1a;mysql5.0以上

Redis 为什么要分16个库

目录 一. 前言 二. 16 个数据库的由来 三. 正解 Redis 数据库概念 四. 集群环境下的 Redis 实例 五. 总结 一. 前言 在实际的项目中&#xff0c;Redis 常被用作缓存、分布式锁、消息队列等的解决方案。但是在搭建好Redis 服务后&#xff0c;Redis 默认创建了16个数据库&am…

虹科新闻丨LIBERO医药冷链PDF温度计完成2024年航空安全鉴定,可安全空运!

来源&#xff1a;虹科环境监测技术 虹科新闻丨LIBERO医药冷链PDF温度计完成2024年航空安全鉴定&#xff0c;可安全空运&#xff01; 原文链接&#xff1a;https://mp.weixin.qq.com/s/XHT4kU27opeKJneYO0WqrA 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 虹科LIBE…

php内置函数-文件包含的函数

目录 1.include 2.require 3.include_once 4. require_once 1.include 可以将别的文件直接引用过来&#xff08;被引用的文件含有打印代码的话&#xff0c;会直接打印&#xff09;&#xff0c;如果失败了&#xff0c;会返回一条警告&#xff0c;文件会继续执行下去&#…

超越5大最先进的文本到视频系统!MagicVideo-V2:多阶段高保真视频生成框架(字节)

本项工作介绍了MagicVideo-V2&#xff0c;将文本到图像模型、视频运动生成器、参考图像embedding模块和帧内插模块集成到端到端的视频生成流程中。由于这些架构设计的好处&#xff0c;MagicVideo-V2能够生成具有极高保真度和流畅度的美观高分辨率视频。通过大规模用户评估&…

Python办公自动化 – 自动化文本翻译和Oracle数据库操作

Python办公自动化 – 自动化文本翻译和Oracle数据库操作 以下是往期的文章目录&#xff0c;需要可以查看哦。 Python办公自动化 – Excel和Word的操作运用 Python办公自动化 – Python发送电子邮件和Outlook的集成 Python办公自动化 – 对PDF文档和PPT文档的处理 Python办公自…

11.3、信赖域策略优化算法TRPO强化学习-运用实践

基于LunarLander登陆器的TRPO强化学习&#xff08;含PYTHON工程&#xff09; TRPO强化学习算法主要分为3个部分&#xff0c;分别介绍其理论、细节、实现 本文主要介绍TRPO的理论和代码的对应、实践 TRPO系列&#xff08;TRPO是真的复杂&#xff0c;全部理解花费了我半个月的…

C++算法学习心得五.二叉树(3)

1.合并二叉树&#xff08;617题&#xff09; 题目要求&#xff1a; 给定两个二叉树&#xff0c;想象当你将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠&#xff0c;那么将他们…