Files
swp-02-aufbereitung/Containerfile
T
irrlichtandClaude Opus 5 cf89e012b2 Revisionsmodul, Embeddings und Container
Drei Schritte, die zusammen Phase 2 lauffaehig machen.

Revisionen (migrations/p2-004, revisionen.py)
    Ingest schreibt jede geaenderte Fassung eines Items nach
    raw_item_versionen fort. Daraus faellt ein Befund ab, den die
    Spezifikation nicht vorsehen konnte: welches Haus seine Schlagzeile
    nachtraeglich umschreibt, und wie. 206 von 3407 Items, acht
    Einstufungen von 'formal' bis 'neufassung'. Kein Modell, kein Lexikon,
    kein Netzzugriff - nur ein Wortvergleich zweier Fassungen.

    Fortschreibungen sind ueber ticker_markiert und kopf_stabil abziehbar,
    absichtlich als zwei Merkmale statt einer Kategorie: das eine ist eine
    Selbstauskunft des Hauses, das andere eine Beobachtung am Satzbau.

Embeddings (embeddings.py)
    multilingual-e5-large, 1024 Dimensionen, MIT. Jede Zeile wird auf feste
    128 Token aufgefuellt, nicht nur bis zur laengsten des Stapels - sonst
    haengt ein Vektor davon ab, mit welchen Nachbarn er kodiert wurde, und
    ein Slot-Lauf liefert andere letzte Stellen als ein Backfill.
    Nachgewiesen: 64/64 bitgleich einzeln wie im vollen Stapel, groesste
    Abweichung 0.00e+00, und im Betrieb 26 Slot-Vektoren unveraendert
    gegen den 3407er-Backfill.

    Darum transformers statt sentence-transformers: letzteres kapselt genau
    diese Stelle weg.

Container (Containerfile, phase2.py, deploy/)
    Debian trixie wie der Postgres-Container, torch aus dem CPU-Index.
    Die regelbasierten Module liefern darin fuer alle 3407 Items bitgleich
    dieselbe Nutzlast wie auf der Entwicklungsmaschine - Portabilitaet
    gemessen, nicht behauptet.

version.py bekommt den Schluessel 'revision'. Weil der Hash ueber den ganzen
Komponentensatz laeuft, aendert das auch die Version des Dublettenmoduls,
obwohl an dessen Verfahren nichts anders ist. Das ist die in version.py
beschriebene Semantik der Spezifikation, kein Versehen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NupWEBPzsyohVPG47HsTz8
2026-09-08 07:41:27 +02:00

52 lines
2.1 KiB
Docker

# 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 ./
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 freeze > /app/requirements-lock.txt
COPY *.py ./
COPY migrations/ ./migrations/
# 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"]