MLIR中间表示和编译器框架

TensorFlow生态系统包含许多在软件和硬件堆栈的多个级别上运行的编译器和优化器。作为TensorFlow的日常用户,使用不同类型的硬件(GPU,TPU,移动设备)时,此多级堆栈可能会表现为难以理解的编译器和运行时错误。

TensorFlow可以通过多种不同方式运行:

  • 发送到TensorFlow执行程序,该执行程序调用手写的操作内核
  • 转换为XLA高级优化器表示形式(XLA HLO),后者又可以调用用于CPU或GPU的LLVM编译器,或者继续将XLA用于TPU。(或两者的某种组合!)
  • 转换为TensorRTnGraph或另一种针对特定于硬件的指令集的编译器格式
  • 将图形转换为TensorFlow Lite格式,然后在TensorFlow Lite运行时内部执行,或者进一步转换为通过Android Neural Networks API(NNAPI)或相关技术在GPU或DSP上运行。

更复杂的路径,包括每层内的多轮优化,例如Grappler框架可优化TensorFlow中的张量布局和操作。

众多的编译器和表示实现大大提高了性能,但这种异构世界可能会给最终用户带来问题,例如在这些系统之间的边界处产生令人困惑的错误消息。同样,新的硬件和软件堆栈创建,必须为每个新路径重建优化和转换过程。

MLIR,或多级中间层表示。这是表示形式和编译器实用程序的库,位于模型表示和生成特定于硬件的代码的低级编译器/执行器之间。借助MLIR,在生产质量组件的支持下,实现优化编译器设计和实现方面的新颖探索。

MLIR引起许多团体的关注,包括:

  • 优化机器学习模型的性能和内存消耗的编译器研究和实施
  • 硬件制造商寻找一种将其硬件连接到TensorFlow的方法,例如TPU,手机便携式神经硬件以及其它定制ASIC。
  • 编写语言绑定时,利用优化编译器和硬件加速的优势。

什么是MLIR?

MLIR本质上是用于现代优化编译器的灵活基础架构。由一个中间表示(IR)规范和一个用于对该表示执行转换的代码工具包组成。(按照编译器的说法,从较高级别的表示形式转换为较低级别的表示形式时,这些转换可以称为“降低lowerings”。)

MLIR受LLVM的影响很大,重用了它的许多好思想。具有灵活的类型系统,允许在同一编译单元中结合多个抽象级别来表示,分析和转换图形。这些抽象包括TensorFlow操作,嵌套的多面循环区域,LLVM指令,以及固定的硬件操作和类型。

MLIR Dialects

为了分离不同的硬件和软件目标,MLIR提供了“方言”,其中包括:

  • TensorFlow IR,代表TensorFlow中的所有可能事物
  • XLA HLO IR,旨在利用XLA的编译功能(输出到TPU)
  • 实验仿射方言,重点关注多面体表示和优化
  • LLVM IR,与LLVM表示之间具有1:1映射,允许MLIR通过LLVM发出GPU和CPU代码
  • TensorFlow Lite,转换为在移动平台上运行的代码

每个方言由一组已定义的算子组成,这些算子具有不变的内容,例如:“一个二进制运算符,输入和输出具有相同的类型。”

添加到MLIR

MLIR没有固定/内置的全局已知算子列表(没有“内部”)。方言可以定义完全自定义的类型,这就是MLIR如何建模LLVM IR类型系统(具有一流的聚合),对ML优化的加速器(如量化类型)重要的域抽象,甚至是Swift或Clang类型系统(在以后围绕Swift / Clang声明节点构建)。

如果要连接新的低级编译器,则将创建一个新的方言以及TensorFlow Graph方言和方言之间的降低。这为硬件和编译器制造商铺平了道路。可以将同一模型中的不同级别的方言作为目标。较高级别的优化器将尊重IR的不熟悉部分,并等待较低级别的IR处理。

对于编译器研究和框架制造商来说,MLIR允许在各个层次上进行转换,甚至可以在IR中定义自己的算子和抽象-从而可以对要解决的问题领域进行最佳建模。这样,与LLVM相比,MLIR更像是纯编译器基础结构

虽然MLIR充当ML的编译器,使机器学习技术也可以在编译器中使用!这一点特别重要,因为开发数值库的工程师的缩放比例与ML模型或硬件的多样化不一样。MLIR的可扩展性促进了代码降低策略的探索和跨抽象的渐进式降低。

在TensorFlow 2.0中,图可以是隐式的;执行的操作可以单独,成组或作为完整图形(例如Keras顺序)运行。无论如何,这些图或图片段必须进行优化和执行。

