TVM(端到端的优化栈)概述

TVM是一款由陈天奇团队推出的深度学习优化工具,它与NNVM共同构成一套完整的工具链,用于将深度学习模型部署到各种硬件设备上,包括手机、GPU、IOT设备等。TVM通过计算优化层和张量优化层解决深度学习模型在不同硬件上的优化问题,实现了从数据流图到具体硬件指令的高效转化。

陈天奇团队宣布推出 TVM,在微博上表示,「我们今天发布了 TVM,和 NNVM 一起组成深度学习到各种硬件的完整优化工具链,支持手机,cuda, opencl, metal, javascript 以及其它各种后端。欢迎对于深度学习,编译原理,高性能计算,硬件加速有兴趣的同学一起加入 dmlc 推动领导开源项目社区 。」

大多数现有系统针对窄范围的服务器级 GPU 进行优化,且需要在包括手机、IOT 设备及专用加速器上部署大量工作。而 TVM 是一种将深度学习工作负载部署到硬件的端到端 IR(中间表示)堆栈。也就是说,这类解决方案能够把深度学习模型分发到各种硬件设备上、实现端到端的调优。


引子

众所周知,当前的深度学习框架基于数据流图(如tensorflow等),这种方法过于高层。并不适合硬件界别的设备执行。如下图所示:
在这里插入图片描述

TVM 旨在分离算法描述、调度(Schedule)和硬件接口。

首先,为了设计出适合深度学习的优化编译器,我们需要解决四大挑战:

  • 高级数据流重写:如今不同的硬件设备有不同的存储体系,所以设计出好的策略来将数据运算与优化数据布局进行融合是很重要的。
  • 跨线程极内存共享与协作:传统的无共享嵌套并行模型不再是最佳模型。优化内核需要对加载的共享内存的线程进行协作。
  • 内部函数的张量化:The latest hardware provides new instructions that go beyond vector operations, like the GEMM operator in the TPU or the tensor core in NVIDIA’s Volta. Consequently, the scheduling procedure must break computation into tensor arithmetic intrinsics instead of scalar or vector code.
  • 内存访问延迟、进程(线程)调度的问题:尽量减少延迟是一大挑战。

为了解决上述挑战,TVM设计了两种层级结构:

  • 计算优化层(computation graph optimization layer)来解决第一个问题。
  • 张量优化层(tensor optimization layer)使用全新的调度基元来解决剩下的三个问题。

通过 TVM ,我们可以用大多数深度学习框架构建出相应的模型——既能顾及到高层次的语言表述,又能兼顾底层的优化(如GPU等)。
下面分别介绍两种层级。

计算图优化层(Optimizing Computational Graphs)

首先我们先看一下Optimizing Computational Graphs的总体实现方法,如下图所示:
在这里插入图片描述
可以看出传统的计算流图在此处大体被分成两部分:Operator Fusion、Data Layout Transformation。

Operator Fusion

这个较好理解,其实就是把运算进行了混合,压缩或者简化了原本的计算流程,这种融合过程可用于预先计算图形中可静态确定的部分,从而节省执行成本。TVM 提出了四种融合方式:

  • 单射的:injective (one-to-one map)
  • 降维的:reduction
  • 复杂可利用的:omplex-out-fusable (can fuse element-wise map to output)
  • 不可利用的:opaque (cannot be fused)
    在这里插入图片描述
Data Layout Transformation

这个功能个人理解应为数据的重构,从而改变存储方式,进而优化访问区域。如下图所示。
在这里插入图片描述
优化数据布局(Data Layout Transformation)首先指定每个运算符的首选数据布局(数据的shape),因为这些限制决定了它们在硬件中的实现。然后,如果生产者和使用者的数据布局不匹配,我们会在它们之间执行正确的布局转换。
但是,在图层级的优化方式是有局限性的(因为算法运行的效率很大程度上取决于机器提供的编码或指令集)。事实上,这种数据布局方式会随着数据的类型、硬件加速器种类等而变得不稳定,所以 TVM 又提出来了一种代码自动生成策略。

