Generative Datenintelligenz

Stellen Sie ein Hugging Face (PyAnnote)-Sprechertagebuchmodell auf Amazon SageMaker als asynchronen Endpunkt bereit | Amazon Web Services

Datum:

Bei der Sprecherdiagnostik, einem wesentlichen Prozess in der Audioanalyse, wird eine Audiodatei anhand der Sprecheridentität segmentiert. Dieser Beitrag befasst sich mit der Integration von PyAnnote von Hugging Face für die Tagebuchaufzeichnung von Sprechern Amazon Sage Maker asynchrone Endpunkte.

Wir bieten eine umfassende Anleitung zur Bereitstellung von Sprechersegmentierungs- und Clustering-Lösungen mit SageMaker in der AWS Cloud. Sie können diese Lösung für Anwendungen verwenden, die sich mit Audioaufnahmen mit mehreren Lautsprechern (über 100) befassen.

Lösungsüberblick

Amazon Transcribe ist der Service der Wahl für die Aufzeichnung von Sprechertagebüchern in AWS. Für nicht unterstützte Sprachen können Sie jedoch andere Modelle (in unserem Fall PyAnnote) verwenden, die in SageMaker zur Inferenz bereitgestellt werden. Für kurze Audiodateien, bei denen die Inferenz bis zu 60 Sekunden dauert, können Sie verwenden Echtzeit-Inferenz. Länger als 60 Sekunden asynchron Inferenz sollte verwendet werden. Der zusätzliche Vorteil der asynchronen Inferenz besteht in den Kosteneinsparungen durch die automatische Skalierung der Instanzanzahl auf Null, wenn keine Anforderungen zu verarbeiten sind.

Gesicht umarmen ist ein beliebter Open-Source-Hub für Modelle des maschinellen Lernens (ML). AWS und Hugging Face haben eine Partnerschaft Dies ermöglicht eine nahtlose Integration durch SageMaker mit einer Reihe von AWS Deep Learning Containern (DLCs) für Training und Inferenz in PyTorch oder TensorFlow sowie Hugging Face-Schätzern und -Prädiktoren für das SageMaker Python SDK. Die Funktionen und Fähigkeiten von SageMaker erleichtern Entwicklern und Datenwissenschaftlern den einfachen Einstieg in die Verarbeitung natürlicher Sprache (NLP) auf AWS.

Die Integration für diese Lösung umfasst die Verwendung des vorab trainierten Sprecher-Tagebuchmodells von Hugging Face unter Verwendung von PyAnnote-Bibliothek. PyAnnote ist ein in Python geschriebenes Open-Source-Toolkit zur Tagebuchaufzeichnung von Sprechern. Dieses anhand des Beispiel-Audiodatensatzes trainierte Modell ermöglicht eine effektive Sprecherpartitionierung in Audiodateien. Das Modell wird auf SageMaker als asynchrones Endpunkt-Setup bereitgestellt und ermöglicht eine effiziente und skalierbare Verarbeitung von Diarisierungsaufgaben.

Das folgende Diagramm zeigt die Lösungsarchitektur.Lösungsarchitektur

Für diesen Beitrag verwenden wir die folgende Audiodatei.

Stereo- oder Mehrkanal-Audiodateien werden durch Mittelung der Kanäle automatisch auf Mono heruntergemischt. Audiodateien, die mit einer anderen Rate abgetastet wurden, werden beim Laden automatisch auf 16 kHz neu abgetastet.

Voraussetzungen:

Erfüllen Sie die folgenden Voraussetzungen:

  1. Erstellen Sie eine SageMaker-Domäne.
  2. Stellen Sie sicher, AWS Identity and Access Management and (IAM)-Benutzer verfügt über die erforderlichen Zugriffsberechtigungen zum Erstellen eines SageMaker-Rolle.
  3. Stellen Sie sicher, dass das AWS-Konto über ein Servicekontingent zum Hosten eines SageMaker-Endpunkts für eine ml.g5.2xlarge-Instanz verfügt.

Erstellen Sie eine Modellfunktion für den Zugriff auf die PyAnnote-Sprechertagebücher von Hugging Face

Über den Hugging Face Hub können Sie auf die gewünschten vorab trainierten Inhalte zugreifen PyAnnote-Sprechertagebuchmodell. Sie verwenden dasselbe Skript zum Herunterladen der Modelldatei, wenn Sie den SageMaker-Endpunkt erstellen.

Umarmendes Gesicht

Siehe folgenden 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

Verpacken Sie den Modellcode

Bereiten Sie wichtige Dateien wie inference.py vor, die den Inferenzcode enthalten:

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

Bereite ein ..... vor requirements.txt Datei, die die erforderlichen Python-Bibliotheken enthält, die zum Ausführen der Inferenz erforderlich sind:

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

Zum Schluss komprimieren Sie die inference.py und „requirements.txt“-Dateien und speichern Sie sie unter model.tar.gz:

!tar zcvf model.tar.gz *

Konfigurieren Sie ein SageMaker-Modell

Definieren Sie eine SageMaker-Modellressource, indem Sie den Bild-URI und den Speicherort der Modelldaten angeben Amazon Simple Storage-Service (S3) und SageMaker-Rolle:

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

Laden Sie das Modell auf Amazon S3 hoch

Laden Sie die gezippte PyAnnote Hugging Face-Modelldatei in einen S3-Bucket hoch:

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

