Inteligência de dados generativa

Implantar um modelo de diarização de alto-falante Hugging Face (PyAnnote) no Amazon SageMaker como um endpoint assíncrono | Amazon Web Services

Data:

A diarização do locutor, um processo essencial na análise de áudio, segmenta um arquivo de áudio com base na identidade do locutor. Esta postagem investiga a integração do PyAnnote do Hugging Face para diarização de alto-falante com Amazon Sage Maker pontos de extremidade assíncronos.

Fornecemos um guia abrangente sobre como implantar soluções de segmentação e cluster de alto-falantes usando SageMaker na Nuvem AWS. Você pode usar esta solução para aplicações que lidam com gravações de áudio com vários alto-falantes (mais de 100).

Visão geral da solução

Amazon Transcribe é o serviço ideal para diarização de alto-falantes na AWS. No entanto, para idiomas não suportados, você pode usar outros modelos (no nosso caso, PyAnnote) que serão implantados no SageMaker para inferência. Para arquivos de áudio curtos em que a inferência leva até 60 segundos, você pode usar inferência em tempo real. Por mais de 60 segundos, assíncrono inferência deve ser usada. O benefício adicional da inferência assíncrona é a economia de custos ao dimensionar automaticamente a contagem de instâncias para zero quando não há solicitações para processar.

Abraçando o rosto é um centro de código aberto popular para modelos de aprendizado de máquina (ML). AWS e Hugging Face têm um parceria que permite uma integração perfeita por meio do SageMaker com um conjunto de AWS Deep Learning Containers (DLCs) para treinamento e inferência em PyTorch ou TensorFlow e estimadores e preditores Hugging Face para o SageMaker Python SDK. Os recursos e funcionalidades do SageMaker ajudam desenvolvedores e cientistas de dados a começar a usar o processamento de linguagem natural (PNL) na AWS com facilidade.

A integração para esta solução envolve o uso do modelo de diarização de alto-falante pré-treinado do Hugging Face usando o Biblioteca PyAnnote. PyAnnote é um kit de ferramentas de código aberto escrito em Python para diarização de alto-falantes. Este modelo, treinado no conjunto de dados de áudio de amostra, permite particionamento eficaz de alto-falantes em arquivos de áudio. O modelo é implantado no SageMaker como uma configuração de endpoint assíncrona, fornecendo processamento eficiente e escalonável de tarefas de diarização.

O diagrama a seguir ilustra a arquitetura da solução.Arquitetura da solução

Para esta postagem, usamos o seguinte arquivo de áudio.

Arquivos de áudio estéreo ou multicanal são automaticamente mixados para mono pela média dos canais. Os arquivos de áudio amostrados em uma taxa diferente são reamostrados para 16kHz automaticamente ao serem carregados.

Pré-requisitos

Preencha os seguintes pré-requisitos:

  1. Crie um domínio SageMaker.
  2. Verifique se o seu Gerenciamento de acesso e identidade da AWS (IAM) tem as permissões de acesso necessárias para criar um Função do SageMaker.
  3. Certifique-se de que a conta AWS tenha uma cota de serviço para hospedar um endpoint SageMaker para uma instância ml.g5.2xlarge.

Crie uma função de modelo para acessar a diarização do alto-falante PyAnnote em Hugging Face

Você pode usar o Hugging Face Hub para acessar o pré-treinado desejado Modelo de diarização de alto-falante PyAnnote. Você usa o mesmo script para baixar o arquivo de modelo ao criar o endpoint SageMaker.

Abraçando o rosto

Veja o seguinte código:

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

Empacote o código do modelo

Prepare arquivos essenciais como inference.py, que contém o código de inferência:

%%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
    }

Prepare um requirements.txt arquivo, que contém as bibliotecas Python necessárias para executar a inferência:

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")

Por último, comprima o inference.py e requisitos.txt e salve-os como model.tar.gz:

!tar zcvf model.tar.gz *

Configurar um modelo SageMaker

Defina um recurso de modelo do SageMaker especificando o URI da imagem e a localização dos dados do modelo em Serviço de armazenamento simples da Amazon (S3) e função 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}")

Carregar o modelo no Amazon S3

