Hugging Face Inference Endpoints에서 Speech-to-Speech 배포

Hugging Face는 Inference Endpoints에서 커스텀 Docker 이미지를 사용해 Speech-to-Speech (S2S) 파이프라인을 배포하는 방법을 소개했습니다. 이 접근 방식은 확장 가능한 GPU 인프라를 활용해 기본 하드웨어를 관리하지 않고도 낮은 지연 시간으로 계산 집약적인 멀티 모델 파이프라인을 실행할 수 있게 합니다.

Speech-to-Speech (S2S) 파이프라인

Speech-to-Speech 프로젝트는 Transformers 라이브러리의 모델을 사용해 계단식 파이프라인을 구현합니다. 이 시스템은 사용자가 말을 하면 네 가지 주요 구성 요소를 통해 합성된 음성 응답을 받을 수 있게 합니다:

  1. Voice Activity Detection (VAD)
  2. Speech to Text (STT)
  3. Language Model (LM)
  4. Text to Speech (TTS)

이 파이프라인은 영어, 프랑스어, 스페인어, 중국어, 일본어, 한국어를 지원하며, 자동 언어 감지를 위한 auto 플래그를 포함합니다.

커스텀 Docker 이미지로 배포하기

S2S는 상당한 계산 자원을 필요로 하기 때문에, Hugging Face는 사전 구축된 모델이나 커스텀 핸들러 대신 커스텀 Docker 이미지를 사용한 Inference Endpoints (IE) 활용을 권장합니다. 이 방법은 모든 종속성과 데이터를 이미지 안에 캡슐화함으로써 성능을 최적화합니다.

커스텀 이미지 빌드

배포 이미지를 만들기 위해서는 먼저 huggingface-inference-toolkit 저장소를 클론하여 추론 워크로드에 최적화된 기본 이미지를 설정합니다. 커스터마이징 과정은 다음을 포함합니다:

  • Integrating Code and Data: S2S 코드베이스와 필요한 데이터셋(예: fast-unidic)을 git 서브모듈로 추가합니다. 데이터를 컨테이너에 직접 포함하면 엔드포인트 인스턴스화 시 데이터셋을 다운로드할 필요가 없어 시작 시간이 단축됩니다.
  • Streamlining Dependencies: Dockerfile을 수정해 불필요한 패키지를 제거하고 requirements.txt 설치를 엔트리 포인트가 아닌 빌드 단계로 이동시켜 런타임 전에 종속성이 미리 설치되도록 합니다.

배포 설정

커스텀 이미지는 Inference Endpoints GUI 또는 API를 통해 배포할 수 있습니다. 주요 설정 요구 사항은 다음과 같습니다:

  • Hardware: AWS GPU L4 인스턴스를 권장합니다(시간당 약 $0.80).
  • Container Settings: 컨테이너 포트는 Inference Endpoint 기대치에 맞추어 80으로 설정해야 합니다. 기본 툴킷 엔트리포인트는 포트 5000을 사용합니다.
  • Security: HF_TOKEN을 비밀로 제공하여 컨테이너가 Meta-Llama-3.1-8B-Instruct와 같은 게이트된 모델을 다운로드할 수 있게 해야 합니다.

낮은 지연 시간을 위한 기술 아키텍처

낮은 지연 시간을 달성하기 위해, 배포는 표준 HTTP 요청 대신 커스텀 웹서버와 특수 클라이언트를 사용합니다.

WebSocket 웹서버

Starlette를 사용해 구현된 웹서버는 오디오 스트리밍을 지원하기 위해 WebSocket 연결을 제공합니다. 서버는 시작 시 prepare_handler를 실행해 모델을 초기화하고 워밍업합니다. 운영 중에는 inference_handler.process_streaming_data 메서드가 오디오를 받아 VAD용으로 청크를 나누고, 합성된 음성 응답을 처리·반환하기 위한 큐를 관리합니다.

오디오 스트리밍 클라이언트

전용 클라이언트는 사용자의 하드웨어와 웹서버 사이 인터페이스를 담당합니다. 주요 작업은 네 가지로 나뉩니다:

  1. Recording: audio_input_callback을 통해 오디오를 캡처하고 청크를 큐에 제출합니다.
  2. Submission: send_audio 메서드를 사용해 오디오를 서버에 전송합니다.
  3. Reception: on_message 메서드를 통해 서버 응답을 수신하며, 서버가 응답을 완료했는지 혹은 재생 큐에 추가 데이터를 넣어야 하는지를 판단합니다.
  4. Playback: audio_output_callback을 통해 오디오 응답을 재생하며, 하드웨어 손상을 방지하기 위해 안전한 범위 내에서 오디오를 유지합니다.

Sources