承襲前幾日的主題,今天繼續討論Preprocess優化的方式。今天處要討論的是針對I/O重複性優化的問題。
一樣我們先上架構圖,但稍微改一下。假設是在大量的訓練過程中,自然而然我們就需要做非常多次Preprocess + model computation (forward + backward),大概會變得像是下面這張圖一樣:
那這裡頭還有沒有什麼優化空間呢?有的,簡單一句,空間換取時間。
理論上來說,同樣的影像(或是原始資料)在經過預處理以後,會是相同的衍生物(即使加入augmentation,至少在augment之前也是相同的東西)。於是這裡就有個可以介入的空間了,即是把預期會被重複執行的Preprocess結果儲存起來以便重複利用。
概念上就可以畫成下面這張圖:
而把整個Processed暫存的位置,具體而言又可以分成下列兩種:
monai.data.CacheDataset
直接實作,傳送門
monai.data.PersistentDataset
,傳送門
由於MedMNIST非常的小,Persistent的作法不太顯著。我們這邊直接比較Cached到RAM的作法,可以看到訓練時間又更加的縮短了!Cached的實作可以參考這個commit,見下圖:
看起來似乎沒有差很多,但這些操作隨著前處理計算量跟資料量大小的增加而更加的效果顯著,尤其像是在醫療影像內動輒幾萬張解析度2000x2000的x光、有時間維度的超音波甚至是CT跟MRI。
.npz
的格式把整個資料集讀進來,直接使用差不多就是這個cached後的效率。.pt
的cache檔案,不小,注意你的硬碟量