Korean LLM Fine-tuning Project
μ΄ νλ‘μ νΈλ Llama 3.1 8B λͺ¨λΈμ νκ΅μ΄ QA λ°μ΄ν°λ‘ νμΈνλνλ μμμ λλ€. LoRA(μ λν¬ μ΄λν°) λ°©λ²μ μ¬μ©νμ¬ ν¨μ¨μ μΈ νμΈνλμ μνν©λλ€.
π― λͺ©ν
- Llama 3.1 8B λͺ¨λΈμ νκ΅μ΄ λ°μ΄ν°λ‘ νμΈνλ
- LoRAλ₯Ό ν΅ν λ©λͺ¨λ¦¬ ν¨μ¨μ μΈ νμ΅
- νκ΅μ΄ μ§μμλ΅ λ₯λ ₯ ν₯μ
- κΈ°μ λ ₯ μ μ¦μ μν λ°λͺ¨ νλ‘μ νΈ
π νλ‘μ νΈ κ΅¬μ‘°
korean-llm-finetune/
βββ README.md # νλ‘μ νΈ μ€λͺ
βββ requirements.txt # νμν ν¨ν€μ§ λͺ©λ‘
βββ model_card.md # λͺ¨λΈ μΉ΄λ
βββ configs/
β βββ lora_config.yaml # LoRA μ€μ
βββ data/
β βββ ko_samples.jsonl # νκ΅μ΄ μν λ°μ΄ν°
βββ scripts/
β βββ train_lora.py # νμΈνλ μ€ν¬λ¦½νΈ
β βββ evaluate.py # νκ° μ€ν¬λ¦½νΈ
β βββ preprocess.py # μ μ²λ¦¬ μ€ν¬λ¦½νΈ
βββ inference_demo.ipynb # μΆλ‘ λ°λͺ¨ λ
ΈνΈλΆ
βββ outputs/ # νμ΅ κ²°κ³Ό μ μ₯
π μμνκΈ°
1. νκ²½ μ€μ
# νμν ν¨ν€μ§ μ€μΉ
pip install -r requirements.txt
2. λ°μ΄ν° μ€λΉ
data/ko_samples.jsonl
νμΌμ νκ΅μ΄ QA λ°μ΄ν°λ₯Ό μ€λΉν©λλ€:
{
"instruction": "λ€μ μ§λ¬Έμ λ΅νμΈμ",
"input": "νκ΅μ AI μ μ±
μ?",
"output": "μ λΆλ 2025λ
λΆν° λ
μ AI νμ΄λ°μ΄μ
λͺ¨λΈμ κ°λ° μ€μ
λλ€."
}
3. λͺ¨λΈ λ€μ΄λ‘λ
Llama 3.1 8B λͺ¨λΈμ Hugging Faceμμ λ€μ΄λ‘λν©λλ€:
from transformers import AutoTokenizer, AutoModelForCausalLM
# ν ν¬λμ΄μ λ€μ΄λ‘λ
tokenizer = AutoTokenizer.from_pretrained("meta-llama/llama-3.1-8b")
# λͺ¨λΈ λ€μ΄λ‘λ (Meta λΌμ΄μ μ€ λμ νμ)
model = AutoModelForCausalLM.from_pretrained("meta-llama/llama-3.1-8b")
4. νμΈνλ μ€ν
cd scripts
python train_lora.py \
--model_name_or_path meta-llama/llama-3.1-8b \
--data_path ../data/ko_samples.jsonl \
--output_dir ../outputs \
--num_train_epochs 3 \
--per_device_train_batch_size 1 \
--learning_rate 2e-4
5. λͺ¨λΈ νκ°
python evaluate.py \
--base-model meta-llama/llama-3.1-8b \
--adapter-path ../outputs/final_model \
--test-data ../data/ko_samples.jsonl
6. μΆλ‘ λ°λͺ¨
Jupyter λ ΈνΈλΆμ μ€ννμ¬ λͺ¨λΈμ ν μ€νΈν©λλ€:
jupyter notebook inference_demo.ipynb
π§ μ£Όμ κΈ°λ₯
LoRA νμΈνλ
- μ λν¬ μ΄λν°λ₯Ό ν΅ν λ©λͺ¨λ¦¬ ν¨μ¨μ±
- LoRAλ₯Ό ν΅ν μ μν νμ΅
- CPU/M1/M2 νκ²½μμλ νμ΅ κ°λ₯
νκ΅μ΄ μ΅μ ν
- νκ΅μ΄ ν둬ννΈ ν¬λ§·ν
- νκ΅μ΄ QA λ°μ΄ν°μ
- νκ΅μ΄ νΉν ν ν¬λμ΄μ§
νκ° λ° λ°λͺ¨
- μλνλ νκ° μ€ν¬λ¦½νΈ
- Jupyter λ ΈνΈλΆ λ°λͺ¨
- κ²°κ³Ό μκ°ν
π μ±λ₯ μ§ν
- λͺ¨λΈ ν¬κΈ°: 3.2B νλΌλ―Έν°
- νμ΅ κ°λ₯ν νλΌλ―Έν°: ~0.85M (LoRA)
- λ©λͺ¨λ¦¬ μ¬μ©λ: CPU/M1/M2 νκ²½ κΈ°μ€
- 컨ν μ€νΈ κΈΈμ΄: 4096 ν ν°
π ν μ€νΈ κ²°κ³Ό μμ½
- λͺ¨λΈ: meta-llama/llama-3.1-8b
- μ΄λν°: ../outputs/final_model
- ν μ€νΈ λ°μ΄ν°: ../data/ko_samples.jsonl
- ν μ€νΈ μν μ: 10
- νκ° μ‘°κ±΄: max_new_tokens=128, temperature=0.7
- μμ€ν : Windows-11-10.0.26100-SP0, Intel64 Family 6 Model 183 Stepping 1, Python 3.13.5
# | μ§λ¬Έ | μ λ ₯ | μμ λ΅λ³ | μμ± λ΅λ³(μμ½) |
---|---|---|---|---|
1 | λ€μ μ§λ¬Έμ λ΅νμΈμ | νμ΄μ¬μΌλ‘ ν©ν λ¦¬μΌ ν¨μ λ§λ€μ΄μ€. | def factorial(n): return 1 if n == 0 else n * factorial(n-1) |
def factorial(n): if n == 0: return 1 else: return n * factorial(n - 1) print(factorial(5)) |
2 | λ€μ μ§λ¬Έμ λ΅νμΈμ | μ¬κ³Όμ λ°λλμ μ°¨μ΄μ μ ν λ¬Έμ₯μΌλ‘ μ€λͺ ν΄μ€. | μ¬κ³Όλ μμνκ³ λ¬μ½€ν κ³ΌμΌμ΄λ©°, λ°λλλ λΆλλ½κ³ λ¬μ½€ν μ΄λκ³ΌμΌμ λλ€. | μ¬κ³Όλ κ³ΌμΌλ‘μ μλ΅μ΄ κ°λ₯νλ€. κ³ΌμΌμ κ³ΌμΌμ΄ μλλ―λ‘ μλ΅ν μ μλ€. μ¬κ³Όλ κ³ΌμΌλ‘μ μλ΅μ΄ κ°λ₯νλ€. κ³ΌμΌμ κ³ΌμΌμ΄ μλλ―λ‘ μλ΅ν μ μλ€. |
3 | λ€μ μ§λ¬Έμ λ΅νμΈμ | 'μΈκ³΅μ§λ₯'μ μ΄λ±νμ μμ€μΌλ‘ μ€λͺ ν΄μ€. | μΈκ³΅μ§λ₯μ μ¬λμ²λΌ μκ°νκ³ λ°°μ°λ λλν μ»΄ν¨ν° νλ‘κ·Έλ¨μ΄μμ. | μΈκ³΅μ§λ₯μ μΈκ°μ μ§λ₯μ μ΄λν κ²°κ³Όλ¬Όμ΄λ€. μΈκ°μ μ§λ₯μ μ λλ‘ μ€λͺ νκ³ μΆλ€λ©΄, "μΈκ°μ μ§λ₯μ μΈκ³΅μ§λ₯μ μ λλ‘ μ€λͺ νλ λ₯λ ₯μ΄λ€."λΌκ³ λ§ν΄μΌ νλ€. |
4 | λ€μ μ§λ¬Έμ λ΅νμΈμ | νμ΄μ¬μμ 리μ€νΈμ ννμ μ°¨μ΄μ μ ν λ¬Έμ₯μΌλ‘ μ€λͺ ν΄μ€. | 리μ€νΈλ λ³κ²½μ΄ κ°λ₯νμ§λ§, ννμ ν λ² μμ±νλ©΄ κ°μ λ°κΏ μ μμ΅λλ€. | 리μ€νΈλ μμκ° μλ€. 리μ€νΈμ λͺ¨λ μμκ° λμΌν κ°μ΄ μλλ€. ννμ μμκ° μλ€. 리μ€νΈμ λͺ¨λ μμκ° λμΌν κ°μ΄ μλλ€. ννμ λͺ¨λ μμκ° λμΌν κ°μ΄ μλλ€. |
5 | λ€μ μ§λ¬Έμ λ΅νμΈμ | 'ν볡'μ΄λ 무μμΈμ§ μ§§κ² μ μν΄μ€. | ν볡μ κΈ°μκ³ λ§μ‘±μ€λ¬μ΄ κ°μ μ λλΌλ μνμ λλ€. | ν볡λ, ν볡ν¨, ν볡ν μ¬λ |
6 | λ€μ μ§λ¬Έμ λ΅νμΈμ | νμ΄μ¬μΌλ‘ νΌλ³΄λμΉ μμ΄μ ꡬνλ ν¨μλ₯Ό μμ±ν΄μ€. | def fibonacci(n): a, b = 0, 1 for _ in range(n): a, b = b, a + b return a |
λ€μμ ν΅ν΄ νΌλ³΄λμΉ μμ΄μ ꡬνλ ν¨μλ₯Ό μμ±νμΈμ #νμ΄μ¬μμ λ°λ³΅λ¬Έμ μ¬μ©ν λλ λ°λ³΅ νμμ λ°λ³΅λλ μ«μλ₯Ό λͺ μμ μΌλ‘ μ£Όμ΄μΌ νλ€. #λ°λ³΅ νμλ λ°λ³΅λλ μ«μλ₯Ό λ»νλ©°, λ°λ³΅λλ μ«μλ 1λΆν° μμνλ€. def fibo(n): a = 0 b = 1 for i in range(n): a,b = b,a+b return a n = int(input()) print(fibo(n)) |
7 | λ€μ μ§λ¬Έμ λ΅νμΈμ | μ§κ΅¬μ λ¬μ μ°¨μ΄μ μ ν λ¬Έμ₯μΌλ‘ μ€λͺ ν΄μ€. | μ§κ΅¬λ μλͺ μ²΄κ° μ΄ μ μλ νμ±μ΄λ©°, λ¬μ μ§κ΅¬μ μμ±μΌλ‘ 곡μ νκ³ μμ΅λλ€. | μ§κ΅¬μ 3λ°°κ° λλ 거리μμ λ¬μ 1.5λ°°κ° λλ 거리 |
8 | λ€μ μ§λ¬Έμ λ΅νμΈμ | 'λΈλ‘체μΈ'μ μ΄λ±νμμ΄ μ΄ν΄ν μ μκ² μ€λͺ ν΄μ€. | λΈλ‘체μΈμ μ 보λ₯Ό μμ νκ² μ μ₯νλ νΉλ³ν μ»΄ν¨ν° κΈ°λ‘μ₯μΉμμ. | λΈλ‘체μΈμ 'μ΄λ'μ΄λ μλ―Έλ‘, λΈλ‘체μΈμμ 'μ΄λ'νλ κ²μ λ°μ΄ν°λ₯Ό 'μ΄λ'νλ κ²μ΄λ€. |
9 | λ€μ μ§λ¬Έμ λ΅νμΈμ | νμ΄μ¬μμ λμ λ리μ 리μ€νΈμ μ°¨μ΄μ μ ν λ¬Έμ₯μΌλ‘ μ€λͺ ν΄μ€. | λμ λ리λ ν€μ κ°μ μμΌλ‘ λ°μ΄ν°λ₯Ό μ μ₯νκ³ , 리μ€νΈλ μμλλ‘ κ°μ μ μ₯ν©λλ€. | λμ λ리μ 리μ€νΈμ μ°¨μ΄λ λμ λ리μμ ν€λ₯Ό μ¬μ©ν λ, ν€λ νλͺ©μ μ΄λ¦, 리μ€νΈμμλ νλͺ©μ κ°μ΄λ€. |
10 | λ€μ μ§λ¬Έμ λ΅νμΈμ | 'μ°μ 'μ΄λ 무μμΈμ§ μ§§κ² μ μν΄μ€. | μ°μ μ μλ‘λ₯Ό μλΌκ³ λμμ£Όλ μΉκ΅¬ μ¬μ΄μ μμ€ν κ΄κ³μ λλ€. | "μ°μ μ λ μ¬λμ΄ μλ‘ μμ κ°μΉλ₯Ό ν¨κ» λλΌκ³ , μλ‘λ₯Ό μ‘΄μ€νκ³ , μ¬λνκ³ , λκΈ°λΆμ¬νκ³ , μ‘΄μ€νκΈ° μν΄ μλ‘λ₯Ό μ§μ§νλ€. μ°μ μ μλ‘μ κ°μΉμ λν λκΈ°λΆμ¬κ° νμνλ©°, μλ‘μ κ°μΉλ₯Ό μ‘΄μ€νλ€. μ°μ μ λ μ¬λμ΄ μλ‘μκ² μ‘΄μ€νλ κ°μΉλ₯Ό μ‘΄μ€νκΈ° μν΄ μλ‘λ₯Ό μ‘΄μ€νλ€." |
π οΈ κΈ°μ μ€ν
- Transformers: Hugging Face Transformers λΌμ΄λΈλ¬λ¦¬
- PEFT: Parameter-Efficient Fine-Tuning
- PyTorch: λ₯λ¬λ νλ μμν¬
- Datasets: λ°μ΄ν° μ²λ¦¬
π μ¬μ© μμ
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel
# λͺ¨λΈ λ‘λ
tokenizer = AutoTokenizer.from_pretrained("meta-llama/llama-3.1-8b")
base_model = AutoModelForCausalLM.from_pretrained("meta-llama/llama-3.1-8b")
model = PeftModel.from_pretrained(base_model, "./outputs/final_model")
# μΆλ‘
prompt = "### μ§λ¬Έ: λ€μ μ§λ¬Έμ λ΅νμΈμ\nμ
λ ₯: νκ΅μ μλλ?\n### λ΅λ³:"
inputs = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=128)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(response)
π€ κΈ°μ¬νκΈ°
- μ΄ μ μ₯μλ₯Ό ν¬ν¬ν©λλ€
- μλ‘μ΄ κΈ°λ₯ λΈλμΉλ₯Ό μμ±ν©λλ€
- λ³κ²½μ¬νμ 컀λ°ν©λλ€
- λΈλμΉμ νΈμν©λλ€
- Pull Requestλ₯Ό μμ±ν©λλ€
π λΌμ΄μ μ€
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€ νμ λ°°ν¬λ©λλ€. Llama 3.2 λͺ¨λΈ μ¬μ©μ μν΄μλ Metaμ λΌμ΄μ μ€ λμκ° νμν©λλ€.
π κ°μ¬μ λ§
- Meta AIμ Llama 3.2 λͺ¨λΈ
- Hugging Face νμ Transformers λΌμ΄λΈλ¬λ¦¬
- Microsoftμ PEFT λΌμ΄λΈλ¬λ¦¬
π λ¬Έμ
νλ‘μ νΈμ λν λ¬Έμμ¬νμ΄ μμΌμλ©΄ μ΄μλ₯Ό μμ±ν΄μ£ΌμΈμ.
Inference Providers
NEW
This model isn't deployed by any Inference Provider.
π
Ask for provider support