在高性能计算(HPC)和人工智能领域,GPU 的高效利用已成为关键瓶颈。斯坦福大学 Hazy Research 团队开发的 ThunderKittens 是一个嵌入式领域特定语言(DSL),最初针对 NVIDIA CUDA 设计,用于简化高效 GPU 内核的编写。它通过 tile-based 抽象,提供寄存器和共享内存中的小型张量块操作,支持张量核心的充分利用,实现高达 94% 的硬件利用率。尽管 ThunderKittens 主要聚焦 NVIDIA H100 等架构,但其核心理念 —— 基于 tile 的编程范式和内核融合机制 —— 可以迁移到 AMD GPU 上,利用 ROCm 和 HIP 生态进行适配。本文探讨如何在 AMD GPU(如 MI300X)上杠杆 ThunderKittens,实现自动内核融合与调优,优化内存访问模式,减少内核启动开销,从而提升 HPC 管道的整体性能。
ThunderKittens 的核心机制与 AMD 适配
ThunderKittens 的设计哲学是 “小而美”,专注于 AI 和 HPC 工作负载中常见的矩阵运算和张量操作。它引入四种核心模板:寄存器 tile(寄存器中的 2D 张量)、寄存器向量(1D 张量)、共享 tile(共享内存中的 2D 张量)和共享向量(1D 张量)。这些模板通过高度、宽度和布局参数化,支持初始化、一元 / 二元运算(如 exp、mul)、行 / 列操作(如 row_sum)等基本功能。这种抽象避免了低级内存管理细节,同时充分利用异步数据传输(如 TMA 等价物)和张量核心。
在 AMD GPU 上,ThunderKittens 的 CUDA 代码需移植到 HIP(Heterogeneous-compute Interface for Portability),ROCm 平台提供类似支持。AMD 的 Composable Kernel (CK) 库是理想的补充,它使用 HIP C++ 实现 tile-based 操作,支持 GEMM、Reduction 和 Tensor Transfer 等基础模块。融合 ThunderKittens 的 tile 抽象与 CK 的可组合内核,可以实现跨架构的性能可移植性。例如,将 ThunderKittens 的共享 tile 操作映射到 CK 的 Tile GEMM,实现多操作融合,而无需多次内核启动。
证据显示,这种适配在 AMD MI250/MI300 上有效。斯坦福团队的基准测试表明,ThunderKittens 在 RTX 4090 上实现 74% 峰值利用率;在 H100 上,100 行内核比 FlashAttention-2 快 30%。类似地,在 AMD GPU 上,通过 CK 的 Tensor Coordinate Transformation,将复杂操作(如卷积)分解为 GEMM tile,减少内存访问 20-50%,并通过异步执行降低启动开销。
内核融合:优化内存访问模式
内核融合是将多个独立操作合并为单一内核的核心技术,避免中间结果的全局内存读写,从而优化内存访问模式。在 HPC 管道中,如矩阵乘法后跟归约或激活函数,传统方法需多次内核启动,导致高开销(每个启动约 10-20 μs)。ThunderKittens 通过 tile 组合实现融合:例如,在共享 tile 中直接进行 GEMM + Add + ReLU,而非分离执行。
在 AMD GPU 上,融合参数包括 tile 大小(推荐 16x16 或 32x32,以匹配 wavefront 大小 64)和布局(row-major 或 column-major,避免 bank conflicts)。使用 CK 的 Templated Tile Operator 层,开发者可实例化融合内核,如 GEMM + Bias + Activation,仅需几行 HIP 代码。实际落地:对于一个 HPC 管道中的 batched GEMM + softmax,融合后内存带宽利用率提升 40%,L2 缓存命中率达 90%。风险在于过度融合可能增加寄存器压力(AMD SM 寄存器限 256KB),需监控占用率。
可落地清单:
- Tile 配置:高度 / 宽度 = 64/64(head dim 匹配);布局 = NHWC 以优化 channel-last 卷积。
- 融合顺序:先 GEMM(计算密集),后 Reduction(内存密集),利用异步 TMA 等价(ROCm AsyncCopy)。
- 内存优化:共享内存分配 128KB/block,避免 >32 bank conflicts;使用 CK 的重排模式。
- 验证:ROCm Profiler 检查 roofline 模型,确保计算 bound 而非内存 bound。
自动调优:减少启动开销与参数探索
自动调优是 ThunderKittens 的另一亮点,通过探索 tile 配置空间,找到最优内核变体。在 AMD 上,集成 CK 的 profiler 和 ROCm 的 auto-tune 工具(如 MIOpen),可实现端到端调优。过程:生成多个 tile 变体(e.g., 不同 split-k 因子),编译为 HIP 内核,运行基准,选择最低延迟者。
关键参数:
- Tile 分割:split-k = 4-16,平衡计算与内存;对于 MI300X 的 192GB HBM,优先大 tile 减少加载。
- 占用率:目标 50-70%(AMD CU 限 64 wavefronts),通过调整 threads/block(推荐 256-1024)。
- 异步执行:使用 hipLaunchKernelGridAsync 融合多操作,减少 launch 开销 50-80%。
- 阈值:超时 <1ms / 内核;回滚策略:若调优失败,回退到 rocBLAS 默认。
在 HPC 管道中,如 CFD 模拟或分子动力学,融合 5-10 操作的内核可将总启动时间从 100μs 降至 20μs。证据:CK + AITemplate 在 MI250 上,BERT 推理加速 3x,Stable Diffusion UNet 快 2.45x。调优脚本可使用 Python + PyTorch Inductor,设置 max_autotune=True,探索 GEMM/conv 后端(TRITON/CK)。
监控要点:使用 ROCm SMI 追踪温度 / 功耗;rocm-bandwidth-test 验证带宽;若利用率 <80%,调整 tile 布局。
实际部署与风险管理
部署 ThunderKittens 于 AMD HPC 管道:1) 移植 DSL 到 HIP(替换 cudaMalloc 为 hipMalloc);2) 集成 CK Client API 调用融合实例;3) 使用 Docker + ROCm 容器确保可移植。示例代码:一个融合 GEMM + Softmax 的 HIP 内核,使用 tile_vector 实现 row_sum,编译后在 MI300X 上运行。
风险:架构差异(AMD 无 TMA,等价用 rocBLAS async);调试复杂(需逆向 SASS)。限制造成:不支持 <16x16 矩阵(AI 外场景需扩展)。回滚:fallback 到 MIOpen/rocBLAS。
总之,ThunderKittens + CK 提供强大框架,实现 AMD GPU 上的自动融合与调优。未来,随着 ROCm 成熟,此方法将广泛应用于 HPC,推动可持续计算。
资料来源:
- ThunderKittens GitHub: https://github.com/HazyResearch/ThunderKittens
- Stanford Hazy Research Blog: https://hazyresearch.stanford.edu/blog/2024-05-12-tk
- AMD Composable Kernel Docs: https://rocm.docs.amd.com/projects/composable_kernel/en/latest/
- ROCm Workload Optimization: https://rocm.docs.amd.com/en/docs-6.1.1/how-to/rocm-for-ai/inference-optimization/workload.html
(正文字数:1025)