除了大众点评,中国未来还会产生多少家这样的人工智能公司? - 学习Yelp公司的软件工程-评价和推荐系统

本文主要是介绍除了大众点评,中国未来还会产生多少家这样的人工智能公司? - 学习Yelp公司的软件工程-评价和推荐系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文作者:Jason Sleight,ML(Machine Learning)平台集团技术负责人
翻译:数字化营销工兵


了解数据是Yelp成功的重要组成部分。为了将我们的消费者与当地优秀的企业联系起来,我们每天为各种任务提供数百万条建议,如:

- 立即为你找到水管工来修理漏水的水槽的报价
- 帮助您发现哪些餐厅现在开放送餐
- 确定最受欢迎的菜肴供您在这些餐厅尝试
- 推断可能提供的服务,使企业主能够在Yelp上自信准确地代表他们的业务


大约在2004年Yelp的早期,工程师们煞费苦心地设计了启发式规则来支持这样的建议,但随着产品的成熟和消费者群的增长,他们转向了机器学习(ML)技术。如今,有数百个ML模型以各种形式为Yelp提供支持,ML的采用也在不断加快。

随着我们对ML的采用不断增加,我们的ML基础设施也随之增长。今天,我们宣布推出我们的ML平台,这是一个强大的、全功能的系统集合,用于训练和服务基于开源软件的ML模型。在这篇最初的博客文章中,我们将专注于动机和高级设计。我们有一系列的博客文章,可以更深入地讨论每个组件的技术细节,所以请定期查看!

Yelp的ML之旅


Yelp的第一个ML模型集中在几个团队中,每个团队都创建了自定义的培训和服务基础设施。这些系统是为应对各自领域的挑战而量身定制的,思想的异花授粉并不常见。拥有ML模型在建模和基础设施维护方面都是一项巨大的投资。

经过几年的时间,每个系统都由其团队的工程师逐步扩展,以解决日益复杂的范围和更严格的服务级别目标(SLO)。维护这些系统的操作负担造成了沉重的损失,并将ML工程师的注意力从建模迭代或产品应用程序上转移开。

几年前,Yelp创建了一个Core ML团队,在集中支持的工具和最佳实践下整合我们的ML基础设施。好处是:

1. ML工作流的集中管理系统将使ML开发人员能够专注于项目的产品和ML方面,而不会陷入基础设施的困境。
2. 通过为我们的核心ML团队配备基础设施工程师,我们可以提供ML工程师可能缺乏专业知识来创建或维护的新的前沿功能。
通过整合系统,我们可以提高系统效率,提供一个更强大的平台,具有更紧密的SLO和更低的成本。
3. 为ML这样广泛的主题整合系统是令人生畏的,因此我们首先将ML系统分解为三个主要主题,并在每个主题中开发解决方案:交互式计算、数据ETL和模型训练/服务。该方法运行良好,允许团队将部分工作流程迁移到Core ML工具上,同时根据需要将其领域的其他专门方面留在遗留系统上。

在这篇博客文章中,我将讨论如何将我们的模型训练和服务系统构建成一个单一的、统一的模型平台。

Yelp的ML平台目标​​​​​​​


从高层来看,我们的ML平台有几个主要目标:

- Opinionated API,具有针对常见情况的预构建实现。
- 默认情况下的正确性和稳健性。
- 利用开源软件。


Opinionated API

Yelp的许多ML挑战都属于一组有限的常见案例,因此我们希望我们的ML平台能够实施Yelp的集体最佳实践。元数据日志记录、模型版本控制、再现性等考虑因素很容易被忽视,但对于长期的模型维护来说却是非常宝贵的。我们不希望开发人员费力地研究所有这些细节,而是希望我们的ML平台在默认情况下抽象并应用最佳实践。

除了规范我们的ML工作流,固执己见的API还使我们能够简化模型部署系统。通过将开发人员集中到更窄的方法中,我们可以支持自动化的模型服务系统,该系统允许开发人员通过在web UI上点击几次来生产他们的模型。

默认情况下的正确性和稳健性

Yelp历史ML工作流程中最常见的痛点之一是系统验证。理想情况下,应该使用用于训练模型的相同精确代码来对模型进行预测。不幸的是,这往往说起来容易做起来难——尤其是在Yelp这样一个多样化、大规模、分布式的生产环境中。我们通常用Python来训练我们的模型,但可能会通过Java、Scala、Python、内部数据库等来部署模型。

即使是最微小的不一致也会对生产模型产生巨大的差异。例如,我们遇到一个问题,XGBoost升压器无意中使用了64位浮点进行预测(XGBoost仅使用32位浮点)。当对一个重要的分类变量进行数字编码时,轻微的浮点差异导致该模型对35%的实例给出近似随机的预测!

容忍稀疏向量表示、缺失值、null和NaN也需要特别考虑。尤其是当不同的库和语言对客户端预处理这些问题有不同的期望时。例如,一些库将零视为缺失,而另一些库则有特殊名称。对于开发人员来说,仔细考虑这些实现细节是极其复杂的,更不用说识别是否发生了错误了。

