가이드 소개 | 실측 결과 | 시나리오 | 설치 | 실행 | 비용과 리소스 정리
Transformer 인코더 모델(BERT 계열 분류, NLI, reranking)을 Amazon SageMaker AI에 배포하는 방법을 시나리오별로 구현하고 비교한 실습 repository입니다.
인코더 모델을 서빙할 때는 "CPU로도 충분한가?", "한 endpoint에 여러 모델을 올리면 비용을 줄일 수 있는가?", "요청이 없을 때 비용을 없앨 수 있는가?" 같은 질문이 자주 나옵니다.
대형 LLM은 모델 크기 때문에 고사양 GPU가 필요한 경우가 많습니다. 반면 인코더 모델은 GPU 사용률이 낮을 수 있어 CPU로 배포하거나 여러 모델이 GPU를 공유하도록 구성할 수 있습니다. 적합한 방식은 latency, throughput, 모델 수, 트래픽 패턴, 운영 비용에 따라 달라집니다.
이 repository는 일곱 가지 배포 방식을 실제 endpoint에서 실행하고, 같은 조건
(max_len=512)으로 latency(p50~p99), throughput, 비용을 비교합니다. 실패한 구성과 원인도
재현할 수 있도록 기록했습니다.
Warning
Real-time endpoint는 삭제할 때까지 시간당 비용이 발생합니다. 요청이 없어도 인스턴스
비용이 청구됩니다. 실습을 마치면 uv run python -m common.cleanup --delete-all을
실행하세요.
모델과 측정 조건을 고정해 배포 방식에 따른 차이를 비교했습니다.
- 모델: mDeBERTa (278M) (MIT, ungated), 모든 시나리오 동일
- max_seq_len: 512 고정 (실제 문장 길이로 재면 낙관적인 값이 나옵니다)
- latency: batch=1, concurrency=1 기준
- throughput: batch=8에서 초당 처리한 sample 수
- 리전: us-east-1
- Use case: LLM 답변 검증. RAG의 문서 chunk를 premise, LLM 답변을 hypothesis로 입력해
NLI 3-way 분류(entailment, neutral, contradiction)를 수행합니다.
(chunk, 답변)한 쌍을 요청 하나로 측정합니다. - 디코더와의 차이: KV cache와 decode step이 없으므로 vLLM의 주요 최적화 효과가 제한적이며 TTFT 같은 지표도 적용되지 않습니다. 인코더는 왜 다른가
| 시나리오 | 컴퓨트 | p50 | p90 | p95 | p99 | b=8 samples/s | 시간당 요금 |
|---|---|---|---|---|---|---|---|
| 01 GPU 단일 endpoint | ml.g5.xlarge | 26.8 ms | 29.8 ms | 32.7 ms | 45.4 ms | 113/s | $1.408 |
| 02 CPU + ONNX | ml.c6i.2xlarge | 58.3 ms | 63.0 ms | 63.5 ms | 64.2 ms | 27/s | $0.408 |
| 03 inference component | ml.g6.12xlarge | 25.8 ms | 27.4 ms | 28.3 ms | 28.4 ms | 78/s | $5.752 |
| 04 GPU LMI | ml.g5.xlarge | 49.7 ms | 50.9 ms | 51.5 ms | 52.8 ms | 104/s | $1.408 |
| 06 Serverless | 메모리 6144MB (인스턴스 없음) | 116.5 ms | 137.1 ms | 171.7 ms | 253.3 ms | 13/s | 요청당 과금 |
| 07 Triton + TensorRT | ml.g5.xlarge | 15.4 ms | 16.4 ms | 16.8 ms | 17.4 ms | 185/s | $1.408 |
| 폴더 | 무엇을 확인하나 |
|---|---|
01_single_endpoint |
one model, one container. baseline과 worker, batching 설정 |
02_cpu_cohost_multicontainer |
여러 경량 ONNX 모델을 CPU 인스턴스 하나에 배포 |
03_gpu_cohost_inference_component |
GPU 환경에서 모델별로 독립 scaling |
04_gpu_cohost_lmi |
여러 모델이 GPU 한 장을 공유 |
05_gpu_scale_to_zero |
GPU 유휴 비용을 0으로 |
06_cpu_serverless |
인프라를 관리하지 않고 유휴 비용 제거 |
07_gpu_triton |
Triton과 TensorRT로 latency 단축 |
08_engine_comparison |
인코더 모델에서 vLLM의 효과 비교 |
curl -LsSf https://astral.sh/uv/install.sh | sh # uv 미설치 시
git clone https://github.com/daekeun-ml/encoder-serving-sagemaker.git
cd encoder-serving-sagemaker
uv sync --extra notebook
export AWS_REGION=us-east-1
export SAGEMAKER_ROLE_ARN=arn:aws:iam::<ACCOUNT>:role/<Role> # 비우면 IAM에서 자동 탐지SageMaker Python SDK v3를 사용합니다. 설정은 common/config.py에
있으며 환경 변수로 override할 수 있습니다. secret은 파일에 저장하지 마세요.
| 필요한 것 | 비고 |
|---|---|
| AWS 계정 | SageMaker AI endpoint 생성 권한. 실제 endpoint 배포 시 비용 발생 |
| IAM execution role | AmazonSageMaker-ExecutionRole-* 또는 동등한 권한 |
| 인스턴스 quota | 기본값 ml.c6i.2xlarge(CPU), ml.g5.xlarge(GPU), ml.g6.12xlarge(03). 신규 계정은 quota가 0일 수 있음 |
| Region | 기본값 us-east-1. GPU capacity는 Region과 시점에 따라 다름 |
| Python | 3.12 이상 |
| 로컬 GPU | 선택 사항. 있으면 배포 전에 추론 검증 가능 |
| HF 토큰 | 불필요 (대상 모델 전부 ungated) |
필요하면 인스턴스 유형을 변경할 수 있습니다. quota나 capacity가 부족하면 다른 유형 또는 Region을 검토하세요.
export CPU_INSTANCE=ml.c6i.4xlarge # 02, 06 에서 씁니다
export GPU_INSTANCE=ml.g6.xlarge # 01, 04, 05
uv run python 03_gpu_cohost_inference_component/deploy.py --instance ml.g6.12xlarge # CLI 로도 지정각 시나리오 폴더의 README에 자세한 절차가 있습니다. 공통 흐름은 다음과 같습니다.
# 1) endpoint 인스턴스를 생성하지 않고 API 요청 구성 확인
uv run python 01_single_endpoint/deploy.py --dry-run
# 2) 배포
uv run python 01_single_endpoint/deploy.py --gpu --workers 4
# 3) 호출과 벤치마크
uv run python 01_single_endpoint/invoke.py --mode cloud --endpoint <ep>
uv run python -m benchmark.run --mode cloud --endpoint <ep> --pad-to-max --warmup 20
# 4) 리소스 정리
uv run python -m common.cleanup --delete-allNote
비교 측정에는 --pad-to-max로 sequence length를 512에 고정하고 충분한 warmup을
적용하세요. 실제 문장 길이로 측정하면 이 실험에서는 latency가 약 두 배 낮게 나왔습니다.
Warmup이 부족하면 모델 로드 시간이 p99에 포함될 수 있습니다(실측 p99 819ms와 45ms).
벤치마크는 로컬(Docker)과 클라우드에 같은 코드로 부하를 겁니다. 측정 방법은 벤치마크 방법에 정리했습니다.
uv run python -m common.cleanup --list # 남아 있는 리소스 확인
uv run python -m common.cleanup --delete-all # 이 repository가 만든 리소스 삭제Cleanup 명령은 RESOURCE_PREFIX(기본값 encoder-serving)로 시작하는 리소스만 대상으로
합니다. inference component, Provisioned Concurrency의 auto scaling 설정, CloudWatch
alarm도 함께 삭제합니다.
설계, 시나리오 구성, 기본 code snippet은 직접 작성했습니다. 반복 구현과 문서 초안에는 Claude Code를 사용했고, SageMaker AI 실습에서 확인한 기준으로 결과를 검토했습니다.
표의 수치는 모두 실제 실행 결과입니다. 멀티컨테이너 GPU 제한, inference component의 GPU
할당 단위, MinInstanceCount: 0만으로 scale to zero가 시작되지 않는 조건도 재현 명령과 함께
정리했습니다.
김대근 (Daekeun Kim) / AWS Principal AI Specialist Solutions Architect
LinkedIn | GitHub | Hugging Face | 기술 블로그
코드와 문서는 MIT License로 배포합니다. 모델 license는 별도로 확인하세요. 실습에 사용하는 모델 3종은 모두 MIT License이며 gated model이 아닙니다.
저자의 개인 실측 결과를 정리한 자료이며, 재직 중인 회사의 공식 문서나 입장을 대변하지 않습니다. 내용이 공식 문서와 다를 경우 공식 문서가 우선합니다. DLC image tag, Region 지원, 서비스 제약은 자주 바뀌므로 배포 전에 재확인하세요.