2023/04/04 12:51:39
我们知道,TPU中的数据结构是张量,可以看做是一个四维数组,形状为(N,C,H,W)。 要描述一个张量在算能的TPU上是如何排列的,我们首先要知道一个概念。 那是Stride。 它用于衡量同一 NPU 中张量的两个元素之间的距离。 例如,W_Stride 表示张量 n,c,h,w 和 n,c,h,w+1 之间有多少个元素 而H_stride表示从n,c,h,w到n,c,h+1,w我们需要经过的元素个数 同样,我们可以得到C_stride和N_stride在Global memory上的含义。 但是对于local memory,我们可以看到是有所不同的,C_stride指的是从n,c,h,w到 ...
2023/04/04 12:49:13
首先我们来看一下TPU的简要架构。 我们可以从ppt中了解到一个TPU中包含多个NPU(Neuron Processing Unit),主要由一个local memory和多个执行单元组成。前者用于存储要运算的数据,后者是TPU上最小的计算单元。每个NPU一次可以驱动它的所有EU做一个MAC操作。 就整体 TPU 内存而言,它由system memory和local memory组成。 system memory的主要部分是global memory,其实就是一块DDR。 有时根据 TPU 的特殊设计还会有其他组件,但我们不会在视频中提及这些部分,所以现在了解global memory就足够 ...
2022/12/27 12:38:09
使用TPU-MLIR进行模型转换的时候我们会在各个阶段对比模型每一层输出的相似度,以确保模型转换的正确性,同时也能够在适配过程中更方便地定位问题来源。 但我们并不知道转换后的模型精度如何,特别是INT8量化后的模型输出,往往与原模型输出存在较大的区别(当然这个区别是在可接受的范围内的),光靠对比输出的相似度我们并不能看出INT8模型的表现究竟怎么样。所以,TPU-MLIR也提供了精度验证的接口,来检验转换后的模型表现。 在进行精度验证前,首先我们需要准备好用于验证的数据集,因为TPU-MLIR里没有自带完整的测试集,所以用于精度验证的数据集需要大家自行下载,对于分类网络主要使用的是IMAGEN ...
2022/12/14 18:55:32
在对激活进行伪量化前先将激活截断在(0,1)之间, 这样的做法是基于一些经典的网络结构中,比如AlexNet与RestNet中,大部分的激活都会落在这个范围里的。 对于weight,则是先通过这样的一个非线性函数对weight进行映射,tanh(w)将weight的值域缩放到-1到+1之间,再除以2倍的tanh(w)绝对最大值加上1/2最终weight被映射到了0到1之间,再对其进行量化与反量化,再将输出结果通过乘2减1仿射变换到-1到1之间。 这里的quant与dequant操作在原论文中是被表示为一个quantize_k的操作,k指的是k位的量化,其实本质上就和我们之前提到的量 ...
2022/12/14 18:52:59
Hello大家好,在之前的视频中我们的讲解主要集中在训练后量化,也就是PTQ,那么这期视频我们就再来讲一下另一种主要的量化类型,量化感知训练,我们暂且不会涉及到QAT在TPU-MLIR中的应用,只是先停留在理论层面进行一个介绍。 我们在学习PTQ的时候知道了量化其实就是一个寻找合适的量化参数,将高位数据流映射为低位数据流的过程,实现模型轻量化并且提高推理效率,但在这个过程中模型的精度不可避免地会下降。 造成精度下降的原因有很多,其中主要有: 量化误差的引入,就像右边这张信号图所示,我们在量化时做的取整操作其实就是用有限的离散取值去近似无限的连续取值,会不可避免的导致量化后的信号与量化前的信号 ...