Model 库格式#
关于 Model 库格式#
TVM 传统上将生成的库作为动态共享对象(例如 DLLs(Windows)或 .so(linux))导出。可以使用这些库通过使用 libtvm_runtime.so
将其加载到可执行文件中来执行推理。此过程非常依赖于传统操作系统提供的服务。
对于部署到非传统平台(例如缺乏传统操作系统的平台),TVM 提供了另一种输出格式,即模型库格式。最初,microTVM 项目是此格式的主要用例。如果它在其他用例中变得有用(特别是如果它成为可能以 Model Library 格式导出 BYOC 制品),则可以将其用作通用的 TVM 导出格式。Model Library 格式包含 TVM 编译器输出的每个文件的 tarball。
可以输出什么?#
在撰写本文时,导出仅限于使用 tvm.relay.build
构建的完整模型。
直接布局#
Model Library Format 包含在 tarball 中。所有路径都相对于 tarball 的根目录:
/
- tarball 的根目录codegen
- 所有生成的设备代码的根目录阅读 codegen 部分
executor-config/
- 驱动模型推理执行器的配置graph/
- 包含 GraphExecutor 配置的根目录graph.json
- GraphExecutor JSON 配置
metadata.json
- 该模型的机器可解析元数据parameters/
- 简化参数所放置的根目录<model_name>.params
- tvm.relay._save_params 格式的模型参数
src/
- TVM 使用的所有源代码的根目录relay.txt
- 生成模型的 Relay 源代码
Description of Sub-directories#
codegen
#
所有由 TVM 生成的代码都存放在该目录中。在编写本文时,每个生成的模块树中有 1 个文件,但是这种限制在未来可能会改变。该目录中的文件应该具有以下格式的文件名: <target>/(lib|src)/<unique_name>.<format>
。
以下将对这些组件进行描述:
<target>
- 标识应在其上运行代码的 TVM 目标。目前仅支持host
。
<unique_name>
- 用于标识此文件的唯一短标识符。当前为lib<n>
,其中<n>>
是自增的整数。
<format>
- 用于标识文件名格式的后缀。当前为c
或o
。
下面是 CPU-only 模型的目录树示例:
codegen/
- Codegen 目录host/
- 为target_host
生成的代码。lib/
- 生成的二进制目标文件。
lib0.o
- LLVM 模块(如果使用llvm
目标)。lib1.o
- LLVM CRT 元数据模块(如果使用llvm
目标)。
src/
- 生成的 C 源代码。lib0.c
- C 模块(如果使用c
目标)。lib1.c
- C CRT 元数据模块(如果使用c
目标)。
executor-config
#
包含可驱动模型推断的执行器的机器可解析配置。目前,仅 GraphExecutor 会生成该目录的配置,位于 graph/graph.json
中。应读取该文件并将结果字符串提供给 GraphExecutor()
构造函数进行解析。
parameters
#
包含机器可解析参数。可以提供各种格式,但目前只提供由 tvm.relay._save_params
生成的格式。使用 tvm.relay.build
进行构建时,name
参数被认为是模型名称。在该目录中创建单个文件 <model_name>.json
。
src
#
包含由 TVM 解析的源代码。目前,仅 Relay 源代码在 src/relay.txt
中创建。
Metadata#
机器可解析元数据放置在压缩文件的根目录下的 metadata.json
文件中。元数据是包含以下键的字典:
export_datetime
:此模型库格式生成时的时间戳,格式为 strftime 的"%Y-%M-%d %H:%M:%SZ",
。memory
:每个生成函数的内存使用情况的摘要,详细说明在 Memory Usage Summary 中。model_name
:此模型的名称(例如提供给tvm.relay.build
的name
参数).executors
:此模型支持的执行器列表。当前,此列表总是["graph"]
。target
:将device_type``(作为字符串的底层整数)映射到描述用于该 ``device_type
的 Relay 后端的子目标的字典。version
:数字版本号,用于标识此模型库格式中使用的格式。当元数据结构或磁盘结构更改时,此数字将递增。此文档反映版本5
。
内存使用概要#
一个包含这些子键的字典:
"main"
:list[MainFunctionWorkspaceUsage]
。一个列表,总结了主函数和所有调用的子函数使用的每个工作空间的内存使用情况。
"operator_functions"
: ``map[string, list[FunctionWorkspaceUsage]]`。将算子函数名称映射到列表,该列表总结了函数使用的每个工作空间的内存使用情况。
MainFunctionWorkspaceUsage
是带有以下键的字典:
device
:int
。与此工作空间关联的device_type
。"workspace_size_bytes"
:int
。该函数及其调用的所有子函数所需的此工作空间中的字节数。"constants_size_bytes"
:int
。主函数使用的常量的大小。"io_size_bytes"
:int
。该函数及其子函数从此工作空间中使用的缓冲区大小的总和。
FunctionWorkspaceUsage
是具有以下键的字典:
device
:int
。与此工作空间关联的device_type
。"workspace_size_bytes"
:int
。此函数在此工作空间中所需的字节数。