关于项目的疑问
你好,我是新手有一些疑问,请教一下:
起因是我想学习和训练类似于alphazero、muzero的中国象棋,搞了很久都搞不定,最近发现的当前项目框架🎉 https://github.com/windshadow233/python-chinese-chess这个库很好的实现了游戏环境,不知道是否也可以把中国象棋接入项目demo。
1.是否有计划适配python3.14 no-gil的计划? 2.当前我测试运行五子棋的demo,即使是开启了ctree(或者是调整采集器数量基本都没啥用),GPU利用率每张卡仍然很低大概10%的利用率。(128核+8*5090+512G内存) 3.当前replay_buffer是否有磁盘到内存的映射?随着长时间的运行内存变得很大导致被系统强行kill,降低replay_buffer_size我觉得可能会影响到模型的性能。
以上是一些想要了解的地方,我也尝试过查询手册和AI。
您好!非常感谢您的提问,这些问题都很有价值。针对您的疑问,我们简要回复如下:
-
关于接入中国象棋:我们非常欢迎您将中国象棋接入 LightZero!您可以参考 zoo/board_games/gomoku 的实现,主要步骤是:封装环境、创建 config 文件、提交 PR。我们很乐意与您一起 review 代码并讨论后续优化。
-
关于 Python no-GIL 适配:我们暂时没有适配计划。主要原因是 LightZero 的性能瓶颈(C++ 实现的 MCTS 和 GPU 推理)已经绕开了 GIL,因此 no-GIL 的直接收益有限。我们会在相关生态(如 PyTorch)成熟后重新评估。
-
关于 GPU 利用率低:可能是当前 AlphaZero 的 C++ MCTS (mcts_alphazero) 实现效率不高。它在每次 MCTS 模拟中,都会回调 Python 并向 GPU 请求对单个样本(batch_size=1)进行推理。这种模式导致 GPU 大部分时间都在等待,无法发挥其并行计算的优势。优化方向是将 MCTS 重构为“跨环境批量推理”模式:即在所有并行环境中同时执行一步 MCTS 模拟,收集所有待评估的叶节点,然后将它们组成一个大批次(batch)一次性送入 GPU。这项优化工作可能耗时会比较久,不过基于 LLM 的辅助应该会大幅提升开发效率,非常欢迎您的贡献(我们暂时还没有此项优化计划,最近的研究主要基于 MuZero 进行)。LightZero 中的 MuZero 实现 (muzero_mcts_ctree) 已经采用了这种高效架构,可以作为参考。如果您近期时间有限,我们建议您可以先从 MuZero 入手进行探索。它的 MCTS 实现已经解决了此性能瓶颈,能让您直接体验到高效的 GPU 利用率。
-
关于 Replay Buffer:目前是纯内存设计,没有磁盘映射。这是为了保证训练采样的高性能,避免 I/O 成为瓶颈。解决方案:对于内存问题,建议将 replay_buffer_size 设置在一个合理的范围,如 1e5 左右。这对棋类游戏来说,通常是在模型性能和内存消耗之间的一个良好平衡点。(Buffer 太小,模型反复训练近期产生的样本,容易过拟合,导致策略不稳定或陷入局部最优。Buffer 很大,样本多样性好,但其中可能包含很多由早期、较弱的模型产生“低质量”数据,可能会拖慢学习效率。)
再次感谢!我们非常期待您关于中国象棋 demo 和 AlphaZero 并行化相关的贡献,欢迎随时提交 PR!
基于gpu始终利用不充分推测:
当前collector和gpu推理之间似乎仍然是串行(env仍需等待gpu返回结果,此时cpu空闲),推理batch越大,gpu利用虽然充分了,但是耗时也长了,cpu等待浪费时间。
能否实现一个中央推理服务(多个collector轮询使用gpu)、或者异步模式。即使是env实现性能不高,在多开并行collector、情况下,能弥补缺点。
感谢您的建议!我们会在接下来的几周内进行 AlphaZero 的相关优化以及中国象棋环境的接入工作,并会在这个 issue 中持续同步最新进展,欢迎随时交流!
感谢您的建议!我们会在接下来的几周内进行 AlphaZero 的相关优化以及中国象棋环境的接入工作,并会在这个 issue 中持续同步最新进展,欢迎随时交流!
我有做中国象棋的逻辑代码实现,可以参考修改,本人水平有限,对ai这块不是太了解。 目前简单实现了8100个动作空间、没有加入历史帧、没有统一红方视角。多卡可运行。我会发出我的代码,供参考指教! 本人对中国象棋比较感兴趣,目前网上基本都是围棋和国际象棋。有中国象棋也大多是基于stockfish这种传统剪枝搜索+nnue方式,alphazero、muzero方案较少,不知对于中国象棋这种规则复杂且具有长程策略游戏潜力如何?同时引入transformer、GNN结构对上限、泛化这种结果帮助又是如何?😊
我的代码 chinesechess.zip