如何在不同的Python进程之间为不同的神经网络设置共享权重?

2024-04-20 02:59:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用Python实现异步版本的deep Q-learning算法,它需要在异步更新的不同进程之间共享一个神经网络。我知道由于GIL的原因,在Python中共享对象本身是相当困难的,并且我发现可以使用https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Array简单地共享其权重。你知道吗

但问题是这个数组对象是1D的,不支持reshape()flatten()操作,这意味着每次我想将局部权重复制到全局权重时,我都必须获取所有权重,重塑它们并将它们转换成这个数组。当我想复制权重的时候,我需要做相反的转换,这在计算上是非常昂贵的。我想知道是否有好的方法将一些共享数组(不需要是这个数组对象)直接集成到神经网络的权值中,这样每次调用update()时它都会直接修改全局权值?你知道吗

谢谢!你知道吗


Tags: 对象https版本算法进程原因神经网络数组
1条回答
网友
1楼 · 发布于 2024-04-20 02:59:44

关键是使用某种共享内存空间为numpy数组分配内存。multiprocessing.Array对象实际上是实现这一点的一种非常好的方法。然后可以使用numpy创建Array对象的视图,所有视图将共享内存。您可以在主进程中执行一次,也可以让每个子进程在开始工作之前执行一次。我用第一种方法写了一个例子。请记住,这决不是“进程安全的”,因此您需要使用自己的锁定。你知道吗

from multiprocessing import Pool, Array
import numpy as np
import ctypes

shape = (10, 2)
_shared_array = Array(ctypes.c_double, np.prod(shape), lock=False)
shared_array = np.frombuffer(_shared_array, dtype='double').reshape(shape)

def target_func(index, value):
    shared_array[index, :] = value

p = Pool(4)
for i in range(10):
    p.apply_async(target_func, args=(i, i**2))

p.close()
p.join()

print shared_array
# [[  0.   0.]
#  [  1.   1.]
#  [  4.   4.]
#  [  9.   9.]
#  [ 16.  16.]
#  [ 25.  25.]
#  [ 36.  36.]
#  [ 49.  49.]
#  [ 64.  64.]
#  [ 81.  81.]]

相关问题 更多 >