深度学习编译器汇总

news2024/11/22 10:20:34

       深度学习的发展对个科学领域产生了深远的影响。它不仅在自然语言处理(NLP)和计算机视觉(CV)等人工智能领域显示出显著的价值,而且在电子商务、智慧城市和药物发现等更广泛的应用领域也取得了巨大的成功。随着卷积神经网络(CNN)、递归神经网络(RNN)、长-短期记忆(LSTM)和生成对抗网络(GAN)等多种深度学习模型的出现,简化各种DL模型的编程以实现其广泛采用至关重要。

        在工业界和学术界的不断努力下,一些流行的DL框架被提出,如TensorFlow、PyTorch、MXNet和CNTK,以简化各种DL模型的实现。尽管上述DL框架根据其设计中的权衡有其优点和缺点,但是在跨现有DL模型支持新兴DL模型时,互操作性对于减少冗余工程工作变得非常重要。为了提供互操作性,ONNX被提出,它定义了表示DL模型的统一格式,以便于不同DL框架之间的模型转换。

       为了解决DL库和工具的缺点,减轻手动优化每个DL硬件上的DL模型的负担,DL社区正在促进特定领域的编译器的发展。目前工业界和学术界已经提出了几种流行的DL编译器,如TVM、Tensor Comprehension、Glow、nGraph和XLA。DL编译器将DL框架中描述的模型定义作为输入,并在各种DL硬件上生成有效的代码实现作为输出。针对模型规范和硬件架构,对模型定义和具体代码实现之间的转换进行了高度优化。具体来说,它们结合了面向DL的优化,例如层和运算操作符融合(比如Conv+BatchNorm),这使得代码生成效率更高。此外,现有的DL编译器还利用了来自通用编译器(例如LLVM)的成熟工具链,这在不同的硬件架构中提供了更好的可移植性。与传统编译器类似,DL编译器也采用了前端、中间代码和后端的分层设计。然而,DL编译器的独特性在于多层次IRs和DL特定优化的设计。

  • 深度学习框架

图1.深度学习框架

图1展示了DL框架的前景,包括当前流行的框架、历史框架和ONNX支持的框架。

TensorFlow在所有DL框架中,TensorFlow对语言接口的支持最全面,包括C++、Python、Java、Go、R和Haskell。为了降低使用TensorFlow的复杂性,Google采用Keras作为TensorFlow核心的前端。

Keras一个高级神经网络库,用于快速构建DL模型,用纯Python编写。尽管Keras本身不是DL框架,但它提供了一个与TensorFlow、MXNet、Theano和CNTK集成的高级API。使用Keras,DL开发人员只需几行代码就可以构建一个神经网络。然而,Keras由于过度封装而不够灵活,这使得添加操作符或获取低级数据信息非常困难。

PyTorchFacebook用Python重写了基于Lua的DL框架Torch,并在Tensor级别上重构了所有模块,从而发布了PyTorch。作为最流行的动态框架,PyTorch在Python中嵌入了用于构建动态数据流图的原语,其中控制流在Python解释器中执行。PyTorch 1.0集成了PyTorch 0.4和Caffe2的代码库,创建了一个统一的框架。这使得PyTorch能够吸收Caffe2的优点,以支持高效的图形执行和移动部署。

Caffe/Caffe2:Caffe是加州大学伯克利分校为深度学习和图像分类而设计的。Caffe有命令行、Python和matlab的api。Caffe的简单性使得源代码易于扩展,适合开发人员深入分析。因此,Caffe主要定位于研究,这使得它从一开始就流行至今。Caffe2是建立在原来的Caffe项目上的。Caffe2在代码结构上类似于TensorFlow,尽管它的API更轻,并且更容易访问计算图中的中间结果。

MXNETMXNET支持多种语言API,包括Python、C++、R、Julia、Matlab和JavaScript。它旨在实现可扩展性,并从减少数据加载和I/O复杂性的角度进行设计。MXNet提供了不同的范例:像caffe和Tensorflow这样的声明式编程以及像PyTorch这样的命令式编程。 CNTK可以通过Python和C++的API来使用,或者可以使用自己的脚本语言(即脑力脚本)。CNTK的设计易于使用和生产,为生产中的大规模数据做好了准备。它使用类似于TensorFlow和Caffe的静态计算图,其中DL模型通过有向图被视为一系列计算步骤。

Paddle-Paddle原始设计类似于Caffe,每个模型可以表示为一组层。然而,Paddle-Paddlev2引用了TensorFlow的操作符概念,它将层分解为更细粒度的操作符,从而支持更复杂的DL模型。而paddle Fluid与PyTorch类似,因为它提供了自己的解释器,从而避免了Python解释器的有限性能。

