網絡訓練若干問題小結

網絡訓練加速:正常情況GPU利用率極低,說明大部分卡在IO上
1、完全使用cache提速明顯,GPU利用率~98%
2、cache更新概率設置在20%,耗時一樣
3、cache每個樣本保存5個副本,每次從副本中隨機選一個,保持多樣性
4、多卡訓練同步BN用Apex

Connection refused
原因:num_workers > 0時在dataset里加斷點報錯,num_workers=0時即可


指定源安裝python包
pip install * -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

yuv轉RGB轉不過來,原因是要先轉成float32的,在進行浮點運算轉成RGB
plt,scipy等都是存成RGB,cv2是bgr存成RGB,讀取之後會反轉成BGR

爲什麼總是出現那麼多的殭屍程序?

優化方式很重要,對於數據分佈非常髒的數據,單純的sgd很難下降(原因可能是由於momentum太大了,導致震盪),RMS也只是能收斂到極優,而adam和RMS差不多,都沒有收斂性保證,只有SGD+nesterov纔是被證明收斂的。因此以後都用這個,只是需要調好學習率即可,一般設置1e-5。
使用cache時出錯
RuntimeError: value cannot be converted to type float without overflow: 1106498119229061081197051705707146942467671994925354769623645106340485922816.000000
因爲cache讀取不到,每次ctrl+c殺掉之後,好多文件沒寫完,所以讀取不出來,或者取出來錯誤。所以每次重啓程序要殺掉
ps x | grep 'device 7' | awk '{print $1}' | xargs kill -9
對於深度估計SUNCG數據集來說,優化器選用RMS,學習率0.0002,用MultiStepLR,gamma=0.2,MILESTONE=[10, 15, 20]
模型訓練過程中用sgd非常差,新訓練的模型都用RMSPro,這樣就可以很快的下降到比較好的結果,然後最最最後上線前才用SGDfinetune一下下。

sudo fuser -v /dev/nvidia* 查找佔用GPU資源
ps -elf | grep python 找到python程序殺掉

深度估計數據增強:1)Resize,Rotate,Flip,ColorJitter;2)顏色變換一定要慎重

* torch.backends.cudnn.benchmark = True 在程序剛開始加這條語句可以提升一點訓練速度,沒什麼額外開銷。我一般都會加
* 有時候可能是因爲每次迭代都會引入點臨時變量,會導致訓練速度越來越慢,基本呈線性增長。開發人員還不清楚原因,但如果週期性的使用torch.cuda.empty_cache()的話就可以解決這個問題。這個命令是清除沒用的臨時變量的。
* torchvision.transforms裏的各種坑,等有空再說。

爲什麼每個batch算完loss以後要手動清一下緩存。。不然一會兒就OOM了。。我觀察過cache memory,確實逐漸增大。
代碼裏有個loss.item() / norm,需要把norm也取個item,變成loss.item() / norm.item()

一個網絡複製另一個的結構,參數,對於一個輸入給出了不同的輸出
最後發現是 BN 層有 register_buffer,複製含 BN 的網絡不止要複製參數


pytorch 的dataloader 進程經常殺不乾淨,導致GPU內存沒有釋放。
ps aux|grep lk|grep python|awk '{print $2}'|xargs kill 徹底殺死進程

深度圖顯示問題:
全部歸一化到0-6或者0-8,這樣以保證每張圖的分佈區間都一樣,不在自己隨意變化最大最小值(即上下界)

Train.py:
    1)驗證數據不加shuffle,不加sampler,不加collate_fn
    2)驗證時,要加net.eval(),要加速和節省內存時加torch.set_grad_enabled(False)
    
    3)暫無
new_module:
    1)conv_layer增加選項cut和weight_quant
    2)ConvQuant中量化
    

1、訓練速度慢:
    batch size太大,或太小
    num_worker太少,8~24
    沒用CUDA
    多GPU訓練,還有問題
2、訓練收斂慢:
    沒有用BN層,學習率要調小,那麼訓練也會變慢
    

3、顯存out of memory
    for data, label in trainloader: 
        …… 
        out = model(data) 
        loss = criterion(out, label) 
        loss_sum += loss # <— 這裏
    每次隨着batch增大顯存消耗變大,應改爲loss_sum += loss.data[0]

4、net.eval()與torch.no_grad(),torch.set_grad_required()
    前者是eval模式,不會訓練BN和Drop out層,後者是停止自動計算梯度引擎,可以減少內存並加速,但是無法反向傳播。
    model.eval()和with torch.no_grad()
    定義一個dropout層。 這兩行語句輸出不一樣。 後來查了一下, eval是測試語句。 我一直以爲0.4之後with
    torch.no_grad()會讓model變爲測試模式, 理解錯了, 原來是節省內存的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章