# DiDi LOT 1 — Local GPU stack (deploy progresiv) Deploy „cărămidă cu cărămidă" al întregii platforme pe un host cu GPU. Pentru fiecare componentă: **build/pull + download → seed (dacă e cazul) → TEST funcțional → doar dacă testul trece corect → următoarea**. Idempotent, se oprește la primul test picat. ## Cerințe (verificate de preflight, nu se instalează automat) - Docker Engine 24+ cu plugin `docker compose` v2 - NVIDIA driver ≥535 + `nvidia-container-toolkit` (runtime configurat în Docker) - ≥1 GPU (proiectat pe 2× H200; GPU 0 = LLM+Whisper, GPU 1 = BusterX+bge×2) - ~100 GB liberi pe `/` (toate modelele ≈ 94 GB) ## Modele — o singură zonă locală Toate modelele stau în **`ai_platform/models/`** (format HF cache, un folder per model), servite **offline** de acolo (fără rețea la runtime). `MODELS_DIR` în `.env` (auto = acest folder). Ce lipsește se descarcă o singură dată în el (`deploy.sh` pasul DOWNLOAD). NU se comite în git. | Folder | Model | Folosit de | |---|---|---| | `models--Qwen--Qwen3.5-35B-A3B` | LLM (67G) | llm (vLLM) | | `models--l8cv--BusterX_plusplus` | deepfake (16G, Qwen2.5-VL intern) | video (vLLM) | | `models--BAAI--bge-m3` | embeddings | embeddings (vLLM) | | `models--BAAI--bge-reranker-v2-m3` | reranker | rerank (vLLM) | | `models--mobiuslabsgmbh--faster-whisper-large-v3-turbo` | STT | audio | | `models--urchade--gliner_multi-v2.1` + `models--microsoft--mdeberta-v3-base` | NER + backbone | extractors | Copiezi `ai_platform/models/` pe altă mașină → zero download la deploy. ## Utilizare ```bash cd ai_platform/local_gpu_stack ./deploy.sh # tot, de la preflight la dashboard ./deploy.sh --from web # reia de la cărămida 'web' (sare peste cele dinainte) ./deploy.sh --only llm # rulează o singură cărămidă (presupune deps deja up) ./deploy.sh --install-deps # instalează Docker + nvidia-container-toolkit (sudo), apoi continuă ``` `.env` se creează automat din `.env.example` la prima rulare. ### Mașină nouă (VM „chioară" cu GPU) 1. (o singură dată) driver NVIDIA ≥535 + reboot — `sudo ubuntu-drivers install` (nu se automatizează, cere reboot). 2. `git clone && cd .../ai_platform/local_gpu_stack` 3. `./deploy.sh --install-deps` → instalează Docker+toolkit, apoi: - **HOST_IP** se auto-detectează și se scrie în `.env` - **BusterX** se descarcă automat din HF dacă nu e pe disc (`BUSTER_HF_CACHE`) - Qwen/bge se descarcă (cu progres), totul se ridică cărămidă cu cărămidă cu test la fiecare. > Singurul pas care NU e o comandă: driverul NVIDIA (reboot). Restul e `./deploy.sh`. Cărămizi, în ordine: `embeddings · rerank · llm · extractors · audio · video · forensic · web · catalog · gateway · brain · dashboard`. La final: dashboard pe `http://:51300/admin-ai/` (staging mode, fără login). ## Ce automatizează (fixurile care înainte erau manuale) - rețea unică `didi-network`; plasare GPU 0/1; nume containere `didiAI-*` - base-URL vLLM **fără** `/v1` (codul îl adaugă) pentru llm/embeddings/video - YOLO scrie modelul în `/tmp` (cwd e read-only la non-root) - gateway LLM injectează `enable_thinking:false` → JSON curat din Qwen3.5 (sentiment/OCR/semantic/brain) - SearXNG fără proxy outbound, ca serviciu compose - brain: aliniere parolă postgres, creare **token atomic** (auto, salvat în `.env`), **seed taxonomie** (79 tag-uri) - dashboard: `.env` cu staging + override-uri health; **seed catalog** (9 intrări) ## Fișiere | Fișier | Rol | |---|---| | `deploy.sh` | orchestratorul progresiv gated | | `lib.sh` | logging, `wait_health`, `gate`, shim docker (merge și prin `sg docker`) | | `docker-compose.yml` | stack-ul GPU + non-GPU + searxng | | `.env.example` | configurația (host, porturi, parole, token) | | `seed/seed_catalog.sh` | populează catalogul DB al dashboard-ului (idempotent) | | `seed/seed_brain.sh` | token atomic + taxonomie + env brain | | `TESTING.md` | comenzi de testare per componentă + smoke-test | > Brain rulează din `modules/didi_brain/infra/docker-compose.yml`; dashboard și gateway > din `modules/*/deploy/` — `deploy.sh` le orchestrează pe toate sub proiectul `local_gpu_stack`.