数据|用TensorFlow实现ML模型并调优:每秒可做3亿次预测( 二 )


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

数据|用TensorFlow实现ML模型并调优:每秒可做3亿次预测
文章图片

服务
研究者发现 , 由于计算密集型神经网络的存在 , 在使用 Golang TF 装饰器的情况下 , DeepFM 模型的 CPU 使用率要高得多 。 尽管带来了指标的显著提升 , 但将这种方法扩展到 100% 的流量会带来大量的硬件成本 。 由于当前全球面临芯片短缺的问题 , 这意味代价是困难和昂贵的 。
显然 , 降低计算成本是很有必要的 。 然而缩小神经网络模型规模的同时 , 也会降低模型的预测性能 。 在深入研究了 TF 之后 , 研究者发现如果在计算批处理时增加示例的数量 , 计算效率会大大提升 。 这种低线性增长是由于 TF 代码被高度向量化了 , TF 也会产生每次计算调用的开销 , 然后将其分批摊销 。 考虑到这一点 , 如果希望减少计算调用的数量 , 就需要将许多请求连接到一个计算中 。
研究者构建了全部包含在一个运行的 bidder 实例的自动批处理系统 , 以避免网络调用 。 由于每个实例每秒钟接收数千个传入请求 , 因此可以保证连接来自众多请求的计算 , 创建更大的批次 。 研究者通过一些批处理线程实现了这一点 , 这些线程接收来自传入请求的数据 , 创建批处理并在批处理完成后初始化计算 。 计算过程中 , 每隔几毫秒即初始化一次以避免超时 , 因为批处理可能在这个时间窗口中没有填充 。 这种实现是高度优化的 , 将计算调用的数量减少到五分之一 , 同时将 TF 计算的 CPU 占用量减半 。
虽然在批处理器线程没有获得 CPU 时间的极少数情况下 , 会发生请求超时 , 但只有不足 0.01% 的请求会出现这种情况 。 研究者观察到平均延迟略有增加(平均约 5 毫秒) , 流量高峰时可能会更多一些 。 因此他们实施了 SLA(服务等级协议)和适当的监控手段 , 以确保延迟的稳定性 。 鉴于没有大幅增加超时的百分比 , 这些方法仍是非常有效的 , 也是这一 TF 服务机制的核心 。
本文作者之一 Davorin Kopi?

数据|用TensorFlow实现ML模型并调优:每秒可做3亿次预测

推荐阅读