PyTorch 在学术研究领域得到了广泛应用,但人们往往对如何将 PyTorch 模型投入生产环境感到困惑。本篇博文旨在消除关于 PyTorch 生产化路径的疑虑。通常当人们谈论将模型“投入生产”时,是指执行推理(inference),有时也称为模型评估、预测或服务。在函数调用层面,PyTorch 中的推理过程大致如下:
- 在 Python 中
module(input)
- 在跟踪(traced)模型中
module(input)
- 在 C++ 中
at::Tensor output = module->forward(inputs).toTensor();
由于我们在 Facebook 每天使用 PyTorch 执行数以百亿亿次的推理操作,我们投入了大量精力来确保推理过程尽可能高效。
服务策略
然而,这种关于如何进行模型推理的微观视角通常不是事情的全貌。在现实世界的机器学习系统中,你往往不仅仅需要在 REPL 或 Jupyter notebook 中运行单个推理操作。相反,你通常需要将模型以某种方式集成到更大的应用程序中。根据具体需求,你通常可以采取以下几种方法之一:
直接嵌入
在移动端等应用场景中,我们通常直接将模型作为大型程序的一部分来调用。这不仅适用于应用,机器人和专用设备通常也是这样工作的。在代码层面,对模型的调用与上面推理章节中显示的内容完全一致。一个关键考量是,这些环境中通常没有 Python 解释器,这就是为什么 PyTorch 允许你从 C++ 调用模型,从而在无需 Python 运行时的情况下交付模型。
模型微服务
如果你在服务端环境中使用模型,并且需要管理多个模型,你可能会选择将每个单独的模型(或每个单独的模型版本)视为一个独立的服务,通常使用 Docker 容器等某种打包机制。然后,该服务通常通过某种服务方式(如基于 HTTP 的 JSON 或 gRPC 等 RPC 技术)实现网络可访问。这种方法的主要特点是,你定义了一个只有一个端点的服务,该端点只负责调用你的模型。然后,你通过现有的服务管理系统(例如 Kubernetes、ECS)来执行所有的模型管理工作(升级、回滚等)。
模型服务器
另一种可能的解决方案是使用模型服务器。这是一种专门为管理和服务模型而构建的应用程序。它允许你上传多个模型,并为每个模型获取不同的预测端点。通常,此类系统包含许多其他功能,以帮助解决模型管理和服务的整体问题,例如指标监控、可视化、数据预处理等。即使是像自动版本控制系统这样简单的功能,也能使模型回滚等重要功能的实现变得更容易。
演进中的模式
以上是对不同方法基于当前时间点的某种粗略划分。设计模式仍在演变中。最近,模型服务器设计开始采用更多通用服务基础设施的技术,例如 Docker 容器和 Kubernetes,因此许多模型服务器已经开始共享上述模型微服务设计的特性。如需深入了解模型服务器设计的一般概念,可以查阅我的机器学习系统相关书籍。
服务 PyTorch 模型
那么,如果你是一名 PyTorch 用户,想要将模型投入生产,应该使用什么呢?
如果你在移动端或机器人等嵌入式系统上工作,直接在应用程序中嵌入通常是正确的选择。对于移动端,你的用例可能通过 ONNX 导出功能得到满足。请注意,ONNX 本身有其局限性,并不支持更大规模 PyTorch 项目提供的所有功能。你可以查看这篇关于使用 ONNX 将 PyTorch 模型部署到移动端的教程,看看该路径是否适合你的用例。话虽如此,我们了解到 PyTorch 用户在移动端还有更多需求,因此未来请关注 PyTorch 中更多针对移动端的功能。对于机器人等其他嵌入式系统,通过 C++ API 运行 PyTorch 模型推理可能是一个合适的解决方案。
如果你无法使用云服务,或者更倾向于使用相同技术管理所有服务,你可以按照此示例,使用 Flask Web 框架构建一个简单的模型微服务。
如果你想在非云服务解决方案中管理多个模型,目前有许多团队正在开发支持 PyTorch 的模型服务器,例如 MLFlow、Kubeflow 和 RedisAI。我们很高兴看到多个团队在构建开源模型服务器方面的创新,未来我们将继续重点关注 PyTorch 生态系统中的这些创新。
如果你的应用程序可以使用云服务,那么在云端使用模型有几个极好的选择。对于 AWS Sagemaker,你可以找到一份 AWS 提供的使用 PyTorch 的所有资源指南,其中包括如何使用 Sagemaker Python SDK 的文档。你还可以观看我们关于在 Sagemaker 上使用 PyTorch 的一些演讲。最后,如果你恰好通过 FastAI 使用 PyTorch,他们也编写了一份非常简单的 Sagemaker 入门指南。
其他主流云厂商的情况也类似。在 Google Cloud 上,你可以按照这些说明获取预装有 PyTorch 的深度学习虚拟机。在 Microsoft Azure 上,你有多种入门方式,从 Azure Machine Learning Service 到展示如何使用 PyTorch 的 Azure Notebooks 应有尽有。
你的模型
无论你采取哪种方式将 PyTorch 模型投入生产,我们都希望能为你提供支持并助力你成功。你喜欢上面的哪种方案吗?在某个关键功能上是否遇到缺乏支持的问题?我们很乐意在 PyTorch 讨论论坛的 部署类别(deployment category) 中进行更多交流。我们期待提供帮助,并希望能分享和传播你的成功故事。