我们使用 OpenAI Triton 生成一些 GPU 内核。Triton 允许为某些融合生成快速 GPU 内核,但我们必须为每次此类融合调整一些参数。
如果存在许多融合,则可能需要很长时间,因此我们提供了一种方式来加载这些自动调整结果,同时仍正常运行其他编译步骤。如果我们做出一些更改,自动调整缓存仍然非常有用:缓存中存在的融合将使用缓存,其他融合将正常自动调优。
您可以使用以下参数转储/加载自动调整的结果:
--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
必须停用分片,才能为所有测试正确获取单个自动调优缓存。
然后,我们需要将该缓存上传到我们的代码库。
然后,我们必须将缓存添加到测试目标的数据依赖项中,并使用环境变量加载它。
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 编译器发展并生成不同的融合效果,缓存也可能会过时。