주제

1. 오픈소스 라이센스
2. Fine-Tuning 이해하기
3. HuggingFace를 활용한 Fine-Tuning 해보기
4. GPT 앱 만들기
5. Zapier

 

1. 오픈소스 라이센스

  • 오픈소스 : 소스 코드가 공개되어 있어 누구나 자유롭게 사용, 수정, 배포할 수 있는 소프트웨어
  • 이를 통해 개발자들은 협업을 하여 기술의 혁신과 개선을 추구할 수 있음
  • GitHub를 통해 오픈소스 개발과 공유가 한 단계 발전
  • 각 라이센스는 사용, 수정, 배포에 있어 고유한 규칙과 조건들을 가지고 있음
    • 사용 및 배포의 자유도, 특허 권리, 변견 사항의 공개, 상업적 사용의 차이 존재

1.1 오픈소스 라이센스 5가지

  1. MIT 라이센스
    • 사용자에게 소프트웨어를 거의 제한 없이 사용, 복사, 수정, 배포할 수 있는 권한을 부여
    • 원작자의 저작권 표시와 허가 표시를 모든 복사본 또는 중요한 부분에 포함시켜야 함
  2. Apache 2.0 라이센스
    • 사용자에게 소프트웨어를 사용, 복사, 수정, 배포할 권한을 부여하며, 변경된 버전을 상업적으로 사용 가능
    • 특허 관련 권리를 명시적으로 부여
  3. GNU 일반 공중 사용 허가서(GPL)
    • 소프트웨어를 자유롭게 사용, 공유, 수정할 수 있지만 GPL 라이센스 하에 배포된 모든 수정 버전 또한 동일한 라이센스를 따라야함. 수정된 소프트웨어의 자유로운 사용을 보장함
  4. BSD 라이센스
    • 간단하고 제한이 적어 상업적 소프트웨어 프로젝트에 자주 사용됨. 
    • 소스 코드의 재배포시, 원작자의 저작권 표시를 모든 광고 자료 및 문서에 포함시켜야 하는 조항이 존재
  5. Creative Commons(CC)
    • 주로 데이터셋, 교육 자료, 창작물에 사용되는 라이센스

 

2.  Fine-Tuning 이해하기

  • 파인튜닝의 목적 : 파인 튜닝된 모델이 새로 모델을 처음부터 만드는 것보다 특정 유스 케이스에서 훨씬 더 좋은 성능을 내고, 비용과 시간을 크게 절약 가능함
  • LLM의 Supervised Fine-Tuning의 절차 :
    1. 어떤 일을 파인튜닝할지 결정
    2. 사용할 훈련 데이터셋 생성
    3. 어느 베이스 LLM 모델을 파인 튜닝의 대상으로 할지 결정
    4. Supervised ML 형태로 LLM을 재훈련
    5. 모델 성능 평가
  • Supervised ML 형태로 LLM을 재훈련하는 옵션 3가지 :
    • 모든 파라미터들을 다 재훈련
    • 레이어 대부분의 파라미터들을 freeze하고 가장 앞단의 레이어들만 재훈련
    • PEFT(Parameter Efficient Fine Tuning)
      • 모든 레이어의 파라미터들을 고정하고 앞단 레이어들에 새로운 파라미터를 추가하는 방식
      • LoRA(Low Rank Adaptation)라는 방식이 많이 사용됨

 

3. HuggingFace를 활용한 Fine-Tuning 해보기

3.1 IMDB 영화 리뷰 분류기

  • HuggingFace 데이터셋을 이용하여 각 리뷰를 positive, negative로 분류
  • 분류기 : bert-base-uncased 모델 사용
  • AutoModelForSequenceClassification을 사용해서 파인 튜닝 수행
    • pre-trained 모델 뒤에 레이어를 새로 추가하고 분류를 가능하게 함
    • num_labels로 분류 대상의 클래스 수를 지정
  • 데이터셋 다운로드
from datasets import load_dataset

dataset = load_dataset("imdb")
# 훈련 세트에서 무작위로 500개 샘플 선택
train_sample = dataset["train"].shuffle(seed=42).select(range(500))

# 테스트 세트에서 무작위로 500개 샘플 선택
test_sample = dataset["test"].shuffle(seed=42).select(range(500))
  • 토큰화를 위한 모델 가져오기
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch

tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
# 사전 훈련된 모델 자동 로드:
# - AutoModelForSequenceClassification은 from_pretrained 메소드를 사용
# - 해당 모델에 맞는 모델 아키텍처와 가중치를 로드
# - 분류를 위한 추가 레이어가 생성됨 (Fine-tuning 용). 이 레이어는 모델의 출력을 최종 분류 결정으로 변환하는 역할 수행
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)

# GPU 사용 설정 (가능한 경우)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
  • 전처리 함수
# 모든 입력의 크기를 64개의 토큰으로 맞춤. 길면 짜르고 짧다면 패딩 수행
def preprocess_function(examples):
    return tokenizer(examples["text"], truncation=True, padding=True, max_length=64)

encoded_train_sample = train_sample.map(preprocess_function, batched=True)
encoded_test_sample = test_sample.map(preprocess_function, batched=True)
  • 훈련에 사용할 인자들 지정(epochs는 5)
from transformers import Trainer, TrainingArguments

