我们使用 OpenAI Triton 来生成一些 GPU 内核。Triton 允许为某些融合生成快速 GPU 内核,但我们必须为每种此类融合调整一些参数。
如果有许多融合,这可能需要很长时间,因此我们提供了一种方法来加载这些自动调整结果,同时仍正常运行其他编译步骤。进行一些更改后,自动调整缓存仍然很有用:缓存中存在的融合会使用缓存,而其他融合将正常自动调整。
推荐:缓存目录
--xla_gpu_per_fusion_autotune_cache_dir=your/directory
在给定目录中使用和维护按融合的自动微调缓存。每个不同的融合都会有一个文件。
这种方法的主要优势在于,您可以对多次 XLA 运行(针对不同模型)使用相同的缓存目录,并且随着遇到的每个新融合而扩大缓存,从而加快后续运行速度。此外,还支持使用相同的缓存目录并发运行多个 XLA 实例。
XLA 会在需要时读取现有结果,并在确定新结果后写入新结果。
- 该目录必须在运行 XLA 之前存在,并且必须可写。
- 缓存失效操作必须由用户处理:
- 如果您想从空缓存开始,请使用空目录。
- XLA 版本检查必须由用户完成:
- 如果您想为不同版本的 XLA 使用单独的缓存,请使用不同的目录。
缓存默认处于关闭状态(如果您未提供参数)。
限制:这并不能保证能与下文所述的其他缓存方法搭配使用。
替代方案:将给定 HLO 的所有结果加载或转储到一个文件
您可以使用以下参数转储/加载自动调整结果:
--xla_gpu_dump_autotune_results_to=
--xla_gpu_load_autotune_results_from=
如果我们指定 .txt 或 .textproto 文件,则缓存将以 textproto 格式转储,否则将以二进制 protobuf 格式转储。
在测试中
持久性自动调整功能还可用于测试。如果测试非常大,尤其是测试环境的性能有限,建议使用该方法。
只有当自动调整缓存包含在运行测试的同一类型的 GPU 上生成的结果时,它才能正常工作。
让测试使用持久性自动调整
现在,我们假设相关测试始终使用同一 GPU 类型。
我们必须从测试中导出自动优化结果,例如,通过向测试命令指定以下参数:
--test_env=XLA_FLAGS=--xla_gpu_dump_autotune_results_to=TEST_UNDECLARED_OUTPUTS_DIR/autotune_cache.textproto --test_sharding_strategy=disabled
必须停用分片,才能为所有测试正确获取单个 Autotune 缓存。
然后,我们必须将该缓存上传到代码库。
然后,我们必须将缓存添加到测试目标的数据依赖项,并使用环境变量加载它。
data = ["test_autotune_cache.textproto"], env = {"XLA_FLAGS": "--xla_gpu_load_autotune_results_from=" + "$(execpath test_autotune_cache.textproto)"},
(在加载自动优化结果的测试中使用分片是可以的。)
另请参阅 xla/service/gpu/tests/BUILD 中的示例测试:
- load_autotune_results_using_execpath_test
- load_autotune_results_from_test_workspace_test
- dump_autotune_results_to_test_outputs_test
缓存过时
如果对模型进行了大量更改,则缓存可能不再包含所有融合,因此测试速度会变慢。在这种情况下,我们必须重新生成自动调节缓存。
如果我们开始使用新型 GPU 运行测试,情况也是如此。
如果 XLA 编译器发生演变并生成不同的融合,缓存也可能会过时。