TVM计算图分割--BYOC框架

文章目录

  • BYOC架构
    • 算子标注
      • 单算子标注
      • 复合算子标注
    • Cost-based Partition
    • Codegen
      • Codegen for C
        • 代码生成流程概览
        • 代码生成工程实现
          • 实现CodegenC
          • 实现CSourceCodegen
      • Codegen for JSON
          • 实现JsonCodegen
    • Runtime
        • JSONRuntime
  • 参考

随着后端设备数量激增,为达到较高的效果在这些设备上,对应的知识要求也同步增加。为缓解这些压力,硬件厂商会提供算子库如OneDNN、cuDNN或者推理引擎TensorRT以指定的方式描述模型以达到较高性能,但是这种方式需要用户学习新的编程接口。BYOC框架提供了方法使硬件厂商较为容易的实现自己的codegen并注册为Relay后端编译器支持自己的硬件或者算子库。

自己的ASIC加速器必须有自己的编译流,一般分为两类:
其一,生成一个图表示然后投喂到图执行引擎中。加速器上需要一个可以执行计算图的图执行引擎,可以降低算子间内存传输或者做算子融合等操作。这两种优化操作一般是在编译期间在图上做处理的,比如conv2D和bias add在TVM中是两个单独的算子,但在专属加速器中可能是一个算子,需要在优化图上通过新算子替换调原始算子。
其二,生成汇编代码或C代码,编译为可执行程序。对于没有端到端执行框架的平台需要提供一个编译器来编译目标平台ISA汇编代码表示的程序。对应的就需要codegen模块将Relay转化为C代码,这种厂商会提供对应的算子库来调用。

下图为BYOC框架对应后端的类型已经相应的数据结构。
在这里插入图片描述

BYOC架构

上图是BYOC(Bring Your Own Codegen)框架整体结构。其主要逻辑是对算子按照支持的执行平台进行划分,然后按照不同的编译流进行处理。详细介绍如下,首先加载模型,转化为Relay格式,然后进行一些后端无关的优化操作。第三步就是分割计算图,这里分为四个小步骤,后面会详细介绍。主要职责就是把计算图分为两类子图,一类是包含加速器支持的算子构成的子图,一类是不支持的,由默认的TVM编译流处理。在加速器这条编译流上可以添加加速器专属的优化Pass,可以自定义codegen。加速器中的算子会被包装为一个外部函数调用,算子执行由加速器处理,结果返回给TVM的runtime。
在这里插入图片描述

算子标注

在这里插入图片描述

流程图

在得到优化后的Relay计算图后,框架需要指定哪些算子会在指定的计算平台上执行,因此需要给算子做标注。BYOC支持单一算子和复合算子标注。在单一算子中,可以通过python的包装器为算子添加编译器属性确定执行平台,对以复合算子,需要先设计匹配pattern在计算图中识别子图以生成复合算子,复合算子的格式是一个composite复合函数。composite函数不用单独添加编译器属性,因为在匹配pattern时,pattern的名称中第一个“.”前面的字符串就是编译平台名称,这点可以在源码中看到。

单算子标注

标注规则在python/tvm/relay/op/contrib/your_codegen_name.py目录下。可以通过包装器@tvm.ir.register_op_attr(relayOp, target.yourTarget)直接将算子与指定运行平台绑定。该包装器是给算子添加了新属性target.yourTarget,BYOC框架会对每个算子调用target.yourTarget()检查是否支持该硬件。如下helper函数可以批量处理算子标注。
在这里插入图片描述

复合算子标注

添加的后端往往会将一组算子转化为一个优化后的指令或者一个高级API,因此需要先对计算图做划分。如上流程图所示,Conv2D+Bias Add+ReLU组合为一个复合算子。对于复合算子,可以设计匹配模板,然后通过@register_pattern_table进行注册。pattern可以通过TVM提供的Relay pattern language编写。

在这里插入图片描述

