知识蒸馏(一)概述
1.介绍 知识蒸馏,近年来越来越受到研究界的关注。大型深度神经网络取得了显著的成功,特别是在大规模数据的真实场景中,因为当考虑新数据时,过度参数化提高了泛化性能。然而,由于移动设备的算力和存储受限,在这些设备中部署DNN模型是一个巨大的挑战。为了解决这个问题,Bucilua等人(2006)首次提出了模型压缩,将信息从大模型或集成模型转移到训练的小模型中,并且不会显著导致精度下降。从大模型中学习小模型的方法后来作为知识蒸馏正式推广。
在知识蒸馏中,小型学生模型通常由大型教师模型监督。其主要思想是:学生模型模仿教师模型,并获得近似甚至更优越的性能表现。关键问题是如何将大教师模型转移到小的学生模型上。知识蒸馏系统基本由三个关键部分组成:知识、蒸馏算法、教师-学生结构。其一般框架如下:
2.知识 将知识分为三种形式:基于响应的(response-based)、基于特征的(feature-based)、基于关系的(relation-based)。
2.1 基于响应的知识(response-based) 基于响应的知识通常指教师模型最后一个输出层的神经响应。其 ...
TVM第三方论文调研(二):KunlunTVM,昆仑芯片的TVM编译器扩展
论文信息出处:J. Zeng, M. Kou, and H. Yao, “KunlunTVM: A Compilation Framework for Kunlun Chip Supporting Both Training and Inference,” in Proceedings of the Great Lakes Symposium on VLSI 2022, Irvine CA USA, Jun. 2022, pp. 299–304. doi: 10.1145/3526241.3530316.
简介:为昆仑芯片开发的端到端编译器,基于TVM扩展,名为KunlunTVM,支持在昆仑芯片上的训练和推理任务。该方法针对不同后端的TVM框架是通用且可扩展的,可以借鉴其设计思路,学习如何为新后端添加编译器工具链。
主要贡献:
在昆仑芯片上的基于TVM的端到端编译器,可支持各种现代神经网络模型
训练计算图优化策略,旨在提高训练性能
专用的内存管理算法,针对昆仑芯片的分层存储提升了内存分配和访问性能
KunlunTVM概述
前端:
1.直接采用relay生成的反向传播计算图存在冗余算 ...
TVM第三方论文调研(三) BYOC,将自己的硬件加速器对接深度学习编译器
论文信息论文出处:Z. Chen et al., “Bring Your Own Codegen to Deep Learning Compiler.” arXiv, May 03, 2021. Accessed: Jun. 27, 2022. [Online]. Available: http://arxiv.org/abs/2105.03215
Motivation:深度学习加速器需要编译栈来将模型映射到指令集,如果每个加速器供应商都开发一个专用深度学习编译堆栈,无疑会带来巨大的成本,也无法利用现存的基础设施。该文提出了一个框架,允许用户重用现有的编译器中尽可能多的组件,只专注于专有的代码生成工具的开发。
主要贡献:
提出了一个统一的框架,允许不同的硬件加速器供应商通过以即插即用的方式集成他们的代码工具,复用尽可能多的硬件无关的优化
为开发人员提供了灵活的接口,以便1)对计算图进行标注和分区;2)对分区图应用特定于硬件的优化
平均2000行代码的集成方法的案例研究
另外,TVM文档中有该框架的教程,关键字即论文题目
框架设计与实现编译流程如下:
白色的部分是深度学习编译器已有 ...
TVM设计与架构:Relay Pass,深度学习编译器的高层次优化在做什么
pass的作用pass是编译器中用来对程序进行优化或分析的步骤,一个程序通常要经过多个pass,每个pass也可能执行多遍。关于TVM中的pass机制,请参考TVM的官方文档:
https://tvm.apache.org/docs/arch/pass_infra.htmltvm.apache.org/docs/arch/pass_infra.html
本文粗略统计了Relay高层次pass,主要想搞明白在高层次计算图优化中,编译器都做了哪些事。
关于pass执行前后程序的变化,可以参考relay的测试文件夹,文中示例均来自tvm/tests/python/relay/ ,由于精力有限,我只选取个别进行了输入输出的对比。
pass统计DeadCodeElimination
名称
中文名
作用
备注
DeadCodeElimination
死节点消除
删除未被使用到的表达式
实现在tvm/src/relay/transforms/dead_code.cc
实现流程应该是用UsageVisitor遍历每个节点,计数每个节点被用到的次数,当其为0时,在Eliminato ...
BatchNorm与LayerNorm的部署优化加速
两者的计算方式相同,区别在计算的维度和统计数据是否可以离线获得。
BatchNorm使用Batch维度参与了均值和方差的计算。训练时,BatchNorm会根据训练数据更新统计值;在推理时,方差、均值、 γ 和 β 都是固定的参数。这导致训练和推理时行为的不匹配,但是给推理时优化带来了机会。BatchNorm一般用在一个Conv2d操作之后,对于这种矩阵计算,固定的参数可以在编译器优化时将其提前融合进权重(守夜人:TVM设计与架构:Relay Pass,深度学习编译器的高层次优化在做什么)。nn.BatchNorm2d(num_features)中的num_features一般是输入数据的第二维(假设输入数据的维度为(N,num_features, H, W)),一层BatchNorm2d的γ 和 β数量等于num_features。在计算方差和均值时,将除了轴num_features以外的所有轴的元素放一起,取均值和方差后,乘以对应的γ 和 β(共享)。
LayerNorm一般用特征的最后一维计算方差和均值。在训练时只对 γ 和 β 进行统计;推理时只有 γ 和 β是提前已知的,方 ...
代码实践:向TVM新增算子
纸上得来终觉浅,绝知此事要躬行。参考TVM文档向Relay添加新算子( TVM对应文档:https://tvm.apache.org/docs/dev/how_to/relay_add_op.html),文档中省去了许多细节,在本文中将实践向Relay添加新算子,并将细节一一列出,给出涉及的文件地址、新增代码、测试脚本。
算子定义LayerNorm由于其推理时在线计算均值和方差的特性,使得其运行时开销较大(LayerNorm计算特性和部署优化: https://zhuanlan.zhihu.com/p/587092648)。为了减小开销,其中一种方法是采用新的归一化方法替代LayerNorm。RMSNorm就是一个可行的研究工作。
RMSNorm论文:Zhang B, Sennrich R. Root mean square layer normalization[J]. Advances in Neural Information Processing Systems, 2019, 32
对LayerNorm成功的一个著名的解释是它的重新定心和重新缩放的不变性。前者使模型对输入和权值 ...
调试TVM:在Python与C++混合编程中启动调试
TVM是Python与C++混合编程,通常在Python层提供相关接口,在C++层进行具体实现,兼具灵活与性能。C++代码被编译为动态链接库,在运行时调用。这样给调试带来了不方便,想要调试C++代码就不能通过直接打断点的方式,需要有特殊的处理。本文分享在TVM与VTA的FSIM之间进行python和C++混合调试的方法(其他组件也一样的步骤),使用Vscode实现,亲测有效,整个配置时间大概1小时左右。
编译debug版本的TVM注意:这里编译之类操作不要在Vscode的终端下操作,直接在Linux的终端下操作,否则安装了一些奇怪的插件后,Vscode在编译时自做主张加东西,可能导致之后的配置失败。
首先删除build目录下除config.cmake以外的所有文件及文件夹。
config.cmake设置以下两个选项,其他默认不变。(本文的目的是调试VTA的FSIM,如果有其他需要,打开对应开关即可,后续步骤通用)
set(USE_LLVM ON) #启用LLVM,如果没安装LLVM需要安装,参照下文set(USE_VTA_FSIM ON) #启用VTA的快速仿真器
在tvm/buil ...