自学笔记之TVM编译器框架 ,核心特性,模型优化概述,AI应用落地

news2024/9/22 19:20:42

最近在学习一些和芯片 AI相关的知识,重点了解了一下TVM,我自己认为TVM在AI应用落地类似的项目中,用途还是非常广泛的,现在把一些重要的笔记贴在下面,有两篇原帖链接也附上,感兴趣的同学可以学习一下。

TVM

1.什么是TVM?

TVM(Tensor Virtual Machine)是一个开源的机器学习编译器框架,由华盛顿大学陈天奇博士主导开发。它旨在为各种硬件后端提供统一的编程模型,使得开发者能够便捷地将深度学习模型编译成不同硬件平台可执行的代码。TVM 支持多种深度学习框架(如 TensorFlow、PyTorch、ONNX 等)的模型导入,并提供了一系列工具来优化和部署模型。

总的来说,TVM 是一个功能强大、灵活且高效的机器学习编译器框架,它通过提供一系列的工具和优化策略,帮助开发者在不同的硬件平台上高效地部署深度学习模型。

2.TVM 的核心特性包括:

多语言支持:TVM 支持多种硬件描述语言,如 CUDA、OpenCL、Metal 等,以及传统的编程语言如 C++。

自动优化:TVM 提供了自动调优工具(如 AutoTVM 和 AutoScheduler),这些工具可以通过搜索最优的计算配置来加速模型的执行。

中间表示(IR):TVM 使用 Relay 作为高级 IR,用于表示和优化计算图。此外,TVM 还引入了 Tensor IR(TIR)作为低级的 IR,用于描述张量级别的计算。

图优化:TVM 提供了图优化工具,可以对计算图进行优化,包括算子融合、内存规划等。

代码生成:TVM 可以将优化后的计算图生成特定硬件平台的机器码。

运行时支持:TVM 提供了轻量级的运行时系统,支持在多种设备上部署和执行编译后的模型。

硬件抽象:TVM 通过 Device API 抽象了硬件操作,使得开发者可以不必关心底层硬件细节。

模块化设计:TVM 的设计允许开发者根据需要选择使用其不同的组件,如编译器、运行时系统、图优化工具等。

3.TVM架构

TVM 的架构包括前端、中端(图优化 Pass 机制)、后端(代码生成)、运行时等部分。它通过定义和演示关键概念,引导用户了解 TVM 的所有主要功能。用户可以通过 TVM 的 Python 接口来编译和优化模型,也可以使用命令行界面进行操作。TVM 还支持交叉编译和远程过程调用(RPC),以及使用 GPU 编译深度学习模型。

在这个网站中 https://tvm.hyper.ai/docs/tutorial/intro/ 介绍了Apache TVM的详细原理和架构以及开源代码,感兴趣的可以过去看看,这里摘要一些重点信息来展示给大家:

TVM 和模型优化概述

下图说明了使用 TVM 优化编译器框架转换时所采取的步骤。
在这里插入图片描述
步骤一:从 TensorFlow、PyTorch 或 ONNX 等框架导入模型。在导入阶段中,TVM 可以从其他框架(如 TensorFlow、PyTorch 或 ONNX)中提取模型。 TVM 为前端提供的支持水平会随着我们不断改进这个开源项目而变化。如果在将模型导入 TVM 时遇到问题,可以将其转换为 ONNX。

步骤二:翻译成 TVM 的高级模型语言 Relay。已导入 TVM 的模型在 Relay 中表示。Relay 是神经网络的功能语言和中间表示(IR)。它支持:

1.传统的数据流式表示
2.函数式作用域,let-binding 使其成为一种功能齐全的可微语言
3.允许用户混用两种编程风格的能力
4.Relay 应用图级优化 pass 来优化模型。

步骤三:降级为张量表达式(TE)表示。降级是指将较高级的表示转换为较低级的表示。应用了高级优化之后,Relay 通过运行 FuseOps pass,把模型划分为许多小的子图,并将子图降级为 TE 表示。

张量表达式(TE)是一种用于描述张量计算的领域特定语言。 TE 还提供了几个 schedule 原语来指定底层循环优化,例如循环切分、矢量化、并行化、循环展开和融合。为将 Relay 表示转换为 TE 表示,TVM 包含了一个张量算子清单(TOPI),其中包含常用张量算子的预定义模板(例如,conv2d、transpose)。

