Press "Enter" to skip to content

从实验到部署:MLflow 101 | 第02部分

使用Streamlit和MLflow打造垃圾邮件过滤器,提升您的MLOps之旅

图片来源:Unsplash

你好👋,热烈欢迎来到本博客的第二部分!如果你从一开始就跟着我们,你会知道在第一部分中,我们创建了一个用户界面来简化超参数调整。现在,让我们从上次离开的地方继续⛔ 不过,如果你刚刚来到这里,不用担心!你可以通过点击这里查看本博客的第01部分来追赶进度👇

从实验🧪到部署🚀:MLflow 101

使用Streamlit和MLflow打造垃圾邮件过滤器,提升您的MLOps之旅

pub.towardsai.net

第2节:实验🧪和观察🔍 [继续…]

使用MLflow进行实验追踪📊

现在我们的应用程序准备就绪,让我们继续进行实验。对于第一次实验,我将使用原始形式的单词,不进行词干化或词形还原,只关注停用词和标点符号的去除,并将词袋(BOW)应用于文本数据以进行文本表示。然后,在连续的运行中,我将微调一些超参数。我们将把这个实验命名为RawToken。

作者:超参数调整

运行了几次后,我们可以从Streamlit用户界面启动MLflow,它将显示如下👇

作者:实验和运行

好了,现在我们在实验下面列出了RawToken实验,并在运行列下有一堆与该实验相关联的运行。您可以选择一个、一对或所有运行,并点击比较按钮以并排查看它们的结果。进入比较部分后,您可以选择要比较或可视化的指标或参数。

作者:比较运行

您可能会发现比您预期的更多内容,一旦您知道您在寻找什么以及为什么,您就会找到最佳方法!

作者:指标和参数

好了,我们完成了一个实验,但结果并不如预期,这没关系!现在,我们需要得到至少一些F1分数的结果,以避免任何潜在的尴尬。我们知道会发生这种情况,因为我们使用了原始标记,并且将树的数量和深度保持得相当低。所以,让我们进行一些新的实验,一个使用词干化,另一个使用词形还原。在这些实验中,我们将尝试不同的与不同文本表示技术相结合的超参数。

我不会在这里使用专业模式,因为我们的目的不同,并且友情提醒我还没有实现Git集成。使用Git跟踪实验可能是理想的,但这将需要对代码进行一些更改,我已经将其注释掉了。MLflow也可以跟踪Git,但添加它将导致大量额外的截图,而且我知道你是Git的专家,所以我将把它交给你!

现在,让我们手动注释和取消注释一些代码,以添加这两个新实验并记录其中的一些运行。在经历了我刚才说的一切之后,这里是实验和它们的结果。让我们看看效果如何! 🚀🔥

作者:所有实验
作者:比较所有运行

好了,现在我们完成了实验,我们的运行可能看起来有点凌乱和混乱,就像现实生活中的使用案例一样。你能想象手动完成所有这些吗?那将是一场噩梦,我们可能会用完便利贴或需要无尽的止痛药!但幸亏有了MLflow,它为我们提供了完整的解决方案,处理了我们的疯狂实验中的所有混乱,给我们留下了一个干净而有组织的解决方案。让我们赞赏MLflow的魔力! 🧙‍♀️✨

通过查询实验→运行ID选择模型🎯

好了,假设我们完成了一些实验,现在我们需要从特定的实验运行中加载模型。目标是检索run_id并加载与该运行ID相关联的artifacts(模型和向量化器)。实现这一目标的一种方法是搜索实验,获取它们的ID,然后在这些实验中搜索运行。您可以根据准确性等指标筛选结果,并选择所需的运行ID。之后,您可以使用MLflow函数加载artifacts。

作者:查询运行

另一个更简单的选择是直接使用MLflow UI,在那里您可以按降序比较结果,从最顶部的结果中获取运行ID,并重复该过程。

作者:跟踪

另一种直接而标准的方法是在生产环境中部署模型,我们将在博客的最后一节中介绍。

我在第一种方法背后的意图是让您熟悉实验查询,因为有时您可能需要自定义仪表板或图表,而不是使用MLflow的内置功能。通过使用MLflow UI,您可以轻松创建适合您特定需求的自定义可视化效果。这一切都是为了探索不同的选择,使您的MLflow之旅更加高效和有效!

