将MAX_JOBS保持在32 | AI生成和翻译
问题:我们能否将 MAX_JOBS 设置为大于 32,以进一步加快编译速度?
答案:不,你不应该再增大 MAX_JOBS。 将其保持在 32(或者甚至略微降低)是最安全的选择。
虽然你的内存有充足余量(149 GB 空闲),但进一步增大 MAX_JOBS 不会让构建更快,反而可能由于 CPU 超额订阅 和 进程抖动 而变慢甚至崩溃。
以下是你的构建速度下降的原因,以及为什么更高的数值不会有所帮助。
为什么设置更高不会有用
1. 你有 20 个 vCPU,但已经有 66 个编译器进程在运行
仔细看日志中的这一行:
已使用 32 GB 内存,空闲 149 GB — 无内存压力。正在运行 66 个 hipcc 进程。
即使你设置了 MAX_JOBS=32,Python 构建系统在生成 hipcc(AMD 编译器前端)时,往往每个任务会创建多个子进程(例如预处理、编译和汇编)。
由于你的 AMD 云实例只有 20 个 vCPU,66 个活跃进程意味着你的 CPU 严重超额订阅。CPU 核心花费更多时间在上下文切换(任务之间来回切换)上,而不是实际计算。
2. “后续内核”瓶颈
正如你的自动化代理(Hermes)正确指出的:“后续内核只是更大。” 编译过程并不是从头到尾处理相同的文件。
- 前 93 个文件是小而简单的辅助对象(这就是为什么它们在 1 分钟内完成)。
- 后续文件包含庞大的、高度模板化的 Composable Kernel (CK) 注意力块。
现在每个单独的文件都需要更长的编译时间。强行让一台 20 vCPU 的机器同时处理超过 32 个这样的大文件,会完全饱和 CPU 的指令流水线。
如果继续调高会发生什么?
如果你尝试将 MAX_JOBS 设置为 64 或更高:
- 构建时间可能会增加: CPU 将因上下文切换而卡死,导致一种称为 thrashing(系统抖动)的状态。
- GNU Make 内部错误: 如果进程表被完全淹没,PyTorch/HIP 源码构建可能会抛出内部段错误或流水线错误。
总结策略
你当前的进度(剩余约 35 到 50 分钟)是完全正常的,对于从零开始为 gfx942(MI300X)这样的高性能目标编译 FlashAttention 来说,这是预期情况。
让当前构建完成。好消息是 你只需要做这一次。一旦 .whl 包或安装完成,FlashAttention 将在你的 MI300X GPU 上以原生速度运行,无需再次编译。