持续的自动调整(仅限 GPU)

我们使用 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 类型。

  1. 我们必须从测试中导出自动优化结果,例如,通过向测试命令指定以下参数:

    --test_env=XLA_FLAGS=--xla_gpu_dump_autotune_results_to=TEST_UNDECLARED_OUTPUTS_DIR/autotune_cache.textproto
    --test_sharding_strategy=disabled
    

    必须停用分片,才能为所有测试正确获取单个 Autotune 缓存。

  2. 然后,我们必须将该缓存上传到代码库。

  3. 然后,我们必须将缓存添加到测试目标的数据依赖项,并使用环境变量加载它。

    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 编译器发生演变并生成不同的融合,缓存也可能会过时。