优化 PyTorch 解码器模型中的令牌生成

通过 CUDA 流交错隐藏主机设备同步这篇文章《优化 PyTorch 解码器模型中的令牌生成》首先出现在《走向数据科学》上。

来源:走向数据科学

自回归解码器模型几乎渗透到我们日常生活的方方面面。这些模型应用计算量大的内核操作来逐个生成令牌,乍一看,这种方式似乎效率极低。鉴于对生成式人工智能的巨大需求,对其优化投入大量工程努力也就不足为奇了。无论是通过自定义 CUDA 内核、CUDA 图形、专用 AI 加速器还是推测性采样,任何能够将延迟和/或成本减少哪怕一小部分的技术都是胜利。

在这篇文章中,我们演示了一种使用 CUDA 流交错在 PyTorch 中优化令牌生成的技术。该方法虽然易于实现,但它解决了一个经常被忽视的特定瓶颈,并且可以带来有意义的性能提升。虽然使用 CUDA 流管道化模型执行在 AI 系统工程中很常见,但我们没有找到任何教程来记录我们在此描述的特定 PyTorch 级应用程序。如果您发现该技术有用,请参考这篇文章。

为了方便我们的讨论,我们将使用 HuggingFace 的 Transformers (v5.1.0) 库中的简单 GPT-2 PyTorch 解码器模型。我们将在 NVIDIA L40S GPU 和 PyTorch (2.10.0) 上运行实验。

免责声明:我们将共享的代码仅用于演示目的。请不要依赖其准确性或最优性。请不要将我们提及的任何图书馆、平台或服务视为对其使用的认可。

重要的是,我们将讨论的基于 CUDA 流的方法的价值可能会根据模型和运行时环境的详细信息而有很大差异。请确保在集成其使用之前运行您自己的基准测试。

玩具 GPT-2 模型

为了简化我们的讨论,我们将使用 HuggingFace 转换器库中的 GPT-2 解码器模型,并让它在一批空提示上自回归运行。

KV 缓存

可扩展的 CUDA 内存分配

使用 StaticCache 进行 KV 缓存

结果