后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情

哈布尔会议并不是一个首次出现的故事。 以前,我们举办了 300-400 人的大型 Toaster 活动,但现在我们决定举办小型主题会议,您可以在评论中设定方向。 这种格式的第一次会议于 XNUMX 月举行,专门讨论后端开发。 与会者听取了有关从后端到机器学习的过渡特点以及国家服务门户上的Quadrupel服务设计的报告,并参加了专门讨论Serverless的圆桌会议。 对于那些无法亲自参加活动的人,我们在这篇文章中告诉您最有趣的事情。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情

从后端开发到机器学习

数据工程师在机器学习中做什么? 后端开发人员和机器学习工程师的任务有何相似和不同? 您需要采取什么途径才能将第一个职业转变为第二个职业? 这是亚历山大·帕里诺夫 (Alexander Parinov) 所说的,他在从事了 10 年后端工作后进入了机器学习领域。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情
亚历山大·帕里诺夫

如今,Alexander 在 X5 Retail Group 担任计算机视觉系统架构师,为与计算机视觉和深度学习相关的开源项目做出贡献 (github.com/creafz)。 他的技能通过参与最流行的机器学习竞赛平台 Kaggle Master (kaggle.com/creafz) 世界排名前 100 名得到证实。

为什么转向机器学习

一年半前,谷歌基于深度学习的人工智能研究项目 Google Brain 的负责人 Jeff Dean 描述了如何将谷歌翻译中的 500 万行代码替换为仅包含 XNUMX 行的 Tensor Flow 神经网络。 训练网络后,数据质量提高,基础设施变得更简单。 看起来这就是我们光明的未来:我们不再需要编写代码,制造神经元并用数据填充它们就足够了。 但实际上一切都要复杂得多。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情Google 的 ML 基础设施

神经网络只是基础设施的一小部分(上图中的小黑方块)。 需要更多的辅助系统来接收数据、处理数据、存储数据、检查质量等,我们需要用于培训、在生产中部署机器学习代码并测试该代码的基础设施。 所有这些任务与后端开发人员所做的完全相似。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情机器学习过程

机器学习和后端有什么区别?

在经典编程中,我们编写代码,这决定了程序的行为。 在机器学习中,我们有一个小的模型代码和向模型输入的大量数据。 机器学习中的数据非常重要:在不同数据上训练的同一模型可以显示完全不同的结果。 问题在于数据几乎总是分散的并存储在不同的系统(关系数据库、NoSQL 数据库、日志、文件)中。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情数据版本控制

机器学习不仅需要像经典开发那样对代码进行版本控制,还需要对数据进行版本控制:有必要清楚地了解模型的训练内容。 为此,您可以使用流行的数据科学版本控制库 (dvc.org)。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情
数据标记

下一个任务是数据标记。 例如,标记图片中的所有物体或说出它属于哪一类。 这是通过 Yandex.Toloka 等特殊服务完成的,API 的存在大大简化了工作。 由于“人为因素”而出现困难:您可以通过将同一任务委托给多个执行者来提高数据质量并将错误减少到最低限度。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情张量板中的可视化

记录实验对于比较结果并根据某些指标选择最佳模型是必要的。 有大量的可视化工具 - 例如 Tensor Board。 但没有理想的方法来存储实验。 小公司通常使用 Excel 电子表格,而大公司则使用特殊平台将结果存储在数据库中。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情机器学习的平台有很多,但没有一个能满足70%的需求

将经过训练的模型投入生产时必须面对的第一个问题与数据科学家最喜欢的工具 - Jupyter Notebook 有关。 它没有模块化,也就是说,输出是这样的代码“脚布”,没有分成逻辑块——模块。 一切都混合在一起:类、函数、配置等。此代码很难进行版本控制和测试。

这该如何处理呢? 您可以像 Netflix 一样,创建自己的平台,允许您直接在生产中启动这些笔记本电脑,将数据作为输入传输给它们并获取结果。 您可以强制将模型投入生产的开发人员正常重写代码,将其分解为模块。 但这种方法很容易出错,并且模型不会按预期工作。 因此,理想的选择是禁止使用 Jupyter Notebook 进行模型代码。 当然,如果数据科学家同意这一点。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情模型作为黑匣子

将模型投入生产的最简单方法是将其用作黑匣子。 你有某种模型类,你得到了模型的权重(训练网络的神经元参数),如果你初始化这个类(调用预测方法,给它提供一张图片),你将得到某个预测作为输出。 里面发生什么并不重要。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情
与模型分离的服务器进程

