Skip to content

Latest commit

ย 

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Ollama ๋ชจ๋ธ ํŒŒ์ธํŠœ๋‹ ์ƒ˜ํ”Œ

ํ•œ๊ตญ์–ด ยท English

๋กœ์ปฌ Ollama ๋ชจ๋ธ์„ LoRA๋กœ ํŒŒ์ธํŠœ๋‹ํ•ด ๋‹ค์‹œ Ollama์— ๋“ฑ๋กํ•˜๋Š” end-to-end ์ƒ˜ํ”Œ. ํ•ฉ์„ฑ ํ•™์Šต ๋ฐ์ดํ„ฐ ์ƒ์„ฑ๊ธฐ๊ฐ€ ํฌํ•จ๋ผ ์žˆ์–ด ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์—†์ด ๋ฐ”๋กœ ๋Œ๋ ค๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋‘ ํŒŒ์ดํ”„๋ผ์ธ์ด ๋“ค์–ด ์žˆ๋‹ค:

ํด๋” ๋Œ€์ƒ ํƒœ์Šคํฌ ๋ฐ์ดํ„ฐ
scripts-vlm/ qwen3-vl:8b (8.8B, ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ) ์˜์ˆ˜์ฆ ์ด๋ฏธ์ง€ โ†’ ๊ตฌ์กฐํ™” JSON data/
scripts-llm/ qwen3.8:latest (27.3B) ๊ณ ๊ฐ ๋ฌธ์˜ ํ…์ŠคํŠธ โ†’ ๋ผ์šฐํŒ… JSON data-llm/

๋‘ ํด๋”๋Š” ๊ฐ™์€ 5๋‹จ๊ณ„ ๊ตฌ์กฐ(00 ๋ฐ์ดํ„ฐ โ†’ 01 ํ•™์Šต โ†’ 02 ๊ฒ€์ฆ โ†’ 03 ๋ณ‘ํ•ฉ โ†’ 04 GGUF/๋“ฑ๋ก โ†’ 05 Ollama ๊ฒ€์ฆ)๋ฅผ ๊ณต์œ ํ•œ๋‹ค. ์•„๋ž˜ 1~5์žฅ์€ scripts-vlm ๊ธฐ์ค€์ด๊ณ , scripts-llm์€ ๋’ค์˜ ์ „์šฉ ์žฅ์—์„œ ๋‹ค๋ฃฌ๋‹ค.

๋จผ์ € ์•Œ์•„์•ผ ํ•  ๊ฒƒ (๊ณตํ†ต)

Ollama์—๋Š” ํŒŒ์ธํŠœ๋‹ ๊ธฐ๋Šฅ์ด ์—†๋‹ค. GGUF ์ถ”๋ก  ์—”์ง„์ด๋‹ค. ๋˜ํ•œ ๋กœ์ปฌ์˜ qwen3-vl:8b๋Š” ์ด๋ฏธ Q4_K_M์œผ๋กœ ์–‘์žํ™”๋œ ์‚ฐ์ถœ๋ฌผ์ด๋ผ ๊ทธ ํŒŒ์ผ ์ž์ฒด๋ฅผ ํ•™์Šต์‹œํ‚ฌ ์ˆ˜ ์—†๋‹ค(4bit ์ •์ˆ˜ ๊ฐ€์ค‘์น˜์—๋Š” gradient๋ฅผ ํ˜๋ฆด ์ˆ˜ ์—†๋‹ค).

๊ทธ๋ž˜์„œ ์‹ค์ œ ๊ฒฝ๋กœ๋Š” ์ด๋ ‡๋‹ค:

Qwen/Qwen3-VL-8B-Instruct (HF, bf16)      โ† ํ•™์Šต ์‹œ์ž‘์ . ollama์˜ qwen3-vl:8b์™€ ๊ฐ™์€ ์›๋ณธ
        โ”‚  LoRA ํ•™์Šต (transformers + peft)
        โ–ผ
out/lora-receipt/  (์–ด๋Œ‘ํ„ฐ, ์ˆ˜์‹ญ MB)
        โ”‚  ๋ณ‘ํ•ฉ
        โ–ผ
out/merged/  (fp16 full weight, ์•ฝ 17GB)
        โ”‚  llama.cpp: convert_hf_to_gguf.py  (+ --mmproj)
        โ–ผ
์–ธ์–ด๋ชจ๋ธ GGUF + ๋น„์ „ ํ”„๋กœ์ ํ„ฐ GGUF โ†’ ์–‘์žํ™”(Q4_K_M)
        โ”‚  ollama create -f Modelfile
        โ–ผ
ollama run qwen3vl-receipt

๋กœ์ปฌ ๋ชจ๋ธ์€ Thinking ๋ณ€์ข…์ด๋‹ค

ollama show qwen3-vl:8b โ†’ qwen3vl / 8.8B / ctx 262144 / Q4_K_M / visionยทtoolsยทthinking. ๊ทธ๋ฆฌ๊ณ  ollama show --modelfile qwen3-vl:8b ๋ฅผ ๋ณด๋ฉด RENDERER qwen3-vl-thinking, PARSER qwen3-vl-thinking ์ด๋‹ค. ์ฆ‰ ์ด ํƒœ๊ทธ๋Š” Instruct๊ฐ€ ์•„๋‹ˆ๋ผ Thinking ๋ณ€์ข…์ด๋‹ค. /api/chat์— "think": false๋ฅผ ๋ณด๋‚ด๋„ ์ถ”๋ก ์ด ๊บผ์ง€์ง€ ์•Š๊ณ  thinking ํ•„๋“œ๋กœ ๋ถ„๋ฆฌ๋  ๋ฟ์ด์–ด์„œ, num_predict๊ฐ€ ์ž‘์œผ๋ฉด ๋‹ต(content)์ด ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋Š๊ธด๋‹ค(์‹ค์ธก: ์ถ”๋ก  2000~5000์ž).