对于生成的组合算子,包含两个重要属性即Composite,表示该算子在target上满足的模式;PartitionedFromPattern表示满足的匹配模板。因为设计的模板是类似于通配符,具体匹配的是哪个pattern是不确定的,而该属性就显示了实际匹配的pattern是那个。比如conv+*的模式既可以匹配conv+relu又可以匹配conv+add等,而PartitionedFromPattern的就是实际的匹配模板如 nn.conv2d_add_或 nn.conv2d_nn.relu_。

在这里插入图片描述

对于复合算子,加速器可能会有对应的指令或接口。因此可以实现一个映射函数将复合算子与接口对应。如下,conv+relu可以通过DNNLConv2d(false, true)匹配,conv+add+relu可以通过DNNLConv2d(true, true)匹配。

在这里插入图片描述

Cost-based Partition

在这里插入图片描述

经过标注后的计算图被划分为若干个子图,可以进一步进行融合,组合一个大的算子,封装为一个函数,这样若干算子整体只做一次内存调用,一次kernel启动,减少了内存负载和内核调用的耗时。具体来说,BYOC采用MergeCompilerRegions Pass把在相同执行平台上的连续地算子进行了合并,组合为一个大的region,封装为一个外部函数调用。如上图,融合了三个函数,就有三个外部函数调用Fun1、Fun2和Fun3。函数有编译器的属性来确定执行平台。函数具体执行由加速器负责,调用由TVM编译器负责。
MergeCompilerRegions默认的融合策略是贪心的,他会尽可能多地把所有满足条件的算子合并。但是由于硬件平台的内存受限,因此需要控制融合后算子大小。这里论文里简单介绍一种方式就是直接控制算子的数量,但是其他框架会进一步考虑内存的信息。并且这些区域可

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计Python+卷积神经网络股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

qt QShortcut详解

1、概述 QShortcut是Qt框架中的一个类,它提供了一种创建键盘快捷键的方式。通过QShortcut,开发者可以将特定的键盘组合(如CtrlC、AltF4等)与应用程序中的动作(如复制、关闭窗口等)关联起来。当用户在应用程…

C++OJ_二叉树的层序遍历

