当前位置: 首页 > news >正文

福田网站制作设计微信公众营销平台开发

福田网站制作设计,微信公众营销平台开发,上海网站开发方案,开网店需要投资多少钱AI编译器与传统编译器的区别与联系 总结整理自知乎问题 针对神经网络的编译器和传统编译器的区别和联系是什么#xff1f;。 文中提到的答主的知乎主页#xff1a;金雪锋、杨军、蓝色、SunnyCase、贝壳与知了、工藤福尔摩 笔者本人理解 为了不用直接手写机器码#xff0…AI编译器与传统编译器的区别与联系 总结整理自知乎问题 针对神经网络的编译器和传统编译器的区别和联系是什么。 文中提到的答主的知乎主页金雪锋、杨军、蓝色、SunnyCase、贝壳与知了、工藤福尔摩 笔者本人理解 为了不用直接手写机器码我们可以用汇编语言为了不用手写汇编我们开发出了高级语言并用编译器将我们写的高级语言编译成汇编。因此传统编译器主要解决的问题是要降低编程的难度其次是优化程序性能。其输入是高级语言输出是硬件可执行码。 而对于神经网络编译器其输入是一个深度学习模型这里可以看作是一种 DSL输出也是硬件可执行码。即神经网络编译器通常是不需要传统编译器的厚重的前端部分即词法分析、语法分析、语义分析等的其输入直接就是一种描述深度学习模型的IR我们对这个输入进行优化并针对特定的硬件目标生成可执行代码。对于深度学习模型我们设计神经网络编译器主要是为了提高推理时的速度。即神经网络编译器主要解决的问题是要优化模型的推理性能。 另外为了同时前端简单方便地使用 Python 代码和后端对算子进行高效优化神经网络编译器通常采用多层IR的形式。 由于神经网络编译器是近几年才开始大规模发展的领域因此其在设计上会借用一些传统编译器的通用代码优化方式如表达式化简常量折叠等。而更关键的是作为一种专用于深度模型推理的DSL神经网络编译器可以根据AI模型的常见计算范式如矩阵乘法、卷积等做一些更强、更激进的假设有更 domain specific 的优化。 以下是各位知乎大佬的回答 金雪锋 一、神经网络编译器出现的背景和历史 1、早期深度学习框架重点是框架和库与编译器关系相对较弱 比如Tensorflow早期版本在神经网络/深度学习的编程模型上主要进行了graph/图和op/算子两层抽象 图层通过声明式的编程方式然后通过静态图的方式进行执行这里其实也做了一些编译器的事情这里包括硬件无关和硬件相关的优化硬件无关的优化包括编译器通用的优化如表达式化简、常量折叠也包括与深度学习/神经网络强相关的如自动微分等硬件相关的优化包括简单的算子融合、内存分配优化等。算子层通常采用手写的方式比如GPU上基于CUDA/cuDNN。 这种方式遇到几个问题 表达上语法不是Python原生的算法工程师使用的易用性不够好更多的Transform出现比如并行、量化、混合精度等算子粒度和边界提前确定后无法充分发挥硬件的性能硬件厂商提供的算子库也不一定是性能最优的在SIMT和SIMD的架构中scheduling、tilling都是有很大的空间在具体到一个模型shape确定的情况下开发者还有可能开发出性能更高的算子。AI专用芯片出现Google TPU、华为Ascend等3与4的情况加剧。 2、后期引入大量编译器的技术进行改进 表达上的改进(Pytorch/TorchScript、JAX) Pytorch的Eager Model是一种解决易用性的方案虽然基本上还是图层和算子两层的抽象但是整个语法基本上是Python Native的让算法工程师比较容易上手不过这个方案在运行的时候基于Python解释器的能力不是一种高性能的解决方案本身与神经网络的编译器关系不大但是其表达的方式成为后面框架参考的标杆图层的神经网络编译器主要就是考虑如何把这样表达转换到图层的IR进行优化目前主要有两种方式 AST-Based以Pytorch TorchScript为例主要通过Python的修饰符把Python代码的AST拿到然后变换成图层的IR进行编译优化。 Tracing-Based以JAX为例主要把Python代码假执行一遍保存执行序列基于执行序列变换到图层IR进行编译优化。 两种方案各有优缺点第一种方案实现复杂第二种方案在一些处理上有限制(比如控制流的处理)。 性能上的优化(XLA/TVM/TC) 性能上的优化思路其实比较统一就是打开图和算子的边界进行重新组合优化。 XLA基本上的思路是把图层下发的子图中的算子全部打开成小算子然后基于这张小算子组成的子图进行编译优化包括buffer fusion、水平融合等这里的关键是大算子怎样打开、小算子如何重新融合、新的大的算子(kernel)怎样生成整体设计主要通过HLO/LLO/LLVM层层lowering实现所有规则都是手工提前指定。 TVM分为Relay和TVM两层Relay主要关注图层TVM主要关注算子层总体思路与XLA是类似的也是拿到前端给一张子图进行优化Relay关注算子间的融合、TVM关注新的算子和kernel的生成区别在于TVM是一个开放的架构Relay目标是可以接入各种前端TVM也是一个可以独立使用的算子开发和编译的工具基于Halide IR最新演进到自己定义的TIRTVM在算子实现方面采用了compute和schedule分离的方案开发人员通过compute来设计计算的逻辑通过schedule来指定调度优化的逻辑。 TC(Tensor Comprehensions)开发者发现算子的计算逻辑的开发是比较容易的但是schedule的开发非常困难既要了解算法的逻辑又要熟悉硬件的体系架构更重要的是前面提到图算边界打开后小算子融合后会生成新的算子和kernel这些新的算子compute是容易确定的小算子compute的组合但是schedule却很难生成所以传统的方法就是事先定义一大堆schedule模板万一组合的新算子不在模板之内性能就可能比较差甚至出错那TC则希望通过Polyhedra model实现auto schedule降低开发门槛当然这个项目基本已经停更了但是类似的工作在MLIR、MindSpore上还在不停发展。 图层和算子层的IR表达 在神经网络编译器发展过程中有多种IR的出现各有特点 图层IR朴素的DataflowIR、函数式IR、函数式图IR、SSA风格IR 算子层IRHalideIR、LLVM等 图算融合表达MLIR 二、神经网络编译器与传统编译器的联系与区别 1、神经网络编译器与传统编译器的相同点 神经网络编译器和传统编译器一样也是有前端表达、硬件无关优化和硬件相关优化、最后的codegen等整体结构是类似的这一块就不多展开了。 2、神经网络编译器与传统编译器的区别 主要体现在神经网络编译器像数据库的SQL引擎/向量化引擎一样是一个特定领域的编译器这些领域特征包括以Python为主的动态解释器语言的前端、多层IR设计图层/算子层/codegen、面向神经网络的特定优化自动微分、量化/混合精度、大规模并行、张量运算/循环优化等。 编译前端解析 与传统编译器不同神经网络编译器通常不需要lexer/parser而是基于前端语言如Python的AST将模型解析并构造为计算图IR侧重于保留shape、layout等Tensor计算特征信息当然部分编译器还能保留控制流的信息。 这里的难点在于Python是一种灵活度极高的解释执行的语言像弱类型、灵活的数据结构等而神经网络编译器本质上是偏静态两者之间的完全转化是不大可能的。 多层IR设计 为什么需要多层IR设计主要是为了同时满足易用性与高性能这两类需求。为了让开发者使用方便框架前端(图层)会尽量对Tensor计算进行抽象封装开发者只要关注模型和粗粒度OP而在后端算子性能优化时又可以打破算子的边界从更细粒度的循环调度等维度结合不同的硬件特点完成优化。因此多层IR设计无疑是较好的选择。 High-level IR图层IR如XLA的HLOTVM的Relay IR以及MindSpore的MindIR等重点关注非循环相关的优化。除了传统编译器中常见的常量折叠、代数化简、公共子表达式等优化外还会完成Layout转换算子融合等优化通过分析和优化现有网络计算图逻辑对原有计算逻辑进行拆分、重组、融合等操作以减少算子执行间隙的开销并且提升设备计算资源利用率从而实现网络整体执行时间的优化。 Low-level IR如TVM的TIRHalideIR以及isl schedule tree7等。针对Low-level IR主要有循环变换、循环切分等调度相关的优化与硬件intrinsic映射、内存分配等后端pass优化。其中当前的自动调度优化主要包含了基于搜索的自动调度优化如ansor和基于polyhedral编译技术的自动调度优化如TC和MindAKG。 有人可能会问图层和算子层的表达和编译能否放在一起也许可以但是明显看到这样做面临几个挑战 1、整图展开到原子算子看上去编译的规模/复杂度指数级上升 2、显然图编译优化的问题和算子编译优化的问题是有明显的区别一个关注变换和融合另外一个关注循环优化放在一起对编译器实现的复杂度是个比较大的挑战 3、要看到硬件供应商和框架供应商目前是分开的两者总是需要一个边界。 面向神经网络的特定优化 自动微分BP是深度学习/神经网络最有代表的部分目前相对已经比较成熟基于计算图的自动微分、基于Tape和运算符重载的自动微分方案、基于source2source的自动微分都是现在主流的方案。 并行优化随着深度学习的模型规模越来越大模型的并行优化也成为编译优化的一部分包括数据并行、算子级模型并行、Pipeline模型并行、优化器模型并行和重计算等 张量计算/循环优化循环优化其实是一个古老的编译器的难题在高性能计算领域循环优化已经研究了几十年一直没有很好的解决但是看上去深度学习/神经网络领域的问题要简单一点原因是这个领域大量的以Dense的矩阵运算为主不像高性能计算领域那么复杂(大量稀疏/非规则的矩阵和向量运算)这为循环优化带来了很大的空间不过即便是这样自动scheduling、自动tilling、自动向量化这些理想的方案和技术也还远远没有成熟。 量化 /…推理侧常用的一些变换不展开了 三、神经网络编译器未来的方向探讨 编译器形态也许需要两类编译器同时存在一类是面向极致高性能的AOT编译器同时这类编译器对NPU更加友好另外一类是JIT编译器适合与动态图配合 IR形态需不需要MLIR这种统一的形态 自动并行配合Cost model提供自动并行优化的能力 自动Scheduling/Tilling/Tensorizing可能很难全部做到能支持大部分也可以。 杨军 关于AI编译器和传统编译器的区别和联系蓝色的图下图比较形象 从形式上可以理解为是输入和输出的区别。AI编译器的输入是建模的DSL描述(可能是python比如TensorFlow/PyTorch也可能是Lua比如上一代的Torch还可能是Caffe时代的PB描述文件以及如果自己手写一个AI框架的自定义DSL)输出通常是传统编译器的输入LLVM IR也可以视为是广义的传统编译器的输入。传统编译器的输入是传统编程语言描述的代码输出的是硬件可执行码。 透过形式再深究一下背后的东西。AI编译器和传统编译器的优化原理会有很多共通的地方比如: 计算图层面的循环不变量优化(Loop Invariant Node Motion)和高级语言层面的循环不变量优化(Loop Invariant Code Motion)。计算图层面的常量折叠和高级语言层面的常量折叠。计算图层面的peep hole optimization(模板匹配)以及高级语言层面的peep hole optimization。计算图层面的strength reduction优化(比如针对Transformer模型的冗余padding计算消除优化这在LightSeq以及Faster Transformer的开源代码里都可以看到)和高级语言层面的strength reduction优化。将大量计算零碎算子进行fusioncodegen优化以减少AI框架和访存overhead的优化和将多条高级语言指令进行融合减少中间变量的访存操作通过寄存器中转优化目的上是相似的(细节原理上是不同的)还有类似TASO这样的工作等等。 因为本质上都是在一种或多种表达形式上进行变换而变换的目的是为了优化优化的标的可能是性能、显存/内存通信量、功耗等等这就涉及到了在计算图上面结合不同的约束条件进行变换工作了。从这个层面来看能看到大量的传统编译领域技术在AI编译领域的应用只是施加的层次不同。 与此同时也会存在一些细节层面的区别。最大的一个区别我个人认为是AI编译器作为一个domain specific的compiler其实多了不少可以利用这个domain特性使巧劲的地方举几个例子 最近有一些同行比较关注自动分布式并行。自动分布式并行可以在不同层面来进行推进一种方式是在更靠近编译的IR层(比如HLO IR以及TorchScript的IR)来完成自动并行策略的探索。另一种方式是在更靠近建模层的图表示层来做比如TF Graph/JAX Graph/PyTorch NN module。从系统极致角度来考虑前者更为究竟这是我看到G-shard以及MindSpore的作法而从实现的工程量/效果回报速度来看后者更为practical这是我看到Horovod/DeepSpeed/Megatron的作法。 关于算子优化也有不同的作法。一种是通过自动codegen的作法来进行批量化生成另一种是通过手写或半手工类似ATLAS这种计算库里的作法)开发精细的kernel获得极致的性能。如果AI workload高度diversified前者更有效率如果AI workload呈现半收敛态其实后者反而效率更高。而对于新硬件又因为多出了show case和长尾case的不同考虑让这个问题变得更复杂了一丢丢。 结合一些workload甚至业务层面的特点可以起到“四两拨千斤”的优化效果。几个比较具体的例子推荐类模型涉及到ID类特征的处理可能涉及到对字符串类源特征的处理是提前在预处理环节对字符串做ID化还是在模型里做ID化对性能影响会非常明显而这个优化其实不需要复杂的系统优化技术就能达到。另一个例子是如果能够对一些重要的建模库进行干预在模型写法上对后端AI框架更为友好实际上能大大简化后端优化的复杂性Google开源出的Transformer的代码其实就有TPU-friendly的痕迹。 这些巧劲得以发挥的一个关键原因是因为当我们的视野集中在AI domain的关键workload时我们可以结合这些workload的特性做一些看起来overfit但实现效率更高的设计妥协。而传统编译器因为打击的workload多样性更强通用域编译器和domain-specific编译器的区别所以在leverage workload特性上会更为谨慎通常会以workload-agnostic的角度来提供优化手段workload-specific的优化就往往上推到各自domain里了比如在数据库领域利用编译思想进行JIT优化的工作。 一个更重要的问题我觉得是应该如何看待AI编译器在AI系统中的地位和作用。我自己的观点是no silver bullet。这就好比传统系统领域存在编译器、库(STL/glibc/…)运行时这若干个component进行组合协同一样我们当然可以不使用STL期望编译器足够的优秀对于一个普通版本的STL alike的实现也能通过编译手段获得极致性能但这样决策涉及到在编译器上投入的effort是否值得就要仔细考虑了。在AI system领域我认为同样会有类似的分工。对于一个workload一族workload整个AI worload的全场景我们应该如何在AI编译器、AI底层库、运行时、AI建模库之间进行职能划分是一个很考验系统设计能力的事情。如果再有机会对硬件设计也有干预影响到programming modeldevice compiler的设计那就是一个更具挑战也更有意思的事情了。 SunnyCase 神经网络编译器或者深度学习编译器下称 DL 编译器属于一种领域特定编译器专门用于将神经网络的训练/推理部署到 CPU、GPU、NPU 上。它和传统的编译器有着类似的结构有很多共用的部分同时也有自己的侧重点。 关于 DL 编译器很多大佬在他们的回答中已经讲了很多我这边结合个人经历更多谈一下 edge 端 DL 编译器。 1. DL 编译器产生的背景 早期神经网络部署的侧重点在于框架和算子库。神经网络可以由数据流图来表示图上的节点就是算子比如 Conv2D、BatchNorm、Softmax节点之间的连接代表 Tensor。由于数据流图很直观很多框架的 Runtime 采用了类似 Caffe 的方式运行时通过一定的顺序例如直接 Post order DFS分配 Tensor、调用算子库就行了。因此那时候的优化重点在于优化算子库的性能。 但随着时间的发展这种直观的部署方式也逐渐暴露出一些问题。 越来越多的新算子被提出算子库的开发和维护工作量越来越大 比如提出一个新的 Swish算子库就要新增 Swish 的实现还要有优化、测试。虽然你明白 Swish 就是由一些基础的一元二元算子组成。 NPU 的爆发导致性能可移植性成为一种刚需 大多数 NPU 作为一种 ASIC 在神经网络场景对计算、存储和 data movement 做了特殊优化使得它们对能效比相对 CPU、GPU 要好很多。在移动端和 edge 端越来越多的 NPU 开始出现。同时 NPU 的 ISA 千奇百怪一般也缺乏 GCC、LLVM 等工具链使得已有的针对 CPU 和 GPU 优化的算子库很难短期移植到 NPU 上并充分利用硬件的能力达到较好的性能。 更多可优化的点得到关注 早期 CPU 和 GPU 上带宽问题不是很明显大家更多关注单个算子的性能。但在移动端和 edge 端的应用中人们逐渐遇到了带宽跟不上算力的问题而在这些 target 上增大带宽意味着功耗和成本的上升因此利用算子间的 fusion 和调度节省带宽开始被重视起来。 2. 和传统编译器前端的异同 传统编译器多接受文本类型的编程语言通过 lexer 和 parser 构造 token 和 AST。 DL 编译器接收的一般是 DL 框架的模型文件例如 TensorFlow 的 pb、PyTorch 的 pth还有 ONNX 等。DL 编译器一般把模型的导入模块叫做 importer它的工作就是将 DL 框架的模型转换为 DL 编译器的 IR因此它只跟模型文件格式和 IR 表示耦合要支持新的框架只需要新增一个 importer 就行了。 3. 和传统编译器中后端的异同 DL 编译器和传统编译器一样会使用 Constant Folding、DCE、CSE 等对 IR 进行优化。 除此之外 DL 编译器还会有一些领域特定的图优化 合并冗余、消除无意义的 Transpose、Reshape、Pad合并 BatchNorm 到 Conv2D、MatMul对于先 Add 后激活的残差结构可以将一路输入作为另一路 Conv2D 的初始值 目前大多数图优化还是根据经验人工编写 rules同样有着工作量越来越大和容易陷入局部最优的问题。不过好在有一些研究已经开始解决这些问题。其中也有应用了传统编译器界研究了很多年的 Equality Saturation 技术。 图优化之后 DL 编译器还要进行一些 ISA 相关的优化 Layout选择 NCHW 还是 NHWC 还是 NCHW16c 等等对于算子在特定 ISA 上的效率会产生影响需要纳入 cost-model Tiling一些 NPU 利用高速片上内存进行计算容量一般都很有限编译器需要对大块的计算进行 tiling。另外对于 Conv2D 这类数据复用很多的计算如何进行 tiling 对性能和带宽也有很大影响因此选择 tiling 参数也需要纳入 cost-model Fusion一些 NPU 可以 fusion Conv2D 和激活甚至 fusion 一段一元二元算子组成的计算图。编译器需要根据硬件提供的能力和 cost-model 选择合适的 fusion 区域如果贪心去匹配也容易产生次优结果。 Partition对于 CPU、DSP、GPU、NPU 组成的异构系统编译器需要考虑它们的算力、带宽、数据交换的代价对计算图进行合理地切分。 这几个优化有时候也需要同时考虑比如 fusion 多层 Conv2D 时的 tiling 和单层又有不同。 因为很多场景下计算图中的 Shape 是已知的在方便了上述优化的同时还解锁了下面几个优化 峰值最小的内存分配 因为分配释放序列和每次分配的 Buffer 大小我们是已知的我们可以找到每个 Buffer 的最优分配位置使得内存峰值占用最小 Concat 消除 对于一些特殊情况我们可以通过将几个算子输出的 Buffer 分配到一起从而避免运行时 Concat 的发生。比较常见的是 densenet 中 Concat 的消除。 4. DL 编译器特别的地方 DL 编译器因为领域特定还包含一些特别的功能。 稀疏 稀疏存储 Tensor 可以降低带宽。一些 NPU 还可以通过跳过无用计算的方式加速稀疏 Tensor 的计算。 DL 编译器需要根据数据、Weights 的分布合理选择对某个 Tensor 是否进行稀疏。 量化 实践证明很多场景下神经网络的推理不需要太高的数据精度。int8 甚至 int4 已经在工业界落地。模型量化分为训练感知量化QAT和训练后量化PTQ。因为使用方便大部分用户使用 PTQ编译器需要利用用户提供的校准集calibration dataset得出需要量化的 Tensor 的数据分布选择非饱和或者饱和量化具体细节不再细说。 贝壳与知了 感觉前面几位大佬讲的已经讲地很细致深入了这里稍微阐述一下我自己的理解 _ 1. 先说两者的本质 参考wiki上面对compiler的定义 In computing, a compiler is a computer program that translates computer code written in one programming language (the source language) into another language (the target language). https://en.wikipedia.org/wiki/Compileren.wikipedia.org/wiki/Compiler 从这一点上来看AI编译器和传统编译器的本质是一样的都是一类能够将不同的编程语言所表达code进行转换的program。我想这也是AI编译器之所以被称之为“编译器”的原因。 2.再说两者的联系 因为AI编译器出现的比较晚所以在设计的时候往往会借鉴传统编译器的思路 两者的理念比较类似。两者都力求通过一种更加通用更加自动化的方式进行程序优化和代码生成从而降低手工优化的effort。两者的软件结构比较类似。一般都分成前端IR后端等模块。其中前端负责讲不同的语言的描述转换成统一的IR表述后端通常会对IR表示进行优化并且最终生成可执行的code。其中IR层用来解耦前端和后端降低集成的effort。两者的优化方式比较类似。通常编译器都会对code其进行一系列的优化从而提高performance或者减少memory footprint等。AI编译器和传统编译器都是通过在IR上面run各种各样的pass进行优化的。而且AI编译器往往还会借鉴传统编译器中的一些pass比如constant folding, dead code elimination等AI编译器通常会依赖于传统编译器。AI编译器在自己的IR上面对model进行优化之后通常会有lowering的过程将优化后的high-level IR转换成传统编译器的low-level IR然后依赖传统编译器去做最终的机器码生成。 3.最后说两者的区别 我认为两者最根本的区别是应用场景的区别 AI编译器是把一个深度学习模型转换成executable。这里可以把一个深度学习模型理解成一段用DSLDomain Specific Language描述的code而executable就是一段用硬件能理解的机器码描述的code。这正好能对应到compiler的定义。传统编译器是把一段用高级语言编写的code转换成executable。这里的高级语言可能是C/C等。这也能够对应到compiler的定义。 应用场景的区别导致了两者在设计上的其他不同之处 两者的IR表达层次有区别。AI编译器一般会有一套high-level的IR用来更抽象的描述深度学习模型中常用的high-level的运算比如convolutionmatmul等。而传统编译器的IR更偏low-level用于描述一些更加基本的运算比如loadstorearithmetic等。有了high-level的IRAI编译器在描述深度学习模型的时候会更加方便。 两者的优化策略有区别。AI编译器因为是面向AI领域的所以在优化的时候可以引入更多领域特定的先验知识从而进行更加high-level更加aggressive的优化。比如说 AI编译器可以在high-level的IR上面做operator fusion等而传统编译器在做类似的loop fusion的时候往往更加保守。AI编译器可以降低计算的精度比如int8, bf16等因为深度学习模型对计算精度不那么敏感。但传统编译器一般不会做这种优化。 工藤福尔摩 针对deep learning的编译器其实就是把应用限制在tensor operator上做domain specific optimization。传统编译器面向的程序更加general。前者更偏上层因为我只需要考虑deep models而流行的deep models基本算子就卷积和矩阵乘后者更偏底层。 以TVM和LLVM举例TVM拿到模型的计算图先用Relay做一下图切分算子融合conv-bn-relu之类的也有人做multiple conv fusion这一步是graph-level的优化之后再到算子层面现在的deep compiler侧重于循环优化这部分在传统编译器里研究的很多不过我看即使是deep learning领域能做的domain specific的优化也没多少auto tuning做的主要还是tiling的参数 AutoTVM / FlexTensor (ASPLOS 2020) / Ansor (OSDI 2020)。做完operator-level的优化TVM IR转成LLVM IR再借助LLVM的各种后端生成可执行代码。 你要部署一个模型后端可以选择使用手调库比如厂商库MKLDNN, CuDNN某些厂商的或者第三方的Blas库算子库比如阿里的MNN另外一条路就是选择deep compilers做代码生成。 先说deep compiler的缺点。首先编译器能做的工作比较有限实际的部署你要考虑到模型设计模型压缩之类的。另外因为比较偏上层代码生成部分交给了black-box compiler, 很难做到汇编级的调优我能在tuning中避免shared memory bank conflicts但是我并不能优化掉register bank conflicts在现有的DSL中也缺乏底层的表达相比于某些手调库最终性能不太行。比如说某些人专门做Winograd Conv的优化性能都快接近理论极限了 ppopp 2020。其他的能想到的缺点都非常细节我觉得未来很容易解决比如GPU的prefetch现在TVM里面用prefetch怎么选它的size和offset基本都会导致性能变差。 但是手调库的缺点更加明显除了耗费人力外他做的优化也是general的无法cover到具体的input configuration。即使是针对某些input选择调用不同的kernel这也非常有限。比如MKL-DNNCuDNN虽然是厂商库代表了手调的state-of-the-art他可能对3 * 3的卷积做了特殊优化但对于某些大的feature map或者大的kernel size性能就很差。在某个具体网络上通过auto-tuning超过MKL-DNN和CuDNN并不难。AMD的就更不用说了他那个性能太差了我针对CUDA做的调优用hipify那种工具转到ROCm上性能都比它强。 自动调优最重要的是调优之后的性能其次是调优的时间。 我对TVM了解比较深对其他的deep compiler了解不多。有些答案提到的优化不了多少性能我还是不太同意。至少相比于主流框架Torch/TensorFlow来看当然考虑了这些框架用的底层库在某个网络上比如ResNet-18针对Input大小为(1, 3, 224, 224)做调优超过他们还不算太难。因为我们做的就是inference optimization实际部署模型的时候input size都是运行时不再变的所以这条路可行。 调优时间上Ansor调一个网络大概一天左右比较短了。Facebook有工作做贪心搜索能把调优时间降到一分钟以内最终性能也不算差 MLSys 2021。
http://www.yutouwan.com/news/446729/

