使用Python在GPU内存中定义共享数组?

时间:2016-11-11 22:58:03

标签: python arrays numpy multiprocessing

我正在尝试使用Python与多个进程共享的数组。我通过使用multiprocessing.RawArray定义数组并使用numpy.frombuffer()数组来执行CPU版本。当我尝试使用chainer.cuda.to_gpu()将代码移植到GPU时,我发现每个进程只是在GPU内存空间中复制自己的副本,并且不共享该数组。有谁知道是否有办法解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分: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"命令,你可以看到编写在Torch中使用GPU的程序也在共享GPU内存(只是单独的GPU内存,你可以看到它小于Titan X拥有的总12G内存)与python (正在运行Tensorflow)。

分享的基本机制如何完成?这是因为Torch和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,我做了一个" git clone https://github.com/pfnet/chainer",然后示例/ mnist目录运行" python 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内存。