发布于: Aug 9, 2022

发展至今,云计算与深度学习的联系日益紧密,无服务器环境的使用带来了许多机会,可以简化开发和生产代码的部署。打包代码及其依赖项的步骤因运行时环境而异,因此需要熟悉这些内容,避免在首次部署期间出现问题。Python 是非常流行的语言,可供数据科学家用来构建机器学习模型。要在 Amazon Web Services Lambda 下· 上运行期间实现最佳性能,依赖于旧 C 和 Fortran 的 Python 库应该使用 Amazon Linux Amazon 系统映像 (AMI) (随后可以导出其生成的文件) 在 Amazon Elastic Compute Cloud 上构建和安装。在这篇博客文章中,我们已经完成了这个步骤。您可以随意利用这些库来构建最终的部署程序包。

模型训练通常需要密集的计算工作,在专用硬件上使用大量 GPU 资源。幸好,推理相比训练所需的计算量要小得多,可以使用 CPU 并利用 Lambda 无服务器计算模型。如果您确实需要 GPU 进行推理,可以考虑使用容器服务,例如 Amazon ECS 或 Kubernetes,这可以让您更好地控制您的推理环境。

随着您的项目越来越多地迁移到无服务器架构,很快您就会学习到这一计算方法带来的机会和挑战:

  • 无服务器可以显著地简化计算基础设施的使用,避免管理 VPC、子网、安全性、构建和部署 Amazon EC2 服务器的复杂性等等。
  • Amazon Web Services 会为您处理容量。
  • 经济高效 – 您只需在使用计算资源时付费,计费以 100 毫秒为增量。
  • 异常处理 – Amazon Web Services 会处理重试,并将出现问题的数据/消息存储在 Amazon SQS/Amazon SNS 中供以后处理。
  • 在 Amazon CloudWatch Logs 中收集和存储所有日志。
  • 可以使用 Amazon Web Services X-Ray 工具监视性能。

如果您计划处理较大的文件/对象,请确保使用输入流方法,而不是在内存中加载全部内容。在工作中,我们通常会使用 Amazon Web Services Lambda 函数,利用传统文件/对象流式处理方法来处理非常大的文件 (甚至超过 20 GB)。为了改进网络 I/O,请确保使用压缩,因为在多数情况下这会显著减少文件/对象大小 (特别是 CSV 和 JSON 编码)。

虽然本博客文章使用 Inception-v3 模型 (最大内存用量约为 400 MiB),不过也提供了较低内存的选项,例如 MobileNets 和 SqueezeNet。如果您希望探索其他模型或者面临计算/内存/精度约束情况,可以在 Canziani 等中找到针对不同模型的很好的分析。这种分析其实就是本文侧重于 Inception-v3 的原因。我们相信这在精度、计算要求和内存使用方面提供了很好的折衷。
调试 Lambda 函数不同于在传统基于本地主机/笔记本电脑进行开发时的调试。相反,我们建议您先创建本地主机代码 (这应易于调试),最后再将其提升到 Lambda 函数中。从笔记本电脑环境切换到 Amazon Web Services Lambda 只需很少的更改,例如:

  • 替换使用的本地文件引用 – 例如,将它们替换为 S3 对象。
  • 读取环境变量 – 这些变量可以抽象化以具有相同逻辑。
  • 输出到控制台 – 您仍可以使用输出函数,不过它们会重定向到 CloudWatch Logs,几秒钟以后就可以看到日志。
  • 调试 – 调试程序不能用于 Amazon Web Services Lambda,但是如前所述,只有当它在主机环境中正确运行时,才能使用所有这些工具在主机上进行开发和部署结果。
  • 运行时设备 – 启用 Amazon Web Services X-Ray 服务以深入了解运行时数据,以便确定问题和寻求优化机会。

在您将您的代码和依赖项打包到单个 ZIP 文件中之后,部署到 Amazon Web Services Lambda 会比较繁琐。利用 CI/CD 工具,例如这篇博客文章开头提到的工具,可以简化这个步骤,并且更重要的是可实现完全自动化。任何时候,只要检测到代码更改,CI/CD 管道将根据您的配置,自动生成结果并将结果快速部署到请求的环境。此外,Amazon Web Services Lambda 支持版本控制和别名使用,这让您能够快速在 Lambda 函数的不同变体之间切换。当您在不同环境 (例如研究、开发、暂存和生产) 中工作时,这会非常有用。在发布某个版本后,它是不可变的,这可以避免不小心更改了您的代码。 

相关文章