forked from yaneurao/YaneuraOu
-
Notifications
You must be signed in to change notification settings - Fork 0
/
解説.txt
862 lines (572 loc) · 47.2 KB
/
解説.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
■ ファイルの説明
docs/
source/
engine/
yaneuraou-engine/ やねうら王2019 探索部
mate-engine/ 詰将棋エンジン
user-engine/ ユーザーが独自のエンジンを作るときの作業用フォルダ
config.h 各種コンパイルオプションに基づき、configurationを行なう。
types.h/.cpp コンパイル時の設定や、各種構造体の定義。
bitboard.h/.cpp Bitboard(盤面の駒のある場所や、ある駒による利きなどを表現するのに使う)
evaluate.h/.cpp 評価関数
misc.h/.cpp バージョン情報など
movegen.cpp 指し手生成器(おそらく世界最速)
move_picker.h/.cpp 指し手のオーダリング器
position.h/.cpp 盤面クラス
search.h/.cpp 探索部
thread.h/.cpp スレッド関係
tt.h/.cpp 置換表
usi.cpp USIプロトコルによる入出力
benchmark.cpp ベンチマーク用
timeman.cpp 思考時間制御用。
book/ 定跡関連の処理
extra/ 拡張用クラス(Stockfishから、やねうら王が独自に追加したもの)
all.h すべてのheaderをincludeする横着なheader
bitop.h SSE、AVXの命令をsoftwareでemulationするためのマクロ群
key128.h 128bit,256bitのhash key。(実験用)
long_effect.h/.cpp 遠方駒による長い利きとBitboardなどへの変換子
macros.h マクロ集
sfen_packer.cpp 局面(sfen)ををハフマン符号化して32[byte]に詰め込む。
test_cmd.cpp UnitTestなど。USI拡張コマンドの"test"コマンド関係。
mate/
mate1ply.h 1手詰めのヘッダー
mate1ply_with_effect.cpp 利きを利用した超高速1手詰め判定関数(おそらく世界最速)
mate1ply_without_effect.cpp 利きを用いない、Bonanza6風の1手詰め
learn/ 評価関数パラメーターの学習関連
learn.h ここで学習関係のオプション設定を行なうことが出来る。
learner.cpp 棋譜自動生成等(あとで整理する予定)
multi_think.h/cpp マルチスレッドで、Search::think関数を呼び出したいときに用いるthread worker
eval/
evaluate_no_eval.cpp 評価関数なしのときのダミーヘッダ
evaluate_bona_piece.cpp BonaPieceを用いるときの共通ヘッダ
kppt/ KPPT型の評価関数とその学習用
kpp_kkpt/ KPP_KKPT型の評価関数とその学習用
nnue/ NNUE型の評価関数とその学習用
material/ 駒得評価関数とその拡張
■ 解説記事等
やねうら王mini公式より解説記事が一通り読めます。
http://yaneuraou.yaneu.com/YaneuraOu_Mini/
やねうら王公式には、コンピューター将棋関係の記事・資料が盛りだくさん!
http://yaneuraou.yaneu.com/
■ コンパイル方法
Visual Studio 2019 Community Edition(無料で使えます)でビルド一発で実行ファイルが出来るはずです。
★ 思考エンジンの種類の選択
ビルドする思考エンジンの種類として、
・やねうら王2019(評価関数としてKPPT , KPP_KKPT , NNUEの3つのなかから1つ選択)
・詰め将棋エンジン
・ユーザーエンジン
のなかから選択することが出来ます。詳しくはconfig.h / Makefile をご覧ください。
そのときの開発中のエンジンがdefineされていることが多いのでビルドしたいエンジンを選択してください。
■ よくある質問
★ AVX2非対応のCPU用の実行ファイルの作り方。
config.hで
#define USE_AVX2
をコメントアウトします。
例)
// #define USE_AVX2
このままだと、コンパイルは通りますが、コンパイラが(明示的にAVX2の命令を使っていなくとも)
AVX2用のコードを生成しますので、Visual Studioで以下のところを変更します。
メニューの[デバッグ]→[YaneuraOuのプロパティ]→構成のプロパティ→C/C++
→コード生成→「拡張命令セットを有効にする」のところ、/arch:AVX2が指定されてると
思いますけど、それをご自分の環境に合わせる。
★ SSE4.2非対応のCPU用の実行ファイルの作り方
SSE4.2非対応ということはAVX2も非対応のはずなので、上のAVX2非対応のときの設定を行ない、
さらに、config.hで
#define USE_SSE42
をコメントアウトします。
例
// #define USE_SSE42
★ 32bit環境用の実行ファイルの作り方
メニューの[ビルド]→構成マネージャー
→「アクティブソリューションプラットフォーム」
を x86 にすれば32bit環境(32bit OS)で動作する実行ファイルが出来るはず。
(実行が遅くなるので64bit環境推奨です。)
スタックサイズは400MBだとスレッド生成のときにランタイムが落ちるようです。(VC++2015のランタイム側の問題?)
100MBなら大丈夫のようです。
★ 長手数の協力詰めで探索深さが深くなると実行中に落ちる問題。
実行時のスタックが足りないためだと思います。
メニューの[デバッグ]→[YaneuraOuのプロパティ]→構成のプロパティ→リンカー
→ システム → スタックのサイズの設定を
419430400 (400MB)ぐらいの大きな数に。(これで手数が4万手ぐらいの問題でもスタック的には足りるようです)
スタックサイズは400MBだとスレッド生成のときにランタイムが落ちるようです。(VC++2015のランタイム側の問題?)
100MBなら大丈夫のようです。
★ Makefileを使ったmake方法(この方法でUbuntuなどでもビルドできます)
例) MSYS2でのmakeコマンドでのビルド
make clean tournament TARGET_CPU=AVX2 YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE
make -j8 tournament TARGET_CPU=AVX2 COMPILER=g++ YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE ENGINE_NAME="YaneuraOu\(tournament\)"
・TARGET_CPUでAVX2 ,SSE42 などターゲットCPUを指定します。
Ryzen(Ryzen 第一世代、第二世代)は、ZEN1,ZEN2を指定するとBMI2命令を使わない + magic bitboardを使う + ZEN向けのコードを生成するので
10%以上速くなります。(やねうら王 V4.92以降)
・YANEURAOU_EDITIONでビルドするエンジン名を指定します。
・ENGINE_NAMEでビルドされたときのエンジン名(表示名)を指定できます。
※ 複雑な文字列の場合、ダブルコーテーションで囲んだほうが良いというのと、( )の手前では \ でのエスケープが必要です。
・ビルドターゲットはtournament(トーナメントモード用)、evallearn(評価関数の学習用)、normal(普通のもの)、gensfen(教師生成用。現状、非公開)から選びます。
詳しくはMakefileのなかを見てください。
■ ShogiGUIの検討モードで使う方法
ShogiGUIの検討モードで「定跡を使用する」のオプションはオフにします。
(ここをオンにするとShogiGUI側の定跡が使用されます。)
やねうら王では、定跡にhitしたときにその指し手を" multipv "という文字列を付けて返すようにしています。
ゆえに、ShogiGUIではこれがうまく処理されます。候補手を増やしたときにきちんと検討ウィンドウのところに表示されるはずです。
■ 定跡の作り方
[定跡フォーマット]
sfen sfen文字列
この局面での指し手1 相手の応手1 この指し手を指したときの評価値 そのときの探索深さ その指し手が選択された回数
この局面での指し手2 相手の応手2 この指し手を指したときの評価値 そのときの探索深さ その指し手が選択された回数
…
sfen xxxx..
相手の応手がないときは"none"と書いておく。
例)
sfen lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1
7g7f 3c3d 0 32 2
sfen lnsgkgsnl/1r5b1/ppppppppp/9/9/2P6/PP1PPPPPP/1B5R1/LNSGKGSNL w - 2
3c3d 2g2f 0 32 1
あと、先頭にDBのフォーマットのバージョン識別用の文字列として次の文字列を入れておく。
#YANEURAOU-DB2016 1.00
備考)
1) やねうら標準定跡のように評価値なしの定跡DBにおいては出現頻度の高い順で並んでいることが保証されている。
2) やねうら大定跡のように評価値つきの定跡DBにおいては手番側から見て評価値の良い順に並んでいることは保証されている。
1),2)から、1つ目に書かれている指し手がベストの指し手と言える。
指し手の出現頻度(「その指し手が選択された回数」)のところは、やねうら大定跡のように評価値つきの定跡の場合、
意味をなさないので、エンジンのバージョンを100倍したもの(V3.21なら321)を記入してあります。
これにより、「古いエンジンで思考させた指し手は採用しない」などの処理を行うことが出来るようになります。
補足)
ファイル形式はASCIIとする。BOMつきutf-8、将来的には対応させるかも知れないが現状やねうら王は対応していない。
参考)
将棋ソフト用の標準定跡ファイルフォーマットの提案
http://yaneuraou.yaneu.com/2016/02/05/%E5%B0%86%E6%A3%8B%E3%82%BD%E3%83%95%E3%83%88%E7%94%A8%E3%81%AE%E6%A8%99%E6%BA%96%E5%AE%9A%E8%B7%A1%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%81%AE/
やねうら王アップデート!テラショック定跡の生成に対応しました
http://yaneuraou.yaneu.com/2019/05/28/%E3%82%84%E3%81%AD%E3%81%86%E3%82%89%E7%8E%8B%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%EF%BC%81%E3%83%86%E3%83%A9%E3%82%B7%E3%83%A7%E3%83%83%E3%82%AF%E5%AE%9A%E8%B7%A1%E3%81%AE%E7%94%9F/
// makebookコマンドは、
// MAKE_BOOK_CMD,EVAL_LEARN をdefineしてコンパイルしたときにのみ有効。
// NNUEのLEARN版などで使えます。
> makebook from_sfen book.sfen standard_book.db moves 16
※ やねうら王2017Earlyなど、この機能に対応している思考エンジンが必要。
1行1局の棋譜を読み込ませてそれを上のフォーマットに変換する。standard_book.dbになる。
各局、"moves"のあとに指定した手数までを出力する。このファイルを思考エンジンの実行ファイル配下のbookフォルダに配置する。
floodgateのよさ気な棋譜をsfenに変換してこのコマンドで定跡を作成したものをexe/book/standard_book.dbに入れてあります。ご自由にお使いください。
> makebook from_sfen bw black_book.sfen white_book.sfen standard_book.db moves 16
"from_sfen"の直後に"bw"(black and whiteの意味)を指定した場合、sfenファイルとして2つのファイルが指定できる。
1つ目のsfenファイルは、そのsfenファイルから先手の局面だけを抽出して使う。
1つ目のsfenファイルは、そのsfenファイルから後手の局面だけを抽出して使う。
また、このとき、sfenファイル名として"no_file"を指定すると、先手用 or 後手用のsfenファイルは無しであるというのを指定できる。
例)
> makebook from_sfen bw no_file white_book.sfen standard_book.db moves 16
> makebook think 2016.sfen yaneura_book.db moves 16 depth 32
// nodes 100000000 のように、探索node数を指定することもできる。
※ やねうら王のLEARN版 など、この機能に対応している思考エンジンが必要。
2016.sfenという棋譜を読みこみ、その16手目までをdepth 32で思考させて、
そのときの上位3手を定跡ファイルに書き出す。
・定跡ファイル上に、すでにそれ以上深い深さで探索した結果がある場合は、その局面については探索しない。
・同じ深さの場合、登録されている手の数がMultiPVで指定されている手の数以上登録されている場合もその局面については探索しない。
・Hash、Threads、MultiPVの設定に従い思考されるので、事前にこれらのパラメーターを
適切な値に設定しておくこと。
・'.'が1局面終わった合図。'S'がセーブ(ファイルに保存)したという合図。セーブは5分ごとに発生。
中断するときはこの'S'マークが出たのを確認してから終了させると良い。
保存中に終了させるとファイルが破損する可能性がある。
前回から新たな指し手が追加されていないときは's'(小文字)を表示して、ファイルには書き出さない。
・Contemptの値は無視される。(0だとみなされる)
・book_save_interval 秒数 というオプションでbookの保存間隔を指定できる。(デフォルト15分)
例)
Hashメモリ4096MB、スレッド数8(それぞれのスレッドが1局面ずつ担当して検討)、MultiPV 5(それぞれの局面で候補手5手書き出し)、
棋譜2016.sfenの16手目までを深さ32で探索して定跡ファイルuser_book1(すでに存在すれば該当局面のみを上書き更新)を生成。
Hash 4096
Threads 8
MultiPV 5
makebook think 2016.sfen user_book1.db moves 16 depth 32
// IgnoreBookPlyオプションは無視されます(falseとみなされます)(V4.90以降)
> makebook think 2016.sfen yaneura_book.db startmoves 5 moves 16 depth 32
startmovesを指定すると、思考対象局面をそこからにします。(省略時は1が指定されているものとみなされます。)
上の例だと、(初期局面を1手目として)5手目から16手目の局面を思考対象とします。
> makebook think 2016.sfen yaneura_book.db startmoves 5 moves 16 depth 32 cluster 1 3
> makebook think 2016.sfen yaneura_book.db startmoves 5 moves 16 depth 32 cluster 2 3
> makebook think 2016.sfen yaneura_book.db startmoves 5 moves 16 depth 32 cluster 3 3
PCを複数台で定跡を並列生成するとき用。
3台あって、1台目、2台目、3台目のPCで上のように入力すると思考対象局面を分散させる。
もちろん3台以外の場合であってても同様にすれば並列生成できる。
// IgnoreBookPlyオプションは無視されます(falseとみなされます)(V4.90以降)
> makebook think bw black_2016.sfen white_2016.sfen yaneura_book.db startmoves 5 moves 16 depth 32 cluster 3 3
"from_sfen"のときと同様に、直後に"bw"を指定した場合、sfenファイルとして2つのファイルが指定できる。
1つ目のsfenファイルは、そのsfenファイルから先手の局面だけを抽出して使う。
1つ目のsfenファイルは、そのsfenファイルから後手の局面だけを抽出して使う。
> makebook merge yaneura_book1.db yaneura_book2.db yaneura_book3.db
※ やねうら王2016Midなど、この機能に対応している思考エンジンが必要。
定跡のマージ機能。yaneura_book1.dbとyaneura_book2.dbとをマージ(合体)させてyaneura_book3.dbを作成する。
・1つの局面に対して、深く探索されたほうの結果を優先。
・1つの局面に対して、2つの定跡ファイルがどちらも同じ深さで探索されている場合は、
候補手(MultiPV)が多いほうを採用。
makebook thinkコマンドで自動生成した定跡に対してマージするのに用いる。
// IgnoreBookPlyオプションは無視されます(falseとみなされます)(V4.90以降)
> makebook sort book_src.db book_sorted.db
sfen文字列でソートする。
上例では、book_src.dbを読み込み、並び替えられた、book_sorted.dbを出力する。
定跡をメモリに丸読みしたくないときには(BookOnTheFly機能)、並び変わっていないといけない。
(sfen文字列順でソートされていないとバイナリサーチが出来ないため。)
※ このコマンドでsortしなくとも、mergeコマンドなど、定跡DBファイルの書き出し時には
sortを強制するように変更しました。(V4.87以降)
> makebook build_tree read_book.db write_book.db
read_book.dbには、thinkコマンドで実戦で出現した局面に評価値がついているものとして、
leaf nodeについている評価値を使ってmin-max探索のようなことをして、それぞれの局面での最善手を
write_book.dbに書き出す機能。
// IgnoreBookPlyオプションの値は反映されます。
// これをtrueにしている場合、手数無視で定跡にhitするものとしてtreeを生成します。(write_book.dbに書き出されます)
// IgnoreBookPlyはtrueにしたほうが良いと思います。
> makebook build_tree read_book.db write_book.db black_contempt 50 white_contempt 150
build_treeで千日手に至るときにそのときのスコアを先手・後手個別に設定できる。
Optionのcontemptと同じ。black_contempt = 50を指定すると先手の千日手時のスコアを-50とみなす。
// IgnoreBookPlyオプションの値は反映されます。
> makebook extend_tree read_book.db read_sfen.txt write_sfen.txt
read_book.dbの定跡に対して、read_sfen.txtのsfenの局面から開始して延長する枝をwrite_sfen.txtに書き出します。
read_sfen.txtの局面から、評価値が先手で-50以上、後手で-150以上の値がついている枝だけを延長していきます。
ここで書き出されたsfenファイルを、makebook thinkコマンドで思考させるのを繰り返すと定跡ツリーが成長していきます。
※ read_sfen.txtにはこの延長を行う開始局面を複数指定できます。(わからなければ、"startpos"とだけ書いたテキストを用意すれば、
平手の開始局面からになるのでそれで問題ないはずです。) "startpos moves.."の形で複数の局面を指定します。
※ "sfen ..."や、"sfen ... moves ..."のような形式で指定することもできます。
// IgnoreBookPlyオプションの値は反映されます。
> makebook extend_tree read_book.db read_sfen.txt write_sfen.txt black_eval_limit -200 white_eval_limit -300
extend_treeのときに展開する枝の評価値の下限を先手/後手個別に指定できます。
> makebook extend_tree read_book.db read_sfen.txt write_sfen.txt extend_range -1 1
extend_rangeを指定すると、その範囲のleaf node(末端の局面)の候補手だけを延長対象とする。
(MultiPVで思考させ複数の指し手が登録されている場合、このextend_rangeの範囲内の候補手で進めた局面だけが延長される)
extend_range -1 1 と指定したならば、leaf nodeでextend_treeの引き分けのスコア(-1,0,+1)の局面だけを延長する。
// やねうら王のV4.84以降だとmakebook thinkのときのContempt = 0なので引き分けのスコアは0のはず。
(千日手局面に到達するまでの手順がbook上にないとbuild_treeコマンドのときに千日手が検出できず、build_treeのコマンドで指定している
black_contempt/white_contemptの値が千日手手順の評価値として反映されないため)
extend_rangeとblack_eval_limit,white_eval_limitの併用は可能です。
(leaf以外の局面で、そこを辿るかどうかをblack_eval_limit/white_eval_limitで制限しつつ、leafで延長するところをextend_rangeで制限する)
> makebook endless_extend_tree book/user_book1.db book/kadai_sfen.txt book/think_sfen.txt depth 8 startmoves 1 moves 32 loop 100 black_eval_limit -50 white_eval_limit -150 nodes 1000000000
makebook extend_treeとthinkを合体させたコマンド。think_sfen.txtのところは、思考対象局面を書き出す一時ファイル。
このときbook/kadai_sfen.txtに "startpos" とだけ書いておけば、平手の初期局面が課題局面になるので、そこから自動的に定跡が掘られていきます。
loopの回数だけ繰り返されます。
max_game_plyの指定も可能。
検討用の局面をbook/kadai_sfen.txtに入れて、そこから定跡を掘るのに使えるかと思います。
例)
思考エンジンを起動して、
Hash 4096
Threads 8
makebook endless_extend_tree book/user_book1.db book/kadai_sfen.txt book/think_sfen.txt depth 36 startmoves 1 moves 70 loop 100 black_eval_limit -50 white_eval_limit -150 nodes 1000000000
みたいな感じで。
// IgnoreBookPlyオプションの値は反映されます。
> makebook endless_extend_tree book/user_book1.db book/kadai_sfen.txt book/think_sfen.txt depth 8 startmoves 1 moves 32 loop 100 black_eval_limit -50 white_eval_limit -150 nodes 1000000000 extend_range -1 1
endless_extendの千日手局面だけを延長する版。
■ 定跡読み込み時に表示されるメッセージの説明
定跡DBに登録されていた局面で表示されるメッセージの意味。
例) narrow book moves to 5 moves.
narrow bookが指定されていたので定跡DBに登録されていた指し手を5手に減らした。
例) BookDepthLimit is lower than the depth of this node.
BookDepthLimitとして指定されていたdepthが、定跡DBに登録されている思考時のdepthを
下回っていたので定跡の指し手は採用されなかった。
例) BookEvalDiff = 30 , moves to 3 moves.
BookEvalDiffが30(定跡DBの最善手との評価値が30に収まる指し手のみ採用する)以内に収まる指し手が
3手しかなかったので3手に減らした。
例) BookEvalBlackLimit = 0 , moves to 2 moves.
BookEvalBlackLimit(先手番の、評価値の下限)が0に設定されていたので、この評価値を持つ指し手は
2手しかなかったため、指し手は2手に減らした。
■ 起動時のコマンドの指定
> YaneuraOu-nano.exe go btime 100 wtime 100 byoyomi 0
のようにUSIコマンドをコマンドライン引数として渡すことが出来る。
コマンドを実行すると思考エンジンを終了する。
> YaneuraOu-nano.exe posision xxx , go btime 100 wtime 100 byoyomi 0
のようにカンマで区切って複数のコマンドを渡すことができる。
> YaneuraOu-nano.exe file cmd.txt
のようにしてコマンドとして実行したいコマンドをファイルから渡すことが出来る。
※ 複数のコマンドを渡せるのでquitしたい場合は最後にquitを手打ちすること。
■ floodgateでの設定
floodgateでは通信遅延が起こりうるので以下の思考エンジン設定で、前者を120~400、後者を1120~1400ぐらいを
設定すると良いと思います。(それぞれの意味については「USI拡張コマンド.txt」のほうを確認してください。)
NetworkDelay 通信の平均遅延時間[ms]
NetworkDelay2 通信の最大遅延時間[ms]
ひどい通信遅延が起こらないネットワーク環境なら、それぞれ120,1120ぐらい(デフォルト値)を推奨。
■ 0.2秒対局
設定の一例ですが、持ち時間0分、秒読み1秒に設定したあと、
MinimumThinkingTimeを1000に設定して、
NetworkDelayとNetworkDelay2を800に設定すれば、
1手0.2秒での対局が出来ます。
■ 他のソフトとの対局のときの設定
公平な条件にするため、
NetworkDelay 通信の平均遅延時間[ms]
NetworkDelay2 通信の最大遅延時間[ms]
は、0 を指定するべきでしょう。
あと、定跡はNarrowBookをオンにしておいたほうが悪い定跡をつかみにくいので
そちらのほうが勝率は上がるはずです。
ただし、やねうら大定跡のような、定跡生成時に探索して、評価値がついている定跡を用いる場合は、
NarrowBookは必ずオフにする必要があります。
■ 対局・検討時の推奨設定
例) やねうら王2019の場合
スレッド数(Threads) : 論理コア数に(BIOSの設定でHyperThreadingを有効にしておくこと)
置換表サイズ(Hash) : 空き物理メモリを見ながら大きめに。例) 16GBのRAMなら14000[MB]ぐらいを指定
最小思考時間[ms](MinimumThinkingTime) : 1000。ただし、2秒以内に指すと計測1秒になるルールで指すなら2000。
他のソフトと対局させるときは、そのソフトの最小思考時間も合わせておかないと公平ではない。
出現確率の低い定跡を採用しない(NarrowBook) : オフ(False)
通信の平均遅延時間(NetworkDelay) : 0(floodgateでは150~400ぐらいで調整)
通信の最大遅延時間(NetworkDelay2) : 0(floodgateでは600~1100ぐらいで調整)
定跡(BookFile) : 真やねうら定跡(yaneura_book3.db)
定跡の第一候補手との評価値の差(BookEvalDiff): 0
■ 教師局面からの学習のOpenMP対応について
learnコマンドで教師局面から学習させるときにOpen MPを有効にしてコンパイルすると、Open MP対応になります。
weight配列の更新が並列化されるので、many coreでもmini batch sizeを小さくすることが出来ます。
■ 評価関数の共用について
やねうら王2016 Mid以降のWindows版では、評価関数のテーブルを複数プロセスにまたがって共用する機能が
追加されました。(V3.34~)
この機能は、思考エンジン設定でオン/オフ切り替えられます。USI option名は"EvalShare"です。
異種評価関数との自己対局のときにこの設定で引っかかる人が後を絶たないのでデフォルトでオフになっています。
→ デフォルトでオンに変更になりました。(V4.90~)
この機能をオンにすると、10個やねうら王を起動したとしても評価関数は共用されているので、1つ分しかメモリを
消費しません。
共有する条件は、評価関数の格納フォルダ(エンジンオプションの"EvalDir"で決まる)のフルパス名が合致したときです。
また、複数起動したとして、最初にisreadyコマンドを送った時点でそのやねうら王に評価関数ファイルを読み込みます。
以降に立ち上げたやねうら王は、isreadyコマンドを送った時点で、1つ目にisreadyを送られた
やねうら王の評価関数テーブルを共用します。
isreadyコマンドに対して評価関数ファイルを読み込むときに表示されるメッセージについて
use non-shared eval_memory. → EvalShareがオフになっていたので共有メモリは用いなかった。
created shared eval memory. → EvalShareがオンになっていて、他に起動している同じバージョンのやねうら王がなかったので
共有メモリ上に新規に評価関数パラメーターを展開した。
use shared eval memory. → EvalShareがオンになっていて、他に起動している同じバージョンのやねうら王がすでに存在したので
その共有メモリ上にある評価関数パラメーターを利用させてもらうことにした。
■ エンジン名の偽装方法について
GUIで連続対局をさせる場合など、エンジン名として任意の名前をつけたいことがあります。
思考エンジンのあるフォルダに"engine_name.txt"というファイルを用意しておけば、
そこに書かれている1行目の内容をエンジン名、2行目をエンジン作者名としてGUIに返します。
■ エンジンオプションのデフォルト値の変更
"usi"に対して返すオプションリストのオプションのデフォルト値を変更する機能
カレントフォルダに"engine_options.txt"というファイルを配置して、
ここにOptionを構築するための文字列を書きます。(この"option"で始まる文字列は、
"usi"に対して応答として返している文字列なので、コマンドプロンプト上でエンジンを
実行して、"usi"とタイプして、返ってきた文字列一覧をコピペして編集すると良い)
例)
option name EvalDir type string default ../eval/YaneuraOu_2018
option name EvalShare type check default true
option name BookDir type string default ../book
■ Aperyの定跡DB / まふ定跡の読み込みについて
まふ定跡はAperyの定跡フォーマットで提供されています。
やねうら王2017Early以降であればAperyの定跡フォーマットの読み込みに対応しています。
book/book.bin
(実行ファイル配下のbookフォルダにbook.binというファイル名の定跡ファイルを配置するという意味)
に定跡ファイルを配置すれば、思考エンジン設定の定跡として「book.bin(Apery用定跡DB)」を選択することで読み込めます。
■ ShogiGUIの検討/棋譜解析モードで読み筋が途中のdepthからしか出力されない問題
思考エンジン設定でPvIntervalを0にすればこの問題は解決されます。
また、(思考時間無制限の)検討モードは
go infinite
で思考が開始されるはずで、このとき、PvIntervalを強制的に0にみなすようになっています。
■ 検討モード用オプションについて
思考エンジンのオプションとしてConsiderationModeを追加しました。
これはShogiGUIなどの検討モードで用いるためのもので、このオプションをオンにすると中途半端な読み筋が
出力されることが減ります。
なお、置換表から読み筋をかき集めてくるので、置換表が破壊されてると読み筋が途中で途切れることがあります。
途切れるときは置換表用のメモリ(思考エンジン設定のHashオプションで設定できる)を大きめに確保してみてください。
なお、
読み筋が千日手のときは読み筋の末尾に
"rep_draw" : 普通の千日手
"rep_sup" : 優等局面(盤上の駒配置が同一で手駒が一方的に増えている局面への突入。相手からの歩の成り捨て~同金~歩打ち~金引きみたいな循環)
"rep_inf" : 劣等局面(盤上の駒配置が同一で手駒が一方的に減っている局面への突入)
"rep_win" : 王手を含む千日手(反則勝ち) // これ実際には出力されないはずだが…。
"rep_lose" : 王手を含む千日手(反則負け) // これ実際には出力されないはずだが…。
読み筋が宣言勝ちのときは読み筋の末尾に "win"
投了の局面で呼び出されたとき "resign"
と出力されます。
■ トーナメント用 思考エンジンとは何ですか?
大会で使うためのものです。bench以外のテスト用のコマンドは使えません。無駄を削ぎ落とし、実行ファイルを小さくしています。
またEVAL_HASH大きめにしてあるのでメモリはたくさん消費しますが、一度探索した局面は評価関数の計算を端折れます。
2手前に思考した内容が生きるので通常対局においてはやや有利で、3~5%速いはずです。
■ 学習用 実行ファイルとは何ですか?
EVAL_LEARNのシンボルを定義してあると学習用の実行ファイルができます。
配布されている実行ファイルでファイル名に"learn"とついているものは学習用の実行ファイルです。
教師生成や学習時にはスレッドごとに異なる局面を探索する必要があるため、このような特別な実行ファイルが必要になります。
※ "gensfen"コマンドや"makebook think"コマンドを用いる時は、この学習用の実行ファイルを使いましょう。
■ Apery(WCSC27)で使われている評価関数ファイルと、やねうら王2017Earlyで使われている評価関数ファイルとの相互変換について
以下では
「Apery(WCSC27)で使われている評価関数ファイル」のことを"kppt16"と呼びます。
「やねうら王2017Earlyで使われている評価関数ファイル」のことを"kppt32"と呼びます。
「ponanza(WCSC26)で使われているらしい評価関数ファイル」のことを"kpp_kkpt32"と呼びます。
これらの相互変換は "test evalconvert"というコマンドで行なうことが出来ます。
例)
> test evalconvert kppt16 eval/elmo_apery27 kppt32 eval/elmo_yane27
eval/elmo_apery27に格納されているkppt16の評価関数ファイルが、kppt32に変換されてeval/elmo_yane27に格納されます。
出力先のフォルダが存在しない場合は自動的に作成されます。
> test evalconvert kppt32 eval/elmo_yane27 kppt16 eval/elmo_apery27
eval/elmo_yane27に格納されているkppt32の評価関数ファイルが、kppt16に変換されてeval/elmo_apery27に格納されます。
出力先のフォルダが存在しない場合は自動的に作成されます。
備考)
変換に際して、isreadyコマンドが走るので、このときに評価関数ファイルがEvalDirにないといけないが、
このファイルを用意できていなくて読み込みに失敗する場合は、SkipLoadingEval true
(これにより、ファイルがないときにゼロクリアされたファイルを読み込んだことにする)としてから、この"test evalconvert"コマンドを実行すると良い。
SkipLoadingEvalオプションは、EVAL_LEARNをdefineしてビルドした実行ファイルでのみ使える隠しコマンド。
■ ゼロクリアされた評価関数ファイルの作り方
色々作り方はあると思いますが、やねうら王のLEARN版を使えば、以下の手順で作れます。
EvalDir xyz // 存在しないフォルダを評価関数の読み込みフォルダに指定する
SkipLoadingEval true // こうしておけば評価関数ファイルの読み込みに失敗してもエラーにならない
isready // このタイミングで評価関数が読み込まれるが存在しないフォルダから読み込むのでゼロクリアされた評価関数を読み込んだことになる。
EvalSaveDir eval_zero // 保存フォルダ名を"eval_zero"に設定(何でも良い)
test evalsave // メモリ上の評価関数を保存するコマンド
これでeval_zeroフォルダにゼロクリアされた評価関数ファイルが保存されます。
■ clangでlearn版(学習用)の実行ファイルのmakeが出来ない件
Ubuntu 17.04,clang4では問題なくビルド出来るらしい。
Msys2では、たまさんの情報によると…。
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の問題かと思います。例えば以下のようにすると32bit NO SSE版がビルドできるようです。
(MSYS2 MinGW 32-bit上で)
$ pacman -S mingw-w64-i686-clang mingw-w64-i686-toolchain
$ pacman -Syuu
$ mingw32-make -j8 nosse YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE 2>&1 | tee nnue_nosse.log`
64bit版
$ pacman -S mingw-w64-x86_64-clang mingw-w64-x86_64-toolchain
注意点)
makefileを使ってcleanするときに、.oファイルを削除しないといけないが、そのときにYANEURAOU_EDITIONを指定していないと
コンパイル対象のソースファイルとしてNNUE用の評価関数のソースコードファイルが追加されず、.oファイルが全部消えないので
コンパイルに失敗することがある。cleanするときは、この点に注意すること。
mingw32-make clean YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE
■ Visual StudioでNNUE型の評価関数の学習用実行ファイル(NNUE-LEARN)がビルドできない件
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上で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に使いたいスレッド数を設定すべき?
■ Large Pageが使える環境での高速化(V4.91以降)
WindowsのLarge Pageという方法で置換表用のメモリを確保すると10数%高速化するようです。
このためには、以下の方法で、Large Pageを使う許可をしてやる必要があります。
Large Pageを使うには、SeLockMemoryPrivilegeが必要。
Group Policy Editorで変更する手順。
1. グループポリシーエディター(gpedit.msc)を起動する
2. ローカルコンピューターポリシー → コンピュータの構成 → Windowsの設定 → セキュリティの設定 → ローカルポリシー
→ ユーザー権利の割り当て → メモリ内のページのロック
3. ここで適切なユーザーに権限を付与する。
4. OSを再起動する
cf.
Enable the Lock Pages in Memory Option (Windows)
https://msdn.microsoft.com/en-us/library/ms190730.aspx
やねうら王で、Large Pageが確保できた時に表示されるメッセージ
> info string Hash table allocation: Windows Large Pages used.
やねうら王で、Large Pageが確保できない時に表示されるメッセージ
> info string Hash table allocation: Windows Large Pages not used.
なお、KPPT/KPP_KKPT型の評価関数の場合は、EvalShareがオン(default)の場合、Large Pageは(使える環境であっても)使いません。
EvalShareをオフにする必要があります。NNUE型は、EvalShareの機能がないため、Large Pageを使います。(使えるなら)
■ 探索パラメーターのチューニングについて
TUNING_SEARCH_PARAMETERSをdefineしてコンパイルすると探索パラメーターのチューニング用のエンジンが得られます。
makeコマンドの例)
make clean YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE
make -j8 tournament COMPILER=clang++ EXTRA_CPPFLAGS=-DTUNING_SEARCH_PARAMETERS YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE TARGET_CPU=AVX2
このエンジンは起動時に、
info string warning!! TUNING_SEARCH_PARAMETERS.
と表示されます。
探索パラメーターは、
source/engine/yaneuraou-engine/yaneuraou-param.h
で定義されています。
例)
// [PARAM] min:12,max:40,step:1,interval:2,time_rate:1, fixed
PARAM_DEFINE PARAM_ASPIRATION_SEARCH_DELTA = 17;
min,maxはこのパラメーターの最小・最大値
stepは可変させる量。
intervalは、stepを何個分まで広げるかという量。
末尾にfixedと書いてあるパラメーターは、可変させないの意味。
例)
PARAM_ASPIRATION_SEARCH_DELTA = 17で
step:3,interval:2なら
17-6,17-3,17+0,17+3,17+6
の5通りの値がランダムに試されます。
source/engine/yaneuraou-engine/yaneuraou-param.h
を少し書き換えて
source/engine/yaneuraou-engine/param/
のほうにコピーしてやる必要があるのですが、これを行うPythonのスクリプトが
source/engine/yaneuraou-engine/param_conv.py
です。
これでそのあと基準ソフトと連続対局させます。
そうすると、勝敗とそのときのパラメーターが以下のように勝敗ログに書き出されます。
gameover lose
PARAM_FUTILITY_MARGIN_ALPHA1:178,PARAM_FUTILITY_MARGIN_BETA:163,PARAM_FUTILITY_MARGIN_QUIET:130,PARAM_FUTILITY_RETURN_DEPTH:5,PARAM_FUTILITY_AT_PARENT_NODE_MARGIN1:278,PARAM_FUTILITY_AT_PARENT_NODE_GAMMA2:18,PARAM_LMR_SEE_MARGIN1:246,PARAM_REDUCTION_ALPHA:485,PARAM_NULL_MOVE_DYNAMIC_ALPHA:972,PARAM_NULL_MOVE_DYNAMIC_BETA:110,PARAM_NULL_MOVE_DYNAMIC_GAMMA:192,PARAM_NULL_MOVE_MARGIN0:24477,PARAM_NULL_MOVE_MARGIN1:24,PARAM_NULL_MOVE_MARGIN3:87,PARAM_NULL_MOVE_MARGIN4:177,PARAM_NULL_MOVE_RETURN_DEPTH:12,PARAM_PROBCUT_MARGIN1:201,PARAM_REDUCTION_BY_HISTORY:4578,PARAM_RAZORING_MARGIN:510,
この出力先のフォルダはエンジンオプションのPARAMETERS_LOG_FILE_PATHで変更できます。
例) エンジンを起動してからUSIコマンドで
setoption name PARAMETERS_LOG_FILE_PATH value \\WS2012_860C_YAN\yanehome2\result_log\param_920_%%THREAD_NUMBER%%.log
これを集計するスクリプトが
script/analyze_result_log.py
です。
このスクリプトで集計すると、
total : 1276 - 142 - 1065(54.51% R31.4)
total : 1276 - 142 - 1065(54.51% R31.4)
PARAM_FUTILITY_MARGIN_ALPHA1:
163 : 223 - 21 - 161(58.07% R56.59)
168 : 226 - 38 - 228(49.78% R-1.53)
173 : 259 - 26 - 220(54.07% R28.35)
178 : 283 - 29 - 212(57.17% R50.18)
183 : 285 - 28 - 244(53.88% R26.98)
PARAM_FUTILITY_MARGIN_BETA:
162 : 434 - 40 - 397(52.23% R15.48)
165 : 398 - 52 - 301(56.94% R48.53)
168 : 444 - 50 - 367(54.75% R33.09)
PARAM_FUTILITY_MARGIN_QUIET:
127 : 439 - 47 - 375(53.93% R27.37)
130 : 503 - 58 - 390(56.33% R44.2)
133 : 334 - 37 - 300(52.68% R18.65)
…
のようなそれぞれのパラメーターをいくらにしたときに基準ソフトに対して勝率がどうであるかという表が出力されます。
パラメーターの自動調整を行うなら、これをもとに、
source/engine/yaneuraou-engine/yaneuraou-param.h
で定義されている値をよさげな方向に動かすとか、何かパラメーターの自動調整フレームワークと
組み合わせるだとかすると良いでしょう。
■ ふかうら王(YaneuraOu-Deep)のビルド手順
ふかうら王をCPUで動かすには、
1) OnnxRuntime
2) CUDA + TensorRT
のいずれかが必要になります。(NVIDIAのGPUを搭載しているPCなら後者のほうがパフォーマンスが高い)
1)
Visual Studioでは、NuGetを用いてOnnxRuntimeをインストールするのが手軽です。
Visual StudioのNuGetの使い方
クイック スタート: Visual Studio にパッケージをインストールして使用する (Windows のみ)
https://docs.microsoft.com/ja-jp/nuget/quickstart/install-and-use-a-package-in-visual-studio
Visual StudioのNuGetでインストールするときのpackage名
Microsoft.ML.OnnxRuntime.DirectML
また、Windows SDKが必要です。DirectML.hのincludeでコンパイルエラーになる場合は、これが原因です。
// 関連記事)
// ONNX Runtimeを使ってみる : https://tadaoyamaoka.hatenablog.com/entry/2020/05/26/233159
// ONNX Runtimeを使ってみる その2(性能測定) : https://tadaoyamaoka.hatenablog.com/entry/2020/06/06/190259
// ONNX Runtimeを使ってみる その3(DirectML) : https://tadaoyamaoka.hatenablog.com/entry/2020/06/07/113616
// あと、"DirectML.dll"もなぜか実行時に必要らしい。
// 上の記事「その3(DirectML)」によると、dlshogiの実行ファイルからコピーしてくるとよいようだ。
// 世界将棋AI 電竜戦バージョン(「GCT電竜」同梱) : https://github.com/TadaoYamaoka/DeepLearningShogi/releases/tag/denryu2020
2)
https://github.com/TadaoYamaoka/DeepLearningShogi/releases/tag/denryu2020
の手順を参考にしてください。
> cuDNN 8.0をダウンロードして、cudaディレクトリの中身(cudaディレクトリごとではないので注意)をCUDAのインストールディレクトに上書きコピーする。
> 環境変数PATHの設定
> 環境変数PATHに、CUDAのbinディレクトリを追加する。
> デフォルトのインストールディレクトリの場合、以下のパスになる。
> C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin
> 環境変数PATHに、TensorRTのlibディレクトリを追加する。
> C:\に解凍した場合、以下のパスになる。
> C:\TensorRT-7.2.1.6\lib
- %CUDA_PATH%がCUDAのインストール先になっているはずなので
- %CUDA_PATH%\bin
- C:\TensorRT-7.2.1.6\lib
と追加すればよさげ。
CUDA Toolkitは以下にあるものとします。
include = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\include
lib path = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\lib\x64
// ↑64bit版の場合 , 32bit版の場合は "lib\x86"
// cudart.lib が必要。
TensorRTは以下のフォルダにあるものとします。
C:\TensorRT-7.2.1.6\include
C:\TensorRT-7.2.1.6\lib
// nvinfer.lib , nvonnxparser.lib が必要
YaneuraOuEdition-Deep.propというプロパティシートでこのフォルダを追加のinclude/libフォルダとして指定してあるので
適宜修正して使ってください。