Generatieve data-intelligentie

Implementeer een Hugging Face (PyAnnote)-sprekersdiariseringsmodel op Amazon SageMaker als een asynchroon eindpunt | Amazon-webservices

Datum:

Sprekerdiarisatie, een essentieel proces bij audioanalyse, segmenteert een audiobestand op basis van de identiteit van de spreker. Dit bericht gaat dieper in op de integratie van PyAnnote van Hugging Face voor het bijhouden van sprekers Amazon Sage Maker asynchrone eindpunten.

We bieden een uitgebreide handleiding over hoe u oplossingen voor luidsprekersegmentatie en clustering kunt implementeren met behulp van SageMaker in de AWS Cloud. U kunt deze oplossing gebruiken voor toepassingen die te maken hebben met audio-opnamen met meerdere luidsprekers (meer dan 100).

Overzicht oplossingen

Amazon Transcribe is de go-to-service voor sprekersdagboeken in AWS. Voor niet-ondersteunde talen kunt u echter andere modellen gebruiken (in ons geval PyAnnote) die in SageMaker worden geรฏmplementeerd voor gevolgtrekking. Voor korte audiobestanden waarbij de gevolgtrekking maximaal 60 seconden duurt, kunt u gebruiken real-time gevolgtrekking. Langer dan 60 seconden, asynchrone gevolgtrekking moet worden gebruikt. Het extra voordeel van asynchrone inferentie is de kostenbesparing doordat het aantal exemplaren automatisch naar nul wordt geschaald wanneer er geen verzoeken zijn om te verwerken.

