完整程式碼可在 GitHub 專案中找到:Finetune-30-days-demo / day-5
從今天開始,為了呼應這個系列的主題——AI 協作實戰筆記,我會在文章的末尾加上一個小小的「附錄」,整理我當天在 Cursor 下給 AI 的主要指令。
這些指令通常會生成一個能跑的初稿,但實際開發中我會再針對參數驗證、檔案結構與維護性做額外修改。
在 Day 4,我們解決了資料版本與品質的問題。接下來遇到的新挑戰是:隨著專案規模增加,訓練參數開始散落各處 —— 有些寫在 train_lora.py
,有些藏在 Makefile。這樣會帶來三個痛點:
因此,Day 5 的任務就是:打造單一可信來源(Single Source of Truth)的配置系統,讓實驗能夠一致、安全、可重現。
在 app/config.py 中,用 Pydantic 定義 Config,集中管理所有參數並自動驗證:
class TrainingConfig(BaseModel):
learning_rate: float = Field(5e-4, gt=0, le=1e-2)
batch_size: int = Field(2, ge=1, le=64)
epochs: int = Field(1, ge=1, le=100)
class Config(BaseModel):
experiment_name: str = "default_experiment"
training: TrainingConfig = TrainingConfig()
這樣能避免參數散落各處,並在訓練前就擋下無效設定。
所有預設值統一寫在 config/default.yaml,修改時不用動程式碼:
experiment_name: "lora_sst2_baseline"
training:
learning_rate: 5.0e-4
batch_size: 2
epochs: 1
參數的優先序是:
CLI > YAML > Defaults
例如:
python app/train_lora_v2.py --learning_rate 0.002
會覆寫掉 YAML 的設定。
新版 train_lora_v2.py 在訓練開始時,會自動保存「當下有效配置」到 results/configs/,並以 實驗名稱 + 準確率 + 時間戳 命名:
custom_experiment_acc0.8765_20240315_143022.yaml
這樣能避免覆蓋、方便比對,也能完整回溯實驗設定。
這次重構雖然沒有直接提升模型的準確率,但卻帶來了三個重要的改進:參數來源統一,避免了不一致;在訓練開始前就透過 Pydantic 驗證,確保設定安全;每次實驗都保存唯一的配置檔,讓結果可完整回溯。這些改進看似基礎,卻是平台工程化的核心步驟。若沒有穩固的配置管理,後續不管是分散式訓練、Kubernetes 部署,甚至多使用者環境,都只會變成失控的「黑箱實驗」。
📎 AI 協作記錄:今日開發指令
請幫我完成以下優化:
1. 建立一個 app/config.py,新增 TrainConfig 類別,使用 Pydantic 定義以下參數:
- learning_rate (float, 預設 5e-4, 必須 > 0)
- batch_size (int, 預設 2, 必須 >= 1)
- epochs (int, 預設 1, 必須 >= 1 且 <= 10)
- experiment_name (str, 預設 "lora_experiment")
2. 在 app/config.py 中新增 load_config 函數,能讀取 config/default.yaml,並回傳 TrainConfig 物件。
3. 建立 config/default.yaml,內容包含:
experiment_name: "lora_sst2_baseline"
learning_rate: 5.0e-4
batch_size: 2
epochs: 1
4. 修改 train_lora.py:
- 匯入 load_config 並載入設定
- 在訓練開始前將有效配置保存到 results/effective_config.yaml,使用 YAML 格式輸出。