ATB概念之:算子tiling

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

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开发文档-昇腾社区

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。