CGLemon / Sayuri

AlphaZero based engine for the game of Go (圍棋/围棋).
GNU General Public License v3.0
74 stars 9 forks source link

selfplay 不使用gpu #17

Open Nightbringers opened 7 months ago

Nightbringers commented 7 months ago

按照默认的各个参数, $ cp -r bash selfplay-course $ cd selfplay-course $ bash setup.sh -s .. $ bash selfplay.sh 有gpu但是没使用,是哪里需要改设置吗

CGLemon commented 7 months ago

可能是因為你使用 CPU 版本的引擎,請重新編譯,在 cmake 時加入

-DBLAS_BACKEND=CUDA-DBLAS_BACKEND=CUDNN

一般而言,自對戰時 cuDNN 版本會稍快一點

Nightbringers commented 7 months ago

是用的cuDNN 版本,我测试如果 直接bash selfplay.sh,会不使用gpu, 但是将权重文件放到Sayuri/selfplay-course/workspace/weights 下面的话会使用gpu,但是利用率非常低,显存占用也很少,速度很慢。 想接着下面这个权重继续训练,增大搜索次数,该改哪些地方呢,提高gpu的利用率。 Network Verison: 3 Input Channels: 43 Residual Blocks: 20 Residual Channels: 256

Nightbringers commented 7 months ago

--parallel-games 256 --batch-size 256 这两个对gpu的利用率有很大影响,但越大反而利用率越低,为什么呢? 还有 parallel-games 和batch-size 这两个概念上的区别是什么呢?

CGLemon commented 7 months ago



Nightbringers commented 7 months ago

我有 3090 8 ,有时候也能用到 A100 8,所以训练20bx256c 没问题,可以训练更大的,比如30bx384c,并使用更多的搜索次数,我想训练一个更大的看看效果能不能匹敌 katago,所以可以提供一个详细的训练设置吗,我来帮你实验一下。

使用的full-alphazero-p400.txt 这个配置

如果这样设置parallel-games 和batch-size,利用率只有二十几: --parallel-games 256 --batch-size 128 ========================================+======================+======================| | 0 NVIDIA GeForce RTX 3090 On | 00000000:1B:00.0 Off | N/A | | 37% 51C P2 150W / 350W| 1043MiB / 24576MiB | 23% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ | 1 NVIDIA GeForce RTX 3090 On | 00000000:1C:00.0 Off | N/A | | 33% 49C P2 152W / 350W| 1043MiB / 24576MiB | 24% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------

如果这样设置,利用率差不多40: --parallel-games 128 --batch-size 64 0 NVIDIA GeForce RTX 3090 On | 00000000:1B:00.0 Off | N/A | | 72% 68C P2 263W / 350W| 1035MiB / 24576MiB | 39% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ | 1 NVIDIA GeForce RTX 3090 On | 00000000:1C:00.0 Off | N/A | | 60% 61C P2 257W / 350W| 1035MiB / 24576MiB | 39% Default | | | | N/A |

如果这样设置,利用率差不多50几: --parallel-games 64 --batch-size 32 =========================================+======================+======================| | 0 NVIDIA GeForce RTX 3090 On | 00000000:1B:00.0 Off | N/A | | 65% 65C P2 274W / 350W| 1027MiB / 24576MiB | 50% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ | 1 NVIDIA GeForce RTX 3090 On | 00000000:1C:00.0 Off | N/A | | 55% 60C P2 283W / 350W| 1027MiB / 24576MiB | 56% Default | | | | N/A

好奇怪,越小利用率越高。

