参考前文:
https://www.cnblogs.com/devilmaycry812839668/p/15417184.html
相关资料:
https://www.bilibili.com/video/BV1r4411W7b2/?spm_id_from=333.788.recommend_more_video.5
=============================================
最近看到了一款AI围棋软件 Leela-go,该款软件具体中文介绍:
https://hhpetra.github.io/leelachinese/index
目前每天有600人左右在为leela-zero提供训练。在半年的时间内leela-zero已经自我对弈700万局,经历128次权重更迭。详细信息前往sjeng查看。 一次权重更迭就代表leela-zero 的一次进步。虽然每个人的力量很弱小,但我们团结在一起的力量是无比巨大的。Leela-zero从牙牙学语,到如今具备职业棋手水平,参与训练的志愿者们功不可没!
==============================================
leela-zero源代码地址:
https://github.com/leela-zero/leela-zero
leela-zero的源代码太多,而且也很复杂,自己实在是看不下来,所以就查了查资料,看看leela-zero这个分布式训练到底是怎么回事???
最后找到的资料就是上面的内容,其显示说leela-zero分布式训练其实就是多个加入的客户端主机生成训练数据然后将训练数据发送给云服务器,然后再由云服务器将收集到的这些数据用来训练然后得到新的参数,然后那些客户端再从云服务器上同步到最新的参数,然后再利用新获得的参数生成数据发送给云主机,如此反复。
这个过程是上面资料中显示的,源代码网址上也没有给出相关的解释,这里我们姑且认为这个说法是正确的。
但是上面的这个过程我又感觉有些不足,主要体现就是客户机只负责生成训练数据而不参加参数训练,服务器只负责参数训练而不负责参数生成,这个设计可以很好的保证加入进来的客户机不会浪费计算资源,同时客户机可以很好很灵活的加入到这个系统中,但是美中不足的就是服务器最后要独自参与参数的训练,而这个要求服务器具备一定的计算能力。那么我们可以不可以让客户机在生成数据的同时也进行训练呢,我想这也是可以的。一个个人的设计就是客户端参与参数的训练,客户端生成一定数据后在本地进行训练,然后将训练好的数据发送给服务器。不过这个设计问题更大,最后想想这个设计看似很好其实却赶不上现在的设计,这个问题也是我后来跑了一下leela-zero代码才发现原因。
使用leeLa-zero代码跑一局谱在使用GTX1060显卡的条件下大约几十分钟,一个小时可能也就只能跑个3盘棋局,那么想leela-zero 官网上自己训练2000万盘棋局需要跑1700年还是有道理的,一个小时假设跑3局,一天跑24*3=72,一年是365*72=26280,那么1700年也就只能跑出44676000个棋局数据,当然我们假设每小时可以跑的棋局数十分的粗糙,如果一个小时假设跑2局,那么1700年就能跑1700*365*24*2=29784000。
看下官网:
官网中训练21709096个数据,那么用1700年对于一般用户来说也是说的过去的。
不过对于官网中的Training数到底是下棋的局数还是下棋走的步骤还是有些说不好的,不过不管这个数是如何定义的我们都可以知道在leela-zero的整个训练过程中其实绝大部分时间都是在生成训练数据中,而真正用于参数训练的时间并不是很长,因此leela-zero的分布式设计是将参数训练放在了服务器上而把数据生成反正了客户机上,因此按照这个道理leela-zero的分布式设计是完全OK的。如果按照刚才我自己提出的这个设计服务器端参数训练不再是瓶颈,但是服务器端的网络传输将会成为瓶颈,因为改用自己刚才的这个设计客户端进行参数训练后是需要把训练好的参数发送给服务器的,这个情况下进行参数的传输将会增加几十倍甚至是上百倍的数据量,这样更有可能导致服务器运行性能的下降,当然这些也都是在没有知道服务器真实硬件环境下胡猜的。
其实客户机既能生成数据又能训练参数的另一个好处就是可以考虑不使用C/S架构还是使用P2P架构,这个情况下可以借鉴的就是区块链了。
区块链一直被诟病的问题就是大量的计算其实并没有什么太多的实际意义,如果区块链的hash计算换成了围棋的跑谱计算这样可以不可以呢,至少这样搞以后计算也变得有实际意义了。
这里另个设想就是用区块链技术去融入到leela-zero这种分布式应用中来,如每个节点都负责生成数据和训练数据以获得最新的参数,每个节点生成一定数量的数据后就进行训练,如果训练后得到的参数可以比原参数获胜率高于55%则保存新获得的参数并将其作为默认参数。
如何将区块链技术融合到leela-zero中还是有些难度的,至少自己想了想还是没有很好的思路,不过如果这个可行那么这个就会是一个很好的改变。