PyTorch推理慢?C+++AI编译,QPS狂飙百倍!

在当今这个飞速发展的数字时代,人工智能技术已深深融入我们生活的方方面面,其中,推荐系统无疑是连接用户与海量信息、商品、内容的桥梁。无论是短视频平台上的热门推荐,还是电商网站的个性化商品展示,亦或是社交媒体的信息流排序,都离不开高效精准的推荐系统。为了让这些智能服务更加流畅、响应迅速,背后的推理系统效率至关重要。
我们知道,PyTorch 作为人工智能领域炙手可热的深度学习框架,凭借其灵活性和强大的社区支持,已成为许多前沿研究的首选工具,尤其在推荐系统、检索和排名等领域。开发者们都希望能以最快的速度,将最新的模型研究成果投入到实际应用中。一个基于 PyTorch 的推荐系统推理架构,恰恰能够满足这种需求,它不仅能实现极高的运行效率,还能大大加速模型的生产部署与迭代。
今天,我们就来深入探讨一个基于 PyTorch 构建的高性能推荐推理系统究竟是如何设计的。这种设计理念和方法,已经在海量流量场景中得到了充分验证,展现出强大的效率和卓越的可靠性。新媒网跨境了解到,这类PyTorch推理系统,正支撑着众多全球领先的机器学习核心业务,包括但不限于信息流、广告、社交平台、短视频和电商市场等多种应用场景。它能够驾驭各类复杂的机器学习架构,从基础的深度学习推荐模型(DLRM)的精巧扩展,到诸如DHEN(深度层次集成网络)、HSTU(层次序列转换单元)、Wukong等前沿创新的建模技术,都能够游刃有余地处理。这些先进技术的应用,不仅提升了用户体验,也推动了数字经济的蓬勃发展。
推荐系统:从研究到生产的推理之旅

