Amazon SageMaker 비동기 엔드포인트를 사용하여 Amazon SageMaker JumpStart 기반 모델의 배포 비용 최적화 | 아마존 웹 서비스

Amazon SageMaker 비동기 엔드포인트를 사용하여 Amazon SageMaker JumpStart 기반 모델의 배포 비용 최적화 | 아마존 웹 서비스

다양한 산업 분야에서 생성적 AI 애플리케이션의 성공은 경쟁사의 성과를 재현 및 능가하거나 새롭고 흥미로운 사용 사례를 해결하려는 전 세계 기업의 관심과 관심을 끌었습니다. 이러한 고객은 TII Falcon, Stable Diffusion XL 또는 OpenAI의 GPT-3.5와 같은 기반 모델을 생성 AI 혁신을 지원하는 엔진으로 찾고 있습니다.

기초 모델은 학습된 방대한 양의 비정형 데이터 덕분에 인간과 유사한 콘텐츠를 이해하고 생성할 수 있는 생성적 AI 모델 클래스입니다. 이러한 모델은 이미지 생성, 번역, 질문 답변을 비롯한 다양한 컴퓨터 비전(CV) 및 자연어 처리(NLP) 작업에 혁신을 가져왔습니다. 이는 많은 AI 애플리케이션의 구성 요소 역할을 하며 고급 지능형 시스템 개발에 중요한 구성 요소가 되었습니다.

그러나 기초 모델의 배포에는 특히 비용 및 리소스 요구 사항 측면에서 상당한 어려움이 따를 수 있습니다. 이러한 모델은 크기가 수억에서 수십억에 달하는 매개변수로 알려져 있습니다. 크기가 크면 강력한 하드웨어와 상당한 메모리 용량을 포함한 광범위한 계산 리소스가 필요합니다. 실제로 기초 모델을 배포하려면 계산 부하를 효율적으로 처리하기 위해 일반적으로 하나 이상의 GPU가 필요합니다. 예를 들어, TII Falcon-40B Instruct 모델은 메모리에 성공적으로 로드되려면 최소한 ml.g5.12xlarge 인스턴스가 필요하지만 더 큰 인스턴스에서 가장 잘 작동합니다. 결과적으로 이러한 모델을 배포하고 유지 관리하는 데 따른 투자 수익(ROI)은 특히 개발 주기 동안이나 급증하는 워크로드의 경우 비즈니스 가치를 입증하기에는 너무 낮을 수 있습니다. 이는 긴 세션(잠재적으로 연중무휴) 동안 GPU 기반 인스턴스를 보유하는 데 드는 운영 비용 때문입니다.

올해 초 우리는 발표했습니다. 아마존 기반암, Amazon 및 생성 AI 파트너의 기반 모델에 액세스하기 위한 서버리스 API입니다. 현재 비공개 미리 보기 상태이지만 서버리스 API를 사용하면 엔드포인트를 직접 배포할 필요 없이 Amazon, Anthropic, Stability AI 및 AI21의 기반 모델을 사용할 수 있습니다. 그러나 Hugging Face와 같은 커뮤니티의 오픈 소스 모델은 많이 성장해 왔으며 이들 모두가 Amazon Bedrock을 통해 제공되는 것은 아닙니다.

이 게시물에서는 이러한 상황을 목표로 대규모 기초 모델을 배포하여 높은 비용 위험 문제를 해결합니다. 아마존 세이지 메이커 비동기 엔드포인트Amazon SageMaker 점프스타트. 이를 통해 아키텍처 비용을 절감할 수 있으며, 요청이 대기열에 있을 때만 짧은 수명 동안만 엔드포인트를 실행하고 서비스 대기 중인 요청이 없으면 XNUMX으로 축소할 수 있습니다. 이는 많은 사용 사례에 적합해 보입니다. 그러나 XNUMX으로 축소된 엔드포인트는 추론을 제공하기 전에 콜드 스타트 ​​시간을 도입합니다.

솔루션 개요

다음 다이어그램은 솔루션 아키텍처를 보여줍니다.

Optimize deployment cost of Amazon SageMaker JumpStart foundation models with Amazon SageMaker asynchronous endpoints | Amazon Web Services PlatoBlockchain Data Intelligence. Vertical Search. Ai.

