pixellock / Dockerfile
solarkyle's picture
Deploy PixelLock GPU Space (llama.cpp + GGUF + GBNF + custom UI)
eb90246 verified
Raw
History Blame Contribute Delete
2.49 kB
# PixelLock — GPU Space.
# A fine-tuned *text* LLM (Gemma-4-12B) rewrites a sprite as a PALETTE/GRID text
# wire under a per-sprite GBNF grammar (llama.cpp) that locks the silhouette by
# construction. We base on the OFFICIAL prebuilt llama.cpp CUDA server image so
# there is NO source compile (compiling the CUDA kernels OOM-kills the free HF
# builder) — this ships the exact `llama-server` we validated, plus a Gradio UI.
FROM ghcr.io/ggml-org/llama.cpp:server-cuda
# --- add Python + our deps on top of the llama.cpp CUDA runtime --------------
USER root
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
python3 python3-pip curl ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Make the server binary reachable as `llama-server` regardless of its path in
# the base image (it ships at /app/llama-server).
RUN ln -sf "$(command -v llama-server || echo /app/llama-server)" /usr/local/bin/llama-server || true
COPY requirements.txt /tmp/requirements.txt
# Ubuntu 24.04 base → PEP 668 blocks system pip installs; --break-system-packages
# is the intended escape hatch inside a container.
RUN pip3 install --no-cache-dir --break-system-packages -r /tmp/requirements.txt
# --- non-root user (HF Spaces requirement) ----------------------------------
# The base image already has a uid-1000 user; -o allows reusing the UID under a
# new name so `USER user` / `--chown=user` resolve cleanly.
RUN useradd -m -u 1000 -o user
USER user
ENV HOME=/home/user PATH=/home/user/.local/bin:$PATH
WORKDIR /home/user/app
# --- bake the fine-tuned GGUF into the image (fast, token-free cold starts) ---
ENV MODEL_REPO=solarkyle/pixellock-gemma-12b-pixelart-gguf \
MODEL_FILE=pixellock-gemma-12b-q4_k_m.gguf \
MODEL_PATH=/home/user/app/model.gguf
RUN python3 -c "import os, shutil; from huggingface_hub import hf_hub_download; \
shutil.copy(hf_hub_download(os.environ['MODEL_REPO'], os.environ['MODEL_FILE']), os.environ['MODEL_PATH'])"
# --- app code (Gradio UI + engine modules) ----------------------------------
COPY --chown=user . /home/user/app
ENV PYTHONUNBUFFERED=1 \
PIXELLOCK_ENDPOINT=http://127.0.0.1:8080/v1/chat/completions \
PIXELLOCK_MODEL=pixellock \
PIXELLOCK_MAX_DIM=64 \
PORT=7860
EXPOSE 7860
# Reset the base image's entrypoint (it launches llama-server directly) so our
# startup script runs both llama-server (background) and the Gradio UI.
ENTRYPOINT []
CMD ["bash", "start.sh"]