步骤四:使用 auto-tuning 模块 AutoTVM 或 AutoScheduler 搜索最佳 schedule。schedule 为 TE 中定义的算子或子图指定底层循环优化。auto-tuning 模块搜索最佳 schedule,并将其与 cost model 和设备上的测量值进行比较。 TVM 中有两个 auto-tuning 模块。

1.AutoTVM:基于模板的 auto-tuning 模块。它运行搜索算法以在用户定义的模板中找到可调 knob 的最佳值。 TOPI 中已经提供了常用算子的模板。
2.AutoScheduler(又名 Ansor):无模板的 auto-tuning 模块。它不需要预定义的 schedule 模板,而是通过分析计算定义自动生成搜索空间,然后在生成的搜索空间中搜索最佳 schedule。

步骤五:为模型编译选择最佳配置。调优后,auto-tuning 模块会生成 JSON 格式的调优记录。此步骤为每个子图选择最佳 schedule。

步骤六:降级为张量中间表示(TIR,TVM 的底层中间表示)。基于调优步骤选择最佳配置后,所有 TE 子图降级为 TIR 并通过底层优化 pass 进行优化。接下来,优化的 TIR 降级为硬件平台的目标编译器。这是生成可部署到生产的优化模型的最终代码生成阶段。 TVM 支持多种不同的编译器后端:

1.LLVM,针对任意微处理器架构,包括标准 x86 和 ARM 处理器、AMDGPU 和 NVPTX 代码生成,以及 LLVM 支持的任何其他平台。
2.特定编译器,例如 NVCC(NVIDIA 的编译器)。
3.嵌入式和特定 target,通过 TVM 的 自定义代码生成(Bring Your Own Codegen, BYOC)框架实现。

步骤七:编译成机器码。compiler-specific 的生成代码最终可降级为机器码。 TVM 可将模型编译为可链接对象模块,然后轻量级 TVM runtime 可以用 C 语言的 API 来动态加载模型,也可以为 Python 和 Rust 等其他语言提供入口点。或将 runtime 和模型放在同一个 package 里时,TVM 可以对其构建捆绑部署。

经过以上的理论科普,我想用我自己的话来总结一下TVM有什么用:
即:TVM可以把你在任何平台上训练好的模型(Windows,Linux,ARM端等等),打包好,并把你优化好的模型放到任何你想要放到的平台上运行,也就是AI技术的落地。

以上只是自己学习过程中的一个笔记,如果大家想做一些关于TVM的例子,了解一下怎么将自己搭建的神经网络模型转换成onnx格式的模型权重,非常推荐大家看这篇大佬的经验贴,https://cloud.tencent.com/developer/article/2346576,写的非常好。

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

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

相关文章

宝塔linux 安装code-server指定对应的端口无法访问

这个一般就是nginx搞的鬼,如果服务正常启动,就是访问不了;大概就是宝塔安装的nginx配置没有代理code-server服务对应的端口,一般就是nginx配置文件的问题 安装默认的nginx会有一个配置文件 直接拉到最后会有一行这个&#xff0c…

(三十二)栈(stack)

文章目录 栈(stack)1.1 操作1.2 关于栈的题目1.2.1 出栈顺序1.2.2 入栈顺序1.3.3 括号匹配 这篇文章将会讲两个不同的数据类型,分别是栈与队列(双向队列是两个的拓展) 栈(stack) 栈是一种特殊的…

自闭症孩子送寄宿学校,给他们成长的机会

在自闭症儿童的教育与康复之路上,选择一种合适的寄宿方式对于孩子的成长至关重要。这不仅关乎到孩子能否获得专业的训练与关怀,还直接影响到他们未来的社交能力、独立生活能力以及心理健康。今天,我们将以广州的星贝育园自闭症儿童寄宿制学校…

stm32单片机个人学习笔记6(EXTI外部中断)

前言 本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 STM32入门教程-2023版 细…

【动态库的加载】【进程地址空间(三)】

目录 1. 宏观看待动态库的加载2. 进程地址空间第二讲2.1 程序没有加载前的地址2.2 程序加载后的地址 3. 动态库的地址 再谈进程地址空间时,【Linux】动静态库 我们先讲一个关于动态库是如何加载的话题,再引入进程地址空间,再次谈论该话题。 …

在ComfyUI中,Cross-Attention优化方案应该选哪个?

