實驗管理
研究的核心是「比較不同設定下的結果」。沒有好的實驗管理,很容易發生「這個好結果是哪次跑的?用什麼參數?」的情況。
核心原則
提交程式碼後再跑實驗
每次正式實驗前,先 git commit 你的程式碼。這讓你能用 Git Hash 精確定位「這個結果是哪版程式碼產生的」。
1. 用設定檔管理超參數
不要在程式碼裡硬編碼超參數,改用 configs/ 目錄的 YAML 檔:
# configs/ppo_humanoid.yaml
seed: 42
env:
name: "HumanoidStand-v1"
max_steps: 1000
agent:
lr: 3e-4
gamma: 0.99
clip_ratio: 0.2
batch_size: 64
logging:
save_dir: "data/checkpoints"
log_interval: 100
每次實驗換參數時,複製一份設定檔修改,而非直接改程式碼:
2. Checkpoint 命名規範
儲存模型權重時,用能識別實驗身份的名稱:
實際範例:
在程式碼中自動生成:
import time
from pathlib import Path
def save_checkpoint(
model: torch.nn.Module,
reward: float,
save_dir: str,
project_name: str,
) -> Path:
"""Save model checkpoint with timestamped filename."""
save_dir = Path(save_dir)
save_dir.mkdir(parents=True, exist_ok=True)
date_str = time.strftime("%Y%m%d")
filename = f"{project_name}_{date_str}_reward{reward:.0f}.pt"
path = save_dir / filename
torch.save(model.state_dict(), path)
return path
3. 在訓練時記錄關鍵資訊
每次實驗結束後,你應該能回答這些問題:
| 問題 | 記錄方式 |
|---|---|
| 用了哪個 commit 的程式碼? | logger 印出 git rev-parse HEAD |
| 用了什麼超參數? | logger 印出完整 config |
| 最好的結果在第幾個 epoch? | 追蹤 best_reward |
| Checkpoint 存在哪裡? | logger 印出完整路徑 |
import subprocess
from your_project.utils.logger import get_logger
logger = get_logger(__name__)
def log_experiment_info(config: dict) -> None:
"""Log experiment metadata at the start of training."""
git_hash = subprocess.check_output(
["git", "rev-parse", "--short", "HEAD"]
).decode().strip()
logger.info("=" * 50)
logger.info("Git commit: %s", git_hash)
logger.info("Config: %s", config)
logger.info("=" * 50)
4. 整理實驗結果
建議在專案的 docs/experiment_log.md 中維護一個實驗結果表,不要直接寫在 README.md,保持 README 簡潔:
# 實驗記錄
| 日期 | Commit | 設定檔 | 最高 Reward | 備註 |
|---|---|---|---|---|
| 2024-05-01 | `a1b2c3d` | ppo_humanoid.yaml | 312 | baseline |
| 2024-05-03 | `e4f5g6h` | ppo_humanoid_lr1e4.yaml | 298 | lr 太小 |
| 2024-05-05 | `i7j8k9l` | ppo_attention.yaml | 341 | attention ✅ |
在 README.md 中只需加一行連結即可:
5. 實驗量大時:考慮自動追蹤工具
手動維護 Markdown 表格在實驗量少時夠用,但當你一天要跑 10+ 次實驗時,容易漏記。以下工具可以自動記錄每次訓練的超參數、指標與程式碼版本:
| 工具 | 適合情況 | 入門難度 |
|---|---|---|
| Weights & Biases (W&B) | 需要視覺化儀表板、遠端監控訓練曲線 | ★★☆ |
| MLflow | 偏好本地部署、不想依賴外部服務 | ★★☆ |
W&B 的最小接入範例(只需三行):
import wandb
wandb.init(project="humanoid_rl", config=cfg)
# 在訓練迴圈中
wandb.log({"epoch": epoch, "reward": reward, "loss": loss})
Note
實驗量不大時,手動 Markdown 表格完全夠用。只在你覺得「每次都要手動填表很麻煩」的時候才引入這類工具。
6. 伺服器執行時的注意事項
在伺服器上執行長時間訓練時,建議使用 tmux 管理 session,讓訓練在登出後繼續執行。
# 建立一個新的 session(取個好記的名字)
tmux new -s train
# 在 session 中啟動訓練
python -m your_project.training.train --config configs/ppo_humanoid.yaml
# 需要離開時:按下 Ctrl+B,放開,再按 D
# 程式會繼續在背景跑
# 之後重新連回 session
tmux attach -t train
# 列出目前所有 session
tmux ls
還沒安裝 tmux?
伺服器通常沒有 sudo 權限,請參考 → tmux 無 sudo 安裝教學
下一步 → 研究可重現性