Faça upload do arquivo compactado do modelo PyAnnote Hugging Face para um bucket S3:

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

Crie um endpoint assíncrono do SageMaker

Configure um endpoint assíncrono para implantar o modelo no SageMaker usando a configuração de inferência assíncrona fornecida:

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,
)

Teste o ponto final

Avalie a funcionalidade do endpoint enviando um arquivo de áudio para diarização e recuperando a saída JSON armazenada no caminho de saída S3 especificado:

# 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

Para implantar esta solução em escala, sugerimos usar AWS Lambda, Serviço de notificação simples da Amazon (Amazon SNS), ou Serviço de fila simples da Amazon (Amazon SQS). Esses serviços são projetados para escalabilidade, arquiteturas orientadas a eventos e utilização eficiente de recursos. Eles podem ajudar a dissociar o processo de inferência assíncrona do processamento de resultados, permitindo escalar cada componente de forma independente e lidar com explosões de solicitações de inferência de forma mais eficaz.

Resultados

A saída do modelo é armazenada em s3://sagemaker-xxxx /async_inference/output/. A saída mostra que a gravação de áudio foi segmentada em três colunas:

  • Início (hora de início em segundos)
  • Fim (horário de término em segundos)
  • Alto-falante (etiqueta do alto-falante)

O código a seguir mostra um exemplo de nossos resultados:

[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"]

limpar

Você pode definir uma política de escalabilidade como zero definindo MinCapacity como 0; inferência assíncrona permite escalar automaticamente para zero sem solicitações. Você não precisa excluir o endpoint, ele Escalas do zero quando necessário novamente, reduzindo custos quando não estiver em uso. Veja o seguinte código:

# 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
)

Se você deseja excluir o endpoint, use o seguinte código:

async_predictor.delete_endpoint(async_endpoint_name)

Benefícios da implantação assíncrona de endpoint

Esta solução oferece os seguintes benefícios:

  • A solução pode lidar com eficiência com arquivos de áudio múltiplos ou grandes.
  • Este exemplo usa uma única instância para demonstração. Se quiser usar esta solução para centenas ou milhares de vídeos e usar um endpoint assíncrono para processar em várias instâncias, você pode usar um política de escala automática, projetado para um grande número de documentos de origem. O escalonamento automático ajusta dinamicamente o número de instâncias provisionadas para um modelo em resposta a alterações na sua carga de trabalho.
  • A solução otimiza recursos e reduz a carga do sistema, separando tarefas de longa duração da inferência em tempo real.

Conclusão

Nesta postagem, fornecemos uma abordagem direta para implantar o modelo de diarização de alto-falante do Hugging Face no SageMaker usando scripts Python. O uso de um endpoint assíncrono fornece um meio eficiente e escalonável de fornecer previsões de diarização como um serviço, acomodando solicitações simultâneas de maneira integrada.

Comece hoje mesmo com a diarização assíncrona de alto-falantes para seus projetos de áudio. Entre em contato nos comentários se tiver alguma dúvida sobre como colocar seu próprio endpoint de diarização assíncrona em funcionamento.


Sobre os autores

Sanjay Tiwary é um arquiteto de soluções especializado em IA/ML que passa seu tempo trabalhando com clientes estratégicos para definir requisitos de negócios, fornecer sessões L300 em torno de casos de uso específicos e projetar aplicativos e serviços de IA/ML que sejam escalonáveis, confiáveis ​​e de alto desempenho. Ele ajudou a lançar e dimensionar o serviço Amazon SageMaker baseado em IA/ML e implementou diversas provas de conceito usando os serviços de IA da Amazon. Ele também desenvolveu a plataforma de análise avançada como parte da jornada de transformação digital.

Kiran Challapalli é um desenvolvedor de negócios de tecnologia profunda no setor público da AWS. Ele tem mais de 8 anos de experiência em IA/ML e 23 anos de experiência geral em desenvolvimento de software e vendas. Kiran ajuda empresas do setor público em toda a Índia a explorar e co-criar soluções baseadas em nuvem que usam tecnologias de IA, ML e IA generativa, incluindo grandes modelos de linguagem.

local_img

Inteligência mais recente

local_img

Fale Conosco

Olá! Como posso ajudá-lo?