解決CUDA error (3): initialization error (multiprocessing)
阿新 • • 發佈:2018-10-31
在做一個影象處理相關的專案,NVIDIA基於CUDA的GPU,我們需要把影象處理做成服務,並提升CPU上併發速度。整個服務既有CPU處理,又有GPU處理,我們就需要把CPU上的處理做成多線併發,把GPU上的資料做成batch併發起來。由於code是用pytorch 的python版本實現的,而不是c++,這就給我們造成了困擾,對於python我們知道多程序才能做到利用CPU多核的目的,而多線並不能,我們這裡採用多程序進行併發。而用多程序進行併發的時候,就出現瞭如下的error。
CUDA error (3): initialization error
經過查詢資料,pyTorch的討論區給出瞭解釋,就是我們在執行多程序之前進行了CUDA相關的操作,造成啟動的程序並沒有獲得CUDA初始化的結果。而且我們測試發現,即使我們在global區域進行初始化CUDA的操作,在每個程序依然會呼叫。我們要做的就是把CUDA的初始化部分放到每個程序裡面,然後在main函式的第一句加上
mp.set_start_method('spawn')
修改後的主函式的程式碼片段如下:
.... .... .... if __name__ == "__main__": # to make sure multiprocess running on CUDA, you have to set start method as "spawn" mp.set_start_method('spawn') manager = mp.Manager() q = manager.Queue() lock = manager.Lock() gpuLock = manager.Lock() p = Pool() p.apply_async(serverSocket, args=(q, lock)) # start 10 processor for i in range(3): p.apply_async(run_task, args=(q, lock, gpuLock)) p.close() p.join()