GPU加速:宽深度推理
GPU加速:宽深度推理
Accelerating Wide & Deep Recommender Inference on GPUs
推荐系统推动了许多最流行的在线平台的参与。随着为这些系统提供动力的数据量的快速增长,数据科学家正越来越多地从更传统的机器学习方法转向高度表达的深度学习模型,以提高其建议的质量。Google的广度和深度架构已经成为解决这些问题的一种流行的模型选择,既有其对信号稀疏性的鲁棒性,也有其通过DNN线性组合分类器API在TensorFlow中的用户友好实现。虽然这些深度学习模型的复杂性导致的成本和延迟最初对推理应用来说非常昂贵,但将证明,为NVIDIA gpu优化的加速、混合精度的实现可以显著减少延迟,同时在成本/推理方面获得显著的改进。这为快速、低成本、可扩展的推荐系统铺平了道路,推荐系统非常适合在线和离线部署,并使用简单而熟悉的TensorFlow api实现。 在本文中,描述了一个基于TensorFlow的DNN线性组合分类器API的广深结构的高度优化的GPU加速推理实现。提出的解决方案可以很容易地从训练的张量流宽深模型转换为混合精度推理部署。还基于一个有代表性的数据集给出了该解决方案的性能结果,并表明宽模型和深模型的GPU推理可以分别在在线和离线场景中产生高达13倍的延迟或11倍的吞吐量改进。
Background
The Recommendation Problem
虽然都可能对推荐的内容有一个直观的理解,但机器学习模型如何推荐的问题就不那么明显了。毕竟,对于推荐的概念,有一种非常规范的说法:“应该看电影a”,“应该在餐厅B吃tagliatelle”。模特怎么知道我该怎么做?
答案是,事实上,不是这样的。相反,使用机器学习来模拟用户与相关项目交互的方式。交互可能意味着点击广告、播放视频、在基于网络的商店购物、对餐厅的评论,或者应用程序可能感兴趣的任何数量的结果。机器学习模型使用以前交互的数据来预测新交互的可能性;推荐模型认为最有可能发生的交互。
模型如何进行这些预测将取决于拥有的数据类型。如果只知道过去发生过哪些交互,那么可能会对通过奇异值分解或变分自动编码等方式训练协作过滤模型感兴趣。如果有描述交互实体的数据(例如,用户年龄、餐厅菜肴的类别、电影的平均评论),那么可以根据当前这些属性对新交互的可能性进行建模。
Training vs. Inference
广义上讲,机器学习模型的生命周期可以分为两个阶段。在第一个例子中,通过展示过去用户和项目之间的交互(或非交互)的例子来训练模型,使其做出良好的预测。一旦学会了以足够的精度进行预测,就将模型部署为一个服务来推断新交互的可能性。 让举个例子让事情更具体。假设有一个应用程序,用户可以在该应用程序上查找餐厅并对其进行评级,希望构建一个推荐服务,以推荐用户可能喜欢的新餐厅。可以通过向模型展示一个用户的数据和一个被该用户评分的餐厅的数据来训练的模型,并要求在0-1的范围内评分用户评分高于10分之5的可能性有多大。然后,向展示答案,以便能够以这样一种方式进行自我更新:在经过数百万次的猜测之后答案可以得到相当好的结果。
一旦的教育完成模式是时候把新获得的技能很好地利用。需要找到一份工作,但所知道的只是告诉我,某个用户是否会喜欢某个餐馆。如果我感兴趣的是找到新的餐厅向用户展示,那么这项技能似乎没有特别的帮助,因为如果我事先知道哪些用户和餐厅要组合在一起,我就不需要模型了!
因此,重新表述了这个问题:将一个用户与成百上千个候选餐厅配对,收集用户喜欢其中每个餐厅的可能性,然后向用户展示最有可能喜欢的餐厅。这个推理阶段使用的数据消耗模式与在培训期间看到的不同,一个用户与多个广告配对,而不是一个用户与一个广告配对,因此需要不同的设计和数据表示考虑。
如何对这些模型进行有效的训练,本身就是一个丰富而有趣的问题,也是英伟达积极发展的一个领域。然而,经常发现,对于推荐空间中的数据科学家来说,推论是更为尖锐的痛点。深度学习模型虽然功能强大,但通常比机器学习模型需要更多的计算。这就意味着在部署模型进行推理时,延迟(等待建议的时间)更高,吞吐量(每秒可以提出多少建议,这与成本有关)更低。如果你的高技能模型需要很长时间来完成的工作,或者成本太高,你可能会完全放弃,而不是一些技术较低但速度更快、成本更低的东西。
除了计算需求之外,推断阶段还提出了其系统级的考虑,这些考虑会影响部署的延迟和吞吐量测量。生成推荐查询的站点(例如,智能手机)通常不具备在合理的时间内运行推荐模型的计算能力。解决此问题的标准方法是转到客户机-服务器模型,在该模型中,客户机生成一个建议查询,并将其发送到执行与该模型相关的所有计算任务并将结果发送回客户机的远程服务器。这会带来潜在的瓶颈,因为数据需要通过网络从客户端发送到服务器并返回。要从服务器中提取最高值,让多个客户端向单个服务器发送查询是很有用的。这又增加了在服务器上优化调度这些客户机查询的复杂性。此外,如果模型在GPU上运行,则到GPU的数据传输也会对性能产生影响。建议部署更为复杂,只需进行计算和完整的系统级分析就可以了解部署的端到端性能。
Wide & Deep
宽深网络的主要组成部分是一个稠密神经网络(DNN)和一个线性模型,其输出被求和以创建交互概率。分类变量被嵌入到连续向量空间中,然后通过学习的或用户确定的嵌入被输入到DNN中。使该模型在推荐任务中如此成功的是,提供了两种数据学习模式的途径,“深”和“浅”。复杂的非线性DNN能够学习数据中关系的丰富表示,但是需要看到这些关系的许多示例才能很好地实现。另一方面,线性部分能够“记忆”简单的关系,这些关系可能只在训练集中出现几次。
在组合中,这两个表示通道通常最终提供的建模能力比单独提供的任何一个都强。在Google关于架构的原始论文中,报告说,当使用Wide&Deep与DNN或单独回归相比时app store的收购率在统计学上有了显著的提高。NVIDIA与许多行业合作伙伴合作,通过使用Wide&Deep替代更传统的机器学习模型,报告了离线和在线指标的改进。
TensorFlow and DNNLinearCombinedClassifier
既然已经决定使用一个广度和深度的模型来提出建议,就产生了如何实现的问题。也就是说,如何在代码中定义从原始数据映射到正在寻找的0-1预测的所有小数学函数,更不用说定义更新和训练过程所需的所有微积分函数了。
虽然有很多流行的深度学习框架来实现这些模型,但是选择关注TensorFlow,特别是在DNNLinearCombinedClassifier类中预先构建的Wide&deep实现,这是的估计器API的一个实例。之所以选择将注意力集中在这里,并不是因为必然是一个更好的选择(尽管确实提供了强大的抽象功能,使数据科学家的工作更轻松),但由于看到被广泛应用于大型消费性互联网公司的生产规模推荐系统,有幸与之合作并从中学习。希望通过在用户熟悉和熟悉的框架内工作,可以降低实现快速和可扩展推荐系统的障碍。