前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >两种截然不同的部署ML模型方式

两种截然不同的部署ML模型方式

作者头像
February
发布2018-12-13 14:15:06
1.7K0
发布2018-12-13 14:15:06
举报
文章被收录于专栏:技术翻译

如果ML模型在Jupyter中进行预测,是否有人可以知道?

可能不能。部署模型是使它们有用的关键。

这不仅仅是在构建产品,在这种情况下,部署是必要的 - 如果您要为管理生成报告,它也适用。十年前,高管不会质疑假设并将自己的数字插入Excel表格以查看发生了哪些变化,这是不可想象的。今天,一张难以理解的matplotlib数据的PDF可能会给初级副总裁留下深刻印象,但在经验丰富的高级副总裁眼中,这可能会给ML带来怀疑。

因此,ML模型的部署成为热门话题,仅仅因为没有那么多人知道如何去做; 看到你需要数据科学和工程技能。正如我最近发现的那样,有两种真正不同的方式来部署模型:传统的方式,以及最近的选择,这个选择简直让我大吃一惊。

在本文中,我将为您提供适用于这两种部署的简单但最佳实践模板。和往常一样,对于kinaesthetic学习者,可以直接跳到这里的代码,如果你想测试它,我实际上在这里部署了代码。我知道并不是每个人都喜欢跳读; 它看起来像这样:

如何部署ML模型

如果你来自分析师的背景,你可能不会理解网络应用程序架构,所以让我先说明一下。如果这是过于简单化和人为祸患,抱歉!但我已经看到了足够的“ML模型部署”,它实际上只是包装在Flask中的XGBoost,我知道这是一个真正的问题。

用户(在左边)使用的浏览器只运行Javascript,HTML和CSS。那是前端。它可以调用后端服务器来获取结果,然后可以处理和显示结果。后端服务器应尽快响应前端的请求; 但后端可能需要与数据库,第三方API和微服务进行通信。后端也可以根据用户的请求产生慢速作业 - 例如ML作业 - 它应该放入队列中。(请记住,通常用户通常必须以某种方式验证自己)。

通常,前端可能使用JS和/或React构建,后端使用Python(和Django或Flask)或NodeJS(和Express)构建。

现在,我们来谈谈分布式Web应用程序架构。

通常,我们希望尽可能多地运行后端实例,以实现可伸缩性。这就是上图中“服务器”出现气泡的原因; 他们代表“更多这些”。因此,每个实例都必须保持无状态:完成处理HTTP请求并退出。请勿在请求之间保留内存中的任何内容,因为客户端的第一个请求可能会转到一个服务器,而后续请求可能转到另一个服务器

如果我们有一个长时间运行的端点,那就太糟糕了:它会占用我们的一个服务器(比如......做一些ML任务),让它无法处理其他用户的请求。我们需要保持Web服务器的响应能力,并通过某种共享持久性将其交给长时间运行的任务,这样当用户检查进度或请求结果时,任何服务器都可以报告。此外,工作和工作部分应该能够由尽可能多的工人并行完成。

答案是先进先出(FIFO)队列。后端只是将工作排入队列。工作人员从队列中挑选和处理作业,执行培训或推理,并在完成后将模型或预测存储到数据库中。

使用库MLQ,以下几乎就是后端Web服务器所需要的 - 一个用于排队作业的端点,一个用于检查作业进度的端点,以及一个用于在作业完成时提供作业结果的端点。


真正部署ML模型的架构是这样的:

  1. 后端服务器从用户的Web浏览器接收请求。它包含在JSON中,但在语义上会是这样的:“明天是星期三,我们今天卖出了10个单位。我们明天应该有多少客户支持电话?“
  2. 后端将作业{Wednesday,10}推入队列(某些地方与后端本身分离,例如在MLQ的情况下为Redis)。队列回复“谢谢,让我们将其称为作业ID 562”。
  3. 后端回复用户:“我会做那个计算。它的ID为562,请稍等“。然后后端可以免费为其他用户提供服务。
  4. 用户的Web浏览器开始显示“请稍候”微调器。
  5. worker - 至少是那些目前没有处理另一份工作的worker- 不断轮询工作队列。可能,worker存在于另一台服务器/计算机上,但它们也可以是同一台计算机上的不同线程/进程。worker可能有GPU,而后端服务器可能不需要。
  6. 最终,worker将接收作业,将其从队列中删除,然后对其进行处理(例如,通过某些XGBoost模型运行{Wednesday,10})。它会将预测保存到数据库中。想象一下这一步需要5分钟。
  7. 同时,用户的网络浏览器每30秒轮询后端以询问作业562是否已完成。后端检查数据库是否具有存储在id = 562的结果并相应地进行回复。我们的多个水平后端中的任何一个都能够满足用户的要求。你可能会想象共享数据库是一个单点故障,你是对的!但另外,我们配置了副本和一些故障转移机制,可能是分片/负载均衡,所以这一切都很好。
  8. 五分钟加一点后,用户轮询结果,我们就能够提供服务。

还有一点涉及,主要是为了处理弹性和持久性(如果工作人员在工作中途脱机怎么办?如果用户的输入是垃圾并导致工作失败怎么办?)但这是基础知识。这是MLQ的一个非常简单的工人模板。它只是等待它收到一个作业,然后在作业参数上运行一个函数并存储结果。您可以在同一服务器或分布式服务器上并行运行所有这些内容。如果您查看回购,您将找到使用Nietzche / Tensorflow RNN模型执行此操作的完整代码。

