643. FIDE & Google Efficient Chess AI Challenge | fide-google-efficiency-chess-ai-challenge
我分享获得第 9 名的解决方案。最终代码公开在以下链接:
GitHub 仓库 https://github.com/ymgaq/Cfish_kaggle在测试了多个国际象棋引擎后,我最终选择了 Cfish。
正如其他顶级参与者所指出的,由于 glibc 的原因,Cfish 相比基于 C++ 的引擎具有内存消耗更低的优势。此外,在 Kaggle 的单核环境中,它的搜索速度似乎略优于 Stockfish。
这些调整使内存使用量约为 4MB。
make build -j ARCH=x86-64-bmi2 EXTRACFLAGS="-ffunction-sections -fdata-sections" EXTRALDFLAGS="-Wl,--gc-sections"strip 命令。upx --lzma 压缩二进制文件。这些减少使得二进制文件大小保持在 64KB 以下,即使使用 O3 优化而不是 Os。
Cfish 的搜索最初与 Stockfish13 匹配,但被修改为类似于 Stockfish16 的 HCE 搜索方法和参数。与原始搜索实现相比,此修改将引擎提高了约 +30 Elo。通过在 Kaggle 的 CPU 环境中使用 O3 而不是 Os 优化,平均搜索速度提高了约 8-9%。
国际象棋引擎通常使用一种强大的黑盒优化方法,称为 SPSA (同步扰动随机逼近)。
简单来说,两个参数分别扰动 +δ 和 -δ 的引擎版本相互对抗,获胜版本的调整被接受。通过同时随机扰动和测试所有参数并重复比赛,识别出最佳参数。
虽然存在强大的 SPSA 库,如 fishtest 或 OpenBench,但我选择了一个针对单机优化的简单自定义 SPSA 脚本。我的脚本 约 400 行,基于文献和可用的 Perl 实现。它利用 cutechess-cli 并在多个线程上并发运行 SPSA 测试,采用比赛的 2000 开局库和 10 秒时限控制。
这种简单的方法产生了约 +30 Elo 的改进,将我的解决方案推向了金牌。
考虑到排行榜 (LB) 的随机性,我提交了两个相同的二进制文件作为最终提交。
我发现其他利用 NNUE 和神经网络的获胜解决方案非常有趣,对于将我的方法完全限制在 HCE 上略感后悔。虽然这是我第一次开发国际象棋引擎,但在类似嵌入式系统的约束内进行优化证明是非常吸引人的。我向比赛组织者和所有参与者表示诚挚的感谢,感谢他们广泛而有价值的贡献。