์ด ์ €์žฅ์†Œ์˜ ํ•™์Šต ๊ธฐ๋ณธ๊ฐ’์€ Qwen/Qwen3-VL-8B-Instruct ๋‹ค. ๊ตฌ์กฐํ™” JSON ์ถ”์ถœ์—๋Š” ์ถ”๋ก  ๋ธ”๋ก์ด ๋ฐฉํ•ด๋งŒ ๋˜๊ณ , ๋ผ๋ฒจ์— thinking ํ˜•์‹์„ ํ‰๋‚ด๋‚ผ ํ•„์š”๋„ ์—†์–ด ํ›จ์”ฌ ๋‹จ์ˆœํ•˜๋‹ค. ์ „์ฒด ๋ณ‘ํ•ฉ ๊ฒฝ๋กœ(4๋‹จ๊ณ„)๋Š” ๋ชจ๋ธ์„ ํ†ต์งธ๋กœ ๊ต์ฒดํ•˜๋ฏ€๋กœ ๋กœ์ปฌ ํƒœ๊ทธ์™€ ๋‹ฌ๋ผ๋„ ๋ฌธ์ œ์—†๋‹ค.

๋‹จ, ๊ฒฝ๋Ÿ‰ ๊ฒฝ๋กœ(4b, ๊ธฐ์กด qwen3-vl:8b ์œ„์— ์–ด๋Œ‘ํ„ฐ๋งŒ ์–น๊ธฐ)๋ฅผ ์“ธ ๊ฑฐ๋ฉด ๋ฒ ์ด์Šค๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค โ†’ --model Qwen/Qwen3-VL-8B-Thinking ์œผ๋กœ ํ•™์Šตํ•˜๊ณ  BASE_HF_MODEL๋„ ๊ฐ™์ด ๋งž์ถ˜๋‹ค. ์ด๋•Œ๋Š” ๋ผ๋ฒจ๋„ Thinking ํ…œํ”Œ๋ฆฟ์— ๋งž์ถฐ์•ผ ํ•œ๋‹ค.

ํŒŒ์ธํŠœ๋‹ ์ „ baseline (์‹ค์ธก)

python scripts-vlm/05_test_ollama.py --model qwen3-vl:8b --limit 3 ๊ฒฐ๊ณผ:

ํ•ญ๋ชฉ ์ •ํ™•๋„ ๊ด€์ฐฐ
store / date / total 2/3 (67%) ๋๊นŒ์ง€ ์ƒ์„ฑ๋งŒ ๋˜๋ฉด ๋Œ€์ฒด๋กœ ๋งžํžŒ๋‹ค
items (๋‹จ๊ฐ€) 0/3 (0%) price์— **๋‹จ๊ฐ€ ๋Œ€์‹  ์ค„ ํ•ฉ๊ณ„(qtyร—price)**๋ฅผ ๋„ฃ๋Š”๋‹ค
exact match 0/3 (0%) โ€”
โ€” โ€” 3๊ฑด ์ค‘ 1๊ฑด์€ ์ถ”๋ก ์ด ๊ธธ์–ด done_reason=length๋กœ ๋‹ต์ด ์ž˜๋ ธ๋‹ค

์ฆ‰ ๋ฒ ์ด์Šค ๋ชจ๋ธ์€ "์ฝ๊ธฐ"๋Š” ๋˜๋Š”๋ฐ ์šฐ๋ฆฌ ์Šคํ‚ค๋งˆ์˜ price ์ •์˜๋ฅผ ๋ชจ๋ฅธ๋‹ค. ์ด๋Ÿฐ ํ˜•์‹ยท์ •์˜ ๊ณ ์ •์ด LoRA๊ฐ€ ๊ฐ€์žฅ ์ž˜ ํ•ด๊ฒฐํ•˜๋Š” ์ข…๋ฅ˜์˜ ๋ฌธ์ œ๋‹ค. ๋ฐ˜๋Œ€๋กœ OCR ์ž์ฒด๋ฅผ ๋ชป ์ฝ๋Š” ๋ฌธ์ œ๋ผ๋ฉด ํŒŒ์ธํŠœ๋‹๋ณด๋‹ค ํ•ด์ƒ๋„/์ „์ฒ˜๋ฆฌ๋ฅผ ๋จผ์ € ๋ณด๋Š” ๊ฒŒ ๋งž๋‹ค.

ํ•˜๋“œ์›จ์–ด ํ˜„์‹ค ์ ๊ฒ€

์ด ๋งฅ์€ Apple M4 / ํ†ตํ•ฉ๋ฉ”๋ชจ๋ฆฌ 24GB๋‹ค.

๋Œ€์ƒ ํ™˜๊ฒฝ ํŒ์ •
qwen3-vl 8.8B CUDA 24GB+ (A10/3090/4090) ๊ถŒ์žฅ. --load-4bit QLoRA๋กœ ํŽธํ•˜๊ฒŒ ๋Œ์•„๊ฐ„๋‹ค
qwen3-vl 8.8B M4 24GB, scripts-vlm/01_train_lora.py ์Šค๋ชจํฌ ํ…Œ์ŠคํŠธ์šฉ. bf16 ๊ฐ€์ค‘์น˜๋งŒ 17.6GB, ์Šค์™‘์ด ๊ฑธ๋ ค ๋งค์šฐ ๋А๋ฆฌ๋‹ค
qwen3-vl 8.8B M4 24GB, MLX 4bit LoRA ์‹ค์‚ฌ์šฉ ๊ฐ€๋Šฅ. ์•„๋ž˜ "Apple Silicon ๋Œ€์•ˆ" ์ฐธ๊ณ 
qwen3.8 27.3B M4 24GB ๋ถˆ๊ฐ€. bf16 ๊ฐ€์ค‘์น˜๋งŒ ์•ฝ 55GB
qwen3.8 27.3B CUDA 48GB+ QLoRA ์—ฌ๊ธฐ์„œ ๋Œ๋ ค์•ผ ํ•œ๋‹ค

