华为算子中的数据排布格式(Format)指的是张量在内存中的物理存储顺序和读取方式,它定义了多维数据(如特征图或权重)的维度排列,以优化硬件计算效率。
具体来说:
- 基本定义:Format决定了数据在内存中的线性排布,例如支持1D、2D、3D、4D或5D等多维格式,常见于深度学习算子(如卷积、全连接)的输入/输出处理。
- 常见格式示例:在华为昇腾AI处理器(如CANN框架)中,典型的数据排布格式包括:
- NCHW:批量大小(N)、通道数(C)、高度(H)、宽度(W),常用于Caffe等框架。
- NHWC:批量大小(N)、高度(H)、宽度(W)、通道数(C),常见于TensorFlow。
- NC1HWC0、FRACTAL_Z、FRACTAL_NZ:华为自研的优化格式,针对达芬奇架构硬件进行数据分块和重排,以提升内存访问效率和计算吞吐量。
- 作用与重要性:正确的Format选择能减少内存碎片、加速数据搬运,并适配算子融合(如Conv+ReLU融合),从而提升模型推理性能。 在算子开发中,Format需与硬件指令集匹配,例如昇腾AI处理器通过FRACTAL格式对数据进行Z型分块,以优化缓存利用率。
开发者需根据算子类型和硬件特性指定Format,华为CANN工具链提供了自动格式转换和优化功能,以简化开发流程。
NC1HWC0
Kirin AI处理器中,为了提高通用矩阵乘法(GEMM)运算数据块的访问效率,所有张量数据统一采用NC1HWC0的五维数据格式。其中C0与微架构强相关,等于AI Core中矩阵计算单元的大小。
C1=(C+C0-1)/C0。如果结果不整除,向上取整。
NHWC/NCHW -> NC1HWC0的转换过程为:将数据在C维度进行分割,变成C1份NHWC0/NC0HW,再将C1份NHWC0/NC0HW在内存中连续排列成NC1HWC0,其格式转换示意图如下图所示。
NHWC -> NC1HWC0的转换公式如下。
Tensor.reshape([N,H,W,C1,C0]).transpose([0,3,1,2,4])NCHW -> NC1HWC0的转换公式如下。
Tensor.reshape([N,C1,C0,H,W]).transpose([0,1,3,4,2])在昇腾AI处理器中,为了提高数据的访问效率,张量数据采用NC1HWC0的五维格式。其中C0与微架构强相关,等于AI Core中矩阵计算单元的大小,这部分数据需要连续存储;C1是将C维度按照C0进行拆分后的数目,即C1=C/C0。如果不整除,最后一份数据需要补齐以对齐C0。
AI 编译器布局转换算法
首先,我们转换数据布局的目的是将将内部数据布局转化为后端设备(硬件)友好的形式,我们需要做的是尝试找到在计算图中存储张量的最佳数据布局,然后将布局转换节点插入到图中。
但其中有个需要十分注意的地方,布局转换也是需要很大的开销的,一旦涉及布局转换,就会有 I/O 操作,其产生的代价能否比的上数据格式转换后带来的性能优化也是需要我们重点考虑的部分。
具体地来说,比如 NCHW 格式操作在 GPU 上通常运行得更快,所以在 GPU 上转换为 NCHW 格式是较为有效的操作。
一些 AI 编译器依赖于特定于硬件的库来实现更高的性能,而这些库可能需要特定的布局,比如华为昇腾的 AI 编译器就依赖于 CANN 库,其中的特定布局我们在上文中已经提到。
同时也有许多设备需要配备异构计算单元,比如手机,其 SOC 中有丰富的 IP,arm 端侧的 GPU 还有 ISP 以及 DPU 等一系列不同计算单元。不同的单元可能需要不同的数据布局以更好地利用数据,这就需要 AI 编译器提供一种跨各种硬件执行布局转换的方法。
下面我们来看看数据转换具体是如何操作的。如下图所示,这两个都是数据转换的算子,数据转换我们在这里用 CASTDATA 算子来表示,左侧输入的数据格式为 NHWC,输出的数据格式为 NCHW,那么就需要一个数据转换算子节点来将数据格式由 NHWC 转换为 NCHW,右侧则相反过来,此处不再赘述。
华为CANN算子开发的核心在于张量结构理解 + 数据排布优化。从基础的张量形状和轴,到高阶分形格式及卷积权重格式,每一种设计都是为了充分利用AI Core硬件的并行计算能力。在实际开发中:
- 理解张量的shape和axis有助于正确实现算子逻辑
- 熟悉数据排布格式能够有效优化内存访问
- 分形格式(NZ、ZZ、ZN、Z)和卷积权重格式(NC1HWC0、FRACTAL_Z_3D)是高性能计算的关键
- Matmul高阶API格式则保证了复杂矩阵乘运算在多场景下的高效执行
昇腾训练营报名链接:
https://www.hiascend.com/developer/activities/cann20252#cann-camp-2502-intro
训练营简介:2025年昇腾CANN训练营第二季,基于CANN开源开放全场景,推出0基础入门系列、码力全开特辑、开发者案例等专题课程,助力不同阶段开发者快速提升算子开发技能。获得Ascend C算子中级认证,即可领取精美证书,完成社区任务更有机会赢取华为手机,平板、开发板等大奖