비동기 추론 (Async Inference)

비동기 추론 — 요청 ID를 받고 완료는 웹훅으로

비동기 추론은 모델 요청에 "던져두고 나중에 결과를 받는"(fire and forget) 패턴이에요. 응답을 기다리는 대신 요청 ID를 즉시 받고, 추론은 백그라운드에서 진행됩니다. 완료되면 결과가 웹훅 엔드포인트로 전달되죠. 긴 문서 처리나 배치 작업처럼 호출자가 수 분 동안 연결을 붙잡고 있기 어려운 상황에 잘 어울려요.

비동기 요청은 별도 코드 수정 없이 모든 전용 배포에서 동작합니다. 요청은 최대 72시간까지 대기열에 머물 수 있고, 추론 시도 1회당 최대 1시간이에요. 다만 스트리밍 출력과는 호환되지 않고, Model APIs에서는 제공되지 않는다는 점을 기억해야 합니다.

출처: Baseten - Async inference

빠른 시작

전용 배포의 /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_iddeployment_id는 어떤 배포가 실행했는지 알려줘요. data는 모델 출력(또는 오류 시 null), errors는 성공 시 빈 배열입니다.

속도 제한과 관측

예측 엔드포인트(/async_predict)는 조직 단위 12,000 requests/minute, 상태 폴링·취소는 각각 100 requests/second로 제한돼요. 폴링 제한을 피하려면 웹훅을 선호하세요. 모델 대시보드의 Metrics 탭에서 추론 지연/볼륨, 대기열 시간(QUEUED), 대기열 크기 같은 비동기 지표를 확인할 수 있습니다.

더 알아보기