為什麼不進行多卡同步?
batchnorm的實現都是只考慮了single gpu。也就是說bn使用的均值和標準差是單個gpu算的,相當於縮小了mini-batch size。至於為什麼這樣實現,1)因為沒有sync的需求,因為對於大多數vision問題,單gpu上的mini-batch已經夠大了,完全不會影響結果。2)影響訓練速度,bn layer通常是在網路結構裡面廣泛使用的,這樣每次都同步一下gpus,十分影響訓練速度。2
但是為了達到更好的效果, 實現sync-bn也是很有意義的.
在深度學習平台框架中多數是採用資料並行的方式, 每個gpu卡上的中間資料沒有關聯.
為了實現跨卡同步bn, 在前向運算的時候需要計算全域性的均值和方差,在後向運算時候計算全域性梯度。 最簡單的實現方法是先同步求均值,再發回各卡然後同步求方差,但是這樣就同步了兩次。實際上均值和方差可以放到一起求解, 只需要同步一次就可以. 資料並行的方式改為下圖所示:
因此總體batch_size
對應的均值和方差可以通過每張gpu中計算得到的 ∑xi
'>∑xi
∑xi 和 ∑xi
2'>∑x2i
∑xi2 reduce相加得到. 在反向傳播時也一樣需要同步一次梯度資訊.
程序同步 程序互斥
並行性帶來了非同步性,有時需要通過程序同步解決這種非同步問題 有的程序之間需要互相配合地完成工作,各程序的工作推進需要遵循一定的先後順序 1.對臨界資源的訪問,需要互斥的進行。即同一時間內只能允許乙個程序訪問該資源 2.四個部分 進入區 檢查是否可進入臨界區,若可進入,需要 上鎖 臨界區 訪問臨界資...
軟硬體的同步進製
使用乙個公用的整形變數,描述允許進入臨界區的程序標識,例如,當該變數為1時讓進,否則不讓進。優點 不會出現同時進入的情況 缺點 強制性的措施沒有考慮程序的實際需要,造成資源利用率低,又因為在乙個程序退出之後,在臨界區空閒時依然不能連續訪問,不滿足 空閒則入 的情況。先判斷檢查另乙個程序是否在臨界區,...
pytorch 多GPU訓練(單機多卡 多機多卡)
首先是資料集的分布處理 需要用到的包 torch.utils.data.distributed.distributedsampler torch.utils.data.dataloader torch.utils.data.dataset distributedsampler這個包我們用來確保dat...