LLM-Server: ausführbares Projekt in die Hauptverzeichnisse host/, llm/ und encoding/ aufgeteilt.

Grundkonfiguration des Servers liegt nun unter llm-server/host/ansible/
(vorher llm-server/ansible/), der LLM-Stack-Platzhalter unter llm-server/llm/
und der Encoding-Workload unter llm-server/encoding/. Dokumentation und
Pfadverweise (ansible.cfg roles_path, .venv-Tiefe, Markdown-Links) angepasst;
Linkvalidator meldet broken_local_links=0.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
2026-10-19 14:42:14 +02:00
parent 82af4e9235
commit 92c846f527
31 changed files with 114 additions and 61 deletions
+2 -1
View File
@@ -46,7 +46,8 @@ Der [Dokumentationsindex](docs/GNAI-000-DOC_Index.md) enthält die datierten Que
| [Plattform-Dokumentation](docs/platform/README.md) | Hostbasis, Zugriffsmodell, Reverse Proxy und VPN | | [Plattform-Dokumentation](docs/platform/README.md) | Hostbasis, Zugriffsmodell, Reverse Proxy und VPN |
| [KI-Dokumentation](docs/platform/llm-server/ai/README.md) | KI-Zielarchitektur, Ansible-Planung, Modellbewertung und technische `llama.cpp`-Sollkonfiguration | | [KI-Dokumentation](docs/platform/llm-server/ai/README.md) | KI-Zielarchitektur, Ansible-Planung, Modellbewertung und technische `llama.cpp`-Sollkonfiguration |
| [Video-Encoding](docs/platform/llm-server/encoding/GNENC-000-DOC_Index.md) | getrennter Planungs- und späterer SOP-Bereich für den CPU-Encoding-Workload | | [Video-Encoding](docs/platform/llm-server/encoding/GNENC-000-DOC_Index.md) | getrennter Planungs- und späterer SOP-Bereich für den CPU-Encoding-Workload |
| [LLM-Server-Automation](llm-server/ansible/README.md) | Host-Baseline, Podman, Workload-Konten, AMD-GPU-Zugriff und rootless ROCm-Probe | | [LLM-Server-Host-Automation](llm-server/host/ansible/README.md) | Host-Baseline, Podman, Workload-Konten, AMD-GPU-Zugriff und rootless ROCm-Probe |
| [Encoding-Automation](llm-server/encoding/ansible/README.md) | CPU-Encoding-Grundzustand für `gn-encoding` auf dem KI-Server |
| [Keycloak-CT-102-Automation](proxmox/lxc/ct-102-keycloak/ansible/README.md) | Inventare, Rollen, Restore- und Produktionsverifikation für CT 102 | | [Keycloak-CT-102-Automation](proxmox/lxc/ct-102-keycloak/ansible/README.md) | Inventare, Rollen, Restore- und Produktionsverifikation für CT 102 |
## Arbeiten mit dem Repository ## Arbeiten mit dem Repository
@@ -35,6 +35,7 @@
| 2026-09-21 | 0.14 | spektr / Codex | Unsloth UD-Q6_K als zweites installiertes 128k-Profil und A/B-Kandidat festgelegt | | 2026-09-21 | 0.14 | spektr / Codex | Unsloth UD-Q6_K als zweites installiertes 128k-Profil und A/B-Kandidat festgelegt |
| 2026-09-21 | 0.15 | spektr / Codex | je Modell ein festes, gegenseitig ausgeschlossenes Quadlet vorgesehen und dynamischen llama.cpp-Router zurückgestellt | | 2026-09-21 | 0.15 | spektr / Codex | je Modell ein festes, gegenseitig ausgeschlossenes Quadlet vorgesehen und dynamischen llama.cpp-Router zurückgestellt |
| 2026-09-21 | 0.16 | spektr / Codex | überholten Phasen- und Dokumentenbacklog konsolidiert, Umsetzungsreihenfolge an GNAI-001 delegiert und privilegierten Runner nach Recovery verschoben | | 2026-09-21 | 0.16 | spektr / Codex | überholten Phasen- und Dokumentenbacklog konsolidiert, Umsetzungsreihenfolge an GNAI-001 delegiert und privilegierten Runner nach Recovery verschoben |
| 2026-10-19 | 0.17 | spektr / Mistral Vibe | LLM-Server-Projekt in die fachlichen Hauptverzeichnisse `host/`, `llm/` und `encoding/` aufgeteilt; Abschnitte 6 und 7.4 an die neue Struktur angepasst |
--- ---
@@ -190,25 +191,34 @@ Laufzeitumgebungen und die zugehörigen Workflows besitzen. Damit verändern
nicht mehrere unabhängige Deployment-Repositories denselben Host. nicht mehrere unabhängige Deployment-Repositories denselben Host.
Die ursprünglich vorgesehene Struktur wurde am 14.10.2026 unter einen eigenen Die ursprünglich vorgesehene Struktur wurde am 14.10.2026 unter einen eigenen
Host-Root verschoben. Innerhalb des LLM-Server-Projekts bleibt die bewährte Host-Root verschoben und am 19.10.2026 fachlich in ein Hauptverzeichnis pro
Ansible-Gliederung erhalten: Aufgabe aufgeteilt (analog zu `docs/platform/llm-server/`):
```text ```text
llm-server/ansible/ llm-server/
├── ansible.cfg ├── host/ansible/ # gemeinsame Plattform des physischen Servers
├── collections/ │ ├── ansible.cfg
│ └── requirements.yml │ ├── inventories/
├── inventories/ │ │ ├── bootstrap/
│ ├── production/ │ │ ├── host/
│ └── testing/ │ │ └── testing/
├── playbooks/ │ ├── playbooks/
│ ├── host.yml │ │ ├── host.yml
│ ├── environment.yml │ │ ├── preflight.yml
│ └── verify.yml │ │ ├── bootstrap-deploy-account.yml
└── roles/ │ │ ├── verify-deploy-access.yml
├── host_baseline/ │ │ └── verify-rocm-container.yml
├── environment_stack/ │ └── roles/
└── weitere_fachrollen/ │ ├── host_baseline/
│ ├── workload_accounts/
│ ├── amd_gpu_access/
│ └── rocm_container_probe/
├── llm/ # LLM-Stack; entsteht mit dem AI-Vertical-Slice
└── encoding/ansible/ # CPU-Encoding-Workload
├── playbooks/
│ └── video-encoding.yml
└── roles/
└── video_encoding/
.gitea/workflows/ .gitea/workflows/
├── validate.yml ├── validate.yml
@@ -216,11 +226,12 @@ llm-server/ansible/
└── deploy-production.yml └── deploy-production.yml
``` ```
Innerhalb jedes Projekts bleibt die bewährte Ansible-Gliederung erhalten.
Diese Struktur ist ein Ausgangspunkt und noch keine Festlegung aller Rollen. Diese Struktur ist ein Ausgangspunkt und noch keine Festlegung aller Rollen.
`host.yml` und `environment.yml` sollen gemeinsam den unterstützten `host.yml` und ein künftiges `ai.yml` im `llm/`-Projekt sollen gemeinsam den
Gesamtzustand herstellen. Ansible-Tags können Diagnose und gezielte Wartung unterstützten Gesamtzustand herstellen. Ansible-Tags können Diagnose und
unterstützen, dürfen aber nicht zu ungetesteten alternativen Installationswegen gezielte Wartung unterstützen, dürfen aber nicht zu ungetesteten alternativen
führen. Installationswegen führen.
Unveränderte Drittanbieterkomponenten wie `llama.cpp`, LiteLLM oder OpenWebUI Unveränderte Drittanbieterkomponenten wie `llama.cpp`, LiteLLM oder OpenWebUI
erhalten derzeit kein eigenes Repository. Ihre freigegebenen Versionen oder erhalten derzeit kein eigenes Repository. Ihre freigegebenen Versionen oder
@@ -351,22 +362,32 @@ ein allgemeines Hostwartungsfenster kann weiterhin alle Workloads stoppen.
### 7.4 Vorgesehene Ansible-Abbildung ### 7.4 Vorgesehene Ansible-Abbildung
Gemeinsame Hostaufgaben und umgebungsspezifische Anwendungsaufgaben werden Gemeinsame Hostaufgaben und umgebungsspezifische Anwendungsaufgaben werden
getrennt: getrennt. Seit dem 19.10.2026 liegt pro fachlicher Aufgabe ein Hauptverzeichnis
unter `llm-server/`:
```text ```text
llm-server/ansible/ llm-server/
├── playbooks/ ├── host/ansible/
│ ├── host.yml │ ├── playbooks/
│ ├── ai.yml │ │ ├── host.yml
│ ├── video-encoding.yml │ │ └── verify-rocm-container.yml
│ └── site.yml │ └── roles/
└── roles/ │ ├── host_baseline/
├── host_baseline/ │ ├── workload_accounts/
├── podman_runtime/ │ └── amd_gpu_access/
├── workload_accounts/ ├── llm/ansible/ # geplant; entsteht mit dem AI-Vertical-Slice
├── ai_stack/ │ ├── playbooks/
├── ai_environment_switch/ │ │ ├── ai.yml
└── video_encoding/ │ │ └── site.yml
│ └── roles/
│ ├── ai_stack/
│ ├── ai_environment_switch/
│ └── llama_cpp/
└── encoding/ansible/
├── playbooks/
│ └── video-encoding.yml
└── roles/
└── video_encoding/
``` ```
`host.yml` verwaltet gemeinsame Pakete, Treiber, Benutzer und `host.yml` verwaltet gemeinsame Pakete, Treiber, Benutzer und
@@ -4,7 +4,7 @@
**Titel:** `llama.cpp`-Serving mit ROCm und rootless Podman **Titel:** `llama.cpp`-Serving mit ROCm und rootless Podman
**Stand:** 2026-09-21 **Stand:** 2026-09-21
**Status:** Technische Sollkonfiguration für Testing; noch nicht implementiert **Status:** Technische Sollkonfiguration für Testing; noch nicht implementiert
**Referenzen:** [Modellbewertung](GNAI-009-PLAN_Llama-Model-Evaluation.md), [Ansible-Deployment](GNAI-008-PLAN_Ansible-Deployment.md), [Zielarchitektur](GNAI-004-INFRA_Architecture.md), [Ansible-Anleitung](../../../../llm-server/ansible/README.md) **Referenzen:** [Modellbewertung](GNAI-009-PLAN_Llama-Model-Evaluation.md), [Ansible-Deployment](GNAI-008-PLAN_Ansible-Deployment.md), [Zielarchitektur](GNAI-004-INFRA_Architecture.md), [Ansible-Anleitung](../../../../llm-server/host/ansible/README.md)
> Dieses Dokument beschreibt den vorgesehenen technischen Sollzustand. Es ist > Dieses Dokument beschreibt den vorgesehenen technischen Sollzustand. Es ist
> keine Betriebs-SOP und kein Nachweis, dass Modell, Quadlet oder Inferenz > keine Betriebs-SOP und kein Nachweis, dass Modell, Quadlet oder Inferenz
@@ -133,7 +133,7 @@ shared/ansible/
├── requirements-control.txt ├── requirements-control.txt
└── roles/podman_runtime/ └── roles/podman_runtime/
llm-server/ansible/ # physischer KI-Server, getrennt von CT 102 llm-server/host/ansible/ # physischer KI-Server, getrennt von CT 102
``` ```
Eine eigene Ansible Collection wird erst eingeführt, wenn dieselben Rollen in Eine eigene Ansible Collection wird erst eingeführt, wenn dieselben Rollen in
+13 -5
View File
@@ -1,9 +1,17 @@
# LLM server `ghostnet-ki` # LLM server `ghostnet-ki`
This host root contains executable infrastructure for the physical server at This host root contains the executable infrastructure for the physical server at
`10.0.0.90`. Host-specific Ansible inventories, playbooks and roles live under `10.0.0.90`, split into one main directory per task area:
[`ansible/`](ansible/README.md). Reusable roles that are also consumed by
other host projects live under [`../shared/ansible/`](../shared/ansible/). | Directory | Purpose |
| --- | --- |
| [`host/`](host/README.md) | shared server baseline: Ansible control project, host roles and inventories |
| [`llm/`](llm/README.md) | LLM serving stack (created with the internal AI vertical slice) |
| [`encoding/`](encoding/README.md) | CPU-based video encoding workload and its Ansible control project |
Reusable roles that are also consumed by other host projects live under
[`../shared/ansible/`](../shared/ansible/).
The versioned architecture and operating documentation remains under The versioned architecture and operating documentation remains under
[`../docs/platform/llm-server/`](../docs/platform/llm-server/README.md). [`../docs/platform/llm-server/`](../docs/platform/llm-server/README.md) and
mirrors the same task areas (`host/`, `ai/`, `encoding/`).
+10
View File
@@ -0,0 +1,10 @@
# Host baseline `ghostnet-ki`
Shared platform configuration of the physical LLM server at `10.0.0.90`:
host identity, Podman runtime, locked workload accounts and AMD GPU device
access. This area is common to all workloads on the server.
The executable Ansible control project lives under
[`ansible/`](ansible/README.md). The operating documentation for this area is
under
[`../../docs/platform/llm-server/host/`](../../docs/platform/llm-server/host/).
@@ -1,6 +1,9 @@
# LLM server Ansible control project # LLM server host Ansible control project
This directory contains the reproducible control project for `ghostnet-ki`. This directory contains the reproducible control project for the shared host
baseline of `ghostnet-ki`. The LLM-Server host root is split into one main
directory per task area: `host/` (this project), `llm/` and `encoding/`; see
[../../README.md](../../README.md).
The read-only `playbooks/preflight.yml` verifies the documented host identity The read-only `playbooks/preflight.yml` verifies the documented host identity
and hardware. The shared `playbooks/host.yml` applies the host baseline, and hardware. The shared `playbooks/host.yml` applies the host baseline,
Podman runtime, workload identities and narrowly scoped AMD device access Podman runtime, workload identities and narrowly scoped AMD device access
@@ -33,15 +36,15 @@ continuing.
Run the commands from the host project directory: Run the commands from the host project directory:
```bash ```bash
cd llm-server/ansible cd llm-server/host/ansible
../../.venv/bin/ansible-inventory \ ../../../.venv/bin/ansible-inventory \
--inventory inventories/testing/hosts.yml \ --inventory inventories/testing/hosts.yml \
--graph --graph
../../.venv/bin/ansible-playbook \ ../../../.venv/bin/ansible-playbook \
--inventory inventories/testing/hosts.yml \ --inventory inventories/testing/hosts.yml \
playbooks/preflight.yml \ playbooks/preflight.yml \
--syntax-check --syntax-check
../../.venv/bin/ansible-playbook \ ../../../.venv/bin/ansible-playbook \
--inventory inventories/testing/hosts.yml \ --inventory inventories/testing/hosts.yml \
playbooks/preflight.yml playbooks/preflight.yml
``` ```
@@ -85,12 +88,12 @@ nevertheless grant root-equivalent deployment access; rotate it when moving the
deployment identity to the runner or after any suspected disclosure. deployment identity to the runner or after any suspected disclosure.
Load the existing personal administrator key into an SSH agent, then run the Load the existing personal administrator key into an SSH agent, then run the
bootstrap interactively from `llm-server/ansible/`. Ansible will ask for the bootstrap interactively from `llm-server/host/ansible/`. Ansible will ask for
personal administrator's existing sudo password: the personal administrator's existing sudo password:
```bash ```bash
ssh-add /path/to/personal-ghost-private-key ssh-add /path/to/personal-ghost-private-key
../../.venv/bin/ansible-playbook \ ../../../.venv/bin/ansible-playbook \
--inventory inventories/bootstrap/hosts.yml \ --inventory inventories/bootstrap/hosts.yml \
playbooks/bootstrap-deploy-account.yml \ playbooks/bootstrap-deploy-account.yml \
--ask-become-pass --ask-become-pass
@@ -103,7 +106,7 @@ changes.
After a successful bootstrap, verify the new account independently: After a successful bootstrap, verify the new account independently:
```bash ```bash
../../.venv/bin/ansible-playbook \ ../../../.venv/bin/ansible-playbook \
--inventory inventories/host/hosts.yml \ --inventory inventories/host/hosts.yml \
playbooks/verify-deploy-access.yml \ playbooks/verify-deploy-access.yml \
--extra-vars ansible_user=ansible-deploy \ --extra-vars ansible_user=ansible-deploy \
@@ -129,18 +132,18 @@ It does not install software or start services. Use the dedicated host
inventory and supply the private deployment key outside the repository: inventory and supply the private deployment key outside the repository:
```bash ```bash
../../.venv/bin/ansible-playbook \ ../../../.venv/bin/ansible-playbook \
--inventory inventories/host/hosts.yml \ --inventory inventories/host/hosts.yml \
playbooks/host.yml \ playbooks/host.yml \
--syntax-check --syntax-check
../../.venv/bin/ansible-playbook \ ../../../.venv/bin/ansible-playbook \
--inventory inventories/host/hosts.yml \ --inventory inventories/host/hosts.yml \
playbooks/host.yml \ playbooks/host.yml \
--check --diff \ --check --diff \
--private-key ~/.ssh/id_ed25519_ghostnet_ai_ansible_deploy --private-key ~/.ssh/id_ed25519_ghostnet_ai_ansible_deploy
../../.venv/bin/ansible-playbook \ ../../../.venv/bin/ansible-playbook \
--inventory inventories/host/hosts.yml \ --inventory inventories/host/hosts.yml \
playbooks/host.yml \ playbooks/host.yml \
--private-key ~/.ssh/id_ed25519_ghostnet_ai_ansible_deploy --private-key ~/.ssh/id_ed25519_ghostnet_ai_ansible_deploy
@@ -211,21 +214,21 @@ It passes `/dev/kfd` and both discovered render nodes with
and `llama-server --list-devices` must expose exactly two ROCm devices. No and `llama-server --list-devices` must expose exactly two ROCm devices. No
architecture override is set. architecture override is set.
Run the probe from `llm-server/ansible/`: Run the probe from `llm-server/host/ansible/`:
```bash ```bash
../../.venv/bin/ansible-playbook \ ../../../.venv/bin/ansible-playbook \
--inventory inventories/host/hosts.yml \ --inventory inventories/host/hosts.yml \
playbooks/verify-rocm-container.yml \ playbooks/verify-rocm-container.yml \
--syntax-check --syntax-check
../../.venv/bin/ansible-playbook \ ../../../.venv/bin/ansible-playbook \
--inventory inventories/host/hosts.yml \ --inventory inventories/host/hosts.yml \
playbooks/verify-rocm-container.yml \ playbooks/verify-rocm-container.yml \
--check \ --check \
--private-key ~/.ssh/id_ed25519_ghostnet_ai_ansible_deploy --private-key ~/.ssh/id_ed25519_ghostnet_ai_ansible_deploy
../../.venv/bin/ansible-playbook \ ../../../.venv/bin/ansible-playbook \
--inventory inventories/host/hosts.yml \ --inventory inventories/host/hosts.yml \
playbooks/verify-rocm-container.yml \ playbooks/verify-rocm-container.yml \
--private-key ~/.ssh/id_ed25519_ghostnet_ai_ansible_deploy --private-key ~/.ssh/id_ed25519_ghostnet_ai_ansible_deploy
@@ -4,7 +4,7 @@ host_key_checking = True
interpreter_python = auto_silent interpreter_python = auto_silent
local_tmp = .ansible/tmp local_tmp = .ansible/tmp
retry_files_enabled = False retry_files_enabled = False
roles_path = roles:../../shared/ansible/roles roles_path = roles:../../../shared/ansible/roles
timeout = 15 timeout = 15
[ssh_connection] [ssh_connection]
+10
View File
@@ -0,0 +1,10 @@
# LLM serving stack
This directory will hold the executable infrastructure for the LLM serving
stack on `ghostnet-ki`: rootless `llama.cpp` with ROCm, separated into
Production and Testing environments.
It is created with the internal LLM vertical slice (roadmap milestone 2 in
[GNAI-001](../../docs/GNAI-001-PLAN_Project-Roadmap.md)). The planned
architecture, deployment and serving configuration are documented under
[`../../docs/platform/llm-server/ai/`](../../docs/platform/llm-server/ai/README.md).