ONNX开放式神经网络交换(ONNX)定义了一个可伸缩的计算图模型,因此由不同DL框架构建的计算图可以很容易地转换成ONNX。使用ONNX,在DL框架之间转换模型变得更容易。例如,它允许开发人员构建MXNet模型,然后使用PyTorch运行模型进行推理。如图1所示,ONNX已经集成到PyTorch、MXNet、paddle等中。对于一些尚未直接支持的DL框架(例如TensorFlow和Keras),ONNX向它们添加了转换器。

已经淘汰的框架:由于DL社区的快速发展,许多历史DL框架不再活跃。例如,PyTorch已经取代了Torch。作为最古老的DL框架之一,Theano已经不再维护。Chainer曾经是动态计算图的首选框架,但是被具有类似特征的MXNet、PyTorch和TensorFlow所取代。

  • 深度学习编译器架构设计

DL编译器的通用设计架构主要包含两部分:前端和后端,如图2所示。中间代码(IR)分布在前端和后端。通常,IR是程序的抽象,用于程序优化。具体地说,DL模型在DL编译器中被转换成多级IR,其中高层IR驻留在前端,而底层IR驻留在后端。编译器前端基于高层IR,负责与硬件无关的转换和优化。基于底层IR,编译器后端负责特定于硬件的优化、代码生成和编译。

图2.一般采用的DL编译器设计体系结构概述

高层IR:也称为图IR,表示计算和控制流,与硬件无关。高层IR的设计挑战是计算和控制流的抽象能力,它可以捕获和表示各种DL模型。高层IR的目标是建立控制流以及操作符和数据之间的依赖关系,并为图级优化提供接口。它还包含用于编译的丰富语义信息,并为自定义操作符提供可扩展性。

低层IR:设计用于针对不同硬件目标的特定硬件优化和代码生成。因此,底层IR应该足够细粒度,以反映硬件特性并表示特定于硬件的优化。它还应该允许在编译器后端使用成熟的第三方工具链,如 Halide, polyhedral和LLVM。

前端从现有的DL框架中获取一个DL模型作为输入,然后将该模型转换为计算图表示(如图IR)。前端需要实现各种格式转换,以支持不同框架中的不同格式。计算图优化结合了通用编译器的优化技术和DL特有的优化技术,减少了计算图的冗余,提高了计算效率。这种优化可分为节点级(例如nop消除和零维张量消除)、块级(例如代数简化、算子融合和算子下沉)和数据流级(例如CSE、DCE、静态内存规划和布局转换)。在前端之后,生成优化的计算图并传递给后端。

后端将高层IR转换为底层IR,并执行特定于硬件的优化。一方面,它可以直接将高层IR转换为第三方工具链(如LLVM IR),以利用现有的基础设施进行通用优化和代码生成。另一方面,它可以利用DL模型和硬件特性的先验知识,通过定制的编译过程更有效地生成代码。常用的硬件优化包括硬件内部映射、内存分配和获取、内存延迟隐藏、并行化以及面向循环的优化。为了在较大的优化空间中确定最优参数设置,现有的DL编译器普遍采用两种方法:自动调度(如polyhedral)和自动调整(如AutoTVM)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702447.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django学习笔记-VS Code本地运行项目

截止到上一章节:Django 学习笔记-Web 端授权 AcWing 一键登录,我们的项目一直是部署在云服务器上,包括编写代码以及调试运行也是在云服务器上,现在我们尝试将其放回本地运行。 CONTENTS 1. 将项目传到本地2. 虚拟环境配置3. 修改项…

如何录音转文字?这份录音转文字教程你必须知道

在现代快节奏的工作环境中,电脑会议录音转文字成为了一项非常重要的任务。但是很多人不知道电脑会议录音转文字怎么转?如果你也正有这样的疑问,那么你就来对地方了!在本篇文章中,我们将为你介绍几款备受推崇的录音转文…

联想校招雇品年轻化:硬科技「校招+雇品」的创新打法

联想计划3年内增加12,000名研发人才,并明确20%的New Hire将来自校园招聘。 人才梯队的构成预示着企业未来的发展方向与加速度。联想对年轻人才关注与吸引从未放慢脚步,始终相信年轻即代表未来。更多年轻科技人才加入,会为企业注入创新活力&a…

LeetCode 75 —— 62. 不同路径

LeetCode 75 —— 62. 不同路径 一、题目描述: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” &…

Appium之xpath定位详解

目录 一、基础定位 二、contains模糊定位 三、组合定位 四、层级定位 前面也说过appium也是以webdriver为基的,对于元素的定位也基本一致,只是增加一些更适合移动平台的独特方式,下面将着重介绍xpath方法,这应该是UI层元素定位…