现在我们已经获得了run_id,我们可以加载模型并通过各种API进行预测。MLflow使用一种称为flavors的特定格式用于不同的库。您还可以创建自己的自定义flavor,但那是一个单独的主题需要探索。无论如何,当您在MLflow中点击任何模型时,它都会显示如何加载它的说明。

让我们加载其中一个模型进行快速预测,看看它在实际操作中的效果如何!

作者:加载和预测

哇!!这太顺利了!从15次不同的运行中加载模型非常轻松。我们只需提供运行ID,无需记住复杂的路径或其他任何东西。但是,等等,这就是全部了吗?我们如何提供模型服务或部署它们?让我们在下一节中深入探讨,并探索模型部署和服务的世界。

第三节:将模型部署到生产环境 🚀

欢迎来到最后一节!让我们立即开始,不浪费任何时间。一旦我们决定要使用的模型,剩下的就是选择它并使用唯一的模型名称进行注册。在早期的MLflow版本中,注册模型需要一个数据库,但现在不再需要了。现在,它更简单了,我将少写一点关于这个的内容。

注册最佳模型 🎖️

关键是保持模型名称简单且唯一。这个名称对于未来的任务(如重新训练或更新模型)非常重要。每当我们有一个新模型,它经过了具有良好指标的成功实验,我们都会使用相同的名称进行注册。MLflow自动记录新版本的模型并不断更新。

在本节中,让我们根据测试准确度图表注册三个模型:一个在底部,一个在中间,最后一个在顶部。我们将命名模型为spamfilter

Image By Author: Registering a Model

一旦我们在相同的模型名称下注册了不同运行的模型,它将添加版本,如下所示👇

Image By Author: Model Versions

那么,一旦我们注册了模型,道路就此终结了吗?答案是否定的!注册模型只是机器学习生命周期中的一步,从这里开始ML运维(MLOps),更具体地说是CI/CD流程,开始发挥作用。

Image By Author: Model Staging

在MLflow中注册模型后,接下来的步骤通常涉及:⚠️理论前方⚠️

  1. 暂存和验证 🟨:在部署阶段之前进行,注册的模型经过测试和验证。此步骤确保模型按预期运行并满足所需的质量标准,然后再部署到生产环境。
  2. 部署 🟩:验证成功后,将模型部署到生产环境或服务基础设施。模型对最终用户或应用程序可访问,并开始提供实时预测。
  3. 监控和维护 ⛑️:一旦模型投入生产,定期监控其性能非常重要。监控有助于检测模型性能的漂移、数据分布的变化或在实际使用中可能出现的任何问题。可能需要定期维护和更新模型,以确保它持续提供准确的结果。
  4. 重新训练 ⚙️:随着新数据的不断出现,定期对模型进行重新训练变得至关重要,以使其保持最新状态并提高性能。最近的一个例子是GPT-4随着时间的推移性能下降。在这种情况下,MLflow的跟踪功能非常有价值,它可以帮助您跟踪各种模型版本,简化模型更新和重新训练,确保模型在数据发展过程中始终高效准确。
  5. 模型版本控制 🔢:如前所述,当我们注册一个新模型时,MLflow会自动为其创建版本。对于重新训练或新训练的模型,它也会进行版本控制并经历暂存阶段。如果模型通过了所有必要的检查,它将被暂存用于生产。然而,如果模型的性能开始下降,MLflow的模型版本控制和跟踪历史记录将帮助解决问题。它们可以轻松回滚到以前的模型版本,以在需要时恢复到更可靠和准确的模型。这个能力确保我们能够保持模型的性能并在必要时进行调整,以为用户或应用程序提供最佳结果。
  6. 反馈循环和改进:利用用户反馈和性能监控数据可以持续改进模型。从实际使用中获得的见解可以进行迭代的改进和优化,确保模型随着时间的推移提供更好的结果。

好了!不再闲聊和理论术语了!!我们已经结束了,无聊的东西不会被邀请来参加这个派对。现在是时候释放代码了⚡ 让我们动手并享受一些真正的乐趣吧!🚀💻。在这里我是独自工作的,我没有受到质量或测试团队的限制 😉。虽然我不完全理解黄色阶段(验证阶段)的重要性,但我会冒险直接进入绿色阶段。虽然这种方法在现实情况下可能很冒险,在我的实验世界中,我愿意冒险。

