모델이 수신하는 추론 요청의 볼륨에 따라 컴퓨팅 용량을 자동으로 프로비저닝하고, 크기를 조정하고, 끕니다. 따라서 유휴 시간을 제외하고 추론 코드를 실행하는 데 필요한 컴퓨팅 시간과 처리된 데이터 양에 대해서만 비용을 지불하면 됩니다.
이름 그대로 지속적으로 GPU를 항상 켜두는 것이 아니라, 요청이 들어올 때만 GPU 자원을 사용하게끔 하는 방식입니다.
항상 켜두는 비용보다 Serverless 방식을 적용하면 비용이 적게 나가게 됩니다.
그러면 비용이 적게 나간다는 장점만 있진 않습니다. 제가 직접 경험한 바로는 Inference 속도가 기본 추론 방식보다 늦어지게 됩니다. Inference latency - Inference cost와의 trade off 관계가 발생하게 됩니다.
그래서 저희 서비스에 '실시간성이 필요하지 않은' ML 모델 배포방식으로 적용을 하고 있습니다.
2. Serverless Config
memory_size_in_mb : 모델 최대 size를 지정합니다. 선택할 수 있는 옵션들로는 1024MB, 2048MB, 3072MB, 4096MB, 5120MB, 6144MB가 있으며, 6144MB를 넘는 모델은 serverless 추론을 진행할 수 없습니다. Quantization까지 진행하면 가능할 듯 합니다. (출처 : AWS 공식 문서)
max_concurrency : 최대 concurrency를 지정합니다. 1부터 200까지 지정할 수 있습니다. (출처 : AWS 공식 문서)
앞서 Serverless 추론을 하게되면 GPU를 열었다가 닫았다하는 시간이 소요되어 추론 시간이 지연된다는 언급을 했습니다.
그래서 일반 추론과 얼마나 차이가 나는지 시간을 측정해보았습니다.
시간 측정 코드는 다음과 같습니다.
import boto3
import json
import time
endpoint_name = predictor.endpoint_name
client = boto3.client('sagemaker-runtime')
content_type = "application/json"
# API 호출 전 시간 기록
start_time = time.time()
# API 호출
response = client.invoke_endpoint(
EndpointName=endpoint_name,
ContentType=content_type,
Body=json.dumps(data)
)
# API 호출 후 시간 기록
end_time = time.time()
# 호출 속도 계산
duration = end_time - start_time
# 출력
print(f"API call duration: {duration:.2f} seconds")
# 호출 결과
result = response['Body'].read().decode('utf-8')
result
1) 일반적인 Inference
API call duration을 보았을 때, 1.07초가 소요되었습니다.
2) Serverless Inference
serverless를 진행하였을 때, API call duration이 3.63초가 나왔습니다. 약 3배정도 느린 것을 확인할 수 있습니다.
하지만 모든 경우에 이러한 상황이 성립하는 것은 아니니, 참고용으로만 생각해주시면 감사하겠습니다.
따라서 저는 실시간성이 필요하지 않은 곳에 사용하는 것이 좋다는 판단을 하였습니다.
비용 절감이라는 장점이 있다면 성능저하,추론속도지연 이라는 단점이 항상 따라오는 걸까요..? 🥲