cover
田渊栋 2018年5月5日 01:21

关于ELF OpenGo一些问题的回复

最近网上很多讨论我们刚发布的ELF OpenGo的热帖,没有时间一一回复了。我把一些问题统一起来在这里回复一下。

首先非常感谢LeelaZero团队以最快的速度把我们的权重转成了LeelaZero可以用的格式,这样大家可以在第一时间看到我们这个AI的水平,并且能亲手验证。这个充分说明了我们的工作是可重复的,并且可以造福大家。我们感到非常高兴。

大家可能会觉得这个版本在较少搜索次数(rollouts),比如说每步800或者1600的时候效果没有那么好。这个是因为我们在蒙特卡罗搜索(MCTS)里面用了batching,比如说每8次或者16次搜索(rollout)放一起送给神经网络,这样GPU的效率会高很多。内部测过加和不加batching,在同样搜索次数下,可能要差几倍的速度。但是副作用就是会影响棋力。这个是因为MCTS本来就是个串行算法,理想情况下应该是每一步新的搜索都依赖之前所有搜索的胜率估计;现在每8次或者16次搜索统一处理,那就不是理想情况了。这个问题在较少搜索次数时尤为严重,因为每一次搜索都尤其宝贵。解决的办法当然是减少batch的大小,像800或者1.6k这样的,batchsize选4会比较好(对应的开关是--mcts_rollout_per_batch 和 --batchsize),但是这样速度确实会慢一点。batchsize选16只适合于总搜索次数多(比如说每步80k)的情况,当然更大的batchsize就没有什么好处了。

接下来大家可能会问在自对弈的时候这个要怎么办。自对弈的时候每步只有1.6k的搜索次数,不batch速度慢,batch了棋力变差,两难啊。这里就要提到ELF的好处了。我们自对弈的时候是每个GPU上同时跑32个棋局,开32个独立的MCTS搜索,然后总的batchsize是128。每个棋局上完全没有batch,就把当前搜索的单个局面送给ELF,让ELF去动态batch不同棋局的局面,然后绑一起送给神经网络,这样就兼顾了效率和棋力。在这种设置下,batchsize不再是个常数,基本上平均batchsize在90左右,已经是很好的了。当然副作用是一开始自对弈会出来得慢些。

英文版见: Answer some questions about batchsize. · Issue #25 · pytorch/ELF

相关阅读
  • 推荐阅读
  • 文章导航