收集数据并训练决策树启发式)
PyTorch AutoHeuristic 实战为 A100/H100 上的矩阵乘法mm收集数据并训练决策树启发式【免费下载链接】pytorchTensors and Dynamic neural networks in Python with strong GPU acceleration项目地址: https://gitcode.com/GitHub_Trending/py/pytorch导读本文围绕 PyTorch 仓库中 mm 启发式生成指南 展开系统讲解如何为矩阵乘法mm这一核心算子利用 AutoHeuristic 框架自动收集 autotuning 数据、训练决策树启发式并生成随编译器分发的代码。读完本文你将掌握用官方数据集一键重生成 A100/H100 启发式、在多 GPU 上并行采集自定义训练数据、将 HuggingFace/TIMM 真实模型数据混入训练集以及理解决策树排名启发式的源码级工作原理。背景AutoHeuristic 与 mm 排名启发式AutoHeuristic 是 PyTorch 中一套用自动调优结果学习启发式的框架它把 autotuning 过程中收集到的候选算子、耗时与上下文特征记录成训练数据再用决策树或回归树学习出一个可读、可生成成 Python 代码的启发式最终随 Inductor 编译器一起分发使用。相比每次运行都做一次完整 autotune启发式可以在推理时以极低开销直接选出或排序出最合适的 kernel 选择。矩阵乘法 mm 是其中典型的kernel choice ranking场景在 GPU 上同一个torch.mm形状可能对应 ATen 原生实现extern_mm与多种 Triton kernel 候选autotune 会逐个测量耗时AutoHeuristic 则把这些测量结果学成对候选进行排序的决策树。mm/目录下的脚本正是为这一目标服务的完整工具链get_mm_dataset.sh下载 A100/H100 官方已收集数据集gen_heuristic_a100.sh/gen_heuristic_h100.sh基于现有数据重训启发式gen_data_mm.py自定义随机形状的数据采集 BenchmarkRunnertrain_decision_mm.py针对 mm 排名任务定制化的训练入口。快速开始用官方数据集重新生成 A100/H100 启发式如果你只希望在已有数据基础上重新生成 mm 启发式mm 目录提供了三个脚本依次执行即可bash get_mm_dataset.sh # 下载 A100 与 H100 数据集 bash gen_heuristic_a100.sh # 生成 A100 启发式 bash gen_heuristic_h100.sh # 生成 H100 启发式get_mm_dataset.sh 会从数据集仓库依次下载a100_mm.zip与h100_mm.zip解压后删除压缩包。解压得到的目录结构与后续脚本约定一致a100/、h100/两个子目录分别存放对应 GPU 的 txt 数据文件。gen_heuristic_a100.sh 的核心命令为python train_decision_mm.py a100/a100_mm.txt --heuristic-name MMRankingA100 --ranking 10 --save-dot --data train_timm a100/a100_timm_train_mm.txt --data train_hf a100/a100_hf_train_mm.txtH100 版本 结构与之一致仅将数据目录换为h100/、启发式命名为MMRankingH100。这里的几个关键参数含义参数含义--heuristic-name MMRankingA100生成的启发式名称最终产物为torch/_inductor/autoheuristic/artifacts/_MMRankingA100.py--ranking 10启用排名训练模式决策树学习的是对 top-10 候选的排序而非单一 winner--save-dot额外导出决策树的 DOT 描述文件便于可视化检查树结构--data train_timm .../--data train_hf ...注入 TIMM 与 HuggingFace 真实模型数据作为额外训练集mm 特有做法见后文从零采集数据generate_heuristic.sh 详解如果现有数据集覆盖不到你的目标 GPU 或形状分布需要自己采集数据。mm/README.md提到使用generate_heuristic_mm.sh仓库中该脚本的实际路径与名称为 torchgen/_autoheuristic/generate_heuristic.shmm 目录下并未单独放置同名脚本它在 collect 与 generate 两种模式间切换并统一封装了多 GPU 并行采集与数据合并逻辑。collect 模式并行跑 benchmark 并记录训练数据bash generate_heuristic.sh collect按 generate_heuristic.sh 的实现脚本要求至少 8 个位置参数位置变量说明1MODEcollect或generate2GPU_DEVICE_IDS逗号分隔的 GPU id如6,73CONDA_ENV用于激活的 conda 环境名4NUM_SAMPLES需要采集的样本总数会被均分到各 GPU5OUTPUT_DIR输出目录脚本会先mkdir -p6HEURISTIC_NAME启发式名称决定合并后的数据文件名与生成代码名7BENCHMARK_SCRIPT执行 benchmark 的 Python 入口mm 场景即gen_data_mm.py8TRAIN_SCRIPT训练脚本mm 场景即train_decision_mm.py9EXTRA_TRAIN_ARGS透传给训练脚本的额外参数可选collect 模式下脚本会调用 collect_data.shbash ../collect_data.sh python ${BENCHMARK_SCRIPT} ${GPU_DEVICE_IDS} ${NUM_SAMPLES} ${CONDA_ENV} ${OUTPUT_DIR}collect_data.sh 的实现细节值得注意它依赖tmux未安装会直接报错退出按 GPU id 数量把总样本数均分为每块 GPU 打开一个 tmux pane并执行形如conda activate ${CONDA_ENV} python benchmark --device id -o ${OUTPUT_DIR}/data_id.txt --num-samples 每个GPU的样本数随后以 tiled 布局排布并 attach 到该 tmux 会话方便你实时观察多块 GPU 的采集进度。多 GPU 产物的合并由于每块 GPU 会生成独立文件例如使用 id 6、7 时得到data_6.txt、data_7.txt训练前需要先合并成单文件。mm/README.md给出的命令为python torchgen/_autoheuristic/merge_data.py mm_train.txt data_6.txt data_7.txt注意README 原文中的_autuoheuristic为拼写错误仓库实际目录为 torchgen/_autoheuristic。merge_data.py 的合并规则是每个数据文件的前两行被视为元数据metadata其余为内容。合并时要求所有文件的元数据完全一致否则报Metadata mismatch并中止从而防止把不同环境/配置下采集的数据混在一起污染训练集。数据采集耗时与样本形状分布mm/README.md明确提示在随机输入上采集训练数据视 GPU 数量而定可能需要一天时间。这正是为什么框架提供了多 GPU 并行方案——把时间成本分摊到多块卡上。样本形状由 gen_data_mm.py 控制其形状采样分布get_distr_type见 gen_data_mm.py设计得贴近真实负载概率分布说明85%mult_128在2^10~2^17之间取 128 的倍数10%pow2在2^0~2^17中随机取 2 的幂4%uniform1~131072 均匀随机1%uniform-between-pow2在某两个相邻 2 的幂之间均匀随机同时满足以下约束才会被采纳gen_data_mm.pym*k、m*n、k*n均小于2^31超过该规模的张量本身不会触发 autotune且三个矩阵能装进显存fits_in_memory。每个形状还会遍历transpose_left × transpose_right的全部四种组合并在fresh_cache()下以modemax-autotune-no-cudagraphs编译执行torch.mm从而收集到真正经过 autotune 的耗时数据。融入真实模型数据HuggingFace 与 TIMM仅靠随机形状不足以覆盖真实模型中的常见形状组合因此 mm 启发式的训练数据特意加入了 HuggingFace 与 TIMM 两大类模型的实际计算轨迹。在运行前需要把 AutoHeuristic 切到收集模式清空USE、设置COLLECT并指定日志文件。HuggingFace 模型数据采集命令mm/README.md原文TORCHINDUCTOR_AUTOHEURISTIC_USE TORCHINDUCTOR_AUTOHEURISTIC_COLLECTmm TORCHINDUCTOR_AUTOHEURISTIC_LOG_PATHhf_train_mm.txt TORCHINDUCTOR_MAX_AUTOTUNE1 time python ../../../benchmarks/dynamo/huggingface.py --ci --performance --timing --explain --inductor --device cuda --train --ampTIMM 模型数据采集命令TORCHINDUCTOR_AUTOHEURISTIC_USE TORCHINDUCTOR_AUTOHEURISTIC_COLLECTmm TORCHINDUCTOR_AUTOHEURISTIC_LOG_PATHtimm_train_mm.txt TORCHINDUCTOR_MAX_AUTOTUNE1 time python ../../../benchmarks/dynamo/timm_models.py --ci --performance --timing --explain --inductor --device cuda --train --amp关键环境变量与参数含义TORCHINDUCTOR_AUTOHEURISTIC_USE本次不启用已学习的启发式TORCHINDUCTOR_AUTOHEURISTIC_COLLECTmm把mm相关的 autotune 结果记录到日志与 AutoHeuristic 构造时传入的 name 一致TORCHINDUCTOR_AUTOHEURISTIC_LOG_PATH指定输出数据文件即上述hf_train_mm.txt/timm_train_mm.txtTORCHINDUCTOR_MAX_AUTOTUNE1限制单算子 autotune 次数控制整体耗时benchmark 入口 benchmarks/dynamo/huggingface.py 与 benchmarks/dynamo/timm_models.py 为仓库自带的 Dynamo 模型基准--ci --performance --timing --explain --inductor --device cuda --train --amp组合表示以 CI 模式、带计时与解释、在 CUDA 上用 AMP 训练方式跑这些模型。训练并生成启发式generate 模式数据齐备后回到统一入口执行bash generate_heuristic_mm.sh generate在 generate_heuristic.sh 的 generate 模式下会依次完成两件事合并多 GPU 数据根据GPU_DEVICE_IDS如6,7自动拼出data_6.txt data_7.txt合并为${OUTPUT_DIR}/${HEURISTIC_NAME}.txt训练并生成代码执行训练脚本将决策树启发式以 Python 代码形式输出到torch/_inductor/autoheuristic/artifacts/_${HEURISTIC_NAME}.py。mm 专用的训练入口是 train_decision_mm.py它通过继承框架基类AHTrainDecisionTree定义于 torchgen/_autoheuristic/train_decision.py定制了以下行为新增特征add_new_features调用mm_operations()把派生特征实时计算出来。从 autoheuristic_utils.py 的实现可见mm 的增强特征由两部分组成get_mult_dims_ops()生成的所有维度两两乘积如m*k、m*n、k*n等以及算术强度arith_intensity即m*k*n / (m*k k*n m*n)对应 autoheuristic_utils.py 的计算这些特征不随数据落盘而是在训练或推理前动态生成默认回退get_default_config返回extern_mm即 ATen 原生 mm 实现作为启发式无法覆盖时的兜底选择允许的错误预测比例get_allowed_wrong_prediction_pct1.0允许全部预测错误配合排名评估的top_k_correct指标只要正确答案出现在 top-k 内即算命中训练/验证集划分get_test_and_val_size验证集占 1%测试集占 19%超参网格get_grid_search_valuesmax_depth5、min_samples_leaf0.01、criterionentropy真实数据加权add_training_data把train_timm与train_hf两份数据集各自重复 3 次后拼入主训练集——注释明确说明这是为了确保启发式在这些数据集上表现足够好始终纳入的候选ranking_always_included_choices[extern_mm]保证原生实现永远在候选集合中。排名训练的内部机制--ranking 10对应 train_decision.py 中的排名模式读取数据时以add_near_bestranking方式加载把与最优耗时接近的候选也视为合理选择见 train_decision.py训练时用prune(..., kranking_num_choices())保留 top-k 候选评估指标切换为top_k_correct/top_k_wrong/top_k_unsure以及wrong_max_speedup_k等见 train_decision.py。也就是说mm 启发式不要求决策树每次都必须选中绝对最优 kernel只要选出的 top-10 候选包含最优解即可避免灾难性回退。原理探源从 BenchmarkRunner 到决策树代码生成数据采集的统一基类所有数据采集脚本都建立在 BenchmarkRunner 基类之上。它提供的命令行参数统一了采集流程参数默认值说明--deviceNone调torch.cuda.set_device(device)指定 GPU--use-heuristic关使用已学启发式而非采集数据内部设置TORCHINDUCTOR_AUTOHEURISTIC_USEself.name-oah_data.txtAutoHeuristic 日志输出路径--num-samples1000采集样本数--num-reps3每个输入重复测量次数子类只需实现两个抽象方法create_input()生成随机输入与run_benchmark()对输入执行编译与计时main()会用 tqdm 进度条循环num_samples × num_reps次。mm 的BenchmarkRunnerMMgen_data_mm.py正是这一模式的直接体现。学习出的启发式如何被使用无论使用官方数据还是自定义数据训练产物都落在torch/_inductor/autoheuristic/artifacts/_${HEURISTIC_NAME}.py。之后只需在运行前设置TORCHINDUCTOR_AUTOHEURISTIC_USEmm python run.pyInductor 在 mm 的 kernel 选择处便会加载该决策树依据当前形状特征m、k、n、dtype、转置标志等直接给出 kernel 候选的排名从而在几乎零开销的前提下逼近完整 autotune 的选择质量。若想为其他算子复刻这一流程可以参考 AutoHeuristic 顶层文档 的三步通用流程在算子处调用AutoHeuristic本地 autotune或AutoHeuristicSelectAlgorithmkernel 选择构造器、用BenchmarkRunner子类采集数据、最后运行train_decision.py决策树或train_regression.py回归树完成学习与代码生成。小结与实战建议围绕 mm/README.md本文串起了 mm 启发式从数据到线上使用的完整链路。实践中的几条要点先快后慢目标 GPU 是 A100/H100 时直接跑get_mm_dataset.shgen_heuristic_a100.sh/gen_heuristic_h100.sh即可复现官方启发式无需重新采集自定义采集注意脚本命名README 提到的generate_heuristic_mm.sh在仓库中对应 torchgen/_autoheuristic/generate_heuristic.sh且 collect 模式需要 tmux 支持与 8 个位置参数合并数据要求元数据一致多 GPU 文件合并前确认来自同一环境与配置否则 merge_data.py 会以Metadata mismatch拒绝合并真实模型数据不可省随机形状分布85% 128 倍数等无法覆盖真实模型形状务必按上文命令采集 HF 与 TIMM 数据并利用--data train_timm/train_hf注入训练mm 专用训练器还会将其重复 3 次以强化学习权重理解排名语义--ranking 10下评估的是 top-10 是否包含最优 kernel配合extern_mm兜底可在性能与风险之间取得平衡。【免费下载链接】pytorchTensors and Dynamic neural networks in Python with strong GPU acceleration项目地址: https://gitcode.com/GitHub_Trending/py/pytorch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考