您还可以引发某个单独的进程并通过 RPC 队列发送它(带有图片或其他源数据)。在输出中我们将收到预测。

在 Flask 中使用模型的示例:

@app.route("/predict", methods=["POST"])
def predict():
image = flask.request.files["image"].read()
image = preprocess_image(image)
predictions = model.predict(image)
return jsonify_prediction(predictions)

这种方法的问题是性能限制。 假设我们有数据科学家编写的 Phyton 代码,速度很慢,而我们希望发挥最大性能。 为此,您可以使用将代码转换为本机代码或将其转换为专为生产定制的另一个框架的工具。 每个框架都有这样的工具,但没有理想的工具;您必须自己添加它们。

ML 中的基础设施与常规后端相同。 有 Docker 和 Kubernetes,只有 Docker 需要安装 NVIDIA 的运行时,它允许容器内的进程访问主机中的显卡。 Kubernetes 需要一个插件才能管理带有显卡的服务器。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情

与经典编程不同,就机器学习而言,基础设施中有许多不同的移动元素需要检查和测试,例如数据处理代码、模型训练管道和生产(参见上图)。 测试连接不同管道部分的代码非常重要:有很多部分,而且问题经常出现在模块边界处。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情
AutoML 的工作原理

AutoML 服务承诺根据您的目的选择最佳模型并对其进行训练。 但你需要明白:数据在机器学习中非常重要,结果取决于它的准备。 标记是由人完成的,这充满了错误。 如果没有严格的控制,结果可能是垃圾,而且还不可能实现过程自动化;需要专家——数据科学家——的验证。 这就是 AutoML 的失败之处。 但它对于选择架构非常有用 - 当您已经准备好数据并想要运行一系列实验来找到最佳模型时。

如何进入机器学习

进入 ML 的最简单方法是使用 Python 进行开发,所有深度学习框架(以及常规框架)都使用 Python。 该语言对于该活动领域实际上是强制性的。 C++ 用于某些计算机视觉任务,例如自动驾驶汽车的控制系统。 JavaScript 和 Shell - 用于可视化和诸如在浏览器中运行神经元之类的奇怪事情。 Java 和 Scala 用于处理大数据和机器学习。 R和Julia深受研究数理统计的人喜爱。

获得实践经验最便捷的方式是在 Kaggle 上;参加该平台的一项比赛可以让你花一年多的时间学习理论。 在这个平台上,您可以获取其他人发布和评论的代码,并尝试改进它,根据您的目的优化它。 奖金 - 你的 Kaggle 排名会影响你的薪水。

另一种选择是作为后端开发人员加入 ML 团队。 有许多机器学习初创公司,您可以通过帮助同事解决问题来获得经验。 最后,您可以加入数据科学家社区之一 - 开放数据科学 (ods.ai) 等。

演讲者在链接中发布了有关该主题的更多信息 https://bit.ly/backend-to-ml

“Quadrupel” - 门户网站“国家服务”的定向通知服务

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情叶夫根尼·斯米尔诺夫

下一位发言者是电子政务基础设施开发部门负责人 Evgeny Smirnov,他谈到了 Quadruple。 这是 Gosuslugi 门户网站 (gosuslugi.ru) 的定向通知服务,Gosuslugi 门户网站是 Runet 上访问量最大的政府资源。 每日观众人数为2,6万,网站注册用户总数为90万,其中确认用户为60万。 门户API负载为30万RPS。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情国家服务后端使用的技术

“Quadrupel”是一项有针对性的通知服务,借助该服务,用户可以通过设置特殊的通知规则,在最适合他的时刻收到服务报价。 开发该服务时的主要​​要求是灵活的设置和充足的邮件时间。

四元是如何运作的?

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情

上图以需要更换驾驶执照的情况为例显示了 Quadrupel 的操作规则之一。 首先,该服务会查找过期日期在一个月后到期的用户。 他们会看到一个横幅,其中包含接受适当服务的优惠,并通过电子邮件发送一条消息。 对于那些截止日期已过的用户,横幅和电子邮件会发生变化。 成功交换权利后,用户会收到其他通知 - 以及更新身份中的数据的建议。

