ATB概念之:算子tiling

简介: 算子 tiling 是一种优化技术,用于提高大规模张量运算的计算效率。它通过将大任务分解为小块,优化内存使用、支持并行计算,并防止内存溢出。在ATB中,tiling data指kernel的分片参数,用于指导计算。ATB提供了三种 tiling data 搬移策略:整体搬移、多stream搬移及随kernel下发搬移,旨在优化内存拷贝任务,提高计算效率。

1 什么是算子tiling

在计算机科学和深度学习领域,算子 tiling(有时也被称作操作符 tiling 或者循环 tiling)是一种优化技术,主要用于提高计算效率,尤其是在处理大规模张量运算时。Tiling 技术通常用于将大的计算任务分解成更小的块,这些小块可以在内存中更高效地处理,或者更适合并行计算环境。

在深度学习框架中,算子 tiling 可以应用于不同的场景:

  1. 内存优化:通过将大的张量切分成更小的部分,可以更好地利用高速缓存(cache),减少内存访问延迟,从而提高计算性能。
  2. 并行计算:在分布式系统或GPU上,数据可以被切分成块(tiles),然后并行处理。这样可以让更多的处理器同时工作,加快计算速度。
  3. 避免内存溢出:对于非常大的张量,直接处理可能会导致内存不足的问题。通过 tiling,可以将数据分批处理,从而避免一次性加载整个张量到内存中。
    在深度学习模型的实现过程中,特别是在卷积神经网络(CNNs)中,经常会遇到需要对输入数据进行切片处理的情况。例如,在一些深度学习框架中,可以使用特定的API来实现 tiling 操作。

需要注意的是,“tiling”一词在不同的上下文中可能有不同的含义。在图像处理中,tiling 也可能指的是将图像分割成多个小块(tiles),以便于独立处理或存储。而在计算机图形学中,tiling 则可能涉及到纹理映射或屏幕渲染中的技术。不过,在上述情况下讨论的“算子 tiling”主要指的是与计算优化相关的一种技术。

2 tiling data

tiling操作输出的数据,就叫做tilingdata,是kernel的分片参数,用于决定kernel实际计算时的分片策略。在ATB中(ATB是什么? - 知乎 (zhihu.com))通常以结构体的形式存储,由用户输入的参数与张量Shape计算而来。

tiling data的计算通常放到host侧,tiling data在host侧计算完毕后,ATB再将其拷贝到device侧,作为kernel的输入提供给kernel。

既然是host->device肯定涉及到内存的拷贝,那如何优化这种拷贝任务也需要一种设计上的优化。在ATB中,存在三种不同的tiling data搬移策略:tiling整体搬移、多stream搬移、tiling随kernel下发搬移,当前默认使用的是tiling随kernel下发搬移这一方式。

3 ATB中的Tiling data搬移策略

3.1 整体搬移

tiling整体搬移方式会把每次计算出的tiling data存放到一片连续的host内存中,待所有kernel的tiling data计算完成后,再一次性搬移到device侧。

在性能优化方面,内存整体搬移相较于单个内存搬移,肯定是由有优势的。机器指令下发次数少,机器寻址次数也少。

3.2 多stream搬移方式

多stream搬移方式则是针对整体搬移方式做出的改良,其核心思路是通过stream并行的方式来减少tiling data搬移所消耗的时间。在该搬移策略中,ATB会准备好两个stream、一个环状的device缓冲区以及一系列同步信号量。

  • 其中一条stream用于kernel的执行,另一条则单独用于tiling data的拷贝。由于kernel的执行依赖于tiling data拷贝的完成,此时需要用同步信号量来保证另一条stream上的kernel执行动作位于当前kernel的tiling data拷贝完成之后。
  • 环状的device内存缓冲区则是用于处理在tiling data拷贝速度快于kernel执行速度时,提前拷贝到device侧的tiling data数据可以保存下来且不互相冲突。但在tiling data拷贝速度过于快时,有可能会出现device缓冲区被填满的情况,这种情况下需要增大device缓冲区中的内存块数。
    如上这种方式,也就是将tiling搬移作为异步任务下发,与kernel的执行形成流水的任务。这也是性能优化一种常用的手段。

注意:多stream搬移方式下的tiling data还是多个kernel的tiling data,不是单kernel的tiling data。

3.3 tiling随kernel下发搬移

该策略对tiling整体搬移方式进行了性能优化,但优化方式与多stream搬移方式不同。

tiling随kernel下发搬移的核心思路是:

  • 不再等待所有tiling data计算完毕后再一次性搬移到device侧,而是每次计算完一个kernel的tiling data就搬移至device侧。
  • 在kernel任务下发至device侧时,同时启动tiling data的搬移任务。这样就可以使host侧与device侧的设备并行,在host侧准备下一个kernel的tiling data的时候,device侧同时执行当前kernel任务,从而显著提升了tiling data的搬移效率。

如下图所示,相较于多stream搬移方式,在tiling data搬移速度过快时会导致的device缓存区不足,从而导致tiling data被覆盖,tiling随kernel下发搬移的方式不受两者(tiling data拷贝速度与kernel执行速度)速度的限制,且性能优化也更进一步。
image.png

tiling随kernel下发搬移策略
这种方式下,还是一个异步操作。

疑问:性能上相比多stream搬移方式有提升吗?感觉是是差不多的,主要是不是解决device缓存区不足,从而导致tiling data被覆盖的问题?

参考:

工作原理-进阶专题-Ascend Transformer Boost加速库-领域加速库开发-CANN商用版8.0.RC2.2开发文档-昇腾社区

相关文章
|
存储 C++
深度复杂空间结构运算的逻辑
深度复杂空间结构运算的逻辑
|
1月前
|
存储 缓存 前端开发
ATB算子实现原理解读
本文详细介绍了Ascend Transformer Boost(ATB)加速库中三种类型算子的执行流程及其与CANN中其他算子的区别。文章首先概述了ATB算子的实现步骤,接着深入解析了单算子和图算子的执行流程,包括kernel图构建、输入准备、内存计算、tiling数据处理及任务下发等环节。此外,还探讨了ATB在host侧性能优化上的几种机制,如Tiling Cache、Setup与InferShape复用、Runner Pool等,以及ATB中的内存优化与管理策略。最后,介绍了Context类的功能和作用,包括它如何管理ATB内部的各种公共资源。
|
5月前
|
存储 分布式计算 数据处理
解释弹性分布式数据集(RDD)的概念
【8月更文挑战第13天】
273 4
|
8月前
|
存储 传感器 数据挖掘
什么是流计算?请简要解释其概念和特点。
什么是流计算?请简要解释其概念和特点。
231 0
|
存储 缓存 分布式计算
Spark RDD算子进阶(转换算子、行动算子、缓存、持久化)(下)
Spark RDD算子进阶(转换算子、行动算子、缓存、持久化)(下)
162 0
Spark RDD算子进阶(转换算子、行动算子、缓存、持久化)(下)
|
存储 SQL 分布式计算
分布式图计算如何实现?带你一窥图计算执行计划
分布式图计算如何实现?带你一窥图计算执行计划
分布式图计算如何实现?带你一窥图计算执行计划
|
机器学习/深度学习 存储 人工智能
神经网络算子优化之——算子融合
算子融合,作为神经网络性能优化的一个必要手段,其性能收益是很高的。
|
分布式计算 大数据 数据处理
RDD 算子_分类 | 学习笔记
快速学习 RDD算子_分类
108 0

热门文章

最新文章