用实现模型并调优:每秒可做亿次预测吗

核心提示机器之心报道编辑:小舟、蛋酱用 TensorFlow 实现机器学习模型,并使用各种优化技术降低延迟,模型的速度最快能够达到多少?TensorFlow 是目前使用最广泛的机器学习框架之一,它加快了研究速度,并减少了新模型的生产时间。在一篇论文

机器心脏报告

编辑:船,蛋酱

用TensorFlow实现机器学习模型,用各种优化技术降低延迟,模型最快速度是多少?

TensorFlow是应用最广泛的机器学习框架之一,它加快了研究速度,减少了新模型的生产时间。在一篇论文中,来自原生编程DSP公司Zemanta的数据科学总监Davorin Kopi和工程师Jan Hartman演示了将在线广告生态系统中的大规模机器学习模型转化为TensorFlow框架的过程,并将TensorFlow框架中实现的机器学习模型扩展到每秒超过3亿次预测。因此,本研究的主要内容是在TF中实现该模型,并使用各种优化技术,以低延迟有效地为其提供服务。

地址:https://arxiv.org/abs/2109.09541

本研究中使用的案例是在线广告的点击预测。在RTB,多个DSP通过在网页加载过程中实时竞价来竞争在线广告空。广告间空是按照广告印象来卖的,这就使得虚拟广告间空可以按市值出售。通过使用机器学习,RTB还使广告商能够最大限度地提高他们的关键绩效指标,如点击率。估算广告的点击率是RTB的核心问题之一。有一个好的点击预测模型是非常重要的。

在Golang中实现的基于自定义logistic回归和分解机的模型,表达能力有限,所有的学习程序都需要手动实现,会拖慢实验速度,限制模型的预测性能。因此,研究人员决定采用TensorFlow框架,用表达能力更强的模型取代现有模型。

面临的挑战

基于广告竞价的具体用例,研究遇到了一些挑战,分为实施、服务和优化三个方面。

一方面,每台机器配备一个或多个顶级GPU的成本会高得令人望而却步;另一方面,只有一小组GPU的机器将迫使研究转向基于服务的架构。由于这两个选项都不是特别理想,而且这项研究的模型与其他深度学习领域的SOTA模型相比相对较小,因此这项研究没有在生产中使用GPU进行推理。并且由于研究模型使用稀疏权重,其用例不适合GPU工作负载。

实现

为了实现TF模型的有效训练循环,本研究实施并测试了各种方法。TF中高通量在线培训和服务的案例研究很少,文档往往不够具体,迫使研究人员通读源代码和基准原型,寻找实现过程中的陷阱。

TF提供了一个庞大的生态系统和大量的带有SOTA算法实现的库。选择功能丰富的现有实现很容易,但研究人员发现这些实现大多没有经过优化,因此他们决定实现自己的算法。具有不同抽象层次的TF APIs。但是,有些API虽然好用,但通常是最底层的操作,效率很低。研究人员最终选择了Keras3,因为它是底层TF的一个薄薄的包装器,具有高性能并且易于理解。由于TF是一个具有丰富功能和资源的库,所以本研究还必须考虑在其中实现多少机器学习流水线。研究人员选择暂时搁置特征转化和交互,只实现学习算法——虽然是最小的可替换部分,但却有最大的改进潜力。

由于Golang TF wrapper只支持预测,所以有必要用Python实现训练循环。该脚本通过使用其标准输入作为子进程来实现与Golang数据管道的连接。数据以有效的二进制格式发送,无需解析。与CSV格式相比,该方法的速度提高了25%。然后在后台线程中读取数据,防止模型在等待数据空时空闲。基于此,该研究在整个训练管道中实现了高通量。事实证明,高效的输入和输出也是低延迟预测的关键。这项研究通过将所有输入要素连接到单个张量中,显著减少了序列化和复制输入数据所花费的时间。

服务

研究人员发现,由于计算密集型神经网络的存在,当使用Golang TF decorator时,DeepFM模型的CPU利用率要高得多。虽然带来了指标上的显著提升,但是将这种方式推广到100%流量会带来很大的硬件成本。目前全球都面临着芯片短缺的问题,这意味着成本的艰难和昂贵。

显然,需要降低计算成本。但是,缩小神经网络模型的规模也会降低模型的预测性能。研究人员在深入研究TF后发现,如果在批量计算时增加例子的数量,计算效率会大大提高。这种低线性增长是因为TF代码是高度矢量化的,TF也会产生每次计算调用的开销,然后分批摊销。考虑到这一点,如果您想要减少计算调用的数量,您需要将许多请求连接到一个计算中。

研究人员已经建立了一个自动批处理系统,该系统全部包含在一个正在运行的bidder实例中,以避免网络调用。因为每个实例每秒接收数千个传入请求,所以它可以保证连接来自许多请求的计算并创建更大的批处理。研究人员通过一些批处理线程实现了这一点,这些线程从传入的请求中接收数据,创建批处理,并在批处理完成后初始化计算。在计算过程中,每隔几毫秒对其进行初始化以避免超时,因为批次可能不会在此时间窗口内填满。这种实现是高度优化的,计算调用次数减少到五分之一,同时TF计算的CPU消耗减半。

虽然请求超时会在批处理线程没有获得CPU时间的罕见情况下发生,但它会在不到0.01%的请求中发生。研究人员观察到,平均延迟略有增加,在交通高峰期可能更多。因此,他们实施了SLA和适当的监控措施来确保延迟的稳定性。鉴于超时百分比并没有大幅提高,这些方法还是很有效的,也是这个TF服务机制的核心。

这篇文章的作者之一达沃林·科皮

使最优化

起初,研究人员在TF中实现的模型比定制的FMs慢得多。为了找到加速空的空间,研究人员使用内置的TF分析器来寻找执行时间最长的操作,并尽可能地对其进行改进。最常见的是各种冗余的整形或变换操作。一个比较有意思的发现是Adam optimizer比Adagrad慢很多,虽然两者的运算次数差别不大。分析器显示,更新稀疏权重梯度需要大量的计算时间。这是因为模型的权重是稀疏的,优化器没有考虑这一事实。

由于用Adagrad替换Adam意味着深度模型性能的显著下降,研究人员也在寻找其他解决方案:优化器改用Lazy Adam被证明是非常有效的,因为它可以非常有效地处理稀疏权重问题。结果显示,ADAGRAD整体训练速度快于40%,接近Adagrad。

因为使用了自适应优化器,所以还需要存储权重矩和方差,每个参数会存储三个值,使保存的模型大小增加三倍。然而,这些值实际上并不用于预测,而仅用于训练。基于此,研究人员构建了优化流程,去除了这些值的模型,数据量减少了66%,降低了内存使用量和成本。

 
友情链接
鄂ICP备19019357号-22