File size: 4,776 Bytes
a716923
ed62617
a716923
 
ed62617
 
 
 
 
 
 
a716923
ed62617
 
 
a716923
ed62617
 
 
 
 
 
a716923
 
ed62617
a716923
 
ed62617
a716923
 
ed62617
 
 
 
 
a716923
ed62617
a716923
 
 
 
ed62617
 
 
 
 
 
a716923
 
 
ed62617
 
a716923
ed62617
a716923
 
 
 
 
 
 
 
ed62617
 
a716923
 
ed62617
 
 
 
 
 
 
 
 
a716923
 
 
 
 
 
 
 
 
 
 
 
ed62617
 
a716923
ed62617
a716923
 
 
 
 
 
 
 
 
 
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
# ═══════════════════════════════════════════════════════════════════════════
# OMNI-NEXUS Β· Worker de chat  (reemplaza al de BitNet)
# ═══════════════════════════════════════════════════════════════════════════
#
# POR QUÉ YA NO SE USA BITNET
# ───────────────────────────
# bitnet.cpp NO incluye servidor HTTP. Su submΓ³dulo de llama.cpp solo compila
# `llama-cli`; el target `llama-server` no existe, de ahΓ­ el error
# "No rule to make target 'llama-server'" que salΓ­a siempre.
# Y `setup_env.py` morΓ­a con OOMKilled porque convierte el modelo con PyTorch
# durante el build, cosa que no cabe en la RAM del builder de HF.
#
# Esta imagen usa los binarios OFICIALES precompilados de llama.cpp β€” la misma
# receta con la que tu Space `coder` ya arranca sin problemas. Cero compilaciΓ³n
# de C++, build de 3-5 minutos en vez de 25.
#
# EL BUG DE libllama.so, RESUELTO
# ───────────────────────────────
# El zip oficial trae el binario Y sus librerΓ­as compartidas. Antes copiaba
# solo el binario y por eso fallaba con "libllama.so: cannot open shared
# object file". Ahora se copia el directorio COMPLETO y se registra con
# ldconfig.
# ═══════════════════════════════════════════════════════════════════════════

FROM python:3.11-slim AS llama

RUN apt-get update && apt-get install -y --no-install-recommends \
        wget unzip ca-certificates \
    && rm -rf /var/lib/apt/lists/*

ARG LLAMA_RELEASE="b4585"
RUN wget -q -O /tmp/l.zip \
      "https://github.com/ggml-org/llama.cpp/releases/download/${LLAMA_RELEASE}/llama-${LLAMA_RELEASE}-bin-ubuntu-x64.zip" \
    && mkdir -p /llama && unzip -q /tmp/l.zip -d /llama \
    && echo "[LLAMA] contenido descargado:" && find /llama -name "llama-server" -o -name "*.so*" | head -20

# ── Modelo ─────────────────────────────────────────────────────────────────
FROM python:3.11-slim AS fetcher

RUN pip install --no-cache-dir huggingface_hub

# Llama 3.2 3B en Q4_K_M (~2 GB). En 2 vCPU da 8-12 tok/s.
# Para mΓ‘s velocidad y menos calidad, cambia a 1B (~0.8 GB, 20-30 tok/s):
#   MODEL_REPO=bartowski/Llama-3.2-1B-Instruct-GGUF
#   MODEL_FILE=Llama-3.2-1B-Instruct-Q4_K_M.gguf
ARG MODEL_REPO="bartowski/Llama-3.2-3B-Instruct-GGUF"
ARG MODEL_FILE="Llama-3.2-3B-Instruct-Q4_K_M.gguf"
ENV MODEL_REPO=${MODEL_REPO}
ENV MODEL_FILE=${MODEL_FILE}

COPY download_model.py /tmp/download_model.py
RUN mkdir -p /models && python3 /tmp/download_model.py

# ── Runtime ────────────────────────────────────────────────────────────────
FROM python:3.11-slim AS runtime

RUN apt-get update && apt-get install -y --no-install-recommends \
        curl ca-certificates libgomp1 libstdc++6 \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

# Directorio COMPLETO, no solo el binario: asΓ­ vienen las .so que necesita.
COPY --from=llama /llama /opt/llama
COPY --from=fetcher /models /models

# Localizar el binario donde sea que estΓ© dentro del zip, enlazarlo, y
# registrar sus librerΓ­as en el linker dinΓ‘mico.
RUN BIN="$(find /opt/llama -name 'llama-server' -type f | head -1)" \
    && test -n "$BIN" || { echo "FATAL: llama-server no encontrado"; exit 1; } \
    && chmod +x "$BIN" && ln -sf "$BIN" /usr/local/bin/llama-server \
    && find /opt/llama -name "*.so*" -exec cp {} /usr/local/lib/ \; \
    && ldconfig \
    && echo "/usr/local/lib" > /etc/ld.so.conf.d/llama.conf && ldconfig \
    && llama-server --version 2>&1 | head -3 || true

RUN pip install --no-cache-dir \
        fastapi==0.115.6 \
        "uvicorn[standard]==0.34.0" \
        httpx==0.28.1

ENV N_CTX=4096
ENV N_THREADS=2
ENV LLAMA_PORT=8080
ENV PORT=7860
ENV WORKER_ID=A
ENV WORKER_KIND=chat
ENV MODEL_NAME="llama-3.2-3b"
ENV CHAT_TEMPLATE=llama3
ENV LLAMA_TIMEOUT=180.0
ENV LD_LIBRARY_PATH="/usr/local/lib"

COPY server.py start.sh ./
RUN chmod +x start.sh

EXPOSE 7860

HEALTHCHECK --interval=30s --timeout=15s --start-period=240s --retries=5 \
    CMD curl -f http://localhost:7860/health || exit 1

CMD ["./start.sh"]