发布于: Oct 30, 2022

在本文中,我们重点介绍如何利用深度学习图像处理识别模拟生产系统的类似于暂存的环境中的图片。

在此使用案例中,我们将模拟对存储在 Amazon Simple Storage Service (S3) 存储桶中的图像进行处理的过程。用于存放对象的 S3 存储桶具有通知功能,可向其余 Amazon Web Services 云生态系统通知有关对象 PUT 事件的信息。在大多数情况下会使用 Amazon Simple Notification Service (SNS) 通知机制,或者自动触发 Amazon Lambda 函数中的用户代码。为了简化起见,我们将使用在出现 S3 对象 PUT 事件时触发的 Lambda 函数。您可能已经注意到了,我们面对的是一些非常复杂的概念,而实际工作中科学家/开发人员很少涉及到这些。

我们的训练机器学习模型是使用 Python TensorFlow 开发的,位于 S3 存储桶中。在模拟中,我们会将一张猫的图片上传到任意启用了存储桶事件通知的存储桶中。我们的 Lambda 函数将订阅这些 S3 存储桶通知事件。

在本文中,所有云基础设施均使用 Amazon CloudFormation 构建,它提供了快速灵活的接口来创建和启动 Amazon Web Services 服务。作为另一种设计和启动 Amazon Web Services 资源的方法,此过程也可以使用 Amazon Web Services 管理控制台或者使用 Amazon Web Services 命令行界面 (Amazon CLI) 手动完成。

现在,有一种简单高效的方法可用来快速开发基于 AI 的系统,这就是利用现有模型并根据您的使用案例进行微调,尤其是要利用已公开发布的先进模型。

我们接下来部署一个强大的 Inception-v3 模型,该模型经过预训练,用于图像分类。

此处显示的 Inception-v3 架构使用颜色指示层类型。对您而言,了解模型的各个部分并不重要。不过,重要的是需要认识到这是一个真正的深度网络,从头开始训练所需的时间和资源数量 (数据和计算) 令人望而生畏。

我们利用 TensorFlow 图像识别教程下载经过预训练的 Inception-v3 模型。

首先,创建 Python 2.7 virtualenv Anaconda 环境,并安装适用于 CPU TensorFlow (我们完全不需要 GPU)

然后下载 classify_image.py

并在您的 shell 中执行它:

python classify_image.py

这将下载经过预训练的 Inception-v3 模型并在示例图像 (熊猫) 上运行它,这将验证实施是否正确。

此过程创建类似于下面的目录结构:

classify_image.py
imagenet/
----classify_image_graph_def.pb
----imagenet_2012_challenge_label_map_proto.pbtxt
----imagenet_synset_to_human_label_map.txt
----LICENSE

现在,您需要获取此模型文件及所有必需的已编译 Python 程序包,并创建 Amazon Lambda 可执行的包。为了简化这些步骤,我们提供了所有必需的二进制文件,方便您使用。您可以按照以下步骤,在数分钟内启动并运行演示。

作为演示包的一部分,我们提供了一个很大的模型文件。由于文件相当大 (超过 90 MB),我们需要在 Amazon Lambda Amazon S3 执行推理期间加载它。查看提供的推理代码 (classify_image.py),您会发现我们将模型下载放在了处理程序函数之外。我们这样做是为了充分利用 Amazon Lambda 的容器重用。任何在处理程序方法之外执行的代码,在容器创建时只会调用一次,并保留在内存中供对相同 Lambda 容器的所有调用使用,使得后续对 Lambda 的调用更快。

Amazon Lambda 预热操作是您在首次生产运行之前主动启动 Amazon Lambda。这可帮助您避免 Amazon Lambda“冷启动的潜在问题,这是指在每次执行”Lambda 实例化时都需要从 S3 加载大模型。在 Amazon Lambda 正常运行之后,保持它的热状态可以带来好处,这样可确保下次推理运行时可以快速响应。只要每隔数分钟激活 Amazon Lambda 一次 (即使是使用某种类型的 ping 通知完成激活),它都会在 Lambda 需要运行推理任务时保持热状态。

