iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
生成式 AI

打造 AI 微調平台:從系統設計到 AI 協作的 30 天實戰筆記系列 第 9

[Day 9] 最小實驗追蹤系統:把結果放進 DB,查詢與比較

  • 分享至 

  • xImage
  •  

完整程式碼可在 GitHub 專案中找到:Finetune-30-days-demo / day-9


在 Day 6,我們已經能把實驗結果(logs、metrics、config、模型產出)集中存放到 results/{experiment_name}_{timestamp}/
這樣雖然完整,但還有幾個痛點:

  1. 不易搜尋:要比較多個實驗結果時,只能手動翻目錄。
  2. 缺乏比較:準確率、耗時、配置等資訊無法快速對照。
  3. 團隊協作困難:不同人做的實驗分散在檔案夾中,難以建立統一索引。

而今天的目標就是把這些結果寫進 資料庫 (DB),並且透過 API 和前端頁面查詢,形成一個最小版的 實驗追蹤系統 (Experiment Tracking System)


今日優化

1. 建立 SQLite 實驗資料表

新增 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              -- 日誌檔路徑
)

2. 訓練程式自動寫入 DB

train_lora_v2.py 訓練結束時,會自動把本次實驗的
準確率、耗時、配置路徑、日誌路徑 一併寫進 DB。

檔案系統依舊保留完整紀錄,但 DB 提供了「索引」功能,方便搜尋和比較。

3. API 查詢介面

在 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"
}

4. 前端頁面整合

在 Streamlit UI 新增 「實驗記錄」 頁籤,讓使用者能:

  • 提交任務:輸入參數 → 生成新實驗
  • 追蹤進度:輸入 task_id → 查看即時狀態
  • 實驗記錄:查詢 DB → 以表格形式顯示所有實驗

這樣就把「提交 → 追蹤 → 查詢」完整串接起來。

5. 命令列工具

在 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。

上一篇
[Day 8] 最小化 UI:Streamlit 任務提交與追蹤
下一篇
[Day 10] 系統互動解析:從提交任務到完成結果
系列文
打造 AI 微調平台:從系統設計到 AI 協作的 30 天實戰筆記10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言