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. 866. Prime Palindrome

    Find the smallest prime palindrome greater than or equal to N. Recall that a number is prime if it's ...

  2. 1.7.1- HTML表格table

    存在即是合理的,表格的是一种常用的标签,不是用来布局,常见是用处理 适合用表格table的地方: 创建表格:

  3. Sublime Text 3 Build 3176 License

    先在hosts文件里加入两行: 127.0.0.1 www.sublimetext.com 127.0.0.1 license.sublimehq.com 目的是防止Sublime Text更新和检测 ...

  4. Tomcat管理弱口令页面Getshell

    目录 弱口令Getshell 利用Burpsuite对tomcat账号密码进行爆破 弱口令Getshell Tomcat安装完成后会有如下页面,点击该页面的 Manager App 处会弹出输入用户名 ...

  5. Win64 驱动内核编程-1.环境搭建

    驱动开发环境及其双机调试环境搭建 开发环境搭建 使用工具:vs2015,Windows 10 SDK_10.0.14393,WDK10.0.14393.0 (1)安装VS2015  随便一个版本吧,我 ...

  6. 远程分支git换地址了,本地重新关联

    由于本人把github远程仓库的名字修改了所以做了以下步骤修改 步骤:两步 (1)先把之前关联的git清除掉 git remote rm origin (2)再关联新的地址 git remote ad ...

  7. 1、requests基础

    一.升级pip版本的命令 : python -m pip install --upgrade pip 二.requests安装  windows系统系cmd运行 pip install request ...

  8. 在Visual Studio 中使用git——文件管理-上(四)

    在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 在Visual Studio 中使用 ...

  9. HelloGitHub 小程序上线了,蛋只有一个搜索功能

    作者:HelloGitHub-卤蛋 我是...蛋蛋啊,本文是我从零开发「HelloGitHub 小程序」的开发日记,不要把这个系列当作技术文章来读,你将会收获更多的乐趣.‍♂️ 我只是个 Python ...

  10. Asp.NetCore Web开发之跨域问题

    在前后端分离的web开发中,解决跨域问题是不可避免的,为什么会出现跨域问题呢,这主要是因为web中的"同源策略",浏览器出于安全原因,不让用户随便访问不同于当前站点的资源,也就是说 ...