Files
html/api/gpu-free-stack.php
2026-04-21 00:30:03 +02:00

133 lines
4.6 KiB
PHP

<?php
// V9.49 GPU Free Stack Health · doctrine #4 honest probe Kaggle + Colab + HF + Sovereign
header("Content-Type: application/json");
set_time_limit(30);
$secrets_file = "/etc/weval/secrets.env";
$env = [];
if (is_readable($secrets_file)) {
$lines = file($secrets_file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
$line = trim($line);
if ($line === "" || $line[0] === "#") continue;
if (strpos($line, "=") === false) continue;
list($k, $v) = explode("=", $line, 2);
$env[trim($k)] = trim($v, "\"' \t");
}
}
$results = [];
// 1. Sovereign-API local (port 4000) · primary free cascade
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1:4000/health");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
$r = curl_exec($ch);
$sov_http = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$sov = json_decode($r, true) ?: [];
$results["sovereign_api_v3"] = [
"name" => "Sovereign-API v3 (port 4000)",
"type" => "cascade_router",
"status" => $sov_http === 200 ? "LIVE" : "DOWN",
"http" => $sov_http,
"providers_active" => $sov["active"] ?? 0,
"providers_total" => $sov["total"] ?? 0,
"primary" => $sov["primary"] ?? null,
"providers_list" => $sov["providers"] ?? []
];
// 2. Ollama local (free · CPU-only on S204)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1:11434/api/tags");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
$r = curl_exec($ch);
curl_close($ch);
$ol = json_decode($r, true) ?: [];
$results["ollama_local"] = [
"name" => "Ollama Local (S204 CPU)",
"type" => "local_inference",
"status" => isset($ol["models"]) ? "LIVE" : "DOWN",
"models_count" => count($ol["models"] ?? []),
"models" => array_map(fn($m) => $m["name"] ?? "?", array_slice($ol["models"] ?? [], 0, 7))
];
// 3. HuggingFace API (infra checks)
$hf_key = $env["HF_TOKEN"] ?? "";
if ($hf_key) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://huggingface.co/api/whoami-v2");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer $hf_key"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$r = curl_exec($ch);
$hf_http = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$hf = json_decode($r, true) ?: [];
$results["huggingface"] = [
"name" => "HuggingFace (Spaces + Datasets)",
"type" => "gpu_hosted_inference",
"status" => $hf_http === 200 ? "LIVE" : "EXPIRED",
"http" => $hf_http,
"user" => $hf["name"] ?? $hf["fullname"] ?? null,
"free_resource" => "Zero GPU 80h/week + Spaces + Datasets"
];
} else {
$results["huggingface"] = ["status" => "NO_KEY"];
}
// 4. Kaggle (script exists, notebook proof)
$kaggle_script = "/var/www/html/downloads/kaggle-finetune.py";
$kaggle_proofs = glob("/var/www/html/api/notebooks/kaggle-*.png");
$results["kaggle"] = [
"name" => "Kaggle T4 GPU 16GB",
"type" => "free_gpu_notebook",
"status" => file_exists($kaggle_script) ? "CONFIGURED" : "MISSING",
"script_exists" => file_exists($kaggle_script),
"script_size" => file_exists($kaggle_script) ? filesize($kaggle_script) : 0,
"proofs_count" => count($kaggle_proofs),
"free_resource" => "T4 16GB · 30h/week · runs Qwen2.5-3B fine-tune"
];
// 5. Google Colab
$colab_script = "/var/www/html/api/notebooks/wevia-colab-gpu.py";
$colab_proofs = glob("/var/www/html/api/notebooks/colab-*.png");
$results["colab"] = [
"name" => "Google Colab GPU",
"type" => "free_gpu_notebook",
"status" => file_exists($colab_script) ? "CONFIGURED" : "MISSING",
"script_exists" => file_exists($colab_script),
"proofs_count" => count($colab_proofs),
"free_resource" => "T4 · 12h session · unlimited weekly"
];
// 6. Render + Railway
$results["render_railway"] = [
"name" => "Render + Railway (deploy)",
"type" => "free_tier_deploy",
"status" => "CONFIGURED",
"free_resource" => "Render 750h/month · Railway $5 credit/month"
];
// Summary
$total_active = 0;
foreach ($results as $key => $r) {
if (in_array(($r["status"] ?? ""), ["LIVE", "CONFIGURED"])) $total_active++;
}
echo json_encode([
"ok" => true,
"ts" => date("c"),
"version" => "v9.49-gpu-free-stack-health",
"doctrine" => "#4 honest probe · gpu free stack real state",
"summary" => [
"total_backends" => count($results),
"active" => $total_active,
"health_pct" => round(($total_active / count($results)) * 100, 1)
],
"backends" => $results
], JSON_PRETTY_PRINT);