【TVM 教程】向 TVM 中添加 Codegen

💡 原文中文,约25300字,阅读约需61分钟。
📝

内容提要

Apache TVM 是一个支持多种硬件的深度学习编译框架,提供统一的编程接口,简化高性能模型在不同设备上的实现。开发手册指导如何为硬件生成代码并注册为 Relay 后端编译器,支持生成 C 代码或其他计算图形式。用户可通过自定义标签注释模型以提升性能。

🎯

关键要点

  • Apache TVM 是一个支持多种硬件的深度学习编译框架,简化高性能模型在不同设备上的实现。

  • 统一的编程接口可以让用户和硬件厂商信息同步,提供高性能的解决方案。

  • 开发手册指导硬件厂商如何实现自己的 Codegen,并注册为 Relay 后端编译器。

  • 用户可以生成 C 代码或其他计算图形式,提升模型性能。

  • 实现 C Codegen 需要生成函数声明、函数调用和分配中间数组。

  • CodegenC 类用于遍历子图并生成 C 代码,支持多种算子。

  • ExampleJson 计算图表征可以通过自定义 Codegen 生成,并实现自定义 runtime 模块。

  • 自定义 runtime 模块需要实现 GetFunction、SaveToBinary 和 LoadFromBinary 等函数。

  • 用户可以通过 Python API 加载和创建自定义模块,支持直接从文件创建模块。

🔎

延伸解读

统一编程接口的重要性

随着深度学习硬件的多样化,统一的编程接口显得尤为重要。它不仅能简化用户在不同设备间的开发流程,还能确保高性能算子的有效利用。通过统一接口,用户可以更轻松地在新硬件上实现模型,而无需重新学习每个设备的特定编程方式。

Codegen的实现细节

实现C Codegen时,用户需要关注函数声明、调用及中间数组的分配。通过定义宏,用户可以快速生成一维和二维张量的操作代码。此外,CodegenC类的设计使得遍历子图并生成代码变得高效,确保了生成的代码与TVM runtime的兼容性。

自定义Runtime模块的构建

在实现自定义Runtime模块时,用户需确保模块能够正确解析计算图并执行相应的操作。通过实现GetFunction和Run方法,用户可以将输入数据传递给算子,并获取输出结果。此外,SaveToBinary和LoadFromBinary方法的实现确保了模块的持久化和复原,便于后续的部署和使用。

延伸问答

Apache TVM 是什么?

Apache TVM 是一个支持多种硬件的深度学习编译框架,旨在简化高性能模型在不同设备上的实现。

如何为硬件实现自己的 Codegen?

硬件厂商可以通过开发手册指导,轻松实现自己的 Codegen,并将其注册为 Relay 后端编译器。

用户如何生成 C 代码?

用户可以实现一个能为子图生成 C 代码的 Codegen,并将生成的 C 源代码模块集成到 TVM runtime 模块中。

CodegenC 类的作用是什么?

CodegenC 类用于遍历子图并生成 C 代码,支持多种算子。

如何实现自定义 runtime 模块?

用户需要实现 GetFunction、SaveToBinary 和 LoadFromBinary 等函数,以创建自定义 runtime 模块。

ExampleJson 计算图表征是什么?

ExampleJson 是一种简单的计算图表征,适用于没有控制流的计算图,用户可以通过自定义 Codegen 生成。

🏷️

标签

➡️

继续阅读