TARGET_SPACE / Dockerfile
RDS777's picture
Upload 141 files
a540ba1 verified
Raw History Blame Contribute Delete
2.29 kB
# Space Hugging Face (SDK docker) — un seul conteneur, un seul port : interface UNIQUE, API et 3D Symbioza,
# pipeline d'agents et moteur GRPO/DPO. Aucune inférence en ligne : tout tourne sur le GPU du Space.
#
# Matériel visé : L4 24 Go (bf16, modèle 7B) ou T4 16 Go (fp16, modèle 1,5B). Le profil est choisi au
# lancement par engine/trainer.py selon la VRAM réellement détectée ; aucune valeur n'est codée en dur ici.
# Image plus légère pour un Space CPU : --build-arg TORCH_VARIANT=cpu (l'entraînement y est alors impossible,
# le reste du Space fonctionne).
FROM python:3.12-slim
ARG TORCH_VARIANT=gpu
ENV PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
PIP_NO_CACHE_DIR=1 \
PORT=7860 \
MOUH_DATA_DIR=/home/user/data \
HOME=/home/user
# Chaîne de compilation : Triton (noyaux de trl, SFT/GRPO/DPO) compile son module de pilotage CUDA au premier
# appel (sans gcc : « Failed to find C compiler », v4.1.2) ; make sert aux extensions C de certaines
# dépendances. L'image python:3.12-slim n'en contient aucun des deux.
RUN apt-get update \
&& apt-get install -y --no-install-recommends gcc libc6-dev make \
&& rm -rf /var/lib/apt/lists/*
# Utilisateur non-root (exigé par les Spaces) : l'isolation du bac à sable repose sur ce conteneur.
RUN useradd -m -u 1000 user
WORKDIR /home/user/app
COPY --chown=user requirements.txt requirements-dev.txt ./
RUN if [ "$TORCH_VARIANT" = "cpu" ]; then \
pip install --index-url https://download.pytorch.org/whl/cpu torch ; \
else \
pip install "torch>=2.4,<2.16" ; \
fi \
&& pip install -r requirements.txt
# Tout le dépôt : mouh/ (noyau, JEV, bac à sable, géométrie), agents/ (pipeline et journal de travail),
# engine/ (GRPO/DPO), jobs/ (entraînement continu), web/symbioza/ (3D servie sur /symbioza).
COPY --chown=user . .
USER user
# Le dossier local (data/, failures/, adapter/, adapter_rl/, work_journal.jsonl) vit sur /data quand le Space
# a un stockage persistant, sinon ici — le panneau de pilotage indique lequel est actif.
EXPOSE 7860
HEALTHCHECK --interval=30s --timeout=5s --start-period=40s \
CMD python -c "import urllib.request,os;urllib.request.urlopen('http://127.0.0.1:'+os.environ.get('PORT','7860'))" || exit 1
CMD ["python", "app.py"]