从技术角度来看,这些是编写代码的常规脚本。 输入是数据,输出是真/假、匹配/不匹配。 总共有超过 50 条规则——从确定用户的生日(当前日期等于用户的出生日期)到复杂的情况。 每天,这些规则都会识别大约一百万个匹配项——需要通知的人。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情四联通知渠道

在 Quadrupel 的背后有一个存储用户数据的数据库和三个应用程序: 

  • 工人 用于更新数据。
  • Rest API 拾取横幅并将其本身传送到门户和移动应用程序。
  • 调度 启动重新计算横幅或群发邮件的工作。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情

为了更新数据,后端是事件驱动的。 两个接口 - Rest 或 JMS。 有很多事件;在保存和处理之前,将它们聚合起来,以免提出不必要的请求。 数据库本身,即存储数据的表,看起来像一个键值存储 - 用户的键和值本身:指示相关文档存在或不存在的标志、它们的有效期、服务顺序的聚合统计信息该用户,等等。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情

保存数据后,在 JMS 中设置一个任务,以便立即重新计算横幅 - 这必须立即显示在 Web 上。 系统在晚上启动:任务按照用户间隔被扔进JMS,根据该规则需要重新计算。 这是由参与重新计算的处理器拾取的。 接下来,处理结果进入下一个队列,该队列要么将横幅保存在数据库中,要么将用户通知任务发送到服务。 该过程需要 5-7 小时,它很容易扩展,因为您始终可以添加处理程序或使用新处理程序引发实例。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情

该服务运作得很好。 但随着用户数量的增加,数据量也在不断增长。 这会导致数据库负载增加 - 即使考虑到 Rest API 查看副本的事实也是如此。 第二点是JMS,事实证明它不太适合,因为它的内存消耗很高。 队列溢出导致 JMS 崩溃和处理停止的风险很高。 此后如果不清除日志就不可能启动 JMS。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情

计划使用分片来解决问题,这将允许平衡数据库上的负载。 还计划更改数据存储方案,并将 JMS 更改为 Kafka - 一种容错性更强的解决方案,将解决内存问题。

后端即服务与后端即服务无服务器

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情
从左到右:亚历山大·博加特、安德烈·托米连科、尼古拉·马尔科夫、阿拉·以色列扬

后端即服务还是无服务器解决方案? 圆桌会议上讨论这一紧迫问题的与会者有:

  • Ara Israelyan,CTO CTO,Scorocode 创始人。
  • Nikolay Markov,Aligned Research Group 的高级数据工程师。
  • Andrey Tomilenko,RUVDS 开发部门负责人。 

对话由高级开发人员 Alexander Borgart 主持。 我们呈现了听众也参与的辩论的缩略版本。

——您理解的Serverless是什么?

安德鲁:这是一个计算模型 - 一个必须处理数据的 Lambda 函数,以便结果仅取决于数据。 该术语要么来自谷歌,要么来自亚马逊及其 AWS Lambda 服务。 提供商通过为其分配容量池来处理此类功能会更容易。 不同的用户可以在同一台服务器上独立核算。
尼古拉斯:简单来说,我们把一部分IT基础设施和业务逻辑转移到云端,外包。
金刚鹦鹉:对于开发人员来说,这是节省资源的一个很好的尝试,对于营销人员来说,是为了赚更多的钱。

— Serverless 与微服务相同吗?

尼古拉斯:不,Serverless更多的是一个架构组织。 微服务是某种逻辑的原子单元。 无服务器是一种方法,而不是“单独的实体”。
金刚鹦鹉:Serverless 函数可以打包成微服务,但这将不再是 Serverless,它将不再是 Lambda 函数。 在无服务器中,函数仅在被请求时才开始工作。
安德鲁: 他们的一生不同。 我们启动了 Lambda 函数,然后忘记了它。 它工作了几秒钟,下一个客户端可以在另一台物理机器上处理其请求。

— 哪个规模更好?

金刚鹦鹉:水平扩展时,Lambda 函数的行为与微服务完全相同。
尼古拉斯:无论你设置多少个副本,都有多少个副本;Serverless 在扩展方面没有问题。 我在 Kubernetes 中制作了一个副本集,在“某处”启动了 20 个实例,并返回了 20 个匿名链接。 向前!

— 是否可以在 Serverless 上编写后端?

