我們時(shí)常想使用一些功能, 它們可以被歸類但又分散在項(xiàng)目的各個(gè)位置, 一般它們與核心代碼無關(guān). 例如, 我們想寫追溯程序的運(yùn)行狀態(tài), 一般我們會(huì)在程序運(yùn)行的各個(gè)節(jié)點(diǎn)寫下諸如 print(‘training starts....’)的代碼. 這些代碼與主程序無關(guān),如果全部寫在主程序里面會(huì)顯得比較冗雜, 它們實(shí)現(xiàn)同一個(gè)功能但又分散在程序的各個(gè)位置,這時(shí)就可以用到callbacks了.
原則
首先明確callbacks的使用原則.
- 獨(dú)立. callback需要保持獨(dú)立的功能, callbacks 之間也不要相互調(diào)用對(duì)方的方法.
- 無順序. 不建議callbacks之間相互依賴, callbacks之間不要有執(zhí)行的先后順序.
- 不要調(diào)用上一級(jí)的方法. 例如
on_validation_end().
位置
要使用callbacks, 首先要明確這些鉤子的位置. 官網(wǎng)給了一個(gè)偽代碼來幫我們快速找到它們的位置.

This is the pseudocode to describe the structure of `fit_loop` and `val_loop` only
使用
from lightning.pytorch.callbacks import Callback
# 通過繼承創(chuàng)建一個(gè)自己的Hook
class MyPrintingCallback(Callback):
def on_train_start(self, trainer, pl_module):
print("Training is starting")
def on_train_end(self, trainer, pl_module):
print("Training is ending")
# 注冊(cè)自定的Hook
trainer = Trainer(callbacks=[MyPrintingCallback()])
因此到位置的時(shí)候, 程序會(huì)執(zhí)行注冊(cè)鉤子里的代碼:
# pseudocode
on_train_start() # "Training is starting"
train()
on_train_end() # "Training is ending"
內(nèi)置callbacks
有一些內(nèi)置callbacks實(shí)現(xiàn)了一些用的功能, 以下顯示了一些我覺得有用的:
Ref
https://lightning.ai/docs/pytorch/stable/extensions/callbacks.html
https://lightning.ai/docs/pytorch/latest/common/lightning_module.html#hooks
https://stephencowchau.medium.com/pytorch-lightning-hooks-and-callbacks-my-limited-understanding-d8e0a56dcf2b