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

标签 python multithreading neural-network multiprocessing

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

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

谢谢!

最佳答案

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

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.]]

关于python - 如何为不同Python进程之间的不同神经网络设置共享权重?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40433280/

相关文章:

python - 通过正则表达式使用替代方法连接术语

java - 如何监控/记录 Tomcat 线程池?

python - 是否可以在 tensorflow 中跨多个 GPU 拆分网络?

language-agnostic - 您将使用哪种学习算法来构建人类解决给定数独情况需要多长时间的模型?

python - 使这个简单的 for/if block 更像 pythonic

Python 'float64' 无法转换为 MySQL 类型,但在手动查询中没问题

python:如何生成位图?

c# - ConcurrentBag 字符串并在 Parallel.ForEach 中使用 .Contains

android - android什么时候会自动挂起一个线程?

python - 尽管一切似乎都正常,神经网络却给出了错误的预测