やねうら王のビルド手順 - mizar/YaneuraOu GitHub Wiki

やねうら王のビルド手順

⚠ Visual Studio 環境でのビルド、MSYS2 環境でのビルド、Linux 環境でのビルド について混在して説明しています。

思考エンジンの種類

ビルドする思考エンジンの種類として、次のものがあります。

エンジンの種類 特徴
やねうら王 やねうら王の通常探索エンジンです。
NNUE系などと呼ばれるのはこれです。
GPUがなくても遊べます。
ふかうら王 dlshogi互換エンジン。Deep Learningを用います。
GPUなしでは本来の性能の1/10も出ません。
詰将棋エンジン 詰将棋に特化したエンジンです。
ユーザーエンジン ユーザーで新たに作る思考エンジンです。

の4つのなかから選択することができます。

💡 詰将棋エンジンは、現在、やねうらお作の詰将棋エンジンと、tanuki-作の詰将棋エンジンの2つが使えます。将来的にもっと増える可能性があります。

思考エンジンのEdition

ビルドするやねうら王のEditionとして、次の3つが選択できます。

  • 通常版(NORMAL版)
  • トーナメント版(TOURNAMENT版)
  • 学習版(LEARN版)

🖋 通常版は、テスト用のコマンドなどが使えることがあります。

🖋 トーナメント版は、無駄を削ぎ落とした最小限の機能しか持たないもので、通常版より数% NPS(探索速度)が高いです。対局に必要のないコマンドは削ぎ落とされている可能性があります。また、通常版よりメモリを多く消費する可能性があります。

⚠ 学習版は、評価関数の機械学習のために用いるものです。通常の対局には使えません。詳しくは、やねうら王の学習コマンドをご覧ください。

💡 通常対局を行うのであれば、トーナメント版で問題ありません。USI拡張コマンドを使いたいのであれば、通常版か学習版でしか使えない場合があります。

CPUターゲットの種類

やねうら王では、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が高いです。

実行ファイル名とCPUターゲットの対応関係

以下は一例です。ここに書かれていないファイル(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を使う場合

Visual Studio 2022 Community Edition(無料で使えます)でビルド一発で実行ファイルが出来るはずです。

👉 プロジェクトの種類(例:「Release-NNUE」)を選んで、ビルドするだけ。

⚠ デフォルトではAVX2用がビルドされますが、末尾に「sse42」とついているプロジェクト(例:「Release-NNUE-sse42」)だと、SSE4.2用にビルドされます。近年、SSE 4.2で開発されている人が減ってきたので、すべてのプロジェクトに対してSSE 4.2用の構成は用意していません。

AVX2が使えないCPU向けのビルド方法について

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が指定されてると思いますけど、それをご自分の環境に合わせます。

32bit版のWindows用のビルド方法

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万手ぐらいの問題でもスタック的には足りるようです)

makeでビルドする場合

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コマンドが使えるまで

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がインストールされていない状態になります。

Clang 14にする方法

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年以前の情報なので情報が古い可能性があります。参考のためにそのまま以前の情報を転載しています。

🚧 時間ができたら検証した上で書き直します。

Clangでlearn版(学習用)の実行ファイルのmakeが出来ない件

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を含めて配布するのは何かと問題になりそうです。あくまで解決の参考としてください。

MSYS2上でNNUEのAVX2以外の評価関数の実行ファイルがビルドできない件

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

MSYS2上でNNUE型の評価関数の学習用実行ファイル(NNUE-LEARN)がビルドできない件

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に使いたいスレッド数を設定すべき?

Visual StudioでNNUE型の評価関数の学習用実行ファイル(NNUE-LEARN)がビルドできない件

OpenBLASが必要。NuGetでインストールしてしまうのが楽。

Visual StudioのNuGetの使い方

パッケージ名 : OpenBLAS

LEARN版のOpenMP対応について

LEARN版をビルドするときにOpen MPを有効にしてコンパイルすると、Open MP対応になります。weight配列の更新が並列化されるので、many coreでもmini batch sizeを小さくすることが出来ます。

⚠️ **GitHub.com Fallback** ⚠️