生成数据智能

在 Amazon SageMaker 上部署 Hugging Face (PyAnnote) 说话者分类模型作为异步端点 |亚马逊网络服务

日期:

说话人分类是音频分析中的一个重要过程,它根据说话人身份对音频文件进行分段。这篇文章深入探讨了将 Hugging Face 的 PyAnnote 与说话者分类相集成 亚马逊SageMaker 异步端点。

我们提供了有关如何在 AWS 云上使用 SageMaker 部署说话者分段和集群解决方案的全面指南。您可以将此解决方案用于处理多扬声器(超过 100 个)录音的应用程序。

解决方案概述

亚马逊转录 是 AWS 中说话人分类的首选服务。但是,对于不受支持的语言,您可以使用将部署在 SageMaker 中的其他模型(在我们的示例中为 PyAnnote)进行推理。对于推理时间长达 60 秒的短音频文件,您可以使用 实时推理。持续超过 60 秒, 异步 应该使用推理。异步推理的额外好处是,在没有要处理的请求时,通过将实例计数自动缩放为零来节省成本。

拥抱脸 是一个流行的机器学习 (ML) 模型开源中心。 AWS 和 Hugging Face 有一个 合伙 允许通过 SageMaker 与一组 AWS 深度学习容器 (DLC) 无缝集成,以在 PyTorch 或 TensorFlow 中进行训练和推理,以及用于 SageMaker Python SDK 的 Hugging Face 估计器和预测器。 SageMaker 的特性和功能可帮助开发人员和数据科学家轻松开始在 AWS 上进行自然语言处理 (NLP)。

该解决方案的集成涉及使用 Hugging Face 的预训练说话人二值化模型,该模型使用 PyAnnote 库。 PyAnnote 是一个用 Python 编写的开源工具包,用于说话人分类。该模型在示例音频数据集上进行训练,可在音频文件中实现有效的说话人分区。该模型作为异步端点设置部署在 SageMaker 上,提供高效且可扩展的二值化任务处理。

下图说明了解决方案体系结构。解决方案架构

对于本文,我们使用以下音频文件。

通过对通道进行平均,立体声或多通道音频文件会自动缩混为单声道。以不同速率采样的音频文件在加载时会自动重新采样到 16kHz。

先决条件

完成以下先决条件:

  1. 创建 SageMaker 域.
  2. 确保你的 AWS身份和访问管理 (IAM) 用户具有创建所需的访问权限 SageMaker 角色.
  3. 确保 AWS 账户具有用于托管 ml.g5.2xlarge 实例的 SageMaker 终端节点的服务配额。

创建一个模型函数,用于从 Hugging Face 访问 PyAnnote 说话者二值化

您可以使用 Hugging Face Hub 来访问所需的预训练 PyAnnote 说话人二值化模型。创建 SageMaker 终端节点时,您可以使用相同的脚本下载模型文件。

拥抱的脸

请参见以下代码:

from PyAnnote.audio import Pipeline

def model_fn(model_dir):
# Load the model from the specified model directory
model = Pipeline.from_pretrained(
"PyAnnote/speaker-diarization-3.1",
use_auth_token="Replace-with-the-Hugging-face-auth-token")
return model

封装模型代码

准备必要的文件,例如 inference.py,其中包含推理代码:

%%writefile model/code/inference.py
from PyAnnote.audio import Pipeline
import subprocess
import boto3
from urllib.parse import urlparse
import pandas as pd
from io import StringIO
import os
import torch

