您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)pytorch多進(jìn)程如何優(yōu)化,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
目標(biāo):優(yōu)化代碼,利用多進(jìn)程,進(jìn)行近實(shí)時預(yù)處理、網(wǎng)絡(luò)預(yù)測及后處理:
嘗試了pytorch的multiprocessing,進(jìn)行多進(jìn)程同步處理以上任務(wù)。
from torch.multiprocessing import Pool,Manager
為了進(jìn)行各進(jìn)程間的通信,使用Queue,作為數(shù)據(jù)傳輸載體。
manager = Manager() input_queue = manager.Queue() output_queue = manager.Queue() show_queue = manager.Queue()
即將預(yù)處理進(jìn)程處理后的圖像放進(jìn) input_queue,而網(wǎng)絡(luò)預(yù)測進(jìn)程實(shí)時獲取 input_queue隊(duì)列中的數(shù)據(jù),一旦放入,就從中取出,輸入網(wǎng)絡(luò):
while 1: input = input_queue.get()
同理,將網(wǎng)絡(luò)輸出放入output_queue,再由后處理進(jìn)程實(shí)時獲取并進(jìn)行后處理,處理后,放入show_queue
從而實(shí)現(xiàn)了多進(jìn)程同步進(jìn)行預(yù)處理、網(wǎng)絡(luò)預(yù)測及后處理,加速了網(wǎng)絡(luò)實(shí)時預(yù)測的表現(xiàn)。
問題及解決方案:
1. pytorch cuda報錯,re-initialization報錯問題:
習(xí)慣了在一開始將模型先加載進(jìn)來放入gpu中,所以模型在主線程就完成了初始化,但是調(diào)用網(wǎng)絡(luò)是在網(wǎng)絡(luò)預(yù)測子進(jìn)程進(jìn)行的,就會導(dǎo)致跨進(jìn)程重復(fù)初始化失敗。
解決方案:
直接在子進(jìn)程開始時初始化,其他進(jìn)程可以設(shè)置個延時,等網(wǎng)絡(luò)初始化好后再開始運(yùn)行。
同理,數(shù)據(jù)輸入網(wǎng)絡(luò)也是同樣的在子進(jìn)程進(jìn)行。
2. python3多進(jìn)程編程,子進(jìn)程不報錯問題:
一開始總是代碼運(yùn)行起來什么都不出現(xiàn),就開始各種debug,但因?yàn)閜ython3中子進(jìn)程不報錯,出錯了就卡在那里,就每次自己找bug很麻煩,所以就急需子進(jìn)程的報錯信息。
解決方案:
用try except組合,來打印子進(jìn)程中某段程序錯誤,如下:
try: out = forward(input_img,model,1) except Exception as error: print(error)
3.進(jìn)程完全不運(yùn)行時,考慮是否是輸入設(shè)置的問題,即當(dāng)單變量輸入時,后面要加都好,如:
pool.apply_async(load_frame,args=(input_queue,))
如果是pool.apply_async(load_frame,args=(input_queue))則該進(jìn)程不會啟動運(yùn)行。
4. 一開始想優(yōu)化cv2.resize,想用gpu下的tensor的resize_代替,但發(fā)現(xiàn)這種方式和numpy.resize一脈相承啊,根本不是我們想要的resize,如果是變大的話,這種resize會直接按順序填,然后剩下的就填0,實(shí)在是太草率了。。。
解決方案:還沒有很好的替代方案,只找了一下,cuda::resize,但是好像貌似沒有python接口,要是混合編程好像有點(diǎn)小題大做,得不償失了。
關(guān)于“pytorch多進(jìn)程如何優(yōu)化”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。