1. 程式人生 > >解決CUDA error (3): initialization error (multiprocessing)

解決CUDA error (3): initialization error (multiprocessing)

在做一個影象處理相關的專案,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()