本文档介绍了 Whisper ASR 系统中的 GPU 加速功能,重点介绍了使用 Triton 框架实现的 CUDA 优化操作。这些优化显著提高了音频处理和单词时间戳生成流水线中关键计算瓶颈的性能。有关通用解码过程的信息,请参阅 解码系统,有关单词时间戳生成细节,请参阅 单词时间戳。
Whisper 在单词时间戳对齐过程中实现了两个计算密集型操作的自定义 CUDA 内核
这两个操作都使用 Triton 框架通过与 PyTorch 兼容的 CUDA 内核实现,并在 CUDA 不可用时自动回退到 CPU 实现。
来源:whisper/timing.py19-51 whisper/timing.py108-148 whisper/triton_ops.py98-109
Whisper 使用 Triton 框架来编写自定义 CUDA 内核。Triton 为 GPU 编程提供了一个 Python 接口,与原始 CUDA 相比,更容易编写和维护高性能 GPU 代码。
来源:whisper/timing.py36-45 whisper/triton_ops.py1-10
当 CUDA 不可用或 Triton 内核启动失败时,Whisper 会优雅地回退到 CPU 实现
来源:whisper/timing.py36-45 whisper/timing.py142-149 whisper/triton_ops.py6-10
动态时间规整是 find_alignment 函数中用于将文本标记与音频帧对齐的关键算法。DTW 操作通过计算成本矩阵并找到其中的最优路径来找到文本和音频两个序列之间的最优对齐。
来源:whisper/timing.py141-151 whisper/timing.py108-138 whisper/triton_ops.py14-40
timing.py 中的 dtw_cuda 函数准备数据并调用 Triton 内核实现
数据准备
内核执行
triton_ops.py 启动 dtw_kernel结果处理
backtrace 函数以恢复对齐路径Triton DTW 内核通过并行处理矩阵对角线来高效计算成本矩阵,利用了 DTW 算法的递归结构。
来源:whisper/timing.py108-138 whisper/triton_ops.py14-40
中值滤波用于对从模型中提取的交叉注意力权重进行去噪,这有助于生成更准确的单词时间戳。中值滤波器沿输入滑动一个窗口,并将每个值替换为窗口内值的中间值。
来源:whisper/timing.py19-54 whisper/triton_ops.py43-109
中值滤波实现的一个独特之处在于它根据滤波器宽度动态生成 CUDA 代码
triton_ops.py 中的 median_kernel 函数是一个内核生成器,它
@lru_cache 缓存生成的内核median_filter_cuda 函数然后
这种方法可以在保持干净 API 的同时,实现针对特定滤波器宽度的优化。
来源:whisper/triton_ops.py43-96 whisper/triton_ops.py98-109
CUDA 实现相比 CPU 实现提供了显著的性能改进,特别是在
测试套件(test_timing.py)根据 CPU 实现和 SciPy 等标准库验证了 CUDA 实现的正确性,确保加速操作产生相同的结果。
下表比较了 CPU 和 GPU 实现
| 操作 | 实现 | 优点 | 局限性 |
|---|---|---|---|
| DTW | CPU(dtw_cpu) | 适用于所有系统,无依赖 | 对于大型矩阵较慢 |
| DTW | CUDA(dtw_cuda) | 对于大型矩阵快得多 | 需要 CUDA 兼容 GPU |
| 中值滤波 | CPU (PyTorch) | 适用于所有系统 | 对于大型输入较慢 |
| 中值滤波 | CUDA(median_filter_cuda) | 针对特定滤波器宽度进行了优化 | 需要 CUDA 兼容 GPU |
来源:tests/test_timing.py55-64 tests/test_timing.py87-96
CUDA 加速操作主要用于 find_alignment 函数,该函数由 add_word_timestamps 调用,用于为转录的音频生成单词级时间戳。
来源:whisper/timing.py163-242 whisper/timing.py279-388
Whisper 中的 CUDA 加速利用 Triton 框架为计算密集型操作实现了高效的 GPU 内核,显著提高了单词时间戳生成的性能。该系统在 CUDA 不可用时会优雅地回退到 CPU 实现,确保跨不同环境的兼容性。
对于处理 Whisper 代码库的开发者
triton_ops.py 中,并在 timing.py 中使用。这种加速对于单词时间戳功能尤为重要,该功能需要处理大型注意力矩阵并执行复杂的对齐操作。
刷新此 Wiki
最后索引时间2025 年 4 月 18 日(517a43)