๋ฌด๋ฃ๋ก ์ฌ์ฉํ ์ ์๋ ๋ค์ด๋ฒ AI๏ฝ๋ชจ๋ธ ๋ค์ด๋ก๋ ํ์ฉ ๋ฐฉ๋ฒ
์ต๊ทผ ๋ค์ด๋ฒ์์๋ ๋๊ตฌ๋ ์์ฝ๊ฒ ํ์ฉํ ์ ์๋๋ก ๋ค์ํ AI ๋ชจ๋ธ์ ๋ฌด๋ฃ๋ก ์ ๊ณตํ๊ณ ์์ต๋๋ค. ํนํ ๋ณ๋์ ๋น์ฉ ์์ด ๋ค์ด๋ก๋ํ์ฌ ์ฌ์ฉํ ์ ์๋ ๊ตฌ์กฐ ๋๋ถ์, ๋ค์ด๋ฒ ๋ฌด๋ฃ ๋ค์ด๋ก๋ ๋ฐฉ๋ฒ์ ํตํด ์ฝ๊ฒ AI๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
๋ค์ด๋ฒ์์ ๋ฌด๋ฃ๋ก ์ ๊ณตํ๋ AI ๋ชจ๋ธ์ ํ ์คํธ ์์ฑ, ์์ฝ, ๋ฒ์ญ, ์ง์์๋ต ๋ฑ ๋ค์ํ ๋ถ์ผ์ ์ ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ๋ณ๋์ ํด๋ผ์ฐ๋ ํ๊ฒฝ ์์ด๋ ๋ก์ปฌ์์ ์ง์ ์คํํด๋ณผ ์ ์๋ ์ ์ด ํฐ ์ฅ์ ์ ๋๋ค. ์ด๋ฒ ๊ธ์์๋ ๋ค์ด๋ฒ AI๋ฅผ ๋ค์ด๋ก๋ ํ๋ ๋ฐฉ๋ฒ์ ์์์ผ๋ก, AI ๋ชจ๋ธ ์ค์น ๋ฐ ์คํ ๊ณผ์ , ๊ทธ๋ฆฌ๊ณ ์ค์ ํ์ฉ ํ๊น์ง ์ฒ์ ์ ํ๋ ๋ถ๋ ์ฝ๊ฒ ๋ฐ๋ผํ ์ ์๋๋ก ๋จ๊ณ๋ณ๋ก ์๊ฐํด๋๋ฆฌ๊ฒ ์ต๋๋ค.
๋ค์ด๋ฒ AI๋ก ์ ๋ฌด ์๋ํํ๊ธฐ๏ฝ๋ก์ปฌ ๋ชจ๋ธ ์คํ๋ถํฐ ํ์ฉ ์ฌ๋ก๊น์ง
๋ค์ด๋ฒ ๋ฌด๋ฃ AI๋?
๋ค์ด๋ฒ ๋ฌด๋ฃ AI ์๋น์ค๋ ๋ค์ด๋ฒ ํด๋ผ์ฐ๋ ๋ฐ ๋ค์ด๋ฒ ๊ฐ๋ฐ์ ์ผํฐ์์ ์ ๊ณตํ๋ AI ๋๊ตฌ๋ค๋ก, ๋ํ์ ์ผ๋ก CLOVA AI๊ฐ ์์ต๋๋ค. ์ด AI๋ ์์ฐ์ด ์ฒ๋ฆฌ(NLP), ์์ฑ ์ธ์, ์ด๋ฏธ์ง ๋ถ์ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ๊ฐ์ถ๊ณ ์์ผ๋ฉฐ, ๋ฌด๋ฃ๋ก API๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ๋ชจ๋ธ์ ์ง์ ๋ค์ด๋ก๋ํ์ฌ ๋ก์ปฌ ํ๊ฒฝ์์ ์คํํ ์๋ ์์ต๋๋ค.
๋ค์ด๋ฒ AI ๋ชจ๋ธ ๋ค์ด๋ก๋ ๋ฐ ๋ก์ปฌ ์คํ ๋ฐฉ๋ฒ
1. ๋ค์ด๋ฒ ์ธ๊ณต์ง๋ฅ ๋ชจ๋ธ ๋ค์ด๋ก๋์ ํ์์ฑ
API๋ฅผ ์ฌ์ฉํ๋ฉด ํธ๋ฆฌํ์ง๋ง, ์๋๋ ๋คํธ์ํฌ ํ๊ฒฝ์ ๋ฐ๋ผ ์ง์ฐ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ ๋ชจ๋ธ์ ๋ก์ปฌ์ ๋ค์ด๋ก๋ํ์ฌ ์คํํ๋ฉด ๋์ฑ ๋น ๋ฅด๊ฒ AI ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์์ต๋๋ค.
2. AI ๋ค์ด๋ก๋ ๋ฐฉ๋ฒ
๋ค์ด๋ฒ AI ๋ชจ๋ธ์ Hugging Face ๊ฐ์ ํ๋ซํผ์์ ๊ณต๊ฐ๋์ด ์์ต๋๋ค. git-lfs ๋๋ huggingface-cli๋ก ์ ์ฒด ๋ชจ๋ธ์ ๋ค์ด๋ก๋ํ ์ ์์ต๋๋ค.
huggingface-cli login
git lfs install
git clone https://huggingface.co/naver-hyperclovax/HyperCLOVAX-SEED-Text-Instruct-0.5B
3. Python ์ฝ๋๋ก ๋ชจ๋ธ ๋ก๋ ์์
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("./HyperCLOVAX-SEED-Text-Instruct-0.5B")
tokenizer = AutoTokenizer.from_pretrained("./HyperCLOVAX-SEED-Text-Instruct-0.5B")
๋ค์ด๋ก๋๊ฐ ์๋ฃ๋๋ฉด ๋ชจ๋ธ๊ณผ ํ ํฌ๋์ด์ ๊ฐ ํฌํจ๋ ํด๋๊ฐ ์์ฑ๋ฉ๋๋ค.
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "naver-hyperclovax/HyperCLOVAX-SEED-Text-Instruct-0.5B"
save_directory = "./clova_model_full" # ์ํ๋ ์ ์ฅ ๊ฒฝ๋ก
# ๋ชจ๋ธ ๋ค์ด๋ก๋ ๋ฐ ์ ์ฅ
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
model.save_pretrained(save_directory)
tokenizer.save_pretrained(save_directory)
4. ๋ค์ด๋ฒ AI ์ฝ๊ฒ ๋ค์ด๋ฐ๊ธฐ
๐ฆ ๋ค์ด๋ฒ CLOVAX SEED 0.5B ๋ชจ๋ธ ๋ฌด๋ฃ ๋ค์ด๋ก๋
๐ฆ ๋ค์ด๋ฒ CLOVAX SEED 1.5B ๋ชจ๋ธ ๋ฌด๋ฃ ๋ค์ด๋ก๋
๐ฆ ๋ค์ด๋ฒ CLOVAX SEED 3.0B ๋ชจ๋ธ ๋ฌด๋ฃ ๋ค์ด๋ก๋
5. ๊ฒฐ๊ณผ ์์ ๊ตฌ์กฐ
clova_model_full/
โโโ config.json
โโโ generation_config.json
โโโ model.safetensors
โโโ tokenizer_config.json
โโโ tokenizer.json
โโโ special_tokens_map.json
โโโ ...
5 ๊ฐ๋จํ ์ฝ๋ ์์
์๋ฅผ ๋ค์ด, ๋ชจ๋ธ์ ./clova_model_full ํด๋์ ์ ์ฅํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ์๋์ฒ๋ผ ๋ฐ๊พธ์๋ฉด ๋ฉ๋๋ค:
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
# CUDA ์ฌ์ฉ ์ฌ๋ถ ํ์ธ ๋ฐ ์ค์
device = "cuda" if torch.cuda.is_available() else "cpu"
# ๋ก์ปฌ์ ์ ์ฅ๋ ๋ชจ๋ธ ๋ฐ ํ ํฌ๋์ด์ ๊ฒฝ๋ก
model_dir = "./clova_model_full"
# ๋ชจ๋ธ ๋ฐ ํ ํฌ๋์ด์ ๋ก๋ (๋ก์ปฌ ๊ฒฝ๋ก์์)
model = AutoModelForCausalLM.from_pretrained(model_dir).to(device)
tokenizer = AutoTokenizer.from_pretrained(model_dir)
# ์ด๊ธฐ ์์คํ
ํ๋กฌํํธ ๊ตฌ์ฑ
chat_history = [
{"role": "tool_list", "content": ""},
{"role": "system", "content": "- AI ์ธ์ด๋ชจ๋ธ์ ์ด๋ฆ์ \"CLOVA X\" ์ด๋ฉฐ ๋ค์ด๋ฒ์์ ๋ง๋ค์๋ค.\n- ์ค๋์ 2025๋
04์ 24์ผ(๋ชฉ)์ด๋ค."},
]
# ๋ํ ๋ฃจํ
while True:
user_input = input("๋น์ : ")
if user_input.strip().lower() in ["์ข
๋ฃ", "exit", "quit"]:
print("๋ํ๋ฅผ ์ข
๋ฃํฉ๋๋ค.")
break
# ์ฌ์ฉ์ ์
๋ ฅ ์ถ๊ฐ
chat_history.append({"role": "user", "content": user_input})
# ์
๋ ฅ ํ
์ ์์ฑ
inputs = tokenizer.apply_chat_template(
chat_history,
add_generation_prompt=True,
return_dict=True,
return_tensors="pt"
).to(device)
# ์๋ต ์์ฑ
with torch.no_grad():
output_ids = model.generate(
**inputs,
max_length=1024,
repetition_penalty=1.2,
stop_strings=["<|endofturn|>", "<|stop|>"],
tokenizer=tokenizer
)
# ์ถ๋ ฅ ๋์ฝ๋ฉ
output_text = tokenizer.decode(output_ids[0], skip_special_tokens=True)
# ์ฌ์ฉ์ ์
๋ ฅ ์ดํ ์๋ต๋ง ์ถ์ถ
model_reply = output_text.split(user_input)[-1].strip()
# ์ถ๋ ฅ
print("CLOVA X:", model_reply)
# ํ์คํ ๋ฆฌ์ ๋ชจ๋ธ ์๋ต ์ถ๊ฐ
chat_history.append({"role": "assistant", "content": model_reply})
3. ๋ค์ด๋ฒ ๋ฌด๋ฃ AI ํ์ฉ ์ฌ๋ก
3-1. AI ์ฑ๋ด ๊ฐ๋ฐ
์ฌ์ฉ์ ์ง๋ฌธ์ ์์ฐ์ค๋ฝ๊ฒ ์ดํดํ๊ณ ๋ต๋ณํ๋ ์ฑ๋ด์ ๊ฐ๋ฐํ ์ ์์ผ๋ฉฐ, ๊ณ ๊ฐ ์๋ด, ๊ต์ก, ๊ฐ์ธ ๋น์ ๋ฑ ๋ค์ํ ๋ถ์ผ์ ํ์ฉ๋ฉ๋๋ค.
3-2. ์ฝํ ์ธ ์๋ ์์ฑ
๋ธ๋ก๊ทธ ๊ธ, ๊ธฐ์ฌ, ๊ด๊ณ ๋ฌธ๊ตฌ ๋ฑ ๋ค์ํ ์ฝํ ์ธ ๋ฅผ AI๊ฐ ์๋ ์์ฑํ์ฌ ๋ง์ผํ ํจ์จ์ ๋์ผ ์ ์์ต๋๋ค.
3-3. ํ ์คํธ ์์ฝ ๋ฐ ๋ฒ์ญ
๊ธด ๋ฌธ์๋ฅผ ์์ฝํ๊ฑฐ๋ ๋ค์ํ ์ธ์ด๋ก ๋ฒ์ญํ๋ ๊ธฐ๋ฅ๋ ์ ๊ณตํ์ฌ ์ ๋ฌด ํจ์จ์ฑ์ ๋์ ๋๋ค.
AI ๋ฅผ ํ์ฉํ๊ธฐ ์ํ ์์คํ (์ปดํจํฐ)์ฌ์
GPU | NVIDIA RTX 3060 ์ด์ ๋๋ ๋๊ธ ์ด์ | 0.5B ๋ชจ๋ธ๋ GPU ํ์. VRAM 8GB ์ด์ ๊ถ์ฅ |
CUDA 11.7 ์ด์ ์ง์ | PyTorch์ ํธํ๋๋ CUDA ๋๋ผ์ด๋ฒ ํ์ | |
CPU | Intel i7 ์ด์, AMD Ryzen 5 ์ด์ | CPU๋ง ์ฌ์ฉ ์ ๋งค์ฐ ๋๋ฆผ, ๋จ์ ํ ์คํธ์ฉ |
8์ฝ์ด ์ด์ ๊ถ์ฅ | ๋ฉํฐ์ค๋ ๋ ์ง์ ์ ์กฐ๊ธ ํฅ์ | |
RAM | 16GB ์ด์ | ๋ชจ๋ธ ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ฉ๋์ ์ํฅ |
์ ์ฅ์ฅ์น | SSD (NVMe SSD ๊ถ์ฅ) | ๋ชจ๋ธ ํ์ผ ์ฝ๊ธฐ ์๋ ํฅ์ |
PyTorch | ์ต์ ๋ฒ์ ๊ถ์ฅ (์: 2.x ์ด์) | GPU ๊ฐ์ ๋ฐ ์ต์ ๊ธฐ๋ฅ ํ์ฉ ๊ฐ๋ฅ |
Python | 3.8 ์ด์ | transformers ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธํ์ฑ |
์ด์์ฒด์ | Windows 10/11, Linux (Ubuntu 20.04 ์ด์) | Linux๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ต์ ํ์ ์ ๋ฆฌ |
๊ธฐํ | GPU ๋๋ผ์ด๋ฒ ์ต์ ์ ์ง | CUDA ๋ฐ cuDNN ๋ฒ์ ์ผ์น ์ค์ |
๋ชจ๋ธ ํ๋ผ๋ฏธํฐ | ์ฝ 0.57B ํ๋ผ๋ฏธํฐ | ๋ชจ๋ธ ํฌ๊ธฐ ์์ฒด๊ฐ ์๋์ ์ง์ ์ ์ํฅ |
์ต๋ ์ปจํ ์คํธ ๊ธธ์ด | ์ต๋ 4,096 ํ ํฐ | ๊ธด ์ ๋ ฅ ์ ์ฐ์ฐ๋ ๊ธ์ฆ |
AI๊ฐ ๋๋ฆฐ ์ด์ ์ ํด๊ฒฐ ๋ฐฉ์
1. ๋ชจ๋ธ ํฌ๊ธฐ์ ์ฐ์ฐ๋์ ์ํฅ
HyperCLOVAX-SEED-Text-Instruct-0.5B ๋ชจ๋ธ์ ์ฝ 5์ต 7์ฒ๋ง ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ถ ๊ฒฝ๋ ์ธ์ด ๋ชจ๋ธ์ด์ง๋ง, ์ฌ์ ํ ์๋นํ ์ฐ์ฐ๋์ ์๊ตฌํฉ๋๋ค. ํนํ ์ต๋ 4K ํ ํฐ ๊ธธ์ด๊น์ง ์ง์๋๋ ๊ธด ์ปจํ ์คํธ ์ฒ๋ฆฌ๋ก ์ธํด ์ ๋ ฅ์ด ๊ธธ์ด์ง์๋ก ์ฐ์ฐ ๋ถ๋ด์ด ์ฆ๊ฐํ๋ฉฐ, ๊ทธ์ ๋ฐ๋ผ ์๋ต ์๋๋ ์ ํ๋ ์ ์์ต๋๋ค.
- ํด๊ฒฐ ๋ฐฉ์:
๋ถํ์ํ๊ฒ ๊ธด ์ ๋ ฅ์ ์ค์ด๊ณ , max_length ๊ฐ์ ์์ฑ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ ํ ์กฐ์ ํ์ฌ ํจ์จ์ ๋์ฌ์ผ ํฉ๋๋ค.
์ฌ์ฉ ๋ชฉ์ ์ ๋ง๊ฒ ์ปจํ ์คํธ ๊ธธ์ด๋ฅผ ๊ด๋ฆฌํ๊ณ , ๊ผญ ํ์ํ ์ ๋ณด๋ง ํฌํจํ์ฌ ๋ชจ๋ธ์ ์ ๋ ฅํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
2. ํ๋์จ์ด ์ฑ๋ฅ์ ์ ์ฝ
AI ๋ชจ๋ธ์ CPU์์๋ ์๋ ๊ฐ๋ฅํ์ง๋ง, ์ฐ์ฐ ํจ์จ์ด ๋ฎ์ ์คํ ์๋๊ฐ ํฌ๊ฒ ๋จ์ด์ง๋๋ค. GPU๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๊ฐ ๋น์ฝ์ ์ผ๋ก ํฅ์๋๋ฉฐ, ํนํ VRAM(๊ทธ๋ํฝ ๋ฉ๋ชจ๋ฆฌ) ์ฉ๋์ด ๋ถ์กฑํ ๊ฒฝ์ฐ์๋ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ํด๊ฒฐ ๋ฐฉ์
๊ฐ๋ฅํ๋ฉด GPU ํ๊ฒฝ์์ ๋ชจ๋ธ์ ์คํํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค.
torch.cuda.is_available()๋ฅผ ํตํด GPU๊ฐ ์ ๋๋ก ์ธ์๋๊ณ ์๋์ง ํ์ธํ๊ณ , VRAM์ด ์ถฉ๋ถํ ํ๋ณด๋์ด ์๋์ง๋ ์ ๊ฒํด์ผ ํฉ๋๋ค.
3. ์ฝ๋ ๋ฐ ํ๋ผ๋ฏธํฐ ์ค์ ์ต์ ํ ๋ถ์กฑ
๋ชจ๋ธ์ ์์ฑ ํจ์์ธ model.generate()๋ฅผ ๊ธฐ๋ณธ ์ค์ ์ผ๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ, ๋ถํ์ํ๊ฒ ํฐ max_length ๊ฐ์ด๋ ๋นํจ์จ์ ์ธ ๋ฐ๋ณต ์ ์ด ํ๋ผ๋ฏธํฐ ๋ฑ์ด ์๋ ์ ํ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ๋ฐ๋ณต ์ต์ ์ค์ (repetition_penalty) ๋ฑ์ ์๋์ ํฐ ์ํฅ์ ์ฃผ์ง ์์ง๋ง, ์ต๋ ์์ฑ ๊ธธ์ด ๊ฐ์ ์ค์ ์ ์ฑ๋ฅ์ ์ง๊ฒฐ๋ฉ๋๋ค.
- ํด๊ฒฐ ๋ฐฉ์
max_length, temperature, top_p ๋ฑ์ ์์ฑ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ชจ๋ธ์ ๋ชฉ์ ์ ๋ง๊ฒ ์ต์ ํํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ํ์๋ก ํ๋ ์๋ต ๋ฒ์์ ๋ฐ๋ผ ํ ์คํธ ๊ธธ์ด๋ฅผ ์ ํํ์ฌ ๋ถํ์ํ ๊ณ์ฐ์ ์ค์ ๋๋ค.
4. ํ ํฌ๋์ด์ ๋ฐ ์ ์ถ๋ ฅ ์ฒ๋ฆฌ ๊ตฌ์กฐ
์ ๋ ฅ ํ ์คํธ๋ฅผ ๋ชจ๋ธ์ด ์ฒ๋ฆฌํ ์ ์๋ ํํ๋ก ๋ณํํ๋ ๊ณผ์ ์์ apply_chat_template ๋ฑ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ํ ํ๋ฆฟ ๊ตฌ์กฐ๊ฐ ์ถ๊ฐ๋์ด ์ ๋ ฅ ๊ธธ์ด๊ฐ ๋์ด๋๊ณ , ์ด์ ๋ฐ๋ผ ์ฒ๋ฆฌ ์๊ฐ๋ ์ฆ๊ฐํฉ๋๋ค. ๋ํ ์ถ๋ ฅ ์ญ์ ์ ์ ๋์ง ์์ ์ฑ ๊ณผ๋ํ๊ฒ ๊ธธ์ด์ง ๊ฒฝ์ฐ ์ ์ฒด ์๋ต ์๊ฐ์ด ๊ธธ์ด์ง ์ ์์ต๋๋ค.
- ํด๊ฒฐ ๋ฐฉ์
apply_chat_template ์ฌ์ฉ ์ ๋ด๋ถ์ ์ผ๋ก ์ผ๋ง๋ ์ ๋ ฅ์ด ํ์ฅ๋๋์ง ๊ณ ๋ คํ์ฌ, ์ ๋ ฅ ๋ฌธ์ฅ์ ๊ฐ๊ฒฐํ๊ฒ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
ํ ํฌ๋์ด์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ถ์ํ๊ณ , ๊ผญ ํ์ํ ์ ๋ ฅ๋ง ํฌํจ๋๋๋ก ๊ตฌ์ฑํฉ๋๋ค.
๋ค์ด๋ฒ ๋ฌด๋ฃ AI ํ์ฉ ์ ํ
- GPU ํ๊ฒฝ์์ ์คํ ๊ถ์ฅ
- ์ต์ ๋ฒ์ ์ ์ง
- API์ ๋ก์ปฌ ์คํ ๋ณํ
- ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ ๋ก์ปฌ ์ฒ๋ฆฌ
- max_new_tokens๋ก ์๋ต ๊ธธ์ด ์ ํ
- do_sample=True, top_p, temperature ํ์ฉ
- ์ ๋ ฅ ๊ธธ์ด ์ต์ํ
- Torch ๋ฐ CUDA ์ต์ ์ ์ง
๋ค์ด๋ฒ AI๋ ์ง์ ์ฅ๋ฒฝ์ ๋ฎ์ถ๋ฉฐ, ์ฑ๋ด, ์ฝํ ์ธ ์์ฑ, ๋ฒ์ญ ๋ฑ์ ํ์ฉ๋๊ฐ ๋์ต๋๋ค.