모델은 사용자 요청에 응답하거나 쌓인 데이터를 일괄 처리하는 형태로 배포(deployment)되어야 비로소 비즈니스 가치를 만든다. SageMaker는 추론(inference) 워크로드의 성격에 따라 4가지 방식을 제공하고, MLA-C01은 "이 시나리오에 어떤 방식인가"를 끊임없이 묻는다.
옵션
응답 형태
트래픽 패턴
페이로드/지속시간
비용 발생 구간
실시간(Real-time)
동기, 즉시(ms~초)
꾸준하고 예측 가능
작음(<6MB), <60초
인스턴스 가동 시간 전체
서버리스(Serverless)
동기, 즉시
간헐적·예측 불가, 0까지 떨어짐
작음(<4MB), <60초
요청을 처리하는 시간만
비동기(Asynchronous)
비동기, 큐 기반
가변적, 긴 처리 허용
큼(최대 1GB), <60분
큐에 일이 있을 때만
배치 변환(Batch Transform)
비동기, 작업 단위
정기적·일괄
매우 큼(전체 데이터셋)
작업이 도는 시간만
실시간·서버리스 = 동기(synchronous). 호출하면 그 자리에서 결과가 돌아온다.
비동기·배치 = 요청을 던지고 나중에 결과를 받는 구조다.
동기 vs 비동기 요청 흐름[동기] 클라이언트 ── invoke_endpoint ──▶ 엔드포인트 ──▶ 모델 ◀────── 응답(ms~초) ──────────────────┘ 실시간 / 서버리스[비동기] 클라이언트 ── invoke_endpoint_async ──▶ 내부 큐 ──▶ 엔드포인트 ◀── OutputLocation 즉시 반환 │ ┌────────┴────────┐ ▼ ▼ S3(결과 저장) SNS(완료 알림)[배치] S3(입력) ──▶ [일시적 클러스터 N대 병렬 추론] ──▶ S3(출력) ──▶ 클러스터 종료 엔드포인트 자체가 없다
추론 옵션 선택은 본질적으로 "always-on 비용 vs 지연 시간(latency) vs 처리량(throughput)"의 삼각 트레이드오프다. 실시간 엔드포인트는 인스턴스를 항상 켜두므로 트래픽이 없어도 비용이 나가지만 지연이 가장 낮다. 서버리스는 트래픽이 0이면 비용도 0이지만 콜드 스타트(cold start) 지연이 생긴다. 배치는 대량 처리당 비용이 가장 효율적이지만 즉시성이 없다. 시험은 이 셋 중 무엇을 우선해야 하는지 시나리오로 묻는다.
단점은 콜드 스타트다. 한동안 호출이 없다가 첫 요청이 오면 컨테이너를 띄우는 동안 지연이 생긴다. 일관된 저지연이 필요하면 부적합하다.
⚠️ 함정: "비용을 줄이고 싶다"는 키워드만 보고 무조건 서버리스를 고르면 안 된다. 트래픽이 꾸준히 많은 워크로드에서는 서버리스가 오히려 실시간 엔드포인트보다 비쌀 수 있다. 서버리스의 비용 이점은 "유휴 시간이 많을 때" 발생한다. 또 콜드 스타트를 못 견디는 SLA가 있으면 서버리스는 탈락이다. "간헐적/예측 불가 트래픽 + 콜드 스타트 허용"이 서버리스의 정확한 조건이다.
비동기 추론(Asynchronous Inference)은 요청을 내부 큐에 넣고 순차 처리한 뒤, 결과를 S3에 저장하고 SNS로 완료를 알린다.
페이로드 최대 1GB, 처리 최대 60분 — 실시간/서버리스가 못 받는 구간을 커버한다
입력을 본문에 싣지 않고 S3 위치(InputLocation)만 전달한다
요청이 없으면 인스턴스를 0까지 줄일 수 있다(실시간은 최소 1대 유지)
큐에 요청이 쌓이면 자동으로 인스턴스를 띄우고, 큐가 비면 다시 0으로 줄여 비용을 아낀다
적합 사례: 큰 이미지/비디오 처리, 대용량 NLP 문서 추론
# 비동기 호출: 입력을 S3에 두고 위치만 전달, 즉시 응답 대신 출력 위치를 받는다response = runtime.invoke_endpoint_async( EndpointName="my-async-endpoint", InputLocation="s3://my-bucket/input/large-image.png",)output_location = response["OutputLocation"] # 결과가 저장될 S3 경로
비동기 추론은 실시간과 배치의 중간 지대를 메운다. 실시간처럼 엔드포인트가 살아 있어 개별 요청 단위로 호출하지만, 큐를 두어 요청 폭주를 흡수하고 큰 페이로드와 긴 처리시간을 허용한다. "엔드포인트가 필요하지만(개별 호출) 페이로드가 6MB를 넘거나 처리가 60초를 넘어 실시간 제약을 못 맞춘다" → 비동기가 정답인 전형적 신호다.
배치 변환(Batch Transform)은 엔드포인트를 두지 않는다. S3의 대량 입력을 읽어 일괄 추론하고 결과를 S3에 쓴 뒤, 작업이 끝나면 리소스를 모두 종료한다.
영구적인 엔드포인트 비용이 없다 — 작업이 도는 시간만 과금
데이터를 여러 인스턴스에 분할해 병렬 처리(수평 확장)
적합 사례: 야간 일괄 점수 계산, 전체 고객 이탈 예측, 누적 로그 분류처럼 즉시성이 필요 없고 한꺼번에 처리하면 되는 작업
from sagemaker.transformer import Transformertransformer = Transformer( model_name="my-model", instance_count=4, # 데이터를 분할해 병렬 처리 instance_type="ml.m5.xlarge", output_path="s3://my-bucket/batch-output/",)transformer.transform( data="s3://my-bucket/batch-input/", content_type="text/csv", split_type="Line", # 레코드 단위 분할)
배치 변환은 데이터를 여러 인스턴스에 분할(split_type)하고 각 인스턴스가 미니배치(BatchStrategy, MaxPayloadInMB)로 처리해 수평 확장한다. 처리가 끝나면 클러스터가 통째로 사라지므로 always-on 비용이 0이다. "실시간성이 전혀 필요 없는 대량 일괄 처리"라는 키워드가 나오면 배치 변환이 거의 항상 가장 저렴한 정답이다.