所以只需点击几下,我就会将我的第三版模型设置为生产状态,让我们探索如何查询生产模型。

作者:查询已注册模型

同样地,我们可以执行查询,并通过过滤条件 current_stage == 'Production'来检索模型。就像我们在上一节中所做的那样,我们可以使用 model.run_id 进行下一步。这一切都是关于利用我们所学到的知识!💡

作者:查找生产模型

另外,您也可以使用以下代码片段加载生产模型。

作者:查找生产模型

为用户预测构建 Streamlit 用户界面

既然我们的生产模型已部署,下一步是通过 API 提供服务。MLflow 提供了一个默认的 REST API,用于使用已记录的模型进行预测,但其定制选项有限。为了更好地控制和灵活性,我们可以使用 FastAPI 或 Flask 等 web 框架构建自定义端点。

为了演示目的,我将再次使用 Streamlit 来展示有关生产模型的一些信息。此外,如果新的实验模型表现更好,我们还将探索如何将其替换掉之前的模型。以下是名为 user_app.py 的用户应用程序的代码

作者:Stramlit 代码

应用程序的用户界面将如下所示 😎

作者:Stramlit 用户界面

哇,我们已经成功部署了第一个应用!但是,请稍等,旅程并未结束。现在应用程序正在为用户提供服务,他们将使用不同的数据与其进行交互,从而产生各种各样的预测。这些预测通过各种方式记录,例如反馈、评级等。然而,随着时间的推移,模型可能会失去其效果,这时就需要重新训练。

重新训练涉及回到初始阶段,可能使用新的数据或算法来提高模型的性能。

作者:重新训练和跟踪

在重新训练后,我们将新模型与生产模型进行测试,如果它们显示出显著的改进,它们将被排队在暂存区进行验证和质量检查。

Image By Autor: Model Staging

一旦它们获得绿灯,它们将被移至生产阶段,取代当前使用的模型。之前的生产模型将被归档⬛。

注意:我们有灵活性在生产环境中同时部署多个模型。这意味着我们可以提供具有不同质量和功能的不同模型,以满足特定订阅或要求。这完全是为了完美地定制用户体验!

现在,将这次最新的运行移至生产阶段并刷新我们的应用程序🔄️

Image By Autor: Making Predictions

它反映了最新的变化,这正是模型在真实世界中提供的方式。这就是CI/CD(持续集成和持续部署)的基础。这就是MLOps。我们从头到尾都做得很棒!🎉

这就是本篇详尽博客的全部内容!但请记住,这只是MLOps广阔世界中的一小步。前方的旅程涉及将我们的应用程序托管在云端,与他人合作,并通过API提供模型。虽然我在本博客中仅使用Streamlit,但你可以自由探索其他选项,如FastAPI或Flask来构建端点。你甚至可以将Streamlit与FastAPI结合使用,以与你偏好的流水线进行解耦和耦合。如果你需要复习,我在以前的博客中详细介绍了如何做到这一点!

Streamlit🔥+ FastAPI⚡️- 你下一个数据科学配方所需的成分

Streamlit是一个开源、免费、全Python的框架,可以快速构建和共享交互式仪表板和Web应用程序…

VoAGI.com

嘿,嘿,嘿!我们到达了终点线,朋友们!这是整个项目的GitHub Repo👇

GitHub – afaqueumer/mlflow101

通过在GitHub上创建一个帐户来为afaqueumer/mlflow101做贡献。

github.com

我希望这篇博客给你带来了一些笑容和知识。如果你阅读愉快并且觉得有帮助,请别忘了关注我,Afaque Umer,以获取更多精彩文章。

敬请期待机器学习和数据科学领域更多令人兴奋的冒险。我会确保将那些听起来高大上的术语解释为易懂的概念。

好了,好了,好了!是时候说再见了👋

感谢阅读🙏继续努力🤘继续学习🧠继续分享🤝最重要的是继续实验!🧪🔥✨😆

Leave a Reply

Your email address will not be published. Required fields are marked *