安德鲁: 理论上是这样,但是没有意义。 Lambda 函数将依赖于单个存储库 - 我们需要确保保证。 例如,如果用户已经进行了某笔交易,那么下次联系时应该看到:交易已进行,资金已到账。 所有 Lambda 函数都将阻止此调用。 事实上,一堆无服务器功能将变成一个具有数据库瓶颈访问点的单一服务。

— 在什么情况下使用无服务器架构有意义?

安德鲁:不需要共享存储的任务——同样的挖矿、区块链。 您需要进行大量计数的地方。 如果你有很强的计算能力,那么你可以定义一个函数,比如“计算那里某物的哈希值......”但是你可以通过使用例如来自亚马逊的 Lambda 函数及其分布式存储来解决数据存储问题。 事实证明,您正在编写一个常规服务。 Lambda 函数将访问存储并向用户提供某种响应。
尼古拉斯:在 Serverless 中运行的容器资源极其有限。 内存很少,其他一切都没有。 但是,如果您的整个基础设施完全部署在某些云上 - 谷歌、亚马逊 - 并且您与他们签订了永久合同,并且有所有这一切的预算,那么对于某些任务,您可以使用无服务器容器。 有必要位于该基础设施内部,因为一切都是为在特定环境中使用而定制的。 也就是说,如果您准备好将所有内容都绑定到云基础设施,则可以进行试验。 优点是您不必管理此基础设施。
金刚鹦鹉:Serverless 不需要你管理 Kubernetes、Docker、安装 Kafka 等,这是自欺欺人。 亚马逊和谷歌也在安装这个。 另一件事是您有 SLA。 您还不如将所有事情外包出去,而不是自己编码。
安德鲁:Serverless 本身很便宜,但你必须为其他 Amazon 服务支付大量费用 - 例如数据库。 人们已经起诉他们,因为他们为 API 门收取了巨额费用。
金刚鹦鹉:如果我们谈论金钱,那么你需要考虑到这一点:你必须将公司的整个开发方法来180度转变,以便将所有代码转移到Serverless。 这将花费大量的时间和金钱。

— 除了亚马逊和谷歌的付费无服务器之外,还有其他有价值的替代品吗?

尼古拉斯:在 Kubernetes 中,您启动某种作业,它运行然后终止——从架构的角度来看,这完全是无服务器的。 如果您想使用队列和数据库创建真正有趣的业务逻辑,那么您需要多考虑一下。 这一切都可以在不离开 Kubernetes 的情况下解决。 我不会费心去拖延额外的实施。

— 监控无服务器中发生的情况有多重要?

金刚鹦鹉:取决于系统架构和业务需求。 本质上,提供商必须提供有助于开发运营团队了解可能出现的问题的报告。
尼古拉斯:Amazon 有 CloudWatch,所有日志都在其中进行流式传输,包括来自 Lambda 的日志。 集成日志转发并使用单独的工具进行查看、警报等。 您可以将代理填充到您启动的容器中。

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情

- 让我们总结一下。

安德鲁:考虑 Lambda 函数很有用。 如果您自己创建一项服务(不是微服务,而是写入请求、访问数据库并发送响应的服务),那么 Lambda 函数可以解决许多问题:多线程、可扩展性等。 如果你的逻辑是这样构建的,那么将来你将能够将这些 Lambda 转移到微服务或使用 Amazon 等第三方服务。 技术很有用,想法很有趣。 这对于商业来说是否合理仍然是一个悬而未决的问题。
Nikolay:Serverless 更适合用于操作任务,而不是用于计算某些业务逻辑。 我一直将其视为事件处理。 如果你在 Amazon 中,如果你在 Kubernetes 中,是的。 否则,您将需要花费大量精力来自行启动和运行 Serverless。 有必要查看具体的业务案例。 例如,我现在的任务之一是:当文件以某种格式出现在磁盘上时,我需要将它们上传到Kafka。 我可以使用 WatchDog 或 Lambda。 从逻辑上看,两种选择都是合适的,但从实现上来说,Serverless 更复杂,我更喜欢更简单的方式,不需要 Lambda。
金刚鹦鹉:无服务器是一个有趣、适用且技术上非常漂亮的想法。 技术迟早会达到任何功能在 100 毫秒内启动的程度。 那么,原则上就不存在等待时间对于用户是否至关重要的问题了。 同时,Serverless的适用性正如同事已经说过的,完全取决于业务问题。

我们感谢给我们很大帮助的赞助商:

后端、机器学习和无服务器 - XNUMX 月 Habr 会议上最有趣的事情

来源: habr.com