一个典型的推荐系统,其从实验室研究到线上生产部署的整个推理流程,实际上是一个精妙的工程化过程。这个过程并非简单地将训练好的模型直接上线,而是需要经过一系列细致的转换与优化。
整体流程概述
模型在经过艰苦的训练阶段后,会形成一个模型定义文件和对应的训练权重。这好比是工程师们在实验室里精心打造出的一个原型机,它清晰地界定了模型的功能和参数。然而,这个“原型机”虽然强大,但如果直接拿到生产环境中去运行,效率往往会非常低下,根本无法满足实际应用中对速度和性能的严苛要求。
究其原因,训练模型通常是为了最大限度地提高准确率和收敛速度,它可能包含了许多仅在训练阶段才需要的组件,比如复杂的损失函数、正则化技术以及调试用的代码。这些在推理时都是多余的负担,会消耗宝贵的计算资源。
因此,我们需要一个强大而敏捷的管道,能够快速、可靠地将这些训练好的模型转化为专为推理而优化的版本。更重要的是,推荐系统模型需要频繁更新迭代,以适应不断变化的用户兴趣和数据模式。这就要求我们的转化管道必须具备高度的灵活性,能够高效地处理大量模型及其不同版本。
这个转化过程的核心目标,是将训练模型文件精心打磨,使其能够最大限度地发挥硬件效能,从而实现极高的吞吐量(每秒查询次数,QPS)并满足严格的延迟要求。简而言之,一个专门用于将训练模型转化为生产级推理模型的系统,对于我们在模型部署过程中保持敏捷性、可扩展性和卓越性能来说,是不可或缺的基石。它确保了用户在享受个性化推荐服务时,能够感受到丝滑无阻的体验。
定义推理模型与权重映射
在整个模型部署流程中,一个关键步骤是明确定义“推理模型”。前面提到,训练模型往往包含很多仅在训练时才需要的组件。所以,最佳实践是专门构建一个推理模型,它只保留了训练模型中的前向逻辑,并为推理阶段的特有优化留出了空间。这就像是把一个多功能的实验室设备,精简成一个专门用于特定任务的高效生产工具。
此外,由于训练和推理过程中,模型参数的命名方式可能存在细微差异,因此必须建立一个清晰的映射关系。这个映射表连接了推理模型的参数与训练好的模型权重(通常称为检查点)。在推理模型准备的整个过程中,这个映射关系需要被精心维护和实时更新,确保推理模型能够正确加载并使用训练阶段学习到的所有知识。这一步的严谨性,直接关系到线上推理结果的准确性和稳定性。
从Python模型中捕获计算图
为了实现高效推理,我们必须对推理模型进行一系列的优化转换。而要应用这些优化,首先需要将用Python语言定义的PyTorch模型,转换为一种可供分析和操作的“图表示”。捕获PyTorch模型的计算图,本身就是一项富有挑战性的任务。
在实践中,使用 torch.fx 工具来提取FX图是一种常见做法。这种方法通常假设模型架构不包含循环结构。对于那些包含复杂控制流的子模块,我们可以将其标记为“叶子节点”,从而简化图的提取过程。近来,torch.export 工具在捕获计算图方面变得更加成熟,它对包含控制流的模型提供了更好的支持。然而,其生成的PT2IR(一种专门的FX图)可能会比较底层且分解程度较高,这可能会在某些模型转换时带来一定的复杂性。理解并妥善处理这些底层表示,是实现深度优化不可或不可或缺的一环。
模型转换与优化
当我们成功捕获了FX图之后,便可以开始施展一系列模型转换的“魔法”了。通过这些转换,模型将变得更加精简、高效,从而更好地适应生产环境的需求。以下是一些常见的模型转换优化手段,它们共同构筑了高性能推理系统的基石:
- 模型拆分: 在分布式推理场景下,一个完整的“前向”计算图往往需要被拆分成更小的子图。每个子图代表一个子模块的前向计算,这样就能在多台设备或主机上并行执行。想象一下,一个复杂的生产线被拆分成多个并行的小工位,每个工位负责一部分任务,整体效率自然大幅提升。此外,这些转换还可以将相似的计算分组在一起,进一步提升整体效率。这对于处理大规模推荐系统中的海量数据和复杂模型尤为重要。
- 算子融合: 多个连续的小操作可以被合并替换为一个单一的、融合后的高效实现。这可以通过替换子模块或应用图级别的转换来实现。例如,在一个卷积层之后立即跟着一个激活函数,这两个操作可以被融合为一个更快的复合操作,减少内存访问和计算开销,就像把两道菜的制作工序合并,从而更快地上菜。
- 量化: 类似于算子融合,量化是一种通过降低模型参数的精度来减少内存占用和提高推理速度的策略。例如,将浮点数(float32)权重替换为精度较低但占用空间更小的整数(如int8)。TorchAO库提供了对线性量化的支持,并与PT2(PyTorch 2.0)生态系统深度融合。这就像把一张高精度照片压缩成一张小尺寸照片,虽然细节略有损失,但传输和处理速度会快很多。在推荐系统中,尤其是在嵌入层等对精度不那么敏感的环节,量化能够带来显著的性能提升。
- 编译(即降低层级): 模型编译技术通常作为转换过程的一部分,提前进行应用。这一步将模型代码转换为更低层次的表示形式,使其更适合目标推理设备(例如特定的GPU或CPU架构)。这就像把高级编程语言编写的程序,编译成机器能直接理解的汇编指令,从而实现更快的执行速度。稍后我们将在“AI编译器”部分详细探讨这一技术。
这些优化措施共同作用,使得原本庞大复杂的训练模型能够“瘦身健体”,在满足性能要求的同时,也能更灵活地部署在各种硬件环境中,为用户提供无缝的智能推荐服务。
模型序列化
在模型准备的最终阶段,我们需要将优化后的模型保存下来,以便加载和执行。标准的PyTorch模型通常使用pickle格式进行存储。然而,这种方法在生产环境中存在一些不足:首先是其较弱的向后兼容性,随着PyTorch版本迭代,旧版pickle文件可能无法被新版加载;其次是Python依赖问题,部署时需要携带Python环境,增加了复杂性。为了应对这些挑战,业界发展出了多种序列化解决方案:
| 解决方案 | 描述 | 优点 | 缺点 |
|---|---|---|---|
| TorchScript | 通过脚本化(scripting)或追踪(tracing)捕获TorchScript IR,并保存为TorchScript格式。 | 1) 成熟稳定,具有强大的向后兼容性支持 2) 对控制流有良好的支持 |
1) 对模型定义存在某些限制(例如,不支持复杂的Python数据结构) 2) 目前已处于弃用状态,不再积极支持 |
| torch.export | 将PyTorch模型导出为PT2IR。 | 1) PyTorch 2.0官方推荐的模型序列化方式 2) 正在积极开发中,未来可期 |
1) 对控制流的处理可能需要额外关注 2) 仍处于快速发展阶段,社区案例不如TorchScript成熟 |
| torch.package | 直接将相关的Python模块作为源代码和pickle对象导出。 | 1) 提供了极大的灵活性,能够保留大部分Python原生特性 2) 对于一些复杂的、难以完全图化的模型,提供了方便的打包方式 |
1) 可能需要手动定义模块边界,以确保所有依赖项都被正确打包 2) 运行时仍依赖Python环境,这在某些高性能、低延迟的C++推理服务中可能成为瓶颈,不利于实现Python无关的运行时优化。 |
新媒网跨境获悉,无论采用哪种序列化格式,最终的模型制品通常都会被打包成一个zip文件。这种格式便于检查和调试,只需解压即可查看其内容。经过处理的权重也可以一并打包到zip文件中,实现了模型结构和权重的统一管理。
值得一提的是,目前业界正优先推荐使用 torch.export 进行新模型的开发,它比TorchScript和torch.package等旧工具更具优势。随着TorchScript逐渐被弃用,torch.export提供了一条更稳健、功能更活跃的未来路径。它还能通过实现Python无关的运行时,提供比torch.package更卓越的性能,这对于追求极致效率的生产环境来说,无疑是一个重要的突破。
模型加载与执行
当推理模型文件准备妥当后,接下来的任务就是将它们加载并投入实际运行。对于一些特别庞大的模型,可能需要采取分步加载的策略,即模型结构与权重分开加载,这可能需要定制化的保存和加载逻辑。一旦模型文件被成功加载,运行时便可以开始处理用户的推理请求了。
由于PyTorch本身主要专注于模型执行,并不直接提供完整的服务能力,因此,我们还需要一个额外的服务器层来管理推理服务。这个服务器层是连接模型与用户请求的桥梁,它肩负着请求调度、批处理、负载均衡等关键职责。
接下来,我们来共同探讨一个高效、可扩展的PyTorch推荐系统推理服务器需要具备哪些核心功能:
- 轻量级PyTorch执行器封装: 服务器的核心功能之一是将接收到的用户请求转换为PyTorch模型能够理解的输入格式。这个执行器封装层应该尽可能地轻量化,以确保最小的开销和最高的效率。它就像一个精密的翻译官,在不增加额外负担的情况下,准确地传达信息。
- 高效灵活的API接口: 在分布式环境中,模型的不同组件之间需要通过API进行通信。这就要求API具有精确的语义定义,例如明确指定批处理维度和其他相关参数。基于张量(Tensor)的API与PyTorch模型的前向方法高度契合,能够实现数据的高效传递。此外,零拷贝(in-place)API尤为重要,它允许我们在不消耗大量额外内存的情况下,原地更新模型。这意味着当模型需要从一个版本无缝切换到下一个版本时,无需在过渡期同时加载两个模型版本,从而节省了大量系统资源,保证了服务连续性和稳定性。
- DAG(有向无环图)表示与执行器: 具有相似特性的模块(例如,所有的嵌入层)可以被归类到专门的子模块中,以便进行批处理执行。模型拆分后,原始的前向函数会表示为一个有向无环图(DAG),图中的每个节点对应一个子模块。此时,就需要一个专门的执行器来管理这个DAG的执行流程。由于DAG中的节点可能部署在不同的主机上,因此执行器必须支持远程执行。在这种情况下,一个高效的通信库至关重要,它能确保分布式组件之间实现无缝且高性能的交互,从而最大限度地发挥整个系统的协同效能。
这些关键特性共同构成了一个强大而灵活的PyTorch推理服务器,它不仅能支撑海量用户请求,还能确保推荐系统以最快的速度响应用户需求,带来卓越的个性化体验。
优化:追求极致性能的奥秘
在前一节中,我们共同探讨了如何构建一个稳健、高效且可扩展的PyTorch推荐推理系统的核心原则。这些原则使得系统能够应对巨大的流量挑战并满足严苛的生产要求。然而,对于追求极致性能的工程团队而言,优化永无止境。接下来,我们将深入剖析几项关键的优化策略,它们能进一步提升系统的表现,为用户带来更流畅、更智能的体验。
GPU(加速器)推理:算力引擎的澎湃动力
随着模型架构日益复杂,对计算能力的需求也呈指数级增长。传统的CPU在处理这些复杂模型时,往往难以满足在线推理的延迟要求。因此,GPU等加速器自然成为了首选。然而,将整个模型直接运行在单个GPU上可能并不高效,甚至可能因为内存限制而无法装载。
为此,一个实用的策略是将模型拆分成多个部分,并将其中计算最密集的核心层卸载到GPU上执行。这就像把一项繁重的工作分解,把最需要力气的部分交给专业的“大力士”去完成。此外,GPU内核启动本身也会带来显著的开销。为了缓解这个问题,将多个请求进行批处理(coalescing)可以有效减少内核启动次数,从而提高整体吞吐量。通过充分利用GPU的并行计算能力,推荐系统能够在更短的时间内处理更多的用户请求,大大提升响应速度。
C++运行时:告别Python瓶颈,直抵性能巅峰
尽管通过Python直接运行PyTorch模型是最直观的方式,但Python运行时本身会引入明显的开销,尤其当QPS(每秒查询次数)提升时。通常来说,当QPS达到100或更高时,Python的开销就会变得显著;而当QPS突破1000时,Python甚至可能成为严重的性能瓶颈。
对于高QPS场景(每台主机QPS ≥ 100),我们强烈建议采用C++(或Rust)运行时。这就像把一个由解释型语言编写的程序,重写成编译型语言,从而获得原生执行的速度。TorchScript(针对TorchScript模型)和ExecuTorch(针对使用 torch.export 保存的模型)都提供了C++运行时。新媒网跨境认为,最新动态显示,一个新的运行时 torch.nativert 正在积极开发中,它专为在服务器上执行 torch.export 模型而设计,作为TorchScript运行时的替代方案。据外媒报道,在最新的PyTorch大会上,TorchScript运行时已被弃用,这也预示着 torch.nativert 将成为未来重要的发展方向。采用C++运行时,能够极大程度地减少解释器开销,释放模型的全部计算潜力。
分布式推理(DI):化整为零,协同作战
将整个推理模型作为一个单一的整体(单体架构)来运行,在效率上可能不尽如人意,甚至对于超大规模模型来说根本不可行。相反,将模型拆分为多个组件并分布到不同的工作节点上,既能提高效率,又能支持更大规模的模型。这种“化整为零,协同作战”的分布式推理模式,通常包括以下几种:
- CPU-GPU混合分布式推理: 这种模式将输入数据处理和轻量级计算任务分配给CPU,而将模型中计算密集的核心层卸载到GPU上。CPU负责“思考”和“调度”,GPU则负责“执行”最耗力的计算,两者各司其职,发挥各自优势。
- 嵌入层-稠密层分布式推理: 在推荐系统中,嵌入表(embedding tables)通常非常庞大,包含海量的用户和物品特征。这种模式将嵌入表分组到专门的子模块中,并部署在独立的服务器上(类似于传统的参数服务器)。而稠密层(dense layers)虽然较小但计算密集,可以被分组并集中执行,以提高效率。
- 稠密模型并行: 对于单个大型稠密网络,可以将其拆分成多个子网络,然后并行执行。这些子网络可以在同一设备内的不同CUDA流上并行运行,也可以分布在多个设备上,从而实现选择性地降低计算层级并并行执行,进一步提升大型模型的推理速度。
通过这些分布式推理模式,我们能够更灵活地管理计算资源,突破单设备限制,有效应对超大规模推荐模型的挑战。
AI编译器与高性能内核库:智慧与力量的结晶
为了压榨出硬件的最大性能,开发者们有时会倾向于直接用C++/CUDA重写模型定义。然而,这种手工优化方式难以扩展,成本高昂。幸运的是,AI编译器能够自动化这一过程,生成高度优化的执行代码。它们是智能的“翻译官”,能将高级模型描述转换为硬件高效执行的指令。
目前主流的AI编译器包括:
- AOTInductor (torch.compile): PyTorch 2.0中引入的编译工具链。
- AITemplate: 一个开源Python框架,能将深度神经网络转换为针对NVIDIA和AMD GPU高度优化的C++代码,通过统一的硬件支持和全面的算子融合,提供接近硬件上限的推理性能。
- TensorRT: 英伟达(NVIDIA)的开发者生态系统,包含推理编译器、运行时和模型优化工具,旨在为生产应用提供高性能、低延迟的深度学习推理。
这些编译器会生成新的、经过编译的工件,并与序列化模型一同打包。对于生产级的推荐系统部署,出于性能考虑,C++运行时是首选。这意味着Python依赖的JIT(即时编译)工作流,如torch.compile,不能直接使用;相反,AOT(提前编译)Inductor被用来将模型预编译成可在C++中部署的静态运行时工件。
AI编译器还会充分利用各种高性能内核库,以最大限度地提升不同硬件平台上的计算效率,这包括:
- CUTLASS/CuTeDSL: 针对英伟达(Nvidia)GPU优化。
- Composable Kernels / AITER: 针对AMD GPU优化。
- ZenDNN: 针对AMD CPU优化。
- OneDNN: 针对英特尔(Intel)CPU优化。
这些AI编译器与高性能内核库的结合,极大地降低了开发者进行底层优化的门槛,使得更广泛的AI模型能够享受到顶级的计算性能。
请求合并(Request Coalescing):聚沙成塔,效率倍增
要最大限度地提高推理效率,一个非常有效的策略是将多个独立的请求合并(批处理)在一起。这就像把许多小包裹合并成一个大包裹运输,可以显著减少运输成本。实现请求合并,需要我们准确理解每个输入的语义,特别是哪一个维度代表动态批次大小,以便能够正确地拼接不同的请求。
模型的forward方法应被标记上批次信息,以便于运行时进行合并操作。同时,推理运行时也必须支持这项功能。通过请求合并,我们可以显著减少单次计算的开销,提高计算单元的利用率,从而在高并发场景下实现更高的吞吐量和更低的平均延迟。
表批处理嵌入(Table Batched Embedding):高效查询,减少开销
在PyTorch中查询嵌入表时,尤其是当模型中包含数十、数百甚至数千个嵌入表时,可能会产生大量的算子内核启动开销。由于嵌入查找本质上是数据传输密集型操作(类似于哈希表查询),因此将多个嵌入包进行批处理,并在一次调用中查询所有表,可以极大地减少内核启动开销,并提高数据传输效率。
想象一下,如果每次查询都单独发一次指令,效率会很低。而通过批处理,我们可以一次性发出指令,然后获取所有结果。这不仅减少了CPU与GPU之间的通信次数,也使得GPU能够更高效地进行内存访问和计算,从而显著提升推荐系统中嵌入查找的性能。
量化:平衡精度与效率的艺术
量化是平衡模型精度与推理效率的关键技术,它通过降低模型参数的表示精度来达到目的。在推荐系统中,嵌入层和稠密层都可以从量化中获得显著的收益:
- 嵌入层: 对于嵌入数据,像bf16(BFloat16)和int8这样的数据类型通常是安全的,而int4在很多情况下也能够接受。值得注意的是,不同的嵌入表和行可能对数值精度有不同的敏感度。PyTorch支持对每个表进行量化,甚至对于批处理嵌入也能实现这一点,这允许开发者根据实际需求定制量化策略。有些表甚至可以尝试使用int1或int2配置,以达到极致的内存和计算优化。量化的核心在于找到一个平衡点,在减少内存和提升速度的同时,尽可能保持模型的推荐效果。
- 稠密层: 相比嵌入层,稠密层对量化更为敏感。通常,fp16(半精度浮点数)和bf16适用于整个稠密子模块,但在某些特定情况下也存在例外。例如,fp16可能在数值范围上有所不足,而bf16可能在某些模型上精度不够。为了进一步提高效率,fp8(8位浮点数)和fp4(4位浮点数)也可以在层级上应用,但这通常需要进行大量的手动调优。所有量化策略都必须通过严格的准确性评估来验证其效果。TorchAO库为线性层和卷积层提供了良好的支持,是一个不错的起点。通过精细的量化,我们可以在保证推荐质量的前提下,大幅降低模型的资源消耗,为更大规模的部署打下基础。
增量更新(Delta Update):模型保鲜,服务不中断
对于推荐模型而言,模型的“新鲜度”至关重要,它直接影响推荐的准确性和时效性。然而,随着模型规模日益庞大,每次加载完整的模型会变得越来越昂贵,耗时也更长。因此,一种更为平衡且高效的方法是采用部分权重更新,即“增量更新”(Delta Update)。
实现数据传输协议相对简单,但关键在于精确调整权重加载的速度和时机,以避免在更新过程中对在线服务造成任何干扰。想象一下,一辆高速行驶的列车,需要在不停车的情况下更换部件,这就需要极其精密的协调。
通常,嵌入表对部分更新的容忍度较高,因为它们更多地存储离散特征的表示,部分更新对整体影响较小。而稠密模块(如全连接层)则对更新更为敏感,因为它们的权重是高度相互关联的。对于稠密模块,我们建议采用“缓冲模块”来支持完整的模块交换,而不是单独更新每个权重。这意味着当需要更新稠密模块时,可以预先加载新版本的模块到一个缓冲区域,然后在合适的时机进行原子性的切换,从而确保切换过程的平滑无缝,避免服务质量的下降。增量更新技术,使得推荐系统能够在持续学习和演进的同时,保持稳定高效的在线服务。
开发者体验:让创新更加轻松
构建一套高性能的推理系统固然重要,但优秀的开发者体验同样不可或缺。毕竟,再强大的工具,如果使用起来困难重重,也会大大降低开发效率和创新速度。新媒网跨境了解到,为了让开发者能够更轻松、更高效地进行推理流程的开发和调试,业界推荐采取以下策略:
Python运行时:灵活性与调试的利器
为了简化推理流程的开发和调试,我们强烈建议提供一个轻量级的Python运行时环境(作为C++运行时的补充)。这种方法能让开发者高效地判断问题是源于运行时本身,还是模型逻辑。例如,模型在C++运行时表现异常,可以快速切换到Python环境进行复现和定位。
此外,Python运行时也简化了添加调试工具和插桩(instrumentation)的过程。随着Python自由线程(Free-threaded Python)的引入,Python生态系统内部的运行时开销和通信开销将得到进一步的最小化。这一进步使得在生产环境中部署Python运行时变得越来越实用,它能为快速迭代和问题诊断提供无与伦比的便利。
基于模块交换的转换:直观高效的优化之路
从历史上看,基于图的转换对于模型作者来说,理解和调试一直是个难题。这主要是因为图操作的复杂性,以及在转换过程中原始堆栈跟踪信息可能丢失,导致难以追溯问题根源。为了解决这些痛点,我们推荐将此类优化更早地融入到推理模块的编写过程中。
通过采用一种整体的、原生的PyTorch模块化工作流程,并充分利用Eager模式(即时执行模式)进行转换,我们发现推理开发体验得到了显著提升。这种方法让优化过程更加直观,开发者可以直接在Python代码层面理解和控制模型的转换,极大地提高了开发效率和调试便利性。
评估流程:质量与性能的双重保障
为了确保模型和运行时系统的双重质量,我们建议实施以下两种关键的评估流程:
- 准确性验证: 这一步骤要求我们将推理模型的输出质量与训练阶段的评估结果进行仔细比较。如果两者存在显著差异,可能意味着在模型转换或量化过程中引入了精度损失,或存在其他问题。准确性是推荐系统的生命线,任何偏差都必须及时发现并纠正。
- 性能基准测试: 通过重放接近真实生产环境的流量数据,我们可以对系统的吞吐量(QPS)和延迟进行全面的评估。这有助于发现潜在的性能瓶颈,验证优化策略的有效性,并确保系统在应对高并发请求时依然能够保持稳定和高效。
这两个评估流程相辅相成,共同为推荐系统的上线和持续运行提供了坚实的质量和性能保障。
结语
在新媒网跨境看来,我们今天探讨的这套基于PyTorch构建的高效推荐推理系统,正是将前沿研究成果转化为生产级服务的关键。它提供了一个从训练模型定义到最终线上部署的完整而强大的工作流程。这个流程涵盖了诸多关键环节:包括精妙的图捕获技术、灵活的模型拆分策略、一系列高效的优化手段(如算子融合、量化、模型编译等),以及最终的模型序列化。
我们还详细阐述了一个高性能推理服务器所需具备的核心要素,包括轻量级执行器、灵活的基于张量的API接口,以及基于DAG的模型执行模式,它们共同确保了系统的高效运转。最后,我们深入探讨了针对高QPS、低延迟场景的关键优化技术,例如充分利用GPU/加速器进行推理、采用C++运行时、实施分布式推理模式、运用AI编译器,以及请求合并、表批处理嵌入和精细化量化等先进方法。
通过遵循这些原则并有效利用文章中提到的开源库,开发者们将能够构建出可扩展、高性能且高度敏捷的PyTorch推荐系统。新媒网跨境认为,这些系统有能力驾驭全球最严苛的机器学习推荐工作负载,为用户带来更智能、更个性化的数字生活体验,也为数字经济的持续繁荣注入不竭动力。这不仅是技术的进步,更是服务于亿万用户的智慧结晶,体现了我们追求卓越、持续创新的精神。
相关技术库一览
- TorchRec: 这是一个PyTorch领域的专业库,为全球领先的推荐系统提供支持。它具备处理大规模嵌入表所需的稀疏性和并行化原语,并能将嵌入表分片到多个GPU上进行训练和部署。
- TorchAO: 一个易于使用的PyTorch原生量化库。TorchAO可以与
torch.compile()和FSDP2(完整分片数据并行)无缝配合,在大多数HuggingFace PyTorch模型上开箱即用。 - AITemplate: 一个开源的Python框架,它能将深度神经网络转换成针对英伟达(NVIDIA)和AMD GPU高度优化的C++代码。通过统一的硬件支持和全面的算子融合,它能提供接近理论峰值的推理性能。
- TensorRT: 英伟达(NVIDIA)TensorRT是一个包含推理编译器、运行时和模型优化的开发者生态系统。它旨在为生产应用提供高性能、低延迟的深度学习推理。
- Generative Recommenders / HSTU: 一个将经典推荐系统重构为生成模型的库,并引入了HSTU和M-FALCON等算法,旨在大幅加速训练和推理过程,同时为数十亿用户规模的环境建立扩展法则。
- FBGEMM: 广泛应用于深度学习应用(包括推荐系统)中的高度优化内核库。
- Triton and Low-Level Extension (TLX): Triton是一种基于Python的语言和编译器,专为编写高效的GPU内核而设计。TLX(Triton Low-Level Extensions)是一个实验性插件,在Triton中提供细粒度的、硬件特定的控制,使开发者能够进一步优化现代GPU上的性能。
- oneDNN: oneAPI深度神经网络库是一个开源、跨平台的性能库,包含深度学习应用的基本构建块,并专门针对英特尔(Intel)处理器进行了优化。
- ZenDNN: ZenDNN(Zen深度神经网络)库可加速AMD CPU上的深度学习推理应用。
- CUTLASS / CuTeDSL: CUTLASS是一个用于在CUDA中实现高性能矩阵乘法(GEMM)及相关计算的抽象集合,涵盖各个层次和规模。CuTeDSL是用于Cutlass的基于Python的嵌入式领域特定语言。
- AITER: AITER是AMD的集中式仓库,支持各种高性能AI算子,用于加速AI工作负载。它是满足不同客户算子级别请求的良好统一平台。
- CK: Composable Kernel (CK) 库提供了一种编程模型,用于为跨多种架构(GPU、CPU等)的机器学习工作负载编写性能关键的内核。CK库使用通用内核语言,例如HIP C++。
新媒网(公号: 新媒网跨境发布),是一个专业的跨境电商、游戏、支付、贸易和广告社区平台,为百万跨境人传递最新的海外淘金精准资讯情报。
本文来源:新媒网 https://nmedialink.com/posts/pytorch-inference-slow-cpp-ai-boost-qps-100x.html


粤公网安备 44011302004783号 











