- **Fine-tuning(๋ฏธ์ธ์กฐ์ )**์ ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ๊ฐ์ค์น๋ฅผ ์ถ๋ฐ์ ์ผ๋ก ๋ด ๋ฐ์ดํฐ์ ๋ง์ถฐ ์ถ๊ฐ ํ์ตํ๋ ๊ธฐ๋ฒ
- ์ฒ์๋ถํฐ(scratch) ํ์ตํ์ง ์๊ณ ๊ธฐ์กด ์ง์์ ์ฌํ์ฉํ๋ ์ ์ดํ์ต(transfer learning)์ ํ ๋ฐฉ์
- ์ ์ ๋ฐ์ดํฐยท๋น์ฉ์ผ๋ก ํน์ ๋๋ฉ์ธยท์์ ์ ๋ชจ๋ธ์ ํนํ์ํค๋ ๋ง์ถคํ ๋ฐฉ๋ฒ
- ์ ์ฒด ๊ฐ์ค์น ๋๋ ์ผ๋ถ(LoRA ๋ฑ)๋ง ๊ฐฑ์ ํ๋ ์ ์ฐํ ํ์ต ์ ๋ต
ํด๋น ๊ฐ๋ ์ด ํ์ํ ์ด์
- ๋ํ ๋ชจ๋ธ์ scratch๋ถํฐ ํ์ตํ๋ฉด ๋ฐ์ดํฐยทGPUยท์๊ฐยท๋น์ฉ์ด ๋ง๋
- ๋๋ถ๋ถ์ ์ค๋ฌด๋ โ๋ฒ์ฉ ๋ชจ๋ธ โ ๋ด ๋๋ฉ์ธ ํนํโ๋ง ํ์ํ ์ ํ๋ ์๊ตฌ
- ๊ณต๊ฐ ๊ฐ์ค์น(open weights)๋ฅผ ์ถ๋ฐ์ ์ผ๋ก ์ฐ๋ฉด ์ ์ ์์์ผ๋ก ์ถฉ๋ถ
AS-IS (scratch ํ์ต) vs TO-BE (fine-tuning)
flowchart LR subgraph A["AS-IS โ ์ฒ์๋ถํฐ ํ์ต"] A1["๋น ๋ชจ๋ธ<br/>(๋๋ค ๊ฐ์ค์น)"] --> A2["๊ฑฐ๋ํ ๋ฐ์ดํฐ + ์๋ง์ GPU<br/>์์ฃผ~์๊ฐ์, ์์ต์"] --> A3[์์ฑ ๋ชจ๋ธ] end subgraph B["TO-BE โ fine-tuning"] B1["๊ณต๊ฐ ๊ฐ์ค์น<br/>(์ด๋ฏธ ๋๋ํจ)"] --> B2["๋ด ๋ฐ์ดํฐ ์๋<br/>GPU ์ ๊ฒ, ์์๊ฐ~์์ผ"] --> B3[๋๋ฉ์ธ ํนํ ๋ชจ๋ธ] end
fine-tuning ๋ฐฉ๋ฒ 3๊ฐ์ง
| ๋ฐฉ๋ฒ | ๋ฌด์์ ๊ฐฑ์ | ์์ | ๋น๊ณ |
|---|---|---|---|
| Full fine-tuning | ๋ชจ๋ ๊ฐ์ค์น | ํผ (๋ํ GPU) | ๊ฐ์ฅ ๊ฐ๋ ฅํ์ง๋ง ๋ฌด๊ฒ๊ณ ๋น์ |
| LoRA (PEFT) | ์์ ์ด๋ํฐ ๊ฐ์ค์น๋ง | ์ ์ | ์ค๋ฌด์์ ๊ฐ์ฅ ํํจ |
| QLoRA | ์์ํ + LoRA | ๋งค์ฐ ์ ์ | ๋จ์ผ ์๋น์๊ธ GPU๋ ๊ฐ๋ฅ |
- PEFT(Parameter-Efficient Fine-Tuning) = ์ผ๋ถ ํ๋ผ๋ฏธํฐ๋ง ํ์ตํด ํจ์จ์ ๋์ด๋ ๊ณ์ด, LoRA๊ฐ ๋ํ.
LoRA๋ ์ ๊ฐ๋ฒผ์ด๊ฐ โ ์ง๊ด
๊ฑฐ๋ํ ์๋ณธ ๊ฐ์ค์น ํ๋ ฌ W๋ ๊ทธ๋๋ก ์ผ๋ฆฌ๊ณ (freeze), ๊ทธ ์์ ์๊ณ ์์ ๋ณด์กฐ ํ๋ ฌ ๋ ๊ฐ(A, B) ๋ง ์๋ก ํ์ตํ๋ค. ์ค์ ๋ณํ๋์ ฮW โ BยทA๋ก ๊ทผ์ฌํ๋ฏ๋ก, ํ์ตํ ํ๋ผ๋ฏธํฐ ์๊ฐ ์๋ณธ ๋๋น ์๋ฐฑ~์์ฒ ๋ฐฐ ์ ๋ค.
์ถ๋ ฅ = Wยทx + (BยทA)ยทx
โ โ
์ผ๋ฆผ(๊ณ ์ ) ์ด๊ฒ๋ง ํ์ต (์์)
๋น์ ํ๋ฉด ๋๊บผ์ด ๊ต์ฌ(์๋ณธ ๊ฐ์ค์น)๋ ๊ทธ๋๋ก ๋๊ณ , ์์ ํฌ์คํธ์(์ด๋ํฐ)์ ๋ด ๋ฉ๋ชจ๋ง ๋ถ์ด๋ ๊ฒ๊ณผ ๊ฐ๋ค. ๊ต์ฌ๋ฅผ ํต์งธ๋ก ๋ค์ ์ฐ์ง ์์๋ ๋ด ์ฉ๋์ ๋ง์ถฐ์ง๋ค.
๊ณผ์ (์ฝ๋ ํ๋ฆ)
# 1) ๋ฒ ์ด์ค ๋ชจ๋ธ + ํ ํฌ๋์ด์ ๋ก๋ (open weights)
model = AutoModelForCausalLM.from_pretrained("google/gemma-...")
# 2) LoRA ์ด๋ํฐ ๋ถ์ฐฉ (์๋ณธ์ freeze, ์ด๋ํฐ๋ง ํ์ต)
model = get_peft_model(model, LoraConfig(r=16, target_modules=["q_proj", "v_proj"]))
# 3) ๋ด ๋ฐ์ดํฐ์
์ผ๋ก ์ถ๊ฐ ํ์ต (forward โ loss โ backprop)
trainer = Trainer(model, train_dataset=my_dataset, ...)
trainer.train()
# 4) ์ด๋ํฐ ์ ์ฅ (์ MB), ํ์์ ์๋ณธ๊ณผ ๋ณํฉํด ๋ฐฐํฌ์ฉ ๋ชจ๋ธ ์์ฑ
model.save_pretrained("my-domain-adapter")Gemma์ ์ ์ฉํ๋ฉด
- open weights๋ฅผ ๋ฐ์ LoRA/QLoRA๋ก ๋๋ฉ์ธ ํนํ ๊ฐ๋ฅ (์: โ์ฐ๋ฆฌ ํ์ฌ CS ์ฑ๋ด์ฉ Gemmaโ).
- ๋๊ตฌ: HuggingFace
transformers+peft/trl, Unsloth, Axolotl ๋ฑ. - ํ์ต ํ ONNX Runtime์ฉ์ผ๋ก exportํ๋ฉด GPU ์์ด ๋ฐฐํฌํ ์๋ ์๋ค.
- โ ๏ธ ๋ผ์ด์ ์ค ํ์ธ ํ์: Gemma๋ ์์ ์คํ์์ค๊ฐ ์๋๋ผ โGemma Terms of Useโ ์ ์ฉ โ ํ์๋ฌผ ์์ฑ์ ํ์ฉ๋๋ ๊ธ์ง๋ ์ฌ์ฉ ์ ์ฑ ์ด ์๋ค.
Knowledge Distillation๊ณผ์ ์ฐจ์ด
- Fine-tuning: ๊ฐ์ ๋ชจ๋ธ์ ๋ด ๋ฐ์ดํฐ๋ก ๋ ํ์ตํด ํนํ (์ง์์ โ๊ฐฑ์ ยท์ถ๊ฐโ).
- Distillation: ํฐ ๋ชจ๋ธ์ ์ง์์ ๋ค๋ฅธ(์์) ๋ชจ๋ธ๋ก ์ด์ (์ง์์ โ์ด์ฌโ).