# Phase 2 als Container. # # podman build -t wurzelwerk-p2 . # # Debian trixie wie der Postgres-Container - dieselbe glibc, dieselbe # Zeichensortierung. Fuer die Module ohne Modell spielt das keine Rolle, # fuer kuenftige Vergleiche in der Datenbank schon. FROM docker.io/library/python:3.13-slim-trixie # OMP_NUM_THREADS ist keine Bequemlichkeit, sondern Voraussetzung: # - PyTorch liest die CPU-Zahl am Host ab, nicht die cgroup-Quota. Ohne # feste Zahl startet es im Container mehr Threads als es Kontingent hat. # - Die Threadzahl bestimmt die Reihenfolge der Gleitkommaadditionen und # damit die letzten Stellen jedes Vektors. Sie gehoert deshalb in die # coder_version (siehe embeddings.py). # 4 laeuft auf jeder Maschine, die hier in Frage kommt - Prod hat 16 Threads, # die Entwicklungsmaschine 32. ENV PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ HF_HOME=/cache/huggingface \ OMP_NUM_THREADS=4 \ MKL_NUM_THREADS=4 \ TOKENIZERS_PARALLELISM=false WORKDIR /app # torch zuerst und in einer eigenen Schicht: 196 MB, die sich nicht aendern, # wenn eine Anforderungsdatei angefasst wird. Ausdruecklich aus dem CPU-Index - # die Vorgabe von PyPI zoege mehrere Gigabyte CUDA-Bibliotheken nach, die auf # diesem Server nichts ausrichten koennen (der SM750 ist ein Anzeigechip). RUN python3 -m pip install --no-cache-dir --upgrade pip \ && python3 -m pip install --no-cache-dir \ --index-url https://download.pytorch.org/whl/cpu torch==2.14.0+cpu COPY requirements.txt requirements-embedding.txt requirements-akteure.txt ./ RUN python3 -m pip install --no-cache-dir -r requirements.txt \ && python3 -m pip install --no-cache-dir -r requirements-embedding.txt \ && python3 -m pip install --no-cache-dir -r requirements-akteure.txt # Das NER-Modell mit fester Version, direkt aus der Modellfreigabe. Es liegt # im Abbild und nicht im Cache-Volume: 568 MB, die sich nie aendern, und der # erste Lauf auf Prod soll nicht an einem Download haengen. RUN python3 -m pip install --no-cache-dir \ https://github.com/explosion/spacy-models/releases/download/de_core_news_lg-3.8.0/de_core_news_lg-3.8.0-py3-none-any.whl \ && python3 -m pip freeze > /app/requirements-lock.txt COPY *.py ./ COPY migrations/ ./migrations/ # Der Wikidata-Spiegel gehoert ins Abbild: akteure.py laedt aus der # Datenbank, aber lexikon_laden.py soll im Container laufen koennen, ohne # dass jemand dafuer Wikidata anfasst. COPY lexikon/ ./lexikon/ # Eigener Benutzer, kein root. /cache traegt die Modellgewichte und muss ein # Volume sein - 2,2 GB im Container-Layer waeren bei jedem Neubau weg. RUN useradd --uid 10001 --create-home wurzelwerk \ && mkdir -p /cache/huggingface \ && chown -R 10001:10001 /cache /app USER 10001 ENTRYPOINT ["python3"] CMD ["check_db.py"]