생성 데이터 인텔리전스

Amazon SageMaker에 Hugging Face(PyAnnote) 스피커 분할 모델을 비동기 엔드포인트로 배포 | 아마존 웹 서비스

시간

오디오 분석의 필수 프로세스인 화자 분할은 화자 ID를 기반으로 오디오 파일을 분할합니다. 이 게시물에서는 화자 분할을 위해 Hugging Face의 PyAnnote를 통합하는 방법을 살펴봅니다. 아마존 세이지 메이커 비동기 엔드포인트.

AWS 클라우드에서 SageMaker를 사용하여 스피커 분할 및 클러스터링 솔루션을 배포하는 방법에 대한 포괄적인 가이드를 제공합니다. 다중 스피커(100개 이상) 오디오 녹음을 처리하는 애플리케이션에 이 솔루션을 사용할 수 있습니다.

솔루션 개요

아마존 전사 AWS의 화자 분할을 위한 유용한 서비스입니다. 그러나 지원되지 않는 언어의 경우 추론을 위해 SageMaker에 배포될 다른 모델(이 경우 PyAnnote)을 사용할 수 있습니다. 추론에 최대 60초가 걸리는 짧은 오디오 파일의 경우 다음을 사용할 수 있습니다. 실시간 추론. 60초 이상 지속되면, 비 동시성의 추론을 사용해야 한다. 비동기 추론의 또 다른 이점은 처리할 요청이 없을 때 인스턴스 수를 0으로 자동 조정하여 비용을 절감한다는 것입니다.

포옹하는 얼굴 기계 학습(ML) 모델을 위한 인기 있는 오픈 소스 허브입니다. AWS와 Hugging Face에는 파트너십 이를 통해 SageMaker를 통해 PyTorch 또는 TensorFlow의 훈련 및 추론을 위한 AWS Deep Learning Containers(DLC) 세트, SageMaker Python SDK용 Hugging Face 추정기 및 예측기와 원활하게 통합할 수 있습니다. SageMaker 기능과 기능은 개발자와 데이터 과학자가 AWS에서 자연어 처리(NLP)를 쉽게 시작할 수 있도록 도와줍니다.

이 솔루션의 통합에는 다음을 사용하여 Hugging Face의 사전 훈련된 화자 분할 모델을 사용하는 것이 포함됩니다. PyAnnote 라이브러리. PyAnnote는 화자 분할을 위해 Python으로 작성된 오픈 소스 툴킷입니다. 샘플 오디오 데이터세트로 훈련된 이 모델은 오디오 파일에서 효과적인 화자 분할을 가능하게 합니다. 이 모델은 비동기 엔드포인트 설정으로 SageMaker에 배포되어 효율적이고 확장 가능한 분할 작업 처리를 제공합니다.

다음 다이어그램은 솔루션 아키텍처를 보여줍니다.솔루션 아키텍처

이 게시물에서는 다음 오디오 파일을 사용합니다.

스테레오 또는 다중 채널 오디오 파일은 채널 평균을 계산하여 자동으로 모노로 다운믹스됩니다. 다른 속도로 샘플링된 오디오 파일은 로드 시 자동으로 16kHz로 리샘플링됩니다.

사전 조건

다음 전제 조건을 완료하십시오.

  1. SageMaker 도메인 생성.
  2. 확인 당신의 AWS 자격 증명 및 액세스 관리 (IAM) 사용자는 생성에 필요한 액세스 권한을 가지고 있습니다. SageMaker 역할.
  3. AWS 계정에 ml.g5.2xlarge 인스턴스에 대한 SageMaker 엔드포인트를 호스팅하기 위한 서비스 할당량이 있는지 확인하십시오.

Hugging Face에서 PyAnnote 스피커 분할에 액세스하기 위한 모델 함수 생성

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 및 요구 사항.txt 파일을 저장하고 다음 이름으로 저장합니다. model.tar.gz:

!tar zcvf model.tar.gz *

SageMaker 모델 구성

이미지 URI, 모델 데이터 위치를 지정하여 SageMaker 모델 리소스를 정의합니다. 아마존 단순 스토리지 서비스 (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}")

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

엔드포인트 테스트

분할을 위해 오디오 파일을 보내고 지정된 S3 출력 경로에 저장된 JSON 출력을 검색하여 엔드포인트 기능을 평가합니다.

# 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 람다, 아마존 단순 알림 서비스 (아마존 SNS) 또는 아마존 단순 대기열 서비스 (아마존 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으로 설정하여 조정 정책을 XNUMX으로 설정할 수 있습니다. 비동기 추론 요청 없이 자동으로 0으로 크기를 조정할 수 있습니다. 엔드포인트를 삭제할 필요는 없습니다. 저울 다시 필요할 때 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)

비동기 엔드포인트 배포의 이점

이 솔루션은 다음과 같은 이점을 제공합니다.

  • 이 솔루션은 여러 개의 또는 큰 오디오 파일을 효율적으로 처리할 수 있습니다.
  • 이 예에서는 데모를 위해 단일 인스턴스를 사용합니다. 수백 또는 수천 개의 비디오에 이 솔루션을 사용하고 비동기 엔드포인트를 사용하여 여러 인스턴스에서 처리하려는 경우 자동 확장 정책, 이는 다수의 소스 문서용으로 설계되었습니다. Auto Scaling은 워크로드 변화에 따라 모델에 프로비저닝된 인스턴스 수를 동적으로 조정합니다.
  • 이 솔루션은 실시간 추론에서 장기 실행 작업을 분리하여 리소스를 최적화하고 시스템 부하를 줄입니다.

결론

이 게시물에서는 Python 스크립트를 사용하여 SageMaker에 Hugging Face의 화자 분할 모델을 배포하는 간단한 접근 방식을 제공했습니다. 비동기 엔드포인트를 사용하면 분할 예측을 서비스로 제공하고 동시 요청을 원활하게 수용할 수 있는 효율적이고 확장 가능한 수단을 제공합니다.

오디오 프로젝트를 위한 비동기식 스피커 분할을 지금 시작해 보세요. 자체 비동기 분할 엔드포인트를 설정하고 실행하는 방법에 대해 궁금한 점이 있으면 댓글을 통해 문의하세요.


저자에 관하여

산제이 티와리 전략적 고객과 협력하여 비즈니스 요구 사항을 정의하고 특정 사용 사례에 대한 L300 세션을 제공하며 확장 가능하고 안정적이며 성능이 뛰어난 AI/ML 애플리케이션 및 서비스를 설계하는 데 시간을 보내는 전문 솔루션 설계자 AI/ML입니다. 그는 AI/ML 기반 Amazon SageMaker 서비스의 출시 및 확장을 도왔으며 Amazon AI 서비스를 사용하여 여러 가지 개념 증명을 구현했습니다. 그는 또한 디지털 혁신 여정의 일환으로 고급 분석 플랫폼을 개발했습니다.

키란 찰라팔리 AWS 공공 부문의 심층 기술 비즈니스 개발자입니다. 그는 AI/ML 분야에서 8년 이상의 경험을 갖고 있으며 23년의 전반적인 소프트웨어 개발 및 영업 경험을 보유하고 있습니다. Kiran은 인도 전역의 공공 부문 기업이 AI, ML, 생성 AI(대규모 언어 모델 포함) 기술을 사용하는 클라우드 기반 솔루션을 탐색하고 공동 생성할 수 있도록 지원합니다.

spot_img

최신 인텔리전스

spot_img

우리와 함께 채팅

안녕하세요! 어떻게 도와 드릴까요?