下面是训练时出的一个错误: serWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector. warnings.warn('Was asked to gather along dimension 0, but all ' Traceback (most recent call last): File "Sayuri/selfplay-course/torch/main.py", line 19, in main(gather_config(args.json)) File "/Sayuri/selfplay-course/torch/main.py", line 8, in main pipe.fit_and_store() File "/Sayuri/selfplay-course/torch/train.py", line 543, in fit_and_store loss.backward() File "/torch/lib/python3.11/site-packages/torch/_tensor.py", line 492, in backward torch.autograd.backward( File "/torch/lib/python3.11/site-packages/torch/autograd/init.py", line 244, in backward gradtensors = _make_grads(tensors, gradtensors, is_grads_batched=False) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/torch/lib/python3.11/site-packages/torch/autograd/init.py", line 117, in _make_grads raise RuntimeError( RuntimeError: grad can be implicitly created only for scalar outputs

CGLemon commented 7 months ago

我一直有在估計超過 KataGo 大概需要多少 GPU,如果要超過 KataGo g170(2020 年六月的版本,分散訓練之前的版本),至少需要 40 張 V100 跑 70 天左右,也就是 2800 days/GPU,我自己也只跑了 120 days/GPU 左右,顯然對抗 KataGo 沒有大規模的硬體是不可能的

如果你想繼續訓練 20b 權重的話,你需要先產生至少 80 萬盤自對戰資料(當然越多越好),然後用這些資料重新訓練新的網路。因為我自己的硬碟壞了,之前練到一半的網路和訓練資料都遺失了,這只能你自行補足。

我自己選用的對戰參數值為下,直接修改 selfplay-config.txt 就可以了

--playouts 400
--gumbel-playouts-threshold 55
--reduce-playouts 100

產生足夠資料後,用監督學習的方式產生新的 20b 網路,學習率從 0.005 一路降低 0.0003 為止,batch size 選 128,訓練的大原則為,每 512000 steps 就砍半一次學習率,你可以這樣設置

  1. 0 ~ 512000 steps, learning rate=0.005
  2. 512000 ~ 1536000 steps, learning rate=0.0025
  3. 1024000 ~ 1536000 steps, learning rate=0.001
  4. 1536000 ~ 2048000 steps, learning rate=0.0005
  5. 2048000 ~ 2560000 steps, learning rate=0.0003

注意一下這是,batch size 在 128 的條件下,如果 batch size 增加 2 倍,則學習率要減 2 倍,例如 batch size 增加 4 倍變成 512 則

  1. 0 ~ 512000 steps, learning rate=0.00125
  2. 512000 ~ 1536000 steps, learning rate=0.000625
  3. 1024000 ~ 1536000 steps, learning rate=0.00025
  4. 1536000 ~ 2048000 steps, learning rate=0.000125
  5. 2048000 ~ 2560000 steps, learning rate=0.000075

之後再從新練的網路跑開始跑強化學習。

由於我個人使用的 GPU 只有單機的,所以我不清楚利用率反常原因為何?下面 python 的 bug 也可能是因為使用多 GPU 導致的,我需要花一點時間排除問題。

當然當前程式碼跑多 GPU 訓練效率其實很低,基本上我只有考慮單 GPU 情況,近期我也有準備要修改這部份程式碼,如果你有意願要跑,我會將此部份改進排到前面來做。

Nightbringers commented 7 months ago

80 万盘才训练是不是太多了, 是数据增强后的吗, 跑10万盘增强后就是80万盘了。是不是模型的水平越高,需要跑的盘数就越多。

模型的结构为什么不采用 nest bottleneck blocks呢

20b 256c 的网络现在是不是到上限了呢,感觉需要增大网络, 至少katago 18b 384 c 对标的是40b 256 c。

CGLemon commented 7 months ago
Nightbringers commented 7 months ago

先使用监督学习训练再用强化学习训练 这样训练出来会比只使用强化学习弱吗?

我看 GUMBEL 论文和 katago 都说 nest bottleneck 更强。

我看有篇论文说 GUMBEL alphazero 会比 alphazero 弱, 你觉得是这样吗

CGLemon commented 7 months ago
Nightbringers commented 7 months ago
  1. 为了加快学习速度, 先用一个高水平模型self-play 产生数据,用这些数据训练一个新的网络,然后后面都用新的网络self-play,然后继续训练。 这样的话会影响网络的最终性能吗? 会比只用新的网络self-play 训练出来的网络弱吗?
  2. 我看目前网络使用的是resnet v1, 即conv-bn-act, 但katago使用的是 resnet v2, 即 bn-act-conv, 这里会不会影响效果呢? v2 是否会比 v1 强一些?
  3. 首先, 我自己测试使用mctx 里的mctx.gumbel_muzero_polic 似乎弱与 mctx.muzero_policy。 且一篇论文中https://github.com/rlglab/minizero。有实验结果 : 200次搜索的情况下, AlphaZero = muzero, 使用16次搜索的情况下, Gumbel AlphaZero < Gumbel muzero
CGLemon commented 7 months ago
  1. 不好意思沒有看懂問題,只用新的網路跑 self-play 和先用高強度的網路跑訓練資料,這兩個情況有哪裡不同?
  2. KataGo 的網路結構來自於此篇論文 的 full pre-activation 結構,這樣作法有好有壞,好處是理論性能會比較好,壞處是無法將所有 bn 和 conv 層做合併優化操作。我並沒有試過,但 KataGo 的任何文檔中沒有特別描述此結構,我猜是因為性能沒有明顯差異。
  3. 我認為無法從這篇論文得出 Gumbel MuZero 好於 Gumbel AlphaZero 或是 Gumbel AlphaZero 和 AlphaZero 誰好誰壞的結論,一來是因為它只訓練一下而已,二來是觀察 Othello 和 Go 9x9 的結論會不一樣。如果只考慮模擬次數的話,我個人比較相信 Gumbel 會比較強,但這只僅限於我自己的實作,不同實作的細節調整會不一樣,而且比較不同方法的強弱其實有點麻煩,必須要多個網路相互對打才能得到穩定的 Elo 評分。這邊我依照原本 Gumbel 論文假設 Gumbel MuZero 和 MuZero 在 n=200 是一樣效率的,那理論上再考慮 reuse tree 的話

    AlphaZero > Gumbel AlphaZero

    因為 Gumbel 會限制樹搜尋的形狀,導致 reuse tree 的效率降低

    至於你自己的對打得到 MuZero 好於 Gumbel MuZero 這個結論有可能是因為

    • 直接使用 gumbel_muzero_polic 對打 muzero_policy:gumbel_muzero_polic 僅使用於 selfp-play,不會使用於 rating game
    • 網路強度波動:在訓練過程中網路並不是不斷在變強的,可能你剛好選到弱的網路對打強的網路
    • 隨機性不足:多個 rating game 跑出一樣的結果,導致結果失準

    如果你以上都確認過沒問題,那應該可以宣稱 MuZero 好於 Gumbel MuZero

Nightbringers commented 7 months ago
  1. 比如我要新训练一个网络, 其初始elo 为 0, 假设我有另一个网络,其 elo 为2000。 方法一: 我先用 elo 2000的网络 self-play 产生数据, 去训练 elo 为 0 的网络。 这样的话 elo 为 0的网络提升就会很快。 后面我再用新网络 self-play 继续训练,不再借助 elo为 2000的网络了。 方法二: 一直使用新网络self-play 训练, 也就是 elo 为 0 的网络,相当与从0学起 。 这样水平提升会比较慢。但是训练到最终的网络可能会强于 方法一训练的吗?
CGLemon commented 7 months ago

我想不會有太大影響,因為在擴張網路時,也只會拿部份的資料訓練,這根你描述的方法一本質是一樣的。

而且要把一個 20b 的網路完全練到飽和,從零開始練,看起來也需要超過 1500 days/GPU,所以就算兩個方法有差異好了,你也要跑很久跑到快飽和才會有效益。

Nightbringers commented 7 months ago

katago的训练数据为什么才十几万盘游戏呢?

CGLemon commented 7 months ago

不好意思,哪裡有提及 KataGo 只使用十幾萬盤遊戲呢?

Nightbringers commented 7 months ago

kata1-b18c384nbt-s9462441216-d4173921862 [126907 training games] [806 rating games]

这里 126907 training games。

下一版本终于要开始训练了,期待。下一版主要有哪些改进呢

CGLemon commented 7 months ago

training games 代表用這個權重產生多少盤訓練資料,rating games 跑多少用以測定強度的對局,所以並不是前資料集大小。現在 KataGo 至少使用最新的數百萬盤作為訓練資料,詳細數字我就不確定了。

這個版本主要改進為支援日本規則,因為 UEC cup 是使用日本規則,看現在時間接近了,趕快丟上去練,餘下的是一些關於強化學習的小改進錯誤修正。

另外一個比較重要的改進為,嘗試支援強度調整和多變棋風,看起來兩者結合能提昇對戰體驗,但當前 v0.7.0 只有開放強度調整選項而已,預計 v0.7.1 後才會整合棋風選項。