אינטליגנציה של נתונים גנרטיביים

פרוס מודל יומן רמקול של Hugging Face (PyAnnote) באמזון SageMaker כנקודת קצה אסינכרונית | שירותי האינטרנט של אמזון

תאריך:

יומן רמקול, תהליך חיוני בניתוח שמע, מפלח קובץ שמע על סמך זהות הדובר. פוסט זה מתעמק בשילוב PyAnnote של Hugging Face עבור יומן דובר איתו אמזון SageMaker נקודות קצה אסינכרוניות.

אנו מספקים מדריך מקיף כיצד לפרוס פתרונות פילוח רמקולים ואשכולות באמצעות SageMaker בענן AWS. אתה יכול להשתמש בפתרון זה עבור יישומים העוסקים בהקלטות אודיו מרובי רמקולים (מעל 100).

סקירת פתרונות

אמזון תעתיק הוא השירות הרצוי לתיאום דוברים ב-AWS. עם זאת, עבור שפות שאינן נתמכות, אתה יכול להשתמש בדגמים אחרים (במקרה שלנו, PyAnnote) שייפרסו ב- SageMaker להסקת מסקנות. עבור קבצי אודיו קצרים שבהם ההסקה נמשכת עד 60 שניות, אתה יכול להשתמש מסקנות בזמן אמת. במשך יותר מ-60 שניות, אסינכרוני יש להשתמש בהסקה. היתרון הנוסף של הסקה אסינכרונית הוא החיסכון בעלויות על ידי שינוי קנה מידה אוטומטי של ספירת המופעים לאפס כאשר אין בקשות לעיבוד.

פנים מחבקות הוא מרכז קוד פתוח פופולרי למודלים של למידת מכונה (ML). ל-AWS ול-Huging Face יש שׁוּתָפוּת המאפשרת אינטגרציה חלקה דרך SageMaker עם קבוצה של מיכלי למידה עמוקה של AWS (DLC) לאימון והסקת הסקה ב- PyTorch או TensorFlow, ומעריכים וחיזאים של Hugging Face עבור SageMaker Python SDK. התכונות והיכולות של SageMaker עוזרות למפתחים ולמדעני נתונים להתחיל בקלות עם עיבוד שפה טבעית (NLP) ב-AWS.

האינטגרציה של פתרון זה כרוכה בשימוש במודל יומן הרמקולים המיומן מראש של Hugging Face באמצעות ספריית PyAnnote. PyAnnote היא ערכת כלים בקוד פתוח שנכתבה ב-Python לתיאום דובר. מודל זה, שהוכשר על מערך השמע לדוגמה, מאפשר חלוקת רמקולים יעילה בקובצי אודיו. המודל נפרס על SageMaker כהגדרת נקודת קצה אסינכרונית, המספקת עיבוד יעיל וניתן להרחבה של משימות יומן.

התרשים הבא ממחיש את ארכיטקטורת הפתרונות.ארכיטקטורת הפתרונות

עבור פוסט זה, אנו משתמשים בקובץ האודיו הבא.

קבצי אודיו סטריאו או רב-ערוציים עוברים מיקס אוטומטי למונו על ידי ממוצע של הערוצים. קבצי אודיו שנדגמו בקצב שונה נדגמים מחדש ל-16kHz באופן אוטומטי עם הטעינה.

תנאים מוקדמים

השלם את התנאים המוקדמים הבאים:

  1. צור דומיין של SageMaker.
  2. ודא שלך AWS זהות וניהול גישה למשתמש (IAM) יש את הרשאות הגישה הדרושות ליצירת א תפקיד SageMaker.
  3. ודא שלחשבון AWS יש מכסת שירות לאירוח נקודת קצה של SageMaker עבור מופע ml.g5.2xlarge.

צור פונקציית דגם לגישה ליומן רמקול PyAnnote מ-Huging Face

אתה יכול להשתמש ב-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

הגדר משאב מודל של SageMaker על ידי ציון URI התמונה, מיקום נתוני המודל שירות אחסון פשוט של אמזון (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}")

העלה את הדגם לאמזון 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,
)

בדוק את נקודת הסיום

הערך את הפונקציונליות של נקודת הקצה על ידי שליחת קובץ שמע לתיאום ואחזור פלט JSON המאוחסן בנתיב הפלט שצוין S3:

# 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 למבדה, שירות התראה פשוט של אמזון (Amazon SNS), או שירות תורים פשוט של אמזון (Amazon 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)

היתרונות של פריסת נקודת קצה אסינכרונית

פתרון זה מציע את היתרונות הבאים:

  • הפתרון יכול לטפל ביעילות במספר קבצי שמע או גדולים.
  • דוגמה זו משתמשת במופע בודד להדגמה. אם ברצונך להשתמש בפתרון זה עבור מאות או אלפי סרטונים ולהשתמש בנקודת קצה אסינכרונית לעיבוד במספר מופעים, תוכל להשתמש ב מדיניות קנה מידה אוטומטי, אשר מיועד למספר רב של מסמכי מקור. קנה מידה אוטומטי מתאים באופן דינמי את מספר המופעים המוגדרים עבור מודל בתגובה לשינויים בעומס העבודה שלך.
  • הפתרון מייעל את המשאבים ומפחית את עומס המערכת על ידי הפרדת משימות ארוכות טווח מהסקת זמן אמת.

סיכום

בפוסט זה, סיפקנו גישה פשוטה לפריסת מודל יומן הרמקולים של Hugging Face ב- SageMaker באמצעות סקריפטים של Python. שימוש בנקודת קצה אסינכרונית מספק אמצעי יעיל וניתן להרחבה לספק תחזיות יומן כשירות, תוך מענה לבקשות במקביל בצורה חלקה.

התחל היום עם יומן רמקולים אסינכרוני עבור פרויקטי האודיו שלך. צור קשר בהערות אם יש לך שאלות כלשהן לגבי הפעלת נקודת קצה יומן אסינכרוני משלך.


על הכותבים

סנג'אי טיוארי הוא אדריכל פתרונות מומחה AI/ML שמבלה את זמנו בעבודה עם לקוחות אסטרטגיים כדי להגדיר דרישות עסקיות, לספק מפגשי L300 סביב מקרי שימוש ספציפיים ולתכנן יישומים ושירותים של AI/ML הניתנים להרחבה, אמינים ובעלי ביצועים. הוא עזר להשיק ולהרחיב את שירות Amazon SageMaker המופעל על ידי AI/ML והטמיע מספר הוכחות לקונספט באמצעות שירותי AI של אמזון. הוא גם פיתח את פלטפורמת האנליטיקה המתקדמת כחלק ממסע הטרנספורמציה הדיגיטלית.

קירן צ'לפאלי הוא מפתח עסקי בטכנולוגיה עמוקה במגזר הציבורי של AWS. יש לו יותר מ-8 שנות ניסיון ב-AI/ML ו-23 שנות ניסיון כולל בפיתוח תוכנה ובמכירות. Kiran עוזרת לעסקים במגזר הציבורי ברחבי הודו לחקור וליצור במשותף פתרונות מבוססי ענן המשתמשים בטכנולוגיות בינה מלאכותית, ML ובינה מלאכותית גנרטיבית - כולל מודלים של שפות גדולות.

ספוט_ימג

המודיעין האחרון

ספוט_ימג

דבר איתנו

שלום שם! איך אני יכול לעזור לך?