Open Nightbringers opened 9 months ago
可能是因為你使用 CPU 版本的引擎,請重新編譯,在 cmake
時加入
-DBLAS_BACKEND=CUDA
或 -DBLAS_BACKEND=CUDNN
一般而言,自對戰時 cuDNN 版本會稍快一點
是用的cuDNN 版本,我测试如果 直接bash selfplay.sh,会不使用gpu, 但是将权重文件放到Sayuri/selfplay-course/workspace/weights 下面的话会使用gpu,但是利用率非常低,显存占用也很少,速度很慢。 想接着下面这个权重继续训练,增大搜索次数,该改哪些地方呢,提高gpu的利用率。 Network Verison: 3 Input Channels: 43 Residual Blocks: 20 Residual Channels: 256
--parallel-games 256 --batch-size 256 这两个对gpu的利用率有很大影响,但越大反而利用率越低,为什么呢? 还有 parallel-games 和batch-size 这两个概念上的区别是什么呢?
selfplay-course/workspace/weights
下不存在權重,則會自動使用亂數取代實際的網路運算,這樣產生開始的資料會比較有效率。--parallel-games
和 --batch-size
的意義
我們可以將自對戰引擎拆分為三個部份
n
個 worker) 完整的執行流為,search workers 執行 MCTS,需要拓展節點時,將網路運算請求放入 query queue 並等待之,network worker 等到累積足夠的 query 則值執行一次網路運算,並返回結果給對應的 search worker。
--parallel-games
代表有多少 search workers,而 --batch-size
代表需要累積多少 query。所以,如果 --parallel-games
的數量不夠,network worker 需要等待相當時間才能執行一次運算,如果 --batch-size
太小,則網路吞吐量會顯著下降。
較理想的情況,先選擇能有效利用 GPU 的 --batch-size
值,之後 --parallel-games
則選擇 --batch-size
的 2 倍值。例如 --batch-size
設定為 32 則 --parallel-games
設定為 64。
我有 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
我一直有在估計超過 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 就砍半一次學習率,你可以這樣設置
注意一下這是,batch size 在 128 的條件下,如果 batch size 增加 2 倍,則學習率要減 2 倍,例如 batch size 增加 4 倍變成 512 則
之後再從新練的網路跑開始跑強化學習。
由於我個人使用的 GPU 只有單機的,所以我不清楚利用率反常原因為何?下面 python 的 bug 也可能是因為使用多 GPU 導致的,我需要花一點時間排除問題。
當然當前程式碼跑多 GPU 訓練效率其實很低,基本上我只有考慮單 GPU 情況,近期我也有準備要修改這部份程式碼,如果你有意願要跑,我會將此部份改進排到前面來做。
80 万盘才训练是不是太多了, 是数据增强后的吗, 跑10万盘增强后就是80万盘了。是不是模型的水平越高,需要跑的盘数就越多。
模型的结构为什么不采用 nest bottleneck blocks呢
20b 256c 的网络现在是不是到上限了呢,感觉需要增大网络, 至少katago 18b 384 c 对标的是40b 256 c。
先使用监督学习训练再用强化学习训练 这样训练出来会比只使用强化学习弱吗?
我看 GUMBEL 论文和 katago 都说 nest bottleneck 更强。
我看有篇论文说 GUMBEL alphazero 会比 alphazero 弱, 你觉得是这样吗
.txt
等權重是無法用於網路訓練的,它們有做破壞性壓縮並缺乏優化器所需的訊息。我認為無法從這篇論文得出 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 這個結論有可能是因為
如果你以上都確認過沒問題,那應該可以宣稱 MuZero 好於 Gumbel MuZero
我想不會有太大影響,因為在擴張網路時,也只會拿部份的資料訓練,這根你描述的方法一本質是一樣的。
而且要把一個 20b 的網路完全練到飽和,從零開始練,看起來也需要超過 1500 days/GPU,所以就算兩個方法有差異好了,你也要跑很久跑到快飽和才會有效益。
katago的训练数据为什么才十几万盘游戏呢?
不好意思,哪裡有提及 KataGo 只使用十幾萬盤遊戲呢?
kata1-b18c384nbt-s9462441216-d4173921862 [126907 training games] [806 rating games]
这里 126907 training games。
下一版本终于要开始训练了,期待。下一版主要有哪些改进呢
training games 代表用這個權重產生多少盤訓練資料,rating games 跑多少用以測定強度的對局,所以並不是前資料集大小。現在 KataGo 至少使用最新的數百萬盤作為訓練資料,詳細數字我就不確定了。
這個版本主要改進為支援日本規則,因為 UEC cup 是使用日本規則,看現在時間接近了,趕快丟上去練,餘下的是一些關於強化學習的小改進錯誤修正。
另外一個比較重要的改進為,嘗試支援強度調整和多變棋風,看起來兩者結合能提昇對戰體驗,但當前 v0.7.0 只有開放強度調整選項而已,預計 v0.7.1 後才會整合棋風選項。
按照默认的各个参数, $ cp -r bash selfplay-course $ cd selfplay-course $ bash setup.sh -s .. $ bash selfplay.sh 有gpu但是没使用,是哪里需要改设置吗