现在,我们需要将代码和所有必需的程序包压缩在一起。通常,您必须在 Amazon Linux EC2 实例上编译所有必需的程序包,然后才能将其用于 Amazon Lambda。不过,在这篇博客文章中,我们提供了已编译的文件以及完整的 deeplearning-bundle.zip 文件,其中包含之前介绍的所有代码以及必需程序包,可以直接用于 Amazon Lambda

下面是您开始操作的几个主要步骤:

  1. 下载 DeepLearningAndAI-Bundle.zip
  2. 解压缩并将文件复制到 Amazon S3 存储桶。我们将它命名为 dl-model-bucket。此文件夹将包含您运行本演示所需的全部内容,例如:
    1. classify_image.py
    2. classify_image_graph_def.pb
    3. deeplearning-bundle.zip
    4. DeepLearning_Serverless_CF.json
    5. cat-pexels-photo-126407.jpeg (无版税图像,用于测试目的)
    6. dog-pexels-photo-59523.jpeg (无版税图像,用于测试目的)
  3. 运行 CloudFormation 脚本以在 Amazon Web Services 中创建所有必需的资源,包括您的测试 S3 存储桶;我们将它命名为 deeplearning-test-bucket (如果此存储桶名称已被占用,您需要使用其他名称)下面提供了分步说明。
  4. 将图像上传到您的测试存储桶。
  5. 转到您的 Lambda 推理函数的 Amazon Cloud Watch 日志,并验证推理结果。

下面是运行 CloudFormation 脚本的分步指南:

  1. 转至 Amazon CloudFormation 控制台并选择创建新堆栈按钮。
  2. 指定 Amazon S3 模板 URL”部分,提供指向 CloudFormation 脚本 (json) 的链接。选择下一步
  3. 输入必需值:CloudFormation 堆栈名称、测试存储桶名称 (您将要识别的图像上传到其中的存储桶,我们将它命名deeplearning-test-bucket) 以及存放模型和代码的存储桶。

4.选择下一步。跳过选项页面。转到审核页面。在页面的底部,您应进行确认。选择创建按钮。您应看到 CREATE_IN_PROGRESS 状态,并且稍后将看到 CREATE_COMPLETE 状态。

此时,CloudFormation 脚本已生成了整个解决方案,包括 Amazon Identity and Access Management (IAM) 角色、深度学习推理 Lambda 函数,以及在对象放入到测试存储桶中时 S3 存储桶触发 Lambda 函数的权限。

查看 Amazon Lambda 服务,您会看到新的 DeepLearning_Lambda 函数。Amazon CloudFormation 已经完全配置了所有必需参数,并添加了在推理期间使用的必需环境变量。

新的测试存储桶应已创建。要测试我们的深度学习推理功能,请上传图像到之前创建的 S3 存储桶:deeplearning-test-bucket

要执行您已编写的代码,只需将任何图像上传到 CloudFormation 脚本创建的 Amazon S3 存储桶。此操作将触发我们的推理 Lambda 函数。

下面是将测试图像上传到测试存储桶的示例。

此时,S3 存储桶已经触发了我们的推理 Lambda 函数。在这篇博客文章中,我们将转到 CloudWatch Logs 以查看推理结果。在控制台中的 Amazon Lambda 服务屏幕上,选择监控,然后选择查看日志。请注意,当您实际处理推理结果时,这些结果应该存储在我们的某个持久性存储中,例如 Amazon DynamoDB Amazon Elasticsearch Service,在其中您可以轻松地索引图像和关联的标签。

在此日志中,您将看到模型加载在 Lambda 容器构造期间完成。在接下来的调用中,只要容器仍保持状态,就只进行推理 (模型已在内存中),这样可减少整体运行时间。以下屏幕截图显示了后续的 Lambda 函数执行。

相关文章