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. java语言写一个建议的五子棋

    经过16天的java学习,也学得了不少关于Java方面的知识,我想分享一下我用java写的一个简单的五子棋. 游戏规则: (1)对局双方各执一色棋子.(2)空棋盘开局.(3)白先.黑后,交替下子,每次 ...

  2. Http Get与Post的区别

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  3. Win64 驱动内核编程-25.X64枚举和隐藏内核模块

    X64枚举和隐藏内核模块 在 WIN64 上枚举内核模块的人方法:使用 ZwQuerySystemInformation 的第 11 号功能和枚举 KLDR_DATA_TABLE_ENTRY 中的 I ...

  4. Andrew Ng机器学习算法入门((七):特征选择和多项式回归

    特征选择 还是回归到房价的问题.在最开始的问题中,我们假设房价与房屋面积有关,那么最开始对房价预测的时候,回归方程可能如下所示: 其中frontage表示的房子的长,depth表示的是房子的宽. 但长 ...

  5. 插入排序——Python实现

    插入排序Python实现 # -*- coding: utf-8 -*- # @Time : 2019/10/28 20:47 # @Author : yuzhou_1shu # @Email : y ...

  6. (Py练习)查询子串出现次数

    if __name__ == '__main__': str1 = input('请输入一个字符串:\n') str2 = input('请输入一个子串:\n') ncount = str1.coun ...

  7. .NET Core-全局性能诊断工具

    前言: 现在.NET Core 上线后,不可避免的会出现各种问题,如内存泄漏.CPU占用高.接口处理耗时较长等问题.这个时候就需要快速准确的定位问题,并解决. 这时候就可以使用.NET Core 为开 ...

  8. PowerDesigner安装教程

    准备安装 准备好可执行文件.汉化.破解文件 将可执行文件以管理员身份运行: 向导初始化 next 选香港.点同意: 可以默认,如果说这个路径不能用下次就换一个 除了Eclipse全选 全选 好像有个空 ...

  9. PHP基础-PHP中预定义的超全局数组

    预定义数组: 自动全局变量---超全局数组 1. 包含了来自WEB服务器,客户端,运行环境和用户输入的数据 2. 这些数组比较特别 3. 全局范围内自动生效,都可以直接使用这些数组 4. 用户不能自定 ...

  10. web&HTML

    内容索引 1. web概念概述 2. HTML web概念概述 * JavaWeb: * 使用Java语言开发基于互联网的项目 * 软件架构: 1. C/S: Client/Server 客户端/服务 ...