✨✨ 欢迎大家来到小伞的大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C_OJ 小伞的主页:xiaosan_blog 二叉树的层序遍历 102. 二叉树的层序遍历 - 力扣(LeetCode&#xff0…

The Rank-then-Encipher Approach

原始观点 Format-Preserving Encryption 4 The Rank-then-Encipher Approach 引用1 Hybrid diffusion-based visual image encryption for secure cloud storage 2.2 Sum-preserving encryption Bellare introduced the concept of format-preserving encryption (FPE)…

DolphinDB 与南方科技大学联合授课啦!

11月1日,南方科技大学商学院和 DolphinDB 联合举办了高校课程讲座。讲座由南方科技大学商学院高级研究学者冯鹏举主持,DolphinDB 创始人兼 CEO 周小华博士、某百亿私募数据平台架构师潜蛟老师进行精彩演讲。 Part 1 : 大数据时代下数据库架构革新与生态…

IDM扩展添加到Edge浏览器

IDM扩展添加到Edge浏览器 一般情况下,当安装IDM软件后,该软件将会自动将IDM Integration Module浏览器扩展安装到Edge浏览器上,但在某些情况下,需要我们手动安装,以下为手动安装步骤 手动安装IDM扩展到Edge浏览器 打…

403 Request Entity Too Lager(请求体太大啦)

昨天收到 QA 的生产报障,说是测试环境的附件上传功能报了 403 的错误,错误信息:403 Request Entity Too Lager。我尝试复现问题,发现传个几兆的文件都费劲啊,一传一个失败。不用说,项目用到 ng 代理&#x…

HARCT 2025 新增分论坛2:机器人系统智能控制

会议名称:机电液一体化与先进机器人控制技术国际会议 会议简称:HARCT 2025 大会时间:2025年1月3日-6日 大会地点:中国桂林 主办单位:桂林航天工业学院、广西大学、桂林电子科技大学、桂林理工大学 协办单位&#…

网络世界中的侦察兵----ICMP

前言 学习了IP协议后,都知道IP协议本身是不提供可靠性保障的,那么数据包在这么复杂的互联网环境中传输,总会遇到问题,如果遇到问题后,被丢弃、无回应,可能作为工程师的我们来说都不知道发生了什么事&#…

从0开始学习机器学习--Day21--算法的评估标准

准确率和召回率(precision and recall) 在上一章我们提到了在每次运行算法时通过返回一个实数值来判断算法的好坏,但是我们该如何构建这个实数的计算公式呢,毕竟这关乎于我们对算法的判断,不能过于夸大或贬低。有一个典型的会被影响的很大例…

集群架构中Lua脚本的限制以及出现的报错

🚀 博主介绍:大家好,我是无休居士!一枚任职于一线Top3互联网大厂的Java开发工程师! 🚀 🌟 在这里,你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人,我不仅热衷…

快速傅里叶变换(FFT)基础(附python实现)

对于非专业人士,傅里叶变换一直是一个神秘的武器,它可以分析出不同频域的信息,从时域转换到频域,揭示了信号的频率成分,对于数字信号处理(DSP)、图像、语音等数据来说,傅里叶变换是最…

python数据结构操作与可视化的应用

Python具有丰富的数据结构操作和可视化库,可以进行各种数据结构的创建、编辑和分析,并将结果可视化。以下是几个常见的Python数据结构操作和可视化的应用示例: 1. 列表(List)操作和可视化: - 创建列表&a…

DataFrame

目录 一、创建DataFrame二、Sql语法三、DSL语法四、RDD与DataFrame互相转换 一、创建DataFrame 在SparkSql中SparkSession是创建DataFrame和执行Sql的入口,创建DataFrame有三种方式: 通过Spark的数据源进行创建 从一个存在的RDD进行转换 从Hive Tabl…

C# 实现对指定句柄的窗口进行键盘输入的实现

在C#中实现对指定句柄的窗口进行键盘操作,可以通过多种方式来实现。以下是一篇详细的指南,介绍如何在C#中实现这一功能。 1. 使用Windows API函数 在C#中,我们可以通过P/Invoke调用Windows API来实现对指定窗口的键盘操作。以下是一些关键的…

GitHub个人主页美化

效果展示 展示为静态效果,动态效果请查看我的GitHub页面 创建GitHub仓库 创建与GitHub用户名相同的仓库,当仓库名与用户名相同时,此仓库会被视作特殊仓库,其README.md(自述文件)会展示在GitHub个人主页…

2024-09-01 - 分布式集群网关 - LoadBalancer - 阿里篇 - 流雨声

摘要 通过公有云部署创建类似 MateLB 的应用负载,可以更加方便的对系统资源进行合理规划。 应用实践 CCM提供Kubernetes与阿里云基础产品(例如CLB、VPC等)对接的能力,支持在同一个CLB后端挂载集群内节点和集群外服务器&#xf…

【销帮帮-注册_登录安全分析报告-试用页面存在安全隐患】

联通支付注册/登录安全分析报告 前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨…

初识Linux · 匿名管道

目录 前言: 匿名管道 理解为什么? 理解是什么? 理解怎么做? 前言: 引入管道之前,我们引入几个问题,进程通信的相关问题。 第一个是进程之间为什么要通信,对于进程间通信来说&…

Linux(CentOS)设置防火墙开放8080端口,运行jar包,接收请求

1、查看防火墙状态 systemctl status firewalld 防火墙开启状态 2、运行 jar 包,使用8080端口 程序正常启动 3、使用 postman 发送请求,失败 4、检查端口是否开放(需更换到 root 用户) firewall-cmd --zonepublic --query-por…