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

我们使用 OpenAI Triton 生成一些 GPU 内核。Triton 允许为某些融合生成快速 GPU 内核,但我们必须为每次此类融合调整一些参数。

如果存在许多融合,则可能需要很长时间,因此我们提供了一种方式来加载这些自动调整结果,同时仍正常运行其他编译步骤。如果我们做出一些更改,自动调整缓存仍然非常有用:缓存中存在的融合将使用缓存,其他融合将正常自动调优。

您可以使用以下参数转储/加载自动调整的结果:

--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
    

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

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