우리가 배포하는 아키텍처는 매우 간단합니다.

  • 사용자 인터페이스는 Streamlit 또는 유사한 기술을 기반으로 구축된 웹 UI로 대체될 수 있는 노트북입니다. 우리의 경우 노트북은 아마존 세이지 메이커 스튜디오 PyTorch 5 Python 2.0 CPU 커널을 사용하여 ml.m3.10.large 인스턴스에서 실행되는 노트북입니다.
  • 노트북은 SageMaker Python SDK, Python용 AWS SDK(Boto3) 및 LangChain의 세 가지 방법으로 엔드포인트를 쿼리합니다.
  • 엔드포인트는 SageMaker에서 비동기식으로 실행되고 있으며 엔드포인트에서는 Falcon-40B Instruct 모델을 배포합니다. 이는 현재 교육 모델 측면에서 최첨단 기술이며 SageMaker JumpStart에서 사용할 수 있습니다. 단일 API 호출을 통해 엔드포인트에 모델을 배포할 수 있습니다.

SageMaker 비동기 추론이란 무엇입니까?

SageMaker 비동기 추론은 실시간 엔드포인트, 배치 추론, 서버리스 추론과 함께 SageMaker의 XNUMX가지 배포 옵션 중 하나입니다. 다양한 배포 옵션에 대해 자세히 알아보려면 다음을 참조하세요. 추론을 위한 모델 배포.

SageMaker 비동기식 추론은 들어오는 요청을 대기열에 추가하고 비동기식으로 처리하므로 이 옵션은 최대 1GB의 큰 페이로드 크기, 긴 처리 시간 및 실시간에 가까운 지연 시간 요구 사항이 있는 요청에 이상적입니다. 그러나 대규모 기반 모델을 처리할 때, 특히 POC(개념 증명) 또는 개발 중에 제공되는 주요 이점은 요청이 없을 때 인스턴스 수를 XNUMX으로 축소하도록 비동기 추론을 구성하는 기능입니다. 처리하여 비용을 절감합니다. SageMaker 비동기 추론에 대한 자세한 내용은 다음을 참조하십시오. 비동기 추론. 다음 다이어그램은 이 아키텍처를 보여줍니다.

Optimize deployment cost of Amazon SageMaker JumpStart foundation models with Amazon SageMaker asynchronous endpoints | Amazon Web Services PlatoBlockchain Data Intelligence. Vertical Search. Ai.

비동기식 추론 엔드포인트를 배포하려면 AsyncInferenceConfig 물체. 생성하면 AsyncInferenceConfig 인수를 지정하지 않으면 기본값 S3OutputPath 될거야 s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-outputs/{UNIQUE-JOB-NAME}S3FailurePath 될거야 s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-failures/{UNIQUE-JOB-NAME}.

SageMaker JumpStart란?

우리 모델은 사전 훈련된 모델, 솔루션 템플릿 및 예제 노트북을 제공하여 기계 학습(ML) 여정을 가속화하는 SageMaker의 기능인 SageMaker JumpStart에서 비롯되었습니다. 다양한 문제 유형에 대해 사전 훈련된 광범위한 모델에 대한 액세스를 제공하므로 탄탄한 기반으로 ML 작업을 시작할 수 있습니다. SageMaker JumpStart는 일반적인 사용 사례를 위한 솔루션 템플릿과 학습용 예제 노트북도 제공합니다. SageMaker JumpStart를 사용하면 원클릭 솔루션 출시와 실용적인 ML 경험을 위한 포괄적인 리소스를 통해 ML 프로젝트를 시작하는 데 필요한 시간과 노력을 줄일 수 있습니다.

다음 스크린샷은 SageMaker JumpStart UI에서 사용할 수 있는 일부 모델의 예를 보여줍니다.

Optimize deployment cost of Amazon SageMaker JumpStart foundation models with Amazon SageMaker asynchronous endpoints | Amazon Web Services PlatoBlockchain Data Intelligence. Vertical Search. Ai.

모델 배포

첫 번째 단계는 모델을 SageMaker에 배포하는 것입니다. 이를 위해 비동기 엔드포인트에 모델을 배포하는 데 사용할 수 있는 API를 제공하는 SageMaker JumpStart용 UI 또는 SageMaker Python SDK를 사용할 수 있습니다.

