现实世界的机器学习生产系统如何运行?

数据挖掘 机器学习 Python 深度学习 数据科学模型
2021-10-12 15:31:25

亲爱的机器学习/人工智能社区,

我只是一个萌芽和有抱负的机器学习者,他致力于开放在线数据集和一些为我的项目在本地构建的 POC。我已经建立了一些模型并转换为泡菜对象,以避免重新训练。

而这个问题总是让我困惑。一个真实的生产系统如何为 ML 算法工作?

比如说,我已经用数百万个数据训练了我的 ML 算法,我想将它移动到生产系统或将它托管在服务器上。在现实世界中,它们会转换成泡菜对象吗?如果是这样,那将是一个巨大的腌制文件,不是。我在本地训练并转换为 50000 行数据的那些数据本身在磁盘上为该腌制对象占用了 300 Mb 空间。我不认为这是正确的方法。

那么它是如何工作的,以避免我的 ML 算法重新训练并开始预测传入的数据呢?以及我们如何真正使 ML 算法成为一个持续的在线学习者。例如,我构建了一个图像分类器,并开始预测传入的图像。但我想通过将传入的在线图像添加到我之前训练的数据集中来再次训练算法。可能不是针对所有数据,而是每天一次,一旦我想将当天收到的所有数据合并并重新训练新的 100 张图像,这些图像是我之前训练的分类器用实际值预测的。而且这种方法不应该影响我之前训练的算法停止预测传入数据,因为这种重新训练可能需要基于计算资源和数据的时间。

我已经谷歌搜索并阅读了许多文章,但无法找到或理解我的上述问题。这每天都让我感到困惑。生产系统是否也需要人工干预?或者有什么自动化的方法吗?

上述问题的任何线索或答案都将非常有帮助和赞赏。如果我的问题没有意义或无法理解,请告诉我。

这不是我正在寻找的以项目为中心的。只是现实世界生产机器学习系统示例的一般案例。

先感谢您!

2个回答

在生产中拥有一个模型需要考虑很多事情。您要问的主要是:

  • 功能性
  • 建筑学

功能性

为了让您的模型从 Web 服务器用于生产,您可以托管一个 API 来公开您的模型。

例如,您有一个 Flask Python 服务器正在运行,您在其中将端点(例如GET http://<your_host>/prediction/image.jpg)映射到predict()模型的函数。

然后你提到让它成为一个持续的在线学习者如果数据被注释(即标记),大多数分类器将通过更多数据得到改进,但为此,您需要手动注释它们并将它们重新输入到您的系统并重新训练您的模型。如果您可以自信地自动标记新数据,则无需改进系统。所以,我想说,需要一些体力劳动(贴标签),但其余的可以自动化。您可以将更多端点添加到您的 Web 服务器,您可以在其中上传更多训练数据,系统会重新训练您的模型、处理版本控制并重新加载最新的训练模型。

建筑学

贮存

你提到pickle文件,你担心它们在磁盘上太大了。但是,如今,使用云解决方案,这通常不是问题。

您可以使用 Blob-Storage 解决方案,而且价格通常非常低(例如https://azure.microsoft.com/en-us/services/storage/blobs/将花费0.002欧元/GB/月)。

当然,您可以在其中保留许多泡菜以进行版本控制(推荐)。但是,如果您想最小化成本,您只能存储最新型号。

此外,如果您的 API 经常使用,您不希望每次都重新加载您的模型。最好让它始终在 RAM 中可用。同样,在云中托管具有大量 RAM 的服务器并不昂贵。

布局

您可以拥有的架构布局是:

+----------------+          +--------------+
|                |          |              |
|  ADMIN SERVER  | -------> | BLOB STORAGE |
|                |          |              |
+----------------+          +--------------+
        |                           ^
        |                           |
        |               +-----------+-----------+
        |               |                       |
        |      +------------------+  +----------------+
        |      |                  |  |                |
        |      |  PREDICT SERVER  |  | PREDICT SERVER |
        |      |                  |  |                |
        |      +------------------+  +----------------+
        |                    ^          ^
        |                    |          |
        |                +------------------+
        |                | |              | |
        +--------------> | |     QUEUE    | |
                         | |              | |
                         +------------------+

在这里,ADMIN SERVER负责重新训练模型和将新模型上传到存储和发布作业到队列的所有功能,以便PREDICT SERVERS从中获取最新模型BLOB STORAGE

BLOB STORAGE持有模型

PREDICT SERVERs 暴露了你的功能predict(),所以你的模型可以被其他系统访问。在这里,模型存储在 RAM 中以便更快地进行预测。根据您的模型的使用情况,您可能希望拥有1用于预测的服务器。由于您的模型保存在本地硬盘上BLOB STORAGE而不是本地硬盘上,因此这是可能的,它们都可以获取最新模型。

QUEUE就是如何ADMIN SERVER与所有PREDICT SERVERs 通信。

是的,上传模型的一些持久表示是典型的,是的,它通常非常大,作为一个文件/文件。Usingpickle是一种方法,例如,通常与 一起使用。scikit-learn深度学习框架通常有自己的格式,但也没有什么能阻止你使用pickle它们,只是它作为一种方法更复杂且效率更低。

我不确定我是否理解问题的第二部分,但如果您想在线修改模型,没有什么能阻止您创建新的泡菜。建议您在后台将新的训练作为单独的批处理进程运行,以避免阻塞您的站点或 Web 服务,尤其是在您的 Web 应用程序服务器是单线程的情况下。此外,您需要警惕服务器资源的使用,因此最好在低流量期间运行批量更新。这可能在周末进行,或者如果您的用户群主要是区域性的、晚上或公共假期。