10.模型层和算力层
2.1 模型推理框架-nnaces
嘉楠K510芯片中内置有神经网络加速器KPU,其使用的推理框架为nncase。本章节主要介绍nncase是什么?nncase神经网络编译器的功能有哪些?该如何使用nncase神经网络加速器的功能?
下面我们先介绍nncase神经网络编译器的基础概念,nncase是一个为 AI 加速器设计的神经网络编译器, 目前支持的 target有cpu/K210/K510/k230等。nncase提供的功能:
- 支持多输入多输出网络,支持多分支结构
- 静态内存分配,不需要堆内存
- 算子合并和优化
- 支持 float 和uint8/int8量化推理
- 支持训练后量化,使用浮点模型和量化校准集
- 平坦模型,支持零拷贝加载
2.1.1 nncase功能详细介绍
单输入单输出的网络可如下所示:
多输入单输出的网络课如下所示:
多输入多输出的网络如下所示:
多输入多输出的网络它具有多个输入和多个输出。这种网络结构可以处理具有复杂关系的问题,并且能够从多个不同的数据源中学习并提取有用的特征。
在多输入多输出神经网络中,每个输入都可以被视为一个独立的特征,并且每个输出可以对应于一个特定的任务或目标。这种网络结构可以利用多个输入之间的关系来学习更复杂的特征表示,从而更好地处理具有多个相关任务的问题。
多输入多输出神经网络通常由多个神经元组成,这些神经元被组织成不同的层。每个神经元都接收来自其他神经元的输入,并根据其权重和偏差计算输出。这种网络结构可以学习从输入到输出的映射,从而实现对数据的分类、回归或其他任务。
多分支结构通过采用多分支结构,网络能够更好地处理输入的复杂信息,从而实现更准确、更高效的学习和分类。多分支神经网络通常由多个神经元组成,这些神经元被组织成不同的层。每个神经元都接收来自其他神经元的输入,并根据其权重和偏差计算输出。
在图像分类任务中,多分支神经网络可以通过对图像的不同特征进行提取和处理,从而得到更丰富的特征表示。这种网络结构可以学习从输入到输出的映射,从而实现对图像的分类和识别。如下图Fast-SCNN所 示:
静态内存分配在nncase中,静态内存分配主要用于分配模型权重和偏置等静态数据。这些数据在程序执行期间是固定的,不需要在运行时动态分配。通过使用静态内存分配,nncase可以确保这些数据在程序执行期间始终位于固定的内存位置,从而提高了程序的稳定性和可靠性。静态内存分配还可以提高模型的执行效率。由于不需要在运行时动态分配内存,因此可以减少内存分配和释放的开销,从而提高模型的推理速度。
算子合并是深度学习编译器中的一种重要技术,主要用于优化神经网络的计算和内存访问。算子合并的主要目的是减少内存访问,让数据更快地被复用。一般而言,被合并的算子之间需要有数据依赖,才有可能能够起到减少内存访问的效果。
在深度学习编译器中,算子合并技术可以应用于多个场景。例如,可以将多个卷积层和池化层融合为一个大的卷积层,以减少内存访问和计算的开销。也可以将多个卷积层和批归一化层融合为一个大的卷积层,以减少内存访问和计算的开销。此外,还可以将多个卷积层和激活函数层融合为一个大的卷积层,以减少内存访问和计算的开销。
算子优化不仅包括算子合并,还包括其他优化技术。例如,可以使用常量折叠技术将常量值折叠到模型中,以减少模型大小和计算量。也可以使用矩阵化技术将模型中的某些操作转换为矩阵运算,以提高计算效率。此外,还可以使用其他优化技术,如向量化、融合计算等,以进一步提高模型的性能和效率。
**支持float和uint8/int8量化推理:**使用float类型进行推理时,nncase会将输入数据和模型权重都转换为float类型,然后进行推理计算。这种推理方式可以提供较高的精度和灵活性,但同时也需要更多的内存和计算资源。使用uint8或int8类型进行推理时,nncase会将输入数据和模型权重都转换为相应的量化类型,然后进行推理计算。这种推理方式可以减少内存占用和计算资源消耗,但同时也可能会引入一定的精度损失。
**训练后量化,使用浮点模型和量化校准集。**在nncase中,量化校准集用于校准量化模型,以确保量化模型的精度和稳定性。量化校准集通常由一组浮点模型和相应的量化模型组成,用于比较量化模型和浮点模型的性能。在训练后量化过程中,nncase会将浮点模型转换为量化模型,然后使用量化校准集进行校准。通过比较量化模型和浮点模型的性能,可以调整量化模型的参数,以获得更好的精度和稳定性。
量化校准集是指一组用于校准量化模型的浮点模型和相应的量化模型。这些模型在相同的输入数据上运行,并比较其输出结果,以评估量化模型的精度和稳定性。
平坦模型是指将神经网络的模型参数以二进制文件的形式存储,并直接加载到内存中。这种方式可以避免在运行时进行内存分配和拷贝操作,从而提高了程序的执行效率。
零拷贝加载是指将模型参数从磁盘加载到内存时,不需要进行任何数据拷贝操作。这种方式可以减少CPU和内存之间的数据传输开销,进一步提高程序的执行效率。