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

相关文章
|
11月前
|
机器学习/深度学习 人工智能 API
如何在c++侧编译运行一个aclnn(AOL)算子?
CANN的AOL库提供了一系列高性能算子API,优化了昇腾AI处理器的调用流程。通过两段式接口设计,开发者可以高效地调用算子库API,实现模型创新与应用,提升开发效率和模型性能。示例中展示了如何使用`aclnnAdd`算子,包括环境初始化、算子调用及结果处理等步骤。
|
11月前
|
人工智能 算法 PyTorch
ATB是什么?
ATB加速库专为华为Ascend AI处理器设计,针对Transformer模型的训练和推理进行了深度优化。它通过算法、硬件和软件层面的优化,大幅提升模型性能,降低能耗与成本。ATB支持PyTorch、MindSpore等多种框架,提供高效的基础算子及图算子技术,适用于各种应用场景。其软件架构主要包括基础Operation、Plugin机制和Graph Frame三部分,通过优化算子计算和数据传输,实现性能的显著提升。
|
7月前
|
容器
vllm+vllm-ascend本地部署QwQ-32B
本指南介绍如何下载、安装和启动基于Ascend的vLLM模型。首先,可通过华为镜像或Hugging Face下载预训练模型;其次,安装vllm-ascend,支持通过基础镜像(如`quay.io/ascend/vllm-ascend:v0.7.3-dev`)或源码编译方式完成;最后,使用OpenAI兼容接口启动模型,例如运行`vllm serve`命令,设置模型路径、并行规模等参数。适用于大模型推理场景,需注意显存需求(如QwQ-32B需70G以上)。
3082 17
|
11月前
|
机器学习/深度学习 存储 并行计算
Ascend上的PageAttention
PageAttention旨在解决大型语言模型(LLM)服务中的内存管理低效问题,如内存碎片化、利用率低及缺乏灵活的内存共享机制。通过借鉴操作系统中的虚拟内存和分页技术,PageAttention实现了块级别的内存管理和灵活的KV cache共享机制,显著提高内存利用率,降低延迟,提升模型处理速度和性能。相比传统注意力机制,PageAttention通过分段处理序列,有效解决了长序列处理时的计算效率低下和内存过度使用问题。
|
8月前
|
PyTorch 编译器 算法框架/工具
NPU上如何使能pytorch图模式
本文介绍了PyTorch的`torch.compile`技术和TorchAir的相关内容。`torch.compile`通过将动态图转换为静态图并结合JIT编译,提升模型推理和训练效率。示例代码展示了如何使用`torch.compile`优化模型。TorchAir是昇腾为PyTorch提供的图模式扩展库,支持在昇腾设备上进行高效训练和推理。它基于Dynamo特性,将计算图转换为Ascend IR,并通过图引擎优化执行。文章还提供了TorchAir的使用示例及功能配置方法。
|
8月前
|
并行计算 开发工具 git
NPU上运行onnxruntime
在Ascend环境下使用onnxruntime推理时,若安装了GPU版本的onnxruntime(`onnxruntime-gpu`),可能会因缺少CUDA组件报错。正确做法是卸载`onnxruntime-gpu`,并根据官方文档适配NPU,通过源码构建支持CANN的onnxruntime whl包。具体步骤为克隆onnxruntime源码,使用`--use_cann`参数构建,并安装生成的whl包。最后,配置CANNExecutionProvider进行推理。
1296 10
|
11月前
|
存储 缓存 前端开发
ATB算子实现原理解读
本文详细介绍了Ascend Transformer Boost(ATB)加速库中三种类型算子的执行流程及其与CANN中其他算子的区别。文章首先概述了ATB算子的实现步骤,接着深入解析了单算子和图算子的执行流程,包括kernel图构建、输入准备、内存计算、tiling数据处理及任务下发等环节。此外,还探讨了ATB在host侧性能优化上的几种机制,如Tiling Cache、Setup与InferShape复用、Runner Pool等,以及ATB中的内存优化与管理策略。最后,介绍了Context类的功能和作用,包括它如何管理ATB内部的各种公共资源。
|
11月前
|
人工智能 算法 编译器
AscendC从入门到精通系列(一)初步感知AscendC
Ascend C是CANN推出的一种编程语言,专为算子开发设计,支持C/C++标准,旨在提高开发效率与运行性能。通过Ascend C,开发者能在昇腾AI处理器上高效实现自定义算法。本文档介绍了如何使用Ascend C编写和运行一个简单的“Hello World”程序,包括核函数的编写、主程序调用及CMake配置,展示了Ascend C的基本使用流程。
|
11月前
|
存储 人工智能 JSON
AscendC从入门到精通系列(三)基于自定义算子工程开发AscendC算子
本文介绍了基于Ascend C的自定义算子开发流程,涵盖从工程创建、代码编写、编译部署到运行验证的全过程。以动态shape的AddCustom算子为例,详细描述了如何利用CANN提供的工具msOpGen生成开发工程,实现算子核函数与host侧代码,以及如何编译、部署和测试自定义算子。
|
11月前
|
存储 缓存 人工智能
Ascend上的FlashAttention实现
FlashAttention是优化Transformer模型计算效率和内存使用的技术,通过减少存储访问开销提升性能。它采用Tiling、Recomputation、分块SoftMax等策略,减少HBM访问,加速计算,并在昇腾AI处理器上实现了显著的性能提升。

热门文章

最新文章