Hugging Face Inference Endpoints로 LLM 배포하기

Hugging Face Inference Endpoints는 오픈소스 대규모 언어 모델(LLMs)을 프로덕션 준비가 된 API로 배포하기 위한 관리형 SaaS 솔루션을 제공합니다. 이 서비스는 수동 인프라 관리와 MLOps의 필요성을 없애며, 개발자가 Falcon, (Open-)LLaMA, X-Gen, StarCoder, RedPajama와 같은 모델을 효율적으로 배포할 수 있게 합니다.

Inference Endpoints의 핵심 기능

Inference Endpoints는 몇 가지 핵심 기술 기능을 통해 모델 선택부터 프로덕션 배포까지의 전환을 간소화합니다:

  • 간편한 배포: 몇 번의 클릭으로 모델을 API로 배포할 수 있어 기본 인프라 관리의 복잡성을 제거합니다.
  • 비용 최적화: 서비스는 자동 'scale-to-zero' 기능을 포함하여, 엔드포인트가 사용되지 않을 때 인프라를 축소함으로써 비용을 절감합니다. 사용자는 엔드포인트의 가동 시간에 따라 비용을 지불합니다.
  • 엔터프라이즈급 보안: 엔드포인트는 직접 VPC 연결을 통해서만 접근 가능한 보안이 강화된 오프라인 인스턴스로 배포할 수 있습니다. 이 서비스는 SOC2 Type 2 인증을 받았으며, BAA 및 GDPR 데이터 처리 계약을 제공합니다.
  • LLM 특화 최적화: 높은 처리량과 낮은 지연 시간을 보장하기 위해, 서비스는 Paged Attention과 Flash Attention을 포함하고 커스텀 트랜스포머 코드를 함께 사용하는 Text Generation Inference(TGI)를 활용합니다.
  • 광범위한 작업 지원: 플랫폼은 🤗 Transformers, Sentence-Transformers, Diffusers에 대한 즉시 사용 가능한 지원을 제공하며, 화자 분리 같은 고급 작업에 대한 커스터마이징도 허용합니다.

LLM 배포 및 테스트

tiiuae/falcon-40b-instruct와 같은 모델을 배포하는 것은 모델 저장소, 클라우드 제공자, 지역을 선택하는 것을 포함합니다. 시스템은 모델 크기에 따라 인스턴스 유형을 제안합니다(예: 4x NVIDIA T4 GPU),但 사용자는 최적의 성능을 위해 단일 NVIDIA A100 GPU와 같은 고성능 하드웨어를 수동으로 선택할 수 있습니다.

배포 후, 엔드포인트는 내장된 Inference Widget을 사용한 수동 요청 또는 cURL 명령을 통해 테스트할 수 있습니다. 텍스트 생성의 동작을 제어하기 위해, API는 페이로드에 다양한 매개변수를 지원하며, 포함되는 것은 다음과 같습니다:

  • Temperature: 무작위성을 조절합니다(기본값 1.0).
  • max_new_tokens: 생성할 토큰의 최대 수를 설정합니다(기본값 20, 최대 512).
  • repetition_penalty: 토큰 반복 가능성을 조절합니다.
  • top_k과 top_p: 어휘 필터링 및 nucleus 샘플링을 관리합니다.
  • do_sample: 샘플링과 그리디 디코딩 간을 전환합니다(기본값 false).
  • stop: 생성을 종료하는 토큰 목록입니다.

응답 스트리밍 구현

지각된 지연 시간을 줄여 사용자 경험을 개선하기 위해, Inference Endpoints는 토큰이 생성되는 대로 스트리밍을 지원합니다. 이는 다양한 언어에 특화된 라이브러리를 사용하여 구현할 수 있습니다:

Python 구현

huggingface_hub 라이브러리와 InferenceClient를 사용하여 개발자는 text_generation 메서드에서 stream=True를 설정할 수 있습니다.これにより 애플리케이션은 생성된 토큰을 반복하여 실시간으로 사용자에게 제공할 수 있으며, 특수 토큰을 필터링하거나 정의된 stop 시퀀스에서 중단할 수 있습니다.

JavaScript 구현

개발자는 @huggingface/inference 라이브러리와 HfInferenceEndpoint 클래스를 사용하여 textGenerationStream 메서드를 활용할 수 있습니다. 이 방법은 비동기 이터레이터(for await...of)를 사용하여 엔드포인트에서 수신된 토큰을 처리하고 표시합니다.

Sources