相关文章:

  • 上海专业网站建站公网络营销策划的具体流程是
  • 做纺织行业的网站一个工程项目的整个流程
  • 南宁网站建设专家网络信息科技公司经营范围
  • 怎样用vs2017做网站wordpress替换链接
  • 团购网站模板编辑首页响应式网页模板制作
  • 广东平台网站建设找哪家php网站开发基础
  • 如何电话推销客户做网站村庄建设网站
  • 苏州网站设计价格wordpress 重装
  • 荆州网站开发网站建设企业推荐
  • 网站开发 强制兼容模式建设工程检测中心网站
  • 电脑配件经营网站的建设多用户商城开源左
  • 金融社区类网站建设28网站制作
  • 网站策划书模板大全海南快速seo排名优化
  • 温州市营销网站建设平面设计培训学什么
  • 做网站需要注意事项哈尔滨香坊
  • 南宁信息建设网站淘宝网站建设百度百科
  • 二级域名做网站注意往网站上传照片怎么做
  • 上海好的网站有哪些云商城24小时自助下单
  • 网站页面跳转怎么做wordpress无法修改电子邮件
  • 东莞网站建设设计公司企业滴滴app下载
  • 去哪个网站可以做写手自己电脑怎样做网站
  • 服装网站建设工作室wordpress批量插件
  • 河南省工程建设协会网站建设高流量网站
  • 做网站带吗Wordpress批量更新软件
  • 站长工具seo查询软件做装修那个网站好
  • 郑州网站设计专家网站的技术方案
  • 苏州公司网站建设找哪家wordpress 调用新浪微博内容
  • wordpress多站点子域名西安cms建站
  • 制作网站的公司怎么样博客网站快速排名
  • 网站特点怎么写深圳做响应式网站制作