Intelligence de données générative

Déployer un modèle de diarisation des locuteurs Hugging Face (PyAnnote) sur Amazon SageMaker en tant que point de terminaison asynchrone | Services Web Amazon

Date :

La diarisation du locuteur, un processus essentiel dans l'analyse audio, segmente un fichier audio en fonction de l'identité du locuteur. Cet article explore l'intégration de PyAnnote de Hugging Face pour la diarisation des locuteurs avec Amazon Sage Maker points de terminaison asynchrones.

Nous fournissons un guide complet sur la façon de déployer des solutions de segmentation et de clustering d'enceintes à l'aide de SageMaker sur le cloud AWS. Vous pouvez utiliser cette solution pour les applications traitant d'enregistrements audio multi-haut-parleurs (plus de 100).

Vue d'ensemble de la solution

Amazon Transcribe est le service incontournable pour la diarisation des locuteurs dans AWS. Cependant, pour les langages non pris en charge, vous pouvez utiliser d'autres modèles (dans notre cas, PyAnnote) qui seront déployés dans SageMaker pour l'inférence. Pour les fichiers audio courts où l'inférence prend jusqu'à 60 secondes, vous pouvez utiliser inférence en temps réel. Pendant plus de 60 secondes, asynchrone l’inférence doit être utilisée. L'avantage supplémentaire de l'inférence asynchrone réside dans les économies de coûts réalisées grâce à la mise à l'échelle automatique du nombre d'instances à zéro lorsqu'il n'y a aucune requête à traiter.

Étreindre le visage est une plateforme open source populaire pour les modèles d'apprentissage automatique (ML). AWS et Hugging Face ont un partenariat qui permet une intégration transparente via SageMaker avec un ensemble de conteneurs AWS Deep Learning (DLC) pour la formation et l'inférence dans PyTorch ou TensorFlow, ainsi que des estimateurs et prédicteurs Hugging Face pour le SDK Python de SageMaker. Les fonctionnalités et capacités de SageMaker aident les développeurs et les data scientists à se lancer facilement dans le traitement du langage naturel (NLP) sur AWS.

L'intégration de cette solution implique l'utilisation du modèle de diarisation des locuteurs pré-entraînés de Hugging Face à l'aide du Bibliothèque PyAnnote. PyAnnote est une boîte à outils open source écrite en Python pour la diarisation des locuteurs. Ce modèle, formé sur l’échantillon de données audio, permet un partitionnement efficace des haut-parleurs dans les fichiers audio. Le modèle est déployé sur SageMaker en tant que configuration de point de terminaison asynchrone, offrant un traitement efficace et évolutif des tâches de diarisation.

Le diagramme suivant illustre l'architecture de la solution.Architecture de la solution

Pour cet article, nous utilisons le fichier audio suivant.

Les fichiers audio stéréo ou multicanaux sont automatiquement mixés en mono en faisant la moyenne des canaux. Les fichiers audio échantillonnés à une fréquence différente sont automatiquement rééchantillonnés à 16 kHz lors du chargement.

Pré-requis

Remplissez les conditions préalables suivantes :

  1. Créer un domaine SageMaker.
  2. Assurez-vous que Gestion des identités et des accès AWS (IAM) dispose des autorisations d'accès nécessaires pour créer un Rôle SageMaker.
  3. Assurez-vous que le compte AWS dispose d'un quota de service pour héberger un point de terminaison SageMaker pour une instance ml.g5.2xlarge.

Créer une fonction de modèle pour accéder à la diarisation des locuteurs PyAnnote à partir de Hugging Face

Vous pouvez utiliser le Hugging Face Hub pour accéder au pré-entraînement souhaité. Modèle de diarisation des locuteurs PyAnnote. Vous utilisez le même script pour télécharger le fichier modèle lors de la création du point de terminaison SageMaker.

Visage étreignant

Voir le code suivant:

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

Emballez le code du modèle

Préparez des fichiers essentiels comme inference.py, qui contient le code d'inférence :

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

Préparer un requirements.txt fichier, qui contient les bibliothèques Python requises pour exécuter l'inférence :

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

Enfin, compressez le inference.py et requirejs.txt et enregistrez-le sous model.tar.gz:

!tar zcvf model.tar.gz *

Configurer un modèle SageMaker

Définissez une ressource de modèle SageMaker en spécifiant l'URI de l'image et l'emplacement des données du modèle dans Service de stockage simple Amazon (S3) et rôle 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}")

Téléchargez le modèle sur Amazon S3

Téléchargez le fichier de modèle PyAnnote Hugging Face compressé dans un compartiment S3 :

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

