---
title: ATC工具介绍
description: "介绍ATC工具的功能架构以及使用ATC工具过程中遇到的一些术语或者缩略语。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/devaids/atctool/atlasatc_16_0005.html
sourcePath: /source/zh/canncommercial/900/devaids/atctool/atlasatc_16_0005.html
indexId: 71ea296786181960cf2cf1ecc73fa2513d9eb3551ce1930789db726f890cecaf67
---
# ATC工具介绍

介绍ATC工具的功能架构以及使用ATC工具过程中遇到的一些术语或者缩略语。

#### ATC简介

昇腾张量编译器（Ascend Tensor Compiler，简称ATC）是异构计算架构CANN体系下的模型转换工具，它可以将开源框架的网络模型以及Ascend IR定义的单算子描述文件（JSON格式）转换为AI处理器支持的.om格式离线模型。其功能架构如图1所示。

模型转换过程中，ATC会进行算子调度优化、权重数据重排、内存使用优化等具体操作，对原始的深度学习模型进行进一步的调优，从而满足部署场景下的高性能需求，使其能够高效执行在AI处理器上。

图1 ATC工具功能架构

其中：

- 开源框架网络模型场景：

  1. 开源框架网络模型经过Parser解析后，转换为中间态IR Graph。
  2. 中间态IR经过图准备、图拆分、图优化、图编译等一系列操作后，转成适配AI处理器的离线模型（此处图指网络模型拓扑图）。
  3. 转换后的离线模型上传到板端环境，通过模型加载接口加载模型文件，再调用模型执行接口实现推理过程，详细流程请参见《应用开发 (C&C++)(https://www.hiascend.com/document/detail/zh/canncommercial/900/programug/acldevg/aclcppdevg_000006.html)》中的“模型推理(https://www.hiascend.comdocument/detail/zh/canncommercial/900/programug/acldevg/aclcppdevg_000025.html)”章节。
- 单算子描述文件场景：
  Ascend IR定义的单算子描述文件（JSON格式）通过ATC工具进行单算子编译后，转成适配AI处理器的单算子离线模型，然后上传到板端环境，通过单算子模型加载接口加载单算子模型文件用于验证单算子功能，详细流程请参见“单算子模型执行(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/ascendgraphapi/aclcppdevg_03_0244.html)”。

  关于单算子描述文件的详细配置说明请参见单算子模型转换章节。


#### 关键概念


**表1 概念介绍**

| 概念 | 描述 |
| --- | --- |
| 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格式解释如下： N：Batch数量，例如图像的数目。 H：Height，特征图高度，即垂直高度方向的像素个数。 W：Width，特征图宽度，即水平宽度方向的像素个数。 C：Channels，特征图通道，例如彩色RGB图像的Channels为3。 由于数据只能线性存储，因此这四个维度有对应的顺序。不同深度学习框架会按照不同的顺序存储特征图数据，比如Caffe，排列顺序为[Batch, Channels, Height, Width]，即NCHW；TensorFlow中，排列顺序为[Batch, Height, Width, Channels]，即NHWC。 如图2所示，以一张格式为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 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] ) |
| 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 | FRACTAL\_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) |
| 知识库 | 知识库是算子调优时，经过上板验证，获得算子真实性能后，存储的调优后的策略，方便后续算子编译中直接使用。 |
