<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Pytorch常見的坑匯總

          共 4507字,需瀏覽 10分鐘

           ·

          2021-09-23 16:50

          點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時間送達(dá)

          本文轉(zhuǎn)自|深度學(xué)習(xí)這件小事
          最近剛開始用pytorch不久,陸陸續(xù)續(xù)踩了不少坑,記錄一下,個人感覺應(yīng)該都是一些很容易遇到的一些坑,也在此比較感謝幫我排坑的小伙伴,持續(xù)更新,也祝愿自己遇到的坑越來越少。
          首先作為tensorflow的骨灰級玩家+輕微強(qiáng)迫癥患者,一路打怪升級,從0.6版本用到1.2,再用到1.10,經(jīng)歷了tensorfow數(shù)個版本更迭,這里不得不說一下tf.data.dataset+tfrecord使用起來效率遠(yuǎn)比dataloader高的多。
          tensorflow有一個比較好用的隊列機(jī)制,tf.inputproducer + tfrecord, 但是inputproducer有一個bug,就是無法對每個epoch單獨(dú)shuffle,它只能整體shuffle,也就意味著我們無法進(jìn)行正常的訓(xùn)練流程(train幾個epoch,在validation上測一個epoch,最終選一個validation上的最好的結(jié)果,進(jìn)行test)。后來我當(dāng)時給官方提了一個issue,官方當(dāng)時的回答是,這個bug目前無法解決,但是他們在即將到來的tf1.2版本中, 推出的新型數(shù)據(jù)處理API tf.contrib.data.dataset(tf1.3版本將其合并到了tf.data.dataset)可以完美解決這個bug,并且將于tf2.0摒棄tf.input_producer。然后tf1.2版本剛出來以后,我就立馬升級并且開始tf.data.dataset踩坑,踩了大概2周多的坑,(這個新版的API其實(shí)功能并不是非常強(qiáng)大,有不少局限性,在此就不展開)。
          ——————————————————————————
          好像扯遠(yuǎn)了,回歸pytorch,首先讓我比較尷尬的是pytorch并沒有一套屬于自己的數(shù)據(jù)結(jié)構(gòu)以及數(shù)據(jù)讀取算法,dataloader個人感覺其實(shí)就是類似于tf中的feed,并沒有任何速度以及性能上的提升。
          先總結(jié)一下遇到的坑:
          1.沒有高效的數(shù)據(jù)存儲,cv.imread在網(wǎng)絡(luò)訓(xùn)練過程中效率低

          解決方案:
          當(dāng)時看到了一個還不錯的github鏈接,
          https://github.com/Lyken17/Efficient-PyTorch
          主要是講如何使用lmdb,h5py,pth,lmdb,n5等數(shù)據(jù)存儲方式皆可以。
          個人的感受是,h5在數(shù)據(jù)調(diào)用上比較快,但是如果要使用多線程讀寫,就盡量不要使用h5,因為h5的多線程讀寫好像比較麻煩。
          http://docs.h5py.org/en/stable/mpi.html
          這里貼一下h5數(shù)據(jù)的讀寫代碼(主要需要注意的是字符串的讀寫需要encode,decode,最好用create_dataset,直接寫的話讀的時候會報錯):

          imagenametotal_.append(os.path.join('images', imagenametotal).encode())
          with h5py.File(outfile) as f:
          f.create_dataset('imagename', data=imagenametotal_)
          f['part'] = parts_
          f['S'] = Ss_
          f['image'] = cvimgs

          with h5py.File(outfile) as f:
          imagename = [x.decode() for x in f['imagename']]
          kp2ds = np.array(f['part'])
          kp3ds = np.array(f['S'])
          cvimgs = np.array(f['image'])

          2.gpu imbalance
          張航學(xué)長Hang Zhang (張航)提了一個開源的gpu balance的工具--PyTorch-Encoding。
          使用方法還是比較便捷的,如下所示:
          from balanced_parallel import DataParallelModel, DataParallelCriterionmodel = DataParallelModel(model, device_ids=gpus).cuda()criterion = loss_fn().cuda()
          這里其實(shí)有2個注意點(diǎn),第一,測試的時候需要手動將gpu合并,代碼如下:
          from torch.nn.parallel.scatter_gather import gatherpreds = gather(preds, 0)
          第二,當(dāng)loss函數(shù)有多個組成的時候,比如 loss = loss1 + loss2 + loss3
          那么需要把這三個loss寫到一個class中,然后再forward里面將其加起來。
          其次,我們還可以用另外一個函數(shù)distributedDataParallel來解決gpu imbalance的問題.
          使用方法如下:(注:此方法好像無法和h5數(shù)據(jù)同時使用)
          from torch.utils.data.distributed import DistributedSamplerfrom torch.nn.parallel import DistributedDataParallel
          torch.distributed.init_process_group(backend="nccl")# 配置每個進(jìn)程的gpulocal_rank = torch.distributed.get_rank()torch.cuda.set_device(local_rank)device = torch.device("cuda", local_rank)
          #封裝之前要把模型移到對應(yīng)的gpumodel.to(device)model = torch.nn.parallel.DistributedDataParallel(model,device_ids=[local_rank], output_device=local_rank)
          #原有的dataloader上面加一個數(shù)據(jù)sampletrain_loader = torch.utils.data.DataLoader( train_dataset, sampler=DistributedSampler(train_dataset) )
          3.gpu利用率不高,+gpu現(xiàn)存占用浪費(fèi)
          常用配置:
          1主函數(shù)前面加:(這個會犧牲一點(diǎn)點(diǎn)現(xiàn)存提高模型精度)
          cudnn.benchmark = Truetorch.backends.cudnn.deterministic = Falsetorch.backends.cudnn.enabled = True
          2訓(xùn)練時,epoch前面加:(定期清空模型,效果感覺不明顯)
          torch.cuda.empty_cache()
          3無用變量前面加:(同上,效果某些操作上還挺明顯的)
          del xxx(變量名)
          4dataloader的長度_len_設(shè)置:(dataloader會間歇式出現(xiàn)卡頓,設(shè)置成這樣會避免不少)
          def __len__(self): return self.images.shape[0]
          5dataloader的預(yù)加載設(shè)置:(會在模型訓(xùn)練的時候加載數(shù)據(jù),提高一點(diǎn)點(diǎn)gpu利用率)
          train_loader = torch.utils.data.DataLoader( train_dataset, pin_memory=True, )
          6網(wǎng)絡(luò)設(shè)計很重要,外加不要初始化任何用不到的變量,因為pyroch的初始化和forward是分開的,他不會因為你不去使用,而不去初始化。
          7最后放一張目前依舊困擾我的圖片:
          可以看到,每個epoch剛開始訓(xùn)練數(shù)據(jù)的時候,第一個iteration時間會占用的非常多,pytorch這里就做的很糟糕,并不是一個動態(tài)分配的過程,我也看到了一個看上去比較靠譜的解決方案,解決方案如下 @風(fēng)車車

          在深度學(xué)習(xí)中喂飽gpu

          https://zhuanlan.zhihu.com/p/77633542

          但是我看了下代碼,可能需要重構(gòu)dataloader,看了評論好像還有問題,有點(diǎn)懶,目前還沒有踩坑,準(zhǔn)備后面有時間踩一下。
          暫且更新到這里,后續(xù)遇到什么坑陸續(xù)補(bǔ)充,也歡迎大家給我補(bǔ)充,pytorch初學(xué)者小白一枚。

          更個新;順便吐槽一下上面的dali,局限性很大,比較trick的數(shù)據(jù)預(yù)處理很難搞定。
          8 apex混合單精度模型
          事實(shí)證明,apex并沒有官網(wǎng)說的那么玄乎,只能減低顯存,并不能提速(12G顯存大概可以降低到8G左右,效果還挺明顯的,但是,速度降低了大概1/3,好像有點(diǎn)得不償失)。
          編譯之后提速也很有限,再此留個坑,有小伙伴能解決的可以私信我哈,如果可以解決我會仔細(xì)羅列一遍。。



          好消息,小白學(xué)視覺團(tuán)隊的知識星球開通啦,為了感謝大家的支持與厚愛,團(tuán)隊決定將價值149元的知識星球現(xiàn)時免費(fèi)加入。各位小伙伴們要抓住機(jī)會哦!


          下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
          在「小白學(xué)視覺」公眾號后臺回復(fù):擴(kuò)展模塊中文教程即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實(shí)戰(zhàn)項目52講
          小白學(xué)視覺公眾號后臺回復(fù):Python視覺實(shí)戰(zhàn)項目即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實(shí)戰(zhàn)項目,助力快速學(xué)校計算機(jī)視覺。

          下載3:OpenCV實(shí)戰(zhàn)項目20講
          小白學(xué)視覺公眾號后臺回復(fù):OpenCV實(shí)戰(zhàn)項目20講即可下載含有20個基于OpenCV實(shí)現(xiàn)20個實(shí)戰(zhàn)項目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

          交流群


          歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


          瀏覽 40
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中国久久一级片 | 国产精品色国产在线 | 操逼网址进入 | 青娱乐精品视频日美 | 日韩黄色网|