Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
d7d28ee
🤖 ART: Agent Reinforcement Trainer — GRPO Config
mark-baumann Jul 28, 2026
2443ff6
🤖 ART: GRPO-Training mit LoRA — Reward-Modell, Trainingsskript, Doku
mark-baumann Jul 28, 2026
ec8dc87
Aufräumen: Ungenutzte Imports entfernt, Unit-Tests für Reward-Modell …
mark-baumann Jul 29, 2026
f776430
Code-Qualität: Import-Sortierung mit ruff korrigiert
mark-baumann Jul 29, 2026
7f91e5f
📱 Streamlit-App: Interaktive Demo
mark-baumann Jul 29, 2026
f25a77a
Streamlit-App: GRPO-Training konfigurieren, Reward-Modell testen, LoR…
mark-baumann Jul 29, 2026
c1a56b4
Code-Qualität: Ungenutzte Imports entfernt, Import-Sortierung mit ruf…
mark-baumann Jul 30, 2026
47a9822
docs: README.md hinzugefügt
mark-baumann Jul 30, 2026
d03203b
📁 Aufgeräumt: app/ Ordner
mark-baumann Jul 30, 2026
82c186b
Add GRPO-Training Jupyter Notebook (Deutsch)
mark-baumann Jul 30, 2026
edaf20c
🐳 Dockerfile + CI/CD-Bereit
mark-baumann Jul 30, 2026
7070bca
ci: deploy-workflow für art-agent (Port 8519)
mark-baumann Jul 30, 2026
1d97626
🔄 deployment-pipeline → infrastruktur-deployment
mark-baumann Jul 30, 2026
e71a320
chore: .gitignore um wandb_runs/, checkpoints/, *.jsonl erweitert
mark-baumann Jul 30, 2026
55578d2
chore: autoupdate  add .gitignore entries
Aug 3, 2026
28d3581
feat(AUG-15): deploy.yml — pull_request trigger + @master fix
mark-baumann Aug 7, 2026
74e85c3
Add streamlit>=1.28.0 to requirements.txt for Streamlit web app
mark-baumann Aug 10, 2026
0750c2f
Fix: image_name=art (lowercase) damit ghcr.io Tag valide ist
mark-baumann Aug 10, 2026
e38c2d9
Mit Colab erstellt
mark-baumann Sep 9, 2026
9cc1a48
Doppelte Google Colab Buttons entfernt
mark-baumann Sep 9, 2026
6a5299c
Merge branch 'main' into mark-baumann-patch-1
mark-baumann Sep 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: Deploy

on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:
inputs:
service_name:
required: true
type: string
description: "Docker-Compose service name"
port:
required: true
type: string
description: "Service port"

jobs:
deploy:
uses: mark-baumann/infrastruktur-deployment/.github/workflows/build-deploy.yml@master
with:
service_name: ${{ inputs.service_name || 'art-agent' }}
port: ${{ inputs.port || '8519' }}
image_name: art
secrets: inherit
31 changes: 31 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# ═══════════════════════════════════════════════════════════════
# Dockerfile — Standard-Template für alle Streamlit-Apps
# ═══════════════════════════════════════════════════════════════
# Kopiere diese Datei in jedes App-Repo und passe PORT an.

FROM python:3.12-slim

WORKDIR /app