在设计ML平台时,我们采用了测试驱动的开发思想。我们所有的代码都有一套完整的端到端集成测试,我们通过测试运行实际的Yelp生产模型和数据集,以确保模型在我们的整个生态系统中给出完全相同的结果。除了确保正确性,这还确保了我们的ML平台足够强大,可以处理混乱的生产数据。

利用开源解决方案

ML目前正在经历开源技术的复兴。Scikit-learn、XGBboost、Tensorflow和Spark等库已经存在多年,并继续提供基本的ML功能。但像Kubeflow、MLeap、MLflow、TensorFlow Extended等新添加的内容重新定义了ML系统应该包含的内容,并为ML系统提供了急需的软件工程最佳实践。

对于Yelp的ML平台,我们认识到,我们可能构建的任何内部解决方案都会很快被这些开源项目不断增长的能力所超越。相反,我们选择了最符合我们需求的开源库,并围绕它们构建了薄包装器,以便更容易地与我们的遗留代码集成。在开源工具缺乏所需功能的情况下,我们会向上游提供解决方案。

ML平台技术概述

在未来的博客文章中,我们将更详细地讨论这些系统,所以请尽快回来查看。现在,我只简单概述一下这些系统中的关键技术选择和模型的生命周期。

MLflow和MLeap

在评估了各种选项后,我们决定将MLflow和MLeap作为我们平台的骨架。

MLflow的目标是简化ML生命周期的管理,并包含各种子组件,每个子组件都针对ML工作流的不同方面。对于我们的ML平台,我们特别关注MLflow跟踪功能。我们自动将参数和指标记录到跟踪服务器上,然后开发人员使用MLflow的web UI来检查模型的性能,比较不同的模型版本等。

MLeap是一种序列化格式和执行引擎,为我们的ML平台提供了两个优势。首先,MLeap开箱即用,支持Yelp最常用的ML库:Spark、XGBoost、Scikit-learn和Tensorflow,此外还可以扩展到自定义转换器,以支持边缘案例。其次,MLeap是完全可移植的,可以在任何基于JVM的系统中运行,包括Spark、Flink、ElasticSearch或微服务。总之,MLeap为我们的模型提供了一个单一的解决方案,满足健壮性/正确性保证和按钮部署等需求。

我司ML平台中的典型代码流

(离线代码流 - 用于机器学习平台里训练一个模型的离线代码流)

开发人员首先构建一个训练数据集,然后定义一个用于编码和建模数据的管道。由于Yelp模型通常使用大型数据集,Spark是我们首选的计算引擎。开发人员指定了一个Spark ML Pipeline来进行数据的预处理、编码、建模和后处理。然后,开发人员使用我们提供的API来适应和序列化他们的管道。在后台,这些函数自动与适当的MLflow和MLeap API交互,以记录和绑定管道及其元数据。

(在我们的ML平台中为模型服务的在线代码流)
为了服务于模型,我们围绕MLeap构建了一个瘦包装器,负责从MLflow中获取捆绑包,将捆绑包加载到MLeap中,并将请求映射到MLeap的API中。我们为这个包装器创建了几个部署选项,允许开发人员将他们的模型作为REST微服务、Flink流处理应用程序执行,或者直接托管在Elasticsearch内部进行排名应用程序。在每个部署选项中,开发人员只需为他们想要托管的模型配置MLflow id,然后就可以开始发送请求了!

下一步是什么?

我们一直在逐步推出我们的ML平台,并观察到我们的ML从业者的热情采用。ML平台功能齐全,但我们在路线图上有一些改进。

首先是扩展一组预制模型和变压器。MLflow和MLeap都是通用的,允许完全定制,但这样做有时是一个复杂的过程。我们不需要开发人员学习MLflow和MLeap的内部,而是计划扩展我们的预构建实现,以涵盖更多Yelp的专业用例。

我们还想将我们的模型服务系统与Yelp的A/B实验工具集成。现在可以在单个服务器上托管多个模型版本,但目前依赖于客户端来指定他们希望在每个请求中使用的版本。然而,我们可以进一步抽象这一细节,并使服务基础设施直接连接到实验共同启动逻辑。

在此基础上,我们希望通过Yelp的实时流媒体基础设施将实际观察到的事件反馈到系统中。通过将观察到的事件与预测的事件相结合,我们可以实时监控ML性能(针对不同的实验队列)。这实现了一些令人兴奋的特性,如模型退化的自动警报、通过强化学习技术进行的实时模型选择等。

这篇关于除了大众点评,中国未来还会产生多少家这样的人工智能公司? - 学习Yelp公司的软件工程-评价和推荐系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/828504

相关文章

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

java -jar example.jar 产生的日志输出到指定文件的方法

《java-jarexample.jar产生的日志输出到指定文件的方法》这篇文章给大家介绍java-jarexample.jar产生的日志输出到指定文件的方法,本文给大家介绍的非常详细,对大家的... 目录怎么让 Java -jar example.jar 产生的日志输出到指定文件一、方法1:使用重定向1、

Python利用GeoPandas打造一个交互式中国地图选择器

《Python利用GeoPandas打造一个交互式中国地图选择器》在数据分析和可视化领域,地图是展示地理信息的强大工具,被将使用Python、wxPython和GeoPandas构建的交互式中国地图行... 目录技术栈概览代码结构分析1. __init__ 方法:初始化与状态管理2. init_ui 方法:

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github