惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Exploit Database - CXSecurity.com
F
Fortinet All Blogs
U
Unit 42
F
Full Disclosure
雷峰网
雷峰网
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
罗磊的独立博客
D
DataBreaches.Net
C
Check Point Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
O
OpenAI News
C
CXSECURITY Database RSS Feed - CXSecurity.com
aimingoo的专栏
aimingoo的专栏
S
Security @ Cisco Blogs
大猫的无限游戏
大猫的无限游戏
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
SegmentFault 最新的问题
NISL@THU
NISL@THU
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Hacker News
The Hacker News
Webroot Blog
Webroot Blog
Security Latest
Security Latest
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Google DeepMind News
Google DeepMind News
酷 壳 – CoolShell
酷 壳 – CoolShell
N
News | PayPal Newsroom
P
Proofpoint News Feed
B
Blog RSS Feed
MongoDB | Blog
MongoDB | Blog
C
Cybersecurity and Infrastructure Security Agency CISA
N
News and Events Feed by Topic
Google Online Security Blog
Google Online Security Blog
H
Help Net Security
Spread Privacy
Spread Privacy
T
Threat Research - Cisco Blogs
GbyAI
GbyAI
I
Intezer
Application and Cybersecurity Blog
Application and Cybersecurity Blog
M
MIT News - Artificial intelligence
Vercel News
Vercel News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
IT之家
IT之家
MyScale Blog
MyScale Blog
腾讯CDC

Пусть этот камень будет более крепким, чем человек

【琐记】烟火与尘埃 【Triton】Triton实现矩阵乘 【LLM推理加速】FlashAttention 【LLM推理加速】PagedAttention 【LLM推理加速】Online Softmax LLM基础知识【1】 Transformer模型 【AI编译】LayerGroup Tiling Tile的疑惑和思考 【AI编译】深度优先的Tile调度,万事大吉? 【AI编译】多级流水线Tile调度策略 【CUDA C++】GPU内存使用【3】 【AI编译】Cache缓存地址映射 【CUDA C++】GPU存储【2】 【CUDA C++】GPU基本介绍【1】 【00】0序章-不受欢迎的来客 【转载】我来了——持续低熵 【Halide】调度优化【2】 【感想】写作进度报告5 【Halide】调度优化【1】 【转载】北大中文男足战报2 【BYOC】TVM切分子图 【转载】北大中文男足战报1 【AI编译】张量生命周期管理 SystemC 用寄存器同步建模方法 【脉动阵列】脉动阵列类型 【im2col】AScend conv accelerate 【感想】写作进度报告4 【BYOC】TVM添加自定义编译器 ccompiler 【感想】写作进度报告3 【Tengine】推理流程脑图【2】 【Tengine】推理流程脑图【1】 【NCNN】学习ncnn模型转换 【编译器】使用llvm编译自定义语言【3】编译 object 【编译器】使用llvm编译自定义语言【2】转llvm IR 【编译器】使用llvm编译自定义语言【1】构建AST 【AI编译】如何进行内存分配 【感想】写作进度报告2 【AI编译】layer-group之后如何tiling 【量化】连续卷积层首尾量化的可行性 【Gemm】内存对齐 【gemm】Gemm计算加速 【TVM】通过代码学习编译流程【5】FuseOps 【TVM】通过代码学习编译流程【6】CodeGen 【TVM】通过代码学习类【3.5】Pass 【TVM】通过代码学习编译流程【4】BuildRelay 【AI编译】Tiling操作能优化什么时间 【TVM】通过代码学习编译流程【3】模型编译 【TVM】通过代码学习编译流程【2】模型转换 【TVM】通过代码学习编译流程【1】必要知识 【感想】写作进度报告1 【Winograd】卷积加速算法原理及实现 SystemC 等待异步事件解决方案 【TVM】Python脚本实现模型编译和保存 【推理引擎】常见AI推理框架 【3D建模】T110E3卡迪夫蓝调皮肤模型 【TVM】C++部署运行TVM 【推理引擎】NCNN和Tengine量化推理逻辑对比 【3D建模】IS-7攻城锤流纹岩皮肤展示 【TVM】根据例子走通代码库 博客汇总目录 【Im2Col】卷积加速算法【2】NHWC 【Im2Col】卷积加速算法【1】 NCHW openBlas库的安装与简单使用 C语言工程调用Cpp库解决方案 foo Hello World
【AI编译】如何进行layer-group
Post author: XianMu@Пусть этот камень будет более крепким, чем ч · 2025-01-14 · via Пусть этот камень будет более крепким, чем человек

