使用多个区域 PlatoBlockchain 数据智能提高 Amazon Rekognition 无状态 API 的可扩展性。 垂直搜索。 哎。

使用多个区域提高 Amazon Rekognition 无状态 API 的可扩展性

在以前的 博客文章,我们描述了单个 AWS 区域中的端到端身份验证解决方案。 该解决方案使用 亚马逊重新认识 APIs 检测人脸 用于人脸检测和 比较人脸 用于面部比较。 我们将这些 API 视为无状态 API,因为它们不依赖于 Amazon Rekognition 人脸合集. 它们也是幂等的,这意味着使用相同的参数重复调用将返回相同的结果。 它们提供了传递图像的灵活选项,无论是通过 亚马逊简单存储服务 (Amazon S3) 位置或原始字节。

在这篇文章中,我们专注于 Amazon Rekognition 图片 无状态 API,并讨论传递图像的两种选择,以及何时从系统架构的角度选择一个而不是另一个。 然后我们讨论如何扩展无状态 API 以克服一些区域限制。 在谈论可伸缩性时,我们通常指的是解决方案可以处理的每秒最大事务数 (TPS)。 例如,在举办使用计算机视觉检测人脸或物体标签的大型活动时,您可能会遇到流量高峰,并且您不希望系统进行节流。 这意味着您有时需要提高 TPS,甚至超出 Amazon Rekognition API 的区域服务配额。 这篇文章提出了一种通过使用多个区域来提高无状态 API 的 TPS 的解决方案。

Amazon Rekognition 无状态 API

在可用的 Amazon Rekognition Image API 中, 比较人脸, 检测人脸, 检测标签, 检测审核标签, 侦测防护装备, 检测文本认识名人 是无国籍的。 它们提供 Amazon S3 和原始字节选项来传递图像。 例如,在请求语法中 DetectFaces API,有两个选项传递给 Image 领域: Bytes or S3Object.

使用时 S3Object 选项,一个典型的架构如下。

该解决方案具有以下工作流程:

  1. 客户端应用程序访问托管的网页 AWS放大.
  2. 客户端应用程序已通过身份验证和授权 亚马逊Cognito.
  3. 客户端应用程序将图像上传到 S3 存储桶。
  4. Amazon S3 触发 AWS Lambda 调用 Amazon Rekognition 的函数。
  5. Lambda 函数使用 S3Object 选项调用 Amazon Rekognition API。
  6. Lambda 函数将结果保存到 Amazon DynamoDB 表。

选择 S3Object 以下情况下的选项:

  • 图像是 PNG 或 JPEG 格式的文件
  • 您将整个堆栈部署在提供 Amazon Rekognition 的同一区域
  • Amazon Rekognition API 的区域服务配额满足您的系统要求

当您不满足所有这些要求时,您应该选择 Bytes 选项。

在不同区域使用 Amazon Rekognition 无状态 API

使用的一个例子 Bytes 选项适用于您希望在 Amazon Rekognition 未普遍可用的区域部署您的用例,例如,如果您在南美洲有客户(sa-east-1) 地区。 对于数据驻留,用于存储用户图像的 S3 存储桶必须位于 sa-east-1,但您希望将 Amazon Rekognition 用于您的解决方案,即使它在 sa-east-1. 一种解决方案是使用 Bytes 在提供 Amazon Rekognition 的不同区域调用 Amazon Rekognition 的选项,例如 us-east-1. 下图说明了此体系结构。

异地再认识

Lambda 函数被触发后(第 4 步),函数需要从 S3 存储桶中检索图像(第 3 步),然后使用图像的原始字节调用 Amazon Rekognition(第 5 步),而不是直接使用图像的 S6 位置调用 Amazon Rekognition XNUMX). 以下是 Lambda 函数的代码片段:

rekognition_region = os.getenv("REKOGNITION_REGION")
s3 = boto3.client('s3')
rekognition = boto3.client('rekognition', region_name=rekognition_region)

def handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.parse.unquote_plus(
    event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    s3_res = s3.get_object(Bucket=bucket, Key=key)
    rekognition_res = rekognition.detect_faces(Image={"Bytes": s3_res['Body'].read()}, Attributes=['ALL'])
    print(json.dumps(rekognition_res))

请注意,前面的代码片段直接适用于 JPEG 或 PNG 格式。 对于 BMP 等其他图像格式,在发送到 Amazon Rekognition 之前,需要进行额外的图像处理以将其转换为 JPEG 或 PNG 字节。 以下代码将 BMP 转换为 JPEG 字节:

import io
from PIL import Image

s3_res = s3.get_object(Bucket=bucket, Key=key)
bmp_img = Image.open(io.BytesIO(s3_res['Body'].read()))
buffered = io.BytesIO()
rgb_img = bmp_img.convert('RGB')
rgb_img.save(buffered, format="JPEG")
rekognition_res = rekognition.detect_faces(Image={"Bytes": buffered.getvalue()}, Attributes=['ALL'])

通过将 API 调用分散到多个区域来扩展无状态 API 的 TPS

的另一个用例 Bytes 选项是您可以通过将 API 调用分散到多个区域来扩展无状态 API 的 TPS。 这样,您就不会受到 API 的区域服务配额的限制,因为您可以从其他区域获得额外的 TPS。

在以下示例中,创建了一个 Lambda 函数来调用 Amazon Rekognition DetectLabels API与 Bytes 选项。 要扩大最大 TPS,您可以将 API 调用分散到具有权重的多个区域中。 您可以达到的最大 TPS 计算公式为:min(region_1_max_tps/region_1_weight, region_2_max_tps/region_2_weight, … region_n_max_tps/region_n_weight)。 下面的例子使用 us-east-1us-west-2 地区。

传播识别流量

调用的代码片段 DetectLabels API如下:

region_1 = os.getenv("REKOGNITION_REGION_1")
region_2 = os.getenv("REKOGNITION_REGION_2")
region_1_traffic_percentage = int(os.getenv("REGION_1_TRAFFIC_PERCENTAGE"))

# randomly generate a number between 1, 100
random_num = random.randint(1, 100)
region = region_1 if random_num <= region_1_traffic_percentage else region_2
rekognition = boto3.client('rekognition', region_name=region)
response = rekognition.detect_labels(Image={"Bytes": image_bytes})
print(response)

计划 us-east-1us-west-2 对于 Amazon Rekognition DetectFaces API,两者都有最大 50 TPS,您可以通过设置环境变量以 50/50 的权重均匀分布 API 调用 REGION_1_TRAFFIC_PERCENTAGE 到 50。这样,理论上你可以达到 min(50/50%, 50/50%) = 100 TPS。

为了验证这个想法,Lambda 函数作为 REST API 公开 Amazon API网关。 然后 JMeter的 用于对 API 进行负载测试。

负载测试 Rekognition API 调用

REGION_1_TRAFFIC_PERCENTAGE 先设置为100,这样都是 DetectFaces API调用被发送到 us-east-1 只要。 理论上可以达到的最大TPS受服务配额限制 us-east-1,即 50 TPS。 在自定义 API 端点上进行负载测试,从 50 个并发线程开始,逐渐添加 5 个线程,直到 ProvisionedThroughputExceededException 观察到从 Amazon Rekognition 返回的。

REGION_1_TRAFFIC_PERCENTAGE 然后设置为50,这样所有 DetectLabels API调用被均匀发送到 us-east-1us-west-2. 理论上,最大可以达到的TPS是两个Region加起来的服务配额,即100TPS。 再次从 100 个线程开始负载测试,找出最大 TPS。

下表总结了负载测试的结果。

对 us-east-1 的 DetectLabels API 调用百分比 对 us-west-2 的 DetectLabels API 调用百分比 理论上的最大 TPS 没有的最大并发运行 ProvisionedThroughputExceededException 异常
100 0 50 70
50 50 100 145

结论

许多客户将 Amazon Rekognition Image 无状​​态 API 用于各种用例,包括身份验证、内容审核、媒体处理等。 这篇文章讨论了传递图像的两个选项以及如何在以下用例中使用原始字节选项:

  • Amazon Rekognition 区域可用性
  • 客户数据驻留
  • 扩展 Amazon Rekognition 无状态 API 的 TPS

查看如何使用 Amazon Rekognition 不同的计算机视觉用例 并开始您的创新之旅。


作者简介

使用多个区域 PlatoBlockchain 数据智能提高 Amazon Rekognition 无状态 API 的可扩展性。 垂直搜索。 哎。 是 AWS 的解决方案架构师,常驻马萨诸塞州波士顿地区。 她与企业客户合作,帮助他们解决难题并在 AWS 上进行构建。 工作之余,她喜欢与家人共度时光,探索当地的餐馆。

使用多个区域 PlatoBlockchain 数据智能提高 Amazon Rekognition 无状态 API 的可扩展性。 垂直搜索。 哎。瓦拜·沙 是 AWS 的高级解决方案架构师,喜欢帮助他的客户解决一切云问题,并实现他们的云采用之旅。 工作之余,他喜欢旅行、探索新的地方和餐馆、烹饪、关注板球和足球等运动、看电影和连续剧(漫威粉丝),以及徒步、跳伞等冒险活动,等等。

时间戳记:

更多来自 AWS机器学习