iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
AI & Data

PyTorch 生態鏈實戰運用系列 第 15

[Day15] 資料預處理機制與優化 - 軟體篇 - 空間換取時間

  • 分享至 

  • xImage
  •  

前言

承襲前幾日的主題,今天繼續討論Preprocess優化的方式。今天處要討論的是針對I/O重複性優化的問題。

資料預處理機制

一樣我們先上架構圖,但稍微改一下。假設是在大量的訓練過程中,自然而然我們就需要做非常多次Preprocess + model computation (forward + backward),大概會變得像是下面這張圖一樣:

那這裡頭還有沒有什麼優化空間呢?有的,簡單一句,空間換取時間。

空間換取時間

理論上來說,同樣的影像(或是原始資料)在經過預處理以後,會是相同的衍生物(即使加入augmentation,至少在augment之前也是相同的東西)。於是這裡就有個可以介入的空間了,即是把預期會被重複執行的Preprocess結果儲存起來以便重複利用

概念上就可以畫成下面這張圖:

而把整個Processed暫存的位置,具體而言又可以分成下列兩種:

  • RAM :
    • 優點:直接放在RAM內,可以往GPU直接送,同時節省運算跟I/O的時間,通常速度最快。
    • 缺點:佔用大量的RAM,過於大型的資料集不太適合。
    • 實作:可以用monai.data.CacheDataset直接實作,傳送門
  • Storage :
    • 優點:將前處理後的檔案放在Storge內,可以節省運算時間,而且不需要佔用到大量的RAM。
    • 缺點:沒有直接Cached來得快。
    • 實作:可以用monai.data.PersistentDataset傳送門

實際差異

由於MedMNIST非常的小,Persistent的作法不太顯著。我們這邊直接比較Cached到RAM的作法,可以看到訓練時間又更加的縮短了!Cached的實作可以參考這個commit,見下圖:

看起來似乎沒有差很多,但這些操作隨著前處理計算量跟資料量大小的增加而更加的效果顯著,尤其像是在醫療影像內動輒幾萬張解析度2000x2000的x光、有時間維度的超音波甚至是CT跟MRI。

額外的小murmur

  • 其實一開始medmnist套件內的dataloader,它是利用.npz的格式把整個資料集讀進來,直接使用差不多就是這個cached後的效率。
  • 主要還是為了有一整套處理流程才這樣編寫。(迷之音:根本湊課程吧你)
  • 實際上資料集如果夠大(大概就是大小比你的RAM還大時),用Presistent的話機率會比較高、硬體運用的效率也比較好。
  • 用Presistent的時候要注意兩點:
    • 會產生.pt的cache檔案,不小,注意你的硬碟量
    • cache後,重跑程式時,檢查如果已經cache過就不會重新執行,所以如果preprocess方式有更動過的話,記得要重新cache

本日小節

  • 利用空間換取時間,再加速訓練流程

上一篇
[Day14] 資料預處理機制與優化 - 軟體篇 - 優化預處理
下一篇
[Day16] 資料預處理機制與優化 - 軟體篇 - 土法煉鋼
系列文
PyTorch 生態鏈實戰運用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言