• 全文翻译(三) TVM An Automated End-to-End Optimizing Compiler


    全文翻译(三) TVM An Automated End-to-End Optimizing Compiler

    5. 自动化优化

    考虑到一组丰富的调度原语,剩下的问题是为DL模型的每一层,找到最佳的算子实现。在这里,TVM为与每个层关联的特定输入shape和布局,创建一个专门的算子。这种专门化提供了显著的性能优势(与针对较小shape和布局多样性的手工代码相比),但也带来了自动化挑战。系统需要选择调度优化,如修改循环排序或优化内存层次结构,以及调度特定参数,如平铺大小和循环展开系数。

    这样的组合选择为每个硬件后端的算子实现,构建了一个巨大的搜索空间。为了应对这一挑战,构建了一个自动化的进度优化器,有两个主要组件:一个是提出有前途的新配置的调度管理器,另一个是预测给定配置性能的机器学习成本模型。本节描述了这些组件和TVM的自动优化流程(图11)。

    5.1调度空间规格

    构建了一个调度模板规范API,让开发人员在调度空间中声明knobs。模板规范允许在指定可能的调度时,根据需要结合开发人员的领域特定知识。还为每个硬件后端,创建了一个通用主模板,该模板根据使用张量表达式语言表示的计算描述,自动提取可能的knobs。在高层次上,希望考虑尽可能多的配置,让优化器管理选择负载。因此,优化器必须搜索数十亿种可能的配置,查找实验中使用的真实世界DL工作负载。

    5.2 基于ML的成本模型

    从大型配置空间中,通过黑盒优化,即自动调整,找到最佳调度的一种方法。此方法用于调整高性能计算库。然而,自动调整需要许多实验,确定良好的配置。

     

     Figure 11: Overview of automated optimization framework. A schedule explorer examines the schedule space using an ML-based cost model and chooses experiments to run on a distributed device cluster via RPC. To improve its predictive power, the ML model is updated periodically using collected data recorded in a database.

    另一种方法是建立一个预定义的成本模型,指导对特定硬件后端的搜索,不是运行所有的可能性,测量性能。理想情况下,一个完美的成本模型,会考虑影响性能的所有因素:内存访问模式,数据重用,管道依赖性和线程连接模式等。不幸的是,由于现代硬件越来越复杂,这种方法很麻烦。此外,每个新的硬件目标,都需要一个新的(预定义的)成本模型。

     

     Table 1: Comparison of automation methods. Model bias refers to inaccuracy due to modeling.

    相反,采用统计方法,解决成本建模问题。在这种方法中,调度资源管理器提出的配置,可能会提高算子的性能。对于每个调度配置,使用一个ML模型,该模型将降低的循环程序作为输入,预测在给定硬件后端上的运行时间。该模型使用搜索期间收集的运行时,测量数据进行训练,不需要用户输入详细的硬件信息。在优化过程中,随着探索更多配置,会定期更新模型,提高准确性。

    对于其它相关的工作负载也是如此。通过这种方式,ML模型的质量随着更多的实验提高。表1总结了自动化方法之间的主要差异。基于ML的成本模型,在自动调整和预定义的成本建模间,取得了平衡,可以从相关工作负载的历史性能数据中获益。

    机器学习模型设计选择。必须考虑两个关键因素,选择调度管理器,将使用的ML模型:质量和速度。

     

    Figure 12: Comparison of different automation methods for a conv2d operator in ResNet-18 on TITAN X. The ML-based model starts with no training data and uses

    the collected data to improve itself. The Y-axis is the speedup relative to cuDNN. We observe a similar trend for other workloads.

     

     Figure 13: Example workflflow of ML cost models. XGBoost predicts costs based on loop program features. TreeRNN directly summarizes the AST.

    schedule explorer经常查询成本模型,由于模型预测时间和模型重新安装时间产生开销。为了发挥作用,这些开销必须小于在实际硬件上,测量性能所需的时间,根据具体的工作负载/硬件目标,实际硬件上的性能可以达到秒级。这种速度要求将问题与传统的超参数调优问题区分,在超参数调优问题中,执行测量的成本,相对于模型开销非常高,可以使用更昂贵的模型。除了选择模型外,需要选择一个目标函数训练模型,如配置的预测运行时间中的误差。

    由于资源管理器,仅根据预测的相对顺序(A的运行速度比B快),选择排名靠前的候选对象,因此不需要直接预测绝对执行时间。相反,使用排名目标,预测运行时成本的相对顺序。

    在ML Optimizer中实现了几种类型的模型。采用了一个梯度树推进模型(基于XGBoost),该模型根据从循环程序中提取的特征进行预测;这些特性包括每个循环级别上,每个内存缓冲区的内存访问计数和重用率,以及循环注释的一次热编码,如“矢量化”,“展开”和“并行”。评估了一个神经网络模型,该模型使用TreeRNN,在无需特性工程的情况下,评测循环程序的AST。图13总结了成本模型的工作流程。发现treeboosting和TreeRNN具有相似的预测质量。然而,前者的预测速度是后者的两倍,训练时间也少得多。因此,在实验中选择了梯度树推进作为默认的成本模型。尽管如此,相信这两种方法都是有价值的,期望今后对这个问题进行更多的研究。

    平均而言,树推进模型的预测时间为0.67毫秒,比实际测量快数千倍。图12比较了基于ML的优化器和blackbox自动调优方法;前者发现更好的配置比后者快得多。

    5.3进度计划

    一旦选择了一个成本模型,就可以选择有希望的配置,在这些配置上迭代地运行真正的度量。在每次迭代中,浏览器使用ML模型的预测,选择一批候选对象,在这些候选对象上运行度量。然后将收集的数据,用作更新模型的训练数据。如果不存在初始训练数据,资源管理器会随机挑选候选对象进行测量。

    最简单的探索算法,通过成本模型枚举,运行每个配置,选择前k名预测执行者。然而,这种策略在较大的搜索空间中,变得难以处理。

     相反,运行了一个并行模拟退火算法。资源管理器从随机配置开始,在每一步中,都会随机转到附近的配置。如果成本模型预测的成本降低,转换是成功的。如果目标配置成本较高,可能会失败(拒绝)。随机游动倾向于收敛于具有较低速度的配置成本模型预测的成本。搜索状态在成本模型更新期间持续存在;从这些更新之后的最后一个配置继续。

     5.4分布式设备池和RPC

    分布式设备池可扩展硬件测试的运行,在多个优化作业之间,实现细粒度资源共享。TVM实现了一个定制的,基于RPC的分布式设备池,使客户端能够在特定类型的设备上运行程序。可以使用此接口,在主机编译器上编译程序,请求远程设备,远程运行函数,在主机上访问相同脚本中的结果。TVM的RPC支持动态上载,使用运行时约定运行交叉编译的模块和函数。因此,相同的基础结构,可以执行单个工作负载优化和端到端图Inference。这种方法自动化了跨多个设备的编译,运行和配置步骤。

     

     Table 2: Confifigurations of all conv2d operators in ResNet-18 and all depthwise conv2d operators in MobileNet used in the single kernel experiments. H/W denotes height and width, IC input channels, OC output channels, K kernel size, and S stride size. All ops use “SAME” padding. All depthwise conv2d operations have channel multipliers of 1.

    这种基础架构对于嵌入式设备尤其重要,因为传统上,嵌入式设备需要进行繁琐的手动交叉编译,代码部署和测量。

    6.评价

    TVM核心是用C++实现的(∼50k LoC)。提供Python和Java的语言绑定。本文前面的部分评估了TVM的几个独立优化和组件的影响,即,图4中的算子融合,图10中的延迟隐藏,以及图12中基于ML的成本模型。

    现在重点关注端到端评估,旨在回答以下问题:

    •TVM能否在多个平台上优化DL工作负载?

    •TVM与每个后端上现有的DL frame works(依赖高度优化的库)相比如何?

    •TVM能否支持新出现的DL工作负载(例如,深度卷积,低精度算子)?

    •TVM能否支持优化新的专用加速器?

    为了回答这些问题,在四种平台上评估了TVM:

    1) 服务器级GPU

    2) 嵌入式GPU

    3) 嵌入式CPU

    4) 在低功耗FPGA SoC上实现的DL加速计。

     

     Figure 14: GPU end-to-end evaluation for TVM, MXNet, Tensorflflow, and Tensorflflow XLA. Tested on the NVIDIA Titan X.

     基准测试基于现实世界的DL推理工作负载,包括ResNet,MobileNet,LSTM语言模型,深度Q网络(DQN)和深度卷积生成对抗网络(DCGAN)。将方法与现有的DL框架进行比较,包括MxNet和TensorFlow,依赖于高度工程化的,特定于供应商的库。TVM执行端到端的自动优化和代码生成,无需外部算子库。

    6.1 服务器级GPU评估

    首先比较端到端的深度神经网络TVM,MXNet(V1.1),Tensorflow(V1.7)和Tensorflow XLA的NVIDIA TITIX。MXNet和Tensorflow都使用cuDNN v7作为卷积算子;实现了版本的深度卷积,因为相对较新,还没有得到最新库的支持。还使用cuBLAS v8进行矩阵乘法。另一方面,Tensorflow XLA使用JIT编译。

     

     Figure 15: Relative speedup of all conv2d operators in ResNet-18 and all depthwise conv2d operators in MobileNet. Tested on a TITAN X. See Table 2 for operator confifigurations. We also include a weight pretransformed Winograd for 3x3 conv2d (TVM PT).

    14显示,TVM优于基线,由于联合图优化和生成高性能融合算子的自动优化器,其加速比从1.6×到3.8×不等。DQN的3.8倍加速是由于其使用了未经cuDNN优化的非常规算子4×4 conv2d,步长=2);ResNet工作负载更为传统。TVM会在这两种情况下自动找到优化的。

     

     Figure 16: ARM A53 end-to-end evaluation of TVM and TFLite.

    为了评估算子级优化的有效性,还对ResNet和MobileNet中的每个张量算子,进行了细分比较,如图15所示。将TensorComprehension(TC,commit:ef644ba)作为一个额外的基线,是最近引入的自动调优框架。2 TC结果包括在10代×100群体×每个算子2个随机种子中发现的最佳seeds(即每个算子2000次试验)。二维卷积是最重要的DL算子之一,cuDNN进行了大量优化。然而,TVM仍然可以为大多数层,生成更好的GPU内核。深度卷积是一种结构简单的新算子。

    在这种情况下,TVM和TC都可以找到比MXNet手工制作的内核更快的内核。TVM的改进主要归功于,对大调度空间的探索和有效的基于ML的搜索算法。

    6.2嵌入式CPU评估

    ARM Cortex A53(四核1.2GHz)上,评估了TVM的性能。使用Tensorflow Lite(TFLite,commit:7558b085)作为基线系统。

     Figure 17: Relative speedup of all conv2d operators in ResNet-18 and all depthwise conv2d operators in mobilenet. Tested on ARM A53. See Table 2 for the configurations of these operators.

    17将TVM算子ResNet和MobileNet的手工优化算子进行了比较。TVM生成的算子,在两种神经网络工作负载方面,都优于手动优化的TFLite版本。该结果还证明了TVM能够快速优化新兴的张量算子,如深度卷积算子。最后,图16显示了三种工作负载的端到端比较,TVM优于TFLite基线。

    3个超低精度算子,通过为小于8位的定点数据类型,生成高度优化的算子,展示了TVM支持超低精度推理的能力。低精度网络用矢量化位串行乘法,代替昂贵的乘法,矢量化位串行乘法,由按位和pop计数减少组成。实现高效的低精度推理,需要将量化数据类型打包为更广泛的标准数据类型,如int8或int32。

    TVM系统生成的代码性能优于Caffe2的手动优化库。实现了一个特定于ARM的tensorization内核,利用ARM指令构建一个高效,低精度的矩阵向量微内核。然后,使用TVM的自动优化器,搜索调度空间。

     

     Figure 18: Relative speedup of single- and multithreaded low-precision conv2d operators in ResNet. Baseline was a single-threaded, hand-optimized implementation from Caffe2 (commit: 39e07f7). C5, C3 are 1x1 convolutions that have less compute intensity, resulting in less speedup by multi-threading.

     18将TVM与ResNet上的Caffe2超低精度库进行了比较,用于2位激活,1位权重推理。由于基线是单线程的,还将与单线程TVM版本进行比较。

    单线程TVM优于基线,尤其是C5,C8和C11层;这些是内核大小为1×1,步长为2的卷积层,超低精度基线库未对此进行优化。此外,还利用额外的TVM功能,生成一个并行库实现,该实现显示出比基线更好的性能。除了2位+1位配置,TVM可以生成优化基线库不支持的其它精度配置,提高灵活性。

    参考文献:
    TVM An Automated End-to-End Optimizing Compiler
    人工智能芯片与自动驾驶
  • 相关阅读:
    用户画像
    华为离职副总裁徐家骏:年薪千万的工作感悟
    JAVA CAS原理深度分析-转载
    彻底理解ThreadLocal二
    彻底理解ThreadLocal一
    观察者模式(浅谈监听器工作原理)
    Java编程提高性能时需注意的地方
    Spring对Quartz的封装实现简单需注意事项
    FileInputStream和BufferedInputStream的区别
    java
  • 原文地址:https://www.cnblogs.com/wujianming-110117/p/15473795.html
Copyright © 2020-2023  润新知