ATC工具介绍
介绍ATC工具的功能架构以及使用ATC工具过程中遇到的一些术语或者缩略语。
ATC简介
昇腾张量编译器(Ascend Tensor Compiler,简称ATC)是异构计算架构CANN体系下的模型转换工具, 它可以将开源框架的网络模型以及Ascend IR定义的单算子描述文件(json格式)转换为昇腾AI处理器支持的.om格式离线模型。其功能架构如图1所示。
模型转换过程中,ATC会进行算子调度优化、权重数据重排、内存使用优化等具体操作,对原始的深度学习模型进行进一步的调优,从而满足部署场景下的高性能需求,使其能够高效执行在昇腾AI处理器上。
其中:
- 开源框架网络模型场景:
- 单算子描述文件场景:
Ascend IR定义的单算子描述文件(json格式)通过ATC工具进行单算子编译后,转成适配昇腾AI处理器的单算子离线模型,然后上传到板端环境,通过AscendCL接口加载单算子模型文件验证单算子功能,详细流程请参见“单算子调用”章节。
关于单算子描述文件的详细配置说明请参见单算子模型转换章节。
关键概念
概念 |
描述 |
---|---|
GE |
Graph Engine,图引擎,是计算图编译和运行的控制中心,提供图优化、图编译管理以及图执行控制等功能。GE通过统一的图开发接口提供多种AI框架的支持,不同AI框架的计算图可以实现到Ascend图的转换。原图优化时,GE内部会进行整图优化。 |
YUV420SP |
有损图像颜色编码格式,常用为YUV420SP_UV、YUV420SP_VU两种格式。 |
Format |
Format为数据的物理排布格式,定义了解读数据的维度,比如1D、2D、3D、4D、5D等。 |
NCHW和NHWC |
在深度学习框架中,多维数据通过多维数组存储,比如卷积神经网络的特征图(Feature Map)通常用四维数组保存,即4D,4D格式解释如下:
由于数据只能线性存储,因此这四个维度有对应的顺序。不同深度学习框架会按照不同的顺序存储特征图数据,比如Caffe,排列顺序为[Batch, Channels, Height, Width],即NCHW;TensorFlow中,排列顺序为[Batch, Height, Width, Channels],即NHWC。 如下图所示,以一张格式为RGB的图片为例,NCHW中,C排列在外层,每个通道内,像素紧挨在一起,实际存储的是“RRRRRRGGGGGGBBBBBB”,即同一通道的所有像素值顺序存储在一起;而NHWC中C排列在最内层,每个通道内,像素间隔挨在一起,实际存储的则是“RGBRGBRGBRGBRGBRGB”,即多个通道的同一位置的像素值顺序存储在一起。
图2 NCHW和NHWC
![]() |
NC1HWC0 |
昇腾AI处理器中,为了提高通用矩阵乘法(GEMM)运算数据块的访问效率,所有张量数据统一采用NC1HWC0的五维数据格式。 其中C0与微架构强相关,是一个矩阵单元处理单边数据量,一个矩阵单元处理32B * 32B 的数据,单边是32B;例如数据类型为float16(2字节)时,C0=32/2=16,数据类型为float32(4字节)时,C0=32/4=8。 C1=(C+C0-1)/C0,如果结果不整除,向下取整。 NHWC/NCHW -> NC1HWC0的转换过程为:将数据在C维度进行分割,变成C1份NHWC0/NC0HW,再将C1份NHWC0/NC0HW在内存中连续排列成NC1HWC0,其格式转换示意图如下图所示。
图3 NC1HWC0
![]()
|
FRACTAL_Z |
FRACTAL_Z是用于定义卷积权重的数据格式,由FT Matrix(FT:Filter,卷积核)变换得到。FRACTAL_Z是送往Cube的最终数据格式,采用“C1HW,N1,N0,C0”的4维数据排布。 数据有两层Tiling,如下图所示: 第一层与Cube的Size相关,数据按照列的方向连续(小n);第二层与矩阵的Size相关,数据按照行的方向连续(大Z)。 例如:HWCN = (2, 2, 32, 32),将其变成FRACTAL_Z( C1HW, N1, N0, C0 ) = (8, 2, 16, 16)。 HWCN变换FRACTAL_Z的过程为: Tensor.padding([ [0,0], [0,0], [0,(C0–C%C0)%C0], [0,(N0–N%N0)%N0] ]).reshape( [H, W, C1, C0, N1, N0]).transpose( [2, 0, 1, 4, 5, 3] ).reshape( [C1*H*W, N1, N0, C0]) NCHW变换FRACTAL_Z的过程为: Tensor.padding([ [0,(N0–N%N0)%N0], [0,(C0–C%C0)%C0], [0,0], [0,0] ]).reshape( [N1, N0, C1, C0, H, W,]).transpose( [2, 4, 5, 0, 1, 3] ).reshape( [C1*H*W, N1, N0, C0]) |
FRACTAL_NZ |
RACTAL_NZ是分形格式,如Feature Map的数据存储,在cube单元计算时,输出矩阵的数据格式为NW1H1H0W0。整个矩阵被分为(H1*W1)个分形,按照column major排布,形状如N字形;每个分形内部有(H0*W0)个元素,按照row major排布,形状如z字形。考虑到数据排布格式,将NW1H1H0W0数据格式称为Nz(大N小z)格式。其中,H0,W0表示一个分形的大小,示意图如下所示: ND –> FRACTAL_NZ的变换过程为: (..., N,H, W )->pad->(..., N, H1*H0, W1*W0)->reshape->(..., N, H1, H0, W1, W0)->transpose->(..., N, W1, H1, H0, W0) |
知识库 |
知识库是算子调优时,经过上板验证,获得算子真实性能后,存储的调优后的策略,方便后续算子编译中直接使用。 |