- Unsloth๋ LLM์ ํ์ธํ๋ ์๋์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ๊ทน๋ํํ๋ ์คํ์์ค ํ๋ ์์ํฌ์ด์, ์๋น์ ํ๋์จ์ด์์ ์คํ ๊ฐ๋ฅํ ์์ ๋ GGUF ์์ํ ๋ชจ๋ธ์ ๋ฐฐํฌํ๋ ํ๋ซํผ
- GPU ์ปค๋์ ์ง์ ์์ฑ(handwritten kernel)ํ์ฌ FA2 ๋๋น ์ต๋ 30๋ฐฐ ๋น ๋ฅธ ํ์ต ์๋ ๋ฌ์ฑ
- HuggingFace์์ Unsloth Dynamic(UD) ํฌ๋งท์ผ๋ก ๋ฒ๊ทธ๊ฐ ์์ ๋ ๊ณ ํ์ง ์์ํ ๋ชจ๋ธ์ ์ ๊ณตํ๋ ์ปค๋ฎค๋ํฐ ์ ๋ขฐ ๋ชจ๋ธ ํ๋ธ
- Daniel Han ยท Michael Han ํ์ ๊ฐ ์ฐฝ์ ํ ์คํํธ์ ์ผ๋ก, fine-tuning ์ธํ๋ผ ๋๊ตฌ๊ฐ ๋ณธ์ ์ด๋ฉฐ GGUF ์ฌ๋ฐฐํฌ๋ ๋ถ์์ ์ธ ์ปค๋ฎค๋ํฐ ๊ธฐ์ฌ
ํด๋น ๊ฐ๋ ์ด ํ์ํ ์ด์
- 70B ์ด์ ๋ํ ๋ชจ๋ธ์ ์๋น์ GPU(RTX 4090 ๋ฑ)์์ fine-tuningํ๋ ค๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑ โ Unsloth๋ก ํด๊ฒฐ
- ๊ณต์ ๋ฐฐํฌ ๋ชจ๋ธ์ GGUF ๋ณํ ๊ณผ์ ์์ tool calling ๋ฒ๊ทธ, chat template ์ค๋ฅ ๋ฑ์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ โ Unsloth๊ฐ ์์ ๋ ๋ฒ์ ์ ์ง์ ๋ฐฐํฌ
- llama.cpp๋ก ๋ก์ปฌ LLM์ ์คํํ ๋ ์ด๋ค ์์ํ ํฌ๋งท์ ์ ํํ ์ง ๊ธฐ์ค์ด ํ์ํจ
AS-IS
์ผ๋ฐ GGUF ์์ํ ๋ชจ๋ธ (์: Qwen3.5-35B-A3B ๊ณต์ ์๋ณธ)
โโโ tool calling ํ์ฑ ์ค๋ฅ ๋ฐ์
โโโ MXFP4 ๋ ์ด์ด ํธํ์ฑ ๋ฌธ์
โโโ chat template ๋ถ์ผ์น๋ก ์ถ๋ก ํ์ง ์ ํ
TO-BE
Unsloth ์์ ๋ฒ์ (unsloth/Qwen3.5-35B-A3B-GGUF)
โโโ tool calling ์ ์ ์๋ (--jinja ํ๋๊ทธ)
โโโ MXFP4 ๋ ์ด์ด ์ ๊ฑฐ๋ก ์์ ์ฑ ํฅ์
โโโ UD-Q8_K_XL: 38.7GB, ์ต๊ณ ํ์ง ์์ํ
โโโ ์ฐ๊ตฌ ์์
์์ ํ๋ก ํฐ์ด ๋ชจ๋ธ ์์ค ์ฑ๋ฅ
Unsloth์ ๋ ๊ฐ์ง ์ญํ
์ญํ 1. LLM Fine-tuning ๊ฐ์ ๋๊ตฌ
| ์งํ | ์ผ๋ฐ ๋ฐฉ์ (FA2) | Unsloth |
|---|---|---|
| ํ์ต ์๋ (๋จ์ผ GPU) | 1x | 10x |
| ํ์ต ์๋ (๋ฉํฐ GPU) | 1x | 30x |
| VRAM ์ฌ์ฉ๋ | 100% | 10% (90% ์ ๊ฐ) |
| ์ง์ ๊ธฐ๋ฒ | - | LoRA, QLoRA, 4-bit/16-bit |
# Unsloth๋ก Llama3 fine-tuning ์์
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="unsloth/Meta-Llama-3.1-8B",
max_seq_length=2048,
load_in_4bit=True, # QLoRA
)์ญํ 2. ์์ ๋ GGUF ๋ชจ๋ธ ์ฌ๋ฐฐํฌ ํ๋ธ
์์ ์ ํต์ ๋น์ :
| ๋จ๊ณ | ์ญํ | ์์ ๋น์ | ์ค์ Unsloth ์์ |
|---|---|---|---|
| ์๋ณธ ์ ์ | ๋ชจ๋ธ ๊ฐ๋ฐ์ฌ | ๐ต ์ํฐ์คํธ๊ฐ ์คํ๋์ค์์ ๋ง์คํฐ ํ์ผ ๋ น์ | Qwen์ด PyTorch ํํ๋ฆฌ์์ ๋ชจ๋ธ ๋ฐฐํฌ (~70GB) |
| ๋ณํยท์์ | Unsloth ์ฌ๋ฐฐํฌ | ๐ง ์ ํต์ฌ๊ฐ MP3/FLAC ๋ณํ + ํธ๋ ์ค๋ฅ ์์ | GGUF ๋ณํ + tool calling ๋ฒ๊ทธ ์์ + MXFP4 ๋ ์ด์ด ์ ๊ฑฐ |
| ํ์ง ์ ํ | ์์ํ ๋ ๋ฒจ | ๐ฑ ์์ง ์ต์ (128kbps / 320kbps / FLAC) | UD-Q4_K_M(19.9GB) / UD-Q8_K_XL(38.7GB) |
| ์ต์ข ์คํ | ์๋น์ ๋ก์ปฌ ํ๊ฒฝ | ๐ต ๋ด ์ค๋งํธํฐ์์ ์ฌ์ | llama.cpp๋ก ์๋น์ GPU์์ ์คํ |
์ฆ, Qwen์ด โ๋ง์คํฐ ํ์ผโ์ ๋ง๋ค๋ฉด, Unsloth๋ โ๋ด ๊ธฐ๊ธฐ์์ ๋ฐ๋ก ๋ค์ ์ ์๋ ํํโ๋ก ๋ณํํด ์ฌ๋ฐฐํฌํ๋ ์ ํต์ฌ ์ญํ
Unsloth ์ ์ฉ ์ Trade-off
Fine-tuning ๋๊ตฌ๋ก ์ธ ๋
๐ง ์๋์ฐจ ํ๋์ต์ ๋น์ :
| ํญ๋ชฉ | ๋น์ | ์ค๋ช |
|---|---|---|
| โ ์๋ยท๋ฉ๋ชจ๋ฆฌ | ์๋ํ ์ฅ๋น ๋์ ์ผ๋ก ๊ฐ์ ๊ณต๊ฐ์์ 30๋ฐฐ ๋น ๋ฅด๊ฒ ์์ , ๊ณต๊ฐ๋ 90% ๋ ์ | FA2 ๋๋น ์ต๋ 30x ๋น ๋ฆ, VRAM 90% ์ ๊ฐ |
| โ ๋น์ฉ | ๋๊ตฌ๋ ๋ฌด๋ฃ๋ก ์ธ ์ ์๋ ๊ณต๊ณต ํ๋์ต | ์คํ์์ค ๋ฌด๋ฃ (Free tier) |
| โ ๏ธ ์ ํ๋ ์์ค | ๊ฒฝ๋ ๋ถํ์ผ๋ก ๊ต์ฒดํ๋ฉด ์ฐจ๋ ๊ฐ๋ฒผ์์ง์ง๋ง ์๋ณธ ๊ฐ๋๋ณด๋ค ์ฝ๊ฐ ๋ฎ์ | 4-bit ์์ํ fine-tuning์ ์๋ณธ ๋๋น ๋ฏธ์ธํ ์ฑ๋ฅ ์ ํ ๊ฐ๋ฅ |
| โ ๏ธ NVIDIA ์ ์ฉ | ํ๋ยท๊ธฐ์ ์ ์ฉ ๊ณต๊ตฌ๋ง ๊ฐ์ถ ์ต โ BMW ๊ฐ์ ธ์ค๋ฉด ๊ณต์ ์ง์ ์ ๋จ | ๊ณต์ ์ง์์ NVIDIA GPU (CUDA) ํ์ , AMD๋ ๋น๊ณต์ |
| โ ๏ธ ์ปค์คํ ์ปค๋ ์์กด | ์ง์ ์ ์ํ ํน์ ๊ณต๊ตฌ ์ฌ์ฉ โ ํน์ ์ฐจ๋ ์ฐ์ยท๋ชจ๋ธ์์ ๋ง์ง ์์ ์ ์์ | ์ง์ ์์ฑํ GPU ์ปค๋ ์ฌ์ฉ โ ํน์ ํ๋์จ์ดยทCUDA ๋ฒ์ ์์ ๋นํธํ ๋ฐ์ ๊ฐ๋ฅ |
์ฌ๋ฐฐํฌ ๋ชจ๋ธ์ ์ฌ์ฉํ ๋
๐ต ์์ ์ ํต์ ๋น์ (์ญํ 2์ ๋์ผ ๋งฅ๋ฝ):
| ํญ๋ชฉ | ๋น์ | ์ค๋ช |
|---|---|---|
| โ ๋ฒ๊ทธ ์์ | ์๋ณธ CD์ ์๋ ํธ๋ ์์ ์ค๋ฅ๋ฅผ ์ ํต์ฌ๊ฐ ๊ณ ์ณ์ ๋ฐฐํฌ | ๊ณต์ ๋ฒ์ ๋ณด๋ค ์ค์ ์ฌ์ฉ์ฑ์ด ๋ ์ข์ ๊ฒฝ์ฐ ๋ง์ |
| โ ์ ํ์ง ๋ค์ | ๊ฐ์ ์จ๋ฒ์ MP3ยทFLACยทCD ๋ฑ ์ํ๋ ํฌ๋งท์ผ๋ก ์ ํ ๊ฐ๋ฅ | 2-bit~8-bit๊น์ง ํ๋์จ์ด์ ๋ง๊ฒ ์ ํ ๊ฐ๋ฅ |
| โ ๏ธ ๋น๊ณต์ ๋ฐฐํฌ | ์ํฐ์คํธ ๊ณต์ ์คํ ์ด๊ฐ ์๋ ์๋ํํฐ ์ ํต โ ๋ฏฟ์ ์ ์์ง๋ง ๊ณต์์ ์๋ | Meta/Qwen/Google์ ๊ณต์ ๋ฆด๋ฆฌ์ฆ๊ฐ ์๋ โ ๊ฒ์ฆ ์ฃผ์ฒด๊ฐ Unsloth ํ |
| โ ๏ธ ์ ๋ฐ์ดํธ ์์ฐจ | ์จ๋ฒ ๋ฐ๋งค ํ ์์ ์๋น์ค ๋ฑ๋ก๊น์ง ๋ฉฐ์น ๊ฑธ๋ฆผ | ์๋ณธ ๋ชจ๋ธ ์ ๋ฐ์ดํธ ํ Unsloth ๋ฒ์ ์ด ๋์ฌ ๋๊น์ง ๋ฉฐ์น ~์ ์ฃผ ์ง์ฐ |
| โ ๏ธ ์์ํ ์์ค | MP3 128kbps๋ ์๋ณธ FLAC๋ณด๋ค ์์ง ๋ฎ๊ณ , 32kbps๋ ์์๋ฃ๊ธฐ๋ ํ๋ฆ | Q4 < Q8 < ์๋ณธ ์์ผ๋ก ์ ํ๋ ์ ํ, ๊ทน๋จ์ ์ธ 2-bit๋ ํ์ง ํฌ๊ฒ ํ๋ฝ |
๋น์ฆ๋์ค ๋ชจ๋ธ
Unsloth์ ํต์ฌ ์์ต์์ fine-tuning ์ธํ๋ผ ๋๊ตฌ ํ๋งค๋ค. GGUF ๋ชจ๋ธ ์ฌ๋ฐฐํฌ๋ ์์ต ๋ชจ๋ธ์ด ์๋๋ผ ์ปค๋ฎค๋ํฐ ๊ธฐ์ฌ์ด์ ๋ธ๋๋ ์ธ์ง๋๋ฅผ ๋์ด๋ ๋ง์ผํ ํจ๊ณผ๋ฅผ ๊ฒธํ๋ค.
| ํฐ์ด | ๋น์ฉ | ์ฃผ์ ํน์ง |
|---|---|---|
| Free | ๋ฌด๋ฃ (์คํ์์ค) | ๋จ์ผ GPU, 2x ์๋, VRAM 60% ์ ๊ฐ |
| Pro | ๋น๊ณต๊ฐ (๋ฌธ์) | ๋ฉํฐ GPU(์ต๋ 8๊ฐ), 2.5x ์๋, VRAM 80% ์ ๊ฐ |
| Enterprise | ๋น๊ณต๊ฐ (๋ฌธ์) | FA2 ๋๋น 32x ์๋, ๋ฉํฐ ๋ ธ๋, ์ ๋ด ์ง์ |
์คํ์์ค Free ํฐ์ด๋ก ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์ ์ ๋ขฐ๋ฅผ ์ป๊ณ , ๋๊ท๋ชจ ํ์ต์ด ํ์ํ ๊ธฐ์ ๊ณ ๊ฐ์๊ฒ Pro/Enterprise๋ฅผ ํ๋งคํ๋ ์คํ์์ค SaaS ์ ๋ต์ด๋ค. ์ฐฝ์ ์์ธ DanielยทMichael Han ํ์ ๋ ์ด์ ์๋ HyperLeap์ด๋ผ๋ ML ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด Microsoft, NVIDIA, NASA ๋ฑ์์ ์ฌ์ฉ๋ ์ด๋ ฅ์ด ์๋ค.
Unsloth Dynamic (UD) ์์ํ ํฌ๋งท
| ํฌ๋งท | ํฌ๊ธฐ | ๋นํธ | ์ฉ๋ |
|---|---|---|---|
| UD-IQ2_XXS | 9.76 GB | 2-bit | ๊ทนํ ์์ถ, ์ ์ฌ์ |
| UD-Q3_K_M | 16.7 GB | 3-bit | ๊ท ํ |
| UD-Q4_K_M | 19.9 GB | 4-bit | ๊ถ์ฅ (ํ์ง/ํฌ๊ธฐ ๊ท ํ) |
| UD-Q4_K_XL | 20.6 GB | 4-bit | ๊ณ ํ์ง |
| UD-Q8_K_XL | 38.7 GB | 8-bit | ์ต๊ณ ํ์ง (Reddit ํฌ์คํธ ์ฌ์ฉ) |
UD์ ๋์ฌ = Unsloth Dynamic โ ํ์ค GGUF๋ณด๋ค ์ ํ๋ ๋์ ์์ํ
๋ก์ปฌ LLM ์คํ ์ปจํ ์คํธ (Reddit ํฌ์คํธ ๋ถ์)
# llama.cpp-rocm (AMD GPU) ์คํ ํ๋ผ๋ฏธํฐ
--ctx-size 262144 # Qwen3.5์ ๋ค์ดํฐ๋ธ ์ปจํ
์คํธ ๊ธธ์ด
--n-gpu-layers 999 # ์ ์ฒด ๋ ์ด์ด GPU ์คํ๋ก๋
--flash-attn auto # Flash Attention ์๋
--jinja # Jinja ํ
ํ๋ฆฟ (tool calling ํ์)
--temp 0.6 --top-p 0.90 --top-k 20์ค์ ์ฑ๋ฅ ๊ฒฐ๊ณผ (Strix Halo ์์คํ , AMD Ryzen AI Max+ 395):
- Prefill ์๋: 600+ t/s
- ์์ฑ ์๋: 25-30 t/s
- 30k ํ ํฐ ์ปจํ ์คํธ์์ 14ํ ์น ๊ฒ์ + 4ํ ์ ์ฒด ํ์ด์ง fetch
- ๋ฆฌ์์น ํ์ง: GPT-4o, Gemini, Claude ๋ฑ ํ๋ก ํฐ์ด ๋ชจ๋ธ๊ณผ ๋๊ธ