你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

降低延迟并提高性能

本指南介绍如何在使用人脸服务时降低网络延迟并提高服务性能。 应用程序的速度和性能会影响最终用户(例如注册和使用人脸识别系统的人员)的体验。

缓解延迟

使用人脸服务时你可能会遇到延迟。 延迟是指系统通过网络通信时发生的任何类型的延迟。 通常情况下,延迟的可能原因包括:

  • 每个数据包从源传输到目标时必须通过的物理距离过长。
  • 传输介质出现问题。
  • 传输路径中的路由器或交换机出现错误。
  • 防病毒应用程序、防火墙和其他安全机制检查数据包需要一定的时间。
  • 客户端或服务器应用程序中出现故障。

本部分介绍如何减少造成 Azure AI 人脸服务延迟的各种成因。

注意

Azure AI 服务不提供与延迟有关的任何服务级别协议 (SLA)。

为人脸资源选择适当的区域

网络延迟是信息从源(应用程序)到目标(Azure 资源)所需的时间,深受发出请求的应用程序与响应这些请求的 Azure 服务器之间的地理距离的影响。 例如,如果人脸资源位于 EastUS 位置,则纽约用户响应时间更快,亚洲用户体验到的延迟更长。

建议选择最靠近用户的区域,以最大程度地减少延迟。 如果你的用户分布在世界各地,请考虑在不同的区域中创建多个资源,并将请求路由到离客户最近的区域。 或者,可以选择一个靠近所有客户的地理中心的区域。

将 Azure Blob 存储用于远程 URL

人脸服务提供两种方法来上传图像进行处理:直接在请求中上传图像的原始字节数据,或提供远程图像的 URL。 无论使用哪种方法,人脸服务都需要从其源位置下载图像。 如果从人脸服务到客户端或远程服务器的连接缓慢或质量较差,则会影响请求的响应时间。 如果存在延迟问题,请考虑将映像存储在 Azure Blob 存储中,并在请求中传递映像 URL。 有关更多关于实现的详细信息,请参阅“将映像存储在 Azure 高级 Blob 存储中”。 示例 API 调用:

var faces = await client.Face.DetectWithUrlAsync("https://<storage_account_name>.blob.core.windows.net/<container_name>/<file_name>");

请务必使用与人脸资源位于同一区域中的存储帐户。 这将减少人脸服务和存储帐户之间连接的延迟。

使用最佳文件大小

如果使用的图像文件很大,它将以两种方式影响人脸服务的响应时间:

  • 上传文件需要更多时间。
  • 服务需要花费更多时间(与文件大小成正比)来处理文件。

准确性与网络速度之间的权衡

输入图像的质量会影响人脸服务的准确性和延迟。 质量较低的图像可能会导致错误的结果。 质量较高的图像可能会产生更精确的解释。 但是,由于图像文件大小较大,质量更高的图像也会增加网络延迟。 服务需要更多时间才能从客户端接收和处理整个文件,所用时间与文件大小成正比。 超过一定级别后,进一步的质量增强不会显著提高准确性。

若要在准确性和速度之间实现最佳平衡,请按照这些提示优化输入数据。

其他文件大小提示

请注意以下额外提示:

  • 对于人脸检测,使用检测模型 DetectionModel.Detection01 时,减小图像文件大小会提高处理速度。 如果使用检测模型 DetectionModel.Detection02,则只有当图像文件小于 1920x1080 像素时,减小图像文件大小才会提高处理速度。
  • 对于人脸识别,如果图像小于 200x200 像素,则减少人脸大小只会提高速度。
  • 人员检测方法的性能还取决于图像中有多少人脸。 对于每个图像,人脸服务最多可以返回 100 张人脸。 人脸将根据人脸矩形大小按从大到小的顺序排序。

尽可能并行调用 API

如果你需要调用多个 API,请考虑并行调用这些方法(如果你的应用程序设计允许这样做)。 例如,如果需要检测两个图像中的人脸来执行人脸比较,则可以在异步任务中调用它们:

var faces_1 = client.Face.DetectWithUrlAsync("https://www.biography.com/.image/t_share/MTQ1MzAyNzYzOTgxNTE0NTEz/john-f-kennedy---mini-biography.jpg");
var faces_2 = client.Face.DetectWithUrlAsync("https://www.biography.com/.image/t_share/MTQ1NDY3OTIxMzExNzM3NjE3/john-f-kennedy---debating-richard-nixon.jpg");

Task.WaitAll (new Task<IList<DetectedFace>>[] { faces_1, faces_2 });
IEnumerable<DetectedFace> results = faces_1.Result.Concat (faces_2.Result);

平滑处理峰值流量

人脸服务的性能可能会受到流量高峰的影响,这可能会导致限制,吞吐量降低和延迟升高。 建议逐步增加 API 调用的频率,避免立即重试。 例如,如果你有 3000 张照片用于执行面部检测,请不要同时发送 3000 个请求。 取而代之,请在 5 分钟内按顺序发送 3000 个请求(即每秒约 10 个请求),以使流量更加稳定一致。 如果要缩短完成时间,请逐渐增加每秒调用数,以使流量平滑增加。 如果遇到任何错误,请参阅“有效处理错误”来处理响应。

有效处理错误

由于各种原因,人脸 API 调用上可能会出现错误 429503。 应用程序必须始终为处理这些错误做好准备。 以下是一些建议:

HTTP 错误代码 说明 建议
429 限制 并发调用可能会遇到速率限制。 应降低调用频率,并使用指数退避重试。 避免立即重试,并避免同时重新发送大量请求。

如果要增加限制,请参阅配额指南的“请求增加”部分。
503 服务不可用 服务可能正忙,无法立即响应请求。 应采用类似于错误 429 的策略的退避策略。

确保可靠性和支持

以下是确保应用程序拥有可靠性和高度支持的其他提示:

  • 生成一个唯一的 GUID 作为 client-request-id HTTP 请求标头,并随每个请求一起发送该 GUID。 这有助于在需要报告 Microsoft 的问题时,让 Microsoft 更轻松地调查任何错误。
    • 始终记录遇到意外响应时收到的 client-request-id 和响应。 如果需要任何帮助,请向 Microsoft 支持部门提供此信息,以及问题发生时的 Azure 资源 ID 和时间段。
  • 在将应用程序发布到生产环境之前进行试点测试。 确保应用程序可以正确有效地处理错误。

后续步骤

本指南介绍在使用人脸服务时如何提高性能。 接下来,按照教程设置一个工作软件解决方案,该解决方案结合了服务器端和客户端逻辑,以便对用户进行人脸活体检测。