Erstellen Sie einen asynchronen SageMaker-Endpunkt

Konfigurieren Sie einen asynchronen Endpunkt für die Bereitstellung des Modells auf SageMaker mithilfe der bereitgestellten asynchronen Inferenzkonfiguration:

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

Testen Sie den Endpunkt

Bewerten Sie die Endpunktfunktionalität, indem Sie eine Audiodatei zur Diarisierung senden und die JSON-Ausgabe abrufen, die im angegebenen S3-Ausgabepfad gespeichert ist:

# 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

Um diese Lösung im großen Maßstab bereitzustellen, empfehlen wir die Verwendung AWS Lambda, Amazon Simple Notification Service (Amazon SNS), oder Amazon Simple Queue-Dienst (Amazon SQS). Diese Dienste sind auf Skalierbarkeit, ereignisgesteuerte Architekturen und effiziente Ressourcennutzung ausgelegt. Sie können dazu beitragen, den asynchronen Inferenzprozess von der Ergebnisverarbeitung zu entkoppeln, sodass Sie jede Komponente unabhängig skalieren und eine Reihe von Inferenzanforderungen effektiver verarbeiten können.

Die Ergebnisse

Die Modellausgabe wird unter gespeichert s3://sagemaker-xxxx /async_inference/output/. Die Ausgabe zeigt, dass die Audioaufnahme in drei Spalten segmentiert wurde:

  • Start (Startzeit in Sekunden)
  • Ende (Endzeit in Sekunden)
  • Sprecher (Sprecherbezeichnung)

Der folgende Code zeigt ein Beispiel unserer Ergebnisse:

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

Aufräumen

Sie können eine Skalierungsrichtlinie auf Null setzen, indem Sie MinCapacity auf 0 setzen; asynchrone Inferenz ermöglicht die automatische Skalierung auf Null, ohne dass Anfragen erforderlich sind. Sie müssen den Endpunkt nicht löschen, sondern ihn Waage bei Bedarf wieder von Null, wodurch die Kosten bei Nichtgebrauch gesenkt werden. Siehe den folgenden 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
)

Wenn Sie den Endpunkt löschen möchten, verwenden Sie den folgenden Code:

async_predictor.delete_endpoint(async_endpoint_name)

Vorteile der asynchronen Endpunktbereitstellung

Diese Lösung bietet folgende Vorteile:

  • Die Lösung kann mehrere oder große Audiodateien effizient verarbeiten.
  • In diesem Beispiel wird eine einzelne Instanz zur Demonstration verwendet. Wenn Sie diese Lösung für Hunderte oder Tausende von Videos verwenden und einen asynchronen Endpunkt für die Verarbeitung über mehrere Instanzen hinweg verwenden möchten, können Sie einen verwenden Auto Scaling-Richtlinie, das für eine große Anzahl von Quelldokumenten konzipiert ist. Die automatische Skalierung passt die Anzahl der für ein Modell bereitgestellten Instanzen dynamisch als Reaktion auf Änderungen in Ihrer Arbeitslast an.
  • Die Lösung optimiert Ressourcen und reduziert die Systemlast, indem sie lang laufende Aufgaben von der Echtzeitinferenz trennt.

Zusammenfassung

In diesem Beitrag haben wir einen unkomplizierten Ansatz zur Bereitstellung des Sprecherdialogmodells von Hugging Face auf SageMaker mithilfe von Python-Skripten bereitgestellt. Die Verwendung eines asynchronen Endpunkts bietet eine effiziente und skalierbare Möglichkeit, Diarisierungsvorhersagen als Dienst bereitzustellen und gleichzeitig gleichzeitige Anforderungen nahtlos zu verarbeiten.

Beginnen Sie noch heute mit der asynchronen Lautsprecherdialogisierung für Ihre Audioprojekte. Wenn Sie Fragen zur Inbetriebnahme Ihres eigenen asynchronen Diarisierungsendpunkts haben, schreiben Sie uns in die Kommentare.


Über die Autoren

Sanjay Tiwary ist ein spezialisierter Lösungsarchitekt für KI/ML, der seine Zeit damit verbringt, mit strategischen Kunden zusammenzuarbeiten, um Geschäftsanforderungen zu definieren, L300-Sitzungen zu bestimmten Anwendungsfällen bereitzustellen und KI/ML-Anwendungen und -Dienste zu entwerfen, die skalierbar, zuverlässig und leistungsfähig sind. Er hat bei der Einführung und Skalierung des KI/ML-gestützten Amazon SageMaker-Dienstes mitgeholfen und mehrere Proofs of Concept mithilfe von Amazon AI-Diensten implementiert. Im Rahmen der digitalen Transformation hat er außerdem die Advanced-Analytics-Plattform entwickelt.

Kiran Challapalli ist ein Deep-Tech-Geschäftsentwickler im öffentlichen AWS-Sektor. Er verfügt über mehr als 8 Jahre Erfahrung im Bereich KI/ML und insgesamt 23 Jahre Erfahrung in der Softwareentwicklung und im Vertrieb. Kiran unterstützt Unternehmen des öffentlichen Sektors in ganz Indien bei der Erforschung und Mitentwicklung cloudbasierter Lösungen, die KI-, ML- und generative KI-Technologien – einschließlich großer Sprachmodelle – nutzen.

spot_img

Neueste Intelligenz

spot_img

Chat mit uns

Hallo! Wie kann ich dir helfen?