TVM 和模型优化的概述(1)

文章目录

    • [1. 从 Tensorflow、PyTorch 或 Onnx 等框架导入模型(model)。](#1. 从 Tensorflow、PyTorch 或 Onnx 等框架导入模型(model)。)
    • [2.翻译成 Relay](#2.翻译成 Relay)
    • [3. lower 到 张量表达式。](#3. lower 到 张量表达式。)
    • [4. 使用 auto-tuning 模块 AutoTVM 或 AutoScheduler 搜索最佳 schedule。](#4. 使用 auto-tuning 模块 AutoTVM 或 AutoScheduler 搜索最佳 schedule。)
    • [5. 选择最佳配置进行模型编译。](#5. 选择最佳配置进行模型编译。)
    • [6. lower 到 TIR。](#6. lower 到 TIR。)
    • [7. 编译成机器码](#7. 编译成机器码)

Apache TVM 是开源的机器学习编译器框架,用于 CPU、GPU 和机器学习加速器。它的目标是让机器学习工程师在任何硬件后端优化和高效运行计算。

下图说明了机器学习模型在用 TVM 优化编译器框架进行变换时的步骤。

1. 从 Tensorflow、PyTorch 或 Onnx 等框架导入模型(model)。

importer 层是 TVM 可以从其他框架中导入模型的地方,比如 Tensorflow、PyTorch 或 ONNX。由于此开源项目在不断改进,TVM 为每个前端提供的支持水平也不尽相同。如果你在将模型导入 TVM 时遇到问题,你可能想尝试将其转换为 ONNX

2.翻译成 Relay

Relay 是 TVM 的高级模型语言。导入到 TVM 的模型是用 Relay 表示的。Relay 是一种函数式语言(functional language)和神经网络的中间表示法(IR)。它支持以下内容:

  • 传统的数据流图式表示法。
  • Functional-style scoping 和 let-binding 使其成为一种功能齐全的可微分语言。
  • 能够允许用户混合两种编程风格。

Relay 应用图级(graph-level)优化 passes 来优化模型。

3. lower 到 张量表达式。

lower 是指高层表示被变换为低层表示。在应用高层优化后,Relay 运行 FuseOps,将模型分割成许多小的子图,并将子图 lower 到 TE 表示。

张量表达式(Tensor Expression,简称 TE)是用于描述张量计算的专属域语言。

TE 还提供了几个 schedule 原语来指定低级的循环优化,例如平铺(tiling)、矢量化(vectorization)、并行化(parallelization)、unrolling 和 fusion。

为了帮助将 Relay 表示转换为 TE 表示的过程,TVM 包含张量算子清单(Tensor Operator Inventory,简称 TOPI),它有预先定义的常见张量算子的模板(如 conv2d、transpose)。

  • List item

4. 使用 auto-tuning 模块 AutoTVM 或 AutoScheduler 搜索最佳 schedule。

schedule 指定在 TE 中定义了算子或子图的低级循环优化。auto-tuning 模块搜索最佳 schedule 并将其与 cost 模型和设备上的测量结果进行比较。

在 TVM 中,有两个 auto-tuning 模块:

  • AutoTVM:基于模板的 auto-tuning 模块。它运行搜索算法为用户定义的模板中的可调节旋钮找到最佳值。对于常见的运算符,其模板已经在 TOPI 中提供。
  • AutoScheduler (别名 Ansor) :无模板的自动调谐模块。它不需要预先定义的 schedule 模板。相反,它通过分析计算的定义自动生成搜索空间。然后,它在生成的搜索空间中搜索最佳 schedule。

5. 选择最佳配置进行模型编译。

tuning 后,auto-tuning 模块会生成 JSON 格式的 auto-tuning 记录。这一步为每个子图挑选出最佳的 schedule。

6. lower 到 TIR。

TIR 是张量级的中间表示(Tensor Intermediate Representation),TVM 的低层次中间表示。

在根据 tuning 步骤选择最佳配置后,每个 TE 子图被降低到 TIR,并通过低级别的优化 passes 进行优化。

接下来,优化后的 TIR 被 lower 到硬件平台的目标编译器中。这是最后的代码生成阶段,产生可以部署到生产中的优化模型。

TVM 支持几种不同的编译器后端,包括:

  • LLVM:它可以针对任意的微处理器架构,包括 标准 x86 和 ARM 处理器,AMDGPU 和 NVPTX 代码生成,以及 LLVM
    支持的任何其他平台。
  • 专门的编译器,如 NVCC,NVIDIA 的编译器。

嵌入式和专用目标,通过 TVM 的 Bring Your Own Codegen(BYOC)框架实现。

7. 编译成机器码

在这个过程结束时,特定的编译器生成的代码可以 lower 为机器码。

TVM 可以将模型编译成可链接的对象模块,然后可以用轻量级的 TVM 运行时来运行,该运行时提供 C 语言的 API 来动态加载模型,以及其他语言的入口,如 Python 和 Rust。TVM 还可以建立捆绑式部署,其中运行时与模型结合在一个包中。

本教程的其余部分将更详细地介绍 TVM 的这些方面。

相关推荐
测试杂货铺5 分钟前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
艾派森9 分钟前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
hairenjing112311 分钟前
在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
android·人工智能·windows·macos·智能手机
小蜗子16 分钟前
Multi‐modal knowledge graph inference via media convergenceand logic rule
人工智能·知识图谱
SpikeKing28 分钟前
LLM - 使用 LLaMA-Factory 微调大模型 环境配置与训练推理 教程 (1)
人工智能·llm·大语言模型·llama·环境配置·llamafactory·训练框架
小码的头发丝、35 分钟前
Django中ListView 和 DetailView类的区别
数据库·python·django
黄焖鸡能干四碗1 小时前
信息化运维方案,实施方案,开发方案,信息中心安全运维资料(软件资料word)
大数据·人工智能·软件需求·设计规范·规格说明书
1 小时前
开源竞争-数据驱动成长-11/05-大专生的思考
人工智能·笔记·学习·算法·机器学习
ctrey_1 小时前
2024-11-4 学习人工智能的Day21 openCV(3)
人工智能·opencv·学习
攻城狮_Dream1 小时前
“探索未来医疗:生成式人工智能在医疗领域的革命性应用“
人工智能·设计·医疗·毕业