junxiaosong / AlphaZero_Gomoku

An implementation of the AlphaZero algorithm for Gomoku (also called Gobang or Five in a Row)
MIT License
3.25k stars 965 forks source link

训练超级慢,有什么办法可以提高效率? #57

Open xbhuang1994 opened 6 years ago

xbhuang1994 commented 6 years ago

大量的计算力花费在了mcts的select与expand上,policy只占了1/8不到的时间,即使用TPU来跑CPU也跟不上,如何让mcts并发运行变得更加高效?

junxiaosong commented 6 years ago

MCTS模拟确实是占了绝大部分计算量的,所以deepmind采用了5000个TPU,要直接让它计算高效起来估计有点难,但MCTS是可以并行执行的,AlphaGo zero论文里使用了一个叫做virtual loss的trick来并行的跑mcts,大致来说就是当一个线程正在一个树分支上搜索时,临时改变一下这个分支上的节点的统计数据,比如把访问次数加的很大,使得其他并行搜索的线程会去搜索另外的分支。

onewxu commented 5 years ago

def has_a_winner(self): 判断输赢结局的函数需要穷举每个played的点,然后在四个方向搜寻n-in-a-row。可以考虑根据last_move信息,只搜索last_move为中心的四个方向。

hijkzzz commented 5 years ago

想训练快,可以看看我用C++实现的多线程版 https://github.com/hijkzzz/alpha-zero-gomoku

ChuxiJ commented 5 years ago

生成的棋盘对其对称旋转镜像转换,一次扩充8倍数据

qjchen1972 commented 5 years ago

@junxiaosong 非常优秀的代码。学习了。 更新 mcts 时,你使用了递归。这是慢的一个主要原因。 其实是可以改写为堆栈的方式

hijkzzz commented 5 years ago

@junxiaosong 非常优秀的代码。学习了。 更新 mcts 时,你使用了递归。这是慢的一个主要原因。 其实是可以改写为堆栈的方式

我测过 主要问题出在单线程GPU利用率太低 MCTS本身倒是不怎么消耗算力