AWS 기술 블로그

허깅페이스와 LoRA를 사용하여 단일 Amazon SageMaker GPU에서 대규모 언어 모델(LLM) 훈련하기

이 글은 AWS Machine Learning Blog에 게시된 Train a Large Language Model on a single Amazon SageMaker GPU with Hugging Face and LoRA by Philipp Schmid, Doug Kelly, and Robert Fisher을 한국어로 번역 및 편집하였습니다.

원문은 허깅페이스의 필립 슈미드(Philipp Schmid)와 공동 작성되었습니다.

대규모 언어 모델(LLM; Large Language Models) 분야의 발전과 LLM이 가치 있는 인사이트를 제공하는 문제 세트 수가 계속 증가하고 있다는 소식을 들어보셨을 겁니다. 대규모 데이터 세트와 여러 작업을 통해 훈련된 대규모 모델은 훈련되지 않은 특정 작업에도 잘 일반화됩니다. 이러한 모델을 파운데이션 모델(foundation model)이라고 하며, 스탠포드 HAI 연구소(Stanford Institute for Human-Centered Artificial Intelligence)에서 처음 대중화한 용어입니다. 이러한 파운데이션 모델은 프롬프트 엔지니어링(prompt engineering) 기법의 도움으로 잘 활용할 수 있지만, 유스케이스가 도메인에 매우 특화되어 있거나 작업의 종류가 매우 다양하여 모델을 추가로 커스터마이징해야 하는 경우가 많습니다. 특정 도메인이나 작업에 대한 대규모 모델의 성능을 개선하기 위한 한 가지 접근 방식은 더 작은 작업별 데이터 세트로 모델을 추가로 훈련하는 것입니다. 파인 튜닝(fine-tuning)으로 알려진 이 접근 방식은 LLM의 정확도를 성공적으로 개선하지만, 모든 모델 가중치를 수정해야 합니다. 파인 튜닝 데이터 세트 크기가 훨씬 작기 때문에 사전 훈련(pre-training)하는 것 보다 훨씬 빠르지만 여전히 상당한 컴퓨팅 성능과 메모리가 필요합니다. 파인 튜닝은 원본 모델의 모든 파라미터 가중치를 수정하므로 비용이 많이 들고 원본 모델과 동일한 크기의 모델을 생성하므로 스토리지 용량에도 부담이 됩니다.

이러한 문제를 해결하기 위해 허깅페이스는 효율적인 파라미터 파인 튜닝(PEFT; Parameter-Efficient Fine-Tuning) 라이브러리를 도입했습니다. 이 라이브러리를 사용하면 대부분의 원래 모델 가중치를 동결하고 훨씬 작은 추가 파라미터 세트만 훈련하여 모델 레이어를 교체하거나 확장할 수 있습니다. 따라서 필요한 컴퓨팅 및 메모리 측면에서 훨씬 적은 비용으로 훈련을 수행합니다.

이 게시글에서는 고품질 머신 러닝(ML) 모델을 준비, 구축, 훈련 및 배포하기 위한 아마존의 ML 플랫폼인 Amazon SageMaker에서 단일 그래픽 처리 장치(GPU; Graphics Processing Unit)만 사용하여 70억 개의 파라미터로 구성된 BloomZ 모델을 훈련하는 방법을 보여드립니다. BloomZ는 범용 자연어 처리(NLP; Natural Language Processing) 모델입니다. 우리는 이 모델을 메신저와 같은 대화를 요약하는 특정 작업에 최적화하기 위해 PEFT를 사용합니다. 본 게시글에서 사용할 단일 GPU 인스턴스는 AWS가 제공하는 여러 인스턴스 유형 중 저렴한 인스턴스 중의 하나입니다. 단일 GPU에서 이 모델을 훈련하는 것은 가장 비용 효율적인 AI/ML 서비스 제공업체가 되고자 하는 AWS의 노력을 강조합니다.

이 게시글의 코드는 허깅페이스 깃허브 리포지토리의 noteboooks/sagemaker/24_train_bloom_peft_lora 폴더에 있습니다.

