完整程式碼可在 GitHub 專案中找到:Finetune-30-days-demo / day-9
在 Day 6,我們已經能把實驗結果(logs、metrics、config、模型產出)集中存放到 results/{experiment_name}_{timestamp}/
。
這樣雖然完整,但還有幾個痛點:
而今天的目標就是把這些結果寫進 資料庫 (DB),並且透過 API 和前端頁面查詢,形成一個最小版的 實驗追蹤系統 (Experiment Tracking System)。
新增 results/experiments.db
,結構如下:
experiments (
id TEXT PRIMARY KEY, -- task_id 或 UUID
name TEXT, -- 實驗名稱
created_at TIMESTAMP, -- 建立時間
config_path TEXT, -- 配置檔路徑
train_runtime FLOAT, -- 訓練耗時
eval_accuracy FLOAT, -- 驗證準確率
log_path TEXT -- 日誌檔路徑
)
在 train_lora_v2.py
訓練結束時,會自動把本次實驗的
準確率、耗時、配置路徑、日誌路徑 一併寫進 DB。
檔案系統依舊保留完整紀錄,但 DB 提供了「索引」功能,方便搜尋和比較。
在 FastAPI 新增兩個 endpoint:
GET /experiments
→ 列出所有實驗(支援排序、篩選)GET /experiments/{id}
→ 查詢單一實驗詳細資料查詢結果以 JSON 回傳,例如:
{
"id": "4a5b6c78-d123-45ef-9abc-9876543210ff",
"name": "test_exp",
"created_at": "2025-09-01T22:39:08",
"config_path": "results/test_exp_20250901/config.yaml",
"train_runtime": 10.7,
"eval_accuracy": 0.82,
"log_path": "results/test_exp_20250901/logs.txt"
}
在 Streamlit UI 新增 「實驗記錄」 頁籤,讓使用者能:
這樣就把「提交 → 追蹤 → 查詢」完整串接起來。
在 Makefile 中也加入了方便的指令:
make db-list # 查看實驗記錄(表格形式)
make logs-local # 查看最新實驗的訓練進度
Day 9 的成果是讓實驗結果不再只是零散的檔案,而是同時有「檔案完整保存」與「DB 快速索引」。這代表我們能用 API、UI 或 CLI 指令快速查詢、比對實驗結果,準確率、耗時、配置一目了然,大幅降低了搜尋與比較的成本。
更重要的是,這一步讓系統正式跨過「能跑」的門檻,開始具備「可追蹤」的能力。它不僅幫助個人更好地管理實驗,也為團隊協作和平台化部署鋪路。接下來的 GPU 資源調度、效能監控與互動式前端,才能在這個基礎上持續累積與擴展。
📎 AI 協作記錄:今日開發指令
請幫我在現有專案中新增「最小實驗追蹤系統」功能,具體需求如下:
1. 使用 SQLite 作為資料庫(檔名為 results/experiments.db)。
2. 建立一個 experiments 資料表,包含以下欄位:
- id (TEXT, primary key) → 使用 task_id 或 UUID
- name (TEXT) → 實驗名稱
- created_at (TIMESTAMP) → 實驗開始時間
- config_path (TEXT) → 使用的配置檔路徑
- train_runtime (FLOAT) → 訓練耗時
- eval_accuracy (FLOAT) → 驗證準確率
- log_path (TEXT) → 日誌檔路徑
3. 在 train_lora_v2.py 訓練結束時,自動把實驗結果寫入 DB。
4. 新增 FastAPI API:
- GET /experiments → 列出所有實驗(可排序、可篩選)
- GET /experiments/{id} → 查詢單一實驗詳細結果
5. 請確保程式碼結構清晰,資料庫操作抽離到單獨的模組 (app/db.py)。
6. 保持與現有 results/ 檔案輸出相容:即檔案仍然會保存,但額外寫一份索引到 DB。