sLLM (Korean)
νκ΅μ΄ μν μΈμ΄λͺ¨λΈ. 24μΈ΅ Β· d_model 768 Β· GQA(12 q / 4 kv) Β· sliding window(512) + 6μΈ΅λ§λ€ global νΌν© μ΄ν μ Β· MTP(multi-token prediction) ν€λλ₯Ό μΉμ λμ½λμ λλ€. SentencePiece 32,768 vocab.
νλΌλ―Έν° 178.6M (μλ² λ© 25.2M μ μΈ μ 153.4M). MTP ν€λλ νμ΅μμ 보쑰 μμ€λ‘ μ°μ΄κ³ , μΆλ‘ μμλ self-speculative decodingμ draft μμ±κΈ°λ‘ μ¬νμ©λ©λλ€.
| μΈ΅ / d_model / FFN | 24 / 768 / 2048 |
| μ΄ν μ | GQA 12 q Β· 4 kv head, head_dim 64 |
| 컨ν μ€νΈ | 2,048 (sliding window 512, 6μΈ΅λ§λ€ global) |
| RoPE ΞΈ | local 10,000 / global 1,000,000 |
| MTP | 16 offset, μμ€ κ°μ€μΉ 0.2 |
| vocab | 32,768 (pad 0, bos 1, eos 2) |
νμ΅
| μ½νΌμ€ | νκ΅μ΄ 76.86M ν ν°, νν° ν β74.86M |
| λ°°μΉ | 8 Γ grad_accum 4 Γ 2,048 = 65,536 ν ν°/step |
| 1 epoch | β1,142 step |
| λͺ©ν | 4 epoch β 4,570 step |
| best 체ν¬ν¬μΈνΈ | step 4,500 (β3.9 epoch, λμ β295M ν ν°) |
| μ²λ¦¬λ | 22.9k tok/s, νΌν¬ λ©λͺ¨λ¦¬ 70.5 GiB |
step 4,500 κΈ°μ€ μμ€μ
λλ€. μ΄ μμ€μ main + 0.2 Γ mtpμ
λλ€.
| main | mtp | μ΄ | |
|---|---|---|---|
| train | 1.9419 | 5.8022 | 3.1023 |
| val | 3.0717 | 6.4412 | β |
val perplexity 21.6 (= exp(3.0717)). safetensors ν€λμ best_val λ©νλ°μ΄ν°κ° μ΄ val main κ°μ
λλ€.
νμΌ
| νμΌ | λ΄μ© |
|---|---|
model.safetensors |
νμ΅λ κ°μ€μΉ (fp32, 714 MB) |
config.json |
ModelConfig.to_dict() κ²°κ³Ό |
model.py |
μν€ν μ² μ μ (λ‘λμ νμ) |
spm.model |
SentencePiece ν ν¬λμ΄μ |
onnx/model.onnx |
ν리ν/λμ½λ κ³΅μ© ONNX νΈλ ν¬ (708 MB) |
onnx/mtp_head.onnx |
MTP ν€λ (speculative decodingμ©, 110 MB) |
onnx/config.json |
μμ λμΌν config |
λ‘λ
KoreanSLLMμ transformersμ PreTrainedModelμ μμνμ§ μλ μμ nn.Moduleμ΄λ―λ‘
AutoModel.from_pretrainedλ‘λ λ‘λλμ§ μμ΅λλ€. νμΌμ μ§μ λ°μ μλλ€.
import json, torch
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file
repo = "PostAlign/sLLM"
# model.py λ₯Ό λ°μμ import
import importlib.util, sys
spec = importlib.util.spec_from_file_location("kslm", hf_hub_download(repo, "model.py"))
kslm = importlib.util.module_from_spec(spec); sys.modules["kslm"] = kslm
spec.loader.exec_module(kslm)
cfg = kslm.ModelConfig(**json.load(open(hf_hub_download(repo, "config.json"))))
model = kslm.KoreanSLLM(cfg)
model.load_state_dict(load_file(hf_hub_download(repo, "model.safetensors")))
model.eval()
import sentencepiece as spm
tok = spm.SentencePieceProcessor(model_file=hf_hub_download(repo, "spm.model"))
ONNX
λΈλΌμ°μ (WebGPU)Β·λͺ¨λ°μΌ(NNAPI/CoreML) κ°μ μΆλ‘ μ© κ·Έλνμ
λλ€. ν리νκ³Ό λμ½λκ° κ°μ κ·Έλνμ΄λ©°,
ν리νμ past_len=0, λμ½λλ seq=1λ‘ νΈμΆν©λλ€.
μ
λ ₯ input_ids (batch, seq) int64
past_k (24, batch, 4, past_len, 64)
past_v (24, batch, 4, past_len, 64)
μΆλ ₯ logits (batch, seq, 32768)
hidden (batch, seq, 768) # mtp_head.onnx μ μ
λ ₯
present_k (24, batch, 4, past_len + seq, 64)
present_v (24, batch, 4, past_len + seq, 64)
mtp_head.onnxλ (hidden, offset_idx)λ₯Ό λ°μ (logits, mtp_hidden)μ λ
λλ€.
speculative decodingμ μμ©/κ±°λΆ νμ 루νλ κ·Έλνκ° μλλΌ νΈμ€νΈ μ½λμ λ‘λλ€.
export μ§ν onnxruntimeμΌλ‘ PyTorch μλ³Έκ³Ό λμ‘°νμ΅λλ€.
ν리ν(T=24, P=0) λ‘μ§ μ΅λμ€μ°¨: 1.621e-05
greedy 12μ€ν
ν ν°μ΄ μΌμΉ: True
MTP offset 0..15 λ‘μ§ μ΅λμ€μ°¨: 5.722e-06
νκ³
max_seq_len=2048μ΄ μμ± μ νλ μ»·μ λλ€.- ONNX κ·Έλνλ KV μΊμλ₯Ό λ§€ μ€ν μ 체 볡μ¬ν©λλ€(in-place μνκ° μμ). κΈ΄ 컨ν μ€νΈμμ λ³λͺ©μ λλ€.
- ONNX
logitsκ° μ μμΉμ λν΄ λμ€λ―λ‘ κΈ΄ ν리νμμ μΆλ ₯μ΄ ν½λλ€(2,048 컨ν μ€νΈ fp32 κΈ°μ€ 268 MB). - train/val κ°κ·Ήμ΄ ν½λλ€. step 4,500μμ train main 1.9419 (ppl 6.97) λ val main 3.0717 (ppl 21.6)λ‘, κ°μ μ½νΌμ€λ₯Ό μ½ 4ν λ°λ³΅ν λ° λ°λ₯Έ κ³Όμ ν©μ΄ λλ ·ν©λλ€. λ°μ΄ν°λ₯Ό λλ¦¬μ§ μκ³ stepλ§ λ λ°μ΄λ valμ΄ κ°μ λκΈ° μ΄λ ΅μ΅λλ€.
- λ°μ΄ν°κ° λͺ¨λΈ ν¬κΈ°μ λΉν΄ μ μ΅λλ€. κ³ μ ν ν° 74.86Mμ 178M νλΌλ―Έν° κΈ°μ€ νν μ°λ κ²½νμΉ(νλΌλ―Έν°λΉ ~20ν ν°, μ½ 3.6B)μ νμ°Έ λͺ» λ―ΈμΉ©λλ€. μ±λ₯ μνμ΄ λ°μ΄ν°μ κ±Έλ € μμ΅λλ€.
- μκ·λͺ¨Β·μ§§μ νμ΅ λͺ¨λΈμ λλ€. μ¬μ€μ±Β·μμ μ± λ³΄μ₯μ΄ μμΌλ©°, λ²€μΉλ§ν¬ νκ°λ₯Ό μννμ§ μμμ΅λλ€.
- Downloads last month
- -