1

感谢阅读本文。我开发了像 AlphaGo Lee 或 AlphaGo Zero 这样的国际象棋 AI。我用过 Python 和 tensorflow。国际象棋AI由Montecarlo-Tree-Search、策略网络和价值网络组成。

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

我知道由于 GIL,python 不共享对象。我真的需要为此提供帮助。如果你们有在 python 多处理中共享对象的经验,请分享你的经验。

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

ps:我英文不好。因此,如果您在阅读此页面时感到不舒服,那是我的错。请理解。

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
4

1 回答 1

0

我已经为 Go 引擎尝试过类似的东西,我很抱歉尝试使用 Python 项目这样做。

我开始使用 Cython 来加快速度,最终得到了 90% 的 Cython 风格的 c 代码和 10% 的 Python 代码。根据基准测试部分,加速从 70 倍到 230 倍,平均游戏加速约为 110 倍。

在那之后,我开始使用多任务处理,不幸的是,Python 的某些部分很好,相当不合作并且有点慢。仍然有一些方法可以获得净利润,这取决于你想做什么。

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

  • 1个工作人员处理一般流程,决定何时训练新模型等游戏生成器工作线程的数量等
  • 2 名工人为 gpu 提供要评估的位置
  • x 工人玩游戏,以生成自我游戏数据或评估模型强度
  • 1名工人存储所有用于训练的selfplay游戏
  • 1 名工人培训新模式

    它能够将 gpu 保持在 80% 左右

多线程播放器
我尝试了几种方法与工人一起尽量减少他们之间的数据交换,因为这是一个巨大的瓶颈。一般来说,它归结为一个带有游戏树的主控制器,它指示其他工作人员探索某个节点。有一个紧凑的板表示来在工人之间发送数据是至关重要的!

我制作的最好的引擎有一个主游戏树控制器和 x 个从树控制器,其中主控制器跟踪所有访问的节点,并且从服务器请求它是否可以探索某个节点。它有点复杂,但这样我就能够防止任何重复的节点访问。每个奴隶都有几个工人实际探索一个节点,这样我就得到了不错的 gpu 利用率。

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

于 2019-01-08T19:28:32.983 回答