# System-Abhängigkeiten
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \
&& rm -rf /var/lib/apt/lists/*

# Python-Abhängigkeiten
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# App-Code
COPY . .

# Port (pro App anpassen: 8501-8519)
ARG PORT=8519
EXPOSE $PORT

# Healthcheck
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
CMD python -c "import urllib.request;urllib.request.urlopen('http://localhost:${PORT}/_stcore/health')"

# Streamlit
CMD streamlit run app/app.py --server.port=$PORT --server.address=0.0.0.0 --server.headless=true
149 changes: 149 additions & 0 deletions GRPO_TRAINING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
# ART – GRPO-Training mit LoRA

Ergänzende Trainingsskripte für **Group Relative Policy Optimization (GRPO)** mit
**Low-Rank Adaptation (LoRA)** im OpenPipe ART Framework.

## 📁 Dateien

| Datei | Beschreibung |
|-------|-------------|
| `config.py` | Trainingskonfigurationen (Model, LoRA, GRPO, Reward, Data) |
| `reward_model.py` | Reward-Modell für Agent-Bewertung (regelbasiert + modellbasiert) |
| `train_agent.py` | Haupt-Trainingsskript für GRPO mit LoRA |

## 🚀 Schnellstart

### 1. Installation

```bash
# Im ART-Repository (Dependencies sind bereits in pyproject.toml)
uv sync --extra backend
```

### 2. Training starten

```bash
# Standard-Training mit Qwen 2.5 7B
python train_agent.py

# Training mit Llama 3.1 8B
python train_agent.py --model llama

# Schneller Test-Modus (Qwen 1.5B, wenige Steps)
python train_agent.py --test-mode

# Mit eigenen Daten
python train_agent.py --train-file data/my_tasks.jsonl --eval-file data/my_eval.jsonl

# Ohne W&B-Logging
python train_agent.py --no-wandb

# Mit angepasster Learning Rate
python train_agent.py --learning-rate 1e-5 --max-steps 500
```

## ⚙️ Konfiguration

### Vordefinierte Konfigurationen

```python
from config import get_qwen_config, get_llama_config, get_small_test_config

# Qwen 2.5 7B (Standard)
config = get_qwen_config()

# Llama 3.1 8B
config = get_llama_config()

# Test-Modus (Qwen 1.5B)
config = get_small_test_config()
```

### Benutzerdefinierte Konfiguration

```python
from config import TrainingConfig, ModelConfig, LoRAConfig, GRPOConfig

config = TrainingConfig(
model=ModelConfig(
model_name_or_path="Qwen/Qwen2.5-7B-Instruct",
load_in_4bit=True,
),
lora=LoRAConfig(
r=16,
lora_alpha=32,
lora_dropout=0.05,
),
grpo=GRPOConfig(
learning_rate=5e-6,
num_generations=4,
beta=0.04,
max_steps=1000,
),
experiment_name="my-experiment",
)
```

## 🎯 Reward-Modell

Das Reward-Modell bewertet Agent-Antworten anhand von 5 Kriterien:

| Kriterium | Gewicht | Beschreibung |
|-----------|---------|-------------|
| `correctness` | 1.0 | Fachliche Korrektheit der Antwort |
| `format` | 0.3 | Struktur und Formatierung |
| `helpfulness` | 0.5 | Nützlichkeit und Verständlichkeit |
| `safety` | 0.8 | Sicherheit (keine schädlichen Inhalte) |
| `tool_usage` | 0.4 | Korrekte Nutzung von Tools |

### Verwendung

```python
from reward_model import AgentRewardModel, create_reward_function

# Regelbasiert (schnell, keine GPU nötig)
reward_model = AgentRewardModel(
reward_weights={"correctness": 1.0, "safety": 0.8},
use_model=False,
)

# Reward berechnen
result = reward_model.compute_reward(
prompt="Erkläre Quantencomputing",
completion="Quantencomputing nutzt Qubits...",
ground_truth="Quantencomputing verwendet Quantenbits...",
)
print(f"Total Reward: {result['total']:.3f}")

# Als TRL-kompatible Reward-Funktion
reward_func = create_reward_function(reward_model)
```

## 📊 Trainingsdaten-Format

JSONL-Datei mit einem `prompt`-Feld pro Zeile:

```jsonl
{"prompt": "Erkläre den Unterschied zwischen GRPO und PPO."}
{"prompt": "Schreibe eine Python-Funktion für Binary Search."}
{"prompt": "Was ist der Unterschied zwischen TCP und UDP?"}
```

## 🔧 Abhängigkeiten

Alle Abhängigkeiten sind bereits im ART-`pyproject.toml` unter dem `backend`-Extra definiert:

- `transformers>=5.2.0`
- `peft>=0.14.0`
- `trl==0.20.0`
- `torch==2.11.0`
- `bitsandbytes>=0.45.2`
- `datasets` (via HuggingFace)
- `accelerate==1.7.0`

## 📝 Hinweise

- **GPU**: Für 7B/8B-Modelle wird eine GPU mit ≥24GB VRAM empfohlen (mit 4-bit Quantisierung).
- **Test-Modus**: `--test-mode` nutzt Qwen 1.5B ohne Quantisierung – läuft auch auf kleineren GPUs.
- **Daten**: Ohne `--train-file` wird ein synthetischer Demo-Datensatz verwendet.
- **W&B**: Standardmäßig wird zu Weights & Biases geloggt. Mit `--no-wandb` deaktivierbar.
Loading