使用 Holistic Trace Analysis 进行 Trace Diff#
创建日期:2024年1月2日 | 最后更新:2024年1月5日 | 最后验证:未验证
作者: Anupam Bhatnagar
有时,用户需要识别由于代码更改而导致的 PyTorch 算子(operators)和 CUDA 内核(kernels)的变化。为了支持这一需求,HTA 提供了 trace 比较功能。该功能允许用户输入两组 trace 文件,其中第一组可被视为对照组,第二组可被视为实验组,类似于 A/B 测试。TraceDiff 类提供了比较 trace 之间差异的函数以及可视化这些差异的功能。具体而言,用户可以找到在每组中被添加和删除的算子与内核,以及每个算子/内核的出现频率和累计耗时。
TraceDiff 类具有以下方法:
compare_traces:比较两组 trace 中 CPU 算子和 GPU 内核的频率和总时长。
ops_diff:获取以下算子和内核:
新增 (added):在实验组 trace 中出现,而在对照组 trace 中缺失
删除 (deleted):在实验组 trace 中缺失,而在对照组 trace 中出现
增加 (increased):在实验组 trace 中频率增加,且在对照组 trace 中也存在
减少 (decreased):在实验组 trace 中频率减少,且在对照组 trace 中也存在
未变 (unchanged):在两组 trace 之间保持不变
最后两个方法可以使用 compare_traces 方法的输出,来可视化 CPU 算子和 GPU 内核在频率和时长方面的各种变化。
例如,频率增加最多的前十个算子可以通过以下方式计算:
df = compare_traces_output.sort_values(by="diff_counts", ascending=False).head(10)
TraceDiff.visualize_counts_diff(df)
同样,时长变化最大的前十个算子可以通过以下方式计算:
df = compare_traces_output.sort_values(by="diff_duration", ascending=False)
# The duration differerence can be overshadowed by the "ProfilerStep",
# so we can filter it out to show the trend of other operators.
df = df.loc[~df.index.str.startswith("ProfilerStep")].head(10)
TraceDiff.visualize_duration_diff(df)
有关此功能的详细示例,请参阅代码库 examples 文件夹中的 trace_diff_demo notebook。