frankenstallm / source /scripts /deploy_3b_ollama.sh
pathcosmos's picture
Upload folder using huggingface_hub (#17)
48ecd01
#!/usr/bin/env bash
# =============================================================================
# deploy_3b_ollama.sh โ€” 3B GGUF ๋ชจ๋ธ์„ Ollama์— ๋“ฑ๋ก & ์ž๋™ ํ…Œ์ŠคํŠธ
#
# Usage:
# bash scripts/deploy_3b_ollama.sh [model_name]
#
# model_name: Ollama ๋ชจ๋ธ ์ด๋ฆ„ (default: frankenstallm-3b)
#
# ์ „์ œ ์กฐ๊ฑด:
# - ollama ์„ค์น˜: https://ollama.com/download
# - bash scripts/convert_3b_gguf.sh ์‹คํ–‰ ์™„๋ฃŒ
# - outputs/gguf/frankenstallm-3b-Q4_K_M.gguf ์กด์žฌ
# - Modelfile.3b ์กด์žฌ
# =============================================================================
set -euo pipefail
MODEL_NAME="${1:-frankenstallm-3b}"
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
MODELFILE="$PROJECT_DIR/Modelfile.3b"
GGUF_PATH="$PROJECT_DIR/outputs/gguf/frankenstallm-3b-Q4_K_M.gguf"
cd "$PROJECT_DIR"
# ---------------------------------------------------------------------------
# Pre-flight check
# ---------------------------------------------------------------------------
if ! command -v ollama &> /dev/null; then
echo "ERROR: ollama๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค."
echo "์„ค์น˜: curl -fsSL https://ollama.com/install.sh | sh"
exit 1
fi
if [[ ! -f "$GGUF_PATH" ]]; then
echo "ERROR: GGUF ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: $GGUF_PATH"
echo "๋จผ์ € ์‹คํ–‰: bash scripts/convert_3b_gguf.sh"
exit 1
fi
if [[ ! -f "$MODELFILE" ]]; then
echo "ERROR: Modelfile.3b ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: $MODELFILE"
echo " ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— Modelfile.3b ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."
exit 1
fi
echo "=================================================================="
echo " 3B ๋ชจ๋ธ Ollama ๋ฐฐํฌ"
echo " ๋ชจ๋ธ๋ช… : $MODEL_NAME"
echo " GGUF : $(du -sh "$GGUF_PATH" | cut -f1) ($GGUF_PATH)"
echo " Modelfile: $MODELFILE"
echo "=================================================================="
echo ""
# ---------------------------------------------------------------------------
# Ollama ์„œ๋ฒ„ ์‹คํ–‰ ํ™•์ธ
# ---------------------------------------------------------------------------
if ! ollama list &>/dev/null; then
echo "[WARN] Ollama ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค ..."
ollama serve &>/tmp/ollama_serve.log &
OLLAMA_PID=$!
echo " PID: $OLLAMA_PID (๋กœ๊ทธ: /tmp/ollama_serve.log)"
# ์„œ๋ฒ„ ์ค€๋น„ ๋Œ€๊ธฐ (์ตœ๋Œ€ 15์ดˆ)
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
# ---------------------------------------------------------------------------
# Ollama ๋ชจ๋ธ ๋“ฑ๋ก
# ---------------------------------------------------------------------------
echo "[1/2] Ollama ๋ชจ๋ธ ๋“ฑ๋ก ์ค‘: $MODEL_NAME ..."
ollama create "$MODEL_NAME" -f "$MODELFILE"
echo " [OK] ๋“ฑ๋ก ์™„๋ฃŒ"
# ---------------------------------------------------------------------------
# ์ž๋™ ํ…Œ์ŠคํŠธ ํ”„๋กฌํ”„ํŠธ 5๊ฐœ ์‹คํ–‰
# ---------------------------------------------------------------------------
echo ""
echo "[2/2] ์ž๋™ ํ…Œ์ŠคํŠธ ํ”„๋กฌํ”„ํŠธ ์‹คํ–‰ (5๊ฐœ) ..."
echo ""
declare -a TEST_PROMPTS=(
"์•ˆ๋…•ํ•˜์„ธ์š”! ๊ฐ„๋‹จํžˆ ์ž๊ธฐ์†Œ๊ฐœ๋ฅผ ํ•ด์ฃผ์„ธ์š”."
"๋Œ€ํ•œ๋ฏผ๊ตญ์˜ ์ˆ˜๋„๋Š” ์–ด๋””์ธ๊ฐ€์š”? ๊ทธ ๋„์‹œ์˜ ํŠน์ง•์„ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”."
"ํŒŒ์ด์ฌ์œผ๋กœ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”."
"์ธ๊ณต์ง€๋Šฅ์ด ์‚ฌํšŒ์— ๋ฏธ์น˜๋Š” ๊ธ์ •์ ์ธ ์˜ํ–ฅ 3๊ฐ€์ง€๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”."
"์˜ค๋Š˜ ์ €๋… ๋ฉ”๋‰ด๋กœ ๋ฌด์—‡์„ ์ถ”์ฒœํ•ด์ฃผ์‹œ๊ฒ ์–ด์š”? ์ด์œ ๋„ ํ•จ๊ป˜ ๋ง์”€ํ•ด์ฃผ์„ธ์š”."
)
PASS_COUNT=0
FAIL_COUNT=0
TOTAL=${#TEST_PROMPTS[@]}
for i in "${!TEST_PROMPTS[@]}"; do
PROMPT="${TEST_PROMPTS[$i]}"
NUM=$((i + 1))
echo "--- ํ…Œ์ŠคํŠธ $NUM/$TOTAL ---"
echo "ํ”„๋กฌํ”„ํŠธ: $PROMPT"
echo ""
# ollama run: ํƒ€์ž„์•„์›ƒ 60์ดˆ, ์‘๋‹ต ์ฒซ 300์ž๋งŒ ํ‘œ์‹œ
if RESPONSE=$(timeout 60 ollama run "$MODEL_NAME" "$PROMPT" 2>&1); then
RESP_PREVIEW="${RESPONSE:0:300}"
echo "์‘๋‹ต: $RESP_PREVIEW"
if [[ ${#RESPONSE} -gt 300 ]]; then
echo " ... (์ด ${#RESPONSE}์ž)"
fi
echo "[OK] ํ…Œ์ŠคํŠธ $NUM ์„ฑ๊ณต"
PASS_COUNT=$((PASS_COUNT + 1))
else
EXIT_CODE=$?
echo "[FAIL] ํ…Œ์ŠคํŠธ $NUM ์‹คํŒจ (exit code: $EXIT_CODE)"
FAIL_COUNT=$((FAIL_COUNT + 1))
fi
echo ""
done
# ---------------------------------------------------------------------------
# ๊ฒฐ๊ณผ ์š”์•ฝ
# ---------------------------------------------------------------------------
echo "=================================================================="
echo " ๋ฐฐํฌ & ํ…Œ์ŠคํŠธ ์™„๋ฃŒ"
echo ""
echo " ๋ชจ๋ธ๋ช… : $MODEL_NAME"
echo " ํ…Œ์ŠคํŠธ : $PASS_COUNT/$TOTAL ์„ฑ๊ณต ($FAIL_COUNT ์‹คํŒจ)"
echo ""
if [[ $FAIL_COUNT -eq 0 ]]; then
echo " [PASS] ๋ชจ๋“  ํ…Œ์ŠคํŠธ ํ†ต๊ณผ"
else
echo " [WARN] ์ผ๋ถ€ ํ…Œ์ŠคํŠธ ์‹คํŒจ โ€” ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜์„ธ์š”"
fi
echo ""
echo " Ollama ์‚ฌ์šฉ๋ฒ•:"
echo " ollama run $MODEL_NAME"
echo " ollama run $MODEL_NAME '์งˆ๋ฌธ์„ ์—ฌ๊ธฐ์— ์ž…๋ ฅํ•˜์„ธ์š”'"
echo " ollama rm $MODEL_NAME (์‚ญ์ œ)"
echo ""
echo " Quality Gate:"
echo " bash scripts/quality_gate.sh deploy"
echo "=================================================================="
[[ $FAIL_COUNT -gt 0 ]] && exit 1 || exit 0