# ═══════════════════════════════════════════════════════════════════════════ # 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"]