microTVM 设计文档
背景
TVM 是一个模型部署框架,它在传统操作系统上的各种模型中性能较好。TVM 的分层编译方法是针对裸机设备的自然扩展。虽然大多数编译流程无需更改这类设备上的概念验证(proof-of-concept, POC)的实现,但 runtime 不能依赖于:
- 虚拟内存,以及任何系统提供的
malloc
。此外,裸机设备的内存通常非常有限(以 KB 为单位)。正因如此,这类平台的库在使用内存时要更加谨慎,并且在不使用时释放内存。 - 传统的操作系统抽象,例如 文件,库 和 内核函数。一些项目支持这些,但它们不是标准的。
- 支持除 C 外的编程语言。
这类更改需要不同于传统的操作系统上的 TVM C++ runtime 的方法。
典型用途
本节讨论对「典型」microTVM 用例的看法。所有实现此典型用例的组件都很灵活,但这种统一的看法有助于激发每个部分的设计。
该过程的各个部分描述如下:
- 模型导入。用户导入已有模型,或向 TVM 描述新模型,生成 Relay 模块。
- 模型转换。用户可以对模型应用变换,例如量化。每次转换后,用户仍保留 Relay 模块。
- 编译(调度和代码生成)。TVM 通过为每个 Relay 算子指定 schedule 和 schedule 配置,将每个算子实现到 Tensor IR 中。然后,为每个算子生成代码(C 源代码或编译对象)。
- 集成。将生成的代码与 TVM C Runtime 库一起集成到用户提供的二进制项目中。在某些情况下(例如当项目跨多个 SoC/开发单板标准化时),此过程将会自动处理。
- 部署。项目已构建,剩余的固件二进制文件将烧录到设备上。模型推理由 TVM 用设备上的 RPC 服务器驱动,或者用图执行器在设备上驱动。
设计目标
microTVM 旨在实现以下设计目标:
- 可移植代码。microTVM 可将所有 Relay 模型,转换为仅用 C 标准库就可以编译的 C 代码。
- 最小开销。microTVM 生成特定于 target 的高度优化代码。应该避免 runtime 尽可能多的开销。
- 易懂的代码。microTVM 将 C 源代码视为一流的输出机制,以便固件工程师更容易理解和调整。