%%time
from sagemaker.jumpstart.model import JumpStartModel, AsyncInferenceConfig
from sagemaker.serializers import JSONSerializer
from sagemaker.deserializers import JSONDeserializer model_id, model_version = "huggingface-llm-falcon-40b-instruct-bf16", "*"
my_model = JumpStartModel(model_id=model_id)
predictor = my_model.deploy( initial_instance_count=0, instance_type="ml.g5.12xlarge", async_inference_config=AsyncInferenceConfig()
)

이 호출을 완료하는 데 약 10분 정도 걸릴 수 있습니다. 이 시간 동안 엔드포인트가 가동되고 모델 아티팩트와 함께 컨테이너가 엔드포인트에 다운로드되고 모델 구성이 SageMaker JumpStart에서 로드된 다음 비동기 엔드포인트가 DNS 엔드포인트를 통해 노출됩니다. 엔드포인트가 XNUMX으로 축소될 수 있도록 하려면 Application Auto Scaling을 사용하여 비동기식 엔드포인트에서 Auto Scaling을 구성해야 합니다. 먼저 Application Auto Scaling에 엔드포인트 변형을 등록하고 조정 정책을 정의한 다음 조정 정책을 적용해야 합니다. 이 구성에서는 다음을 사용하여 맞춤 측정항목을 사용합니다. CustomizedMetricSpecification라는 ApproximateBacklogSizePerInstance, 다음 코드에 표시된 대로. 자세한 목록은 아마존 클라우드 워치 비동기 추론 엔드포인트에서 사용할 수 있는 측정항목은 다음을 참조하세요. CloudWatch로 모니터링.

import boto3 client = boto3.client("application-autoscaling")
resource_id = "endpoint/" + my_model.endpoint_name + "/variant/" + "AllTraffic" # Configure Autoscaling on asynchronous endpoint down to zero instances
response = client.register_scalable_target( ServiceNamespace="sagemaker", ResourceId=resource_id, ScalableDimension="sagemaker:variant:DesiredInstanceCount", MinCapacity=0, # Miminum number of instances we want to scale down to - scale down to 0 to stop incurring in costs MaxCapacity=1, # Maximum number of instances we want to scale up to - scale up to 1 max is good enough for dev
) response = client.put_scaling_policy( PolicyName="Invocations-ScalingPolicy", ServiceNamespace="sagemaker", # The namespace of the AWS service that provides the resource. ResourceId=resource_id, # Endpoint name ScalableDimension="sagemaker:variant:DesiredInstanceCount", # SageMaker supports only Instance Count PolicyType="TargetTrackingScaling", # 'StepScaling'|'TargetTrackingScaling' TargetTrackingScalingPolicyConfiguration={ "TargetValue": 5.0, # The target value for the metric. - here the metric is - SageMakerVariantInvocationsPerInstance "CustomizedMetricSpecification": { "MetricName": "ApproximateBacklogSizePerInstance", "Namespace": "AWS/SageMaker", "Dimensions": [{"Name": "EndpointName", "Value": my_model.endpoint_name}], "Statistic": "Average", }, "ScaleInCooldown": 600, # The amount of time, in seconds, after a scale in activity completes before another scale in activity can start. "ScaleOutCooldown": 300, # ScaleOutCooldown - The amount of time, in seconds, after a scale out activity completes before another scale out activity can start. # 'DisableScaleIn': True|False - indicates whether scale in by the target tracking policy is disabled. # If the value is true, scale in is disabled and the target tracking policy won't remove capacity from the scalable resource. },
)

SageMaker 콘솔로 이동하여 다음을 선택하여 이 정책이 성공적으로 설정되었는지 확인할 수 있습니다. 종점 아래에 추론 탐색 창에서 방금 배포한 엔드포인트를 찾습니다.

Optimize deployment cost of Amazon SageMaker JumpStart foundation models with Amazon SageMaker asynchronous endpoints | Amazon Web Services PlatoBlockchain Data Intelligence. Vertical Search. Ai.

비동기 엔드포인트 호출

엔드포인트를 호출하려면 요청 페이로드를 아마존 단순 스토리지 서비스 (Amazon S3)의 일부로 이 페이로드에 대한 포인터를 제공합니다. InvokeEndpointAsync 요구. 호출 시 SageMaker는 요청 처리를 대기열에 추가하고 식별자와 출력 위치를 응답으로 반환합니다. 처리 시 SageMaker는 결과를 Amazon S3 위치에 배치합니다. 선택적으로 성공 또는 오류 알림을 받도록 선택할 수 있습니다. 아마존 단순 알림 서비스 (아마존 SNS).

