深度學習科研,如何高效進行代碼和實驗管理?
回答一
作者:葉小飛
鏈接:https://www.zhihu.com/question/269707221/answer/2281374258
我之前在北美奔馳落地時,曾有段時間為了測試不同的結構和參數(shù),一周能訓練一百來個不同的模型,為此我結合公司前輩們的做法和自己的一點思考總結了一套高效的代碼實驗管理方法,成功幫助了項目落地, 現(xiàn)在在這里分享給大家。
使用Yaml文件來配置訓練參數(shù)
我知道很多開源repo喜歡用input argparse來傳輸一大堆訓練和模型相關的參數(shù),其實非常不高效。一方面,你每次訓練都需要手動輸入大量參數(shù)會很麻煩,如果直接改默認值又要跑到代碼里去改,會浪費很多時間。這里我推薦大家直接使用一個Yaml file來控制所有模型和訓練相關的參數(shù),并將該yaml的命名與模型名字和時間戳聯(lián)系起來,著名的3d點云檢測庫OpenPCDet就是這么做的,如下方這個鏈接所示。
github.com/open-mmlab/OpenPCDet/blob/master/tools/cfgs/kitti_models/pointrcnn.yaml
我從上方給的鏈接截了該yaml文件部分內容,如下圖所示,這個配置文件涵蓋了如何預處理點云,classification的種類,還有backbone各方面的參數(shù)、optimzer和loss的選擇(圖中未展示,完整請看上方鏈接)。也就是說,基本所有能影響你模型的因素,都被涵括在了這個文件里,而在代碼中,你只需要用一個簡單的 yaml.load()就能把這些參數(shù)全部讀到一個dict里。更關鍵的是,這個配置文件可以隨著你的checkpoint一起被存到相同的文件夾,方便你直接拿來做斷點訓練、finetune或者直接做測試,用來做測試時你也可以很方便把結果和對應的參數(shù)對上。
代碼模塊化非常重要
有些研究人員寫代碼時喜歡把整個系統(tǒng)寫的過于耦合,比如把loss function和模型寫到一起,這就會經(jīng)常導致牽一發(fā)而動全身,你改動某一小塊就會導致后面的接口也全變,所以代碼模塊化做的好,可以節(jié)省你許多時間。一般的深度學習代碼基本可以分為這么幾大塊(以pytorch為例):I/O模塊、預處理模塊、可視化模塊、模型主體(如果一個大模型包含子模型則應該另起class)、損失函數(shù)、后處理,并在訓練或者測試腳本里串聯(lián)起來。代碼模塊化的另一好處,就是方便你在yaml里去定義不同方面的參數(shù),便于閱覽。另外很多成熟代碼里都會用到importlib神庫,它可以允許你不把訓練時用哪個模型或者哪個子模型在代碼里定死,而是可以直接在yaml里定義。
Tensorboard, tqdm用起來
這兩個庫我基本上每次必用。Tensorboard可以很好的追蹤你訓練的loss曲線變化,方便你判斷模型是否還在收斂、是否overfit,如果你是做圖像相關,還可以把一些可視化結果放在上面。很多時候你只需要看看tensorboard的收斂狀態(tài)就基本知道你這個模型怎么樣,有沒有必要花時間再單獨測試、finetune. Tqdm則可以幫你很直觀地跟蹤你的訓練進度,方便你做early stop.
充分利用Github
無論你是多人合作開發(fā)還是單獨項目,我都強烈建議使用Github(公司可能會使用bitbucket, 差不多)記錄你的代碼。具體可以參考我這篇回答:
作為一個研究生,有哪些你直呼好用的科研神器?
https://www.zhihu.com/question/484596211/answer/2163122684
記錄實驗結果
我一般會保存一個總的excel來記錄實驗結果,第一列是模型對應的yaml的路徑,第二列是模型訓練epoches, 第三列是測試結果的log, 我一般會把這個過程自動化,只要在測試腳本中給定總excel路徑,利用pandas可以很輕松地搞定。
回答二
作者:Jason
鏈接:https://www.zhihu.com/question/269707221/answer/470576066
git管理代碼是跟深度學習、科研都沒關系的,寫代碼肯定要用版本管理工具。用不用github個人覺著倒是兩可,畢竟公司內是不可能所有代碼都掛外部git的。
那么說幾個寫代碼的時候需要注意的地方吧:
1. 試驗參數(shù)盡量使用config文件傳入,并且config盡量與log文件同名保存。
一方面外部傳入?yún)?shù)可以避免git上過多的版本修改是由于參數(shù)導致的,介于DL不好debug,有時候利用git做一下代碼比對是在所難免的;
另一方面當試驗了萬千版本之后,相信你不會知道哪個model是哪些參數(shù)了,好的習慣是非常有效的。另外新加的參數(shù)盡量提供default值,方便調用老版的config文件。
2. 盡量讓不同的模型之間解耦
同一個項目里,好的復用性是編程的一種非常好的習慣,但是在飛速發(fā)展的DL coding中,假設項目是以任務驅動的,這也許有時候會成為牽絆,所以盡量把可復用的一些函數(shù)提取出來,模型結構相關的盡量讓不同的模型解耦在不同的文件中,反而會更加方便日后的update。否則一些看似優(yōu)美的設計幾個月之后就變得很雞肋。
3. 在滿足一定穩(wěn)定性的同時,定期跟進新版的框架
往往有個尷尬的情況,從一個項目開始到結束,框架update了好幾個版本,新版有一些讓人垂涎若滴的特性,但是無奈有些api發(fā)生了change。所以在項目內可以盡量保持框架版本穩(wěn)定,項目開始前盡量考量一下不同版本的利弊,有時候適當?shù)膶W習是必要的。
另外,對不同的框架懷揣著一顆包容的心。
4. 一次訓練的時間挺長的,coding結束不要盲目的就開始跑實驗,個人經(jīng)驗提供debug模式來實驗小數(shù)據(jù)+更多的log是個不錯的選擇。
5. 記錄好隨著模型update performance的變化,因為可能隨時需要退回去重來。
作者:OpenMMLab
鏈接:https://www.zhihu.com/question/269707221/answer/2480772257
來源:知乎
著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。
題主你好呀,前面的回答提到了使用 Tensorboard、Weights&Biases、MLFlow、Neptune 等工具來管理實驗數(shù)據(jù)。然而隨著實驗管理工具的輪子越造越多,工具的學習成本也越來越高,我們又應該如何選擇呢?
MMCV 滿足你的所有幻想,通過修改配置文件就能實現(xiàn)工具的切換。
github.com/open-mmlab/mmcv
Tensorboard 記錄實驗數(shù)據(jù):
配置文件:
log_config = dict(
interval=1, hooks=[
dict(type='TextLoggerHook'),
dict(type='TensorboardLoggerHook')
])
TensorBoard 數(shù)據(jù)可視化效果
WandB 記錄實驗數(shù)據(jù)
配置文件
log_config = dict(
interval=1, hooks=[
dict(type='TextLoggerHook'),
dict(type='WandbLoggerHook')
])
Wandb 數(shù)據(jù)可視化效果
(需要提前用 python api 登錄 wandb)
Neptume 記錄實驗數(shù)據(jù)
配置文件
log_config = dict(
interval=1, hooks=[
dict(type='TextLoggerHook'),
dict(type='NeptuneLoggerHook',
init_kwargs=dict(project='Your Neptume account/mmcv'))
])
Neptume 可視化效果
mlflow 記錄實驗數(shù)據(jù)
配置文件
log_config = dict(
interval=1, hooks=[
dict(type='TextLoggerHook'),
dict(type='MlflowLoggerHook')
])
MLFlow 可視化效果
dvclive 記錄實驗數(shù)據(jù)
配置文件
log_config = dict(
interval=1, hooks=[
dict(type='TextLoggerHook'),
dict(type='DvcliveLoggerHook')
])
生成的 html 文件
以上只使用了各種實驗管理工具最基本的功能,我們可以進一步修改配置文件來解鎖更多姿勢。
擁有了 MMCV,就相當于擁有了所有的實驗管理工具。如果你以前是 tf boy,可以選擇 TensorBoard 經(jīng)典懷舊風;如果你想應有盡有的記錄實驗數(shù)據(jù)、實驗環(huán)境,不妨嘗試一下 Wandb(Weights & Biases)或者 Neptume;如果你的設備沒法聯(lián)網(wǎng),可以選擇 mlflow 將實驗數(shù)據(jù)存到本地,總有一款工具適合你。
此外 MMCV 也有自己的日志管理系統(tǒng),那就是 TextLoggerHook !它會將訓練過程中產(chǎn)生的全量信息,例如設備環(huán)境、數(shù)據(jù)集、模型初始化方式、訓練期間產(chǎn)生的 loss、metric 等信息,全部保存到本地的 xxx.log 文件。你可以在不借助任何工具的情況下,回顧之前的實驗數(shù)據(jù)。
還在糾結使用哪個實驗管理工具?還在苦惱于各種工具的學習成本?趕快上車 MMCV ,幾行配置文件無痛體驗各種工具。
github.com/open-mmlab/mmcv