์ฆ‰ ์ด ๋งฅ์—์„œ๋Š” ํŒŒ์ดํ”„๋ผ์ธ ๊ฒ€์ฆ๊นŒ์ง€๋งŒ ๋กœ์ปฌ๋กœ ํ•˜๊ณ , ๋ณธ ํ•™์Šต์€ GPU ์ธ์Šคํ„ด์Šค๋‚˜ MLX๋กœ ๋Œ๋ฆฌ๋Š” ํŽธ์„ ๊ถŒํ•œ๋‹ค. scripts-llm ์ชฝ์€ --model Qwen/Qwen3-1.7B ๊ฐ™์€ ์ž‘์€ ๋ชจ๋ธ๋กœ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋จผ์ € ๊ฒ€์ฆํ•œ ๋’ค ํƒ€๊นƒ ๋ชจ๋ธ๋กœ ๋ฐ”๊พธ๋Š” ํ๋ฆ„์„ ๊ธฐ๋ณธ์œผ๋กœ ์žก์•˜๋‹ค.

์„ค์น˜

python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt

CUDA์—์„œ QLoRA๋ฅผ ์“ธ ๊ฑฐ๋ฉด pip install bitsandbytes ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค(macOS์—์„œ๋Š” ์„ค์น˜ํ•˜์ง€ ๋ง ๊ฒƒ).

1. ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ (scripts-vlm)

python scripts-vlm/00_make_dataset.py --n-train 80 --n-valid 12

