快捷方式

TunableOp

注意

这是一个原型功能,这意味着它处于早期反馈和测试阶段,其组件可能会发生变化。

概述

此模块公开了 TunableOp 接口。

某些操作(例如 GEMM)可以使用多个库或多种技术来实现。例如,可以使用 blas 或 blasLt 库为 CUDA 或 ROCm 实现 GEMM。此外,ROCm 的 rocblas 和 hipblaslt 库允许用户查询所有可能的算法,然后选择一个。如何知道哪个实现最快,应该选择哪个?这就是 TunableOp 提供的功能。

分别启用 TunableOp 和调整

TunableOp 功能与启用调整阶段本身是分开启用的。启用 TunableOp 意味着 PyTorch 将用其可调实现替换任何标准运算符。对 TunableOp 的任何调用首先都会检查是否已针对给定的运算符输入对其进行调整。如果是,它将立即调用已调整的操作;即使启用了调整设置,也不会发生进一步的调整。相反,如果未找到调整结果,并且启用了调整,则 TunableOp 将为给定输入集的该运算符的每个已注册实现设置基准并选择最快的实现。

文件输入和输出

第一次调用任何 TunableOp 时,将通过尝试从给定文件读取结果来准备已调整操作的内部数据库。默认文件名是“tunableop_results.csv”。为了支持在跨多个进程使用多个 GPU 时进行调整,GPU 设备序号会自动插入文件名中,以避免多个进程覆盖同一文件。

如果启用了调整并且在工作负载过程中发现了新的调整,它还会将所有调整写入同一文件名,包括它在启动时读取的调整以及在运行时找到的新调整。例如,这可以用于通过重用同一文件在许多工作负载中构建调整文件。应用程序终止时会自动创建输出文件。此行为可以通过 C++ 和 Python API 控制,但不能通过环境变量控制。

假设您指定了文件名,您最终将获得一个 CSV 文件,其内容如下所示

Validator,PT_VERSION,2.2.0
Validator,ROCM_VERSION,6.0.0.0-12969-1544e39
Validator,HIPBLASLT_VERSION,0.6.0-a9c5cc7
Validator,ROCBLAS_VERSION,4.0.0-72e57364-dirty
GemmTunableOp_float_NT,nt_25088_4096_64,1219,1.262
GemmTunableOp_float_NT,nt_4096_4096_64,1216,0.033

请注意“Validator”行。如果更改库版本、ROCm 版本或 PyTorch 版本,TunableOp 将检测到这一点并拒绝调整文件,因为先前的调整可能受到其他软件更改的影响。

其余行是执行期间遇到的每个 TunableOp 的已调整解决方案。每行包含 4 个逗号分隔的字段:运算符名称、运算符参数、解决方案名称和平均执行时间。执行时间是可选字段。CSV 文件可以编辑,但要谨慎。例如,解决方案名称(字段 3)可以更改为“Default”,它将回退到原始的 PyTorch 未调整实现。或者,在 ROCm 的 hipBLAS 或 hipBLASLt 库的情况下,如果您知道特定的解决方案索引,则可以通过替换值来覆盖 TunableOp 选择的解决方案。运算符名称和参数(字段 1 和 2)是内部命名的,不应修改。在 GemmTunableOp 的情况下,字段 1 指示数据类型以及输入是否转置 (T) 或不转置 (N),字段 2 指示 M、N、K 输入形状。

可以选择启用详细输出,但仅建议用于调试目的。这将生成大量诊断消息,但可能有助于查看是否正在使用 TunableOp。否则,TunableOp 完全静默,除了文件输出外,除非在使用过程中出现警告或错误。详细选项仅通过设置环境变量 PYTORCH_TUNABLEOP_VEROBSE=1 才可用。

关于调整行为的说明

调整运算符包括迭代已注册实现列表或配置文件中的每一个。配置文件是通过在循环中多次运行单个实现并获取平均执行时间来建立的。

