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를 명확하게 지정할 수 있다.

  1. 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에서는 다음과 같이 강제 지정이 가능하다.

  2. 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'
    
  3. 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

is a collection of Papers I have written.
© 2000 - Sang-Kil Park Except where otherwise noted, content on this site is licensed under a CC BY 4.0.
This site design was brought from Distill.