iT邦幫忙

2025 iThome 鐵人賽

DAY 6
0
生成式 AI

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

[Day 6] 日誌與結果管理:讓每次實驗有自己的家

  • 分享至 

  • xImage
  •  

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


在前幾天,我們已經能順利完成訓練、管理資料、集中配置。但隨著實驗次數一多,新的問題立刻浮現:

  • 訓練日誌在一個資料夾,模型存在另一個地方,配置檔又散落各處。
  • 過了一週後,完全不記得某個模型到底對應哪份設定。
  • 新的實驗結果常常覆蓋舊的,想比較差異卻找不到依據。

問題其實不在模型,而在於 結果沒有家
所以 Day 6 的目標,就是幫每一次實驗建立一個完整的「家」。


實作過程

1. 實驗資料夾自動化

每次訓練,系統會自動建立一個新的實驗資料夾:

results/
└── {experiment_name}_{timestamp}/
    ├── logs.txt        # 訓練日誌
    ├── config.yaml     # 當次有效配置
    ├── metrics.json    # 訓練與評估指標
    └── artifacts/      # 模型與相關產物
        └── final_model/
  • {experiment_name} 來自配置或 CLI
  • {timestamp} 保證唯一性,避免覆蓋舊實驗

2. 全面封裝實驗紀錄

一次實驗的所有資訊都會被收進這個資料夾,包括:

  • logs.txt:完整訓練日誌與進度輸出
  • config.yaml:保存當次有效配置,確保可重現
  • metrics.json:記錄結構化的訓練與評估指標
  • artifacts/:模型 checkpoint 與最終模型

👉 結果不再是散落的檔案,而是 可追蹤、可比較、可重現的實驗資產


3. 日誌系統升級

為了方便分析,我把日誌分成兩條「軌道」:

  1. 全域日誌:記錄模型載入、設備檢測、錯誤訊息,輸出到終端與檔案。
  2. Progress 日誌:專門記錄訓練進度(loss、learning rate、step),只寫入 logs.txt,並以 PROGRESS 標籤區隔。

例子:

2024-03-15 14:30:22 - INFO - 載入模型與 tokenizer...
2024-03-15 14:30:23 - PROGRESS - Step 10: loss=0.6932 | lr=0.0005

這樣一來,讀 log 檔時就能快速區分「系統訊息」與「訓練數據」。


Day 6 的重點不只是把檔案整理好,而是替後續的功能奠定基礎。透過實驗資料夾的自動化建立與完整封裝,我們讓日誌、配置、指標與模型產物都集中在同一處,結果因此變得可追蹤、可比較、也能完整重現。這樣的結構化設計,不僅解決了「實驗沒有家」的混亂問題,也為接下來的任務排程、模型評估與實驗追蹤做好準備,讓實驗成果真正成為可管理、可積累的資產。


📎 AI 協作記錄:今日開發指令

請幫我修改 train_lora_v2.py,讓每次訓練開始時自動建立一個專屬資料夾(experiment run folder),並把所有結果集中保存。

需求:
1. 資料夾命名規則:
   results/{experiment_name}_{timestamp}/
   - experiment_name 從 config.experiment_name 取得
   - timestamp 使用 YYYYMMDD_HHMMSS
2. 資料夾結構:
   - logs.txt(寫入訓練過程的日誌)
   - config.yaml(保存本次有效配置)
   - metrics.json(保存最終評估指標)
   - artifacts/(保存模型、checkpoint、圖表等)
3. 修改 logger 與保存流程,確保所有輸出都寫入該資料夾
4. 確保舊實驗不會被覆蓋,每次都建立新資料夾


上一篇
[Day 5] 訓練參數與 Config 設計:建立統一的配置系統
下一篇
[Day 7] 任務排程基礎:Celery + Redis 的非同步訓練
系列文
打造 AI 微調平台:從系統設計到 AI 協作的 30 天實戰筆記7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言