SageMaker Python SDK

배포가 완료되면 다음을 반환합니다. AsyncPredictor 물체. 비동기식 추론을 수행하려면 Amazon S3에 데이터를 업로드하고 predict_async() S3 URI를 입력으로 사용하는 메서드입니다. 그것은 반환할 것이다 AsyncInferenceResponse 개체를 사용하여 결과를 확인할 수 있습니다. get_response() 방법.

또는 주기적으로 결과를 확인하고 생성 시 반환하려면 다음을 사용하세요. predict() 방법. 다음 코드에서는 이 두 번째 방법을 사용합니다.

import time # Invoking the asynchronous endpoint with the SageMaker Python SDK
def query_endpoint(payload): """Query endpoint and print the response""" response = predictor.predict_async( data=payload, input_path="s3://{}/{}".format(bucket, prefix), ) while True: try: response = response.get_result() break except: print("Inference is not ready ...") time.sleep(5) print(f"33[1m Input:33[0m {payload['inputs']}") print(f"33[1m Output:33[0m {response[0]['generated_text']}") query_endpoint(payload)

보토3

이제 invoke_endpoint_async Boto3의 방법 sagemaker-runtime 고객. 이를 통해 개발자는 SageMaker 엔드포인트를 비동기식으로 호출하여 진행 상황 추적 및 나중에 응답 검색을 위한 토큰을 제공할 수 있습니다. Boto3은 SageMaker Python SDK처럼 비동기 추론이 완료될 때까지 기다리는 방법을 제공하지 않습니다. get_result() 작업. 따라서 우리는 Boto3가 추론 결과를 Amazon S3에 저장한다는 점을 활용합니다. response["OutputLocation"]. 다음 함수를 사용하여 추론 파일이 Amazon S3에 기록될 때까지 기다릴 수 있습니다.

import json
import time
import boto3
from botocore.exceptions import ClientError s3_client = boto3.client("s3") # Wait until the prediction is generated
def wait_inference_file(bucket, prefix): while True: try: response = s3_client.get_object(Bucket=bucket, Key=prefix) break except ClientError as ex: if ex.response['Error']['Code'] == 'NoSuchKey': print("Waiting for file to be generated...") time.sleep(5) next else: raise except Exception as e: print(e.__dict__) raise return response

이제 이 함수를 사용하여 엔드포인트를 쿼리할 수 있습니다.

# Invoking the asynchronous endpoint with the Boto3 SDK
import boto3 sagemaker_client = boto3.client("sagemaker-runtime") # Query the endpoint function
def query_endpoint_boto3(payload): """Query endpoint and print the response""" response = sagemaker_client.invoke_endpoint_async( EndpointName=my_model.endpoint_name, InputLocation="s3://{}/{}".format(bucket, prefix), ContentType="application/json", Accept="application/json" ) output_url = response["OutputLocation"] output_prefix = "/".join(output_url.split("/")[3:]) # Read the bytes of the file from S3 in output_url with Boto3 output = wait_inference_file(bucket, output_prefix) output = json.loads(output['Body'].read())[0]['generated_text'] # Emit output print(f"33[1m Input:33[0m {payload['inputs']}") print(f"33[1m Output:33[0m {output}") query_endpoint_boto3(payload)

랭체인

LangChain은 Harrison Chase가 2022년 XNUMX월에 출시한 오픈 소스 프레임워크입니다. 다양한 시스템 및 데이터 소스와의 통합을 제공하여 LLM(대형 언어 모델)을 사용하는 애플리케이션 개발을 단순화합니다. LangChain은 문서 분석, 요약, 챗봇 생성, 코드 분석 등을 허용합니다. 수백 명의 개발자의 기여와 벤처 회사의 상당한 자금 지원으로 인기를 얻었습니다. LangChain을 사용하면 LLM을 외부 소스와 연결할 수 있어 동적인 데이터 응답 애플리케이션을 만들 수 있습니다. 개발 프로세스를 간소화하기 위해 라이브러리, API 및 문서를 제공합니다.

