跳到正文
AWS Machine Learning Blog· Pierre Lienhart·· 13 小时前精选AI 评分56

Deepgram 如何用 AWS Trainium2 优化语音 AI 推理

How Deepgram optimized voice AI at scale with AWS Trainium

AI 导读

Deepgram 与 AWS 将 Nova-3 语音转文字模型移植到 AWS Trainium2,并针对离线批处理优化推理。团队使用 TorchNeuron、NKI 内核和 Rust 数据并行运行时,在单台 trn2.3xlarge 上运行 8 个模型副本;相较 Deepgram 此前使用的计算选项,每美元可处理的音频增加 11–70%。

推荐理由

文章拆解了从 PyTorch 移植、内核调优到 Rust 服务运行时的优化过程,并给出批处理场景下的吞吐与成本数据。

正文 · AI 翻译

随着语音成为 AI 的一等模态,Deepgram 的模型涵盖语音转文本、文本转语音和语音代理。目前,这些模型每年为 200,000 多名开发者和 1,400 个组织处理数千万亿个音频 token。客户通过 Deepgram API 使用这些模型,也可以在自己的环境中运行它们,包括在 Amazon SageMaker AI 上运行。

对 Deepgram 而言,服务效率决定了在给定基础设施预算下,系统能够处理多少音频。高容量批处理工作负载会给预算带来很大压力,因此,每个加速器小时的利用效率越高,Deepgram 就能在同一套计算资源上处理越多音频。这使推理效率成为自然的优化目标,Deepgram 因此转向 AWS AI 芯片来提升效率。他们与 AWS 合作,将其 Nova-3 语音转文本模型部署到 AWS Trainium2 上,用于联络中心分析和医疗转录等离线批处理工作负载。

这项合作始于 Deepgram 交付标准 PyTorch 代码形式的 Nova-3。在数月时间里,Deepgram 与 AWS Forward Deployed Engineering (FDE) 团队通过 PyTorch 重构将 Nova-3 移植到 AWS Trainium2,并针对新硬件进行调优。最终配置可在单个 Amazon Elastic Compute Cloud (Amazon EC2) trn2.3xlarge 实例上运行八个模型副本。在 Deepgram 面向离线、吞吐量优化的批处理工作负载中,该配置每美元处理的音频量,比 Deepgram 之前使用的计算选项高出 11–70 percent。我们根据评估时的实例定价进行了测算。这些提升有助于 Deepgram 高效扩展、持续推出更好的模型,并以更低的价格将模型提供给客户。对于在 Amazon SageMaker AI 上的自有虚拟私有云 (VPC) 中自行托管 Deepgram 模型的客户,这些优势同样适用。Deepgram 与 AWS 还在持续改善设置的便捷性、可靠性和可观测性。

在本文中,我们将详细介绍在 Trainium 上开展的推理优化工作:将 Nova-3 移植到 AWS Neuron 软件栈、后续的内核级调优、让 Deepgram 自有模型服务器能够调用 Trainium 的数据并行 Rust 运行时,以及我们在批量转录中测得的吞吐量和成本结果。

使用原生 PyTorch 将 Nova-3 优化到 Trainium2 上

我们从标准 PyTorch 代码开始,使用 TorchNeuron(Neuron Compiler 的原生 PyTorch 集成),它同时支持即时执行和 torch.compile。我们首先在 Trainium2 上以即时模式运行 Nova-3,检查哪些操作回退到了 CPU,然后使用 torch.compile 进行编译。编译后的路径在 Trainium2 上运行了所有模型操作,未检测到 CPU 回退。

我们使用 torch.compile 将编码器和解码器编译为形状固定的独立计算图。整个过程中,我们从两个层面检查数值准确性:与 CPU 结果进行层级输出一致性对比,以及端到端词错误率 (WER);后者必须与 Deepgram 的参考值和目标保持一致。

在此基础上,我们启动了优化工作,使用来自公开 NKI Library (NKILib) 的融合内核替换了若干层。NKILib 是一个预构建参考内核集合,这些内核使用 Neuron Kernel Interface (NKI) 编写。内核涵盖融合 QKV 投影、融合前馈网络 (FFN) 层和深度可分离一维卷积等操作。

我们针对 Deepgram 的离线推理工作负载优化了吞吐量,并进一步提升成本效率。吞吐量以相对于基线配置的增益来报告,而不是以每秒处理的绝对音频量来报告;我们测试了 1–128 的批量大小,以找出吞吐量最大的批量大小。