MLIR中间表示和编译器框架的更多相关文章

  1. 学习笔记TF062:TensorFlow线性代数编译框架XLA

    XLA(Accelerated Linear Algebra),线性代数领域专用编译器(demain-specific compiler),优化TensorFlow计算.即时(just-in-time ...

  2. 学了编译原理能否用 Java 写一个编译器或解释器?

    16 个回答 默认排序​ RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和 ...

  3. 华为方舟编译器正式支持C语言:完全开源

    投递人 itwriter 发布于 2020-10-14 19:08 评论(15) 有1938人阅读 原文链接 2019 年 8 月底,华为方舟编译器(OpenArkCompiler)正式开源,迈出了跨 ...

  4. LLVM 初探<一>

    一.安装LLVM LLVM是一个低级虚拟机,全称为Low Level Virtual Machine.LLVM也是一个新型的编译器框架,相关的介绍Wikipedia. 现在LLVM的版本已经有很多,根 ...

  5. kudu

    Kudu White Paper http://www.cloudera.com/documentation/betas/kudu/0-5-0/topics/kudu_resources.html h ...

  6. ASP.NET Web Forms的改进

    虽然ASP.NET Web Forms不是vNext计划的一部分,但它并没有被忽视.作为Visual Studio 2013 Update 2的一部分,它重新开始支持新工具.EF集成和Roslyn. ...

  7. Clang 与 LLVM

    我们在iOS调试中经常会看到Clang这个,那么Clang到底是什么呢?我们来简单了解一下. Clang是一个C.C++.OC语言的轻量级编译器.源代码发布于BSD协议下.Clang是由C++编写,基 ...

  8. Clang之词法分析Lex

    Clang是LLVM编译器框架的前端(Frontend)编译器,可编译链接C.C++.Objective-C和Objective-C++四种语言的项目代码.Clang 的开发目标是提供一个可以替代 G ...

  9. 大数据时代快速SQL引擎-Impala

    背景 随着大数据时代的到来,Hadoop在过去几年以接近统治性的方式包揽的ETL和数据分析查询的工作,大家也无意间的想往大数据方向靠拢,即使每天数据也就几十.几百M也要放到Hadoop上作分析,只会适 ...

随机推荐

  1. 13- APP接口测试以及postman使用

    postman安装与操作 ---------------------- 接口操作图片 -------------------- 一.postman操作key值:来源于聚合   请求-->聚合-- ...

  2. hdu4499 搜索

    题意:       给你一个棋盘,最大是5*5的,问你最多可以放多少个炮,炮和炮之间不可以相互攻击,这块只的是只能走一步,不存在两个炮中间三个棋子的情况.. 思路:    刚开始想的是把所有的空位置都 ...

  3. POJ 2396 构造矩阵(上下流)

    题意:       要求构造一个矩阵,给你行和,列和,还有一些点的上下范围,输出一个满足题意的矩阵. 思路:       这个题目很经典,这是自己看上下流后接触的第一道题,感觉很基础的一道题目,现在我 ...

  4. 渗透测试神器Cobalt Strike的使用

    目录 Cobalt Strike Cobalt Strike的安装 Cobalt Strike的使用 创建监听器:

  5. 接口测试的N中玩法

    在我看来接口测试相对其他类型的测试是比较简单的.对于最常见的HTTP接口,只需要知道接口的 URL.方法.参数类型.返回值 ... 就可以对接口进行测试了. apifox 如果你是入门级选手,那么ap ...

  6. Day009 Arrays类

    Arrays类 数组的工具类java.util.Arrays 由于数组对象本身并没有什么方法可以供我们调用,但Api中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作. 查 ...

  7. PHP 调用请求外网接口

    1.类中定义静态方法 class FtpService{ /** * 请求外网 * @param $url 外网接口url * @param bool $params 参数,拼接字符串 post请求可 ...

  8. MakeCode图形编程应用在micro:bit上的多工性能实测

    1. 简述 本文不涉及对测试中所用到的设备或软件的推广. micro:bit 是一款由英国广播电视公司(BBC)为青少年编程教育设计,并由微软,三星,ARM,英国兰卡斯特大学等合作伙伴共同完成开发的微 ...

  9. [DB] 数据库的连接

    概述 集合运算:交,差,并,笛卡尔积 关系运算:选择,投影,连接,除 集合运算是关系运算的基础,关系运算可以用SQL语句表达 连接(join):从两个关系(表)的笛卡儿积中选取属性(列)间满足一定条件 ...

  10. [java] 转型

    A为父类,子类B.C 第20行发生向上转型,a对象调用C覆写过的print()方法 若为A a = new B(); 则调用B覆写过的print()方法 创建对象时使用向上转型,能够统一参数类型(23 ...