Open xbhuang1994 opened 6 years ago
MCTS模拟确实是占了绝大部分计算量的,所以deepmind采用了5000个TPU,要直接让它计算高效起来估计有点难,但MCTS是可以并行执行的,AlphaGo zero论文里使用了一个叫做virtual loss的trick来并行的跑mcts,大致来说就是当一个线程正在一个树分支上搜索时,临时改变一下这个分支上的节点的统计数据,比如把访问次数加的很大,使得其他并行搜索的线程会去搜索另外的分支。
def has_a_winner(self): 判断输赢结局的函数需要穷举每个played的点,然后在四个方向搜寻n-in-a-row。可以考虑根据last_move信息,只搜索last_move为中心的四个方向。
想训练快,可以看看我用C++实现的多线程版 https://github.com/hijkzzz/alpha-zero-gomoku
生成的棋盘对其对称旋转镜像转换,一次扩充8倍数据
@junxiaosong 非常优秀的代码。学习了。 更新 mcts 时,你使用了递归。这是慢的一个主要原因。 其实是可以改写为堆栈的方式
@junxiaosong 非常优秀的代码。学习了。 更新 mcts 时,你使用了递归。这是慢的一个主要原因。 其实是可以改写为堆栈的方式
我测过 主要问题出在单线程GPU利用率太低 MCTS本身倒是不怎么消耗算力
大量的计算力花费在了mcts的select与expand上,policy只占了1/8不到的时间,即使用TPU来跑CPU也跟不上,如何让mcts并发运行变得更加高效?