使用 Neuron Explorer 和 NAD 进行内核级调优

启用内核只是优化飞轮的第一步:启用一个 NKI 内核(自定义内核或来自 NKILib 的内核),分析工作负载,然后根据分析结果调优现有内核,或用新的内核替换它。这个循环会不断重复,直到达到性能目标。在每一步中,Neuron 堆栈的不同部分都会加速相关工作:NKILib 提供可直接替换的内核,Neuron Explorer 是分析 Neuron 工作负载的首选工具,而 Neuron Agentic Development (NAD) 工具包则通过其分析和内核编写技能,加快分析结果解读与内核调优。

在我们的案例中,NKILib 内核帮助我们完成了大部分工作,而分析结果显示了手写内核能够改进的地方。每一次,NAD 分析技能都帮助我们从 Neuron Explorer 分析结果定位到根本原因,而 NAD 内核编写技能则帮助生成替换内核。

层 我们的发现与改动 增益
FFN 参考内核的分块调度会为每个 token 分块从片外内存重新加载完整的投影权重集合,因此随着 token 数量增加,内存带宽限制了吞吐量。我们手动调优的内核只加载每个权重分块一次,在多个 token 分块之间复用该分块,并将权重读取与片上计算进行流水线化。 相比参考内核,在批量大小为 96 时延迟降低 2.0x
深度可分离 conv1d 实验性的 NKILib 内核将该操作构建为隐式通用矩阵乘法(GEMM),导致 Tensor Engine 利用率较低。我们将其重写为在 Vector Engine 上运行的广播乘加循环,实现了引擎满负载,足以抵消 Vector Engine 较低的峰值吞吐量。 相比参考内核,在批量大小为 96 时提速 1.5x
Conv2d 模型的 conv2d 层遇到了编译瓶颈:当批量大小超过 32 时,这些层阻止模型作为单个图进行编译。由于 NKILib 没有 conv2d 内核,我们在 NKI 中从头编写了一个。按照前文所述的飞轮流程,该内核经过了数轮由分析结果指导的迭代,从而解锁了大于 32 的批量大小。 在批量大小 ≤32 时,卷积模块最高提升 50x

Rust 中的数据并行运行时

每个 Trainium2 设备包含八个物理 NeuronCore,默认以四个逻辑 NeuronCore(LNC2)的形式对外呈现。由于每个 Nova-3 模型实例都可以轻松容纳在单个物理核心上,我们将每个逻辑核心对应的物理核心数量减少为一个(LNC1)。这一配置使我们能够在每个 Trainium2 设备上托管八个模型副本(DP8)。输入会并发处理,同时最大化每个设备的吞吐量。数据并行运行时由一个工作窃取队列驱动,每个副本对应一个线程。

Deepgram 的生产服务栈使用 Rust 编写,因此将 Nova-3 移植到 Trainium2 不只是编译模型那么简单:还必须确保服务路径不依赖 Python 或 PyTorch。因此,我们构建了一个轻量级运行时,由 Rust 通过共享的工作窃取队列协调模型副本。C 层通过 Neuron Runtime API(libnrt)直接加载并执行提前编译的 Neuron Executable File Format(NEFF)文件。该运行时直接集成到 Deepgram 的服务架构中,并且在所有测试过的批次大小下,都能精确复现参考 token 序列。

我们将其与多线程(MT)和多进程(MP)Python 数据并行运行时进行了基准测试。与 MP 基线相比,Rust 运行时彻底消除了 Python 解释器的开销。与 MT 基线相比,它进一步缓解了全局解释器锁(GIL)带来的串行化,因此并发工作线程发出的调用不再在单个进程内相互争用。这些提升之所以重要,是因为 Nova-3 会针对每个音频块执行一系列小型解码器调用,导致低批次大小下的瓶颈出现在主机端调度。因此,吞吐量提升在低批次大小时最大;即使在吞吐量最高的批次大小下,提升仍然显著。在该批次大小下,Rust 运行时相比多进程 Python 基线实现了 7.5% 的吞吐量提升。

Nova-3 encoder and decoder compiled ahead of time to NEFFs and served by a data-parallel Rust runtime on AWS Trainium2

图 1:Deepgram Nova-3 在 AWS Trainium2 上提前编译并由 Rust 提供服务

成本节省效果