前端系列20集-vue3,微信小程序,brew,redis,WebSocket

onShow() {uni.checkSession({success: (data) > {this.getSessionId()},fail: () > {this.getSessionId()}}) }, // 获取用户的手机号 getPhoneNumber(info) {let wxAuth {encryptedData: info.detail.encryptedData,iv: info.detail.iv,sessionId: uni.getStorageSync…

Java反射源码学习之旅 | 京东云技术团队

1 背景 前段时间组内针对“拷贝实例属性是应该用BeanUtils.copyProperties()还是MapStruct”这个问题进行了一次激烈的battle。支持MapStruct的同学给出了他嫌弃BeanUtils的理由:因为用了反射,所以慢。 这个理由一下子拉回了我遥…

青岛农商与中电金信鲸Bot RPA的一次紧密合作

260%、350%、313%、400%、1200%,这些都是青岛农商银行近期通过鲸Bot RPA跑出来的各个业务流程的ROI,原来选择合适的RPA真的这么有用!青岛农商还亲切地给RPA起了一个昵称:小鑫,从此小鑫就是青岛农商第一位正式的数智员工…

群晖安装、卸载、停用套件

安装套件 点击套件中心 点击所有套件,选中需要安装的套件,店家安装套件,或者试用,等待安装完成即可 卸载套件 点击已安装 点击图标或者文字,注意:不要点打开 点击向下的箭头 点击停用,或者卸载…

puppeteer实现文件下载

puppeteer实现文件下载 puppeteer版本: "puppeteer": "^20.7.3",脚本需要的其他依赖 const axios require(axios); const FormData require(form-data); const fs require(fs);本脚本测试数据网站:https://unsplash.com/photo…

基于Java民宿管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

【机器学习】数据预处理 - 归一化和标准化

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 数据预处理 一、数据预处理API二、准备数据集三、归…

没有u盘,怎么将电脑上的便签文件拷贝到手机上?

在如今数字化的时代,便签软件已经成为我们工作和生活中很重要的一部分,在便签中我们会记录很多重要事项或者重要文件。有时候,我们可能会遇到这样的问题:当我们在电脑便签上保存了一些重要文件,想要将文件拷贝到手机上…

【Redis常见命令】 —— 关于Redis的一点儿知识

💧 【 R e d i s 常见命令】——关于 R e d i s 的一点儿知识 \color{#FF1493}{【Redis常见命令】 —— 关于Redis的一点儿知识} 【Redis常见命令】——关于Redis的一点儿知识💧 🌷 仰望天空,妳我亦是行人.✨ &#x1f…

Java框架学习(二)SSM体系:Spring、SpringMVC、MybatisPlus

文章目录 SpringIoC控制反转DI 依赖注入BeanBean基础配置namescope Bean实例化方式Bean的生命周期 依赖注入方式依赖自动装配 Mybatis-Plus配置BaseMapper通用Service常用注解TableNameTableId雪花算法 TableFieldTableLogic 条件构造器和常用接口QueryWrapperUpdateWrapper 插…

【数据库原理与实践】知识点归纳(下)

第6章 规范化理论 一、关系模式设计中存在的问题 关系、关系模式、关系数据库、关系数据库的模式 关系模式看作三元组&#xff1a;R < U,F >&#xff0c;当且仅当U上的一个关系r满足F时&#xff0c;r称为关系模式R < U,F >的一个关系 第一范式&#xff08;1NF&…

一步一步学OAK之七:通过OAK相机实现特征跟踪

目录 特征跟踪Setup 1: 创建文件Setup 2: 安装依赖Setup 3: 导入需要的包Setup 4: 定义FeatureTrackerDrawer类定义变量定义onTrackBar方法定义trackFeaturePath方法定义drawFeatures方法定义FeatureTrackerDrawer类的构造函数 Setup 5: 创建pipelineSetup 6: 创建节点创建相机…

Scrapy框架之下载中间件(详解)

目录 Scrapy中下载中间件 概念 方法 process_request(self, request, spider) 参数: process_response(self, request, response, spider) 参数 基本步骤 示例代码 注意 Scrapy 中 Downloader 设置UA 开发UserAgent下载中间件 代码 三方模块 配置模块到Settin…

Redis系列 | 分类树查询功能如何从2s优化到0.1s

大家好&#xff0c;今天我们继续来分享一个在项目开发过程中遇到的实际问题&#xff0c;这里也来梳理并总结一下我们是如何对它进行持续优化的&#xff0c;希望能对大家有所帮助。 分类树查询功能&#xff0c;在各个业务系统中可以说随处可见&#xff0c;特别是在一些电商系统中…