默认情况下,给定运算符的每个可能的解决方案将运行 100 次迭代或在 30 毫秒内可以运行的迭代次数,取较小者,并将计算其平均执行情况。将在所有已成功分析的解决方案中选择最快的解决方案。如果给定解决方案无法达到与默认实现相同的精度,或者如果解决方案返回错误代码,则配置文件可能会失败。

当前可调运算符

用于 ROCm 的 TunableGemm

目前仅实现了用于 ROCm 的 TunableGemm。请注意,当使用 TunableOp 时,PyTorch 的 CUDA 版本将正常运行,但 CUDA 版本可用的唯一解决方案是“Default”实现,即原始的 cuBLAS 默认实现,现在通过 TunableOp 调用。启用后,任何对 at::cuda::blas::gemm() 或 ::bgemm() 的调用都将通过 TunableOp 路由。对于给定的一组输入参数(transa、transb、m、n、k)调用 gemm() 将尝试在 rocblas 和 hipblaslt 中使用最快的可用实现。

调优上下文

TunableOp 的行为目前通过环境变量、at::cuda::tunable::getTuningContext() 的 C++ 接口或包装 C++ TuningContext 的 torch.cuda.tunable Python 接口进行操作。环境变量优先于使用 C++ 或 Python API 操作的任何设置。

API 参考

torch.cuda.tunable.enable(val=True)[source]

这是所有 TunableOp 实现的总开关。

torch.cuda.tunable.is_enabled()[source]

返回 TunableOp 功能是否已启用。

返回类型

bool

torch.cuda.tunable.tuning_enable(val=True)[source]

启用 TunableOp 实现的调优。

启用后,如果找不到已调优的条目,则运行调优步骤并记录该条目。

torch.cuda.tunable.tuning_is_enabled()[source]

返回 TunableOp 实现是否可以进行调优。

返回类型

bool

torch.cuda.tunable.set_max_tuning_duration(duration)[source]

设置用于调优给定解决方案的最长时间(以毫秒为单位)。

如果同时设置了最大调优持续时间和迭代次数,则将遵循两者中较小的那个。始终至少运行 1 次调优迭代。

torch.cuda.tunable.get_max_tuning_duration()[source]

获取用于调优给定解决方案的最长时间。

返回类型

int

torch.cuda.tunable.set_max_tuning_iterations(iterations)[source]

设置用于调优给定解决方案的最大迭代次数。

如果同时设置了最大调优持续时间和迭代次数,则将遵循两者中较小的那个。始终至少运行 1 次调优迭代。

torch.cuda.tunable.get_max_tuning_iterations()[source]

获取用于调优给定解决方案的最大迭代次数。

返回类型

int

torch.cuda.tunable.set_filename(filename, insert_device_ordinal=False)[source]

设置用于输入/输出调优结果的文件名。

如果insert_device_ordinalTrue,则当前设备序号将自动添加到给定的文件名中。这可用于每 GPU 一个进程的场景中,以确保所有进程都写入不同的文件。

torch.cuda.tunable.get_filename()[source]

获取结果文件名。

返回类型

str

torch.cuda.tunable.get_results()[source]

返回所有 TunableOp 结果。

返回类型

Tuple[str, str, str, float]

torch.cuda.tunable.get_validators()[source]

返回 TunableOp 验证器。

返回类型

Tuple[str, str]

torch.cuda.tunable.write_file_on_exit(val)[source]

在调优上下文销毁期间,将文件写入磁盘。

这在您的应用程序由于正常操作或错误而终止时,作为结果的最终刷新到磁盘很有用。可以通过手动调用write_file()来手动刷新您的结果。

torch.cuda.tunable.write_file(filename=None)[source]

将结果写入 CSV 文件。

如果没有给出filename,则调用get_filename()

返回类型

bool

torch.cuda.tunable.read_file(filename=None)[source]

从 TunableOp CSV 文件读取结果。

如果没有给出filename,则调用get_filename()

返回类型

bool

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取针对初学者和高级开发者的深入教程

查看教程

资源

查找开发资源并获得问题的解答

查看资源