Eff Deep Learning与Hardware Accel相关的一些自己不成熟的想法的梳理
Surveys & Talks
[ACM TRETS 19] A Survey of FPGA-Based Neural Network Inference Accelerator (DPU架构)
- Hardware Optimization
- Computation Unit Design: 低比特的计算单元,或者Conv的变体
- Loop Unrolling strategy: 目的: increase parallelism & save computational waste
- Compiler的优化在这个层面?或者是这个层面的一个generalized?(TVM/MLIR)
- Loop Tiling是Loop Unrolling的一种更高层次的,Loop tile将unrolled好的数据给排布好成一个个的tile。loop tile的size可以调整计算存储比
- Loop interchange决定了tile的计算order
之前我对这几个概念的认知是有错误的:Loop unroll指的是将一个大循环拆成若干个小循环并行做(本质上是堆更多的硬件计算单元以获得更高的并行度),这个拆解率N,一般都是在compiler优化之前决定的,它决定了:有多少个硬件单元会同时并行执行,也就是决定了**并行度**
Loop Tiling则是另外的一个维度,决定了每个周期(流水线中)进多少数据,可以控制计算存储比。属于Compiler的优化空间,另外Loop exchange描述的才是这个四层循环的先后顺序,也可以被compiler所优化,这些都包含在compiler优化中的scheduling部分中
- Data Transfer Design & On-chip memory design
- systolic array is an example
- data reuse for high parallelism:
- too much broadcast: high fan-out & high routing time: lower the working frequency
- 在这里需要获得一个 locality & parallelism之间的trade-off?
- Cross-layer Scheduling:
- fuse many layers together
- 一般不做
- 我们在compiler中提到的scheduling?和这些组件的关系? (
参考上面有关loop unrolling的讨论
)compiler优化的时候会考虑到数据的依赖关系,如果有了复杂的数据依赖优化不好的话,就会导致存储带宽不足
数据依赖所描述的其实是:一个数在被拿出去计算还没写入的时候,下一次又需要读它,所以需要等这种情况。然而访存的locality问题,其实更general,只要是时间和空间分布不具有局部性,都会导致访存locality较差
数据依赖性描述的是DataFlowGraph和data数据之间的依赖关系; 时间局部性是同一个数据被多次使用,空间局部性则是相邻数据存储之间的关系
- 以及cache的locality?
- cache的locality描述的其实本质是一个对memory的读取速度和data pattern有关的问题。
- 能够反映到数据带宽(bandwidth),sequential且规则的DDR access的访问带宽,肯定比random access更快*
一个on-the-side的点,cache是一个主动式的存取,而bufffer是被动式的,cache会主动接受处理器的需求拿到想要的数据,而buffer是要从里面自己拿的,所以DPU中其实只有buffer。
- System Diagram:
- Roofline Model:
- X axis: CTC: Computation to Communication Ratio
- number of operations with a unit size of memory access
- X axis: CTC: Computation to Communication Ratio
Efficient Deep Learning: A Survey on Making Deep Learning Models Smaller, Faster, and Better
- HPO
- Infrastructure:
- Tensorflow系列
- TensorLite: 针对ARM-based processor做优化(以及针对Qualcomm的DSP)
- 提供了一个解释器Interpreter
- 提供了一些算子: OP Kernel
- 提供了converter实现了计算图的量化等
- TFMicro: for IOT microcontrollers
- TF.JS: train model on browser
- TensorLite: 针对ARM-based processor做优化(以及针对Qualcomm的DSP)
- XLA: server-side acceleration:
- a graph compiler
- customized kernel for graph, fused operations
- Pytorch JIT(Just-in-time) Compilation:
- 类似XLA的功能,在其中的替代品是GLOW和TensorComprehension
- 生成 a serializable IR(high-level IR)
- 包含了fusion of pointwise operations
- Tensorflow系列
- GPU:
- software libraries like cuBLAS,cuDNN
- TensorCore 针对DL应用的硬件单元(可以switch多种bitwidth)
- TPU:
- 属于ASIC,不需要cater to除了DL之外的其他应用, which GPU has to
- Systolic Array Design
- systolic array面对的是memory-bounded的任务,由于computing不再是瓶颈,脉动阵列尽可能在一次memory读取中执行更多的运算,来balance memory&compute
- 与传统的单PE结构不同,Systolic array中有多个PE,数据流经过PE1处理完之后又进入下一个PE,
在较小的内存带宽的情况下获得较高的内存吞吐率
优化memory读取的方法?
- Tiling & Data Reuse,尽量减少片外memory的读取次数
- 增加On-Chip Memory以及片上buffer的大小
- EdgeTPU: ASIC for edge devices, 针对的平台是Raspberry-Pie,Pixel Smart phone
- NVLink: 更快的接口能和片外memory更好的交互:
- 对标PCIe
[Nvidia] Full-Stack, GPU-based Acceleration of Deep Learning
- 典型硬件架构:
- 特征:trade-off between flexibility and efficiency.
- CPU
- CPU的memory system更适合low-latency场合,有比L1 L2 Cache更快的resgiter(就在ALU旁边)
- GPU
- Systolic Array:basic arch of NN DSA
- NVDLA: nvidia’s custom accelerator
- SoC: contain above parts
- 特征:trade-off between flexibility and efficiency.
- 优化维度:
- Memory movement
- Mapping
- 优化Mapping的工具: Timeloop & Accelergy:
- Memory movement
- 指标:
- Latency与Throughput:因为可以流水起来,latency表示第一个结果出来的时间,throughput表示出结果的速度
- 算子特性:memory/math-limited
- 4象限图:
- 解决问题方案:
- 4象限图:
- Latency与Throughput:因为可以流水起来,latency表示第一个结果出来的时间,throughput表示出结果的速度
- TensorRT:
- Nvidia Profiling:
- Nsys Command Template:
- Nsys Computs:
- NVTX Region:
- Tips:
- Nsys Command Template:
[Eyeriss MIT Group] Tutorial on Hardware Accelerators for Deep Neural Networks
零散的知识
- AI框架的演进趋势和MindSpore的构想
- AI芯片的发展对AI框架的发展:1) 优化与硬件耦合度提升,计算图层面的优化已经收敛,需要和算子层进行联合优化。2)异构的编程
- AI编译器将成为重点: 1)静态图动态图统一的JIT能力,如JAX; 2)面向芯片以及硬件平台优化:XLA,TVM 3)AI编译的基础设施 MLIR
- AI的JIT:动态shape容易搞定,但是动态type就难了,动态图和静态图无缝的转换困难
- 编译加速: 基于Pattern的算子融合和基于模板template的算子生成两条路。(算子融合更难,是否能让模板template-free是一个promising的方向)
- 基础设置: MLIR的理念先进,希望通过Dialect来支持各种编译器。
- 深度学习加速器的整套流程
- 包括以下几个环节:
- 算法层加速:剪枝量化等,主要是Python
- 编译器层面:将深度学习框架生成的计算图 -> 算子和计算流程(包括了Scheduling)(Python/C++)
- 软件交叉验证: cModel(软件验证编译器的输出结果)
- 指令集合的设计: 与硬件结构设计紧相关: RTL
- RTL层面的设计:
- 一些中间操作(Act/BN)等虽然计算量不大,但是会对整体加速形成瓶颈,需要让他与卷积之间形成流水
- 指令的设计:包含了数据的存储位置,需要的数量,计算的方式
- 加速器架构主要包括的部分:
- 外部总线:与外部DDR交互读数
- 内部存储Cache:存储所用到的参数和数据,需要提供给计算core,cache缓存是一个缓存区以避免DDR的带宽瓶颈
- 指令解析:
- 内部总线:每个计算核的数据通路
- 计算Core
- Interconnect:不同核之间的互联
- 验证主要包括两大部分: 1) cmodel以验证编译器输出指令的有效性 2)RTL仿真结果是否正确
- 典型例子如UVM: 生成随机指令给cmodel,随机参数写入DDR
- 驱动:目标:完成DDR的初始化,线程控制的配置以及中断响应。
- 将权重写到DDR中,然后通过AXI总线配置FPGA寄存器。
- 对Zynq平台的标准操作: 1)制作RTL工程,生成bit和hardware配置; 2)利用SDK生成fsbl,对zynq器件的一些硬件配置; 3)制作linux系统的uboot,kernel,deviceTree等;制作打包成一个boot.bin制作SD卡镜像并烧录到SD卡。
- 包括以下几个环节:
- 陈天奇: 深度学习编译技术的现状和未来
- Polyhedral Model
- 深度学习编译器有哪些有价值的研究方向和参考文献?: TVMCon的主题报告
- 深度学习的几种抽象层次:
- 计算图 Computational Graph:将计算图表示成DAG,可以进行算子的fuse,改写,并行等操作。(Relay,XLA,TorchMLIR,ONNX都在一个级别)
- Tensor程序表示 Tensor Program: 对子图的loop优化,对于DSA设计还要包含内存搬运的优化 (TVM,MLIR)
- 算子库和运行库 Library & Runtime: 类似cuDNN,cuSparse等
- 硬件指令 Hardware Primitive: 专用硬件的硬件张量指令 (LLVM)
- 目前的生态会在各个层面单独做Multi-stage Lowering,然后把问题丢给下一个层级继续优化
- 深度学习的几种抽象层次:
- Adi Fuchs的加速器系列文章
- Part2 处理器演变
- Part3 架构基础
- Part4 The rich landscape
- Part5 Final thoughts
- (没有特别get到他的体系和逻辑走向…但是提供了很多strong evidence)
- AI加速器的基本架构类型: ISA(指令集加速器),典型例子Intel的X86,ARM,MIPS,RISC-V(与CISC对比),一般由算术指令,内存操作,控制操作
- Systolic Array:(目前主要的AI加速引擎都采用了该种方式,比如Tensor Core)
- 数据流操作Dataflow,程序被表达成数据流图:DGF(Dataflow Graph)
- 内存管理:内存访问能耗比较多,比计算高处几个数量级,可以用近存的方式(Near-memory Computing,更激进的方案就是PIM)
总结
1. 算法(软件)层的加速
我们熟悉的Pruning,Quantization,NAS等等都可以认为是该种方式,主要特征是:获得计算量或者存储的节省
-
例子:我们熟悉的几乎所有Paper
-
表现出来的指标:
FLOPs,Param Size,GPU end2end latency
-
部署实例:如TF,Torch自带的一些轻量化方式(如torch中的quantize)
❓: 但是这里的一些计算存储的优化,并不能直接反应到硬件设计的效率,why?
首先,一些软件层面的优化,不会直接反馈到硬件指标。举个例子,比如对于FPGA加速器,你减去了一半的Channel,纸面上减少了一半的显存和计算。但是实际上在部署时候,本身模型还是大到不能存到片上, 所以只是多算了几个时钟周期,可能对端到端的Latency/吞吐量throughput有优化,但是对计算效率Energy Efficiency并没有提升。(以上两个部分分别代表了硬件加速器的两大指标:速度和能效)
甚至,对于一些硬件设计上本身就不是瓶颈的case,优化某些操作对硬件效率完全不会有提升。比如对于某些层的剪枝,由于存在shortcut的结构,本身硬件上计算需要等待其他流程的数据done,卡在idle,对它做了优化,并不一定能够提升硬件效率。或者对于一个模型,降低了显存和计算之间的比例,但是这本身是一个计算bounded的任务,减少内存消耗并不能提升硬件效率。
2. 软硬件协同优化
硬件感知(Hardware-aware)的算法优化或者是协同优化(涉及到硬件架构中一些设计的优化,但是不是pure硬件优化)
- 指标:(与硬件加速器指标类似且相关)
- 算法中的一些指标:FLOPs,Param
- High Speed:高throughput(IPS): 每s的inference次数(单位:s^{-1}); 低Latency
- 能效: Energy Efficiency (GOP/J) Memory Efficiency(J/Byte)
- 该层面优化的一些层次?
3. 硬件层面的优化
3.1: 针对特定硬件平台(GPU/FPGA)的优化
其实也可以是软件层,主要因为针对GPU的优化,GPU有CUDA语言以及很多的Library
-
例子: torchsparse
-
部署实例:如TensorRT,后端是平台代码(CUDA),且包含了计算图以及编译的优化。