感谢你阅读这篇文章。我已经开发了国际象棋AI,就像李世石或AlphaGo AlphaGo。我用过Python和tensorflow。国际象棋人工智能由蒙特卡罗树搜索、策略网络和价值网络组成。
我为蒙特卡罗树搜索的策略和价值网络做了学习。没有问题。但是,Montecarlo树搜索中的每个模拟都太慢了。所以我想提高每个模拟的速度。
我知道因为GIL,python不能共享对象。我真的需要帮上忙。如果你们有在python多进程中共享对象的经验,请分享你们的经验。
我在这个页面下面发布了摘要代码。
附言:我的英语不好。所以,如果你在阅读这一页时感到不舒服,那是我的错。请理解这一点。
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发布于 2019-01-09 03:28:33
我曾经尝试过类似的Go引擎,很抱歉我试图用Python项目来做这件事。
我从使用Cython加速开始,最终得到了90%的Cython风格的c代码和10%的Python代码。根据基准部分的不同,游戏加速比从70倍到230倍,平均游戏加速比约为110倍。
在那之后,我开始使用多任务处理,不幸的是,Python的某些部分很好,相当不合作,有点慢。还是有办法获得净利润的,这取决于你想做什么。
生成自玩游戏
工作得相当不错,我创建了一个设置,其中我有:
它能够将gpu占用率保持在80%左右的
多线程播放器
我尝试了几种工作人员的方法,同时最小化了他们之间的数据交换,因为这是一个巨大的瓶颈。一般来说,它归结为一个带有gametree的主控制器,它指示其他工作人员探索某个节点。拥有一个紧凑的板子表示来在工人之间发送数据是很重要的!
我做的最好的引擎有一个主gametree控制器和x个从树控制器,其中主控制器跟踪所有访问的节点,如果可以探索某个节点,则从树控制器跟踪从节点的请求。它变得有点复杂,但这样我就能够防止任何重复的节点访问。每个从机都有几个工作者,负责节点的实际探索,这样我就可以获得不错的gpu利用率。
未来
我,我不得不再做一次,Python是一个要求,我会为它创建很好的交互,并集成一些其他语言。例如,您可以将c/c++与cython集成。
https://stackoverflow.com/questions/49589088
复制相似问题