forked from yaneurao/YaneuraOu
-
Notifications
You must be signed in to change notification settings - Fork 0
/
USI拡張コマンド.txt
787 lines (555 loc) · 45.5 KB
/
USI拡張コマンド.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
USIプロトコルの独自拡張コマンド
■ USI options関連
・setoptionの簡略表現
> Threads 1
のように指定したとき、
> setoption name Threads value 1
と等価なようになっている。オプション名のほうは大文字小文字を無視するので
> threads 1
のように書くことも出来る。
また、
> evalshare true
のようにすべて小文字で書けるが、
> evalshare True
のように設定値に大文字を用いることは出来ない。
・set option name XXX value ...で設定できるoption項目の一覧
以下、set optionコマンドで設定できるoption項目の一覧
Threads : 思考するスレッド数
USI_Hash : 置換表のサイズ(単位[MB])
この値は、長い持ち持ち時間で置換表の使用率が50%を超えるような状況であるなら、OSのメモリが
許す限り大きな値にしたほうが、探索効率が良くなり、強くなるはずです。
128GB超え対応を検討中。
// config.hでUSE_HUGE_HASHをdefineしてコンパイルすれば128GB超えの置換表が使えます。デフォルトでは無効。
※ V4.83から、ここに指定する値が2のべき乗であるべきという制約がなくなりました。
※ 現状、131072(=128*1024。すなわち128GB)までしか指定してもうまく使ってくれません。
※ V4.89までは"USI_Hash"ではなく、"Hash"にしていました。
これは、将棋所で、エンジン同士を対局させる時に、USI_Hashは両方のエンジンに共通の
値しか設定できなかったためです。
しかし将棋所のバージョンアップにより、個別にUSI_Hashの値を設定できるようになったため、
USI原案に基づき、"USI_Hash"を採用するようにしました。
USI_Ponder : ponder(相手番での思考) on/off
WriteDebugLog : 標準入出力をファイル("io_log.txt")にリダイレクトする(logコマンドでonには出来る)
NetworkDelay : 通信時の平均遅延時間[ms]
これを例えば200に設定しておくと、5.0秒で指さずに、4.8秒(200ms早め)で指すようになります。
NetworkDelay2 : 通信時の最大置換時間[ms]
これを例えば600に設定しておくと秒読み10秒で、切れたら負けという瞬間に限り、9.4秒(600ms早め)に指し手を返します。
floodgateなどときどき大きな遅延が発生するサーバーで対局させるときは、この値を1200(1.2秒早め)ぐらいに設定することをお勧めします。
SlowMover : 序盤重視率[%]
切れ負けのときの思考時間を調整する。序盤重視率。百分率になっている。
例えば200を指定すると本来の最適時間の200%(2倍)思考するようになる。
対人のときに短めに設定して強制的に早指しにすることが出来る。
Contempt : 引き分けを受け入れるスコア。歩を100とする。例えば、この値を100にすると引き分けの局面は
評価値が -100とみなされる。(互角と思っている局面であるなら引き分けを選ばずに他の指し手を選ぶ)
この値のデフォルト値は2にしてある。こうすることで千日手を回避しやすくなるからである。
(1だと内部的な計算で切り捨てられてしまうので効果がない。)
ContemptFromBlack : Contemptの設定値を先手番から見た値とするオプション。Stockfishからの独自拡張。
先手のときは千日手を狙いたくなくて、後手のときは千日手を狙いたいような場合、
このオプションをオンにすれば、Contemptをそういう解釈にしてくれる。
(Contemptを常に先手から見たスコアだとみなしてくれる。)
デフォルトではfalse。
EvalDir : 評価関数用のファイルの配置フォルダ(デフォルトでは eval/ )
isreadyコマンドで評価関数ファイルを読み込むので、起動後isreadyまでにsetoptionでこの設定を変更しないと効かない。
EnteringKingRule: 入玉ルール
NoEnteringKing : 入玉ルールなし
CSARule27 : 27点法(CSAルール)
CSARule24 : 24点法。31点で宣言勝ちなので31点にならないと宣言勝ちはしない。
TryRule : トライルール
MultiPV : その局面での上位N個の候補手を調べる機能
NarrowBook : 実現確率の低い定跡を採用しない
Param1 : パラメーターの自動調整用X軸
Param2 : パラメーターの自動調整用Y軸
MinimumThinkingTime : 最小思考時間。2秒以内に指すと計測1秒となる場合、2000を指定すべき。(CSAルールなど)
このとき、NetworkDelayの分は減じて思考するので計測1秒となるはず。
MaxMovesToDraw : 終局までの手数。256手ルールなら256と設定する。0なら無制限。
// 安全を見て、256手ルールなら258ぐらいに設定するほうが好ましい。
// 理由 → 多くの将棋ソフトで256手ルールの実装がバグっている件 : https://yaneuraou.yaneu.com/2021/01/13/incorrectly-implemented-the-256-moves-rule/
// → このバグ自体は現在修正されているが、置換表を使う以上、256手ルールが絡んで引き分けになった局面の情報を256手目以前で使ってしまうというようなケースは考えられる。
BookMoves : 定跡を用いる手数(0=未使用)
例えば16を指定した場合、開始局面から16手目の局面まで定跡にヒットする。
PvInterval : PVの出力を抑制する。前回出力時間から、この時間(単位は[ms])経過するまでは次のPVを出力しない。
EvalShare : 評価関数を共有メモリに展開する。詳しくは解説.txtを参照のこと。
EvalSaveDir : learnコマンドを使ったときに保存するフォルダ。
【定跡絡みのオプション】
USI_OwnBook : 本思考エンジン側の定跡を有効にするか。(デフォルトでtrue)
// USI原案にこのオプションがあり、ShogiGUI、ShogiDroidで対応しているらしいので
// このオプションを追加。[2020/3/9]
BookFile 定跡ファイル : 定跡ファイルの選択
# このコンボボックスの値
no_book 定跡なし
standard_book.db 標準定跡
yaneura_book1.db やねうら大定跡(公開用 concept proof)
yaneura_book2.db 超やねうら定跡(大会用2015)
yaneura_book3.db 真やねうら定跡(大会用2016)
yaneura_book4.db 極やねうら定跡(大会用2017)
user_book1.db ユーザー定跡1
user_book2.db ユーザー定跡2
user_book3.db ユーザー定跡3
BookDir : 定跡ファイルを配置しているフォルダ
評価値ベースの定跡。以下のオプションを用いるときは
1) NarrowBookを必ずオフに。(やねうら大定跡では、「出現頻度」のところが、思考エンジンのバージョンナンバーになっています!
このため、出現頻度順で並び替えても意味がありません。)
2) 「やねうら大定跡」「真やねうら定跡」など評価値がきちんとついている定跡を用いる。
BookEvalDiff : 定跡の第一候補手との評価値の差
定跡の指し手で1番目の候補の指し手と、2番目以降の候補の指し手との評価値の差が、
この範囲内であれば採用する。(1番目の候補の指し手しか選ばれて欲しくないときは0を指定する)
BookEvalBlackLimit : 定跡の先手の評価値下限
定跡の指し手のうち、先手のときの評価値の下限。これより評価値が低くなる指し手は選択しない。
BookEvalWhiteLimit : 定跡の後手の評価値下限
同じく後手の下限。
BookDepthLimit : 定跡のdepth下限
定跡に登録されている指し手のdepthがこれを下回るなら採用しない。0を指定するとdepth無視。
BookOnTheFly : 定跡ファイルをメモリに丸読みしない機能
やねうら大定跡のような巨大な定跡を試合開始時に読み込まれるとその読み込みに時間がかかるため、
対局中、1手指すごとにファイルを読みに行くオプション。定跡は事前にソートされている必要があります。
これはmakebook sortコマンドで行なえます。コマンドの使い方については、doc/解説.txtにある。
なお、やねうら王の公式サイトで配布している定跡ファイルはsortされています。
定跡ファイル内をバイナリサーチで調べているのでファイルサイズが10GBを超える超巨大な定跡でも取り扱えます。
ランダムアクセスに近いアクセスになるので、このオプションを用いるならHDDよりはSSDのほうが好ましいです。
ConsiderBookMoveCount : 定跡の指し手を定跡DBの採択率に比例させる(やねうら王2017Early以降)
BookIgnoreRate : 一定確率で定跡を無視する。(ヒットしなかったことにする)
0から100までの値を指定できて、例えば30を指定すると30%の確率で定跡にヒットしなかったことにする。
BookPvMoves : 定跡にヒットしたときにPVを何手目まで表示するか。あまり長いとPVの出力に時間がかかる場合があります。
(HDD使ってて巨大定跡でBookOnTheFly有効だと特に…)
※ これは、定跡の指し手で1手実際に局面を進めて、再度定跡にヒットするか判定することを繰り返すため。
このとき、ConsiderBookMoveCount = true , BookEvalDiff = 0 , BookMoves = 0 BookDepthLimit = 0 ,
BookEvalBlackLimit = -99999 , BookEvalWhiteLimit = -99999 として扱われます。
IgnoreBookPly : 定跡DB上の手数を無視する。
例) 局面図が同じであれば、定跡上の36手目の局面に40手目の局面でもヒットする。
ResignValue : 投了スコア。例えば3000にすると相手から見た評価値が3000以上(自分から見たら-3000以下)に
なった場合に投了する。デフォルトは99999。
ConsiderationMode : "検討モード用のPV出力"
ShogiGUIなどの検討モードで用いるためのもので、このオプションをオンにすると
中途半端な読み筋が出力されることが減ります。
OutputFailLHPV : fail low/highのときにPVを出力するかどうか。ConsiderationModeでも有効。
GenerateAllLegalMoves : 読みの各局面ですべての合法手を生成する
(普通、歩の2段目での不成などは指し手自体を生成しないのですが、これのせいで不成が必要な詰みが絡む問題が解けないことが
あるので、このオプションを用意しました。オンにすると勝率が少し下がるのでデフォルトではオフになっています。)
関連) 将棋ソフトは不成が読めないという嘘 : http://yaneuraou.yaneu.com/2020/12/12/all-legal-moves/
EvalHash : EvalHash(評価関数の計算した値を保存しておくメモリ)の大きさを[MB]単位で指定する。2の累乗でなければならない。
※ デフォルト128[MB]。もう少し大きいほうが成績がいいかも。魔女ではAVX2用は1024[MB]。
ThreadIdOffset :
3990XのようなWindows上で複数のプロセッサグループを持つCPUで、思考エンジンを同時起動したときに
同じプロセッサグループに割り当てられてしまうのを避けるために、スレッドオフセットを
指定できるようにしてある。
例) 128スレッドあって、4つ思考エンジンを起動してそれぞれにThreads = 32を指定する場合、
それぞれの思考エンジンにはThreadIdOffset = 0,32,64,96をそれぞれ指定する。
// (プロセッサグループは64論理コアごとに1つ作られる。上のケースでは、ThreadIdOffset = 0,0,64,64でも同じ意味。)
※ 1つのPCで複数の思考エンジンを同時に起動して対局させる場合はこれを適切に設定すべき。
LargePageEnable :
LargePageを有効化するか。デフォルトではtrue(有効)
これを無効化できないと自己対局の時に片側のエンジンだけがLargePageを使うことがあり、
不公平になるため、無効化する方法が必要であった。このオプションはfalseにすると無効となる。
// 協力詰めsolver時
CM_Hash : 協力詰め時の置換表サイズ(単位[MB])
// local-game-server時
EngineConfigDir : "engine_configX.txt"が配置してあるフォルダ
EngineNuma : 子プロセスでEngineを実行するプロセッサグループ(Numa node)
-1なら、指定なし。
BookSfenFile : 連続自己対戦のときに定跡の局面まで進めるためのsfenファイル。
このファイルの棋譜のまま32手目まで進める。
book/book.sfen
のように指定する。
DepthLimit : 探索深さ制限する(0 = 制限なし)
NodesLimit : 探索node数を制限する(0 = 制限なし)
→ この2つは、GUI側がgoコマンドのときにdepthとかnodeとか指定すべきような気はするが、
とりあえずGUI側がそうなっていないので用意した。
NodesLimitは正確にそのnodeで停止するわけではなく多少の誤差はある。
SkipLoadingEval : 評価関数の読み込みをskipさせる。ゼロで埋めた評価関数を用意できないときや、
新しい形式の評価関数が用意できないときに、評価関数の読み込みをskipさせるために用いる。
"test evalconvert"コマンドと組み合わせて使う。詳しくは、解説.txtのほうを参照のこと。
SkillLevel : 手加減のためのもの。この値が 20 なら手加減なし。(通常のモード) 20未満であれば、手加減が有効。
0 だと最弱。(R2000以上弱くなる) Stockfishの"Skill Level"をそのまま移植。
// やねうら王詰将棋エンジン(2020/12/29 release)
USI_Hash : 詰将棋エンジンに割り当てるメモリ[MB]
NodesLimit : 探索ノード数 (0 : 無制限)
SolverType :
32bitNodeSolver(探索ノード数 32bitで表現できる42億までしか扱えないが、必要メモリが64bitNodeSolverの半分で済む)
64bitNodeSolver(探索ノード数 64bitで表現できる範囲なので実質無制限だが、必要メモリは32bitNodeSolverの倍)
PvInterval : 読み筋の出力間隔 (0 : 出力しない)
例)
USI_Hash 4096 // 4096[MB]割り当てる
isready
sfen l2g5/2s3g2/3k1p2p/P2pp2P1/1pP4s1/p1+B6/NP1P+nPS1P/K1G4+p1/L6NL b RBGNLPrs3p 1 // 局面図
go mate 10000 // 10秒で解かせてみる
// ↓info ~でPvIntervalごとに読み筋が出力されて、最後、checkmate XXXで詰み手順が出力される。
// 詰まない(不詰が証明できた)ときは"checkmate nomate"と返ってくる。
// 時間切れの時は"checkmate timeout"と返ってくる。
// 探索ノード数制限で解けなかった時や、詰将棋用のメモリ(USI_Hashで指定している)がリミットに達した場合は、"checkmate none"が返ってくる。
// ※ その直前に "info string Out Of Memory."(メモリ不足) 、 "info string Exceeded NodesLimit."(探索ノード数に達した) が出力される。
info time 1317 nodes 1781726 nps 1352867 hashfull 35 pv 7f8e 6c6b G*5b 6a5b 8e5b 6b5b P*5c 5b6c B*7d 6c5c R*5b 5c4d N*3f 2e3f G*3d 4d3d 5b3b+ R*3c P*3e 3d2d 3b3c 2d3c G*3d 3c2b L*2c 2b3a R*4a 3a3b 4a2a+ 3b4b 2a4a 4b5c 4a5b
checkmate 7f8e 6c6b G*5b 6a5b 8e5b 6b5b P*5c 5b6c B*7d 6c5c R*5b 5c4d N*3f 2e3f G*3d 4d3d 5b3b+ R*3c P*3e 3d2d 3b3c 2d3c G*3d 3c2b L*2c 2b3a R*4a 3a3b 4a2a+ 3b4b 2a4a 4b5c 4a5b
// ふかうら王(dlshogi互換エンジン)の場合
・dlshogiのほうの設定の説明も確認すること。
世界将棋AI 電竜戦バージョン(「GCT電竜」同梱)
https://github.com/TadaoYamaoka/DeepLearningShogi/releases/tag/denryu2020
・定跡関連のオプションは、やねうら王通常探索エンジンの時と同様。
ReuseSubtree
探索したノードを次の手番のときに再利用するかのフラグ
Resign_Threshold : 投了値 : 1000分率で
この値を下回った時に投了する。0なら最後まで投了しない。
Draw_Value_Black : 先手の引き分けの時の値 : 1000分率で
Draw_Value_White : 後手の引き分けの時の値 : 1000分率で
Draw_Value_Blackを1000(期待勝率 100%の意味)に設定すれば、先手は引き分けを勝ちだとみなすことになるので
先手をもったコンピューターは積極的に千日手を狙うことになります。
逆に、0(期待勝率 0%の意味)に設定すれば、引き分けを負けだとみなすことになるので、積極的に千日手を回避
るすようになります。
Draw_Value_From_Black
これがtrueであるなら、root color(探索開始局面の手番)が後手なら、
Draw_Value_BlackとDraw_Value_Whiteの値を入れ替えたものとみなす。
大会では「(自分が先手か後手かはわからないけど)自分はできれば千日手を狙いたくて、
相手のソフトは千日手を引き分けだとみなしている」状況では、root color(開始局面の手番)と、
root colorの反対の手番(相手のcolor)に対して、それぞれ、0.7 , 0.5のように設定したいことがある。
これを実現するために、root colorが後手なら、Draw_Value_BlackとDraw_Value_Whiteを入れ替えてくれる
オプションがあれば良い。それがこれ。
DNN_Model1 ~ 8
UCT_Threads1 ~ 8
DNN_Batch_Size1 ~ 8
各GPU用のDNNモデル名(評価関数ファイルの名前)と、そのGPU用のUCT探索のスレッド数と、
そのGPUに一度に何個の局面をまとめて評価(推論)を行わせるのか。GPUは最大で8個まで扱える。
DNN_Batch_Size1~8 は、通常時の推奨128 , 検討の時は推奨256。
DNN_Model2~8は、""である(何も設定されていない)場合、DNN_Model1の値が採用される。(そのスレッド数に1以上が設定されているとき)
DNN_Batch_Size2~8は、0が設定されている場合、DNN_Batch_Size1の値が採用される。(そのスレッド数に1以上が設定されているとき)
例)
UCT_Threads2 = 8 ← GPU2に割り当てるスレッド数が8
DNN_Model2 = "" ← GPU2用のモデル名はないが、↑でスレッドを割り当てているので、DNN_Model1で指定したモデルがGPU2用に読み込まれる。
DNN_Batch_Size2 = 0 ← GPU2用のバッチサイズは0だが、↑でスレッドを割り当てているので、GPU2用のバッチサイズは、DNN_Batch_Size1の値と同じになる。
DNN_Batch_Sizeを上げると、GPUからの帰りを待つ時間が増えるので、時間超過になりやすい。
その場合、NetworkDelay,NetworkDelay2の値を調整すること。
// NetworkDelayは普通、400ぐらいが最適値だと思う。
例)
DebugMessageをオンにすると以下のようなログが出力される。
> info string search search_end = 3600[ms], interruption time = 3604[ms]
> info nps 172 time 4257 nodes 735 hashfull 0 depth 4 score cp 176 pv 2g2f 8c8d 1g1f 1c1d
これは、3600[ms]の時点で停止するようにそれより前の段階で計画した、そして3604[ms]の時点で探索スレッドに停止信号を送った、
ところが全スレッドが停止したのは4257[ms]の時点であった。このとき4257-3604 = 653[ms]だけ停止させるための遅延が発生している。
(GPUが処理中ですぐに停止できていない) この場合、NetworDelayは 653 + α = 800ぐらいに設定するのが順当。
NetworkDelay2 は(ネット対戦であれば)そこに1秒ぐらい足して、1800ぐらいが順当。(←切れたら即負けなので少しマージンを持たせる)
ネット対戦でなければ、+500程度のマージンで良いと思う。
DebugMessage
デバッグ用のメッセージ出力の有無。
UCT_NodeLimit
探索するときに調べたNode数に比例してメモリを使用するが、このNodeをいくつ作るかという制限。
これに比例したメモリが必要となる。
NodesLimitは、これとは異なり、単に探索したノード数の制限。
MateSearchPly
leaf node(探索の末端の局面)での奇数手詰みルーチンを呼び出す時の手数
5に設定すると探索の末端の局面で5手で詰むかを調べる。CPU側で調べるのでCPUに負担がかかる。5がおそらくベスト。7はCPUが他の処理をできなくなる。
0 = 奇数手詰めを呼び出さない。
RootMateSearchNodesLimit
root node(探索開始局面)でのdf-pnによる詰み探索を行う時の調べるノード(局面)数
これが0だと詰み探索を行わない。最大で指定したノード数まで詰み探索を行う。
ここで指定した数×16×8(王手の分岐数を考慮するとそれくらい)バイト、詰み探索用に消費する。
例) 100万を指定すると128MB消費する。
1秒間に100万~200万局面ぐらい調べられると思うので、最大で3秒調べさせたいのであれば300万~600万ぐらいを設定する。
// デフォルトは30万
// 不詰が証明できた場合はそこで詰み探索は終了する。
// dlshogiは、300[ms]探索するのがデフォルトなので、おそらく30万ノードぐらい。
// まあそんな長い詰み、そうそう実戦で出くわさないので300[ms]で十分なのかも知れない。
// それ以上は置換表のアクセスでメモリの転送帯域消費するのでUCT探索の邪魔になるという…。
★ dlshogiとの違いについて
// EvalDir → dlshogiではサポートされていないが、やねうら王は、EvalDirにあるモデルファイルを読み込むようにする。
// 以下も、探索パラメーターだから、いらない。開発側が最適値にチューニングすべきという考え。
// C_fpu_reduction , C_fpu_reduction_root , C_init , C_base , C_init_root , C_base_root
・getoption
使い方)
getoption [オプション名]
USI独自拡張。setoptionの逆。オプション名を指定して、その現在の値を取得する。
オプション名は大文字小文字の違いは無視する。
オプション名を省略するとすべてのオプション項目の現在の値を出力する。
■ goコマンドの拡張
go depth 6
depth指定での思考。
go nodes 10000
探索node数を指定しての思考。あまり厳密に守るわけではない。(探索ノード数をチェックする間隔が甘いので厳密に守れない)
注意)
depthとnodesは、USIプロトコルの原案となったUCIプロトコルには存在する。
将棋所は対応しておらず。ShogiGUIでは対応しているはず。
go rtime 100
とすると、今回の思考時間として、100~300[ms]を使って思考する。
自己対局でレーティングを計測するときに指し手をバラけさせる効果がある…と思って用意したが、
いまとなっては使っていない。
go movetime 100
1手の持ち時間固定のオプション。この場合、1手100[ms]。
GUI側が普通対応していないが。
perft [depth] :パフォーマンステスト。現在の局面(positionコマンドで与えられる)から深さdepthまで
全合法手で進めるときの総node数を数えあげる。depthとして1以上の値を指定すること。
position~goコマンドと組み合わせて使う。
例)
perft 10
position startpos
go
■ USI拡張コマンド
d : (debugのd) デバッグ用に現在の局面を表示する。
compiler: コンパイルに使用したコンパイラ情報が表示される。
eval : 現在の局面に対して評価関数を呼び出して評価値を出力する。
matsuri : 指し手生成祭りの局面を現在の局面としてセットする。
moves : 現在の局面の合法手(LEGAL_ALL)をすべて出力する。
side : 現在の局面の手番を返す(先手 = "black" , 後手 = "white")
sfen : "position sfen"の略。"d"コマンドで表示されたsfen文字列をコピペするときに便利。
key : 現在の局面に対して局面のhash keyを出力
mated : 現在の局面に対して詰み判定を呼び出す。詰んでいれば1。さもなくば0。
mate1 : 現在の局面に対してmate1ply()を呼び出す。
matedebug: MateEngineのデバッグ用コマンド : 詰将棋の特定の変化に対する解析を効率的に行うことが出来る。
cf. https://github.com/yaneurao/YaneuraOu/pull/115
qsearch : 現在の局面に対してLearner::qsearch()を直接呼び出して評価値と読み筋を表示する。
(デバッグ用 , EVAL_LEARNを有効にしてコンパイルした実行ファイルのみ使える。)
search : 現在の局面に対してLearner::search()を直接呼び出して評価値と読み筋を表示する。
(デバッグ用 , EVAL_LEARNを有効にしてコンパイルした実行ファイルのみ使える。)
log : ログファイル("io_log.txt")に標準入出力を書き出す設定。Write Debug Logでon/offも出来る。
bench : ベンチマーク
bench [置換表サイズ][スレッド数][→の指定][LimitType = depth , nodes, time][局面の指定]
例)
bench 1024 1 10 default depth
※ パラメーター省略時は上記の設定
[局面の指定]について
"default"=デフォルトの局面、"current"=現在の局面、
それ以外 = ファイル名とみなしてそのsfenファイルを読み込む
例) bench 1024 1 10 default depth
■ テストコマンド
test : テスト用コマンド
※ testコマンドは実験的に実装してあるコマンドで、突然無くなることがあります。
// ----------------------------
// 通常のテストコマンド
// ----------------------------
test genmoves :
指し手生成のスピードテストを行なう。
王手がかかっているときはEVASIONS,かかっていないときはNON_EVASIONS
loop X : 繰り返す回数X
例)
isready
position sfen l6nl/5+P1gk/2np1S3/p1p4Pp/3P2Sp1/1PPb2P1P/P5GS1/R8/LN4bKL w GR5pnsg 1
test genmoves
// positionコマンドはisreadyしてからでないと使えないのでisreadyを入れてからpositionコマンドを
// 送って、そのあとにtest genmovesを実行する。
// ↓のような結果が返ってくる。
sfen l6nl/5+P1gk/2np1S3/p1p4Pp/3P2Sp1/1PPb2P1P/P5GS1/R8/LN4bKL w RGgsn5p 1
1d1e 2e2f 6c6d 7d7e 9d9e 9a9b 9a9c 2a1c 2a3c 7c6e 7c8e 3i1g+ 3i2h+ 3i4h+ 3i5g+ 6f4h+ 6f5g+ 6f7g+ 6f8h+ 6f9i+ 6f3c 6f4d 6f5e 6f7e 6f8d 6f9c 1b1c 1b2c 2b1c 2b2c 2b3b 2b3c P*3a P*3b P*3c P*3d P*3h P*4a P*4d P*4e P*4f P*4g P*4h P*5a P*5b P*5c P*5d P*5e P*5f P*5g P*5h P*8a P*8b P*8c P*8d P*8e P*8g P*8h S*4i G*4i S*5i G*5i S*6i G*6i S*7i G*7i S*1h G*1h S*2h G*2h S*3h G*3h S*4h G*4h S*5h G*5h S*6h G*6h S*7h G*7h S*8h G*8h N*1c S*1c G*1c N*1e S*1e G*1e N*1g S*1g G*1g N*2c S*2c G*2c N*2f S*2f G*2f N*3a S*3a G*3a N*3b S*3b G*3b N*3c S*3c G*3c N*3d S*3d G*3d N*4a S*4a G*4a N*4d S*4d G*4d N*4e S*4e G*4e N*4f S*4f G*4f N*4g S*4g G*4g N*5a S*5a G*5a N*5b S*5b G*5b N*5c S*5c G*5c N*5d S*5d G*5d N*5e S*5e G*5e N*5f S*5f G*5f N*5g S*5g G*5g N*6a S*6a G*6a N*6b S*6b G*6b N*6d S*6d G*6d N*6g S*6g G*6g N*7a S*7a G*7a N*7b S*7b G*7b N*7e S*7e G*7e N*7g S*7g G*7g N*8a S*8a G*8a N*8b S*8b G*8b N*8c S*8c G*8c N*8d S*8d G*8d N*8e S*8e G*8e N*8g S*8g G*8g N*9b S*9b G*9b N*9c S*9c G*9c N*9e S*9e G*9e N*9f S*9f G*9f
2957121 times per second.
test autoplay : 自己対局テストコマンド
探索部や指し手生成にバグがないかを調べる時に用いる。
// ASSERT_LV 5とかに設定してコンパイルして、連続自己対局させれば、探索や指し手生成のバグがあれば
// どこかでASSERTに引っかかるという考え。
loop X : 連続自己対局の回数X
movetime N : 1手あたりの思考時間がN[ms]になる。default 100[ms]
verbose : 詳細な出力。対局棋譜を"position startpos moves ..."の形式で出力する。
// ----------------------------
// 詰み関連のテストコマンド
// ----------------------------
test genmate : 詰将棋の自動生成(やねうら王通常探索部のLEARN版のみ)
自己対局を行い、その対局中に見つけた詰め将棋の局面をsfen形式で出力します。
// 自己対局を行うので、評価関数は正常に読み込め、エンジンは正常に動作している必要があります。
loop X : 生成する個数がX。
min_ply n : 生成する詰将棋の最小手数n(奇数にすること)
max_ply m : 生成する詰将棋の最大手数m(奇数にすること)
filename file名 : 生成するファイル名(sfen形式)
例) test genmate loop 10000 min_ply 5 max_ply 7 filename mate.sfen
とすると5手か7手の詰将棋がsfen形式で1万局面出力されます。
// このコマンドは5秒ごとに生成した局面数を表示します。
スレッド並列で生成するので、そのときのエンジンオプションのThreadsの数だけ並列生成します。
例) // 8スレッドで生成したいなら、以下のようにします。
Threads 8
test genmate loop 10000 min_ply 5 max_ply 7 filename mate.sfen
test matebench : 詰みルーチンに関するbenchをとる。
このbenchには、"test genmate"コマンドで生成した詰み局面を利用すると良い。
file file名 : 詰将棋のsfen文字列が書かれているファイル名
num 問題数 : ファイルから読み込む問題数(先頭からこの行数だけ読み込む)
loop X : 問題をX回ずつ解かせる。
sfen文字列からPositionにセットする時間がロスするので、
何度かずつ同じを局面を繰り返し解かせる時に用いる。
mate_ply N : 奇数詰めルーチンを呼ぶ時の上限の詰み手数N。
dfpn_mem M : df-pnルーチン用のメモリをどれだけ割り当てるか。M [MB]。
verbose : 出力を多めにする。不詰がある時、その時のsfen文字列を出力する。
mode M : M が 1 : 奇数詰めのベンチをする , 2 : df-pnルーチンのベンチをする。
1 + 2 = 3を指定すると両方のベンチをする。
例) test matebench file mate/mate.sfen num 1000000
mate/mate.sfenファイルを、その先頭から100万局面分読み込んでベンチを行う。
test matebench2 : tanuki-詰将棋ルーチンのベンチマークテスト
// そのうち削除するかも知れないので説明は割愛
test dfpn : 現在の局面に対してdf-pn詰将棋ルーチンを呼び出す
// df-pnルーチン自体が現在調整中につき非公開なのでこのコマンドは使えません。
解けた場合、その時の探索したノード数と読み筋を返す。
nodes : 探索ノード数の制限
mem : df-pn用のメモリ[MB]
現在の局面は、"position"コマンドか"sfen"コマンドで設定する。
positionコマンドの前には"isready"コマンドを送信してある必要がある。
例) sfenで指定した局面をdf-pn詰将棋ルーチンで解かせる。
isready
sfen ln6+P/2sk1G3/p1ppn2pp/5BP2/9/2N6/P1PPPP2P/1SG6/LN1KR+r3 w 2G2L5Pb2s 72
test dfpn
■ 詰将棋エンジン
・go mate X
X = 探索時間[ms]
※ UCIではここはdepthを指定するがUSIでは探索時間を指定するようになっている。
時間制限なしのときは
go mate infinite
と書く。
・go nodes X mate infinite
X = ノード制限
※ NodesLimitみたいなの。USI2.0拡張。
mate以下は、infiniteではなく探索時間を指定することもできる。
・go depth X mate infinite
X = 探索深さ制限
※ DepthLimitみたいなもの。USI2.0拡張。
→ これは現時点[2018/11/12]では未実装
■ 定跡生成
// MAKE_BOOK_CMD,EVAL_LEARN をdefineしてコンパイルしたときにのみ有効。
// NNUEのLEARN版などで使えます。
makebook : 定跡作成コマンド。詳しくは doc/解説.txt のほうを参考に。
■ 評価関数の学習関連
・評価関数の学習で用いる教師局面の生成
// やねうら王 LEARN版のみ
gensfen [depth 探索深さ] [loop 生成する棋譜の数] [output_file_name ファイル名] [eval_limit 評価値] : 学習用の自己対局棋譜の生成
例) gensfen depth 6 (残りは省略可)
eval_limitは、評価値の絶対値がこの値を上回った時点でその対局を終了するという値。
その他に指定できるオプション
write_minply N :
初期局面周辺は、類似局面ばかりなので、初期局面から数えてN手未満の局面は教師局面として書き出さない。
デフォルトでは16。
初期局面を書き出すなら、Nに1を指定する。
write_maxply N :
書き出す局面の初期局面からの手数の最大。この手数を超えると引き分け扱いとする。
デフォルトでは400。
random_move_minply,random_move_maxplyとrandom_move_countオプション
教師局面の生成時にランダムムーブを行なう最小手数と最大手数と1局でランダムムーブを行なう回数
デフォルトではrandom_move_minply = 16 , random_move_maxply = 32 , random_move_count = 5。
// 16手目から24手目までに5回のランダムムーブを行なうという意味
gensfen random_move_maxply 16 random_move_maxply 32 random_move_count 5 ...
みたいに指定する。
特殊な指定として、
random_move_minplyに-1を指定すると、
定跡を抜けるところまで定跡に従って指して、そのあと定跡局面を抜けた直後に
random_move_count回のランダムムーブを行なうという挙動になる。
random_move_like_apery N : ランダムムーブのときに玉を移動させる指し手の確率を上げる。
例えば、N = 3を指定すれば1/3の確率で玉を移動させる。
(そしてこのとき、玉を移動させたあとは1/2の確率で相手番もランダムムーブが入る。)
玉を移動させないときは普通に合法手から1手選択。(玉を移動させる指し手も含まれる)
このオプションに0を指定すると、この機能は無効化される。
random_multi_pv N : ランダムムーブの代わりにMultiPV Nでrandom_move_count手指すオプション。
ConsiderBookMoveCount = trueと組み合わせると実現確率の高い局面からスタートできるかも…。
0を指定するとこの機能は無効。
random_multi_pv_diff m : random_multipvでmulti pvで指し手を採択するときに、
1位の指し手の評価値との評価値の差がmに収まる範囲の指し手しか採択しない。
デフォルトでは32000。(範囲の限度なし)
random_multi_pv_depth : random_multipvするときの探索深さ。指定しない場合、gensfenで指定したdepth。
use_eval_hash b : 同じ局面に遭遇したときのために評価値を保存しておく機能。
これをオンにすると、hash衝突したときに間違った局面の評価値を使ってしまうため、
オフにすることを推奨。ただし、eval_limitを32000などのように大きくとる場合、
間違った評価値でもいずれは新しい局面で上書きされるため、影響は軽微であるからオンのほうが良いかも。
(オンにしないと局面の生成が2割ぐらい遅くなりかねないので)
オンにするにはuse_eval_hash 1のようにbのところに1を指定する。オフにするには0を指定する。
save_every m : ファイルの分割保存オプション。
教師局面をmだけ書き出すごとにファイルに保存する。
AWSのspot instanceのterminate対策。
mは1万の倍数を指定する。端数は無視される。
random_file_name b : 生成されるファイル名をランダム化するオプション
random_file_name 1と指定すると有効。
random_file_name 0と指定すると無効。デフォルト、無効。
このオプションが有効だとoutput_file_nameで指定したファイル名にランダムな数字を結合する。
例) output_sfen_2549869
さらにsave_everyオプションと組み合わせると
例) output_sfen_2549869 , output_sfen_2549869_1 , output_sfen_2549869_2 , ..
のように連番で保存されていく。
※ AWSで複数インスタンスを立ち上げるときに、startupのスクリプトでgensfenコマンドを叩きたいときに
それぞれのインスタンスで出力ファイル名が違っていて欲しいため。
・教師局面から評価関数の学習
learn [教師棋譜ファイル名1] [教師棋譜ファイル名2] … : 生成した棋譜から評価関数パラメーターの学習をさせる。
教師棋譜ファイル名はいくらでも書ける。
gensfenコマンドで生成したファイルを指定する。
このファイルを指定しない場合は、以下のtargetdirオプションで教師棋譜が入ったフォルダを指定する必要がある。
batオプション
learn bat 200 [ファイル名1][ファイル名2]..のように mini batchのサイズを設定できる。
200だと200万局面ごとに評価関数パラメーターの更新が行われる。
basedirオプション
learn basedir c:/kif [ファイル名1][ファイル名2]..のように指定すると c:/kif/ファイル名1 c:/kif/ファイル名2 のように
書いたのと同じ効果がある。
targetdirオプション
learn targetdir c:/kif
とするとc:/kifフォルダ内にあるファイルを根こそぎ学習対象とする。
loopオプション
learn loop 3 [ファイル名1][ファイル名2]..のように指定すると、3回ループする。
(手抜き実装のため大きな数字を指定すると、ファイル名の文字列バッファをたくさん消費するので1000ぐらいまでの指定でお願いします)
batchsizeオプション
minibatchのサイズを指定できる。デフォルトは100万局面。
eval_limitオプション
教師局面の深い探索での評価値の絶対値が、この値を超えているならその局面を読み捨てる。
指定しないときは32000が指定されているものとする。
save_only_onceオプション
評価関数を保存するときに都度フォルダを掘らないようにするフラグ。
デフォルトではオフ。
no_shuffle
読み込み時に先読みでのシャッフルを行わない。
これを指定しないときは1000万局面ごとにシャッフルしながら読み込む。
(デフォルトではオフ)
lambda elmo(WCSC27)式を内分形式にしたときのlambda。
elmo(WCSC27)と同じにするには0.33を指定すれば良い。
参考)
grad = (1 - lambda) * (eval_winrate - t) + lambda * (eval_winrate - teacher_winrate);
lambda2 , lambda_limit
深い探索の評価値の絶対値がlambda_limit以上のときは、lambdaではなくlambda2のほうを適用する。
デフォルトではlambda_limit = 32000なのでlambda2が適用されることはない。
freeze_kk bool :
freeze_kkp bool :
freeze_kpp bool :
KK,KKP,KPPのうち、KK/KKP/KPPを学習させないオプション。trueにするとその特徴因子は学習しない。
オンにするにはfreeze_kpp 1のように1を指定する。オフにするには0を指定する。
また、KKPP_KPPTのようなKKPPを持つ評価関数の場合、freeze_kkppというオプションが使える。
同様に、KPPP_KPPTのようなKPPPを持つ評価関数の場合、freeze_kpppというオプションが使える。
eta 学習率
AdaGradの学習率を設定する。30.0が標準的な学習率。
これを上げるとパラメーターの更新のときの一回の変化量が大きくなる。
(大きければ良いというわけでもない)
etaの代わりにeta1と指定しても良い。
また0を指定するとデフォルト値(30.0)になる。
etaを連続的に変化させるには、
eta1 0.01 eta2 500 eta1_epoch 100 eta3 30 eta2_epoch 500
のように指定する。
この場合、etaは0.01から始まり、epoch 100までに徐々に増加し、epoch 100で500になる。
そのあと、徐々に減り、epoch 500で30になる。そこ以降は30のまま。
eta1_epoch , eta2_epochを指定しなければこのような機能はオフになる。
たとえばeta2_epochを指定しない場合、eta3は無視される。
保存するフォルダは"EvalSaveDir"で指定したフォルダ。
デフォルトでは"evalsave"。このフォルダは事前に用意されているものとする。
このフォルダ配下にフォルダを"0/","1/",…のように自動的に掘り、そこに評価関数ファイルを保存する。
save_only_onceが指定されているときは、"0/","1/"のようなフォルダは掘らない。
・教師局面の変換
cf. http://qhapaq.hatenablog.com/entry/2017/12/25/002820
簡単な説明) 「バイナリ形式」とは、 通常の教師局面形式。
「テキスト形式」とは、テキスト(sfenと何か)で書かれた教師局面形式。
詳しい形式については、learn.cppのconvert_plain()を見ればわかる。
learn convert_bin output_file_name [出力ファイル名] [入力ファイル名1] [入力ファイル名2]
入力ファイル名1,2,…で指定されたテキスト形式の教師局面を読み込み、出力ファイル名のファイルに
バイナリ形式で出力する。
learn convert_plain output_file_name [出力ファイル名] [入力ファイル名1] [入力ファイル名2]
入力ファイル名1,2,…で指定されたバイナリ形式の教師局面を読み込み、出力ファイル名のファイルに
テキスト形式で出力する。
・教師局面のシャッフル
learn shuffle basedir BASE_DIR targetdir TARGET_DIR output_file_name OUTPUT_FILE_NAME [教師棋譜ファイル名1] [教師棋譜ファイル名2] ...
basedir BASE_DIR と targetdir TARGET_DIR と output_file_name OUTPUT_FILE_NAME とは省略できる。
教師棋譜ファイル名も省略できる。教師棋譜ファイルはgensfenコマンドで生成したものとする。
shuffleしないときのコマンド同様、教師棋譜ファイルを指定しないときは、targetdirで教師局面ファイルが
入ったフォルダを指定してやる必要がある。
targetdirを省略してファイル名をそのあとに並べることも出来る。
tmp/
というフォルダに一時ファイルが書き出され、最終的に
OUTPUT_FILE_NAME
というファイルが書き出される。
output_file_name OUTPUT_FILE_NAMEを省略時には
shuffled_sfen.bin
というファイル名でカレントフォルダに書き出される。
buffer_size BUFFER_SIZE
シャッフルするときにテンポラリファイルはbuffer_size局面ずつtmp/フォルダにいったん書き出す。
例えば、buffer_size = 20000000 (20M)ならば 20M*40bytes = 800MBのバッファが必要。
メモリが少ないPCでは、ここを減らすと良いと思う。
ただし、あまりファイル数が増えるとOSの制限などから同時にopen出来なくなる。
Windowsだと1プロセス512という制約があったはずなので、ここでopen出来るのが500として、
現在の設定で500ファイル×20M = 10G = 100億局面が限度。
learn shufflem basedir BASE_DIR targetdir TARGET_DIR output_file_name OUTPUT_FILE_NAME [教師棋譜ファイル名1] [教師棋譜ファイル名2] ...
メモリに丸読みしてシャッフルして指定ファイル名で書き出す。
(メモリが教師局面の2倍ぐらい必要)
その他はlearn shuffleコマンドと同様。
learn shuffleq basedir BASE_DIR targetdir TARGET_DIR output_file_name OUTPUT_FILE_NAME [教師棋譜ファイル名1] [教師棋譜ファイル名2] ...
それぞれの教師局面はファイル単位ではshuffleされていると仮定して、1passでシャッフルする。高速。
その他はlearn shuffleと同様。
複数台のPCで教師局面を生成するときに、各PCは生成直後に"learn shufflem"しているとして、
それらのファイルをホスト側で"learn shuffleq"してから学習に使うというような使い方を想定している。