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