
CUTLASS GEMM Heuristics 指南用解析式启发式缩小自动调优搜索空间【免费下载链接】cutlassCUDA Templates and Python DSLs for High-Performance Linear Algebra项目地址: https://gitcode.com/GitHub_Trending/cu/cutlass导读本文讲解 CUTLASS 仓库中位于 media/docs/cpp/heuristics.md 的 GEMM Heuristics 功能它通过 NVIDIAnvidia-matmul-heuristics解析式analytical启发式模型为给定的 GEMM 问题规模与硬件 SKU 直接预测并排序各 kernel 配置的预估性能从而只构建和评测一小部分候选 kernel大幅缩小运行时自动调优autotuning的搜索空间。读完本文你将掌握如何编写 GEMM 问题定义 JSON、如何通过 CMake 选项与cutlass_profiler完成启发式选核 → 构建 → 评测的完整闭环以及如何直接调用 Python API 进行 kernel 筛选。概述为什么要用 Heuristics 压缩搜索空间CUTLASS 的cutlass_library传统上通过穷举配置CTA tile、instruction tile、pipeline stages、cluster 形状等为每个 GEMM 问题实例化大量 kernel再由运行时自动调优逐一 profiling 选出最快者。这种构建全部 → 全部评测的流程在配置空间巨大时成本很高。Gemm heuristics 的目的正是减少运行时自动调优的搜索空间只让一个有依据的子集进入构建与评测阶段。其底层使用 NVIDIA 的nvidia-matmul-heuristics——一种解析式启发式模型能够根据问题尺寸m/n/k与硬件 SKU 对 GEMM kernel 按预估性能排序。从源码结构看这一集成被设计为cutlass_library中的实验性功能官方在文档中明确声明不保证完整的功能或性能覆盖。功能覆盖范围当前版本边界在编写问题文件与选择硬件前务必确认当前版本支持的范围问题空间仅支持普通稠密plain denseGEMM数据类型限于f8、f16、f32硬件仅支持 Hoppersm9x与 Blackwellsm10x两代架构。超出上述范围的问题定义不会被启发式模型正确评估这也是CUTLASS_LIBRARY_HEURISTICS_RESTRICT_KERNELS等规避选项存在的原因见下文。快速上手从依赖安装到 Profile 全流程1. 安装依赖推荐直接安装官方 wheelpip install nvidia-matmul-heuristics该包通过python/cutlass_library/heuristics_provider.py中的MatmulHeuristics类被加载。值得注意的兼容性细节nvidia-matmul-heuristics0.1.0.28 版本修改了 API构造函数移除gpu与load_discovery_implicitly参数GPU 改由createHardwareDescriptor()setHardwarePredefinedGpu()指定该源码通过检测构造函数签名自动区分新旧 API因此建议保持 wheel 为较新版本。若需要指定动态库路径可设置环境变量CUTLASS_NVMMH_SO_PATH。2. 准备问题输入文件JSON启发式模型需要一份JSON list形式的 GEMM 问题定义。下面沿用官方文档示例包含两个问题一个 FP16、一个 FP8[ { m : 4096, n : 4096, k : 4096, batch_count : 1, layout : tnn, dtype_a : f16, dtype_b : f16, dtype_c : f16, dtype_acc : f32, dtype_d : f16, beta : 0.0, use_fast_acc: false }, { m : 4096, n : 4096, k : 4096, batch_count : 1, layout: tnn, dtype_a : e5m2, dtype_b : e5m2, dtype_c : f32, dtype_acc : f32, dtype_d : e5m2, beta : 0.0, use_fast_acc: true } ]字段说明与默认值依据 python/cutlass_library/heuristics.py 中get_gemm_configs()的参数解析字段必填说明默认值m/n/k是GEMM 三个维度—dtype_a/dtype_b/dtype_d是A、B、D 矩阵数据类型如f16、f32、e5m2、e4m3—dtype_acc否累加器数据类型f32dtype_c否C 矩阵数据类型缺省取dtype_dlayout是3 字符字符串每个字符仅为n列主序或t行主序例如tnn源码会将其映射为 A/B/C 的LayoutType—batch_count否批量 GEMM 的批次数1alpha否A×B 的标量系数1.0beta否C 的标量系数0.0alignment_a/alignment_b否A/B 的内存访问粒度以元素个数计128 位换算元素数128 // DataTypeSize[...]use_fast_acc否FP8 是否启用 fast accumulationTrue重要限制use_fast_acc仅对SM90 上的 FP8 kernel有意义其他精度下该字段被忽略文档明确说明。从 python/cutlass_library/heuristics_provider.py 可以看到它通过后端属性DISABLE_FAST_ACC_FOR_FP8传入启发式库。3. 构建通过 CMake 启用 Heuristics使用常规 CMake 流程构建 CUTLASS并附加 heuristics 相关选项。硬件信息在联网构建时会自动检测基于 CUDA Driver API离线构建则需用-DCUTLASS_LIBRARY_HEURISTICS_GPU显式指定。以下是最小化的 Hoppersm90示例命令$ cmake .. \ -DCUTLASS_NVCC_ARCHS90a \ -DCUTLASS_LIBRARY_HEURISTICS_PROBLEMS_FILEpath_to_your_problem_list.json \ -DCUTLASS_LIBRARY_HEURISTICS_CONFIGS_PER_PROBLEMnumber of configurations to build per problem ... ... $ make cutlass_profiler -j构建完成后会产出一份CSV testlist其中包含自动调优所需的全部测试用例每个 kernel 及其运行时参数。该文件默认输出到构建目录下的heuristics.csv见 tools/library/CMakeLists.txt可用-DCUTLASS_LIBRARY_HEURISTICS_TESTLIST_FILE修改位置。CMake 选项一览官方文档 源码确认CUTLASS_LIBRARY_HEURISTICS_PROBLEMS_FILE指向包含 GEMM 问题 JSON list 的文件路径顶层 CMakeLists.txt 会将其转换为绝对路径后传入生成器。CUTLASS_LIBRARY_HEURISTICS_CONFIGS_PER_PROBLEM每个 GEMM 问题启发式返回的配置数上限同一配置/kernel 可被多个问题共享。对应生成器参数--heuristics-configs-per-problem默认值为10见 python/cutlass_library/generator.py。CUTLASS_LIBRARY_HEURISTICS_RESTRICT_KERNELS布尔选项默认OFF构建全部启发式建议的配置。置为ON时仅构建默认 CUTLASS CMake 流程实例化的 kernel 集合并与CUTLASS_LIBRARY_INSTANTIATION_LEVEL等选项组合生效。当启发式建议的 kernel 配置在当前平台无法构建时某些不支持或实验性场景可将其置为ON作为规避手段。CUTLASS_LIBRARY_HEURISTICS_TESTLIST_FILE输出 CSV 的路径该文件可直接被cutlass_profiler消费。CUTLASS_LIBRARY_HEURISTICS_GPU离线构建时指定目标 GPU例如H100_SXM。未设置时通过 CUDA Driver API 自动检测硬件属性。合法字符串以 python/cutlass_library/generator.py 中--heuristics-gpu的choices为准包括H100_SXM、H100_PCIE、H100_NVL、H200_SXM、H20_SXM、B200、GB200_NVL、RTX_5080、RTX_5090、RTX_PRO_6000另有/auto表示自动检测。注意文档正文示例中的H100_SXM5与源码枚举略有差异应以 generator.py 的实际枚举为准。构建链路上述选项在 tools/library/CMakeLists.txt 中被组装为HEURISTICS_ARGS--heuristics-problems-file、--heuristics-testlist-file、--heuristics-configs-per-problem以及按需的--heuristics-restrict-kernels、--heuristics-gpu随后附加到generator.py的执行命令中。生成日志输出到构建目录的library_instance_generation.log。4. Profile用 CSV 驱动 cutlass_profiler用上一步产出的 testlist CSV 运行cutlass_profiler收集每个测试用例的性能数据从而确定每个输入问题最快的已构建 kernel 配置。以下命令固定每个测试用例评测 50mscutlass_profiler --operationGemm --testlist-filepath_to_your_testlist.csv --profiling-iterations0 --profiling-duration50 --verification-enabledfalse --outputpath_to_outfile其中--profiling-iterations0表示不按迭代次数、而是按--profiling-duration指定的毫秒时长来评测--verification-enabledfalse关闭正确性校验以节省评测时间--output指定结果输出文件。源码级原理启发式如何转化为可构建的 kernel整个流程的核心实现在 python/cutlass_library/heuristics.py 与 python/cutlass_library/heuristics_provider.py 两个文件中可由 CMake 触发也可由 Python 直接调用。调用链一filter_manifest_and_write_heuristics_file()CMake 构建入口当 CMake 检测到CUTLASS_LIBRARY_HEURISTICS_PROBLEMS_FILE时会在生成器流程中调用该函数generator.py。其职责读取 JSON 问题列表解析--heuristics-gpuNone/auto/表示自动检测构造MatmulHeuristics(gpu...)若架构列表包含sm100调用mmh.set_cta_div_n(64)将 CTA tile 的 N 维度设为 64 的倍数对应后端属性CTA_TILE_N_DIV_REQUIREMENT——这是为 Blackwell 平台特设的约束逐问题调用get_gemm_configs()获得建议配置按架构sm90/sm100/sm101分别调用generate_sm90_from_heuristics_configs()或generate_sm100_from_heuristics_configs()把启发式建议翻译为 CUTLASSGemmOperation并注册进 manifest--heuristics-restrict-kernels为真时传入空 manifest 以只生成不注册通过write_profiler_testlist_to_csv()将问题 kernel 配置 运行时参数序列化为cutlass_profiler可消费的 CSV。调用链二get_single_gemm_config()与MatmulHeuristics.get_configs()get_single_gemm_config()heuristics.py是对MatmulHeuristics.get_configs()的薄封装。后者在 heuristics_provider.py 中完成关键翻译将 CUTLASS 的DataType映射为 cuBLAS 风格精度字符串如f16→H、f32→S、e4m3→Q、e5m2→R组合为precision串将LayoutType三元组映射为NvMatmulHeuristicsMatmulLayout前两维取 A/B 的 n/t 大写组合第三维按 C/D 的行/列主序调用getEx()获取按预估运行时间排序的配置列表每个返回的 kernel 配置被提取为结构化字典包含cta_tile_m/n/k、instr_tile_m/n/k、warp_tile_m/n/k、cluster_m/n/k、swizzle_size、raster_orderalong_m/along_n由cta_order推断、split_k_slices、estimated_runtime以及 dtype、layout、alignment、use_fast_acc、voidC等字段。其中voidC由beta 0.0推导beta0时 C 可为 void跳过 C 的读写。这些字段正是后续生成TileDescription、MathInstruction与 schedule 的直接输入。架构分支SM90 与 SM100 的生成差异SM90generate_sm90_from_heuristics_configsheuristics.py将建议配置填入TileDescription后通过get_valid_schedules()依据 CUDA 版本、对齐性、数据类型、use_fast_acc等推导合法的主 schedule 与 StreamK schedule最终经CreateGemmUniversal3xOperator()生成 3x collective 风格的 Universal GEMM kernelStreamK 变体使用TileSchedulerType.StreamK。SM100generate_sm100_from_heuristics_configsheuristics.py依据cluster_m奇偶性推断是否为 2SM 指令is_2sm cluster_m % 2 0据此调整 instruction shape并选择TmaWarpSpecialized1SmSm100/TmaWarpSpecialized2SmSm100等 schedule同样支持 StreamK tile scheduler。这些生成逻辑与 CUTLASS 3.x 的 collective builder 代码路径一致最终统一通过 manifest 的 kernel filter 注册进待构建列表。直接使用 Python API自定义 emitter 场景如果已经预构建了 CUTLASS kernel或者使用自定义的 CUTLASS emitter可以直接在 Python 中调用相关 API 选择要构建或评测的 kernel参考filter_manifest_and_write_heuristics_file()heuristics.py的用法get_single_gemm_config(m, n, k, batch_count, layouts, dtypes, alignment_a, alignment_b, voidC, use_fast_acc, count, provider)单问题选核返回含 CTA tile、指令 tile、stages、cluster、swizzle、raster order、splitK 等完整字段的配置字典列表get_gemm_configs(problems, provider, count)批量问题选核对每个问题字典追加configs键返回结果可直接用于后续 kernel 生成serialize_heuristics_results_to_json(problems_with_configs, outfile_path)将结果含DataType/LayoutType枚举序列化为可读 JSON便于调试write_profiler_testlist_to_csv(configs_list, outfile_path)把配置列表写成cutlass_profiler可消费的 CSV testlist。这些函数组合起来可以在不经过 CMake 的前提下复现启发式选核 → 生成 kernel → 输出 profiler testlist的完整数据流。小结与注意事项GEMM Heuristics 是cutlass_library的实验性特性功能与性能覆盖不保证完备使用前请确认问题空间f8/f16/f32稠密 GEMM与硬件Hopper sm9x、Blackwell sm10x在支持范围内use_fast_acc只影响 SM90 的 FP8 kernel离线构建务必用-DCUTLASS_LIBRARY_HEURISTICS_GPU指定 GPU其合法取值以 python/cutlass_library/generator.py 的枚举为准若启发式建议的 kernel 在目标平台构建失败将CUTLASS_LIBRARY_HEURISTICS_RESTRICT_KERNELSON可回退到默认 kernel 集合完整工作流为pip install nvidia-matmul-heuristics→ 编写问题 JSON → CMake 构建产出heuristics.csvtestlist→cutlass_profiler评测最终以实测数据确定每个问题的最快 kernel 配置。【免费下载链接】cutlassCUDA Templates and Python DSLs for High-Performance Linear Algebra项目地址: https://gitcode.com/GitHub_Trending/cu/cutlass创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考