如果ML模型在Jupyter中进行预测,是否有人可以知道?
可能不能。部署模型是使它们有用的关键。
这不仅仅是在构建产品,在这种情况下,部署是必要的 - 如果您要为管理生成报告,它也适用。十年前,高管不会质疑假设并将自己的数字插入Excel表格以查看发生了哪些变化,这是不可想象的。今天,一张难以理解的matplotlib数据的PDF可能会给初级副总裁留下深刻印象,但在经验丰富的高级副总裁眼中,这可能会给ML带来怀疑。
因此,ML模型的部署成为热门话题,仅仅因为没有那么多人知道如何去做; 看到你需要数据科学和工程技能。正如我最近发现的那样,有两种真正不同的方式来部署模型:传统的方式,以及最近的选择,这个选择简直让我大吃一惊。
在本文中,我将为您提供适用于这两种部署的简单但最佳实践模板。和往常一样,对于kinaesthetic学习者,可以直接跳到这里的代码,如果你想测试它,我实际上在这里部署了代码。我知道并不是每个人都喜欢跳读; 它看起来像这样:
如果你来自分析师的背景,你可能不会理解网络应用程序架构,所以让我先说明一下。如果这是过于简单化和人为祸患,抱歉!但我已经看到了足够的“ML模型部署”,它实际上只是包装在Flask中的XGBoost,我知道这是一个真正的问题。
用户(在左边)使用的浏览器只运行Javascript,HTML和CSS。那是前端。它可以调用后端服务器来获取结果,然后可以处理和显示结果。后端服务器应尽快响应前端的请求; 但后端可能需要与数据库,第三方API和微服务进行通信。后端也可以根据用户的请求产生慢速作业 - 例如ML作业 - 它应该放入队列中。(请记住,通常用户通常必须以某种方式验证自己)。
通常,前端可能使用JS和/或React构建,后端使用Python(和Django或Flask)或NodeJS(和Express)构建。
现在,我们来谈谈分布式Web应用程序架构。
通常,我们希望尽可能多地运行后端实例,以实现可伸缩性。这就是上图中“服务器”出现气泡的原因; 他们代表“更多这些”。因此,每个实例都必须保持无状态:完成处理HTTP请求并退出。请勿在请求之间保留内存中的任何内容,因为客户端的第一个请求可能会转到一个服务器,而后续请求可能转到另一个服务器。
如果我们有一个长时间运行的端点,那就太糟糕了:它会占用我们的一个服务器(比如......做一些ML任务),让它无法处理其他用户的请求。我们需要保持Web服务器的响应能力,并通过某种共享持久性将其交给长时间运行的任务,这样当用户检查进度或请求结果时,任何服务器都可以报告。此外,工作和工作部分应该能够由尽可能多的工人并行完成。
答案是先进先出(FIFO)队列。后端只是将工作排入队列。工作人员从队列中挑选和处理作业,执行培训或推理,并在完成后将模型或预测存储到数据库中。
使用库MLQ,以下几乎就是后端Web服务器所需要的 - 一个用于排队作业的端点,一个用于检查作业进度的端点,以及一个用于在作业完成时提供作业结果的端点。
真正部署ML模型的架构是这样的:
还有一点涉及,主要是为了处理弹性和持久性(如果工作人员在工作中途脱机怎么办?如果用户的输入是垃圾并导致工作失败怎么办?)但这是基础知识。这是MLQ的一个非常简单的工人模板。它只是等待它收到一个作业,然后在作业参数上运行一个函数并存储结果。您可以在同一服务器或分布式服务器上并行运行所有这些内容。如果您查看回购,您将找到使用Nietzche / Tensorflow RNN模型执行此操作的完整代码。
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”是一个热门话题。如果推理所需的所有数据都在一个地方可用,那么让我们在那里进行推理。所以,没有进一步的说明:
因此,进入可怜的诽谤前端工程师,每个人都认为线性代数意味着一个接一个地进行计算,但是谁是你队伍中最需要帮助的人。事实证明,谁可能不是一个傻瓜,但也许只是等待他们的时间,直到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
。然后:
import tensorflowjs为tfjs
tfjs.converters.save_keras_model(model,'。')
在目录中,您现在会发现model.json
和group1-shard1of1
。
所有的Tensorflow JS示例现在都使用Yarn,我理解它有点过时(当我做更多的可视化工作时,yarn
变成了与npm
的旧版本相比新的热度了;现在它又反过来了)。让我们暂时搁置前端的反复无常。
无论如何,希望你有纱线和工作节点安装(至少版本9)。对于服务于前端模型的网站的最小示例,您可以克隆我的仓库。
实际的Javascript代码并不那么有趣。从缓冲区创建张量有一些样板,但是你需要做的就是实际使用模型:
model = await tf.loadModel(' https://mydomain.com/model.json');
output = model.predict(输入);
完整的,端到端的前端(和后端)部署示例在我的repo中。
硬件加速Keras型号,您甚至不需要后端。
除了您的网络架构可供所有人看到之外,我能想到的最大缺点是,在许多实际应用中,并非所有数据都可在前端获得。在我工作的地方,当用户输入查询时,我们从Elasticsearch获取大量数据,并在该数据上运行模型(实际上是几个)。向前端发送如此多的数据是不可行的。
即使它是,你可能想要按预测收费,这在你输入Javascript后是不可能的。
这很简单:
我希望你喜欢并从这篇文章中获得一些东西!
原文标题《There are two very different ways to deploy ML models, here’s both》
作者:Tom Grek
译者:February
不代表云加社区观点,更多详情请查看原文链接
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。