【PL 基礎】模型調試實用技巧
- 摘要
- 1. 設置斷點
- 2. 快速運行所有模型代碼一次
- 3. 縮短 epoch 長度
- 4. 運行健全性檢查
- 5. 打印 LightningModule 權重摘要
- 6. 打印輸入輸出層尺寸
摘要
??本文總結了6種實用的模型調試技巧:1)通過設置斷點逐行檢查代碼;2)使用fast_dev_run參數快速驗證全流程;3)限制批次量縮短訓練周期;4)利用num_sanity_val_steps進行預驗證;5)通過ModelSummary打印模型權重結構;6)設置example_input_array顯示各層輸入輸出尺寸。這些方法可顯著提升調試效率,特別適用于大規模深度學習模型的開發驗證環節,幫助開發者快速定位問題并優化模型結構。
1. 設置斷點
??斷點會停止代碼執行,以便您可以檢查變量等。并允許您的代碼一次執行一行。
def function_to_debug():x = 2# set breakpointbreakpoint()y = x**2
在此示例中,代碼將在執行該行 y = x**2 之前停止。
2. 快速運行所有模型代碼一次
??如果你曾經歷過模型訓練數日后卻在驗證或測試階段崩潰的痛苦,那么這個訓練器參數將成為你的救星。
fast_dev_run(快速開發運行模式)參數會讓訓練器僅執行:
5個批次的訓練 → 驗證 → 測試 → 預測全流程
快速檢測代碼是否存在錯誤:
trainer = Trainer(fast_dev_run=True)
要更改要使用的批次數,請將參數更改為整數。在這里,我們運行每個批次的 7 個批次:
trainer = Trainer(fast_dev_run=7)
啟用fast_dev_run
參數時,將自動禁用以下功能組件:
-
超參優化器(tuner)
-
模型檢查點回調(checkpoint callbacks)
-
早停回調(early stopping callbacks)
-
所有日志記錄器(loggers)
-
日志類回調(如學習率監控器 LearningRateMonitor / 設備狀態監控器 DeviceStatsMonitor)
3. 縮短 epoch 長度
??在某些場景下,僅使用訓練集/驗證集/測試集/預測數據的子集(或限定批次量)能顯著提升效率。例如:
? 僅抽取20%訓練集
? 僅使用1%驗證集
??在處理ImageNet等大型數據集時,此方法可幫助您:
? 快速完成調試或驗證
? 避免等待完整周期結束
? 大幅縮短反饋周期
# use only 10% of training data and 1% of val data
trainer = Trainer(limit_train_batches=0.1, limit_val_batches=0.01)# use 10 batches of train and 5 batches of val
trainer = Trainer(limit_train_batches=10, limit_val_batches=5)
4. 運行健全性檢查
??Lightning框架在訓練初始階段會預先執行2步驗證,該設計能有效避免:當訓練進入耗時漫長的深水區后,才在驗證環節意外崩潰的風險。
trainer = Trainer(num_sanity_val_steps=2)
5. 打印 LightningModule 權重摘要
??1. 每當調用該函數.fit()
時,Trainer 都會打印 LightningModule 的權重摘要。
trainer.fit(...)
這會生成一個表,如下所示:
| Name | Type | Params | Mode
-------------------------------------------
0 | net | Sequential | 132 K | train
1 | net.0 | Linear | 131 K | train
2 | net.1 | BatchNorm1d | 1.0 K | train
- 如需在模型摘要中顯示子模塊,需添加 ModelSummary 回調:
from lightning.pytorch.callbacks import ModelSummary # 導入模型摘要組件trainer = Trainer(callbacks=[ModelSummary(max_depth=-1)]) # 創建訓練器時配置回調
參數解釋
ModelSummary(max_depth=-1, # 深度控制:-1=無限遞歸,0=僅頂層,1=展開一級子模塊max_recursion=10 # 可選:防止無限遞歸的保險機制(默認10層)
)
典型輸出示例
| Name | Type | Params | In dim | Out dim |
|-------------|---------------|--------|--------------|--------------|
| net | Sequential | 1.5 M | [32, 3, 224] | [32, 1000] |
| ├─conv1 | Conv2d | 9.4 K | [32, 3, 224] | [32, 64,112] |
| ├─bn1 | BatchNorm2d | 128 | [32,64,112] | [32,64,112] |
| └─... | ... | ... | ... | ... |
- 若需在不調用 .fit() 的情況下打印模型摘要,請使用以下方案:
from lightning.pytorch.utilities.model_summary import ModelSummary # 從工具庫導入摘要類model = LitModel() # 實例化自定義模型
summary = ModelSummary(model, max_depth=-1) # 生成深度摘要對象
print(summary) # 打印結構化模型報告
參數解釋
ModelSummary(model, # 必需:繼承LightningModule的自定義模型max_depth=-1, # 層級深度:-1=無限遞歸(顯示所有子模塊)max_recursion=10 # 遞歸安全限制(防循環引用崩潰)
)
典型輸出示例
╒═════════════╤══════════════╤═════════╤══════════╤═══════════╕
│ Layer │ Type │ Params │ In dim │ Out dim │
╞═════════════╪══════════════╪═════════╪══════════╪═══════════╡
│ encoder │ Sequential │ 4.7M │ [32,256] │ [32,512] │
│ ├─lstm1 │ LSTM │ 3.2M │ [32,256] │ [32,128] │
│ ├─dropout │ Dropout │ 0 │ [32,128] │ [32,128] │
│ └─... │ ... │ ... │ ... │ ... │
╘═════════════╧══════════════╧═════════╧══════════╧═══════════╛
Trainable params: 4.7M
Non-trainable params: 0
- 要關閉自動匯總,請使用:
trainer = Trainer(enable_model_summary=False)
6. 打印輸入輸出層尺寸
另一個調試工具是通過在 LightningModule 中設置屬性來顯示所有層的中間輸入和輸出大小。example_input_array
class LitModel(LightningModule):def __init__(self, *args, **kwargs):self.example_input_array = torch.Tensor(32, 1, 28, 28)
對于輸入數組,摘要表將包括輸入和輸出層維度:
| Name | Type | Params | Mode | In sizes | Out sizes
----------------------------------------------------------------------
0 | net | Sequential | 132 K | train | [10, 256] | [10, 512]
1 | net.0 | Linear | 131 K | train | [10, 256] | [10, 512]
2 | net.1 | BatchNorm1d | 1.0 K | train | [10, 512] | [10, 512]
調用 Trainer.fit()
方法時,該機制可幫助您檢測網絡層組合中的潛在錯誤。