🐱‍🐉背景 在comfyui中,如果你使用了秋叶的启动器,会在高级选项中看到这样一行选项:Cross-Attention优化方案,右边有个下拉框,可以选择的选项有4个,如下图: 那么&#…

设计模式之观察者模式例题

答案:D 知识点: 观察者模式意图是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 状态模式 意图:允许一个对象在其内部状态改变时改变它的行为

【verilog】4. gtkwave的调用

文章目录 前言实验步骤 前言 进行 数电 FPGA 实验 实验步骤 将 GTKwave 的 bin 文件夹路径添加到 “系统环境变量” 的 “Path” 中 启动 debugger wizard, 设置观测信号 编译选择 2进制 文件 点击 start programming connect debugger 选择触发方式 Run 自动打开 gtkwave&a…

[Meachines] [Medium] Querier XLSM宏+MSSQL NTLM哈希窃取(xp_dirtree)+GPP凭据泄露

信息收集 IP AddressOpening Ports10.10.10.125TCP:135, 139, 445, 1433, 5985, 47001, 49664, 49665, 49666, 49667, 49668, 49669, 49670, 49671 $ nmap -p- 10.10.10.125 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 135/tcp open msrp…

【若依RuoYi-Vue | 项目实战】帝可得后台管理系统(二)

文章目录 一、人员管理1、需求说明2、生成基础代码(1)创建目录菜单(2)添加数据字典(3)配置代码生成信息(4)下载代码并导入项目 3、人员列表改造(1)基础页面&a…

机器学习算法那些事 | TPAMI 2024.9 | FeatAug-DETR:通过特征增强丰富DETRs的一对多匹配

本文来源公众号“机器学习算法那些事”,仅用于学术分享,侵权删,干货满满。 原文链接:TPAMI 2024.9 | FeatAug-DETR:通过特征增强丰富DETRs的一对多匹配 论文标题:FeatAug-DETR: Enriching One-to-Many Mat…

智能指针:作用 | 使用 | 原理 | 内存泄漏

🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据…

golang学习笔记4-基本数据类型

注:本人已有C,C,Python基础,只写本人认为的重点。 go的数据类型如下 由于bool和c类似,和go的区别是,bool的值只能取true和false,不能取整数,而且有默认值false。 一、整数型 整数型存放整数&…

设计模式之策略模式例题

答案:A 知识点: 策略模式又叫模板方法模式 它的意图是定义一个操作中的算法骨架。而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义算法的某些特定步骤

3.5.2 __ipipe_init()之完成中断处理程序设置

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力! 3.5.2 __ipipe_init()之完成中断处理程序设置 __ipipe_init()最核心的就是__ipipe_enable_pipeline()&am…

分享两道算法题

分享两道算法题 王者荣耀分组 题目描述 部门准备举办一场王者荣耀表演赛,有 10 名游戏爱好者参与,分 5 为两队,每队 5 人。 每位参与者都有一个评分,代表着他的游戏水平。 为了表演赛尽可能精彩,我们需要把 10 名参赛…

十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)

十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式) 文章目录 十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)1. Spring Boot 配置 MyBatis 的详细步骤2. 最后: MyBatis 的官方文档:https://mybatis.p2hp.com/ 关于 MyBa…

内网渗透-红日1

红日靶场1 渗透测试过程外网打点突破边界内网横向权限维持最后 渗透测试过程 本文章只说明渗透测试思路和技巧,对域靶场搭建不进行赘述 web-ip外网设置为 192.168.119.130,kali和外网ip同网段 外网打点 kali扫描目标ip nmap扫描目标网段   nmap -P…

【记录】大模型|Windows 下 Hugging Face 上的模型的通用极简调用方式之一

这篇文是参考了这篇,然后后来自己试着搭了一下,记录的全部过程:【翻译】Ollama|如何在 Ollama 中运行 Hugging Face 中的模型_ollama 导入 huggingface-CSDN 博客 另外还参考了这篇:无所不谈,百无禁忌,Win11 本地部署无…

【C++初阶】探索STL之——vector

【C初阶】探索STL之——vector 1.什么是vector2.vector的使用2.1 vector的定义2.2 vector iterator(迭代器)的使用2.3 vector空间问题2.4 vector的增删查改2.5 vector迭代器失效的问题2.5.1 vector常见迭代器失效的操作 3 动态二位数组 1.什么是vector vector其实就是一个可以…