Rocket Money x Hugging Face:在生产环境中扩展不稳定的机器学习模型
“我们发现他们不仅仅是服务提供商,更是与我们目标和成果共进退的合作伙伴” - Nicolas Kuzak, Rocket Money 高级机器学习工程师。
在没有 MLOps 团队的情况下扩展和维护生产中的机器学习模型
我们创建了 Rocket Money (一款个人理财应用,前身为 Truebill),旨在帮助用户改善财务状况。用户将他们的银行账户链接到该应用,应用随后会对他们的交易进行分类和归类,识别出重复出现的模式,从而为他们的个人财务生活提供一个整合、全面的视图。交易处理的一个关键阶段是检测已知的商家和服务,Rocket Money 可以为会员取消其中一些服务并协商费用。这一检测过程始于将简短、常常被截断且格式 cryptic 的交易字符串转换为可用于丰富我们产品体验的类别。
新系统之路
我们最初使用基于正则表达式的规范化器从交易中提取品牌和产品。这些规范化器与一个日益复杂的决策表协同工作,该决策表将字符串映射到相应的品牌。在公司成立的前四年,当类别仅与我们支持取消和协商的产品相关时,这个系统证明是有效的。然而,随着用户基数的增长、订阅经济的蓬勃发展以及我们产品范围的扩大,我们需要跟上新类别增长的速度,同时还要调整正则表达式并防止冲突和重叠。为了解决这个问题,我们探索了各种传统的机器学习 (ML) 解决方案,包括一个采用“每类一模型”架构的词袋模型。但这个系统在维护和性能方面遇到了困难,最终被搁置了。
我们决定从零开始,组建了一个新团队并赋予了新的使命。我们的首要任务是积累训练数据并从头开始构建一个内部系统。我们使用 Retool 构建了标注队列、黄金标准验证数据集和漂移检测监控工具。我们探索了多种不同的模型拓扑结构,但最终选择了 BERT 系列模型来解决我们的文本分类问题。最初的模型测试和评估大部分是在我们的 GCP 数据仓库中离线进行的。在这里,我们设计并构建了用于衡量一个拥有 4000 多个类别的模型性能的遥测和系统。
与 Hugging Face 合作解决领域挑战和限制
在我们的领域内,我们面临着许多独特的挑战,包括商家、处理/支付公司、机构差异以及用户行为变化带来的熵。设计和构建高效的模型性能警报以及现实的基准数据集一直是一个持续的挑战。另一个重大障碍是确定我们系统的最佳类别数量——每个类别都代表着大量的创建和维护工作。因此,我们必须考虑它为用户和我们的业务提供的价值。
当一个模型在离线测试中表现良好,而我们只有一个小型的机器学习工程师团队时,我们面临一个新的挑战:将该模型无缝集成到我们的生产流水线中。现有的正则表达式系统每月处理超过 1 亿笔交易,负载非常不稳定,因此,拥有一个能够根据负载动态扩展并保持流水线整体低延迟的高可用性系统至关重要,同时该系统还需要针对我们所服务的模型进行计算优化。作为当时的一家小型初创公司,我们选择购买而非自建模型服务解决方案。当时,我们没有内部的模型运维专业知识,需要将机器学习工程师的精力集中在提升产品中模型的性能上。考虑到这一点,我们开始寻找解决方案。
起初,我们试用了一个我们一直在用于原型设计的自研内部模型托管解决方案,并将其与 AWS Sagemaker 和 Hugging Face 新推出的模型托管推理 API 进行了比较。鉴于我们使用 GCP 进行数据存储,并使用 Google Vertex Pipelines 进行模型训练,将模型导出到 AWS Sagemaker 既笨拙又容易出错。幸运的是,Hugging Face 的设置既快速又简单,并且在一周内就能处理一小部分流量。Hugging Face 从一开始就运行良好,这种低摩擦让我们决定沿着这条路走下去。
经过三个月的广泛评估期,我们选择 Hugging Face 来托管我们的模型。在此期间,我们逐渐增加了对其托管模型的交易量,并根据我们的最坏情况交易量进行了多次模拟负载测试。这个过程使我们能够微调系统并监控性能,最终让我们对推理 API 处理我们交易丰富化负载的能力充满信心。
除了技术能力,我们还与 Hugging Face 的团队建立了牢固的合作关系。我们发现他们不仅仅是服务提供商,更是与我们目标和成果共进退的合作伙伴。在我们合作的早期,我们建立了一个共享的 Slack 频道,这被证明是非常宝贵的。他们对问题的迅速响应和主动解决问题的态度给我们留下了特别深刻的印象。他们的工程师和客户成功经理 (CSM) 始终如一地展示了他们对我们成功的承诺和把事情做好的奉献精神。这在我们做出最终选择时给了我们额外的信心。
集成、评估和最终选择
“总的来说,与 Hugging Face 在模型部署方面携手合作的经历丰富了我们团队的经验,并让我们有信心去追求更大规模的扩展。”- Nicolas Kuzak, Rocket Money 高级机器学习工程师。
合同签订后,我们开始了迁移工作,从基于正则表达式的系统转向将越来越多的关键路径流量导向 Transformer 模型。在内部,我们必须为模型和生产数据监控构建一些新的遥测系统。鉴于该系统位于产品体验的早期阶段,模型结果的任何不准确都可能严重影响业务指标。我们进行了一项广泛的实验,将新用户平均分配到旧系统和新模型。我们评估了模型性能以及更广泛的业务指标,如付费用户留存率和参与度。机器学习模型在留存率方面明显表现更优,这让我们充满信心地做出了扩展该系统的决定——首先是针对新用户,然后是现有用户——在两个月的时间里逐步扩展到 100%。
随着模型完全部署在交易处理流水线中,正常运行时间和延迟成为了主要关注点。我们的许多下游流程都依赖于分类结果,任何问题都可能导致数据延迟或信息丰富不完整,这两者都会降低用户体验。
Rocket Money 与 Hugging Face 合作的第一年并非没有挑战。然而,两支团队都表现出了卓越的韧性和共同解决问题的决心。其中一个例子是,当我们在第二个生产模型中扩展类别数量时,不幸导致了服务中断。尽管有此挫折,团队们坚持不懈,并且我们成功地避免了同样问题的再次发生。另一个小插曲发生在我们切换到新模型时,由于 Hugging Face 端的缓存问题,我们仍然收到了旧模型的结果。这个问题很快得到了解决,并且没有再发生。总的来说,与 Hugging Face 在模型部署方面携手合作的经历丰富了我们团队的经验,并让我们有信心去追求更大规模的扩展。
说到规模,当我们开始看到模型的流量显著增加时,很明显,推理成本将超出我们的预算。我们在推理调用之前使用了一个缓存层,它显著降低了交易的基数,并试图从先前的推理中获益。我们的问题在技术上可以达到 93% 的缓存率,但在生产环境中我们只达到了 85%。随着模型服务 100% 的预测,我们在 Rocket Money 方面取得了一些里程碑——我们的模型已经能够扩展到每月处理超过十亿笔交易的运行率,并在我们攀升至应用商店金融应用第一名和总榜第七名时管理流量激增,同时保持低延迟。
合作与未来计划
“Hugging Face 推理 API 的高正常运行时间和我们对其的信心,使我们能够将精力集中在模型产生的价值上,而不是管道和日常运营上” - Nicolas Kuzak, Rocket Money 高级机器学习工程师。
发布后,Rocket Money 的内部团队现在正专注于模型的类别和性能调优,以及更自动化的监控和训练标签系统。我们每天都在添加新的标签,并面临着模型生命周期管理的有趣挑战,包括一些独特的事情,比如公司品牌重塑,以及在 2021 年末 Rocket Companies 收购 Truebill 后出现的新公司和产品。
我们不断审视我们是否为我们的问题选择了正确的模型拓扑。虽然大型语言模型 (LLM) 最近备受关注,但目前我们仍然难以找到一种在速度和成本上都能超越我们专门的 Transformer 分类器的实现方案。我们看到在长尾服务(例如夫妻店)中使用它们有希望的早期结果——请在未来版本的 Rocket Money 中留意!Hugging Face 推理 API 的高正常运行时间和我们对其的信心,使我们能够将精力集中在模型产生的价值上,而不是管道和日常运营上。在 Hugging Face 的帮助下,我们在模型的规模、复杂性以及其产生的价值类型方面都承担了更多。他们的客户服务和支持超出了我们的预期,他们是我们征途上真正的优秀合作伙伴。
如果您想了解 Hugging Face 如何管理您的机器学习推理工作负载,请在此处联系 Hugging Face 团队。