-
-
Notifications
You must be signed in to change notification settings - Fork 140
やねうら王のビルド手順
ここでは、以下の説明を行います。
- ビルドの種類、評価関数の選び方などの説明。
- WindowsでVisual Studioでのビルド手順
- makeコマンドを用いる場合のビルド環境の構築
- Windows(MSYS2)でビルド環境の構築
- Ubuntuでビルド環境の構築
- macOSでビルド環境の構築
- 実際にmakeコマンドでビルドしてベンチマークが完走するまでの手順
ビルドする思考エンジンの種類として、次のものがあります。
エンジンの種類 | 特徴 |
---|---|
やねうら王 | やねうら王の通常探索エンジンです。 NNUE系などと呼ばれるのはこれです。 GPUがなくても遊べます。 |
ふかうら王 | dlshogi互換エンジン。Deep Learning技術が使われています。 GPUなしで動かした場合、本来の性能の1/10も出ません。 |
詰将棋エンジン | 詰将棋に特化したエンジンです。 |
ユーザーエンジン | ユーザーで新たに作る思考エンジンです。 |
💡 詰将棋エンジンは、現在、やねうらお作の詰将棋エンジンと、tanuki-作の詰将棋エンジンの2つが使えます。将来的にもっと増える可能性があります。
ビルドするやねうら王のEditionとして、次の3つが選択できます。
- 通常版(NORMAL版)
- トーナメント版(TOURNAMENT版)
- 学習版(LEARN版)
🖋 通常版・学習版は、定跡関連のコマンド、テスト用のコマンドなどが使えることがあります。
🖋 トーナメント版は、無駄を削ぎ落とした最小限の機能しか持たないもので、通常版より数% NPS(探索速度)が高いです。対局に必要のないコマンドは削ぎ落とされている可能性があります。また、通常版よりメモリを多く消費する可能性があります。
⚠ 学習版は、評価関数の機械学習のために用いるものです。通常の対局には使えません。詳しくは、やねうら王の学習コマンドをご覧ください。
💡 通常対局を行うのであれば、トーナメント版で問題ありません。USI拡張コマンドは、通常版か学習版でしか使えない場合があります。
やねうら王では、Intel/AMD系のCPU(x86/x64)の場合、SIMDと呼ばれる拡張命令を用いて高速化を図ります。
noSSE ⊂ SSE2 ⊂ SSE4.1 ⊂ SSE4.2 ⊂ AVX2 ⊂ AVXVNNI ⊂ AVX-512 ⊂ AVX512VNNI
のような関係があります。例えば、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%程度さらに高速化されます。
CPUの型番と対応しているSIMD命令の調べ方については以下の記事をご覧ください。
defineすべきシンボル | 意味 |
---|---|
USE_AVX512VNNI | AVX-512かつ、VNNI命令対応(Cascade Lake以降)でサポートされた命令を使うか。 |
USE_AVX512 | AVX-512(サーバー向けSkylake以降)でサポートされた命令を使うか。 |
AVXVNNI | AVXVNNI命令を使うか。 |
USE_AVX2 | AVX2(Haswell以降)でサポートされた命令を使うか。pextなど。 |
USE_SSE42 | SSE4.2でサポートされた命令を使うか。popcnt命令など。 |
USE_SSE41 | SSE4.1でサポートされた命令を使うか。_mm_testz_si128など。 |
USE_SSE2 | SSE2 でサポートされた命令を使うか。 |
NO_SSE | SSEは使用しない。 |
ZEN1 | AMDのZEN 第一世代専用 |
ZEN2 | AMDのZEN 第二世代専用 |
APPLESSE42 | macOSでIntel CPUでSSE4.2までしか対応していないCPU用。 |
APPLEAVX2 | macOSでIntel CPUでAVX2命令に対応しているCPU用。 |
APPLEM1 | macOSでM1以降 |
💡 Windowsの64bit環境だと自動的にSSE2は使えるはず。
💡 やねうら王プロジェクトで配布している実行ファイルには、ZEN1、ZEN2(Ryzen 第一世代、第二世代)用という実行ファイルがあって、こちらの方がAVX2版を使うより少しNPSが高いです。
やねうら王の通常探索エンジンを選択する場合、評価関数として以下のものから選択できます。
💡 評価関数とは、人間で言うところの「大局観」に相当するものです。局面を評価して、その形勢を数値化して返す(数学的な意味での)関数です。
この他にもたくさんあります。詳しくは source/Makefile
を ご覧ください。
👉 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用の構成は用意していません。
source/config.h
を見て、ご自分のPCのCPUに合わせて、調整してください。
例えば、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万手ぐらいの問題でもスタック的には足りるようです)
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
MSYS2(Windows)、Ubuntuなど、g++かClangが使えて、makeコマンドが使える環境でビルドする方法です。
やねうら王のソースコードにはmakefileが付随しているので、makeコマンドでビルドできます。
MSYS2、Ubuntu、macOSでmakeコマンドが使えるようにするまでの手順については、以下を参照してください。
また、任意のアーキテクチャのNNUE評価関数をビルドするには、Pythonがインストールされている必要があります。(後述)
ビルド環境が構築できたら、次の記事にある手順を参考にしてビルドし、ベンチマークを完走されてみてください。
💡 2024/5/28現在、以下の手順でclang-18でビルドできることを確認しています。(以下の手順ではclang-18を明示的に指定はしていません。最新版をclangをインストールするとそれがclang-18であるというだけです。)
1.AWSでWindowsインスタンスを借りる。(x64環境。ARM環境での動作は未確認)
👉️ AWSを借りているのは、AWSで再現できる手順であることを示すためです。御自分のWindows PCで問題ないです。
2.msys2-x86_64-20240507.exe をインストール。インストール直後にcrtと書かれたウインドウが出るが、それは閉じる。
3.インストールされたmingw64.exeを起動。(インストール時に変更していなければ、c:/msys64
にインストールされているはず)
4.以下のコマンドを入力。
pacman --needed --noconfirm -Syuu
ここで一度mingw64のウインドウが自動的に閉じるので、再度、上記のコマンドを貼り付けて実行します。
続いて以下のコマンドを実行。
💡 ビルドに必要なものを一式インストール。以下のようにpactoysを利用するとインストールが簡単になります。
pacman --needed --noconfirm -Syuu pactoys
pacboy --needed --noconfirm -Syuu clang lld openblas openmp toolchain base-devel:
⚠ 上の2行分をきちんとコピペしないといけません。例えば、2行目の末尾の改行がコピーできていない場合、最後のコマンドが実行されず、clang等がインストールされていない状態になります。
⚠ error: failed retrieving file 'mingw-w64-x86_64-llvm-18.1.6-1-any.pkg.tar.zst' from mirror.msys2.org : SSL connection timeout
のようなエラーが出た場合、ダウンロードするサーバーと接続タイムアウトになったということなので、再度、上記コマンドを実行してください。errorのメッセージが表示されなくなれば成功です。
そして、以下のようにgitコマンドをインストール。
pacman --needed --noconfirm -Syuu git
これでmakeコマンドとclangが使える状態になりました。
5.clangが正常にインストールされたか、確認しましょう。
💡 2024/6/24現在、以上の手順でclang-18がインストールされるはずです。
$ clang++ --version
clang version 18.1.6
Target: x86_64-w64-windows-gnu
Thread model: posix
InstalledDir: C:/msys64/mingw64/bin
6.7zパッケージ
.7zファイルの解凍もしたいことがあるのでついでにインストールしておきます。
pacman -S p7zip
makeコマンドが使えるまでの手順です。g++よりClangでビルドしたほうが探索速度が速い実行ファイルが出来るようなのでClangをインストールしています。
💡 Ubuntu 20.04 , Ubuntu 24.04 で動作確認済み。
💡 OpenBlasは、NNUEの学習(機械学習)を行う時に必要なので、ついでにインストールしています。
sudo apt-get update
sudo apt-get -y install build-essential clang lld libopenblas-dev unzip zip p7zip-full
⚠ 上の2行分をきちんとコピペしないといけません。例えば、2行目の末尾の改行がコピーできていない場合、最後のコマンドが実行されず、Clangがインストールされていない状態になります。
1.ビルド環境の確認
macOSの場合、makeコマンドがデフォルトで使えますし、clangも事前にインストールされています。(clang-15)
ターミナルから、clangがインストールされていることを確認しておきましょう。
% clang --version
Apple clang version 15.0.0 (clang-1500.3.9.4)
Target: arm64-apple-darwin23.4.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
2.gitコマンド
また、やねうら王のGitHubからソースコードをgit cloneしてくるので、gitコマンドは使える状態にしておいてください。
brewコマンドでインストールするか、git公式からダウンロードするかしてください。
$ brew install git
3.7zコマンド
.7zファイルの解凍もしたいことがあるのでついでにインストールしておきます。
$ brew install p7zip
ビルド環境の構築は以上です。
4.ShogiHomeがお勧め
やねうら王の実行ファイルをビルドしたあと、ShogiHomeからエンジンとして実行ファイルを選んで登録すれば動きます。
ShogiHome : https://sunfish-shogi.github.io/electron-shogi/
💡 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\(tournament\)" 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の説明は、V7.10リリース時の記事をご覧ください。
💡 ENGINE_NAMEでビルドされたときのエンジン名(表示名)を指定できます。複雑な文字列の場合、ダブルコーテーションで囲んだほうが良いというのと、( )の手前では \ でのエスケープが必要です。
それでは、実際にやねうら王をビルドしてベンチマークが完走するところまでやってみましょう。
💡 以下の手順はWindows(MSYS2)、Ubuntu、macOS共通です。
すでにビルド環境の構築は終わっていて、makeコマンドとclangは使える状態になっているものとします。
1.clangがインストールされているか確認する。
まず、clangがインストールされているかバージョンの確認をしておくと良いでしょう。 やねうら王は、clang 15,18でビルドできることは確認済です。
% clang --version
Apple clang version 15.0.0 (clang-1500.3.9.4)
Target: arm64-apple-darwin23.4.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
2.やねうら王のGitHubからソースコードを取得
以下の例では、ホームフォルダにgit cloneしてます。
cd ~
git clone https://github.com/yaneurao/YaneuraOu.git
3.トーナメント版のビルド
⚠ ~/YaneuraOu/source/
フォルダでmakeコマンドを実行する必要があります。
💡 ここでは評価関数として標準NNUE型を選択しています。
💡 学習版をビルドしたい場合、以下のtournament
の部分をevallearn
と変更します。
⚠ TARGET_CPU=AVX2
のAVX2
の部分は、動作させたい環境のCPUを指定してください。macOSならばAPPLEM1
など。詳しくは、CPUターゲットの種類をご覧んください。
cd YaneuraOu/source
make clean YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE
make -j8 tournament COMPILER=clang++ YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE ENGINE_NAME="YaneuraOu\(tournament128-cl4\)" TARGET_CPU=AVX2 EXTRA_CPPFLAGS="-DHASH_KEY_BITS=128 -DTT_CLUSTER_SIZE=4 -DENGINE_VERSION=20240624"
4.起動確認
実際にビルドされた思考エンジンをホームフォルダにコピーして、起動するか確認してみます。
💡 MSYS2環境だと実行ファイルに拡張子.exe
が付与されているので、以下の手順では、cp YaneuraOu-by-gcc.exe "../../YaneuraOuNNUE_20240624_avx2.exe"
のように.exe
をつける必要があります。
cp YaneuraOu-by-gcc "../../YaneuraOuNNUE_20240624_avx2"
cd ~
./YaneuraOuNNUE_20240624_avx2
config 💡 ⇦ このコマンドでビルド時の設定が表示できる
configured by config.h
ASSERT_LV : 0
HASH_KEY_BITS : 128
TT_CLUSTER_SIZE : 4
PRETTY_JP : true
FOR_TOURNAMENT : false
ENABLE_TEST_CMD : true
ENABLE_MAKEBOOK_CMD : true
USE_SUPER_SORT : false
TUNING_SEARCH_PARAME : false
USE_GLOBAL_OPTIONS : true
EVAL_LEARN : false 💡 学習版は、ここがtrueになっている。
USE_MATE_DFPN : true
USE_YO_CLUSTER : false
compiler 💡 ⇦ このコマンドでビルドに用いたコンパイラのバージョンを表示できる。
Compiled by clang++ 18.1.3 on Linux
Compilation architecture : (undefined architecture)
Compilation settings : 64bit AVX2 SSE41 SSSE3 SSE2
Compiler __VERSION__ macro : Ubuntu Clang 18.1.3 (1)
quit 💡 ⇦ エンジンを終了
5.評価関数ファイルの配置
評価関数『Háo』をダウンロードして展開します。
👉️ 展開すると evalというフォルダがあるので、それを コンパイルしてできた実行ファイルのあるフォルダに移動させます。
📁 source
nn.bin
YaneuraOu-by-gcc.exe
コマンドラインでやる場合、以下のようになります。
cd ~
wget https://github.com/nodchip/tanuki-/releases/download/tanuki-.halfkp_256x2-32-32.2023-05-08/tanuki-.halfkp_256x2-32-32.2023-05-08.7z
7z x tanuki-.halfkp_256x2-32-32.2023-05-08.7z
ホームフォルダは以下のようになったはずです。evalフォルダの配下にnn.binというファイルが解凍されたはずです。
$ ls
YaneuraOu YaneuraOuNNUE_20240624_avx2 eval gpl-3.0.txt tanuki-.halfkp_256x2-32-32.2023-05-08.7z
$ ls eval
nn.bin
6.やねうら王を起動してベンチマーク
cd ~
./YaneuraOuNNUE_20240624_avx2
bench 💡 ⇦ これがベンチコマンド
(以下のように出力されます。)
info string EvalDirectory = /home/ubuntu/eval
info string loading eval file : eval/nn.bin
info string USI_Hash : Start clearing with 1 threads , Hash size = 1024[MB]
info string USI_Hash : Finish clearing.
Benchmark
hash : 1024
threads : 1
limit : time 15
sfen : default
Position: 1/4
info depth 21 seldepth 24 score cp 118 nodes 318351 nps 997965 hashfull 5 time 319 pv 8h7g 8d8e 3g3f 3a3b 4h3g 7c7d 7i7h 6a5b 5i6h 9c9d 7g5e 4d4e 5e8b+ 7a8b 7h7g 7d7e 7f7e B*6e 6h7h 6e4g+ 6i6h 4g6e
info depth 22 seldepth 33 score cp 86 nodes 894773 nps 948857 hashfull 11 time 943 pv 8h7g 8d8e 3g3f 3a3b 4h3g 7a6b 7i8h 7c7d 3g4f 3b4c 5i6h 4a3b 3f3e 6b7c 3e3d 4c3d 4f5e 7d7e 7f7e
(中略)
===========================
Total time (ms) : 60004
Nodes searched : 48380961
Nodes_searched/second : 806295
===========================
The bench command has completed. 💡 ⇦ これで完走しています。
quit 💡 ⇦ やねうら王を終了させるコマンド
次の記事も参考にしてください。
以上でやねうら王が正常に動作することがわかりました。
お疲れ様でした!
複数の開発者が色んなアーキテクチャのNNUE評価関数を試しています。
makefileに書かれていないものもたくさんあります。
NNUE評価関数は、そのアーキテクチャの定義をC++の.h(header)ファイルで定義するようになっていますが、そのアーキテクチャの種類だけ.hファイルを用意するのは大変なので、makeする時に未知なアーキテクチャであった場合、Pythonのスクリプトで生成するようになっています。
Pythonのスクリプトは、
source\eval\nnue\architectures\nnue_arch_gen.py
です。
makeコマンドでYANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE_HALFKP_512X2_8_64
のように、NNUEと書かれているが未知のアーキテクチャが指定されていた場合、上記のPythonのスクリプトを起動して、.hファイルを生成します。
そのため、この時に限りPythonが実行できる環境でなければビルドが完了しません。
💡 Pythonのインストール方法はここでは説明しません。ググってみてください。
Pythonが使えるようにして、かつ、makefileの以下の行にそのPythonが起動できるコマンドを書いてやる必要があります。例えば、python3
としてPythonが起動する環境ならば、以下の行をPYTHON = python3
のように書き換えると良いでしょう。
# Python
# ※ NNUEの未知なarchitectureの時にarchitecture headerを動的に生成するのに用いる。
PYTHON = python
また、makeコマンドでYANEURAOU_EDITIONとして指定する
YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE_HALFKP_512X2_8_64
のような文字列は次の法則に従っている必要があります。
- "YANEURAOU_ENGINE_NNUE_"で始まり、そのあとにNNUEのアーキテクチャを示す文字列が来る。
- アーキテクチャを示す文字列は"HALFKP_"のように入力特徴量(
HALFKP
,HALFKPE9
,HALFKPVM
,KP
のいずれか)を表す文字列が来る。 - そのあと、512X2_8_64のようにニューラルネットワークの隠れ層のニューロンの数が来る。この例の場合、1層目が512X2、2層目が8、3層目が64。(出力層は、1)
💡 アーキテクチャ名は、やねうら王のインストール手順#評価関数のタイプ一覧表も参考にしてください。
⚠ 以下の情報は古い内容の可能性があります。参考のためにそのまま以前の情報を転載しています。
🚧 時間ができたら検証した上で書き直します。
💡 2023年5月4日現在、Ubuntu 22.04にインストールされているClangのバージョンは14のようです。ですので、Ubuntu 22.04であれば以下の手順は必要ありません。AWSで動かす場合などは、Ubuntu 22.04を選択するようにしましょう。
以下では、Clang 14にアップデートするコマンドを参考のために書いておきます。
ただし、Ubuntu 20.04にてClang 10 と 14で、それぞれやねうら王をコンパイルして探索速度を比較したのですが、AWSの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"
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に使いたいスレッド数を設定すべき?
LEARN版をビルドするときにOpen MPを有効にしてコンパイルすると、Open MP対応になります。weight配列の更新が並列化されるので、many coreでもmini batch sizeを小さくすることが出来ます。
evallearn(学習版)の実行ファイルのビルド手順。(~/YaneuraOu/source/
フォルダで実行してください。)
make clean YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE
make -j8 evallearn COMPILER=clang++ YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE ENGINE_NAME="YaneuraOu\(tournament128-cl4\)" TARGET_CPU=AVX2 EXTRA_CPPFLAGS="-DHASH_KEY_BITS=128 -DTT_CLUSTER_SIZE=4 -DENGINE_VERSION=20240624"
cp YaneuraOu-by-gcc.exe "../YaneuraOuNNUE256-LEARN_20240624-cl4_avx2.exe"
もし学習版のビルドにclangでBLASが使えなくてビルドに失敗する場合、g++でビルドできるかも試してみてください。
macOSでevallearn(学習版)のビルドを行うコマンドについての解説です。
🚧 以下の手順ではうまくビルドできない。書きかけ&作業中。
macOSでのビルドまでの手順は理解しているものとします。
- openmpのライブラリがインストールされていないので、インストールする。
brew install libomp
- このままだとビルド時に
clang: error: unsupported option '-fopenmp'
というエラーになる。(デフォルトでインストールされているclangがopenmpをサポートしていないため。) そこで、openmp対応のclangをインストールする。(手順略)
brew install llvm
/opt/homebrew/opt/llvm/bin/clang
にインストールされるはず。
% /opt/homebrew/opt/llvm/bin/clang --version
Homebrew clang version 18.1.6
Target: arm64-apple-darwin23.4.0
Thread model: posix
InstalledDir: /opt/homebrew/opt/llvm/bin
- インストールされたフォルダを調べておきます。
% brew --prefix llvm
/opt/homebrew/opt/llvm
- openblasも必要なのでインストールする。
brew install openblas
- /opt/homebrew/opt/openblas/include
- /opt/homebrew/opt/openblas/lib
にインストールされたはず。
% ls /opt/homebrew/opt/openblas/include
cblas.h lapack.h lapacke_config.h lapacke_utils.h
f77blas.h lapacke.h lapacke_mangling.h openblas_config.h
- PATHを通す
% echo $SHELL
/bin/zsh
シェルとしてzshを使っていることがわかったので、.zshrcにpathを追加する。
export PATH="/opt/homebrew/opt/llvm/bin:$PATH" >> ~/.zshrc
export LDFLAGS="-L/opt/homebrew/opt/llvm/lib" >> ~/.zshrc
export CPPFLAGS="-I/opt/homebrew/opt/llvm/include" >> ~/.zshrc
source ~/.zshrc
clangのバージョンが変わったことを確認。
% clang++ --version
Homebrew clang version 18.1.6
Target: arm64-apple-darwin23.4.0
Thread model: posix
InstalledDir: /opt/homebrew/opt/llvm/bin
- やねうら王のmakeでevallearnを指定してビルド。コンパイラとして、さきほどインストールしたclangを指定する。
make clean YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE
make -j8 evallearn COMPILER=clang++ YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE ENGINE_NAME="YaneuraOu\(learn-cl4\)" TARGET_CPU=APPLEM1 EXTRA_CPPFLAGS="-DHASH_KEY_BITS=128 -DTT_CLUSTER_SIZE=4 -DENGINE_VERSION=20240528" INCLUDE=-I/opt/homebrew/opt/openblas/include LIBS=-L/opt/homebrew/opt/openblas/lib
cp YaneuraOu-by-gcc "../YaneuraOuNNUE256-LEARN_2024.05.28-cl4_m1"
試しに実行してみる。
% ./YaneuraOu-by-gcc
config 💡 ビルドオプションを確認するコマンド
configured by config.h
ASSERT_LV : 0
HASH_KEY_BITS : 128
TT_CLUSTER_SIZE : 4
PRETTY_JP : true
FOR_TOURNAMENT : false
ENABLE_TEST_CMD : true
ENABLE_MAKEBOOK_CMD : true
USE_SUPER_SORT : false
TUNING_SEARCH_PARAME : false
USE_GLOBAL_OPTIONS : true
EVAL_LEARN : true 💡 EVAL_LEARN版がビルドされている。
USE_MATE_DFPN : true
USE_YO_CLUSTER : false
compiler 💡 ビルドに用いたコンパイラを確認するコマンド
Compiled by clang++ 18.1.6 on Apple
__VERSION__ macro expands to: Homebrew Clang 18.1.6
quit 💡 エンジンを終了させるコマンド