如何在多进程中共享对象,python

时间:2018-03-31 14:58:51

标签: python tensorflow deep-learning multiprocessing monte-carlo-tree-search

感谢您阅读本文。 我开发了像AlphaGo Lee或AlphaGo Zero这样的国际象棋AI。 我使用过Python和tensorflow。 国际象棋AI由蒙特卡罗树搜索,政策网络和价值网络组成。

我为蒙特卡洛树搜索学习了政策和价值网络。没有问题。但是,蒙特卡洛树搜索中的每个模拟都太慢了。所以我想提高每个模拟速度。

我知道python因GIL而无法共享对象。我真的需要帮助。如果你们有关于python多处理中共享对象的经验,请分享你的经验。

我在此页面下方发布了摘要代码。

p.s:我不擅长英语。所以,如果您在阅读本页时感到不舒服,那就是我的错。请理解。

class monte
#I want to share Tree in multiprocessing
tree = Tree()

def doMontecarloTreeSearch:
    while numberOfsimulation:
        #I want to boost speed each simulation
        # but each search() computing neural network to make new node
        # so they spend much time.
        search()

def search:
    #node is created in each selection and is added in tree
    while is_gameover():
        selection()
        evaluation()
    backpropagation()

def selection
    #add best value node in Tree
def evaluation
    #each node is evaluated for expasion
def backpropagation
    # after gameove, leaf node backpropagate gameresult
    # and patent nodes are updated util parent node is root node

1 个答案:

答案 0 :(得分:0)

我已经为Go引擎尝试了类似的方法,但很抱歉,我尝试在Python项目中这样做。

i首先使用Cython加快了工作速度,最后得到90%的Cython风格c代码和10%的Python代码。根据基准测试部分的不同,提速幅度为70倍至230倍,平均游戏提速约为110倍。

之后,我开始使用多任务处理,不幸的是,Python的某些部分很好,相当不合作,而且运行起来有些慢。 仍然有获取净利润的方法,具体取决于您想做什么。

生成自玩游戏
  效果很好,我在其中创建了一个设置:

  • 1名工人处理一般流程,确定何时训练新模型的游戏生成器工人线程数等
  • 2名工人向gpu供餐,需要评估的职位
  • x个玩游戏的工人,用于生成自玩数据或评估模型强度
  • 1名工人存储了所有用于训练的自玩游戏
  • 1名工人正在训练新模型

    它能够将gpu占用80%左右

多线程播放器
我尝试了几种方法,同时最大程度地减少了工人之间的数据交换,因为这是一个巨大的瓶颈。通常,它归结为带有游戏树的主控制器,该游戏树指示其他工作人员探索某个节点。拥有紧凑的董事会代表在工人之间发送数据至关重要!

我制造的最好的引擎有一个主gametree控制器和x个从属树控制器,其中主跟踪所有被访问的节点,而从属则请求探索某个节点。它有点复杂,但是那样我可以防止任何重复的节点访问。每个奴隶都有几个真正进行节点探索的工人,这样我得到了不错的GPU利用率。

未来
我不得不再做一次,Python是一个要求,我会为此为其创建良好的交互并集成其他语言。例如,您可以将c / c ++与cython集成