frankenstallm / source /scripts /deploy_ollama.sh
pathcosmos's picture
Upload folder using huggingface_hub (#17)
48ecd01
#!/usr/bin/env bash
# =============================================================================
# deploy_ollama.sh β€” FRANKENSTALLM 3B GGUF β†’ Ollama 원클릭 배포
#
# Usage:
# bash scripts/deploy_ollama.sh # κΈ°λ³Έ (Q4_K_M)
# bash scripts/deploy_ollama.sh --quant Q8_0 # Q8_0 μ–‘μžν™”
# bash scripts/deploy_ollama.sh --skip_convert # GGUF 이미 쑴재 μ‹œ
#
# Pipeline:
# 1. [선택] GGUF λ³€ν™˜ + μ–‘μžν™” (convert_3b_gguf.sh)
# 2. Ollama μ„€μΉ˜ 확인 / μ„œλ²„ μ‹œμž‘
# 3. Modelfile.3b둜 λͺ¨λΈ 등둝
# 4. μžλ™ ν…ŒμŠ€νŠΈ (5개 ν”„λ‘¬ν”„νŠΈ)
# 5. 반볡λ₯  검증 (15개 ν”„λ‘¬ν”„νŠΈ)
# =============================================================================
set -euo pipefail
QUANT="${QUANT:-Q4_K_M}"
MODEL_NAME="frankenstallm-3b"
SKIP_CONVERT=false
while [[ $# -gt 0 ]]; do
case "$1" in
--quant) QUANT="$2"; shift 2 ;;
--skip_convert) SKIP_CONVERT=true; shift ;;
-h|--help)
grep '^#' "$0" | head -20 | sed 's/^# \{0,1\}//'
exit 0 ;;
*) echo "ERROR: μ•Œ 수 μ—†λŠ” μ˜΅μ…˜: $1"; exit 1 ;;
esac
done
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$PROJECT_DIR"
GGUF_PATH="outputs/gguf/frankenstallm-3b-${QUANT}.gguf"
MODELFILE="Modelfile.3b"
echo "=================================================================="
echo " FRANKENSTALLM 3B Ollama 배포"
echo " μ–‘μžν™” : $QUANT"
echo " GGUF : $GGUF_PATH"
echo " Modelfile: $MODELFILE"
echo "=================================================================="
# ---- Step 1: GGUF λ³€ν™˜ (ν•„μš” μ‹œ) ----
if [[ "$SKIP_CONVERT" == "false" ]]; then
if [[ ! -f "$GGUF_PATH" ]]; then
echo ""
echo "[Step 1] GGUF λ³€ν™˜ μ‹€ν–‰ 쀑 ..."
bash scripts/convert_3b_gguf.sh \
--input_dir checkpoints/korean_3b_orpo_v1/checkpoint-9840
else
echo "[Step 1] GGUF 파일 이미 쑴재 β€” λ³€ν™˜ κ±΄λ„ˆλœ€"
fi
else
echo "[Step 1] λ³€ν™˜ κ±΄λ„ˆλœ€ (--skip_convert)"
fi
if [[ ! -f "$GGUF_PATH" ]]; then
echo "ERROR: GGUF 파일 μ—†μŒ: $GGUF_PATH"
exit 1
fi
echo " GGUF 크기: $(du -sh "$GGUF_PATH" | cut -f1)"
# ---- Step 2: Ollama μ„€μΉ˜ 확인 ----
if ! command -v ollama &>/dev/null; then
echo ""
echo "[Step 2] Ollama λ―Έμ„€μΉ˜ β€” μ„€μΉ˜ 쀑 ..."
curl -fsSL https://ollama.com/install.sh | sh
fi
# Ollama μ„œλ²„ μ‹œμž‘
if ! ollama list &>/dev/null 2>&1; then
echo "[Step 2] Ollama μ„œλ²„ μ‹œμž‘ 쀑 ..."
ollama serve &>/tmp/ollama_serve.log &
for i in $(seq 1 15); do
if ollama list &>/dev/null 2>&1; then
echo " [OK] Ollama μ„œλ²„ μ€€λΉ„ (${i}초)"
break
fi
sleep 1
done
fi
# ---- Step 3: λͺ¨λΈ 등둝 ----
echo ""
echo "[Step 3] Ollama λͺ¨λΈ 등둝: $MODEL_NAME"
ollama create "$MODEL_NAME" -f "$MODELFILE"
echo " [OK] 등둝 μ™„λ£Œ"
# ---- Step 4: μžλ™ ν…ŒμŠ€νŠΈ ----
echo ""
echo "[Step 4] μžλ™ ν…ŒμŠ€νŠΈ ..."
declare -a QUICK_TESTS=(
"λŒ€ν•œλ―Όκ΅­μ˜ μˆ˜λ„λŠ”?"
"인곡지λŠ₯μ΄λž€ λ¬΄μ—‡μΈκ°€μš”?"
"ν•œκ΅­μ˜ 전톡 μŒμ‹ μ€‘μ—μ„œ κΉ€μΉ˜μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”."
)
for prompt in "${QUICK_TESTS[@]}"; do
echo " Q: $prompt"
RESP=$(timeout 60 ollama run "$MODEL_NAME" "$prompt" 2>&1 || echo "[TIMEOUT/ERROR]")
echo " A: ${RESP:0:200}"
echo ""
done
# ---- Step 5: 반볡λ₯  검증 ----
echo "[Step 5] 반볡λ₯  검증 (15개 ν”„λ‘¬ν”„νŠΈ) ..."
python3 scripts/test_ollama_repetition.py --model "$MODEL_NAME"
echo ""
echo "=================================================================="
echo " 배포 μ™„λ£Œ!"
echo " μ‚¬μš©λ²•: ollama run $MODEL_NAME"
echo "=================================================================="