快捷方式

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++ 接口或 torch.cuda.tunable Python 接口(包装 C++ TuningContext)进行操作。环境变量优先于您使用 C++ 或 Python API 操作的任何设置。

API 参考

torch.cuda.tunable.enable(val=True)[源代码][源代码]

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

torch.cuda.tunable.is_enabled()[源代码][源代码]

返回 TunableOp 功能是否已启用。

返回类型

bool

torch.cuda.tunable.tuning_enable(val=True)[源代码][源代码]

启用 TunableOp 实现的调优。

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

torch.cuda.tunable.tuning_is_enabled()[源代码][源代码]

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

返回类型

bool

torch.cuda.tunable.record_untuned_enable(val=True)[源代码][源代码]

启用记录 TunableOp 操作的未调优版本,以便进行离线调优。

启用后,如果未找到已调优的条目,则将其写入未调优文件。

torch.cuda.tunable.record_untuned_is_enabled()[源代码][源代码]

返回是否记录 TunableOp 操作以进行离线调优。

返回类型

bool

torch.cuda.tunable.set_max_tuning_duration(duration)[源代码][源代码]

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

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

torch.cuda.tunable.get_max_tuning_duration()[源代码][源代码]

获取调优给定解决方案的最大时间。

返回类型

int

torch.cuda.tunable.set_max_tuning_iterations(iterations)[源代码][源代码]

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

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

torch.cuda.tunable.get_max_tuning_iterations()[源代码][源代码]

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

返回类型

int

torch.cuda.tunable.set_filename(filename, insert_device_ordinal=False)[源代码][源代码]

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

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

torch.cuda.tunable.get_filename()[源代码][源代码]

获取结果文件名。

返回类型

str

torch.cuda.tunable.get_results()[源代码][源代码]

返回所有 TunableOp 结果。

返回类型

(元组)[str, str, str, float]

torch.cuda.tunable.get_validators()[源代码][源代码]

返回 TunableOp 验证器。

返回类型

(元组)[str, str]

torch.cuda.tunable.write_file_on_exit(val)[源代码][源代码]

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

如果您的应用程序由于正常操作或错误而终止,这可以用作将结果最终刷新到磁盘的方法。可以通过手动调用 write_file() 来实现结果的手动刷新。

torch.cuda.tunable.write_file(filename=None)[源代码][源代码]

将结果写入 CSV 文件。

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

返回类型

bool

torch.cuda.tunable.read_file(filename=None)[源代码][源代码]

从 TunableOp CSV 文件读取结果。

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

返回类型

bool

torch.cuda.tunable.tune_gemm_in_file(filename)[源代码][源代码]

在文件中调优 GEMM。

torch.cuda.tunable.mgpu_tune_gemm_in_file(filename_pattern, num_gpus)[源代码][源代码]

处理一个或多个文件,并将工作分配到一个或多个 GPU 上。

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取面向初学者和高级开发者的深入教程

查看教程

资源

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

查看资源