def model_fn(model_dir):
    # Load the model from the specified model directory
    model = Pipeline.from_pretrained(
        "PyAnnote/speaker-diarization-3.1",
        use_auth_token="hf_oBxxxxxxxxxxxx)
    return model 


def diarization_from_s3(model, s3_file, language=None):
    s3 = boto3.client("s3")
    o = urlparse(s3_file, allow_fragments=False)
    bucket = o.netloc
    key = o.path.lstrip("/")
    s3.download_file(bucket, key, "tmp.wav")
    result = model("tmp.wav")
    data = {} 
    for turn, _, speaker in result.itertracks(yield_label=True):
        data[turn] = (turn.start, turn.end, speaker)
    data_df = pd.DataFrame(data.values(), columns=["start", "end", "speaker"])
    print(data_df.shape)
    result = data_df.to_json(orient="split")
    return result


def predict_fn(data, model):
    s3_file = data.pop("s3_file")
    language = data.pop("language", None)
    result = diarization_from_s3(model, s3_file, language)
    return {
        "diarization_from_s3": result
    }

准备一个 requirements.txt 文件,其中包含运行推理所需的 Python 库:

with open("model/code/requirements.txt", "w") as f:
    f.write("transformers==4.25.1n")
    f.write("boto3n")
    f.write("PyAnnote.audion")
    f.write("soundfilen")
    f.write("librosan")
    f.write("onnxruntimen")
    f.write("wgetn")
    f.write("pandas")

最后,压缩 inference.py 和requirements.txt 文件并将其另存为 model.tar.gz:

!tar zcvf model.tar.gz *

配置 SageMaker 模型

通过指定图像 URI、模型数据位置来定义 SageMaker 模型资源 亚马逊简单存储服务 (S3) 和 SageMaker 角色:

import sagemaker
import boto3

sess = sagemaker.Session()

sagemaker_session_bucket = None
if sagemaker_session_bucket is None and sess is not None:
    sagemaker_session_bucket = sess.default_bucket()

try:
    role = sagemaker.get_execution_role()
except ValueError:
    iam = boto3.client("iam")
    role = iam.get_role(RoleName="sagemaker_execution_role")["Role"]["Arn"]

sess = sagemaker.Session(default_bucket=sagemaker_session_bucket)

print(f"sagemaker role arn: {role}")
print(f"sagemaker bucket: {sess.default_bucket()}")
print(f"sagemaker session region: {sess.boto_region_name}")

将模型上传到 Amazon S3

将压缩的 PyAnnote Hugging Face 模型文件上传到 S3 存储桶:

s3_location = f"s3://{sagemaker_session_bucket}/whisper/model/model.tar.gz"
!aws s3 cp model.tar.gz $s3_location

创建 SageMaker 异步端点

配置异步端点,以便使用提供的异步推理配置在 SageMaker 上部署模型:

from sagemaker.huggingface.model import HuggingFaceModel
from sagemaker.async_inference.async_inference_config import AsyncInferenceConfig
from sagemaker.s3 import s3_path_join
from sagemaker.utils import name_from_base

async_endpoint_name = name_from_base("custom-asyc")

# create Hugging Face Model Class
huggingface_model = HuggingFaceModel(
    model_data=s3_location,  # path to your model and script
    role=role,  # iam role with permissions to create an Endpoint
    transformers_version="4.17",  # transformers version used
    pytorch_version="1.10",  # pytorch version used
    py_version="py38",  # python version used
)

# create async endpoint configuration
async_config = AsyncInferenceConfig(
    output_path=s3_path_join(
        "s3://", sagemaker_session_bucket, "async_inference/output"
    ),  # Where our results will be stored
    # Add nofitication SNS if needed
    notification_config={
        # "SuccessTopic": "PUT YOUR SUCCESS SNS TOPIC ARN",
        # "ErrorTopic": "PUT YOUR ERROR SNS TOPIC ARN",
    },  #  Notification configuration
)

env = {"MODEL_SERVER_WORKERS": "2"}

# deploy the endpoint endpoint
async_predictor = huggingface_model.deploy(
    initial_instance_count=1,
    instance_type="ml.xx",
    async_inference_config=async_config,
    endpoint_name=async_endpoint_name,
    env=env,
)

测试端点

通过发送音频文件进行分类并检索存储在指定 S3 输出路径中的 JSON 输出来评估端点功能:

# Replace with a path to audio object in S3
from sagemaker.async_inference import WaiterConfig
res = async_predictor.predict_async(data=data)
print(f"Response output path: {res.output_path}")
print("Start Polling to get response:")

config = WaiterConfig(
  max_attempts=10, #  number of attempts
  delay=10#  time in seconds to wait between attempts
  )
res.get_result(config)
#import waiterconfig

要大规模部署此解决方案,我们建议使用 AWS Lambda, 亚马逊简单通知服务 (亚马逊 SNS),或 Amazon Simple Queue服务 (亚马逊 SQS)。这些服务旨在实现可扩展性、事件驱动的架构和高效的资源利用。它们可以帮助将异步推理过程与结果处理分离,使您能够独立扩展每个组件并更有效地处理突发的推理请求。

成果

模型输出存储在 s3://sagemaker-xxxx /async_inference/output/. 输出显示音频录音已分为三列:

  • 开始(开始时间以秒为单位)
  • 结束(结束时间以秒为单位)
  • 扬声器(扬声器标签)

以下代码显示了我们的结果示例:

[0.9762308998, 8.9049235993, "SPEAKER_01"]

[9.533106961, 12.1646859083, "SPEAKER_01"]

[13.1324278438, 13.9303904924, "SPEAKER_00"]

[14.3548387097, 26.1884550085, "SPEAKER_00"]

[27.2410865874, 28.2258064516, "SPEAKER_01"]

[28.3446519525, 31.298811545, "SPEAKER_01"]

清理

您可以通过将 MinCapacity 设置为 0 将扩展策略设置为零; 异步推理 让您无需请求即可自动缩放至零。您不需要删除端点,它 再次需要时从零开始,在不使用时降低成本。请看下面的代码:

# Common class representing application autoscaling for SageMaker 
client = boto3.client('application-autoscaling') 

# This is the format in which application autoscaling references the endpoint
resource_id='endpoint/' + <endpoint_name> + '/variant/' + <'variant1'> 

# Define and register your endpoint variant
response = client.register_scalable_target(
    ServiceNamespace='sagemaker', 
    ResourceId=resource_id,
    ScalableDimension='sagemaker:variant:DesiredInstanceCount', # The number of EC2 instances for your Amazon SageMaker model endpoint variant.
    MinCapacity=0,
    MaxCapacity=5
)

如果要删除端点,请使用以下代码:

async_predictor.delete_endpoint(async_endpoint_name)

异步端点部署的好处

该解决方案具有以下优点:

  • 该解决方案可以有效地处理多个或大型音频文件。
  • 本示例使用单实例进行演示。如果您想将此解决方案用于数百或数千个视频并使用异步端点跨多个实例进行处理,您可以使用 自动缩放策略,它是针对大量源文档而设计的。自动缩放会动态调整为模型预置的实例数量,以响应工作负载的变化。
  • 该解决方案通过将长时间运行的任务与实时推理分开来优化资源并减少系统负载。

结论

在这篇文章中,我们提供了一种使用 Python 脚本在 SageMaker 上部署 Hugging Face 的说话人二值化模型的简单方法。使用异步端点提供了一种高效且可扩展的方法来将分类预测作为服务提供,从而无缝地适应并发请求。

立即开始为您的音频项目进行异步扬声器分类。如果您对建立和运行自己的异步二值化端点有任何疑问,请在评论中联系。


作者简介

桑杰·蒂瓦里 是一名专家 AI/ML 解决方案架构师,他花时间与战略客户合作来定义业务需求,围绕特定用例提供 L300 会话,并设计可扩展、可靠且高性能的 AI/ML 应用程序和服务。他帮助启动和扩展了由 AI/ML 驱动的 Amazon SageMaker 服务,并使用 Amazon AI 服务实施了多项概念验证。他还开发了高级分析平台,作为数字化转型之旅的一部分。

基兰·查拉帕利 是 AWS 公共部门的深度技术业务开发人员。他在 AI/ML 领域拥有超过 8 年的经验,以及 23 年的整体软件开发和销售经验。 Kiran 帮助印度各地的公共部门企业探索和共同创建基于云的解决方案,这些解决方案使用人工智能、机器学习和生成人工智能(包括大型语言模型)技术。

现货图片

最新情报

现货图片

在线答疑

你好呀! 我怎么帮你?