张量优化层(tensor optimization layer)

这个层级结构实际上是针对各种硬件后端生成了同一种运算符的微调版本,即对其中的张量运算进行了相关优化。

Tensor Expression Language

首先,TVM 提出了一种张量的描述语言,用来描述各类算法。如图所示:
在这里插入图片描述
这种张量描述语言支持各类常见运算。TVM 显式引入交换缩减运算符,以便跨多个线程轻松安排交换性缩减。

Schedule Space

TVM提出 Schedules 的概念,指的是一种将计算描述(张量运算)降低到后端(底层)优化实现的特定规则。这也是TVM实现的核心。

其理念是对 Schedules 空间和用于遍历此空间的转换进行建模,从而提供生成低级代码的不同方法。TVM的 Schedules 空间如图所示:
在这里插入图片描述

The dataflow representation provides an expression specifying the computation of each tensor element. The axis relation hyper-graph defines a bijective relation between the original loop axis and the transformed loop axis. The schedule tree represents the loop nest structure and producer store location of the computing structure. The schedule tree representation is derived from Halide, with a special emphasis on store location relation. Together, the dataflow representation, axis relation graph, and schedule tree describe a schedule that can be lowered to the code shown in the rightmost panel.

其实这种实现方法是从 Halide 这门语言为源头开发的,TVM 提出了一种新的语言来处理GPU等硬件加速设备所提出的挑战。
同时,为了加速我们在Schedule Space中遍历的速度,TVM提出了Schedule基元:
在这里插入图片描述

### ONNX 模型压缩的方法和技术 #### 压缩方法概述 对于ONNX模型而言,其压缩主要通过量化、剪枝以及结构化简化等方式实现。这些手段旨在减少模型参数量和计算复杂度的同时保持尽可能高的精度。 #### 主要工具介绍 ##### PocketFlow [^2] 作为一款高效的自动化机器学习平台,PocketFlow提供了丰富的特性来帮助用户轻松完成神经网络模型的训练与部署,其中包括但不限于对ONNX格式的支持;该框架内置了先进的算法用于权重量化及通道级稀疏化处理. ##### Distiller Distiller是一个开源库,专注于研究并应用各种深度学习模型优化策略.Distiller能够很好地兼容ONNX标准定义下的文件交换格式,允许开发者利用此工具来进行复杂的模型架构调整工作,比如卷积层滤波器裁剪等操作. ##### TVM [^2] Apache TVM是一款端到端编译,可自动调优硬件后端上的张量程序.TVM不仅支持常见的PyTorch,TensorFlow导出至ONNX的过程,而且具备出色的性能表现特别是在移动设备或者嵌入式平台上运行经过高度定制化的轻量化版本AI应用程序方面有着独特的优势. ##### TFLite [^2] 虽然最初是为了 TensorFlow 而创建,但是由于遵循开放的标准,TFLite同样可以接受来自其他源头(如Keras 或者 Pytorch)经由ONNX中间表示法转换后的产物.借助于微调机制,TFLite能够在不影响预测效果的前提下大幅削减资源占用率. ##### MNN 阿里巴巴推出的移动端高性能推理引擎-MNN也加入了对ONNX输入输出接口的支持.MNN内部实现了多维度的数据类型映射方案,从而确保各类异构算子之间平滑衔接;与此同时还集成了诸如权重共享之类的高级特性进一步促进整体效率提升. ##### OpenVINO Intel出品的视觉加速软件套件-OpenVINO特别适合那些希望快速将计算机视觉解决方案推向市场的团队.OpenVINO可以直接读取符合ONNX规范描述的人工智能组件,并通过集成的一系列预处理器和后处理器模块辅助客户更便捷地实施业务逻辑层面的任务. ```python import onnx from onnx import optimizer # 加载原始模型 original_model = onnx.load("path_to_your.onnx") # 应用一系列优化传递 optimized_model = optimizer.optimize(original_model) # 保存优化后的模型 onnx.save(optimized_model, "path_to_optimized.onnx") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangbowj123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值