Skip to content

Latest commit

 

History

History

README.md

Model-Server

FastAPI-basierter Inferenz-Server, der ein Basis-Modell zusammen mit einem in der pipeline trainierten LoRA-/QLoRA-Adapter lädt und über eine OpenAI-kompatible REST-API bereitstellt. Teil des Projekts LLM Code Completion.

Voraussetzungen

  • Python 3.10+
  • CUDA-fähige GPU mit ≥ 16 GB VRAM (für ein 7B-Modell in voller Präzision)
  • Optional: Docker mit NVIDIA Container Toolkit

Installation

cd model-server
pip install -r requirements.txt

Modell bereitstellen

make setup-model

Das Skript verlinkt bzw. kopiert das in der Pipeline trainierte Modell (../pipeline/outputs/<run>/final_model) nach models/. Alternativ den Pfad in config.yaml oder per Umgebungsvariable MODEL_PATH setzen. Wird kein Adapter gefunden, lädt der Server das in BASE_MODEL konfigurierte Basis-Modell.

Server starten

python server.py
# oder
make run

Der Server ist konfigurationsgetrieben – Einstellungen kommen aus config.yaml bzw. den Umgebungsvariablen aus .env.example. Standard-Binding: 0.0.0.0:8000.

curl http://localhost:8000/health
# {"status":"healthy","model_loaded":true,...}

API-Endpunkte

Methode Pfad Beschreibung
POST /v1/completions Code-Completion (OpenAI-kompatibel)
GET /health Health-Check inkl. Modell-Status
GET /v1/models Liste der geladenen Modelle
GET / Service-Info

Beispiel-Request:

curl -X POST http://localhost:8000/v1/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"Qwen/Qwen2.5-Coder-7B-Instruct","prompt":"public int add(int a,","max_tokens":32}'

Konfiguration

Zentrale Optionen in config.yaml:

Bereich Schlüssel Bedeutung
model path, base_model, adapter_type, merge_adapter Modell-/Adapter-Quelle und Merge-Verhalten
transformers max_model_len, dtype, load_in_4bit Präzision und Kontextlänge
server host, port, timeout Netzwerk-Binding
inference temperature, top_p, max_tokens, stop_tokens Sampling-Defaults
monitoring enable_prometheus, metrics_port Metriken

Tipp: Für schnelle Inferenz QLoRA-Training + merge_adapter: true (voller Präzision) verwenden. Für minimalen VRAM-Verbrauch load_in_4bit: true setzen.

Docker

make docker-build      # Image bauen
make docker-run        # Container starten (GPU)
make docker-logs       # Logs verfolgen
make docker-stop       # Container stoppen

Oder direkt via Compose:

docker-compose up -d

Siehe Dockerfile und docker-compose.yml.

Modellagnostik

Der Server ist nicht an Qwen2.5-Coder gebunden. Jedes von Hugging Face Transformers unterstützte, FIM-fähige Code-LLM kann als base_model konfiguriert werden. Modell- spezifische FIM-Tokens werden client-seitig im Plugin (FIMFormatter) gekapselt.

Verzeichnisstruktur

model-server/
├── server.py             # FastAPI-App + Endpunkte
├── src/
│   ├── model_loader.py   # Laden von Basis-Modell + Adapter
│   ├── health_monitor.py # Health-/Status-Tracking
│   └── utils.py
├── scripts/
│   ├── setup_model.sh    # Modell verlinken/kopieren
│   └── test_server.py    # Server-Smoke-Test
├── config.yaml
├── Dockerfile
├── docker-compose.yml
└── models/               # (gitignored) bereitgestelltes Modell