LangChain은 프레임워크와 함께 SageMaker 엔드포인트를 사용하기 위한 라이브러리와 예제를 제공하므로 SageMaker에서 호스팅되는 ML 모델을 체인의 "브레인"으로 더 쉽게 사용할 수 있습니다. LangChain이 SageMaker와 통합하는 방법에 대해 자세히 알아보려면 다음을 참조하세요. SageMaker 엔드포인트 LangChain 문서에서.

현재 LangChain 구현의 한계 중 하나는 기본적으로 비동기 엔드포인트를 지원하지 않는다는 것입니다. LangChain에 대한 비동기 엔드포인트를 사용하려면 새 클래스를 정의해야 합니다. SagemakerAsyncEndpoint, 이는 SagemakerEndpoint 클래스는 LangChain에서 이미 사용 가능합니다. 또한 다음 정보를 제공합니다.

  • 비동기 추론이 입력(및 출력)을 저장하는 S3 버킷 및 접두사
  • 시간 초과되기 전에 대기할 최대 시간(초)
  • An updated _call() 엔드포인트를 쿼리하는 함수 invoke_endpoint_async() 대신 invoke_endpoint()
  • 콜드 스타트 ​​상태인 경우 비동기 엔드포인트를 깨우는 방법(XNUMX으로 축소)

새로 생성된 내용을 검토하려면 SagemakerAsyncEndpoint, 당신은 체크 아웃 할 수 있습니다 sagemaker_async_endpoint.py 파일 GitHub에서 사용 가능.

from typing import Dict
from langchain import PromptTemplate
from langchain.llms.sagemaker_endpoint import LLMContentHandler
from langchain.chains import LLMChain
from sagemaker_async_endpoint import SagemakerAsyncEndpoint class ContentHandler(LLMContentHandler): content_type:str = "application/json" accepts:str = "application/json" len_prompt:int = 0 def transform_input(self, prompt: str, model_kwargs: Dict) -> bytes: self.len_prompt = len(prompt) input_str = json.dumps({"inputs": prompt, "parameters": {"max_new_tokens": 100, "do_sample": False, "repetition_penalty": 1.1}}) return input_str.encode('utf-8') def transform_output(self, output: bytes) -> str: response_json = output.read() res = json.loads(response_json) ans = res[0]['generated_text'] return ans chain = LLMChain( llm=SagemakerAsyncEndpoint( input_bucket=bucket, input_prefix=prefix, endpoint_name=my_model.endpoint_name, region_name=sagemaker.Session().boto_region_name, content_handler=ContentHandler(), ), prompt=PromptTemplate( input_variables=["query"], template="{query}", ),
) print(chain.run(payload['inputs']))

정리

엔드포인트에서 추론 생성 테스트를 마쳤으면 추가 비용이 발생하지 않도록 엔드포인트를 삭제해야 합니다.

predictor.delete_endpoint()

결론

TII Falcon과 같은 대규모 기반 모델을 배포할 때는 비용 최적화가 중요합니다. 이러한 모델에는 강력한 하드웨어와 상당한 메모리 용량이 필요하므로 인프라 비용이 높아집니다. 요청을 비동기식으로 처리하는 배포 옵션인 SageMaker 비동기 추론은 보류 중인 요청이 없을 때 인스턴스 수를 3으로 확장하여 비용을 절감합니다. 이 게시물에서는 대규모 SageMaker JumpStart 기반 모델을 SageMaker 비동기 엔드포인트에 배포하는 방법을 시연했습니다. 비동기 엔드포인트를 호출하고 결과를 검색하는 다양한 방법을 설명하기 위해 SageMaker Python SDK, BotoXNUMX 및 LangChain을 사용하는 코드 예제를 제공했습니다. 이러한 기술을 통해 개발자와 연구자는 고급 언어 이해 시스템을 위한 기반 모델의 기능을 사용하면서 비용을 최적화할 수 있습니다.

비동기 추론 및 SageMaker JumpStart에 대해 자세히 알아보려면 다음 게시물을 확인하십시오.


저자,

다비데의 사진다비드 갈리텔리 EMEA 지역의 AI/ML 전문 솔루션 설계자입니다. 그는 브뤼셀에 거주하며 베네룩스 전역의 고객과 긴밀하게 협력하고 있습니다. 그는 아주 어렸을 때부터 개발자였으며 ​​7세에 코딩을 시작했습니다. 그는 대학에서 AI/ML을 배우기 시작했고 그때부터 사랑에 빠졌습니다.

타임 스탬프 :

더보기 AWS 기계 학습