비동기 추론 (Async Inference)
비동기 추론 — 요청 ID를 받고 완료는 웹훅으로
비동기 추론은 모델 요청에 "던져두고 나중에 결과를 받는"(fire and forget) 패턴이에요. 응답을 기다리는 대신 요청 ID를 즉시 받고, 추론은 백그라운드에서 진행됩니다. 완료되면 결과가 웹훅 엔드포인트로 전달되죠. 긴 문서 처리나 배치 작업처럼 호출자가 수 분 동안 연결을 붙잡고 있기 어려운 상황에 잘 어울려요.
비동기 요청은 별도 코드 수정 없이 모든 전용 배포에서 동작합니다. 요청은 최대 72시간까지 대기열에 머물 수 있고, 추론 시도 1회당 최대 1시간이에요. 다만 스트리밍 출력과는 호환되지 않고, Model APIs에서는 제공되지 않는다는 점을 기억해야 합니다.
빠른 시작
전용 배포의 /production/async_predict 엔드포인트에 POST로 요청을 보내요. model_input에 프롬프트를, webhook_endpoint에 결과를 받을 주소를 넣으면 됩니다.
import requests
import os
model_id = "YOUR_MODEL_ID"
baseten_api_key = os.environ["BASETEN_API_KEY"]
resp = requests.post(
f"https://model-{model_id}.api.baseten.co/production/async_predict",
headers={"Authorization": f"Bearer {baseten_api_key}"},
json={
"model_input": {"prompt": "hello world!"},
"webhook_endpoint": webhook_endpoint,
},
)
추론이 끝나면 Baseten이 모델 출력을 담아 웹훅으로 POST를 보내요. 자체 모델에서 self.context.get('request_id')를 쓰면 요청과 출력을 대응시킬 수 있기 때문에, 웹훅 엔드포인트는 클라우드 함수나 메시지 큐처럼 가용성이 높은 서비스에 배포하는 걸 권장합니다.
동작 방식과 오토스케일링
모델이 max_time_in_queue_seconds 안에 준비되지 않으면 요청은 EXPIRED 상태로 만료돼요. 이 파라미터를 모델 시작 시간에 맞게 잡아야 하고, 콜드 스타트가 긴 모델이라면 오토스케일링 설정에서 최소 레플리카를 유지하는 걸 고려해 보세요. 대기열 상태(QUEUED, IN_PROGRESS, SUCCEEDED 등)는 /async_request/{request_id}로 확인할 수 있는데, 이 폴링은 상태만 반환하지 모델 출력은 주지 않으니 결과는 웹훅이나 모델 내부 저장으로 받아야 해요.
웹훅 페이로드
완료 시 Baseten이 보내는 payload는 다음과 같아요.
{
"request_id": "9876543210abcdef1234567890fedcba",
"model_id": "abc123",
"deployment_id": "def456",
"type": "async_request_completed",
"time": "2024-04-30T01:01:08.883423Z",
"data": { "output": "model response here" },
"errors": []
}
request_id는 원래 /async_predict 응답과 일치하고, model_id와 deployment_id는 어떤 배포가 실행했는지 알려줘요. data는 모델 출력(또는 오류 시 null), errors는 성공 시 빈 배열입니다.
속도 제한과 관측
예측 엔드포인트(/async_predict)는 조직 단위 12,000 requests/minute, 상태 폴링·취소는 각각 100 requests/second로 제한돼요. 폴링 제한을 피하려면 웹훅을 선호하세요. 모델 대시보드의 Metrics 탭에서 추론 지연/볼륨, 대기열 시간(QUEUED), 대기열 크기 같은 비동기 지표를 확인할 수 있습니다.
더 알아보기
- Streaming — 토큰 단위 스트리밍
- Call your model — 동기 추론 실행
- Autoscaling — 레플리카와 콜드 스타트 관리