Hugging Face 텍스트 생성 추론이 이제 AWS Inferentia2를 지원합니다
TL;DR
Hugging Face는 Amazon SageMaker를 통해 AWS Inferentia2에서 Text Generation Inference (TGI)를 일반적으로 사용할 수 있게 하여, GPU 없이도 대규모 언어 모델(LLM)을 낮은 지연 시간과 높은 동시성으로 제공할 수 있는 프로덕션 급 경로를 제공합니다.
Text Generation Inference (TGI)란?
TGI는 LLM을 위한 특화된 추론 서버로 다음을 제공합니다:
- 고처리량을 위한 텐서 병렬화 및 연속 배치.
- Llama, Mistral 등과 같은 인기 오픈소스 모델에 대한 최적화된 지원.
- Grammarly, Uber, Deutsche Telekom 등 기업에서 사용하는 프로덕션 수준 배포.
Inferentia2가 중요한 이유
AWS Inferentia2 칩은 GPU보다 낮은 비용으로 고성능 추론을 제공합니다. TGI를 Inferentia2와 SageMaker에 통합함으로써 Hugging Face는 다음을 제공합니다:
- 원활하고 관리되는 배포 경험.
- HuggingChat, OpenAssistant, 그리고 Hugging Face의 서버리스 엔드포인트를 구동하는 동일한 백엔드 기술과의 호환성.
- AWS 전용 하드웨어를 선호하는 고객을 위한 대체 컴퓨팅 스택.
Inferentia2에 Zephyr 7B 배포 – 단계별 가이드
블로그 게시물에서는 ml.inf2.8xlarge 인스턴스에 Zephyr 7B 모델( Mistral‑7B‑v0.1의 DPO‑미세조정 버전)을 배포하는 과정을 안내합니다. 단계는 독립적이며 모든 SageMaker 사용자가 재현할 수 있습니다.
1. 개발 환경 설정
pip install transformers "sagemaker>=2.206.0" --upgrade --quiet
스크립트는 IAM 실행 역할을 가져오고, SageMaker 세션을 생성하며, 역할 ARN과 리전을 출력합니다.
2. TGI NeuronX 컨테이너 이미지 가져오기
from sagemaker.huggingface import get_huggingface_llm_image_uri
llm_image = get_huggingface_llm_image_uri(
"huggingface-neuronx",
version="0.0.20"
)
print(f"llm image uri: {llm_image}")
작성 시점에는 최신 DLC 버전이 헬퍼를 통해 아직 공개되지 않아, 원시 ECR URI를 사용합니다.
3. Inferentia2용 캐시된 모델 컴파일 또는 가져오기
Inferentia2는 동적 형태를 지원하지 않으므로 시퀀스 길이와 배치 크기를 컴파일 시점에 고정해야 합니다. Hugging Face는 사전 컴파일된 구성(예: Mistral‑7B, Zephyr‑7B)을 포함한 neuron model cache를 제공합니다. 필요한 구성이 없을 경우, 사용자는 Optimum CLI를 사용해 컴파일할 수 있습니다:
optimum-cli export neuron -m HuggingFaceH4/zephyr-7b-beta \
--batch_size 4 --sequence_length 2048 \
--num_cores 2 --auto_cast_type bf16 ./zephyr-7b-beta-neuron
컴파일된 아티팩트는 aws-neuron/zephyr-7b-seqlen-2048-bs-4-cores-2 경로로 Hub에 푸시됩니다.
4. 엔드포인트 구성 정의 및 배포
TGI NeuronX 컨테이너에 필요한 주요 환경 변수는 다음과 같습니다:
HF_MODEL_ID,HF_NUM_CORES,HF_BATCH_SIZE,HF_SEQUENCE_LENGTH,HF_AUTO_CAST_TYPEMAX_BATCH_SIZE,MAX_INPUT_LENGTH,MAX_TOTAL_TOKENS
from sagemaker.huggingface import HuggingFaceModel
config = {
"HF_MODEL_ID": "HuggingFaceH4/zephyr-7b-beta",
"HF_NUM_CORES": "2",
"HF_BATCH_SIZE": "4",
"HF_SEQUENCE_LENGTH": "2048",
"HF_AUTO_CAST_TYPE": "bf16",
"MAX_BATCH_SIZE": "4",
"MAX_INPUT_LENGTH": "1512",
"MAX_TOTAL_TOKENS": "2048",
}
llm_model = HuggingFaceModel(role=role, image_uri=llm_image, env=config)
llm = llm_model.deploy(initial_instance_count=1, instance_type="ml.inf2.8xlarge", container_startup_health_check_timeout=1800)
배포는 일반적으로 10–15분 정도 소요됩니다.
5. Zephyr 7B로 추론 및 채팅 실행
모델은 채팅 템플릿을 사용합니다. 토크나이저의 apply_chat_template 메서드는 OpenAI 스타일의 메시지 딕셔너리를 필요한 프롬프트 형식으로 변환합니다.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("aws-neuron/zephyr-7b-seqlen-2048-bs-4-cores-2")
messages = [
{"role": "system", "content": "You are the AWS expert"},
{"role": "user", "content": "Can you tell me an interesting fact about AWS?"},
]
prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
payload = {
"do_sample": True,
"top_p": 0.6,
"temperature": 0.9,
"top_k": 50,
"max_new_tokens": 256,
"repetition_penalty": 1.03,
"return_full_text": False,
"stop": ["</s>"]
}
chat = llm.predict({"inputs": prompt, "parameters": payload})
print(chat[0]["generated_text"][len(prompt):])
응답을 통해 모델이 Inferentia2에서 정상적으로 작동함을 확인할 수 있습니다.
6. 리소스 정리
llm.delete_model()
llm.delete_endpoint()
시사점 및 향후 작업
- 비용 효율적인 확장: Inferentia2는 GPU 클러스터에 비해 고처리량 LLM 서비스를 위한 더 저렴한 컴퓨팅 옵션을 제공합니다.
- 모델 지원 범위: 현재 캐시에는 Llama, Mistral, Zephyr가 포함되어 있으며, Hugging Face는 지원 아키텍처를 확대할 계획입니다.
- 컴파일 워크플로: 사용자는 사전 캐시된 빌드를 활용하거나 Optimum을 사용해 맞춤 구성을 컴파일할 수 있습니다(최대 약 45분).
- 로드맵: 지속적인 작업을 통해 더 많은 모델을 지원하고, 캐시 시스템을 개선하며, 컴파일 파이프라인을 간소화하는 것을 목표로 합니다.
질문이 있으면 Twitter 또는 LinkedIn에서 Philipp Schmid에게 연락하세요.