【TVM 教程】Python Target 参数化
内容提要
Apache TVM 是一个支持多种硬件的深度学习编译框架,通过参数化测试确保在所有目标设备上输出正确结果,便于扩展和管理单元测试。用户可以使用 pytest 标记和环境变量配置灵活运行和管理测试。
关键要点
-
Apache TVM 是一个支持多种硬件的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。
-
TVM 确保在所有支持的 runtime 上输出正确的数字结果,单元测试应在所有支持的 runtime 上正常运行。
-
TVM 的辅助函数可以对所有单元测试进行参数化,便于在所有兼容设备上运行测试。
-
测试套件的单个 Python 函数可以扩展为多个参数化单元测试,每个单元测试对应一个 target 设备。
-
使用 @tvm.testing.parametrize_targets 装饰器可以显式列出要使用的 target,便于在多个 target 上运行测试。
-
可以使用 @tvm.testing.exclude_targets 或 @tvm.testing.known_failing_targets 装饰器来排除特定 target 或标记为预期失败。
-
参数化功能是在 pytest 标记之上实现的,允许为每个测试函数添加元数据。
-
使用环境变量 TVM_TEST_TARGETS 可以指定待运行的 target 列表,默认情况下使用 tvm.testing.DEFAULT_TEST_TARGETS。
-
在本地运行 Python 单元测试时,可以使用 pytest 命令,并通过环境变量配置 target 列表。
-
在 Docker 容器中运行单元测试时,可以使用 docker/bash.sh 脚本,并指定要运行的 Docker 镜像。
-
CI 中的测试从 Jenkinsfile 中的任务定义开始,定义使用的 Docker 镜像和编译时配置。
延伸解读
参数化测试的优势
使用 Apache TVM 的参数化测试功能,可以在多个硬件目标上高效地验证模型的输出。这种方法不仅提高了测试的覆盖率,还能确保在不同环境下的一致性,减少了因硬件差异导致的错误。
环境变量的重要性
在运行单元测试时,环境变量 TVM_TEST_TARGETS 的配置至关重要。它决定了哪些目标设备会被测试。如果未正确设置,可能导致测试仅在默认的 CPU 目标上运行,从而无法充分验证模型在其他硬件上的表现。
Docker 容器的使用
在 Docker 容器中运行单元测试可以确保环境的一致性,避免因系统依赖问题导致的测试失败。然而,用户需注意 Docker 镜像不包含 build/config.cmake 配置文件,可能需要额外的配置以确保测试顺利进行。
延伸问答
Apache TVM 是什么?
Apache TVM 是一个支持多种硬件的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。
如何在 TVM 中进行单元测试的参数化?
可以使用 @tvm.testing.parametrize_targets 装饰器显式列出要使用的 target,或通过环境变量 TVM_TEST_TARGETS 自动在所有 target 上进行参数化。
在本地运行 TVM 单元测试需要哪些步骤?
在本地运行 TVM 单元测试时,可以使用 pytest 命令,并通过环境变量配置 target 列表。
如何在 Docker 容器中运行 TVM 单元测试?
可以使用 docker/bash.sh 脚本指定要运行的 Docker 镜像,并在该镜像中执行单元测试。
TVM 如何确保在所有支持的 runtime 上输出正确结果?
TVM 通过参数化测试确保在所有目标设备上输出正确结果,单元测试应在所有支持的 runtime 上正常运行。
如何排除特定的 target 或标记为预期失败?
可以使用 @tvm.testing.exclude_targets 或 @tvm.testing.known_failing_targets 装饰器来排除特定 target 或标记为预期失败。