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