194 lines
6.9 KiB
PHP
Executable File
194 lines
6.9 KiB
PHP
Executable File
<?php
|
|
require_once("/opt/wevads/config/credentials.php");
|
|
header('Content-Type: application/json');
|
|
header('Access-Control-Allow-Origin: *');
|
|
|
|
$db_config = [
|
|
'host' => 'localhost',
|
|
'dbname' => 'wevads',
|
|
'user' => 'admin',
|
|
'password' => WEVADS_DB_PASS
|
|
];
|
|
|
|
try {
|
|
$pdo = new PDO(
|
|
"pgsql:host={$db_config['host']};dbname={$db_config['dbname']}",
|
|
$db_config['user'],
|
|
$db_config['password'],
|
|
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
|
|
);
|
|
|
|
$pdo->exec("SET search_path TO admin, public;");
|
|
|
|
$action = $_GET['action'] ?? 'status';
|
|
|
|
switch ($action) {
|
|
case 'start':
|
|
$modelId = $_GET['model_id'] ?? null;
|
|
$datasetId = $_GET['dataset_id'] ?? null;
|
|
|
|
if (!$modelId || !$datasetId) {
|
|
echo json_encode(['status' => 'error', 'message' => 'model_id et dataset_id requis']);
|
|
break;
|
|
}
|
|
|
|
// Créer un job d'entraînement
|
|
$stmt = $pdo->prepare("
|
|
INSERT INTO admin.deepseek_training_jobs
|
|
(model_id, status, training_start, total_epochs)
|
|
VALUES (:model_id, 'running', NOW(), :epochs)
|
|
RETURNING id
|
|
");
|
|
|
|
$stmt->execute([
|
|
':model_id' => $modelId,
|
|
':epochs' => $_GET['epochs'] ?? 100
|
|
]);
|
|
|
|
$jobId = $stmt->fetchColumn();
|
|
|
|
// Simulation d'entraînement (en réalité, appeler un script Python)
|
|
echo json_encode([
|
|
'status' => 'success',
|
|
'message' => 'Job d\'entraînement démarré',
|
|
'job_id' => $jobId,
|
|
'model_id' => $modelId,
|
|
'dataset_id' => $datasetId,
|
|
'estimated_time' => '15-30 minutes',
|
|
'progress_url' => '/api/deepseek-training.php?action=progress&job_id=' . $jobId
|
|
]);
|
|
break;
|
|
|
|
case 'progress':
|
|
$jobId = $_GET['job_id'] ?? null;
|
|
|
|
if (!$jobId) {
|
|
echo json_encode(['status' => 'error', 'message' => 'job_id requis']);
|
|
break;
|
|
}
|
|
|
|
$stmt = $pdo->prepare("SELECT * FROM admin.deepseek_training_jobs WHERE id = :id");
|
|
$stmt->execute([':id' => $jobId]);
|
|
$job = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
|
|
if (!$job) {
|
|
echo json_encode(['status' => 'error', 'message' => 'Job non trouvé']);
|
|
break;
|
|
}
|
|
|
|
// Simuler la progression
|
|
$progress = 0;
|
|
if ($job['status'] === 'running') {
|
|
$progress = min(100, ($job['epochs_completed'] / ($job['total_epochs'] ?: 100)) * 100);
|
|
$progress = round($progress + rand(1, 5)); // Simulation
|
|
|
|
// Mettre à jour la progression
|
|
$pdo->prepare("
|
|
UPDATE admin.deepseek_training_jobs
|
|
SET epochs_completed = :epochs, loss_value = :loss
|
|
WHERE id = :id
|
|
")->execute([
|
|
':epochs' => min($job['total_epochs'], $job['epochs_completed'] + 5),
|
|
':loss' => max(0.001, $job['loss_value'] - rand(0.001, 0.01)),
|
|
':id' => $jobId
|
|
]);
|
|
}
|
|
|
|
echo json_encode([
|
|
'status' => 'success',
|
|
'job' => $job,
|
|
'progress' => $progress . '%',
|
|
'estimated_completion' => $progress >= 100 ? 'Terminé' : '10-15 minutes',
|
|
'metrics' => [
|
|
'loss' => $job['loss_value'] ?? 0.1234,
|
|
'accuracy' => $job['accuracy_value'] ?? null
|
|
]
|
|
]);
|
|
break;
|
|
|
|
case 'jobs':
|
|
$status = $_GET['status'] ?? 'all';
|
|
|
|
$query = "SELECT * FROM admin.deepseek_training_jobs";
|
|
$params = [];
|
|
|
|
if ($status !== 'all') {
|
|
$query .= " WHERE status = :status";
|
|
$params[':status'] = $status;
|
|
}
|
|
|
|
$query .= " ORDER BY created_at DESC LIMIT 50";
|
|
|
|
$stmt = $pdo->prepare($query);
|
|
$stmt->execute($params);
|
|
$jobs = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
// Statistiques des jobs
|
|
$stats = $pdo->query("
|
|
SELECT
|
|
status,
|
|
COUNT(*) as count,
|
|
ROUND(AVG(EXTRACT(EPOCH FROM (training_end - training_start))), 2) as avg_duration_seconds
|
|
FROM admin.deepseek_training_jobs
|
|
GROUP BY status
|
|
")->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
echo json_encode([
|
|
'status' => 'success',
|
|
'jobs' => $jobs,
|
|
'statistics' => $stats,
|
|
'total_jobs' => count($jobs)
|
|
]);
|
|
break;
|
|
|
|
case 'hyperparams':
|
|
$modelId = $_GET['model_id'] ?? null;
|
|
|
|
if ($modelId) {
|
|
$stmt = $pdo->prepare("SELECT * FROM admin.deepseek_hyperparams WHERE model_id = :model_id");
|
|
$stmt->execute([':model_id' => $modelId]);
|
|
$params = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
} else {
|
|
$params = $pdo->query("SELECT * FROM admin.deepseek_hyperparams ORDER BY created_at DESC")->fetchAll(PDO::FETCH_ASSOC);
|
|
}
|
|
|
|
echo json_encode([
|
|
'status' => 'success',
|
|
'hyperparameters' => $params,
|
|
'defaults' => [
|
|
'learning_rate' => 0.001,
|
|
'batch_size' => 32,
|
|
'epochs' => 100,
|
|
'optimizer' => 'adam'
|
|
]
|
|
]);
|
|
break;
|
|
|
|
default:
|
|
echo json_encode([
|
|
'status' => 'error',
|
|
'message' => 'Action non reconnue',
|
|
'endpoints' => [
|
|
'GET ?action=jobs' => 'Liste des jobs d\'entraînement',
|
|
'GET ?action=start&model_id=X&dataset_id=Y' => 'Démarrer un entraînement',
|
|
'GET ?action=progress&job_id=X' => 'Progression d\'un job',
|
|
'GET ?action=hyperparams&model_id=X' => 'Hyperparamètres d\'un modèle'
|
|
]
|
|
]);
|
|
}
|
|
|
|
} catch (PDOException $e) {
|
|
echo json_encode([
|
|
'status' => 'error',
|
|
'message' => 'Erreur base de données: ' . $e->getMessage(),
|
|
'fallback' => [
|
|
'status' => 'training_simulation',
|
|
'jobs' => [
|
|
['id' => 1, 'model_id' => 1, 'status' => 'running', 'progress' => '65%'],
|
|
['id' => 2, 'model_id' => 2, 'status' => 'completed', 'accuracy' => '98.7%']
|
|
]
|
|
]
|
|
]);
|
|
}
|
|
?>
|