본문 바로가기

SK네트웍스 Family AI캠프 10기/Daily 회고

54일차. Hugging Face - SFT Trainer & LLM 프로젝트

더보기

 

54일 차 회고.

 

 배가 아파서 점심을 건너뛰고 빅데이터분석기사 공부를 했다. 이제 겨우 일주일 남았는데 아직 공부해야 할 분량이 많이 남아있어서 불안하기도 해서 오히려 시간이 빨리 지나갔으면 좋겠다. 그리고 오늘 SQLD 사전 점수가 공개되었는데 안정적으로 합격이 되었다.

 

 

 

 

1. SFT Trainer

 

 

1-1. TRL(Transformer Reinforcement Learning)

 

Trainer

  • 일반적인 목적의 학습
    • 텍스트 분류, QA, 요약과 같은 지도 학습에 대해 처음부터 모델을 학습한다.
  • 고도화된 커스터마이징
    • Hyperparameters, Optimizers, Schedulers, Logging, 평가 지표를 Fine Tuning 하기 위한 광범위한 config 옵션을 제공한다.
  • 복잡한 학습 워크플로우 처리
    • Gradient Accumulation, Early Stopping, Checkpointing, 분산학습 등의 기능을 지원한다.
  • 많은 데이터 요구

 

SFT Trainer

  • SFT(Supervised Fine Tuning)
    • 지도 학습에서 더 작은 데이터 세트로 사전 학습 된 모델을 Fine Tuning 하는 데 최적화되어 있다.
  • 간단한 인터페이스
  • 효율적인 메모리 사용
    • PEFT(Parameter Efficient)
    • 패킹 최적화(Packing Optimization)
  • 빠른 학습

 

 

1-2. SFT Trainer

 

Module

!pip install typing_extensions==4.7.1 --upgrade
!pip install trl peft wandb

from transformers import AutoModelForCausalLM, AutoTokenizer
from datasets import load_dataset
from trl import SFTConfig, SFTTrainer, DataCollatorForCompletionOnlyLM

 

LLM - KoAlpaca

model_id = 'beomi/KoAlpaca-Polyglot-5.8B'
model = AutoModelForCausalLM.from_pretrained(model_id)
tokenizer = AutoTokenizer.from_pretrained(model_id)

 

Dataset

dataset = load_dataset('CarrotAI/ko-instruction-dataset', split='train')
dataset
"""
Dataset({
    features: ['output', 'instruction'],
    num_rows: 7040
})
"""

def formatting_prompts_func(example):
    output_texts = []
    for i in range(len(example['instruction'])):
        text = f'### Question: {example['instruction'][i]}\n ### Answer: {example['output'][i]}'
        output_texts.append(text)
    return output_texts

response_template = ' ### Answer:'
collator = DataCollatorForCompletionOnlyLM(response_template, tokenizer=tokenizer)

 

Training

from peft import LoraConfig

peft_config = LoraConfig(
    r=16,
    lora_alpha=32,
    lora_dropout=0.05,
    bias='none',
    task_type='CAUSAL_LM'			# Text Generation

 

SFT Config

from transformers import TrainingArguments

arge = TrainingArguments(
    per_device_train_batch_size=2,
    gradient_accumulation_steps=4,
    warmup_steps=5,
    max_steps=60,
    learning_rate=2e-4,
    weight_decay=0.01,
    lr_scheduler_type="linear",
    seed=3407,
    output_dir="outputs",
    report_to="wandb",
    run_name="alpaca-base-high-lr",
    logging_steps=1
)

 

SFT Trainer

trainer = SFTTrainer(
    model=model,
    train_dataset=dataset,
    args=args,
    peft_config=peft_config,
    formatting_Func=formatting_prompts_func,
    data_collator=collator
)

trainer.train()

 

Inference

from transformers import pipeline

pipe = pipeline(
    task='text-generation',
    model=model,
    tokenizer=tokenizer,
    device=0
)
def ask(x, context='', is_input_full=False):
    answer = pipe(
        f'### 질문: {x}\n\n### 맥락: {context}\n\n### 답변:' if context else f'### 질문: {x}\n\n### 답변',
        do_sample=True,
        max_new_tokens=512,
        temperature=0.7,
        top_p=0.9,
        return_full_text=False,
        eos_token_id=tokenizer.eos_token_id
    )
    print(answer[0]['generated_text'])

ask('-Question-')

 

 

 

2. LLM 프로젝트

 

 

2-1. Flow Chart

 

 

 

2-2. 파일 구조

 

LLM_PROJECT
├─ database
│   ├─ db
│   └─ docker-compose.yml
├─ etl
│   └─ README.md
├─ training
│   └─ README.md
├─ web
│   ├─ .venv
│   ├─ common
│   │   ├─ database
│   │   ├─ display
│   │   │   ├─ constant.py
│   │   │   ├─ history.py
│   │   │   ├─ input.py
│   │   │   ├─ output.py
│   │   │   └─ utils.py
│   │   ├─ model
│   │   │   ├─ groq.py
│   │   │   ├─ ollama.py
│   │   │   ├─ openai.py
│   │   │   ├─ provider_class.py
│   │   │   └─ provider.py
│   │   └─ pages
│   │       └─ db.py
│   ├─ .env
│   ├─ chatbot.py
│   ├─ requirements.txt
│   └─ test.ipynb
├─ .gitignore
└─ README.md

 

 

2-3. 개발 과정

 

관계형 데이터베이스(PostgreSQL) 구축

  • docker-compose.yml
version: '3'
services:
  db-postgresql:
    image: pgvector/pgvector:pg17
    container_name: db-postgresql
    restart: always
    volumes:
      - ./db:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: p1234
    ports:
      - '5432:5432'
  • terminal
docker-compose up -d
  • Docker 생성 확인

  • db-postgresql Exec
# psql -U postgres

postgres=# CREATE DATABASE dvdrental;
postgres=# exit

# cd /var/lib/postgresql/data
# pg_restore -U postgres -d dvdrental ./dvdrental.tar

# psql -U postgres

postgres=# \c dvdrental

dvdrental=#

 

  • SQL
SELECT f1.title, COUNT(f2.actor_id) actor_cnt
FROM film f1
LEFT JOIN film_actor f2
ON f1.film_id=f2.film_id
GROUP BY f1.film_id
;

 

Streamlit 연결

  • web/.env
OPENAI_API_KEY=
GROQ_API_KEY=

HOST=
PORT=
DATABASE=
USER_NAME=
PASSWORD=
  • web/requirements.txt
python-dotenv
streamlit

groq
openai

jupyter=
pandas

langchain
langchain-community

psycopg2-binary
sqlalchemy
  • web/pages/db.py

 

Git & Github

  • .gitignore
.venv
__pycache__
.env

database/db