Créer un point de terminaison asynchrone SageMaker

Configurez un point de terminaison asynchrone pour déployer le modèle sur SageMaker à l'aide de la configuration d'inférence asynchrone fournie :

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

Tester le point de terminaison

Évaluez la fonctionnalité du point de terminaison en envoyant un fichier audio pour diarisation et en récupérant la sortie JSON stockée dans le chemin de sortie S3 spécifié :

# 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

Pour déployer cette solution à grande échelle, nous vous suggérons d'utiliser AWS Lambda, Service de notification simple d'Amazon (Amazon SNS), ou Service Amazon Simple Queue (AmazonSQS). Ces services sont conçus pour l'évolutivité, les architectures basées sur les événements et l'utilisation efficace des ressources. Ils peuvent aider à dissocier le processus d'inférence asynchrone du traitement des résultats, vous permettant ainsi de mettre à l'échelle chaque composant indépendamment et de gérer plus efficacement les rafales de demandes d'inférence.

Résultats

La sortie du modèle est stockée dans s3://sagemaker-xxxx /async_inference/output/. Le résultat montre que l'enregistrement audio a été segmenté en trois colonnes :

  • Début (heure de début en secondes)
  • Fin (heure de fin en secondes)
  • Haut-parleur (étiquette du haut-parleur)

Le code suivant montre un exemple de nos résultats :

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

Nettoyer

Vous pouvez définir une stratégie de mise à l'échelle sur zéro en définissant MinCapacity sur 0 ; inférence asynchrone vous permet de passer automatiquement à zéro sans aucune demande. Vous n'avez pas besoin de supprimer le point de terminaison, il Balance de zéro lorsqu'il est à nouveau nécessaire, réduisant ainsi les coûts lorsqu'il n'est pas utilisé. Voir le code suivant :

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

Si vous souhaitez supprimer le point de terminaison, utilisez le code suivant :

async_predictor.delete_endpoint(async_endpoint_name)

Avantages du déploiement asynchrone des points de terminaison

Cette solution offre les avantages suivants :

  • La solution peut gérer efficacement des fichiers audio multiples ou volumineux.
  • Cet exemple utilise une seule instance pour la démonstration. Si vous souhaitez utiliser cette solution pour des centaines ou des milliers de vidéos et utiliser un point de terminaison asynchrone pour traiter plusieurs instances, vous pouvez utiliser un stratégie de mise à l'échelle automatique, conçu pour un grand nombre de documents sources. La mise à l'échelle automatique ajuste dynamiquement le nombre d'instances provisionnées pour un modèle en réponse aux modifications de votre charge de travail.
  • La solution optimise les ressources et réduit la charge du système en séparant les tâches de longue durée de l'inférence en temps réel.

Conclusion

Dans cet article, nous avons proposé une approche simple pour déployer le modèle de diarisation des locuteurs de Hugging Face sur SageMaker à l'aide de scripts Python. L'utilisation d'un point de terminaison asynchrone fournit un moyen efficace et évolutif de fournir des prédictions de diarisation en tant que service, répondant ainsi aux demandes simultanées de manière transparente.

Commencez dès aujourd'hui avec la diarisation asynchrone des haut-parleurs pour vos projets audio. Contactez-nous dans les commentaires si vous avez des questions sur la mise en place et le fonctionnement de votre propre point de terminaison de diarisation asynchrone.


À propos des auteurs

Sanjay Tiwary est un architecte de solutions spécialisé IA/ML qui passe son temps à travailler avec des clients stratégiques pour définir les exigences commerciales, proposer des sessions L300 autour de cas d'utilisation spécifiques et concevoir des applications et des services IA/ML évolutifs, fiables et performants. Il a contribué au lancement et à la mise à l'échelle du service Amazon SageMaker alimenté par l'IA/ML et a mis en œuvre plusieurs preuves de concept à l'aide des services Amazon AI. Il a également développé la plateforme d'analyse avancée dans le cadre du parcours de transformation numérique.

Kiran Challapalli est un développeur commercial de technologies profondes auprès du secteur public AWS. Il possède plus de 8 ans d'expérience en IA/ML et 23 ans d'expérience globale en développement de logiciels et en vente. Kiran aide les entreprises du secteur public à travers l'Inde à explorer et co-créer des solutions basées sur le cloud qui utilisent les technologies d'IA, de ML et d'IA générative, y compris de grands modèles de langage.

spot_img

Dernières informations

spot_img

Discutez avec nous

Salut! Comment puis-je t'aider?