代码语言:javascript
复制
import asyncio
from mlq.queue import MLQ
​
mlq = MLQ('example', 'localhost', 6379, 0)
​
def some_listener_func(params, *args):
    return params
​
def main():
    print("Worker starting")
    async def start_worker():
        mlq.create_listener(some_listener_func)
    loop = asyncio.get_event_loop()
    loop.run_until_complete(start_worker())
​
if __name__ == '__main__':
    main()

有几个很好的排队框架,或者有适当队列的东西,包括Celery,Dask,ZeroMQ,原生Redis,以及我最近制作的一个易于使用的库,用于部署没有复杂性的副项目:MLQ。Kafka也是一件重要的事,但是经常读者会知道我不喜欢过度架构的基于Java的项目。MLQ尚不成熟; 我不想在这里过多的去提。使用Celery代替严肃的项目。

本周,我花了一些时间与NVIDIA讨论他们的排队作业的规范解决方案(具体来说,在我的情况下,这样我就可以为使用Jupyter笔记本的所有人提供GPU服务器场,而不是所有人都试图提交作业同时)。但是没有一个,但我确信他们正在努力。在此之前,使用排队系统手动滚动解决方案是唯一的方法。

(此次会议也可能引起人们的兴趣:大家都认为MXNet是一个非常好的框架,也许是最好的框架 - 但遗憾的是可能会出局)。

即时的?

你可能想知道,ML排队如何与实时应用程序一起工作?答案是:同样的方式,但由于延迟(例如,工业物联网),它并不理想。可以分发队列入口点,因此真正的技巧在于数据库如何处理它。此外,一般意见是人们不会接受将私人数据发送到后端,另一个原因是“边缘ML”是一个热门话题。如果推理所需的所有数据都在一个地方可用,那么让我们在那里进行推理。所以,没有进一步的说明:

如何部署ML模型,第二种方法

因此,进入可怜的诽谤前端工程师,每个人都认为线性代数意味着一个接一个地进行计算,但是谁是你队伍中最需要帮助的人。事实证明,谁可能不是一个傻瓜,但也许只是等待他们的时间,直到Javascript的AI工具赶上了Python。最近,他们做到了。

简而言之,您现在可以使用Javascript中的Tensorflow。最初我驳回了谷歌宣布的这种想法,这可能意味着推断出必须适应某种模式的蹒跚而残缺的模型(一个最多12个过滤器的单个卷积层,FP-8等)。而且只有推论!绝对不是训练。怎么可能从Javascript部署。

我错的离谱!

我不想在本文中专注于使用Javascript训练模型 - 这非常酷,但并不总是超实用 - 而是为训练有素的模型提供替代部署模式。请记住,您的训练模型将可供全世界使用。任何人都可以复制它,看看层是什么样的,并窃取所有参数。我想我会说这是不可避免的,你的模型可能没有你想象的那么特别:任何竞争优势都在于您可以部署模型修订的数据和速度。当然,您在模型上构建的产品有多棒。无论如何,要小心。

首先,建立一个模型

TensorflowJS可以在用户的Web浏览器中执行任何Keras模型。并且,通过Web GL,它们是硬件加速的!我没有硬数字,但有趣的是,它对我来说效果很好。绝对没有Python那么快,但我相信随着时间的推移,JS会迎头赶上。

在本文中,我复制了官方Tensorflow Keras文本生成LSTM示例中的代码并运行它来构建模型。我完整的Jupyter笔记本就在这里

然后,将模型导出到TFJS。你可能需要pip install tensorflowjs。然后:

代码语言:javascript
复制
import tensorflowjs为tfjs 
tfjs.converters.save_keras_model(model,'。')

在目录中,您现在会发现model.jsongroup1-shard1of1

接下来,构建一个使用该模型的网站

所有的Tensorflow JS示例现在都使用Yarn,我理解它有点过时(当我做更多的可视化工作时,yarn变成了与npm的旧版本相比新的热度了;现在它又反过来了)。让我们暂时搁置前端的反复无常。

无论如何,希望你有纱线和工作节点安装(至少版本9)。对于服务于前端模型的网站的最小示例,您可以克隆我的仓库

实际的Javascript代码并不那么有趣。从缓冲区创建张量有一些样板,但是你需要做的就是实际使用模型:

代码语言:javascript
复制
model = await tf.loadModel(' https://mydomain.com/model.json'); 
output = model.predict(输入);

完整的,端到端的前端(和后端)部署示例在我的repo中

硬件加速Keras型号,您甚至不需要后端。

局限性

除了您的网络架构可供所有人看到之外,我能想到的最大缺点是,在许多实际应用中,并非所有数据都可在前端获得。在我工作的地方,当用户输入查询时,我们从Elasticsearch获取大量数据,并在该数据上运行模型(实际上是几个)。向前端发送如此多的数据是不可行的。

即使它是,你可能想要按预测收费,这在你输入Javascript后是不可能的。

结论

这很简单:

  • 使用队列
  • 不要绑你的后端网络服务器; 将任何ML流程与提供资产和端点的行为分开
  • 确保一切都是无状态的,并且能够并行运行
  • 考虑前端部署

我希望你喜欢并从这篇文章中获得一些东西!

原文标题《There are two very different ways to deploy ML models, here’s both》

作者:Tom Grek

译者:February

不代表云加社区观点,更多详情请查看原文链接

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何部署ML模型
  • 即时的?
  • 如何部署ML模型,第二种方法
  • 首先,建立一个模型
  • 接下来,构建一个使用该模型的网站
  • 局限性
  • 结论
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档