Spaces:
gijl
/
No application file

File size: 5,091 Bytes
34c7351
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/bin/bash
set -e

# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
# ุงู„ู‚ูŠู… ุชุฃุชูŠ ู…ู† ู…ุชุบูŠุฑุงุช ุงู„ุจูŠุฆุฉ ุงู„ู…ุนุฑู‘ูุฉ ููŠ Dockerfile (ุฃูˆ ู…ู† HF Spaces Secrets)
# ูŠู…ูƒู†ูƒ ุชุฌุงูˆุฒู‡ุง ููŠ ูˆุงุฌู‡ุฉ HF Spaces ุชุญุช ู‚ุณู… "Repository secrets" ุฏูˆู† ุชุนุฏูŠู„ ุงู„ูƒูˆุฏ
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
MODELS_DIR="/data/models"
MODEL_PATH="$MODELS_DIR/$HF_FILE"

# โ”€โ”€ ุงู„ุชุญู‚ู‚ ู…ู† ุงู„ู…ุชุบูŠุฑุงุช ุงู„ุฃุณุงุณูŠุฉ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
if [ -z "$HF_REPO" ] || [ -z "$HF_FILE" ] || [ -z "$MODEL_NAME" ]; then
    echo "ERROR: HF_REPO, HF_FILE, and MODEL_NAME must all be set."
    exit 1
fi

echo "โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•"
echo "  Repo  : $HF_REPO"
echo "  File  : $HF_FILE"
echo "  Name  : $MODEL_NAME"
echo "โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•"

# ุฅู†ุดุงุก ุงู„ู…ุฌู„ุฏุงุช ุงู„ู…ุทู„ูˆุจุฉ
mkdir -p "$MODELS_DIR" /data/ollama /data/webui

# โ”€โ”€ ุชุญู…ูŠู„ ุงู„ู…ู„ู ู…ู† Hugging Face (ูŠุชุฎุทู‰ ุงู„ุชุญู…ูŠู„ ุฅู† ูƒุงู† ุงู„ู…ู„ู ู…ูˆุฌูˆุฏุงู‹ ุจุงู„ูุนู„) โ”€โ”€
if [ -f "$MODEL_PATH" ]; then
    echo "Model file already exists at $MODEL_PATH โ€” skipping download."
else
    echo "Downloading $HF_FILE from $HF_REPO ..."

    # ุชู…ุฑูŠุฑ ุงู„ุชูˆูƒู† ูู‚ุท ุฅู† ูƒุงู† ู…ุถุจูˆุทุงู‹ (ู„ู„ู†ู…ุงุฐุฌ ุงู„ู…ุญู…ูŠุฉ)
    HF_CLI_ARGS="--repo-type model --local-dir $MODELS_DIR"
    if [ -n "$HF_TOKEN" ]; then
        HF_CLI_ARGS="$HF_CLI_ARGS --token $HF_TOKEN"
    fi

    huggingface-cli download "$HF_REPO" "$HF_FILE" $HF_CLI_ARGS

    if [ ! -f "$MODEL_PATH" ]; then
        echo "ERROR: Download finished but file not found at $MODEL_PATH"
        exit 1
    fi
    echo "Download complete: $MODEL_PATH"
fi

# โ”€โ”€ ุชุดุบูŠู„ ุฎุงุฏู… Ollama ููŠ ุงู„ุฎู„ููŠุฉ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
echo "Starting Ollama server..."
OLLAMA_MODELS=/data/ollama ollama serve &

# โ”€โ”€ ุงู†ุชุธุงุฑ ุญุชู‰ ูŠูƒูˆู† Ollama ุฌุงู‡ุฒุงู‹ ูุนู„ุงู‹ (ุจุฏู„ุงู‹ ู…ู† sleep ุซุงุจุช) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
echo "Waiting for Ollama to be ready..."
MAX_WAIT=60
WAITED=0
until curl -s http://localhost:11434/api/tags > /dev/null 2>&1; do
    if [ "$WAITED" -ge "$MAX_WAIT" ]; then
        echo "ERROR: Ollama did not respond within ${MAX_WAIT}s."
        exit 1
    fi
    sleep 1
    WAITED=$((WAITED + 1))
done
echo "Ollama is ready (after ${WAITED}s)."

# โ”€โ”€ ุฅู†ุดุงุก Modelfile ูŠุดูŠุฑ ุฅู„ู‰ ุงู„ู…ู„ู ุงู„ู…ุญู„ูŠ ููŠ ุงู„ู…ุฎุฒู† โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
echo "Creating Modelfile..."
cat <<EOF > "$MODELS_DIR/Modelfile"
FROM $MODEL_PATH

PARAMETER num_ctx $MODEL_CTX
PARAMETER num_thread $MODEL_THREADS
EOF

# โ”€โ”€ ุชุณุฌูŠู„ ุงู„ู†ู…ูˆุฐุฌ ููŠ Ollama ุฅู† ู„ู… ูŠูƒู† ู…ุณุฌู„ุงู‹ ุจุนุฏ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
if OLLAMA_MODELS=/data/ollama ollama list | grep -q "^$MODEL_NAME"; then
    echo "Model '$MODEL_NAME' already registered โ€” skipping creation."
else
    echo "Registering model '$MODEL_NAME' in Ollama..."
    OLLAMA_MODELS=/data/ollama ollama create "$MODEL_NAME" -f "$MODELS_DIR/Modelfile"
    echo "Model registered successfully."
fi

# โ”€โ”€ ุชุญู…ูŠู„ ุงู„ู†ู…ูˆุฐุฌ ู…ุณุจู‚ุงู‹ ููŠ ุงู„ุฐุงูƒุฑุฉ (Warmup) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ู†ุฑุณู„ ุทู„ุจุงู‹ ูุงุฑุบุงู‹ ุจู€ keep_alive: -1 ููŠูุญู…ูŽู‘ู„ ุงู„ู†ู…ูˆุฐุฌ ุงู„ุขู† ูˆูŠุจู‚ู‰ ููŠ ุงู„ุฐุงูƒุฑุฉ
# ุญุชู‰ ุฅุนุงุฏุฉ ุงู„ุชุดุบูŠู„ุŒ ูู„ุง ูŠูˆุฌุฏ ุฃูŠ ุชุฃุฎูŠุฑ ุนู†ุฏ ุฃูˆู„ ุฑุณุงู„ุฉ ู…ู† ุงู„ู…ุณุชุฎุฏู…
echo "Pre-loading '$MODEL_NAME' into memory..."
curl -s -X POST http://localhost:11434/api/generate \
    -H "Content-Type: application/json" \
    -d "{\"model\": \"$MODEL_NAME\", \"prompt\": \"\", \"keep_alive\": -1}" \
    > /dev/null

if [ $? -eq 0 ]; then
    echo "Model '$MODEL_NAME' is loaded and ready in memory."
else
    echo "WARNING: Pre-load request failed. Model will load on first use instead."
fi

# โ”€โ”€ ุชุดุบูŠู„ ูˆุงุฌู‡ุฉ Open WebUI โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
echo "Starting Open WebUI..."
cd /app/backend
exec bash start.sh