사전 요구 사항

이 과정을 따라하려면 다음과 같은 사전 요구 사항이 필요합니다:

  • AWS 계정
  • Amazon SageMaker Studio 내에 있는 주피터(Jupyter) 노트북 또는 SageMaker 노트북 인스턴스
  • 단일 NVIDIA A10G GPU가 포함된 SageMaker ml.g5.2xlarge 인스턴스 유형에 액세스할 수 있어야 합니다. AWS 관리 콘솔에서 SageMaker의 서비스 할당량(Service Quota)으로 이동하여 훈련 작업 사용을 위한 ml.g5.2xlarge 및 엔드포인트 사용을 위한 ml.g5.2xlarge 할당량에 대해 인스턴스 1개 증가를 요청합니다.
  • 요청된 할당량이 AWS 계정에 적용된 후에는 SageMaker Studio의 기본 Python 3(Data Science) 이미지와 ml.t3.medium 인스턴스를 사용하여 노트북 코드 스니펫을 실행할 수 있습니다. 사용 가능한 커널의 전체 목록은 사용 가능한 Amazon SageMaker 커널을 참조하기 바랍니다.

SageMaker 세션 설정

다음 코드를 사용하여 SageMaker 세션을 설정합니다.

import sagemaker
import boto3
sess = sagemaker.Session()
# sagemaker session bucket -> used for uploading data, models and logs
# sagemaker will automatically create this bucket if it does not exist
sagemaker_session_bucket=None
if sagemaker_session_bucket is None and sess is not None:
    # set to default bucket if a bucket name is not given
    sagemaker_session_bucket = sess.default_bucket()

try:
    role = sagemaker.get_execution_role()
except ValueError:
    iam = boto3.client('iam')
    role = iam.get_role(RoleName='sagemaker_execution_role')['Role']['Arn']

sess = sagemaker.Session(default_bucket=sagemaker_session_bucket)

print(f"sagemaker role arn: {role}")
print(f"sagemaker bucket: {sess.default_bucket()}")
print(f"sagemaker session region: {sess.boto_region_name}")

데이터 세트 로드 및 준비

16,000개의 메신저 대화 모음과 요약이 포함된 samsum 데이터 세트를 사용합니다. 이 대화는 영어에 능통한 언어학자들이 작성하고 기록한 것입니다. 다음은 데이터 세트의 한 예시입니다.

{
  "id": "13818513",
  "summary": "Amanda baked cookies and will bring Jerry some tomorrow.",
  "dialogue": "Amanda: I baked cookies. Do you want some?\r\nJerry: Sure!\r\nAmanda: I'll bring you tomorrow :-)"
}

모델을 훈련하려면 입력(텍스트) 문장을 토큰 ID로 변환해야 합니다. 이 작업은 허깅페이스 트랜스포머 tokenizer 도구로 수행됩니다. 자세한 내용은 허깅페이스 NLP 과정의 6장을 참조하기 바랍니다.

다음 코드를 사용하여 입력 문장을 토큰으로 변환합니다.

from transformers import AutoTokenizer

model_id="bigscience/bloomz-7b1"

# Load tokenizer of BLOOMZ
tokenized = AutoTokenizer.from_pretrained(model_id)
tokenizer.model_max_length = 2048 # overwrite wrong value

훈련을 시작하기 전에 데이터를 전처리해야 합니다. 훈련이 완료되면 모델은 일련의 문자 메시지를 입력으로 받아 요약 문장을 출력으로 생성합니다. 올바른 응답(요약) 결과가 포함된 프롬프트(메시지)로 데이터의 포맷을 지정해야 합니다. 또한 모델 훈련을 최적화하기 위해 예시를 더 긴 입력 시퀀스로 청킹(chunking)해야 합니다. 다음 코드를 참조하기 바랍니다.

from random import randint
from itertools import chain
from functools import partial

# custom instruct prompt start
prompt_template = f"Summarize the chat dialogue:\n{{dialogue}}\n---\nSummary:\n{{summary}}{{eos_token}}"