# 前言

本篇介绍 AI 编译领域 layer-group 算法。

本篇文章参考过 《超强干货!地平线编译器大牛的编译优化实践总结》《Arm 周易编译器工程》《算能 TPU layer group 讲解》《算能 TPU 视频讲解》 等文章和工程,欢迎大家参考。

作为初学者,错误在所难免,还望不吝赐教。

如图所示,AI 编译优化的基本流程是 1. 图优化 (算子融合,常量折叠等) 2. 拆分 (layer group 和 tiling) 3. 并行和调度。最后得到当前编译的时间消耗。

如图1所示

在 AI 编译领域,LayerGroup 指的是将神经网络中的多个层(layers (Operator) )组合成一个逻辑单元或模块的过程。

一般而言设备的运行内存很大,比如电脑的运行内存 16GB,但是它的速度比较慢,我们把它叫做 Global Memory。而做神经网络推理的专用 NPU 芯片,它的高速缓存速度很快,但是空间可能只有几 MB,我们把它叫做 Cache。我们无法将网络模型所有 layer 全部加载到 cache 中,那么意味着每个算子都需要 Cache 和外部 Global Memory 的交互,load 输入数据、store 结果。

所以需要将网络拆分成小的 layer group。一般默认只有进入和退出 layer group 的时候,才需要和外部的 Global Memory 做 Load/Store 操作去交互。把需要的数据 load 进来,将结果数据 store 出去。layer group 减少了 Load/Store 操作,同时 layer group 也是后续 tiling、调度等操作的基本单元,降低了问题复杂度。

# 动态规划搜索

如图1所示

还是这张图,如何划分 layer group 呢?图里面只有四个算子,可以 1,2 划分一组,3,4 划分一组;也可以 1 划为一组,2,3,4 划分另一组;甚至 1,2,3,4 全部划分为一组。不同的划分方式,最后得到的 Cost 也不同。
为了找到最优的划分方式,不得不搜索所有划分方案。

假设网络有 n 层,则 n 层中间有 n-1 个间隔。选取 0 个间隔,也就是 n 层全部划分为一组,是 C (n-1, 0);选取 1 个间隔,也就是分成两组,是 C (n-1,1);选取 2 个间隔,也就是划分三组,是 C (n-1,2);以此类推, C (n-1, 0)+C (n-1,1)+C (n-1,2)+……+C (n-1,n-1),根据二项式定理,需要 2^(n-1) 次搜索。

指数式增长计算量太大,是不可接受的。

可以采用动态规划的思想来减少搜索次数。

我们以 100 层网络为例。设 f(n) 为从第 0 层到达第 n 层最短用时。令 f(-1) = 0cost(x,y) 为从 x 层到 y 层作为一个 group 的开销。则:

f(0) = cost(0,0)
f(1) = min( f(-1)+cost(0,1) ; f(0)+cost(1,1) )
f(2) = min( f(-1)+cost(0,2) ; f(0)+cost(1,2) ; f(11)+cost(2,2) )
...
f(99) = min( f(-1)+cost(0,99) ; f(0)+cost(1,99) ; ... ; f(98)+cost(99,99) )

这就需要提前计算一个 cost table。

如图2所示

cost table 如图所示。我们要做的就是以从 x 层到 y 层作为一个 group,计算开销 cost(x,y) 并保存下来。对于一个 n 层的网络来说,需要搜索的 layer group 数量为: 1+2+…+n = n (n+1)/2 。搜索次数从原来的 2^(n-1) 指数函数,已经降到幂函数。

但是当网络层数过多时,搜索量还是很大,可以限制最大搜索长度,例如最长支持 50 层,那么 cost table 就变成下面这个样子:

如图3所示

现在对于 n 层网络,搜索数量降到 50*n 。

还可以启发式的剪枝优化,优化掉明显不会有收益的分支,进一步降低搜索的时间消耗。

# 后记

本博客目前以及可预期的将来都不会支持评论功能。各位大侠如若有指教和问题,可以在我的 github 项目 或随便一个项目下提出 issue,并指明哪一篇博客,我看到一定及时回复!

runtime_mod