やねうら王のビルド手順 - mizar/YaneuraOu GitHub Wiki
⚠ Visual Studio 環境でのビルド、MSYS2 環境でのビルド、Linux 環境でのビルド について混在して説明しています。
ビルドする思考エンジンの種類として、次のものがあります。
エンジンの種類 | 特徴 |
---|---|
やねうら王 | やねうら王の通常探索エンジンです。 NNUE系などと呼ばれるのはこれです。 GPUがなくても遊べます。 |
ふかうら王 | dlshogi互換エンジン。Deep Learningを用います。 GPUなしでは本来の性能の1/10も出ません。 |
詰将棋エンジン | 詰将棋に特化したエンジンです。 |
ユーザーエンジン | ユーザーで新たに作る思考エンジンです。 |
の4つのなかから選択することができます。
💡 詰将棋エンジンは、現在、やねうらお作の詰将棋エンジンと、tanuki-作の詰将棋エンジンの2つが使えます。将来的にもっと増える可能性があります。
ビルドするやねうら王のEditionとして、次の3つが選択できます。
- 通常版(NORMAL版)
- トーナメント版(TOURNAMENT版)
- 学習版(LEARN版)
🖋 通常版は、テスト用のコマンドなどが使えることがあります。
🖋 トーナメント版は、無駄を削ぎ落とした最小限の機能しか持たないもので、通常版より数% NPS(探索速度)が高いです。対局に必要のないコマンドは削ぎ落とされている可能性があります。また、通常版よりメモリを多く消費する可能性があります。
⚠ 学習版は、評価関数の機械学習のために用いるものです。通常の対局には使えません。詳しくは、やねうら王の学習コマンドをご覧ください。
💡 通常対局を行うのであれば、トーナメント版で問題ありません。USI拡張コマンドを使いたいのであれば、通常版か学習版でしか使えない場合があります。
やねうら王では、Intel/AMD系のCPU(x86/x64)の場合、SIMDと呼ばれる拡張命令を用いて高速化を図ります。
noSSE ⊂ SSE2 ⊂ SSE4.1 ⊂ SSE4.2 ⊂ AVX2 ⊂ AVX-512
のような関係があります。例えば、SSE4.2なら、SSE4.1とSSE2の命令はすべて含み、そこに+αで命令が追加されているという感じ)
noSSEはSSE命令を使わないという意味です。
そこで、あなたのPCのCPUがAVX2対応であれば、SSE4.2、SSE4.1、SSE2の命令はすべて使えますから、やねうら王はSSE2版でもSSE4.1版でもSSE4.2版でもAVX2版でも動作することになります。しかし、この場合、一番速く動作するのは、AVX2版ですから、AVX2版を使うことをお勧めします。
💡 AVX2版とSSE4.2版とでは、AVX2版の方が10%程度高速に動作するはずです。(AVX2が使える環境ならば)
💡 AVX2版の場合、Skylake以降だと(Skylake以前のAVX2と比較して)10%程度さらに高速化されます。
defineすべきシンボル | 意味 |
---|---|
USE_AVX512VNNI | AVX-512かつ、VNNI命令対応(Cascade Lake以降)でサポートされた命令を使うか。 |
USE_AVX512 | AVX-512(サーバー向けSkylake以降)でサポートされた命令を使うか。 |
USE_AVX2 | AVX2(Haswell以降)でサポートされた命令を使うか。pextなど。 |
USE_SSE42 | SSE4.2でサポートされた命令を使うか。popcnt命令など。 |
USE_SSE41 | SSE4.1でサポートされた命令を使うか。_mm_testz_si128など。 |
USE_SSE2 | SSE2 でサポートされた命令を使うか。 |
NO_SSE | SSEは使用しない。 |
💡 Windowsの64bit環境だと自動的にSSE2は使えるはず。
🖋 また、Ryzenの場合、ZEN1(Ryzen 第一世代)以降、AVX2命令は使えるので、AVX2版を使うと良いでしょう。
💡 やねうら王プロジェクトで配布している実行ファイルには、ZEN1、ZEN2、ZEN3(Ryzen 第一世代、第二世代、第三世代)用という実行ファイルがあって、こちらの方がAVX2版を使うより少しNPSが高いです。
以下は一例です。ここに書かれていないファイル(AVX512用など)も配布されている可能性があります。
実行ファイル名 | ターゲットCPU | CPUベンダー | ターゲットOS |
---|---|---|---|
YaneuraOu_XXXX_zen3.exe | Ryzen第3世代 | AMD | 64bit OS用 |
YaneuraOu_XXXX_zen2.exe | Ryzen第2世代 | AMD | 64bit OS用 |
YaneuraOu_XXXX_avx2.exe | AVX2 以降用 | Intel | 64bit OS用 |
YaneuraOu_XXXX_sse42.exe | SSE4.2 | Intel/AMD | 64bit OS用 |
YaneuraOu_XXXX_sse41.exe | SSE4.1 | Intel/AMD | 64bit OS用 |
YaneuraOu_XXXX_sse3.exe | SSE3 | Intel/AMD | 64bit OS用 |
YaneuraOu_XXXX_sse2.exe | SSE2 | Intel/AMD | 64bit OS用 |
YaneuraOu_XXXX_nosse.exe | SSEなし | Intel/AMD | 32bit OS用 |
💡 XXXX の部分には、評価関数タイプ(NNUEとかKPPTとか)が入ります。 |
💡 Ryzen第2世代は、AVX2命令に対応していますが、zen2と書いてある方の実行ファイルを用いた方がわずかに速いはずです。
やねうら王の通常探索エンジンを選択する場合、評価関数として以下のものから選択できます。
💡 評価関数とは、人間で言うところの「大局観」に相当するものです。局面を評価して、その形勢を数値化して返す(数学的な意味での)関数です。
評価関数名 | 内容 | 特徴 |
---|---|---|
KPPT | 3駒関係 + 手番 | Apery(WCSC26)、Apery(SDT4)「浮かむ瀬」の評価関数フアイルがそのまま使えます。 |
KPP_KKPT | 軽量化されたKPPT | 過去のサブプロジェクトのKPP_KKPT型ビルド用評価関数のところにあるものが使えます。 |
NNUE | 浅いニューラルネットワークを用いたもの | tanuki-(SDT5,WCSC28,WCSC29),NNUEkai、水匠5などの評価関数ファイルがそのまま使えます。 |
MATERIAL | 駒得系の評価関数 | 評価関数パラメーターは実行ファイルに埋め込まれているため、評価関数ファイルは必要ありません。 |
💡 現在主流の評価関数はNNUEです。
👉 NNUE評価関数は、いくつかの種類に分かれています。
NNUEの名前 | 入力特徴量 |
---|---|
halfKP | halfKP |
KP256 | K + P |
HALFKPE9 | halfKP + 利きの数 |
HALFKP_VM_256X2_32_32 | halfKPで左右のミラー考慮 |
💡 標準的なNNUEは、halfKPというタイプです。
👉 MATERIAL評価関数も、いくつかの種類に分かれています。以下の9個が現在公開されています。これは、ブログの連載記事に対応するものです。
MATERIAL LV | 内容 |
---|---|
MATERIAL_LV 1 | 【連載】評価関数を作ってみよう!その1 |
MATERIAL_LV 2 | … |
… | … |
MATERIAL_LV 9 | 【連載】評価関数を作ってみよう!その11 |
🌈 より詳しくは source/config.h , source/Makefile をご覧ください。
Visual Studio 2022 Community Edition(無料で使えます)でビルド一発で実行ファイルが出来るはずです。
👉 プロジェクトの種類(例:「Release-NNUE」)を選んで、ビルドするだけ。
⚠ デフォルトではAVX2用がビルドされますが、末尾に「sse42」とついているプロジェクト(例:「Release-NNUE-sse42」)だと、SSE4.2用にビルドされます。近年、SSE 4.2で開発されている人が減ってきたので、すべてのプロジェクトに対してSSE 4.2用の構成は用意していません。
config.hを見て、ご自分のPCのCPU用にどれをdefineすればいいかを調べます。
例えば、SSE 4.2であれば、
USE_SSE42
というシンボルをdefineすれば良いことがわかります。まず、これをdefineします。(定義済みのシンボルとして登録するか、#define USE_SSE42 config.hの先頭付近に書くなど)
このままでコンパイルは通りますが、コンパイラが(明示的にAVX2の命令を使っていなくとも)AVX2用のコードを生成しますので、Visual Studioで以下のところを変更します。
メニューの【デバッグ】 → 【YaneuraOuのプロパティ】 → 構成のプロパティ → C/C++ → コード生成 → 「拡張命令セットを有効にする」のところ、/arch:AVX2が指定されてると思いますけど、それをご自分の環境に合わせます。
Windows 11からは32bit版が無くなったので、今後32bit版が必要になることはないと思いますが、古いOSで動かしたい人のために32bit版のビルド方法を書いておきます。
⚠ Visual Studio自体が将来的に32bit版の実行ファイルの生成をサポートをしなくなる可能性はあるので、その場合は、MSYS2等でビルドする必要があります。
メニューの【ビルド】 → 構成マネージャー →「アクティブソリューションプラットフォーム」 を x86 にすれば32bit環境(32bit OS)で動作する実行ファイルが出来るはず。
⚠ 実行が遅くなるので64bit環境を推奨します。
💡 スタックサイズは大きくとると(400MBだと)スレッド生成のときにランタイムが落ちるようです。(VC++2015のランタイム側の問題?) 100MB程度なら大丈夫のようです。
10000手ぐらいまで先を探索したい場合(例えば、協力詰めみたいなのを解かせる思考エンジンを自作した場合)、実行時のスタックが足りないと実行中にプログラムが不正終了します。
これは、実行時のスタックが足りないためです。
Visual Studioのメニューの【デバッグ】→【YaneuraOuのプロパティ】→ 構成のプロパティ→リンカー → システム → スタックのサイズの設定を 419430400 (400MB)ぐらいの大きな数にすれば回避できます。(これで手数が4万手ぐらいの問題でもスタック的には足りるようです)
MSYS2、Ubuntuなど、g++かClangが使えて、makeコマンドが使える環境でビルドする方法です。
やねうら王のソースコードにはmakefileが付随しているので、makeコマンドでビルドできます。
MSYS2、Ubuntuなどで、makeコマンドが使えるようにするまでの手順は、makeコマンドが使えるまでをご覧ください。
💡 Makefileは、 やねうら王のGitHubの source/Makefile にあります。
💡 Makefileに、make時に指定できるオプション等が詳しく書いてあります。
👉 例 : NNUE評価関数 + トーナメント版 + CPUはAVX2 を makeコマンドで g++でビルドする場合
make clean tournament TARGET_CPU=AVX2 YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE
make -j8 tournament TARGET_CPU=AVX2 COMPILER=g++ YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE
💡 TARGET_CPUでAVX2 ,SSE42 などターゲットCPUを指定します。例えば、Ryzen(Ryzen 第一世代、第二世代)は、それぞれZEN1,ZEN2を指定するとBMI2命令を使わない + ZEN向けのコードを生成するので5%以上速くなります。
💡 YANEURAOU_EDITIONでビルドするエンジンの種別を指定します。
💡 ビルドターゲットはtournament(トーナメントモード用)、evallearn(評価関数の学習用)、normal(普通のもの)、gensfen(教師生成用。現状、非公開)から選びます。詳しくはMakefileをご覧ください。
👉 例 : NNUE評価関数 + トーナメント版 + 128-bit Edition + CPUはZEN3 を makeコマンドでClangでビルドする場合
💖 大会で使うなら、このビルドがお勧めです。(AWSのc6a.metalはCPUがZEN3なので、CPUとしてZEN3を指定しています。)
make clean YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE
make -j8 tournament COMPILER=clang++ YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE ENGINE_NAME="YaneuraOu\(dev\)" TARGET_CPU=AVX2 EXTRA_CPPFLAGS="-DHASH_KEY_BITS=128 -DTT_CLUSTER_SIZE=4"
💡 128-bit Editionにするために、EXTRA_CPPFLAGS="-DHASH_KEY_BITS=128 -DTT_CLUSTER_SIZE=4"を指定しています。128-bit Editionの説明は、こちらをご覧ください。
💡 ENGINE_NAMEでビルドされたときのエンジン名(表示名)を指定できます。複雑な文字列の場合、ダブルコーテーションで囲んだほうが良いというのと、( )の手前では \ でのエスケープが必要です。
makeコマンドが使えるまでの手順です。g++よりClangでビルドしたほうが探索速度が速い実行ファイルが出来るようなのでClangをインストールしています。
💡 MSYS2やUbuntu 20.04で動作確認済み。
💡 OpenBlasは、NNUEの学習(機械学習)を行う時に必要なので、ついでにインストールしています。
sudo apt-get update
sudo apt-get -y install build-essential clang lld libopenblas-dev unzip zip
⚠ 上の5行分をきちんとコピペしないといけません。例えば、5行目の末尾の改行がコピーできていない場合、最後のコマンドが実行されず、Clangがインストールされていない状態になります。
2022年5月8日現在、Ubuntu 20.04にインストールされているClangのバージョンは10です。
💡 MSYS2だとClang 14なのですが…。
以下では、これをClang 14にアップデートするコマンドを参考のために書いておきます。
ただし、Clang 10 と 14で、それぞれやねうら王をコンパイルして探索速度を比較したのですが、c6a.metalにおいて大差ありませんでした。ゆえに、Clang 14に無理にアップデートする必要はないと思います。
🖋 super userで行ってください。AWSだとrootのパスワードが設定されていないので、 sudo su - とかでsuper userになってから作業すること。
sudo bash - <<EOS
apt-get update &&\
DEBIAN_FRONTEND=noninteractive apt-get -y --no-install-recommends \
-o Acquire::Retries="8" \
-o DPkg::options::="--force-confdef" \
-o DPkg::options::="--force-confold" \
install \
ca-certificates curl gpg gpg-agent &&\
curl "https://apt.llvm.org/llvm-snapshot.gpg.key" | gpg --no-default-keyring --keyring /usr/share/keyrings/llvm-snapshot.gpg --import - &&\
echo "deb [signed-by=/usr/share/keyrings/llvm-snapshot.gpg] https://apt.llvm.org/$(lsb_release --codename --short)/ llvm-toolchain-$(lsb_release --codename --short)-14 main" | tee /etc/apt/sources.list.d/llvm-toolchain-$(lsb_release --codename --short).list &&\
apt-get update &&\
DEBIAN_FRONTEND=noninteractive apt-get -y --no-install-recommends \
-o Acquire::Retries="8" \
-o DPkg::options::="--force-confdef" \
-o DPkg::options::="--force-confold" \
install \
build-essential clang-14 llvm-14 libomp-14-dev lld-14 libopenblas-dev
EOS
これでClang 14がインストールされました。
あとは、makeの時にclang++ではなく clang++-14 を指定すれば良いです。(clang++のままだとClang 10でコンパイルされてしまう。)
make clean YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE
make -j8 tournament COMPILER=clang++-14 YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE ENGINE_NAME="YaneuraOu\(dev\)" TARGET_CPU=AVX2 EXTRA_CPPFLAGS="-DHASH_KEY_BITS=128 -DTT_CLUSTER_SIZE=4"
⚠ 以下の情報は2019年以前の情報なので情報が古い可能性があります。参考のためにそのまま以前の情報を転載しています。
🚧 時間ができたら検証した上で書き直します。
Ubuntu 17.04,clang 4では問題なくビルド出来るらしい。
OpenMP部分がダイナミックライブラリになってしまいますが、以下の方法で動かせます。
1.LLVM4.0.1のWindows版をDLしてきて、適当なところにインストールする
※ホントはソースからビルドすれば、全てをスタティックライブラリにできるのですが、LLVMのビルドを通すのは糸を針の穴に通すより難しいです。敷居はこれが一番低いです。
2.(LLVMをインストールしたディレクトリ)/libにある「libomp.lib」をlibgomp.aが配置されているディレクトリに「libomp.a」としてコピーする→これがlibgomp.aの代わりになる
3.exeの格納ディレクトリと同じところに(LLVMをインストールしたディレクトリ)/bin/libomp.dllをコピーする
これで動きます。が、libomp.dllを含めて配布するのは何かと問題になりそうです。あくまで解決の参考としてください。
toolchainの問題かと思います。ビルドに際して、clang、lld、(NNUE LEARN版などには)openblas、openmpが必要です。
pactoys入れて、それに含まれる pacboy を使ってインストールすると楽ちんのようです。
% pacman --needed --noconfirm -Syuu
% pacman --needed --noconfirm -Syuu pactoys
% pacboy --needed --noconfirm -Syuu clang:m lld:m openblas:x openmp:x toolchain:m base-devel:
// pacboy での :m は32/64bit両方、 :x は64bitのみ、 : はMSYS環境のパッケージという感じの指定です。
// 例) clangには :m を指定しているので、MSYS2の32bit,64bitの両環境用にclangがインストールされます。
・上記インストール時に署名エラーが出た場合
#パッケージのキャッシュを削除
% rm -rf /var/cache/pacman/pkg/*
# pacman keyのリセット
% rm -r /etc/pacman.d/gnupg/
% pacman-key --init
% pacman-key --populate msys2
# 先にkeyringパッケージを更新
% pacman -S msys2-keyring
# 他のパッケージ更新
% pacman -Syyu
注意点)
makefileを使ってcleanするときに、.oファイルを削除しないといけないが、そのときにYANEURAOU_EDITIONを指定していないと
コンパイル対象のソースファイルとしてNNUE用の評価関数のソースコードファイルが追加されず、.oファイルが全部消えないので
コンパイルに失敗することがある。cleanするときは、この点に注意すること。
mingw32-make clean YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE
OpenBLASが必要なので、まずこれをpacmanで入れます。
32bit版(32bit版のビルド時は、OpenBLASを用いていないので実はこの操作は不要)
$ pacman -S mingw-w64-i686-clang mingw-w64-i686-toolchain mingw-w64-i686-openblas
64bit版
$ pacman -S mingw-w64-x86_64-clang mingw-w64-x86_64-toolchain mingw-w64-x86_64-openblas
あとはMakefileでincludeフォルダを以下のところで指定していますが、これが違うフォルダであるなら適宜変更が必要となります。
ifeq ($(MSYSTEM),MINGW64)
BLAS += -I$(shell cygpath -aw /mingw64/include/OpenBLAS)
endif
※ この部分は、MINGW64環境内でこうすると絶対パスが帰ってくるのを利用しています
$ cygpath -aw /mingw64/include/OpenBLAS
C:\msys64\mingw64\include\OpenBLAS
※ pacmanでOpenBlasをインストールしたときに
Set the environment variable OPENBLAS_NUM_THREADS to the number of threads to use.
と出ています。実行時に環境変数OPENBLAS_NUM_THREADSに使いたいスレッド数を設定すべき?
OpenBLASが必要。NuGetでインストールしてしまうのが楽。
Visual StudioのNuGetの使い方
- クイック スタート: Visual Studio にパッケージをインストールして使用する (Windows のみ) : https://docs.microsoft.com/ja-jp/nuget/quickstart/install-and-use-a-package-in-visual-studio
パッケージ名 : OpenBLAS
LEARN版をビルドするときにOpen MPを有効にしてコンパイルすると、Open MP対応になります。weight配列の更新が並列化されるので、many coreでもmini batch sizeを小さくすることが出来ます。