菜单

CUDA 加速

相关源文件

本文档介绍了 Whisper ASR 系统中的 GPU 加速功能,重点介绍了使用 Triton 框架实现的 CUDA 优化操作。这些优化显著提高了音频处理和单词时间戳生成流水线中关键计算瓶颈的性能。有关通用解码过程的信息,请参阅 解码系统,有关单词时间戳生成细节,请参阅 单词时间戳

GPU 加速概述

Whisper 在单词时间戳对齐过程中实现了两个计算密集型操作的自定义 CUDA 内核

  1. 动态时间规整 (DTW) - 用于将文本标记与音频特征对齐
  2. 中值滤波 - 用于对注意力矩阵进行去噪,以获得更准确的对齐

这两个操作都使用 Triton 框架通过与 PyTorch 兼容的 CUDA 内核实现,并在 CUDA 不可用时自动回退到 CPU 实现。

来源:whisper/timing.py19-51 whisper/timing.py108-148 whisper/triton_ops.py98-109

Triton 框架集成

Whisper 使用 Triton 框架来编写自定义 CUDA 内核。Triton 为 GPU 编程提供了一个 Python 接口,与原始 CUDA 相比,更容易编写和维护高性能 GPU 代码。

来源:whisper/timing.py36-45 whisper/triton_ops.py1-10

错误处理和回退

当 CUDA 不可用或 Triton 内核启动失败时,Whisper 会优雅地回退到 CPU 实现

  1. 代码首先尝试导入 Triton
  2. 如果导入失败,它将引发一个清晰的错误消息
  3. 对于每个操作,它会尝试使用 CUDA 实现
  4. 如果 CUDA 实现失败(由于缺少 CUDA 工具包或运行时错误),它会发出警告并回退到 CPU 实现

来源:whisper/timing.py36-45 whisper/timing.py142-149 whisper/triton_ops.py6-10

加速操作

动态时间规整 (DTW)

动态时间规整是 find_alignment 函数中用于将文本标记与音频帧对齐的关键算法。DTW 操作通过计算成本矩阵并找到其中的最优路径来找到文本和音频两个序列之间的最优对齐。

来源:whisper/timing.py141-151 whisper/timing.py108-138 whisper/triton_ops.py14-40

CUDA 实现细节

timing.py 中的 dtw_cuda 函数准备数据并调用 Triton 内核实现

  1. 数据准备

    • 重塑和倾斜输入矩阵以获得对角线访问模式
    • 在 GPU 上初始化成本和轨迹矩阵
  2. 内核执行

    • triton_ops.py 启动 dtw_kernel
    • 针对 DTW 矩阵对角线上的并行计算进行优化
  3. 结果处理

    • 重塑轨迹矩阵
    • 调用 CPU backtrace 函数以恢复对齐路径

Triton DTW 内核通过并行处理矩阵对角线来高效计算成本矩阵,利用了 DTW 算法的递归结构。

来源:whisper/timing.py108-138 whisper/triton_ops.py14-40

中值滤波

中值滤波用于对从模型中提取的交叉注意力权重进行去噪,这有助于生成更准确的单词时间戳。中值滤波器沿输入滑动一个窗口,并将每个值替换为窗口内值的中间值。

来源:whisper/timing.py19-54 whisper/triton_ops.py43-109

动态内核生成

中值滤波实现的一个独特之处在于它根据滤波器宽度动态生成 CUDA 代码

  1. triton_ops.py 中的 median_kernel 函数是一个内核生成器,它

    • 创建一个 Triton JIT 函数模板
    • 动态插入代码来加载输入行
    • 为特定的滤波器宽度生成优化的冒泡排序实现
    • 使用 @lru_cache 缓存生成的内核
  2. median_filter_cuda 函数然后

    • 将输入张量展开为滑动窗口
    • 获取适合滤波器宽度的内核
    • 在 GPU 上执行内核

这种方法可以在保持干净 API 的同时,实现针对特定滤波器宽度的优化。

来源:whisper/triton_ops.py43-96 whisper/triton_ops.py98-109

性能考量

CUDA 实现相比 CPU 实现提供了显著的性能改进,特别是在

  1. 大型输入:对于需要对齐更多标记的较长音频文件
  2. 批量处理:同时处理多个音频文件时

基准测试

测试套件(test_timing.py)根据 CPU 实现和 SciPy 等标准库验证了 CUDA 实现的正确性,确保加速操作产生相同的结果。

下表比较了 CPU 和 GPU 实现

操作实现优点局限性
DTWCPU(dtw_cpu适用于所有系统,无依赖对于大型矩阵较慢
DTWCUDA(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 代码库的开发者

  1. GPU 操作需要 CUDA 兼容的 GPU 和 Triton 库
  2. 自定义内核定义在 triton_ops.py 中,并在 timing.py 中使用。
  3. 回退机制可确保系统即使在没有 CUDA 支持的情况下也能正常工作。

这种加速对于单词时间戳功能尤为重要,该功能需要处理大型注意力矩阵并执行复杂的对齐操作。