training_args = TrainingArguments(
    output_dir='./results',          # output directory
    num_train_epochs=5,              # total number of training epochs
    per_device_train_batch_size=32,  # batch size per device during training
    per_device_eval_batch_size=32,   # batch size for evaluation
    warmup_steps=500,                # number of warmup steps for learning rate scheduler
    weight_decay=0.01,               # strength of weight decay
    logging_dir='./logs',            # directory for storing logs
    logging_steps=10,
)
  • 훈련 수행
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=encoded_train_sample,
    eval_dataset=encoded_test_sample,
)

trainer.train()
  • 훈련 평가 후 예측
trainer.evaluate()

test_result = trainer.predict(test_dataset=encoded_test_sample)

평가 실행

  • 예측 결과 분석
import numpy as np

# 예측 결과 분석: predict 메소드는 predictions, label_ids, metrics를 포함한 NamedTuple을 반환합니다.
predictions = test_result.predictions
# 여기서 predictions 배열에는 각 테스트 샘플에 대한 예측 결과가 저장됩니다.
predictions = np.argmax(predictions, axis=1)  # 로짓에서 가장 높은 값을 가진 인덱스를 선택합니다.
  • Classification report로 성능 확인

성능 확인

 

 

4. GPT 앱 만들기

  • 만들 수 있는 앱 3가지 :
    1. 개인 생산성을 높이기 위한 GPT 앱
    2. LangChain 기반 QA 챗봇
    3. ChatGPT로 처음부터 만들어보는 데이터 분석
  • 다만 이건 ChatGPT 유료 버전이 있어야 가능 (무료 버전을 이용하고 있기 때문에 만드는 과정만 익힘)

4.1 Custom GPT란?

  • ChatGPT를 fine-tuning하여 만든 새로운 챗봇
  • 특징 : 
    • 개인화된 AI 모델 : 특정 요구 사항에 맞춰 훈련됨
    • 데이터 기반 훈련 : 고유한 데이터 세트를 사용하여 특정 도메인 또는 언어 스타일에 최적화
    • 향상된 정확성과 관련성 : 특정 도메인 데이터로 훈련되기 때문에, 일반 GPT 모델보다 더 정확한 결과 생성

4.2 GPT Store

  • No Code로 파인튜닝을 가능하게 해줌(GPT Builder)
  • GPT Store에 있는 앱은 다양한 사용자와 사용 사례를 대상으로 함
    • 별다른 기술적인 역량이 없어고 데이터가 있거나 분명한 유스케이스가 있다면 쉽게 시작 가능
  • 간편한 앱 에코 시스템
    • 개발자 관점에서는 만드는 즉시 배포 가능
    • 사용자는 복잡한 설정이나 개발 과정 없이 앱을 선택하고 사용 가능
  • 개발 관련 3가지 기능 제공 :
    • Instructions : 어떻게 대화할지 구체적인 명령과 정보를 대화 형태로 제공
    • Expanded Knowledge : 도메인 정보가 있는 문서들을 업로드
    • Actions : 외부에서 읽어와야 하는 정보가 있는 경우 연결 가능
  • GPT Builder에서 Configure 메뉴를 통해 나만의 GPT를 만들 수 있다

4.3 GPT Actions

  • GPT가 구조화된 인터페이스를 통해 외부 시스템, 도구 또는 소프트웨어와 상호작용할 수 있도록 설계되어 텍스트 생성 이상으로 그 활용도를 확장가능해주는 기능
    • GPT 바깥에서 정보 추출
    • GPT 외부 시스템을 통해 특정 테스트 수행
    • Python 환경에서 코드 실행
    • 인터넷 검색을 통한 실시간 정보 가져오기
    • 외부 API 등과 연동

 

5. Zapier

  • No Code / Low Code 툴로, 자주 사용하는 냅을 연결하여 반복 작업을 자동화시켜주는 도구

zapier

  • 특정 기준에 따라 다른 앱에서 작업을 트리거하는 워크플로우인 Zaps를 생성
    • 예) Gmail의 첨부파일을 Dropbox에 자동으로 저장
  • 무료 플랜도 존재
  • 동작 원리 :
    • "트리거" → "작업"
    • 사용하는 앱 전반의 다양한 트리거와 작업 중에서 선택하여 필요에 맞게 워크플로우 생성 가능
  • 실습

zaps 생성

  • 특정 키워드가 담긴 이메일을 받았을 때 Google Sheets로 자동 기록하는 Zap 만들기
  • 트리거는 Gmail, 내 Gmail 계정을 연결
  • 키워드는 '주문 확인'으로 지정

키워드 지정

  • Test를 통해서 최근 내 이메일 중 키워드가 담긴 이메일을 찾아보기
  • 통과하면 그대로 진행
  • 트리거된 액션은 구글 시트의 Create Spreadsheet Row

실행될 액션 지정

  • 드라이브에 미리 만들어둔 시트와 연결

  • 마찬가지로 Test를 해준후 Publish를 눌러준다
  • My Zaps에 퍼블리시가 된다

 

 


느낀점

ChatGPT 유료 버전이 없어서 이번 실습을 따라하지 못한게 아쉽다. 종종 Job description을 보면 GPT를 잘 이용할 줄 아는 사람을 우대하는 공고도 보이는데 유료 버전을 구독해서 프로젝트를 따라해봐야할지 고민이 된다. 

+ Recent posts