BITNET / Dockerfile
viarl199020's picture
Upload 5 files
ed62617 verified
Raw History Blame Contribute Delete
4.78 kB
# ═══════════════════════════════════════════════════════════════════════════
# 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"]