Files
AItrackwalker/model-training/railtrain/static/index.html
T

139 lines
4.5 KiB
HTML

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>AItrackwalker 模型训练中心</title>
<link rel="stylesheet" href="/styles.css">
</head>
<body>
<header class="topbar">
<div>
<p class="eyebrow">AItrackwalker · Local GPU Workbench</p>
<h1>模型训练中心</h1>
</div>
<div class="topbar-actions">
<span id="connectionStatus" class="connection-status">正在连接</span>
<button id="refreshButton" type="button">刷新数据</button>
</div>
</header>
<main class="layout">
<aside class="sidebar" aria-label="训练任务">
<div class="section-heading">
<div>
<p class="eyebrow">Runs</p>
<h2>训练任务</h2>
</div>
<span id="runCount" class="count">0</span>
</div>
<div id="runList" class="run-list"></div>
<div id="emptyRuns" class="empty-state" hidden>
<p>还没有训练记录。</p>
<code>python -m railtrain demo</code>
</div>
</aside>
<section class="content" aria-live="polite">
<div id="emptySelection" class="welcome">
<p class="eyebrow">RTX 3090 Ready</p>
<h2>选择一条训练任务查看曲线</h2>
<p>看板会读取本地 JSONL 指标,不上传模型、日志或数据集。</p>
</div>
<div id="runDetail" hidden>
<div class="detail-header">
<div>
<div class="title-row">
<span id="runStatus" class="status-badge">未知</span>
<span id="runTask" class="task-label"></span>
</div>
<h2 id="runName">训练任务</h2>
<p id="runDescription" class="description"></p>
</div>
<div class="updated-at">
<span>最近刷新</span>
<strong id="updatedAt"></strong>
</div>
</div>
<div class="stats" aria-label="训练摘要">
<article>
<span>当前 Epoch</span>
<strong id="epochValue"></strong>
<small id="stepValue">尚无 step</small>
</article>
<article>
<span>最新 Loss</span>
<strong id="lossValue"></strong>
<small id="lossTrend">等待指标</small>
</article>
<article>
<span id="qualityLabel">最佳指标</span>
<strong id="qualityValue"></strong>
<small id="qualityContext">等待评估</small>
</article>
<article>
<span>GPU / 显存</span>
<strong id="gpuValue"></strong>
<small id="gpuContext">等待采样</small>
</article>
</div>
<section class="panel">
<div class="panel-heading">
<div>
<p class="eyebrow">Optimization</p>
<h3>训练曲线</h3>
</div>
<div class="legend" aria-label="训练曲线图例">
<span><i class="loss-dot"></i>Loss</span>
<span><i class="quality-dot"></i><b id="qualityLegend">mAP</b></span>
</div>
</div>
<div id="trainingChart" class="chart" role="img" aria-label="Loss 和质量指标训练曲线"></div>
</section>
<section class="panel">
<div class="panel-heading">
<div>
<p class="eyebrow">Hardware</p>
<h3>RTX 3090 负载</h3>
</div>
<div class="legend" aria-label="GPU 曲线图例">
<span><i class="gpu-dot"></i>利用率</span>
<span><i class="memory-dot"></i>显存</span>
</div>
</div>
<div id="gpuChart" class="chart compact" role="img" aria-label="GPU 利用率和显存占用曲线"></div>
</section>
<div class="lower-grid">
<section class="panel">
<div class="panel-heading">
<div>
<p class="eyebrow">Run Metadata</p>
<h3>任务信息</h3>
</div>
</div>
<dl id="metadata" class="metadata"></dl>
</section>
<section class="panel">
<div class="panel-heading">
<div>
<p class="eyebrow">Latest Output</p>
<h3>最近日志</h3>
</div>
</div>
<pre id="logOutput">等待日志…</pre>
</section>
</div>
</div>
</section>
</main>
<script src="/app.js" defer></script>
</body>
</html>