对于软件开发,有许多方法、模式和技术用于构建、部署和运行应用程序。DevOps是一种以软件开发和操作的整体观点来描述软件工程文化的艺术方法论。
对于数据科学,有很多关于如何构建机器和深度学习模型的信息。实际应用方面似乎仍在发展。我目前正在努力更好地理解如何在云中部署模型以及如何在应用程序中有效地使用它们。以下是我迄今为止的一些发现。
在最简单的情况下,数据科学家提供的模型和开发人员扩展的模型可以封装在Docker容器中,并通过REST api访问。Docker容器可以在Kubernetes或OpenWhisk等无服务器平台上运行。在构建基于flask的web应用程序时,模型甚至可以打包并在同一个容器中运行。
虽然这适用于原型和快速评估,但是在将模型部署到生产环境时,还需要考虑其他几个方面。
对于其他服务和api,需要处理多个版本。至少,应该有可能通过蓝绿色的部署(Blue-green deployment是一个安全部署应用的方法,它通过提供两个版本的应用同时运行。为了部署一个新版本的应用,你需要将当前版本切换到新版本,然后关闭老版本。Blue-green deployment不会使应用停止服务,在必要的情况下允许你快速回滚应用到blue版本。)来推出新的模型。此外,复杂的生产应用程序常常需要流量管理功能,比如canary部署和A/B测试。
为了运行推断,应用程序必须按照模型所期望的格式提供输入。在某些情况下,这意味着需要首先格式化数据。例如,在视觉识别场景中,应用程序可能必须将JPG图像转换为JSON结构。反之亦然,模型的输出可能没有应用程序所需的格式。
此外,有时执行批处理调用比为每个请求造成网络流量更有效。有时同时调用多个模型,并将响应一起发送回应用程序。
因此,不应该只部署核心模型,而应该部署推理管道并将其作为服务提供。
我在博客上讨论了如何通过TensorFlow Lite和TensorFlow.js将模型部署到edge设备上。在这两种情况下,模型都需要在模型大小、内存使用、电池使用等方面进行优化,以实现这一点,一种方法是将退出者从图中删除。在训练中使用退学来防止模型过拟合。在运行预测时,不需要它们。
另一种优化模型的方法是量化。图中的权重通常通过浮点数来定义。然而,当使用整数时,模型的大小会显著降低,而准确性只会受到最小的影响或根本不受影响。
与移动设备的优化类似,优化是在将模型部署到云之前完成的。
对于其他服务,需要处理身份验证和授权。为了使模型能够被多个应用程序和开发人员访问,我们需要API管理。
REST api并不是公开模型的唯一方法。也许其他协议,比如gRPC或基于消息的系统,对于特定场景来说是更好的选择。
运行推断的服务需要可扩展,并且需要监视功能。总之,运行推断的服务具有与所有其他服务相同的需求。
有几个框架可以在云中部署模型。在最好的情况下,框架应该满足上述所有需求,框架应该是Serverless的,这样人们就可以关注业务逻辑而不是基础架构。下面是一些您可能想要了解的框架和产品。
Watson Studio不仅支持模型的训练,还支持模型的部署。这些模型可以有不同的版本,可以通过REST api调用:
IBM Model Asset Exchange中的模型可以轻松部署到Kubernetes。例如,在Kubernetes之上的Istio支持流量管理,以进行canary的推出。
Seldon是一个用于在Kubernetes上部署机器学习模型的开源平台。它支持TensorFlow、Sklearn、REST和gRPC api等库。它可以用来学习深度学习。我尤其喜欢上面那种我称之为推理管道的能力。
TensorFlow service是一个灵活的、高性能的机器学习模型服务系统,内置对TensorFlow模型的支持。它似乎相当强大,但当我去年尝试时,它并不是那么容易。我相信从那以后它已经进步了很多。例如,自从最近以来,TensorFlow服务还支持REST,而不仅仅是gRPC。
PipelineAI是一种实时企业人工智能平台,具有广阔的应用前景。我看过一些很棒的视频,它们不仅描述了PipelineAI,还描述了部署策略和概念。模型被打包在Docker容器中,可以在Kubernetes上运行。虽然这部分是开源的,但我还不确定其他的PipelineAI组件是否能够进行模型优化和可视化。
同样,我目前只是学习这些方面的知识,但这篇文章可能让你为部署需求和选项有所认识。