feat: training pipeline for all 10 ML ensemble models

- Add standalone training binaries: TGGN, KAN, xLSTM, Diffusion (DBN data)
- Update Dockerfile.training: 6 → 16 binaries (all 10 models + hyperopt + baseline)
- Expand train.sh: 4 → 10 models, fix registry URL and GPU pool nodeSelector
- Add GPU overlay manifests for trading-service and ml-training-service
- Create training data PVC and upload pod manifests
- Expand web-gateway model validation: 4 → 10 types (training + tune routes)
- Extend dashboard: 10 model cards grouped by category (RL/Temporal/Graph/Generative)
- Add training image build job to Gitea CI workflow
- Update GPU taint controller to exclude inference pool from tainting
- Fix job-template nodeSelector: gpu → gpu-training

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
jgrusewski
2026-02-24 20:47:50 +01:00
parent e45bda9412
commit 5fb84a02f0
19 changed files with 3602 additions and 35 deletions

View File

@@ -4,7 +4,7 @@ interface Props {
predictions?: MlPrediction[];
}
const MODELS = ['DQN', 'PPO', 'TFT', 'Mamba2'];
const MODELS = ['DQN', 'PPO', 'TFT', 'Mamba2', 'xLSTM', 'TGGN', 'TLOB', 'LNN', 'KAN', 'Diffusion'];
export function EnsemblePanel({ predictions = [] }: Props) {
// Count votes

View File

@@ -13,7 +13,12 @@ interface RegimeData {
duration?: string;
}
const MODELS = ['DQN', 'PPO', 'TFT', 'Mamba2'] as const;
const MODEL_GROUPS = [
{ label: 'Reinforcement Learning', models: ['DQN', 'PPO'] },
{ label: 'Temporal', models: ['TFT', 'Mamba2', 'xLSTM'] },
{ label: 'Graph / Structure', models: ['TGGN', 'TLOB', 'LNN'] },
{ label: 'Generative', models: ['KAN', 'Diffusion'] },
] as const;
export function MLDashboard() {
const predictions = useApiQuery<MlPrediction[]>(
@@ -46,25 +51,34 @@ export function MLDashboard() {
</div>
)}
{/* Model Cards */}
{/* Model Cards grouped by category */}
<ComponentErrorBoundary name="Model Cards">
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
{MODELS.map((model) => {
const pred = preds.find((p) => p.model === model);
return (
<div
key={model}
className="rounded border border-[var(--color-border)] bg-[var(--color-bg-card)]"
>
<ModelCard
model={model}
signal={pred?.signal}
confidence={pred?.confidence}
predictedReturn={pred?.predicted_return}
/>
<div className="space-y-4">
{MODEL_GROUPS.map((group) => (
<div key={group.label}>
<h3 className="text-xs font-semibold uppercase tracking-wider text-[var(--color-text-secondary)] mb-2">
{group.label}
</h3>
<div className="grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-5 gap-4">
{group.models.map((model) => {
const pred = preds.find((p) => p.model === model);
return (
<div
key={model}
className="rounded border border-[var(--color-border)] bg-[var(--color-bg-card)]"
>
<ModelCard
model={model}
signal={pred?.signal}
confidence={pred?.confidence}
predictedReturn={pred?.predicted_return}
/>
</div>
);
})}
</div>
);
})}
</div>
))}
</div>
</ComponentErrorBoundary>