Gezicht knuffelen is een populaire open source hub voor machine learning (ML)-modellen. AWS en Hugging Face hebben een vennootschap dat een naadloze integratie via SageMaker mogelijk maakt met een set AWS Deep Learning Containers (DLC's) voor training en gevolgtrekking in PyTorch of TensorFlow, en Hugging Face-schatters en voorspellers voor de SageMaker Python SDK. De functies en mogelijkheden van SageMaker helpen ontwikkelaars en datawetenschappers gemakkelijk aan de slag te gaan met natuurlijke taalverwerking (NLP) op AWS.

De integratie voor deze oplossing omvat het gebruik van het vooraf getrainde sprekersdiariseringsmodel van Hugging Face met behulp van de PyAnnote-bibliotheek. PyAnnote is een open source toolkit geschreven in Python voor het bijhouden van sprekers. Dit model, getraind op de voorbeeldaudiodataset, maakt effectieve sprekerpartitionering in audiobestanden mogelijk. Het model wordt op SageMaker geรฏmplementeerd als een asynchrone eindpuntconfiguratie, waardoor een efficiรซnte en schaalbare verwerking van dagboektaken wordt geboden.

Het volgende diagram illustreert de oplossingsarchitectuur.Oplossingsarchitectuur

Voor dit bericht gebruiken we het volgende audiobestand.

Stereo- of meerkanaalsaudiobestanden worden automatisch gedownmixt naar mono door het middelen van de kanalen. Audiobestanden die met een andere snelheid zijn gesampled, worden bij het laden automatisch opnieuw gesampled naar 16 kHz.

Voorwaarden

Voltooi de volgende vereisten:

  1. Maak een SageMaker-domein.
  2. Zorg ervoor dat uw AWS Identiteits- en toegangsbeheer (IAM)-gebruiker beschikt over de benodigde toegangsrechten voor het maken van een SageMaker-rol.
  3. Zorg ervoor dat het AWS-account een servicequotum heeft voor het hosten van een SageMaker-eindpunt voor een ml.g5.2xlarge-instantie.

Creรซer een modelfunctie voor toegang tot PyAnnote-sprekersdagboeken vanuit Hugging Face

U kunt de Hugging Face Hub gebruiken om toegang te krijgen tot de gewenste vooraf getrainde personen PyAnnote-sprekersdagboekmodel. U gebruikt hetzelfde script voor het downloaden van het modelbestand bij het maken van het SageMaker-eindpunt.

Knuffelend gezicht

Zie de volgende code:

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

Verpak de modelcode

Bereid essentiรซle bestanden voor, zoals inference.py, die de inferentiecode bevat:

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

Bereid een requirements.txt bestand, dat de vereiste Python-bibliotheken bevat die nodig zijn om de gevolgtrekking uit te voeren:

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

Comprimeer ten slotte de inference.py en vereisten.txt-bestanden en sla deze op als model.tar.gz:

!tar zcvf model.tar.gz *

Configureer een SageMaker-model

Definieer een SageMaker-modelbron door de afbeeldings-URI en de modelgegevenslocatie in op te geven Amazon eenvoudige opslagservice (S3) en SageMaker-rol:

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

Upload het model naar Amazon S3

Upload het gecomprimeerde PyAnnote Hugging Face-modelbestand naar een S3-bucket:

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

Maak een asynchroon eindpunt van SageMaker

Configureer een asynchrone eindpunt voor de implementatie van het model op SageMaker met behulp van de meegeleverde asynchrone inferentieconfiguratie:

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

Test het eindpunt

Evalueer de functionaliteit van het eindpunt door een audiobestand te verzenden voor diarisatie en de JSON-uitvoer op te halen die is opgeslagen in het opgegeven S3-uitvoerpad:

# 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

Om deze oplossing op schaal te implementeren, raden we aan om AWS Lambda, Amazon eenvoudige meldingsservice (Amazon SNS), of Amazon Simple Queue-service (Amazon SQS). Deze services zijn ontworpen voor schaalbaarheid, gebeurtenisgestuurde architecturen en efficiรซnt gebruik van bronnen. Ze kunnen helpen het asynchrone inferentieproces los te koppelen van de resultaatverwerking, waardoor u elke component afzonderlijk kunt schalen en bursts van inferentieverzoeken effectiever kunt afhandelen.

Resultaten

Modeluitvoer wordt opgeslagen op s3://sagemaker-xxxx /async_inference/output/. Uit de uitvoer blijkt dat de audio-opname in drie kolommen is gesegmenteerd:

  • Start (starttijd in seconden)
  • Einde (eindtijd in seconden)
  • Luidspreker (luidsprekerlabel)

De volgende code toont een voorbeeld van onze resultaten:

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

Opruimen

U kunt een schaalbeleid op nul instellen door MinCapacity in te stellen op 0; asynchrone gevolgtrekking kunt u zonder verzoeken automatisch naar nul schalen. U hoeft het eindpunt niet te verwijderen balans vanaf nul wanneer het weer nodig is, waardoor de kosten worden verlaagd wanneer deze niet in gebruik zijn. Zie de volgende code:

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

Als u het eindpunt wilt verwijderen, gebruikt u de volgende code:

async_predictor.delete_endpoint(async_endpoint_name)

Voordelen van asynchrone eindpuntimplementatie

Deze oplossing biedt de volgende voordelen:

  • De oplossing kan efficiรซnt meerdere of grote audiobestanden verwerken.
  • In dit voorbeeld wordt รฉรฉn exemplaar gebruikt voor demonstratie. Als u deze oplossing voor honderden of duizenden video's wilt gebruiken en een asynchroon eindpunt wilt gebruiken voor de verwerking van meerdere exemplaren, kunt u een beleid voor automatisch schalen, dat is ontworpen voor een groot aantal brondocumenten. Automatisch schalen past dynamisch het aantal exemplaren aan dat voor een model is ingericht als reactie op wijzigingen in uw werklast.
  • De oplossing optimaliseert bronnen en vermindert de systeembelasting door langlopende taken te scheiden van realtime gevolgtrekkingen.

Conclusie

In dit bericht hebben we een eenvoudige aanpak gegeven om het sprekersdiariseringsmodel van Hugging Face op SageMaker te implementeren met behulp van Python-scripts. Het gebruik van een asynchroon eindpunt biedt een efficiรซnte en schaalbare manier om dagboekvoorspellingen als een service te leveren, waarbij gelijktijdige aanvragen naadloos kunnen worden geaccommodeerd.

Ga vandaag nog aan de slag met asynchrone luidsprekerdialoog voor uw audioprojecten. Neem contact op in de reacties als u vragen heeft over het operationeel krijgen van uw eigen asynchrone dagboekbeheer-eindpunt.


Over de auteurs

Sanjay Tiwary is een Specialist Solutions Architect AI/ML die zijn tijd besteedt aan het werken met strategische klanten om zakelijke vereisten te definiรซren, L300-sessies te verzorgen rond specifieke gebruiksscenario's en AI/ML-applicaties en -diensten te ontwerpen die schaalbaar, betrouwbaar en performant zijn. Hij heeft geholpen bij het lanceren en opschalen van de door AI/ML aangedreven Amazon SageMaker-service en heeft verschillende proofs of concept geรฏmplementeerd met behulp van Amazon AI-services. Hij heeft ook het geavanceerde analyseplatform ontwikkeld als onderdeel van het digitale transformatietraject.

Kiran Challapalli is een deep tech business developer bij de AWS publieke sector. Hij heeft meer dan 8 jaar ervaring in AI/ML en 23 jaar algemene softwareontwikkeling en verkoopervaring. Kiran helpt bedrijven in de publieke sector in heel India bij het verkennen en co-creรซren van cloudgebaseerde oplossingen die gebruik maken van AI, ML en generatieve AI, inclusief grote taalmodellen, technologieรซn.

spot_img

Laatste intelligentie

spot_img

Chat met ons

Hallo daar! Hoe kan ik u helpen?