正如标题所述,我致力于构建 MLOps 系统已经有近四年了。世界变化得很快,作为一名也有了四年经验的程序员,我感觉自己一直在努力不被深度学习(LLM)的新技术淹没,努力适应软件工程,努力远程获得好公司的好职位,等等。
这篇文章一半是对我多年经历的审慎回顾,另一半是我对工程、机器学习(运维)的看法。我想你的脑海中也曾浮现过这些问题,但我不会回答任何问题,只是分享我的观点。
第一个 ML 问题,提前一日的用电量预测
2021 年,我开始研究能源消耗模型,这是我第一次真正深入研究运维应用程序。这个问题一开始很简单:我们必须预测八个城市每 24 小时的每日用电量,但要提前 24 小时,这个项目名为日前电力预测。自从我开始研究这个问题以来,用户数量不断增加,普通消费者开始使用更多能源,新工厂也正在建设中。能源需求也会随着经济波动而变化。这一切都意味着更多模型漂移和数据漂移。
一段时间后,我定下了预测模型所用的一系列算法。在尝试了深度学习模型和基于树的模型后,我发现最成功的是 LightGBM 和 XGBoost(以及集成深度学习模型)。
基于树的模型的问题在于,它们的预测通常受你提供的数据的限制。例如,如果你尝试预测今年夏季的第一天,而去年同日的峰值消耗为 600 单位,由于基于树的模型的性质,除非你正确地定制问题,否则你的预测值是不会超过 600 单位的。但是,当事件和特征稳定且输出分布没有太大变化时,基于树的模型也可以提供出色的预测结果。
说实话,我当时的大部分经验都来自 Kaggle。我在那里待了大约九个月,深入研究预测竞赛、创建新特征并尝试不同的模型。我提出的模型得分为 7/10,我知道如果我与真正的专家竞争,他们可能彻底击败我的模型。
意识到需要 MLOps 系统
预测未来的能源消耗是一种奇怪的体验,尤其是现实中有太多因素在影响电力使用——天气、周末与工作日、假期,甚至祈祷时间。在像土耳其这样四季分明的地方生活又增加了一层复杂性。我不是一个追求完美的模型制作者,我努力让自己的模型适应突然的变化。例如,如果连续两个月的气温都稳定在 25°C,然后温度突然在一天内下降 5°C,模型通常会假设电力消耗将与之前的 25°C 天气差不多,但事实并非如此。人们的习惯会随着季节而改变,预测这些微妙的变化会很困难。然后,还会有像国家足球比赛这样不可预测的事件——祝你建模好运!
那么,我做了什么工作来解决模型和数据漂移问题呢?在过去的一年里,我创建了数百个特征,使用 XGBoost 和 LightGBM 构建了一些基于树的模型,并用前五日的数据来验证它们。 MLFlow 是日常模型生产过程中的主要工具。虽然它可能不是验证模型的完美方式,但它确实改善了长期预测结果。至少,当电力消费比较稳定且模型适应性良好时,它给了我一个安全的选择。
为了简化流程,我建立了一个完整的系统,每天早上通过 API 提取数据、生成特征、挑选模型并进行预测。我构建的自动化脚本只用一分钟就能跑完。然而即使有了自动化脚本,你也必须密切关注预测结果,特别是在国定假日或意外事件期间。
虽然你部署了一个模型,但你可能不喜欢它
我的一段奇怪的经历就是和我的经理争论预测结果中突然出现的漂移。他认为,如果夏天天气突然下降,预测第二天的电力消费会更容易,因为运行的空调数量会减少。他甚至手动调整了几次预测,但结果适得其反。这基本上结束了我们的争论。虽然我相信有些日子通过手动调整可以带来更好的预测结果,但模型经常会发现一些我们没有发现的模式。
ML 人员在软件工程领域的沉浮
后来,我转而从事医疗保健领域的 MLOps 平台工作。我花了很多时间寻找可以从事 MLOps 的工作,结果很幸运地找到了一家医疗保健初创公司,我成为了那里的第一位全职工程师。我有医疗保健模型方面的经验,所以感觉这个行业很合适。我找到了他们,他们也找到了我,这纯属运气。
在那里工作的三年是一段充满挑战的旅程,主要因为我从专注于模型转向了编写平台。我一直是那种喜欢做研究的人,我会实现各种论文了结果,并尽可能多地从 Kaggle、众多教授和学者那里汲取知识。举例来说,我对深度学习模型和表格模型之间的差异很着迷,尤其好奇为什么深度学习应用在处理表格数据时经常遇到困难,而基于树的模型却表现出色。我读过论文,在 X/reddit 上讨论这个话题,我就是那种人。但当我转而编写平台时,我才意识到自己还需要学习很多关于编写生产级代码的知识。一开始我搞砸了很多事情。
在一开始的几个月里,我们在 Jupyter 笔记本中进行模型评估,我阅读了一些有关如何深入评估医疗保健模型的论文,也考虑到了性别和种族偏见。工作一开始很有趣,但后来我们必须将所有内容集成到一个平台中。那时我慢慢开始了解面向对象编程、系统设计和传统软件工程的原理。我不是计算机科学工程师,所以我是一点一滴学会了这些东西。
创业生活非常紧张,工作时间长,学习曲线陡峭。我们构建的系统使用了 MongoDB、Python、RabbitMQ、S3 和 AWS——一个相当标准的管道。我们的平台旨在验证医疗保健模型,获得 FDA 的批准,并确保一切都正确完成。数据来自合作伙伴,但模型供应商从未看过原始数据,因为他们不应该有这个权限。因此,我们的业务目标是根据获得的黑箱数据来验证模型,并为 FDA 准备必要的文件。
MLOps 平台与业务逻辑,我们是只部署模型还是为客户提供服务?
为了让我们的平台实现目标,它需要支持所有类型的医学图像、验证任何计算机视觉模型并检测出可能存在的模型偏见。三年来,这个平台关注的重点也在改变。第一年,我们的目标是部署和验证模型。第二年,我们增加了注释功能,支持了医疗保健数据,并实现了云集成。到第三年,我们意识到我们需要关注客户的一些特定需求。
挑战之一是将平台的逻辑与特定于客户的代码库分开来。我们花时间编写了特定于客户的代码,这些代码会让平台上 80% 的功能受益,但有时我们必须为特定客户实现非常具体的逻辑。这引发了很多关于我们是否应该用特定于客户的功能来增强平台,还是将它们分离开的争论。如果用太多特定于客户的功能来增强平台,它可能会变得臃肿和混乱。另一方面,当客户端代码库需要访问平台数据时,将它们分离开可能会导致复杂的情况。
我还是没法确定如何区分 MLOps、MLE、后端工程和业务逻辑。可能这没有唯一的答案,但我认为我们在维护和开发平台方面做得很好。
在云端部署 vs 在本地部署
最近我参加了银行业的 MLOps 职位面试,我 90% 的时间都在写代码。面试我的经理是一位从 DevOps 过渡到 MLOps 的人,我相信他已经开发了一些 ML 模型。对他来说,模型只是具有特定输出的 docker,你还需要做管理/跟踪/记录的工作。对于一些人来说,这才是真正的 MLOps 工程。我绝对同意这一点。
他的团队正在 Apache Airflow 上部署模型,他问我在这方面有什么经验。我想到的是:
正如问题所暗示的那样,我在电力问题上训练/部署的模型是日常模型,所以我不需要跟踪模型,做预测就行了。我不需要检查模型是否一直处于活动状态,也不需要检查吞吐量或延迟。
我在医疗保健 MLOps 问题中使用的模型是基于项目的模型,不需要不断构建模型,而且它是本地的,所以安全不是主要问题。
他的团队一直完全不写代码,至少在目前是这样。在面试过程中我意识到了这一点,这很奇怪。
身份危机:MLOps 工程师、ML 工程师,还是两者兼而有之?抑或其他?
多年来,另一个问题一直浮现在我的脑海中:我是谁?我是 MLOps 工程师、ML 工程师、ML 研究员还是后端工程师?在一个小团队或初创公司中,你需要具备所有这些能力。你听说过“10x 工程师”吗?那些奇怪的职位要求你同时发布 NeurIPS 论文和 Node.js 代码?伙计,这到底是为什么?我见过很多这种奇怪的组合。不是吹牛,但下面这些都是我所做的工作:
预印我在斯坦福实习期间的一篇论文 = ML 研究员
编写表格和 CV 模型 = 数据科学家
实现一个 Auto-ML 模块,允许即时训练/微调对象检测、分割和分类模型,并进行版本控制 = Python 软件工程师、ML 工程师
使用 Grad-CAM 为 CNN 模型开发一个可解释性库 = ML 研究员
使用 FastAPI 支持模型,与前端应用程序集成 = 后端工程师
使用 Docker、RabbitMQ、MongoDB 和其他工具设计和实现一个平台。= MLOps 工程师
当然这些术语是可以互换的,当然优秀的 MLE 必须是一名优秀的软件工程师,当然你需要考虑如何在训练模型时部署模型,但我到底是什么角色?我觉得我被“学得更多,收获更多”这句话欺骗了。
10x 工程师神话:什么都会,某些事情还要精通(也许做不到)
那么我从中得到了什么?我是不是一名没什么专长的 10x 工程师?好处是,我可以申请数据科学、MLOps、MLE 和 Python 后端职位,这里的重点是 ML。而且我参加了所有这些职位的面试。但问题是什么?在面试过程中,他们并不总是相信我的经验广度。他们会问很多问题,即使我有很好的答案,一些面试官也会试图让我出局。如果你没有给出他们想要的具体答案,你就出局了。
我在一家全球数据科学公司的面试中就遇到过这种情况。对于我提到的所有话题,他都会质问我,还会不断切换话题背景,让我觉得自己像个白痴。当他发现我在 3 小时的面试后给出了一个不太好的答案时,他说:“我就知道。”我都无语了,你知道什么?当然,我不是精通所有领域的专家,但这也很让人不爽。
还有一次,我被一个非常聪明的人面试了——他曾经在知名公司工作,在排名前十的大学获得博士学位。他非常聪明,我希望十年后能成为他那样的人。他很善良,我非常尊重他。我告诉他我的经历和我做过的事情,并问我还能做些什么。但你猜怎么着?他希望我在 LLM 方面有更多经验,他说:“我没有投资潜力股的预算;我需要员工在那个特定主题方面有足够经验。”没错,但这样的话我该怎么办?我应该追随每一个深度学习趋势并以赚钱为目的研究它们吗?这有多大可能?你能对一个只有四年经验的人能有什么期望?
我将来想成为什么样的人?
我不知道。我真的不知道。我知道的是:
FOMO(错失恐惧)在 ML 领域中是真实存在的。
如果你尝试学习 MLE,那么 MLOps、软件工程或者一些 DevOps 方面的知识和经验可能不会让你更有信心。
原文链接:https://mburaksayici.com/blog/2024/08/29/what-ive-learned-building-mlops-systems-for-four-years.html
评论