2016-11-11 19 views
0

我想用Python中的多個進程共享一個數組。我通過使用multiprocessing.RawArray定義陣列並使用numpy.frombuffer()的陣列來完成CPU版本。當我試圖用chainer.cuda.to_gpu()將代碼移植到GPU時,我發現每個進程只是將其自己的副本複製到GPU內存空間中,並且該陣列不共享。有誰知道是否有辦法解決這個問題?用Python定義GPU內存共享數組?

謝謝!

回答

1

可能有辦法解決你的問題。

只要看看這裏:

sudo nvidia-smi 
Mon Nov 14 16:14:48 2016  
+------------------------------------------------------+      
| NVIDIA-SMI 358.16  Driver Version: 358.16   |      
|-------------------------------+----------------------+----------------------+ 
| GPU Name  Persistence-M| Bus-Id  Disp.A | Volatile Uncorr. ECC | 
| Fan Temp Perf Pwr:Usage/Cap|   Memory-Usage | GPU-Util Compute M. | 
|===============================+======================+======================| 
| 0 GeForce GTX TIT... Off | 0000:01:00.0  Off |     N/A | 
| 35% 76C P2 111W/250W | 475MiB/12287MiB |  60%  Default | 
+-------------------------------+----------------------+----------------------+ 

+-----------------------------------------------------------------------------+ 
| Processes:              GPU Memory | 
| GPU  PID Type Process name        Usage  | 
|=============================================================================| 
| 0  12235 C /home/tteikhua/torch/install/bin/luajit  215MiB | 
| 0  27771 C python           233MiB | 
+-----------------------------------------------------------------------------+ 

使用「NVIDIA-SMI」命令,你可以看到一個程序寫入到使用在火炬的GPU也共享GPU內存(只是總量可達個人GPU內存,你可以看到它比Titan X擁有的12G內存更少)和python(它正在運行Tensorflow)。

而共享完成的底層機制?這是因爲這兩個火炬和Tensorflow與CUDA編譯,並獲得了GPU還共享:

ls -al /proc/12235/fd|grep nvidia0 

lrwx------ 1 tteikhua tteikhua 64 Nov 12 07:54 10 -> /dev/nvidia0 
lrwx------ 1 tteikhua tteikhua 64 Nov 12 07:54 11 -> /dev/nvidia0 
lrwx------ 1 tteikhua tteikhua 64 Nov 12 07:54 12 -> /dev/nvidia0 
lrwx------ 1 tteikhua tteikhua 64 Nov 12 07:54 4 -> /dev/nvidia0 
lrwx------ 1 tteikhua tteikhua 64 Nov 12 07:54 5 -> /dev/nvidia0 
lrwx------ 1 tteikhua tteikhua 64 Nov 12 07:54 6 -> /dev/nvidia0 

ls -al /proc/27771/fd|grep nvidia0 

lrwx------ 1 tteikhua tteikhua 64 Nov 14 15:51 10 -> /dev/nvidia0 
lrwx------ 1 tteikhua tteikhua 64 Nov 14 15:51 11 -> /dev/nvidia0 
lrwx------ 1 tteikhua tteikhua 64 Nov 14 15:51 15 -> /dev/nvidia0 
lrwx------ 1 tteikhua tteikhua 64 Nov 14 15:51 16 -> /dev/nvidia0 
lrwx------ 1 tteikhua tteikhua 64 Nov 14 15:51 17 -> /dev/nvidia0 
lrwx------ 1 tteikhua tteikhua 64 Nov 14 15:51 9 -> /dev/nvidia0 

那麼,如何實現這一目標?

在這裏看看下面的圖片:

http://cuda-programming.blogspot.sg/2013/01/shared-memory-and-synchronization-in.html

enter image description here

這:

https://www.bu.edu/pasi/files/2011/07/Lecture31.pdf

這是GPU和CPU之間共享。但是,「共享」是共享相同GPU內存的兩個不同進程。這是可能的,如下圖所示:從CUDA樣本

修改simpleMultiCopy:

| Processes:              GPU Memory | 
| GPU  PID Type Process name        Usage  | 
|=============================================================================| 
| 0  12235 C /home/tteikhua/torch/install/bin/luajit  215MiB | 
| 0  27771 C python           233MiB | 
| 0  31014 C ./simpleMultiCopy        238MiB | 
| 0  31021 C ./simpleMultiCopy        238MiB | 
| 0  31024 C ./simpleMultiCopy        238MiB | 
+-----------------------------------------------------------------------------+ 

您可以看到運行中的個人記憶由不同的程序中使用GPU內存的同時共享同一個程序的結果的多個副本添加直到GPU上使用的總數。

對於chainer,我做了一個 「混帳克隆https://github.com/pfnet/chainer」,然後例子/ MNIST目錄跑 「蟒蛇train_mnist.py --gpu = 0」 的兩倍,並隨後得到了這一點:

| 0 GeForce GTX 850M Off | 0000:01:00.0  Off |     N/A | 
| N/A 64C P0 N/A/N/A | 322MiB/4043MiB |  81%  Default | 
| Processes:              GPU Memory | 
| GPU  PID Type Process name        Usage  | 
|=============================================================================| 
| 0  17406 C python           160MiB | 
| 0  17414 C python           160MiB | 
+-----------------------------------------------------------------------------+ 

這意味着兩個不同的進程共享相同的GPU內存。

+0

謝謝!這可能是一個愚蠢的問題,但我仍然無法理解爲什麼「每個進程都會打開/ dev/nvidia0,之後沒有其他進程可以打開它。」會使分享數組不可能。是否有可能每個進程打開/ dev/nvidia0並修改這個共享陣列,並讓這個GPU進入其他進程(如單CPU中的多處理器)?當你說「此後沒有其他進程可以打開它」時,你的意思是其他進程會永久卡住或者其他進程不能同時訪問這個數組? – username123

+0

對不起,我的錯誤,現在我已經更新了答案,我希望它澄清一切。你現在有更好的成功機會。 –