# template dataset to add prompt to each sample
def template_dataset(sample):
    sample["text"] = prompt_template.format(dialogue=sample["dialogue"],
                                            summary=sample["summary"],
                                            eos_token=tokenizer.eos_token)
    return sample


# apply prompt template per sample
dataset = dataset.map(template_dataset, remove_columns=list(dataset.features))

print(dataset[randint(0, len(dataset))]["text"])

# empty list to save remainder from batches to use in next batch
remainder = {"input_ids": [], "attention_mask": []}


def chunk(sample, chunk_length=2048):
    # define global remainder variable to save remainder from batches to use in next batch
    global remainder
    # Concatenate all texts and add remainder from previous batch
    concatenated_examples = {k: list(chain(*sample[k])) for k in sample.keys()}
    concatenated_examples = {k: remainder[k] + concatenated_examples[k] for k in concatenated_examples.keys()}
    # get total number of tokens for batch
    batch_total_length = len(concatenated_examples[list(sample.keys())[0]])

    # get max number of chunks for batch
    if batch_total_length >= chunk_length:
        batch_chunk_length = (batch_total_length // chunk_length) * chunk_length

    # Split by chunks of max_len.
    result = {
        k: [t[i : i + chunk_length] for i in range(0, batch_chunk_length, chunk_length)]
        for k, t in concatenated_examples.items()
    }
    # add remainder to global variable for next batch
    remainder = {k: concatenated_examples[k][batch_chunk_length:] for k in concatenated_examples.keys()}
    # prepare labels
    result["labels"] = result["input_ids"].copy()
    return result


# tokenize and chunk dataset
lm_dataset = dataset.map(
    lambda sample: tokenizer(sample["text"]), batched=True, remove_columns=list(dataset.features)
).map(
    partial(chunk, chunk_length=2048),
    batched=True,
)

# Print total number of samples
print(f"Total number of samples: {len(lm_dataset)}")

이제 FileSystem integration을 사용하여 데이터 집합을 Amazon S3(Amazon Simple Storage Service)에 업로드합니다.

# save train_dataset to s3
training_input_path = f's3://{sess.default_bucket()}/processed/samsum-sagemaker/train'
lm_dataset.save_to_disk(training_input_path)

print("uploaded data to:")
print(f"training dataset to: {training_input_path}")

In [ ]:
training_input_path="s3://sagemaker-us-east-1-558105141721/processed/samsum-sagemaker/train"

SageMaker에서 LoRA 및 bitsandbytes int-8로 BLOOMZ-7B 모델 파인 튜닝하기

아래 그림은 이해를 돕기 위해 역자가 추가한 것으로, BLOOMZ-7B 모델 파인 튜닝 및 배포 아키텍처를 표현한 것입니다.

그림 1. BLOOMZ-7B 모델 파인 튜닝 및 배포 아키텍처

허깅페이스 BLOOMZ-7B 모델 카드는 초기 훈련이 각각 8장의 A100 80GB GPU와 512GB 메모리 CPU를 갖춘 8개의 노드에 분산되어 있음을 나타냅니다. 이러한 컴퓨팅 구성은 쉽게 액세스할 수 없고, 소비자에게는 비용이 많이 들며, 분산 훈련 성능 최적화에 대한 전문 지식이 필요합니다. SageMaker 분산 훈련 라이브러리를 통해 분산 훈련의 진입 장벽을 낮출 수 있지만, 유사한 8개의 온디맨드 ml.p4de.24xlarge 인스턴스의 비용은 시간당 $376.88입니다. 또한 완전히 훈련된 모델은 약 40GB의 메모리를 소비하는데, 이는 소비자용 개별 GPU의 가용 메모리를 초과하는 것으로 대규모 모델 추론에는 이를 해결해야 할 전략이 필요합니다. 결과적으로 여러 번의 모델 실행과 배포를 통해 특정 작업에 맞게 모델을 완전히 파인 튜닝하려면 소비자가 쉽게 이용할 수 없는 고가의 하드웨어에서 상당한 컴퓨팅, 메모리 및 스토리지 비용이 필요합니다.

우리의 목표는 정확성을 유지하면서 보다 접근하기 쉽고 비용 효율적인 방식으로 채팅 요약 유스케이스에 BLOOMZ-7B를 적용할 수 있는 방법을 찾는 것입니다. 소비자용 단일 NVIDIA A10G GPU가 탑재된 SageMaker ml.g5.2xlarge 인스턴스에서 모델을 파인 튜닝할 수 있도록 하기 위해 두 가지 기법을 사용하여 파인 튜닝에 필요한 컴퓨팅 및 메모리 요구 사항을 줄였습니다. 바로 LoRA(Low-Rank Adaptation)와 양자화(Quantization)입니다.

LoRA는 예측 성능의 손실 없이 신규 작업에 맞게 파인 튜닝하는 데 필요한 모델 파라미터 수와 컴퓨팅을 크게 줄여주는 기법입니다. 원래 모델 가중치를 동결하고 전체 가중치를 업데이트하는 대신, 더 적은 순위 분해(rank-decomposition) 가중치 행렬을 신규 작업에 맞게 최적화한 다음, 이렇게 조정된 가중치를 원래 모델에 다시 합산합니다. 결과적으로 가중치 그래디언트(gradient) 업데이트 횟수가 적다는 것은 파인 튜닝 시 컴퓨팅 및 GPU 메모리를 덜 사용한다는 것을 의미합니다. 이러한 접근 방식의 이면에는 LoRA를 통해 LLM이 가장 중요한 입력 및 출력 토큰에 집중하고 중복되거나 덜 중요한 토큰은 무시할 수 있다는 직관적인 이점이 있습니다. LoRA 기법을 더 자세히 이해하려면 LoRA: Low-Rank Adaptation of Large Language Models 논문을 참조하기 바랍니다.

LoRA 기법 외에도 bitsandbytes 허깅페이스 통합 LLM.int8() 메서드를 사용하여 고정된 BloomZ 모델 파라미터를 정량화하거나 가중치 및 바이어스 값을 float16에서 int8로 반올림하여 정밀도를 낮출 수 있습니다. 양자화하면 BloomZ에 필요한 메모리가 약 4배 감소하므로 예측 성능의 큰 손실 없이 A10G GPU 인스턴스에 모델을 탑재할 수 있습니다. int8 양자화의 작동 방식, bitsandbytes 라이브러리에서의 구현, 허깅페이스 트랜스포머 라이브러리와의 통합에 대한 자세한 내용은 Gentle Introduction to 8-bit Matrix Multiplication for transformers at scale using Hugging Face Transformers, Accelerate and bitsandbytes를 참조하기 바랍니다.

허깅페이스는 PEFT 라이브러리와 bitsandbytes 라이브러리와의 통합을 통해 광범위한 트랜스포머 모델에서 LoRA 및 양자화 기법을 적용할 수 있도록 했습니다. 예제 스크립트 run_clm.pycreate_peft_config() 함수는 훈련을 위해 모델을 준비할 때 LoRA와 양자화 기법을 적용하는 방법을 보여줍니다.

def create_peft_config(model):
    from peft import (
        get_peft_model,
        LoraConfig,
        TaskType,
        prepare_model_for_int8_training,
    )

    peft_config = LoraConfig(
        task_type=TaskType.CAUSAL_LM,
        inference_mode=False,
        r=8, # Lora attention dimension.
        lora_alpha=32, # the alpha parameter for Lora scaling.
        lora_dropout=0.05, # the dropout probability for Lora layers.
        target_modules=["query_key_value"],
    )

    # prepare int-8 model for training
    model = prepare_model_for_int8_training(model)
    model = get_peft_model(model, peft_config)
    model.print_trainable_parameters()
    return model

LoRA 적용 시 print_trainable_parameters()의 출력에 따르면 모델 파라미터 수가 70억 개에서 390만 개로 줄어들었음을 알 수 있습니다. 즉, 원래 모델 파라미터의 0.056%(역자주 : 영문글의 5.6%는 수치 오류)만 업데이트하면 된다는 의미죠. 이렇게 컴퓨팅 및 메모리 요구 사항을 크게 줄였기 때문에 GPU 메모리에 모델을 문제 없이 적재하고 훈련할 수 있습니다.

SageMaker 훈련 작업을 생성하려면 허깅페이스 estimator가 필요합니다. 이 estimator는 엔드-투-엔드 SageMaker 훈련 및 배포 작업을 처리합니다. SageMaker는 필요한 모든 Amazon EC2(Amazon Elastic Compute Cloud) 인스턴스를 시작하고 관리하는 작업을 처리합니다. 또한 적합한 허깅페이스 훈련 컨테이너로 SageMaker가 관리하는 허깅페이스 환경을 시작하고, 사용자가 작성한 훈련 스크립트를 업로드하고, S3 버킷에서 /opt/ml/input/data 경로에 있는 컨테이너로 데이터를 다운로드합니다. 모델 훈련에 필요한 모든 환경이 구성되면 훈련을 시작합니다. estimator 클래스 구성에 대한 예시는 다음 코드를 참조하기 바랍니다.

import time
# define Training Job Name 
job_name = f'huggingface-peft-{time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())}'

from sagemaker.huggingface import HuggingFace

# hyperparameters, which are passed into the training job
hyperparameters ={
  'model_id': model_id,                                # pre-trained model
  'dataset_path': '/opt/ml/input/data/training', # path where sagemaker will save training dataset
  'epochs': 3,                                         # number of training epochs
  'per_device_train_batch_size': 1,                    # batch size for training
  'lr': 2e-4,                                          # learning rate used during training
}

# create the Estimator
huggingface_estimator = HuggingFace(
    entry_point          = 'run_clm.py',      # train script
    source_dir           = 'scripts',         # directory which includes all the files needed for training
    instance_type        = 'ml.g5.2xlarge', # instances type used for the training job
    instance_count       = 1,                 # the number of instances used for training
    base_job_name        = job_name,          # the name of the training job
    role                 = role,              # IAM role used in training job to access AWS resources, e.g. S3
    volume_size          = 300,               # the size of the EBS volume in GB
    transformers_version = '4.26',            # the transformers version used in the training job
    pytorch_version      = '1.13',            # the pytorch_version version used in the training job
    py_version           = 'py39',            # the python version used in the training job
    hyperparameters      =  hyperparameters
)

이제 .fit() 메서드를 사용하여 훈련 작업을 시작하고 훈련 스크립트에 S3 경로를 전달합니다.

# define a data input dictionary with our uploaded s3 uris
data = {'training': training_input_path}

# starting the train job with our uploaded datasets as inputs
huggingface_estimator.fit(data, wait=True)

LoRA와 양자화를 사용하면 SageMaker를 통해 저렴하고 효율적으로 BLOOMZ-7B를 각 작업에 맞게 파인 튜닝할 수 있습니다. SageMaker 훈련 작업을 사용할 때는 모델 훈련 기간 동안만 GPU 비용을 지불하면 됩니다. 이 예시에서 SageMaker 훈련 작업은 20,632초, 즉 약 5.7시간이 걸렸습니다. 훈련에 사용한 ml.g5.2xlarge 인스턴스는 온디맨드 사용 시 시간당 $1.515입니다. 그 결과, 파인 튜닝된 BLOOMZ-7B 모델을 훈련하는 데 든 총 비용은 8.63달러에 불과했습니다. 이에 비해 모델의 70억 개 가중치를 모두 파인 튜닝하려면 허깅페이스 모델 카드에 설명된 원래 컴퓨팅 구성에서 선형 GPU 스케일링을 가정할 때, 훈련 실행당 약 600달러로 LoRA 대비 약 69배의 비용이 더 들 것으로 예상됩니다.(역자주 : 영문글의 6,900%는 수치 오류) 실제로는 훈련 전략, 인스턴스 선택, 인스턴스 가격에 따라 더 달라질 수 있습니다.

SageMaker 관리형 스팟 인스턴스(SageMaker managed Spot Instances)를 사용하면 훈련 비용을 더욱 절감할 수도 있습니다. 그러나 스팟 인스턴스 중단으로 인해 총 훈련 시간이 늘어날 가능성이 있습니다. 인스턴스 가격 책정에 대한 자세한 내용은 Amazon SageMaker 가격 책정을 참조하기 바랍니다.

훈련한 모델을 추론을 위해 SageMaker 엔드포인트에 배포하기

LoRA를 사용하여 기존 대비 훨씬 작은 용량의 가중치 세트를 신규 작업에 적용했습니다. 이러한 작업별 가중치를 원래 모델의 사전 훈련된 가중치와 결합하는 방법이 필요합니다. run_clm.py 스크립트에서 PEFT 라이브러리의 merge_and_unload() 메서드는 원래 모델에 비해 추론 대기 시간 없이 쉽게 배포할 수 있도록 작업에 맞게 파인 튜닝된 업데이트된 adapter 가중치를 기본 BLOOMZ-7B 모델과 병합하는 작업을 처리합니다.

이 절에서는 파인 튜닝된 모델 아티팩트에서 SageMaker 모델을 생성하고 추론을 위해 SageMaker 엔드포인트에 배포하는 단계를 살펴봅니다. 먼저, 파인 튜닝된 신규 모델 아티팩트를 사용하여 허깅페이스 모델 생성 후 SageMaker 엔드포인트에 배포할 수 있습니다. 이전에 SageMaker 허깅페이스 estimator로 모델을 훈련했기 때문에 모델을 즉시 배포할 수 있습니다. 또는 훈련한 모델을 S3 버킷에 업로드하고 나중에 모델 패키지를 생성하는 데 사용할 수도 있습니다. 다음 코드를 참조하기 바랍니다.

from sagemaker.huggingface import HuggingFaceModel

# 1. create Hugging Face Model Class
huggingface_model = HuggingFaceModel(
   model_data=huggingface_estimator.model_data,
   #model_data="s3://hf-sagemaker-inference/model.tar.gz",  # Change to your model path
   role=role, 
   transformers_version="4.26", 
   pytorch_version="1.13", 
   py_version="py39",
   model_server_workers=1
)

다른 SageMaker estimator와 마찬가지로, 허깅페이스 estimator 객체에서 deploy() 메서드를 사용하여 원하는 인스턴스 개수와 유형을 전달하여 모델을 배포합니다. 이 예제에서는 이전 단계에서 모델을 파인 튜닝한 단일 NVIDIA A10G GPU가 장착된 동일한 G5 인스턴스 유형을 사용합니다.

# 2. deploy model to SageMaker Inference
predictor = huggingface_model.deploy(
   initial_instance_count=1,
   instance_type= "ml.g5.4xlarge"
)

SageMaker 엔드포인트가 추론 요청을 수락할 준비를 하기 위해 인스턴스를 온라인 상태로 만들고 모델을 다운로드하는 데 5~10분 정도 소요됩니다.

엔드포인트가 실행 중이면 테스트 분할 데이터 세트에서 샘플 대화를 전송하여 테스트할 수 있습니다. 먼저 허깅페이스 datasets 라이브러리를 사용하여 테스트 분할 세트를 로드합니다. 그런 다음, 데이터 세트 배열에서 단일 테스트 샘플을 인덱싱하기 위한 임의의 정수를 선택합니다. 문자열 형식을 사용하여 테스트 샘플을 프롬프트 템플릿과 결합하여 모델의 응답을 안내하는 구조화된 입력으로 만듭니다. 그런 다음, 이 구조화된 입력을 추가 모델 입력 매개변수와 결합하여 포맷이 지정된 샘플 JSON 페이로드에 포함시킵니다. 마지막으로, 포맷이 지정된 샘플을 사용하여 SageMaker 엔드포인트를 호출하고 샘플 대화를 요약한 모델의 결과 값을 출력합니다. 다음 코드를 참조하기 바랍니다.

from random import randint
from datasets import load_dataset

# 1. Load dataset from the hub
test_dataset = load_dataset("samsum", split="test")

# 2. select a random test sample
sample = test_dataset[randint(0,len(test_dataset))]

# 3. format the sample
prompt_template = f"Summarize the chat dialogue:\n{{dialogue}}\n---\nSummary:\n"

fomatted_sample = {
  "inputs": prompt_template.format(dialogue=sample["dialogue"]),
  "parameters": {
    "do_sample": True, # sample output predicted probabilities
    "top_p": 0.9, # sampling technique Fan et. al (2018)
    "temperature": 0.1, # increasing the likelihood of high probability words and decreasing the likelihood of low probability words
    "max_new_tokens": 100, # 
  }
}

# 4. Invoke the SageMaker endpoint with the formatted sample
res = predictor.predict(fomatted_sample)


# 5. Print the model output
print(res[0]["generated_text"].split("Summary:")[-1])
# Sample model output: Kirsten and Alex are going bowling this Friday at 7 pm. They will meet up and then go together.

이제 모델이 추론한 대화의 출력 요약 문장과 테스트 샘플의 정답 요약 문장을 비교해 보겠습니다.

print(sample["summary"])
# Sample model input: Kirsten reminds Alex that the youth group meets this Friday at 7 pm to go bowling.

리소스 정리

이제 모델을 테스트했으므로 추가 과금을 방지하기 위해 관련 SageMaker 리소스를 정리합니다.

predictor.delete_model()
predictor.delete_endpoint()

요약

이 게시글에서는 SageMaker와 함께 허깅페이스 Transformer, PEFT 및 bitsandbytes 라이브러리를 사용하여 단일 GPU에서 8달러로 BloomZ 대규모 언어 모델을 파인 튜닝한 다음, 테스트 샘플에 대한 추론을 위해 이 모델을 SageMaker 엔드포인트에 배포했습니다. SageMaker는 허깅페이스 모델을 사용하는 여러 가지 방법을 제공하며, 더 많은 예제를 보려면 AWS 샘플 깃허브를 확인하기 바랍니다.

SageMaker를 계속 사용하여 파운데이션 모델을 파인 튜닝하려면 게시글 Architect personalized generative AI SaaS applications on Amazon SageMaker에 있는 몇 가지 기법을 사용해 보세요. 또한 Amazon SageMaker JumpStart, Amazon Titan 모델 및 Amazon Bedrock을 살펴봄으로써 Amazon 생성형 AI 기능에 대해 자세히 알아보시기를 권장합니다.

Daekeun Kim

Daekeun Kim

김대근 AI/ML 전문 솔루션즈 아키텍트는 다년간 스타트업, 제조 및 금융 업계를 거치며 컴퓨터 비전 엔지니어로서 다수의 1저자 특허를 등록하고 제품 양산에 기여했으며, 데이터 과학자로서 다양한 PoC와 현업 프로젝트를 수행했습니다. 현재는 고객들이 AWS 인프라 상에서 AI/ML 서비스를 더욱 효율적으로 사용할 수 있도록 기술적인 도움을 드리면서 AI/ML 생태계 확장에 기여하고 있습니다. 머신러닝을 공부하기 시작했을 때 접한 톰 미첼(Tom M. Mitchell)의 명언, “머신러닝으로 문제를 해결하려면 해결하고자 하는 문제를 명확히 정의해야 한다”라는 말을 상기하며 항상 초심을 잃지 않으려 합니다.

Hyeonsang Jeon

Hyeonsang Jeon

전현상 솔루션즈 아키텍트는 데이터 기반 멀티테넌트 AI/ML 플랫폼의 핵심 소프트웨어 개발자로 활동하였으며 통신부터 제조 및 금융에 이르기까지 다양한 SW 및 데이터 AI/ML분야에 기여했습니다. AI/ML 소프트웨어 엔지니어링 경험은 현재 AWS 솔루션즈 아키텍트의 역할에 보탬이 되고 있습니다. 금융 고객 및 AI/ML 도입을 원하는 기업들에게 AWS 플랫폼을 최적화하여 활용하는 방법을 제공하며, AI/ML 트렌드의 확산에 적극적으로 기여하고 있습니다.