data/images/*.png(ํ•ฉ์„ฑ ์˜์ˆ˜์ฆ)์™€ data/train.jsonl / data/valid.jsonl์ด ์ƒ๊ธด๋‹ค. JSONL ํ•œ ์ค„ ํ˜•์‹:

{"images": ["data/images/train_000.png"],
 "messages": [{"role": "user", "content": "์ด ์˜์ˆ˜์ฆ ์ด๋ฏธ์ง€๋ฅผ ์ฝ๊ณ  ... JSON๋งŒ ์ถœ๋ ฅํ•ด๋ผ ..."},
              {"role": "assistant", "content": "{\"store\":\"์ฒญ๊ณผ๋งˆ์„ ๋ถ„๋‹น์ \",\"date\":\"2026-01-01\",...}"}]}

์ž๊ธฐ ๋ฐ์ดํ„ฐ๋กœ ๋ฐ”๊ฟ€ ๋•Œ๋Š” ์ด ์Šคํ‚ค๋งˆ๋งŒ ๋งž์ถ”๋ฉด ๋‚˜๋จธ์ง€ ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ทธ๋Œ€๋กœ ์“ธ ์ˆ˜ ์žˆ๋‹ค. 00_make_dataset.py๋ฅผ ๋ณ€ํ™˜๊ธฐ๋กœ ๊ต์ฒดํ•˜๋ฉด ๋œ๋‹ค. ์‹ค๋ฌด์—์„œ ์ค‘์š”ํ•œ ๋‘ ๊ฐ€์ง€:

  • ์ง€์‹œ๋ฌธ(INSTRUCTION)์„ ํ•™์Šตยท์ถ”๋ก ์—์„œ ๋ฌธ์ž ๋‹จ์œ„๋กœ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•œ๋‹ค. ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉด ํ•™์Šต ํšจ๊ณผ๊ฐ€ ์ƒ๋‹น ๋ถ€๋ถ„ ๋‚ ์•„๊ฐ„๋‹ค. Modelfile์˜ SYSTEM์„ ๊ธธ๊ฒŒ ์“ฐ๋ฉด ์ด๊ฒŒ ๊นจ์ง€๋ฏ€๋กœ ์งง๊ฒŒ ๋‘๊ฑฐ๋‚˜ ๋น„์šด๋‹ค.
  • ๋ผ๋ฒจ์€ ๊ณต๋ฐฑ ์—†๋Š” compact JSON์œผ๋กœ ๊ณ ์ •ํ•œ๋‹ค. ํ˜•์‹์ด ํ”๋“ค๋ฆฌ๋ฉด ๋ชจ๋ธ๋„ ํ”๋“ค๋ฆฐ๋‹ค.

์‹ค์ œ ๋ฐ์ดํ„ฐ ๊ทœ๋ชจ๋Š” ์ตœ์†Œ ์ˆ˜๋ฐฑ~์ˆ˜์ฒœ ์ƒ˜ํ”Œ์„ ๋ณด์ž. 80๊ฐœ๋Š” ํŒŒ์ดํ”„๋ผ์ธ ํ™•์ธ์šฉ์ด๋‹ค.

2. LoRA ํ•™์Šต (scripts-vlm)

# CUDA (๊ถŒ์žฅ)
python scripts-vlm/01_train_lora.py --load-4bit --epochs 3 --grad-accum 8 --grad-ckpt

# macOS ์Šค๋ชจํฌ ํ…Œ์ŠคํŠธ (ํŒŒ์ดํ”„๋ผ์ธ ๊ฒ€์ฆ๋งŒ; 4์ƒ˜ํ”Œ 1์—ํญ)
PYTORCH_ENABLE_MPS_FALLBACK=1 python scripts-vlm/01_train_lora.py \
    --max-samples 4 --epochs 1 --max-image-side 448 --grad-ckpt

์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•˜๋Š” ์ผ ์ค‘ ๋ˆˆ์—ฌ๊ฒจ๋ณผ ๋ถ€๋ถ„:

  • ๋ผ๋ฒจ ๋งˆ์Šคํ‚น: ํ”„๋กฌํ”„ํŠธ ๊ตฌ๊ฐ„์€ -100์œผ๋กœ ๋ฎ๊ณ  assistant ์‘๋‹ต์—๋งŒ loss๋ฅผ ๊ฑด๋‹ค. ํ”„๋กฌํ”„ํŠธ ๊ธธ์ด๋ฅผ ์žด ๋•Œ ๊ฐ™์€ ์ด๋ฏธ์ง€๋กœ ํ•œ ๋ฒˆ ๋” ์ธ์ฝ”๋”ฉํ•œ๋‹ค โ€” Qwen-VL์€ ์ด๋ฏธ์ง€ ๊ทธ๋ฆฌ๋“œ ํฌ๊ธฐ์— ๋”ฐ๋ผ image_pad ํ† ํฐ ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ํ…์ŠคํŠธ๋งŒ์œผ๋กœ ์„ธ๋ฉด ์–ด๊ธ‹๋‚œ๋‹ค.
  • ๋น„์ „ ํƒ€์›Œ ๋™๊ฒฐ: LoRA target์€ q/k/v/o_proj, gate/up/down_proj๋ฟ์ด๋‹ค. Qwen3-VL ๋น„์ „ ํƒ€์›Œ๋Š” qkv/proj/linear_fc1/linear_fc2 ์ด๋ฆ„์„ ์“ฐ๋ฏ€๋กœ ์—ฌ๊ธฐ์— ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ํ•™์Šต ์‹œ์ž‘ ์‹œ vision tower touched: 0์ด ์ฐํžˆ๋Š”์ง€ ํ™•์ธํ•˜์ž. ์†Œ๋Ÿ‰ ๋ฐ์ดํ„ฐ์—์„œ ๋น„์ „ ์ชฝ์„ ๊ฐ™์ด ํ”๋“ค๋ฉด ๋ชจ๋ธ์ด ์‰ฝ๊ฒŒ ๋ง๊ฐ€์ง„๋‹ค.
  • ์ด๋ฏธ์ง€ ํ•ด์ƒ๋„ ์ƒํ•œ(--max-image-side, --max-pixels): VL ํ•™์Šต์—์„œ OOM์˜ ์ฃผ๋ฒ”์€ ์‹œํ€€์Šค ๊ธธ์ด๊ฐ€ ์•„๋‹ˆ๋ผ ์ด๋ฏธ์ง€ ํ† ํฐ ์ˆ˜๋‹ค. ์—ฌ๊ธฐ์„œ ๋จผ์ € ์ค„์ธ๋‹ค. min_pixels ํ•˜ํ•œ๋„ ๊ฐ™์ด ๋‚ฎ์ถฐ ๋’€๋‹ค โ€” ํ”ํžˆ ์“ฐ๋Š” 256*28*28(=200704)์„ ๊ทธ๋Œ€๋กœ ๋‘๋ฉด --max-image-side 448๋กœ ์ค„์ธ ์ด๋ฏธ์ง€(์•ฝ 168k ํ”ฝ์…€)๋ฅผ ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋˜๋ ˆ ์—…์Šค์ผ€์ผํ•ด์„œ ์ ˆ๊ฐ์ด ์‚ฌ๋ผ์ง„๋‹ค.
  • ์ž์ฒด ๊ฒ€์ฆ ์žฅ์น˜: ์ฒซ ์ƒ˜ํ”Œ์—์„œ ํ•™์Šต ๋Œ€์ƒ ๊ตฌ๊ฐ„์„ ์‹ค์ œ๋กœ ๋””์ฝ”๋”ฉํ•ด ์ •๋‹ต ๋ฌธ์ž์—ด๋กœ ์‹œ์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค([mask] ๊ฒ€์ฆ ํ†ต๊ณผ ๋กœ๊ทธ). ์ฑ„ํŒ… ํ…œํ”Œ๋ฆฟ์ด ๋ฐ”๋€Œ์–ด ๋งˆ์Šคํ‚น ๊ฒฝ๊ณ„๊ฐ€ ๋ฐ€๋ฆฌ๋Š” ์‚ฌ๊ณ ๋ฅผ ํ•™์Šต ์‹œ์ž‘ ์งํ›„์— ์žก๋Š”๋‹ค.

๊ฒฐ๊ณผ: out/lora-receipt/ (์–ด๋Œ‘ํ„ฐ + ํ”„๋กœ์„ธ์„œ ์„ค์ •).

3. ๋ณ€ํ™˜ ์ „์— ํšจ๊ณผ ํ™•์ธ (scripts-vlm)

GGUF ๋ณ€ํ™˜์€ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฏ€๋กœ ๋จผ์ € ํ•™์Šต์ด ๋จน์—ˆ๋Š”์ง€ ๋ณธ๋‹ค.

python scripts-vlm/02_infer_test.py --no-adapter               # ํ•™์Šต ์ „ baseline
python scripts-vlm/02_infer_test.py --adapter out/lora-receipt # ํ•™์Šต ํ›„

ํ•„๋“œ๋ณ„(store/date/total/items) ์ผ์น˜์œจ์ด ์ฐํžŒ๋‹ค. baseline๋ณด๋‹ค ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š์œผ๋ฉด GGUF๋กœ ๋„˜์–ด๊ฐ€์ง€ ๋ง๊ณ  ๋ฐ์ดํ„ฐ/์—ํญ/LR์„ ์†๋ณด๋Š” ๊ฒŒ ๋งž๋‹ค.

4. ๋ณ‘ํ•ฉ โ†’ GGUF โ†’ Ollama ๋“ฑ๋ก (scripts-vlm)

python scripts-vlm/03_merge_lora.py --adapter out/lora-receipt --output out/merged
./scripts-vlm/04_export_gguf.sh out/merged qwen3vl-receipt Q4_K_M

04_export_gguf.sh๋Š” llama.cpp๋ฅผ vendor/์— cloneํ•˜๊ณ  llama-quantize๋ฅผ ๋นŒ๋“œํ•œ ๋’ค:

  1. convert_hf_to_gguf.py โ†’ ์–ธ์–ด๋ชจ๋ธ f16 GGUF
  2. convert_hf_to_gguf.py --mmproj โ†’ ๋น„์ „ ํ”„๋กœ์ ํ„ฐ GGUF
  3. llama-quantize โ†’ Q4_K_M
  4. Modelfile ์ž‘์„ฑ ํ›„ ollama create

์ƒ์„ฑ๋˜๋Š” Modelfile:

FROM ./qwen3vl-receipt-Q4_K_M.gguf
FROM ./qwen3vl-receipt-mmproj-f16.gguf
SYSTEM """๋„ˆ๋Š” ์˜์ˆ˜์ฆ ์ด๋ฏธ์ง€์—์„œ ๊ตฌ์กฐํ™”๋œ JSON์„ ์ถ”์ถœํ•˜๋Š” ๋„๊ตฌ๋‹ค. JSON๋งŒ ์ถœ๋ ฅํ•œ๋‹ค."""
PARAMETER temperature 0

VL ๋ชจ๋ธ์€ ํ”„๋กœ์ ํ„ฐ GGUF๋ฅผ ๋นผ๋จน์œผ๋ฉด ์ด๋ฏธ์ง€ ์ž…๋ ฅ์ด ์ฃฝ๋Š”๋‹ค. ๋‘ FROM์ด ๋ชจ๋‘ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋””์Šคํฌ๋Š” ๋ณ‘ํ•ฉ๋ณธ 17GB + f16 GGUF 17GB + ์–‘์žํ™”๋ณธ 6GB๋กœ 40GB ์ด์ƒ ํ•„์š”ํ•˜๋‹ค.

Qwen3-VL์˜ GGUF ๋ณ€ํ™˜(ํŠนํžˆ --mmproj)์€ llama.cpp ์ตœ์‹  ๋นŒ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์Šคํฌ๋ฆฝํŠธ๊ฐ€ --depth 1๋กœ ์ตœ์‹ ์„ cloneํ•˜์ง€๋งŒ, ๋ณ€ํ™˜๊ธฐ๊ฐ€ qwen3vl ์•„ํ‚คํ…์ฒ˜์—์„œ ์‹คํŒจํ•˜๋ฉด llama.cpp ์ด์Šˆ๋ฅผ ํ™•์ธํ•˜๊ณ  vendor/llama.cpp๋ฅผ git pullํ•ด์„œ ๋‹ค์‹œ ์‹œ๋„ํ•˜์ž. ๋ณ€ํ™˜ ์Šคํฌ๋ฆฝํŠธ ์˜์กด์„ฑ์€ pip install -r vendor/llama.cpp/requirements.txt.

๊ฒฝ๋Ÿ‰ ๊ฒฝ๋กœ: ์–ด๋Œ‘ํ„ฐ๋งŒ ์–น๊ธฐ

๋ณ‘ํ•ฉ/์žฌ์–‘์žํ™” ์—†์ด ์–ด๋Œ‘ํ„ฐ๋งŒ GGUF๋กœ ๋ฐ”๊ฟ” ๊ธฐ์กด qwen3-vl:8b ์œ„์— ์–น๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

./scripts-vlm/04b_export_adapter_only.sh out/lora-receipt qwen3vl-receipt-lora

์ˆ˜์‹ญ MB๋กœ ๋๋‚˜๊ณ  ๋ฒ ์ด์Šค ๋‹ค์šด๋กœ๋“œ๋„ ์žฌํ™œ์šฉ๋œ๋‹ค. ๋Œ€์‹  ์–ด๋Œ‘ํ„ฐ GGUF ์ง€์›์€ ๋ฒ„์ „์— ๋ฏผ๊ฐํ•˜๊ณ (VL ์•„ํ‚คํ…์ฒ˜๋Š” ํŠนํžˆ), ์–‘์žํ™”๋œ ๋ฒ ์ด์Šค ์œ„์— ์–นํžˆ๋ฏ€๋กœ ํ’ˆ์งˆ์ด ์กฐ๊ธˆ ๋–จ์–ด์ง„๋‹ค. ์‹คํŒจํ•˜๋ฉด ์œ„์˜ ์ „์ฒด ๋ณ‘ํ•ฉ ๊ฒฝ๋กœ๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค.

5. Ollama์—์„œ ๊ฒ€์ฆ (scripts-vlm)

python scripts-vlm/05_test_ollama.py --model qwen3vl-receipt
python scripts-vlm/05_test_ollama.py --model qwen3-vl:8b      # ํŒŒ์ธํŠœ๋‹ ์ „๊ณผ ๋น„๊ต

/api/chat์— base64 ์ด๋ฏธ์ง€๋ฅผ ๋„ฃ์–ด ํ•„๋“œ๋ณ„ ์ผ์น˜์œจ๊ณผ exact match๋ฅผ ์„ผ๋‹ค. ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์“ด๋‹ค. done_reason=length๋กœ ๋‹ต์ด ์ž˜๋ฆฌ๋ฉด ๊ฒฝ๊ณ ๋ฅผ ์ฐ์œผ๋ฏ€๋กœ, ๊ทธ๋•Œ๋Š” --num-predict๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ๋œ๋‹ค(Thinking ๋ณ€์ข… ๋ฒ ์ด์Šค๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋•Œ ์ž์ฃผ ๊ฑธ๋ฆฐ๋‹ค).

scripts-llm: ํ…์ŠคํŠธ LLM ํŒŒ์ธํŠœ๋‹ (qwen3.8)

๋จผ์ €: qwen3.8:latest ๋Š” "ํ…์ŠคํŠธ ์ „์šฉ LLM"์ด ์•„๋‹ˆ๋‹ค

ollama show qwen3.8:latest ์‹ค์ธก:

architecture  qwen35        parameters  27.3B      quantization  Q4_K_M (17GB)
capabilities  completion, vision, tools, thinking
Projector     clip, 460.73M params      RENDERER qwen3.8 / PARSER qwen3.5

vision ๋Šฅ๋ ฅ๊ณผ CLIP ํ”„๋กœ์ ํ„ฐ(460M)๊ฐ€ ๋ถ™์–ด ์žˆ๋Š” ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ๋ชจ๋ธ์ด๊ณ , ํฌ๊ธฐ๋Š” 27.3B๋‹ค. ๊ทธ๋ž˜์„œ ๋‘ ๊ฐ€์ง€๋ฅผ ๊ฐ์•ˆํ•ด์•ผ ํ•œ๋‹ค:

  1. ์ด ๊ฒฝ๋กœ๋Š” "์–ธ์–ด ํƒ€์›Œ๋งŒ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ํŠœ๋‹"ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋น„์ „ ํƒ€์›Œ๋Š” ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ด๋ฏธ์ง€ ๋Šฅ๋ ฅ์„ ์œ ์ง€ํ•˜๋ ค๋ฉด ๋‚ด๋ณด๋‚ผ ๋•Œ mmproj๋ฅผ ํ•จ๊ป˜ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค(โ†’ scripts-vlm/04_export_gguf.sh ์‚ฌ์šฉ). scripts-llm/04_export_gguf.sh ๋Š” ํ…์ŠคํŠธ ์ „์šฉ ์‚ฐ์ถœ๋ฌผ๋งŒ ๋งŒ๋“ ๋‹ค.
  2. 27.3B๋Š” ์ด ๋งฅ(24GB)์—์„œ ํ•™์Šต ๋ถˆ๊ฐ€๋‹ค. bf16 ๊ฐ€์ค‘์น˜๋งŒ ์•ฝ 55GB๋‹ค. CUDA 48GB๊ธ‰ ์—์„œ QLoRA๋กœ ๋Œ๋ ค์•ผ ํ•œ๋‹ค.

๋˜ architecture qwen35 ๋Š” Qwen3.5 ๊ณ„์—ด์ธ๋ฐ, ์ด์— ๋Œ€์‘ํ•˜๋Š” HF ์›๋ณธ repo ์ด๋ฆ„์„ ์ด ์ €์žฅ์†Œ์—์„œ ํ™•์ •ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ --model ์„ ์ธ์ž๋กœ ๋บ๊ณ  ๊ธฐ๋ณธ๊ฐ’์€ ๊ฒ€์ฆํ•˜๊ธฐ ์‰ฌ์šด Qwen/Qwen3-1.7B ๋กœ ๋’€๋‹ค. ์‹ค์ œ ํƒ€๊นƒ์œผ๋กœ ๋Œ๋ฆด ๋•Œ๋Š” HF์—์„œ ํ•ด๋‹น ๋ชจ๋ธ์˜ repo id๋ฅผ ํ™•์ธํ•ด --model ๋กœ ๋„˜๊ฒจ์•ผ ํ•œ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ ์ž์ฒด๋Š” ๋ชจ๋ธ์— ๋ฌด๊ด€ํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

ํƒœ์Šคํฌ์™€ ๋ฐ์ดํ„ฐ

๊ณ ๊ฐ ์ง€์› ํ‹ฐ์ผ“ ๋ณธ๋ฌธ โ†’ ๋ผ์šฐํŒ… JSON:

{"messages": [
  {"role": "user", "content": "๋‹ค์Œ ๊ณ ๊ฐ ๋ฌธ์˜๋ฅผ ์ฝ๊ณ  ... JSON๋งŒ ์ถœ๋ ฅํ•ด๋ผ ...\n\n๋ฌธ์˜:\n๋ฌธ์˜๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ฃผ๋ฌธ๋ฒˆํ˜ธ 872246. ์นด๋“œ๋กœ ๊ฒฐ์ œํ–ˆ๋Š”๋ฐ ๋‘ ๋ฒˆ ์ฒญ๊ตฌ๋์Šต๋‹ˆ๋‹ค. ํ”ผํ•ด๊ฐ€ ๊ณ„์† ์ปค์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ์ œ ์ทจ์†Œ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค."},
  {"role": "assistant", "content": "{\"category\":\"๊ฒฐ์ œ\",\"priority\":\"P1\",\"team\":\"billing\",\"refund_requested\":true}"}]}

์ด๋ฏธ์ง€๊ฐ€ ์—†์œผ๋ฏ€๋กœ images ํ‚ค๊ฐ€ ์—†๋‹ค. ์ƒ์„ฑ๊ธฐ๋Š” ๋ผ๋ฒจ์ด ๋ณธ๋ฌธ์—์„œ ์‹ค์ œ๋กœ ์ถ”๋ก  ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ทœ์น™ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ ๋‹ค(์‹ฌ๊ฐ๋„ ํ‘œํ˜„ โ†’ priority, ์ฆ์ƒ ๋ฌธ์žฅ โ†’ category, ํ™˜๋ถˆ ๋ฌธ๊ตฌ โ†’ refund_requested). ๋ผ๋ฒจ์ด ๋ณธ๋ฌธ๊ณผ ๋ฌด๊ด€ํ•œ ๋‚œ์ˆ˜๋ฉด ๋ชจ๋ธ์€ ์•„๋ฌด๊ฒƒ๋„ ๋ฐฐ์šฐ์ง€ ๋ชปํ•˜๋Š”๋ฐ loss๋Š” ๋–จ์–ด์ง€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค โ€” ํ•ฉ์„ฑ ๋ฐ์ดํ„ฐ์˜ ๊ฐ€์žฅ ํ”ํ•œ ํ•จ์ •์ด๋‹ค. train/valid ๋ณธ๋ฌธ ์ค‘๋ณต(๋ฐ์ดํ„ฐ ๋ˆ„์ˆ˜)๋„ ์ƒ์„ฑ ์‹œ ์ฐจ๋‹จํ•œ๋‹ค.

python scripts-llm/00_make_dataset.py --n-train 300 --n-valid 40

์‹ค์ธก ๋ถ„ํฌ: category 5์ข… 53~65๊ฐœ์”ฉ, priority P1/P2/P3 92/107/101, ํ™˜๋ถˆ ์š”์ฒญ 114/300, trainโ†”valid ์ค‘๋ณต 0๊ฑด.

ํ•™์Šต โ†’ ๊ฒ€์ฆ โ†’ ๋“ฑ๋ก

# ํŒŒ์ดํ”„๋ผ์ธ ๊ฒ€์ฆ (์ž‘์€ ๋ชจ๋ธ๋กœ ๋น ๋ฅด๊ฒŒ)
python scripts-llm/01_train_lora.py --model Qwen/Qwen3-1.7B --epochs 1

# ์‹ค์ œ ํƒ€๊นƒ (CUDA 48GB+ ๊ถŒ์žฅ)
python scripts-llm/01_train_lora.py --model <qwen3.5-27b HF repo> --load-4bit --grad-ckpt

python scripts-llm/02_infer_test.py --no-adapter            # baseline
python scripts-llm/02_infer_test.py --adapter out/lora-ticket

python scripts-llm/03_merge_lora.py --output out/merged-llm
./scripts-llm/04_export_gguf.sh out/merged-llm qwen-ticket Q4_K_M
python scripts-llm/05_test_ollama.py --model qwen-ticket
python scripts-llm/05_test_ollama.py --model qwen3.8:latest  # ํŒŒ์ธํŠœ๋‹ ์ „๊ณผ ๋น„๊ต

scripts-vlm ๋Œ€๋น„ ๋‹ค๋ฅธ ์ ๋งŒ ์ •๋ฆฌํ•˜๋ฉด:

  • ํ”„๋กœ์„ธ์„œ ๋Œ€์‹  ํ† ํฌ๋‚˜์ด์ €๋งŒ ์“ด๋‹ค. ์ด๋ฏธ์ง€ ํ”ฝ์…€ ์ƒํ•œ ๊ฐ™์€ ๊ณ ๋ฏผ์ด ์—†๋‹ค.
  • enable_thinking=False: Qwen3 ๊ณ„์—ด ์ฑ„ํŒ… ํ…œํ”Œ๋ฆฟ์€ ์ด ์ธ์ž๋ฅผ ๋ฐ›๋Š”๋‹ค. ๊ตฌ์กฐํ™” JSON ์ถœ๋ ฅ์— ์ถ”๋ก  ๋ธ”๋ก์€ ๋ฐฉํ•ด๋งŒ ๋˜๋ฏ€๋กœ ํ•™์Šตยท์ถ”๋ก  ์–‘์ชฝ์—์„œ ๋ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์ด ์ด ์ธ์ž๋ฅผ ๋ชจ๋ฅด๋ฉด TypeError๊ฐ€ ๋‚˜๋ฏ€๋กœ ๋นผ๊ณ  ์žฌ์‹œ๋„ํ•˜๊ฒŒ ํ•ด๋’€๋‹ค.
  • --max-len ์ดˆ๊ณผ ์ž˜๋ฆผ ์นด์šดํŠธ: ๋‹ต์ด ์ž˜๋ฆฌ๋ฉด ํ˜•์‹ ํ•™์Šต์ด ๋ง๊ฐ€์ง€๋Š”๋ฐ ์กฐ์šฉํžˆ ์ง„ํ–‰๋˜๊ธฐ ์‰ฝ๋‹ค. ํ•™์Šต ๋์— ์ž˜๋ฆฐ ์ƒ˜ํ”Œ ์ˆ˜๋ฅผ ๊ฒฝ๊ณ ๋กœ ์ฐ๋Š”๋‹ค.
  • ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ๋ฒ ์ด์Šค๋ฅผ ์“ธ ๊ฒฝ์šฐ [lora] vision/projector touched: 0 ๋กœ๊ทธ๋กœ ๋น„์ „ ํƒ€์›Œ์— LoRA๊ฐ€ ์•ˆ ๋ถ™์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  • 03_merge_lora.py๋Š” AutoModelForCausalLM์œผ๋กœ ๋กœ๋“œํ•˜๋ฏ€๋กœ ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ๋ฒ ์ด์Šค์—์„œ๋Š” ๋น„์ „ ํƒ€์›Œ๊ฐ€ ๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฏธ์ง€ ๋Šฅ๋ ฅ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฉด scripts-vlm/03_merge_lora.py(AutoModelForImageTextToText)๋กœ ๋ณ‘ํ•ฉํ•˜์ž.

Apple Silicon ๋Œ€์•ˆ (MLX)

24GB ๋งฅ์—์„œ 8B๋ฅผ ์‹ค์ œ๋กœ ํ•™์Šต์‹œํ‚ค๋ ค๋ฉด 4bit ์–‘์žํ™” ๋ชจ๋ธ์— LoRA๋ฅผ ๋ถ™์ด๋Š” MLX ๊ฒฝ๋กœ๊ฐ€ ํ˜„์‹ค์ ์ด๋‹ค.

pip install mlx-vlm
python -m mlx_vlm.lora --help        # ๋ฒ„์ „๋ณ„๋กœ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋‹ฌ๋ผ ๋จผ์ € ํ™•์ธํ•  ๊ฒƒ

๋ฐ์ดํ„ฐ๋Š” ์ด ์ €์žฅ์†Œ์˜ data/train.jsonl๊ณผ ๊ฐ™์€ {"images": [...], "messages": [...]} ํ˜•์‹์„ ๊ทธ๋Œ€๋กœ ์“ด๋‹ค. ๋‹ค๋งŒ mlx-vlm์˜ LoRA CLI๋Š” ๋ฆด๋ฆฌ์Šค๋งˆ๋‹ค ์ธ์ž๊ฐ€ ๋ฐ”๋€Œ๋ฏ€๋กœ, ์ •ํ™•ํ•œ ํ”Œ๋ž˜๊ทธ๋Š” --help๋กœ ํ™•์ธํ•˜๊ณ  ์“ฐ๋Š” ํŽธ์ด ์•ˆ์ „ํ•˜๋‹ค. ํ•™์Šต๋œ MLX ์–ด๋Œ‘ํ„ฐ๋Š” MLX ๋Ÿฐํƒ€์ž„์—์„œ ๋ฐ”๋กœ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Ollama(GGUF)๋กœ๋Š” ์ง์ ‘ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค. Ollama์— ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ๋ผ๋ฉด ํ•™์Šต์€ transformers/peft ๊ฒฝ๋กœ๋กœ ํ•˜๊ณ , GPU ์ธ์Šคํ„ด์Šค๋ฅผ ๋นŒ๋ฆฌ๋Š” ์ชฝ์ด ๋‹จ์ˆœํ•˜๋‹ค.

ํŒŒ์ผ ๊ตฌ์„ฑ

ํŒŒ์ผ ์—ญํ• 
scripts-vlm/00_make_dataset.py ํ•ฉ์„ฑ ์˜์ˆ˜์ฆ ์ด๋ฏธ์ง€ + JSONL ๋ผ๋ฒจ ์ƒ์„ฑ
scripts-vlm/01_train_lora.py LoRA ํ•™์Šต (๋ผ๋ฒจ ๋งˆ์Šคํ‚น, ๋น„์ „ ๋™๊ฒฐ, QLoRA ์˜ต์…˜)
scripts-vlm/02_infer_test.py ํ•™์Šต ์ „/ํ›„ ํ•„๋“œ ์ผ์น˜์œจ ๋น„๊ต
scripts-vlm/03_merge_lora.py ์–ด๋Œ‘ํ„ฐ๋ฅผ fp16 ๋ฒ ์ด์Šค์— ๋ณ‘ํ•ฉ
scripts-vlm/04_export_gguf.sh GGUF ๋ณ€ํ™˜(+mmproj) โ†’ ์–‘์žํ™” โ†’ ollama create
scripts-vlm/04b_export_adapter_only.sh ์–ด๋Œ‘ํ„ฐ๋งŒ GGUF๋กœ ๋งŒ๋“ค์–ด ๊ธฐ์กด ๋ฒ ์ด์Šค์— ์–น๊ธฐ
scripts-vlm/05_test_ollama.py Ollama REST๋กœ ์ตœ์ข… ๊ฒ€์ฆ
ํŒŒ์ผ ์—ญํ• 
scripts-llm/00_make_dataset.py ํ•ฉ์„ฑ ๊ณ ๊ฐ ํ‹ฐ์ผ“ + ๋ผ์šฐํŒ… JSON ๋ผ๋ฒจ ์ƒ์„ฑ (ํ…์ŠคํŠธ)
scripts-llm/01_train_lora.py ํ…์ŠคํŠธ SFT LoRA (๋ผ๋ฒจ ๋งˆ์Šคํ‚น, enable_thinking=False)
scripts-llm/02_infer_test.py ํ•™์Šต ์ „/ํ›„ ํ•„๋“œ ์ผ์น˜์œจ ๋น„๊ต
scripts-llm/03_merge_lora.py ์–ด๋Œ‘ํ„ฐ ๋ณ‘ํ•ฉ (CausalLM)
scripts-llm/04_export_gguf.sh GGUF ๋ณ€ํ™˜ โ†’ ์–‘์žํ™” โ†’ ollama create (mmproj ์—†์Œ)
scripts-llm/05_test_ollama.py Ollama REST๋กœ ์ตœ์ข… ๊ฒ€์ฆ

์ž์ฃผ ๊ฑธ๋ฆฌ๋Š” ๋ฌธ์ œ

  • loss๊ฐ€ 0 ๋˜๋Š” nan โ€” ๋ผ๋ฒจ์ด ์ „๋ถ€ -100์ด ๋œ ๊ฒฝ์šฐ๋‹ค. ์ฑ„ํŒ… ํ…œํ”Œ๋ฆฟ์ด ๋ฐ”๋€Œ์–ด ํ”„๋กฌํ”„ํŠธ ๊ธธ์ด ๊ณ„์‚ฐ์ด ์ „์ฒด ๊ธธ์ด์™€ ๊ฐ™์•„์กŒ์„ ์ˆ˜ ์žˆ๋‹ค. labels != -100์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฐ์–ด๋ณด์ž.
  • MPS OOM / ์Šค์™‘ ํญ์ฃผ โ€” --max-image-side 448 --max-pixels 200704 --grad-ckpt, --batch-size 1. ๊ทธ๋ž˜๋„ ์•ˆ ๋˜๋ฉด MLX ๊ฒฝ๋กœ๋‚˜ CUDA๋กœ ๊ฐ„๋‹ค.
  • vision tower touched๊ฐ€ 0์ด ์•„๋‹˜ โ€” transformers ๋ฒ„์ „์ด ๋ฐ”๋€Œ์–ด ๋ชจ๋“ˆ ์ด๋ฆ„์ด ๋‹ฌ๋ผ์ง„ ๊ฒƒ์ด๋‹ค. target_modules๋ฅผ ์–ธ์–ด๋ชจ๋ธ ๊ฒฝ๋กœ ์ •๊ทœ์‹์œผ๋กœ ์ขํ˜€์•ผ ํ•œ๋‹ค.
  • Ollama์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๋ชป ๋ฐ›์Œ โ€” Modelfile์— mmproj FROM์ด ๋น ์กŒ๋‹ค.
  • ์ถœ๋ ฅ์ด JSON์ด ์•„๋‹ˆ๊ณ  ์žก๋ง์ด ์„ž์ž„ โ€” Modelfile SYSTEM์ด ํ•™์Šต ์‹œ ํ”„๋กฌํ”„ํŠธ์™€ ์ถฉ๋Œํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. SYSTEM์„ ๋น„์šฐ๊ณ  ํ•™์Šต ๋•Œ ์“ด INSTRUCTION์„ ๊ทธ๋Œ€๋กœ ๋„ฃ์–ด๋ณด์ž.

About

Step-by-step tutorial and practical code examples for fine-tuning LLMs using LoRA, QLoRA, and Unsloth / Hugging Face SFTTrainer.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages