当前位置: 首页 > 科技观察

使用TensorFlow实施和调整ML模型:每秒3亿次预测

时间:2023-03-17 21:25:32 科技观察

TensorFlow是使用最广泛的机器学习框架之一,可加速研究并缩短新模型的生产时间。在一篇论文中,来自程序原生DSP公司Zemanta的数据科学总监DavorinKopi?和工程师JanHartman展示了将在线广告生态系统中的大规模机器学习模型转化为TensorFlow的过程。所实现的机器学习模型规模每秒超过3亿次预测。因此,本研究的主要内容是在TF中实现模型,并使用各种优化技术以低延迟高效地为其提供服务。论文地址:https://arxiv.org/abs/2109.09541本研究使用的案例是在线广告的点击预测。在RTB(实时出价)中,多个DSP(出价方)通过在网页加载时实时出价来竞争在线广告空间。广告空间按每次广告印象出售,这使得以市场价值出售虚拟广告空间成为可能。使用机器学习,RTB还使广告商能够最大化他们的KPI,例如点击率(CTR)。预估广告的点击率是RTB的核心问题之一,拥有一个好的点击预测模型非常重要。在Golang中实现的基于自定义逻辑回归和因式分解机(FM)的模型的表达能力有限,需要手动执行所有学习过程,这会减慢实验速度并限制模型的预测性能。因此,研究人员决定采用TensorFlow框架,并用更具表现力的模型替换现有模型。未来的挑战基于广告竞价的具体用例,该研究遇到了许多挑战,这些挑战分为实施、服务和优化。一方面,为每台机器配备一个或多个顶级GPU的成本高得令人望而却步;另一方面,只有少量GPU的机器将迫使研究转向基于服务的架构。鉴于这两种选择都不是特别理想,并且与其他深度学习领域(例如计算机视觉或自然语言处理)中的最先进模型相比,该研究的模型相对较小,因此该研究未在生产中使用GPU进行推理.由于该研究的模型使用稀疏权重,因此其用例也不太适合GPU工作负载。实施为了为TF模型实施高效的训练循环,本研究实施并测试了几种方法。TF中高通量在线训练和服务的案例研究很少,文档往往不够具体,迫使研究人员通读源代码和基准测试原型来寻找实现陷阱。TF提供了一个庞大的生态系统和大量的SOTA算法实现库。选择现有的具有丰富特性的实现很容易,但研究人员发现这些实现中的大部分都没有优化,因此他们决定自己实现算法。TF具有不同抽象级别的API,但是,一些API虽然易于使用,但通常是效率低下的低级操作(例如EstimatorAPI)。研究人员最终选择了Keras3,因为它是对底层TF操作的薄包装,具有高水平的性能,并且易于理解。由于TF是一个功能非常丰富且资源丰富的库,因此研究还必须考虑在其中实施多少机器学习管道。研究人员选择暂时搁置特征变换和交互,只实现学习算法——虽然它们是最小的可替换部分,但它们具有最大的改进潜力。由于GolangTFwrapper仅支持预测,因此训练循环必须用Python实现。脚本通过将标准输入作为子进程与Golang数据管道进行交互。数据以高效的二进制格式发送,无需解析,比CSV格式快25%。然后在后台线程中读取数据,以防止模型在等待数据时空闲。基于此,该研究在整个训练管道中实现了高吞吐量。事实证明,高效的输入和输出也是低延迟预测的关键,该研究通过将所有输入特征连接到一个张量中,显着减少了序列化和复制输入数据所花费的时间。服务研究人员发现,由于存在计算密集型神经网络,使用GolangTF装饰器时,DeepFM模型的CPU使用率要高得多。虽然会显着改善指标,但将此方法扩展到100%的流量会带来巨大的硬件成本。在当前全球芯片紧缺的情况下,这意味着价格将难上加贵。显然,有必要降低计算成本。然而,减小神经网络模型的大小也会降低模型的预测性能。经过对TF的深入研究,研究人员发现,如果在计算batch时增加样本数量,计算效率会大大提高。这种低线性增长是由于TF代码是高度矢量化的,并且TF还会在每次计算调用时产生开销,然后分批摊销。考虑到这一点,如果您希望减少计算调用的数量,则需要将许多请求连接到一个计算中。研究人员构建了一个自动批处理系统,该系统全部包含在一个正在运行的投标程序实例中,以避免网络调用。由于每个实例每秒接收数千个传入请求,因此可以保证将来自许多请求的计算结合起来,从而创建更大的批次。研究人员通过多个批处理线程实现了这一点,这些线程从传入请求接收数据、创建批处理并在批处理完成后初始化计算。在计算期间,每隔几毫秒进行一次初始化以避免超时,因为在此时间窗口内可能未填充批处理。此实现经过高度优化,将计算调用次数减少到五分之一,同时将TF计算的CPU使用率减半。虽然在批处理处理器线程未获得CPU时间的极少数情况下会发生请求超时,但这种情况发生的请求数不到0.01%。研究人员观察到平均延迟略有增加(平均约5毫秒),在流量高峰期间可能更多。因此,他们实施了SLA(服务水平协议)和适当的监控以确保延迟稳定性。鉴于超时百分比没有大幅增加,这些方法仍然非常有效,并且是该TF服务机制的核心。作者之一、优化研究员DavorinKopi?在TF中实现的模型最初比自定义FM慢得多,为了寻找加速空间,研究人员大量使用内置的TF分析器来查找执行时间最长的操作并可能做出改进。最常见的是各种冗余重塑或转换操作。一个更有趣的发现是Adam优化器比Adagrad慢得多(大约50%),尽管操作数量上的差异很小。分析器显示稀疏权重的梯度更新需要大量计算时间。这是因为模型的权重是稀疏的(特征大多是分类的,因此非常稀疏)并且优化器没有考虑这个事实。由于用Adagrad替换Adam意味着深度模型的性能会显着下降,因此研究人员还寻找其他解决方案:改用LazyAdam的优化器被证明非常有效,因为它可以非常有效地处理稀疏权重问题。结果表明,它整体上将训练速度提高了40%以上,这与Adagrad接近。由于使用自适应优化器(如Adam),这还需要存储权重矩和方差,每个参数将存储三个值,使保存的模型大小增加三倍。然而,这些值实际上并没有用于预测,仅用于训练。研究人员使用它构建了一个优化过程,删除了这些值的模型,将数据量减少了66%,并减少了内存使用和成本。