我们以每美元处理的音频量衡量性价比。在 Deepgram 面向离线、注重吞吐量的批处理工作负载中,单设备 Trainium2 配置(trn2.3xlarge)每美元处理的音频量比 Deepgram 之前使用的计算选项高出 11–70%。

结论

本文展示了 Deepgram 与 AWS FDE 如何借助 TorchNeuron 将 Nova-3 语音转文本 PyTorch 模型移植到 Trainium 硬件。TorchNeuron 为 AWS Trainium 提供原生 PyTorch 框架集成。我们通过直接用 NKILib 中预构建的内核替换相应层,提升了性能。随后,我们使用 Neuron Explorer 评估性能,并运用 Neuron Agentic Development(NAD)分析技能查询分析数据,加快性能问题排查。在这些发现的基础上,我们利用 NAD 内核编写技能调整了内核源代码。最后,我们为 AWS Trainium 构建了一个轻量级 Rust 数据并行运行时,通过 Rust 调用 Neuron Runtime API。我们的配置在离线、注重吞吐量的场景中实现了成本节省,验证了 AWS Trainium 对 Deepgram 推理工作负载而言是一种可行且高效的选择。

若要在自己的模型上尝试这种方法,请从 AWS Neuron 文档入手,其中介绍了编译器、运行时和支持的框架。Neuron Kernel Interface(NKI)指南说明了如何编写本文介绍的内核,而 NKI 示例代码仓库则提供了我们采用的参考内核。Neuron 开发者工具文档介绍了我们在此使用的性能分析和智能体工具,包括 Neuron Explorer 和 Neuron Agentic Development。有关实例规格和定价,请参阅 Amazon EC2 Trn2 实例。如需帮助评估类似移植项目的范围,请联系 AWS Forward Deployed Engineering。


作者简介

Pierre Lienhart

Pierre Lienhart

Pierre 是 AWS 伦敦前沿部署工程团队的高级机器学习工程师。他与模型提供商和 AI 公司合作,充分发挥其推理工作负载在各种计算类型上的潜力,帮助他们在生产环境中以更快的速度和更低的成本提供模型服务。

Victor Wang

Victor Wang

Victor 是 Deepgram 的资深软件工程师,也是工程副总裁的技术顾问。加入 Deepgram 之前,Victor 曾在 AWS 担任多个职务,包括高级解决方案架构师、技术项目经理、专业服务顾问和软件开发人员。他热衷于学习新技术和周游世界,累计飞行里程超过 200 万英里。

Andre Gomes

Andre Gomes

Andre 是 AWS Annapurna Labs ML 的解决方案架构师,拥有帮助初创公司运行大规模训练和实时推理的经验。他曾是初创公司的联合创始人兼 CEO,如今与创始人合作,帮助他们在 Trainium 和 Inferentia 上扩展工作负载。Andre 在 UFMG 获得博士学位,期间曾在剑桥大学开展研究,将大型语言模型和神经主题建模应用于大规模数据分析与决策。

Elyse Zhang

Elyse Zhang

Elyse 是 AWS 的高级生成式 AI 策略师,负责帮助企业和初创公司客户推进模型定制之旅。她专注于将业务需求转化为适用于各行业的有效定制策略。

Haotian An

Haotian An

Haotian 是 AWS 前沿部署工程团队的机器学习工程师,专长于定制基础模型和大规模优化推理。他与客户紧密合作,根据特定使用场景调整生成式 AI,帮助客户发掘新能力并取得可衡量的业务成果。

Niraj Chaudhari

Niraj Chaudhari

Niraj 是 AWS 前沿部署工程团队的深度学习架构师。他与企业客户合作,通过监督微调和强化微调定制基础模型、构建智能体系统并优化 AI 工作负载。他还帮助客户在 Amazon SageMaker AI 和 Amazon Bedrock 上将生成式 AI 应用从概念验证推向生产环境。

Rohit Thekkanal

Rohit Thekkanal

Rohit 是 AWS 前沿部署工程团队模型定制部门的机器学习工程高级经理,负责领导专注于模型优化的可扩展生成式 AI 应用开发。在 Amazon 任职近十年间,他参与了对 Amazon 零售商品目录产生重大影响的机器学习项目。Rohit 获得了芝加哥大学布斯商学院 MBA 学位和卡内基梅隆大学硕士学位。

来源:AWS Machine Learning Blog · aws.amazon.com