๐๊ฐ๋์ฑย ย ย ย ย ๐ฆ๊ฐ๋ฏผ์งย ย ย ย ย ๐บ์ ๋๊ทผ
- Domain : ํ์ด ํ๋ซํผ์ ์น์ ํ ์ค๋ช ์ ํด์ฃผ๋ ์ฑ๋ด์ ๊ตฌ์ถํ์์ต๋๋ค.
- Concept : 'ํด์'์ฒด๋ฅผ ์ฌ์ฉํ๋ฉฐ ์น์ ํ๊ฒ ๋ตํ๋ ์ฑ๋ด. ๋ง๋์ '์ธ์ ๋ ์ง ๋ฌผ์ด๋ณด์ธ์! ํํ~!'์ ๋ถ์ฌ ํํ์ด ์ปจ์ ์ ์ ์ง
- Model : Mistral ๊ธฐ๋ฐ์ Zephyr ๋ชจ๋ธ๊ณผ Meta์ Llama3 ๋ชจ๋ธ์ ๋์์ผ๋ก ์งํํ์์ต๋๋ค.
- Dataset : ๋งํฌ ํ์ต์ ์ํ ๋ฐ์ดํฐ์ ์ ๊ตฌ์ถํ์ฌ ์งํํ์์ต๋๋ค. Dongwookss/q_a_korean_futsal, mintaeng/llm_futsaldata_yo
- How-to? ๋งํฌ ํ์ต์ ์ํ Fine-tuning๊ณผ ์ ๋ณด ์ ๊ณต์ ์ํ RAG๋ฅผ ์ ์ฉ์์ผฐ์ต๋๋ค. ๊ตฌํ์ FastAPI๋ฅผ ์ด์ฉํ์ฌ Back-end์ ์ํตํ ์ ์๋๋ก ์งํํ์์ต๋๋ค.
FastAPI ์คํ
uvicorn main:app --reload -p <ํฌํธ๋ฒํธ์ง์ >-
Fine-tuned Model : Llama3-8b, Zephyr-7b ๊ฐ๊ฐ ํ๋์ ์งํํ์์ต๋๋ค.
-
GPU : Colab L4
-
Method : LoRA(Low Rank Adaptation) & QLoRA(Quantized LoRA)
-
Trainer : SFTrainer,
DPOTrainer -
Dataset : Dongwookss/q_a_korean_futsal, mintaeng/llm_futsaldata_yo
TrainOutput(global_step=1761, training_loss=1.1261051157399513, metrics={'train_runtime': 26645.6613, 'train_samples_per_second': 2.644, 'train_steps_per_second': 0.066, 'total_flos': 7.784199669311078e+17, 'train_loss': 1.1261051157399513, 'epoch': 3.0})- ์ถํ ๋ฐฉํฅ : SFT(Supervised Fine-Tune) Trainer ์ ์ด์ฉํ์ฌ ํ๋์ ์งํํ์๊ณ ๋งํฌ์ ์ง์คํ ๋ฐ์ดํฐ์ ์ผ๋ก ์ธํด ๋ชจ๋ธ ์ฑ๋ฅ์ ์์ฌ์ด ์ ์ด ๋ง์์ต๋๋ค. ํฅํ Q-A Task์ ๋ง๋ Fine-Tuning์ ์งํํ ์์ ์ด๋ฉฐ ๊ฐํํ์ต์ ํตํด ๋ชจ๋ธ์ฑ๋ฅ์ ๊ฐ์ ํ ์์ ์ ๋๋ค.
- Dongwooks -> ์ต์ข ๋ชจ๋ธ๋ช : big_fut_final & small_fut_final
Using HuggingFace Model with out RAG
# Using HuggingFace Model with out RAG
# !pip install transformers==4.40.0 accelerate
import os
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from transformers import TextStreamer
model_id = 'Dongwookss/์ํ๋๋ชจ๋ธ'
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map="auto",
)
PROMPT = '''
Below is an instruction that describes a task. Write a response that appropriately completes the request.
'''
instruction = "question"
messages = [
{"role": "system", "content": f"{PROMPT}"},
{"role": "user", "content": f"{instruction}"}
]
input_ids = tokenizer.apply_chat_template(
messages,
add_generation_prompt=True,
return_tensors="pt"
).to(model.device)
terminators = [
tokenizer.eos_token_id,
tokenizer.convert_tokens_to_ids("<|eot_id|>")
]
text_streamer = TextStreamer(tokenizer)
output = model.generate(
input_ids,
max_new_tokens=4096,
eos_token_id=terminators,
do_sample=True,
streamer = text_streamer,
temperature=0.6,
top_p=0.9,
repetition_penalty = 1.1
)-
ํ์ด ๊ท์ , ๊ตฌ์ฅ ์ ๋ณด, ํ์ด ์นผ๋ผ ๋ฑ ๋ค์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ RAG๋ฅผ ๊ตฌ์ถํ์ฌ ์ ๋ณด์ ๊ณต์ ํ์์ต๋๋ค.
-
Retrieval : Kiwipiepy+BM25 ์ Embedding_Model + VectorDB ์กฐํฉ์ ํตํด Semantic search๋ฅผ ๋ชฉํ๋ก ์งํํ์์ต๋๋ค.
.
โโโ backupfiles
โ โโโ # ์๋น ํ์ผ ๊ฒฝ๋ก์
๋๋ค.
โโโ files
โ โโโ # RAG๋ฅผ ํตํด ์ ๋ฌํ ํ์ผ ๊ฒฝ๋ก์
๋๋ค.
โโโ for_nochain
โ โโโ __init__.py
โ โโโ mt_chat.py # Langchain ์ ์ด์ฉํ์ง ์๊ณ ๊ตฌ์ฑํ์์ต๋๋ค. ๋ชจ๋ธ ๋ต๋ณ ์๋๊ฐ ์ ํ๋ ์ ์์ต๋๋ค.
โโโ load_model_for_newchain.py
โโโ load_model_type_a.py # AutoModelForCausalLM์ ์ด์ฉํ์ฌ ๋ชจ๋ธ์ ๋ถ๋ฌ์ต๋๋ค.
โโโ load_model_type_b.py # Unsloth ํจํค์ง์ FastLanguageModel์ ์ด์ฉํ์ฌ ๋ชจ๋ธ์ ๋ถ๋ฌ์ต๋๋ค. ์ด๋ adapter.config๊ฐ ์กด์ฌํ๋ฉด ๋ถ๋ฌ์ค์ง ๋ชปํ์ฌ ์๋ก์ด ๊ฒฝ๋ก์ ๋ชจ๋ธ์ ๋ณต์ฌํ์์ต๋๋ค.
โโโ main.py # Fast API ๋ฅผ ์ด์ฉํ์ฌ ๋ชจ๋ธ์ ์๋นํฉ๋๋ค. request๋ฅผ ํตํด ๋ชจ๋ธ๊ณผ ์ํตํ ์ ์์ต๋๋ค.
โโโ main_new_chain.py # ์ ์ฒด์ธ์ ์ด์ฉํ์ฌ FastAPI๋ฅผ ์คํํฉ๋๋ค.
โโโ pack
โ โโโ __init__.py
โ โโโ load_push.py # files์ ์๋ ๋ฐ์ดํฐ๋ฅผ Load,Chunk,Embed, Vector DB์ ์ ์ฅํฉ๋๋ค.
โ โโโ make_answer.py # ๋ต๋ณ์์ฑ ํจ์๋ฅผ ๋ง๋ค์์ต๋๋ค.
โ โโโ make_chain_gguf.py # gguf ํ์ผ์ ๋์์ผ๋ก ollama ๋ฅผ ์ ์ฉ์ํต๋๋ค.
โ โโโ make_chain_model.py # Safetensors๋ก ์ด๋ฃจ์ด์ง ๋ชจ๋ธ๋ก Chain์ ์์ฑํฉ๋๋ค. ์ด๋ GPU์์์ด ๋ง์ด ์๊ตฌ๋ฉ๋๋ค.
โ โโโ retrieve_docs.py # Retrieval์ ์ด์ฉํ์ฌ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ต๋๋ค.
โ โโโ retriever.py # Retrieval์ ์ค์ ํฉ๋๋ค.
โโโ sft_tuning # ๋ชจ๋ธ ํ์ธํ๋ ๊ณผ์ ์
๋๋ค. ์ค์ ํ๋ผ๋ฏธํฐ์ ๋ํ ๊ฐ์ด ๋น์ด์์ ์ ์์ต๋๋ค.
โ โโโ Unsloth_sft.ipynb
โโโ test.ipynb
