
AWS SageMaker
AWS SageMaker
학습 부터 배포까지 전체 데이터 플로우를 관리하는 주피터 노트북 기반 통합 제공. 모델 경량화 서빙은 SageMaker Neo
SageMaker Inference
Inference만 별도 테스트 진행:
- Marketplace model packages에서 모델 구독. 여기서는 VARCO LLM KO-1.3B-IST 실험.
- Models에 모델 셋업
- Endpoint configurations에서 서버 설정. 서울 리전에서는 ml.g4dn.2xlarge만 가능. g5가 아직 지원되지 않음.
- Endpoints에서 앞서 설정을 이용해 구성. 서비스 시작에 다소 시간이 소요된다.
$ aws sagemaker-runtime invoke-endpoint \ --endpoint-name varco-endpoint \ --body fileb://body \ output_file.txt
호출 방식이 REST 지원 없이 aws cli 형태이며 파일 저장 방식이라 매우 불편하다.
# body
{
"text": "세상에서 가장 위대한 운동 선수는 누구일까?",
"request_output_len": 512,
"repetition_penalty": 1.2,
"temperature": 0.5
}
# output_file.txt
{"result":["세상에서 가장 위대한 운동 선수는 누구일까?\n\n### 응답:마이클 펠프스"]}
별도 인스턴스를 항상 구동하는 형태라 serverless가 아니며 deploy에 한참 걸린다. 비용도 ec2 vanilla보다 더 비싸다. 게다가 REST로 호출할 수 없고 SageMaker Studio나 SDK, aws cli만 가능해서 매우 불편하다.
Hugging Face SageMaker
REST를 가장 잘 지원하는 것은 허깅페이스이며, Inference API는 당연히 aws vpn에 조인할 수 없기 때문에 보안에 한계가 있으나 SageMaker 배포가 가능하다. 이 경우 앞서 과정을 코드 몇 줄로 자동으로 처리한다.
import sagemaker
import boto3
from sagemaker.huggingface import HuggingFaceModel
iam = boto3.client('iam')
role = iam.get_role(RoleName='SageMakerExecutionRole')['Role']['Arn']
sess = sagemaker.Session()
huggingface_model = HuggingFaceModel(
model_data="s3://xxx-models/model.tar.gz",
role=role,
transformers_version="4.28.1",
pytorch_version="2.0.0",
py_version='py310',
)
Hub에 있는 모델은 더 간편하게 배포가 가능하며 이외에도 이처럼 S3를 이용해서 배포가 가능하다. 버전을 지정할 경우 tgi가 아닌 pytorch-inference DLC가 배포된다. tgi는 llm 주소를 직업 읽어들여야 한다.
from sagemaker.huggingface import get_huggingface_llm_image_uri
llm_image = get_huggingface_llm_image_uri(
"huggingface",
region=sess.boto_region_name,
)
그러나 tgi는 custom model 서비스가 까다롭다. 다음과 같이 deploy하면 Endpoint를 생성한다.
predictor = huggingface_model.deploy(
initial_instance_count=1,
instance_type="ml.g5.2xlarge",
container_startup_health_check_timeout=300,
)
이미 deployed이면 Endpoint만 지정하여 다음과 같이 predictor를 얻는다. 대부분 deploy만 설명하고 HuggingFacePredictor를 설명하는 문서가 거의 없다. 다들 튜토리얼만 하고 실제로 많이 쓰지는 않는다는 얘기.
import sagemaker
from sagemaker.huggingface.model import HuggingFacePredictor
predictor = HuggingFacePredictor(
endpoint_name="huggingface-pytorch-tgi-inference-xxx",
sagemaker_session=sagemaker.Session()
)
호출:
system_prompt = (
'xxx '
'xxx '
'xxx '
)
inputs = "이틀 동안의 제주도 여행 계획 세워줘"
prompt = (f'{system_prompt}'
f'<human>: {inputs} <bot>:')
predictor.predict({
'inputs': prompt,
'parameters': {
'do_sample': True,
'temperature': 0.5,
'repetition_penalty': 1.2,
'top_p': 0.95,
'top_k': 20,
'max_new_tokens': 512,
}
})
CLI 방식
SDK를 이용하면 VPC내에 LLM을 배포할 수 없다. 옵션이 존재하지 않음. philschmid의 글1에 가이드가 있으나 정작 VPC 관련 내용은 전혀 없다. 제목과 다른 내용으로, 실무 적용 사례가 아닌 가이드의 한계점이 엿보인다.
CLI에서는 다음과 같이 VPC를 명확하게 지정할 수 있다.
- create-model
$ aws sagemaker create-model \ --model-name xxx-1b-model-20230826 \ --primary-container 'Image=763104351884.dkr.ecr.ap-northeast-2.amazonaws.com/huggingface-pytorch-inference:2.0.0-transformers4.28.1-gpu-py310-cu118-ubuntu20.04,Mode=SingleModel,ModelDataUrl=s3://xxx-models/model.tar.gz,Environment={SAGEMAKER_CONTAINER_LOG_LEVEL=20,SAGEMAKER_REGION=ap-northeast-2}' \ --execution-role-arn arn:aws:iam::xxx:role/SageMakerExecutionRole \ --vpc-config 'SecurityGroupIds=sg-xxx,Subnets=subnet-xxx,subnet-xxx,subnet-xxx,subnet-xxx'
tgi는 custom model을 인식하기 까다로워 inference DLC 사용. 또한 ap-northeast-2에서
ml.g5.2xlarge
인스턴스 생성이 막혀 있는데 CLI에서는 다음과 같이 강제 지정이 가능하다. - create-endpoint-configuration
$ aws sagemaker create-endpoint-config \ --endpoint-config-name xxx-1b-configuration-20230826 \ --production-variants 'VariantName=default-variant,ModelName=xxx-1b-model-20230826,InitialInstanceCount=1,InstanceType=ml.g5.2xlarge,InitialVariantWeight=1.0'
- create-endpoint
$ aws sagemaker create-endpoint \ --endpoint-name xxx-1b-20230826 \ --endpoint-config-name xxx-1b-configuration-20230826
Hugging Face SageMaker 문제점
- tgi 이미지는
HF_MODEL_ID
설정이 반드시 필요하다. safetensors를 생성해 model.tar.gz를 함께 만들고 위치를/opt/ml/model
로 지정한다. safetensors를 저장하지 않으면 read only file system이라며 실패한다. 또한 LlamaTokenizer를 사용하지 않으면 실패한다. - vpc를 설정하면 s3에 접근이 되지 않으므로 vpc > endpoint를 반드시 생성해야 한다.
- 서비스는 s3를 검색하고 Endpoint type은 Gateway.
- 콘솔에서는 ap-northeast-2 리전에서 ml.g5.2xlarge가 선택이 되지 않는다. sdk 또는 cli에서만 강제 지정이 가능하다.
Last Modified: 2023/09/05 14:34:27