aobazero
aobazero copied to clipboard
macOS上でコンパイルできるようにしました
こんにちは。
v1.9をmacOSでコンパイルできるようにしてみました。 十分な動作確認をしているわけではないので(ウェイトw000000003459で探索させると初手が9六歩になります。エンバグしているかもしれません)、プルリクというよりAobaZeroを使いたいmacOSユーザーさんへのご参考にという感じです。
ほとんどは__APPLE__等での条件付きで互換性を持たせていますが、macOSではOpenCLのコンパイラが配列の引数を許さないという制約があったので、そこはコードを変えています。
macOSでコンパイルできたv1.4と比較して、6.5倍のスピードアップです。ご尽力感謝いたします。
macでの動作確認ありがとうございます!
w3459だと1手800playoutで初手は▲26歩になるので少し動作が異なるかもしれません。 以下は動作例です。 $ bin/aobaz -p 800 -t 1 -b 1 -w ~/test/extract/w000000003459.txt playouts=800 cfg_num_threads=1 cfg_batch_size=1 network path=/home/yss/test/extract/w000000003459.txt num_P=1,threads_per_GPU=1,cfg_num_threads=1,numGPU=1,all P=1 go start thread=0 Register id: 0 nnet_id: 0 start dummy_num_threads=0,gnum=0 cfg_random_temp=1.000,cfg_num_threads=1,cfg_batch_size=1,gpus=1 sum_ok=11259/11259, MOVE_C_Y_X_ID_MAX=11259 token is null. go infinite HashShogi= 16384( 1MB),sizeof(HASH_SHOGI)=72,Hash_SHOGI_Mask=16383 root phg->hash=0, child_num=30 0( 0) 6978KI, 355, 0.080,bias=0.4230992496 1( 1) 2726FU, 378, 0.085,bias=0.4206939936 2( 2) 1716FU, 67, 0.084,bias=0.0765186995 best:2726FU,378, 54.26%( 0.085),bias= 0.421 +2726FU -4132KI +2625FU -8384FU +3938GI -1314FU +7776FU -8485FU +8877KA -3334FU +7968GI -2277UM +6877GI -3122GI +5968OU -2233GI 2.49 sec, c=30,net_v=0.093,h_use=801,po=800,321/s,ave_ply=9.1/24 (0/0),Noise=0,g=1,mt=1,b=1 bestmove 2g2f
このバージョンも800playoutだと初手は▲26歩です。
% bin/aobaz -p 800 -t 1 -b 1 -w weight-save/w000000003459.txt
playouts=800
cfg_num_threads=1
cfg_batch_size=1
network path=weight-save/w000000003459.txt
Tuning feed-forward engine of device -1 for weight-save/w000000003459.txt
num_P=1,threads_per_GPU=1,cfg_num_threads=1,numGPU=1,all P=1
go
- Device ID: 1
Type: GPU
Name: AMD Radeon Pro 5300 Compute Engine
Driver Version: 1.2 (Jun 25 2021 18:15:31)
Compute Units: 20
Max Work-Group Size: 256
Max Clock Freq (MHz): 1650
Global Mem Size: 4278190080
Max Mem Alloc Size: 1069547520
Local Mem Type: LOCAL
Local Mem Size: 65536
Rough Evaluation: 33000
Half Precision: Unused
Matrix M: NLM:16 NLN:8 NPM:2 NPN:2 NPK:16 TUS:220
Head 1: NLM:16 NLN:4 NPM:1 NPN:1 NPK:16 TUS:23
Value 2: NLM:8 NLN:1 NPM:1 NPN:1 NPK:8 TUS:41
Value 3: NLM:1 NLN:1 NPM:1 NPN:1 NPK:4 TUS:23
Register id: 0 nnet_id: 0start thread=0
start dummy_num_threads=0,gnum=0
cfg_random_temp=1.000,cfg_num_threads=1,cfg_batch_size=1,gpus=1
sum_ok=11259/11259, MOVE_C_Y_X_ID_MAX=11259
token is null. go infinite
HashShogi= 16384( 1MB),sizeof(HASH_SHOGI)=72,Hash_SHOGI_Mask=16383
root phg->hash=0, child_num=30
0( 0) 6978KI, 355, 0.080,bias=0.4231019020
1( 1) 2726FU, 378, 0.085,bias=0.4206918180
2( 2) 1716FU, 67, 0.084,bias=0.0765183046
best:2726FU,378, 54.26%( 0.085),bias= 0.421
+2726FU -4132KI +2625FU -8384FU +3938GI -1314FU +7776FU -8485FU +8877KA -3334FU +7968GI -2277UM +6877GI -3122GI +5968OU -2233GI
3.06 sec, c=30,net_v=0.093,h_use=801,po=800,261/s,ave_ply=9.1/24 (0/0),Noise=0,g=1,mt=1,b=1
bestmove 2g2f
42000プレイアウト辺りを超えると初手が▲96歩に変わります。
% bin/aobaz -p 42000 -t 1 -b 1 -w weight-save/w000000003459.txt
playouts=42000
cfg_num_threads=1
cfg_batch_size=1
network path=weight-save/w000000003459.txt
Tuning feed-forward engine of device -1 for weight-save/w000000003459.txt
num_P=1,threads_per_GPU=1,cfg_num_threads=1,numGPU=1,all P=1
- Device ID: 1
Type: GPU
Name: AMD Radeon Pro 5300 Compute Engine
Driver Version: 1.2 (Jun 25 2021 18:15:31)
Compute Units: 20
Max Work-Group Size: 256
Max Clock Freq (MHz): 1650
Global Mem Size: 4278190080
Max Mem Alloc Size: 1069547520
Local Mem Type: LOCAL
Local Mem Size: 65536
Rough Evaluation: 33000
Half Precision: Unused
Matrix M: NLM:16 NLN:8 NPM:2 NPN:2 NPK:16 TUS:220
Head 1: NLM:16 NLN:4 NPM:1 NPN:1 NPK:16 TUS:23
Value 2: NLM:8 NLN:1 NPM:1 NPN:1 NPK:8 TUS:41
Value 3: NLM:1 NLN:1 NPM:1 NPN:1 NPK:4 TUS:23
Register id: 0 nnet_id: 0start thread=0
start dummy_num_threads=0,gnum=0
cfg_random_temp=1.000,cfg_num_threads=1,cfg_batch_size=1,gpus=1
sum_ok=11259/11259, MOVE_C_Y_X_ID_MAX=11259
go
token is null. go infinite
HashShogi= 131072( 9MB),sizeof(HASH_SHOGI)=72,Hash_SHOGI_Mask=131071
root phg->hash=0, child_num=30
0( 0) 6978KI,10791, 0.076,bias=0.4231019020
1( 1) 2726FU,13012, 0.082,bias=0.4206918180
2( 2) 1716FU, 1973, 0.076,bias=0.0765183046
3( 3) 7776FU, 280, 0.082,bias=0.0089977942
4( 4) 9796FU,15433, 0.114,bias=0.0072973240
5( 5) 5968OU, 76, 0.029,bias=0.0066500455
6( 6) 6766FU, 113, 0.058,bias=0.0064995419
7( 7) 3938GI, 90, 0.043,bias=0.0064942562
8( 8) 3948GI, 73, 0.030,bias=0.0062806280
9( 9) 4958KI, 60, 0.035,bias=0.0049215388
10( 10) 7968GI, 14,-0.066,bias=0.0027491360
11( 11) 6968KI, 13,-0.079,bias=0.0026006191
12( 12) 5958OU, 9,-0.123,bias=0.0023210284
13( 13) 5948OU, 9,-0.111,bias=0.0022904638
14( 14) 3736FU, 10,-0.096,bias=0.0022868428
15( 15) 4948KI, 8,-0.139,bias=0.0022113493
16( 16) 4746FU, 8,-0.124,bias=0.0021512914
17( 17) 5756FU, 8,-0.139,bias=0.0021158755
18( 18) 7978GI, 7,-0.148,bias=0.0020119227
19( 19) 4938KI, 6,-0.167,bias=0.0018089950
20( 20) 2868HI, 3,-0.285,bias=0.0014737591
21( 21) 6958KI, 2,-0.317,bias=0.0011572269
22( 22) 2878HI, 2,-0.276,bias=0.0011555264
best:9796FU,15433, 55.68%( 0.114),bias= 0.007
+9796FU -3334FU +6978KI -8384FU +7776FU -8485FU +2726FU -4132KI +2625FU -8586FU +8786FU -8286HI +2524FU -2324FU +2824HI -5152OU +2434HI -2233KA +3436HI -8684HI +3626HI -3122GI +0087FU -7162GI +5968OU -7374FU +3948GI -8173KE +4958KI -6151KI
161.14 sec, c=30,net_v=0.093,h_use=42001,po=42000,261/s,ave_ply=16.7/54 (0/0),Noise=0,g=1,mt=1,b=1
bestmove 9g9f
オリジナルではいかがでしょうか? (すいません、Windows PCもLinux PCも持ってないです…)
Colabでreleaseブランチの動作確認したところ、やはり42000プレイアウトで初手が▲96歩でした。 このプルリクと動作は一致してそうです。
プルリクの件とは別に、長考すると初手が96歩になるのはMCTSに問題があるように思うのですが、いかがでしょうか?(issueをあげた方がいいですか?)
playouts=42000
cfg_num_threads=1
cfg_batch_size=1
network path=weight-save/w000000003459.txt
Tuning feed-forward engine of device -1 for weight-save/w000000003459.txt
num_P=1,threads_per_GPU=1,cfg_num_threads=1,numGPU=1,all P=1
- Device ID: 0
Type: GPU
Name: Tesla T4
Driver Version: 460.32.03
Compute Units: 40
Max Work-Group Size: 1024
Max Clock Freq (MHz): 1590
Global Mem Size: 15843721216
Max Mem Alloc Size: 3960930304
Local Mem Type: LOCAL
Local Mem Size: 49152
Rough Evaluation: 63600
Half Precision: Unused
Matrix M: NLM:16 NLN:4 NPM:4 NPN:4 NPK:16 TUS:73
Head 1: NLM:16 NLN:4 NPM:4 NPN:2 NPK:16 TUS:11
Value 2: NLM:16 NLN:1 NPM:1 NPN:1 NPK:16 TUS:8
Value 3: NLM:1 NLN:1 NPM:1 NPN:1 NPK:4 TUS:12
Register id: 0 nnet_id: 0
start thread=0
start dummy_num_threads=0,gnum=0
cfg_random_temp=1.000,cfg_num_threads=1,cfg_batch_size=1,gpus=1
sum_ok=11259/11259, MOVE_C_Y_X_ID_MAX=11259
go
token is null. go infinite
HashShogi= 131072( 9MB),sizeof(HASH_SHOGI)=72,Hash_SHOGI_Mask=131071
root phg->hash=0, child_num=30
0( 0) 6978KI,10792, 0.076,bias=0.4230992496
1( 1) 2726FU,13012, 0.082,bias=0.4206939936
2( 2) 1716FU, 1973, 0.076,bias=0.0765186995
3( 3) 7776FU, 280, 0.082,bias=0.0089977970
4( 4) 9796FU,15432, 0.114,bias=0.0072972230
5( 5) 5968OU, 76, 0.029,bias=0.0066500991
6( 6) 6766FU, 113, 0.058,bias=0.0064995815
7( 7) 3938GI, 90, 0.043,bias=0.0064942529
8( 8) 3948GI, 73, 0.030,bias=0.0062806783
9( 9) 4958KI, 60, 0.035,bias=0.0049215686
10( 10) 7968GI, 14,-0.066,bias=0.0027491502
11( 11) 6968KI, 13,-0.079,bias=0.0026006224
12( 12) 5958OU, 9,-0.123,bias=0.0023210295
13( 13) 5948OU, 9,-0.111,bias=0.0022904647
14( 14) 3736FU, 10,-0.096,bias=0.0022868393
15( 15) 4948KI, 8,-0.139,bias=0.0022113584
16( 16) 4746FU, 8,-0.124,bias=0.0021512555
17( 17) 5756FU, 8,-0.139,bias=0.0021158846
18( 18) 7978GI, 7,-0.148,bias=0.0020119294
19( 19) 4938KI, 6,-0.167,bias=0.0018089956
20( 20) 2868HI, 3,-0.285,bias=0.0014737499
21( 21) 6958KI, 2,-0.317,bias=0.0011572307
22( 22) 2878HI, 2,-0.276,bias=0.0011555279
best:9796FU,15432, 55.68%( 0.114),bias= 0.007
+9796FU -3334FU +6978KI -8384FU +7776FU -8485FU +2726FU -4132KI +2625FU -8586FU +8786FU -8286HI +2524FU -2324FU +2824HI -5152OU +2434HI -2233KA +3436HI -8684HI +3626HI -3122GI +0087FU -7162GI +5968OU -7374FU +3948GI -8173KE +4958KI -6151KI
83.29 sec, c=30,net_v=0.093,h_use=42001,po=42000,504/s,ave_ply=16.7/54 (0/0),Noise=0,g=1,mt=1,b=1
bestmove 9g9f
こちらでも42000回で試してみましたが、6978KIが1回違うだけでほぼ同じ結果でした。 長考すると▲96歩になるのは意外でした。 ただ、800playoutでは飛車先を突きあった後、5手目に▲96歩と指すので 序盤のこの順番はそれほど重視していない感じはします。
mac対応版は正常に動作しているように見えますので取り込みたいと思います(少し時間がかかると思います)。
$ bin/aobaz -p 42000 -t 1 -b 1 -w ~/test/extract/w000000003459.txt
playouts=42000
cfg_num_threads=1
cfg_batch_size=1
network path=/home/yss/test/extract/w000000003459.txt
Tuning feed-forward engine of device -1 for /home/yss/test/extract/w000000003459.txt
num_P=1,threads_per_GPU=1,cfg_num_threads=1,numGPU=1,all P=1
- Device ID: 0
Type: GPU
Name: GeForce RTX 2080 Ti
Driver Version: 418.87.01
Compute Units: 68
Max Work-Group Size: 1024
Max Clock Freq (MHz): 1650
Global Mem Size: 11520638976
Max Mem Alloc Size: 2880159744
Local Mem Type: LOCAL
Local Mem Size: 49152
Rough Evaluation: 112200
Half Precision: Unused
Matrix M: NLM:16 NLN:8 NPM:8 NPN:2 NPK:16 TUS:334
Head 1: NLM:8 NLN:4 NPM:4 NPN:1 NPK:8 TUS:30
Value 2: NLM:16 NLN:1 NPM:1 NPN:1 NPK:16 TUS:92
Value 3: NLM:1 NLN:1 NPM:1 NPN:1 NPK:2 TUS:15
start thread=0
Register id: 0 nnet_id: 0
start dummy_num_threads=0,gnum=0
cfg_random_temp=1.000,cfg_num_threads=1,cfg_batch_size=1,gpus=1
sum_ok=11259/11259, MOVE_C_Y_X_ID_MAX=11259
go
token is null. go infinite
HashShogi= 131072( 9MB),sizeof(HASH_SHOGI)=72,Hash_SHOGI_Mask=131071
root phg->hash=0, child_num=30
0( 0) 6978KI,10792, 0.076,bias=0.4230992496
1( 1) 2726FU,13012, 0.082,bias=0.4206939936
2( 2) 1716FU, 1973, 0.076,bias=0.0765186995
3( 3) 7776FU, 280, 0.082,bias=0.0089977970
4( 4) 9796FU,15432, 0.114,bias=0.0072972230
5( 5) 5968OU, 76, 0.029,bias=0.0066500991
6( 6) 6766FU, 113, 0.058,bias=0.0064995815
7( 7) 3938GI, 90, 0.043,bias=0.0064942529
8( 8) 3948GI, 73, 0.030,bias=0.0062806783
9( 9) 4958KI, 60, 0.035,bias=0.0049215686
10( 10) 7968GI, 14,-0.066,bias=0.0027491502
11( 11) 6968KI, 13,-0.079,bias=0.0026006224
12( 12) 5958OU, 9,-0.123,bias=0.0023210295
13( 13) 5948OU, 9,-0.111,bias=0.0022904647
14( 14) 3736FU, 10,-0.096,bias=0.0022868393
15( 15) 4948KI, 8,-0.139,bias=0.0022113584
16( 16) 4746FU, 8,-0.124,bias=0.0021512555
17( 17) 5756FU, 8,-0.139,bias=0.0021158846
18( 18) 7978GI, 7,-0.148,bias=0.0020119294
19( 19) 4938KI, 6,-0.167,bias=0.0018089956
20( 20) 2868HI, 3,-0.285,bias=0.0014737499
21( 21) 6958KI, 2,-0.317,bias=0.0011572307
22( 22) 2878HI, 2,-0.276,bias=0.0011555279
best:9796FU,15432, 55.68%( 0.114),bias= 0.007
+9796FU -3334FU +6978KI -8384FU +7776FU -8485FU +2726FU -4132KI +2625FU -8586FU +8786FU -8286HI +2524FU -2324FU +2824HI -5152OU +2434HI -2233KA +3436HI -8684HI +3626HI -3122GI +0087FU -7162GI +5968OU -7374FU +3948GI -8173KE +4958KI -6151KI
49.96 sec, c=30,net_v=0.093,h_use=42001,po=42000,841/s,ave_ply=16.7/54 (0/0),Noise=0,g=1,mt=1,b=1
bestmove 9g9f
$ bin/aobaz -p 42000 -t 1 -b 1 -w ~/test/extract/w000000003459.txt
playouts=42000
cfg_num_threads=1
cfg_batch_size=1
network path=/home/yss/test/extract/w000000003459.txt
Tuning feed-forward engine of device -1 for /home/yss/test/extract/w000000003459.txt
num_P=1,threads_per_GPU=1,cfg_num_threads=1,numGPU=1,all P=1
- Device ID: 0
Type: GPU
Name: GeForce RTX 2080 Ti
Driver Version: 418.87.01
Compute Units: 68
Max Work-Group Size: 1024
Max Clock Freq (MHz): 1650
Global Mem Size: 11520638976
Max Mem Alloc Size: 2880159744
Local Mem Type: LOCAL
Local Mem Size: 49152
Rough Evaluation: 112200
Half Precision: Unused
Matrix M: NLM:16 NLN:8 NPM:8 NPN:2 NPK:16 TUS:334
Head 1: NLM:8 NLN:4 NPM:4 NPN:1 NPK:8 TUS:30
Value 2: NLM:16 NLN:1 NPM:1 NPN:1 NPK:16 TUS:92
Value 3: NLM:1 NLN:1 NPM:1 NPN:1 NPK:2 TUS:15
start thread=0
Register id: 0 nnet_id: 0
start dummy_num_threads=0,gnum=0
cfg_random_temp=1.000,cfg_num_threads=1,cfg_batch_size=1,gpus=1
sum_ok=11259/11259, MOVE_C_Y_X_ID_MAX=11259
go
token is null. go infinite
HashShogi= 131072( 9MB),sizeof(HASH_SHOGI)=72,Hash_SHOGI_Mask=131071
root phg->hash=0, child_num=30
0( 0) 6978KI,10792, 0.076,bias=0.4230992496
1( 1) 2726FU,13012, 0.082,bias=0.4206939936
2( 2) 1716FU, 1973, 0.076,bias=0.0765186995
3( 3) 7776FU, 280, 0.082,bias=0.0089977970
4( 4) 9796FU,15432, 0.114,bias=0.0072972230
5( 5) 5968OU, 76, 0.029,bias=0.0066500991
6( 6) 6766FU, 113, 0.058,bias=0.0064995815
7( 7) 3938GI, 90, 0.043,bias=0.0064942529
8( 8) 3948GI, 73, 0.030,bias=0.0062806783
9( 9) 4958KI, 60, 0.035,bias=0.0049215686
10( 10) 7968GI, 14,-0.066,bias=0.0027491502
11( 11) 6968KI, 13,-0.079,bias=0.0026006224
12( 12) 5958OU, 9,-0.123,bias=0.0023210295
13( 13) 5948OU, 9,-0.111,bias=0.0022904647
14( 14) 3736FU, 10,-0.096,bias=0.0022868393
15( 15) 4948KI, 8,-0.139,bias=0.0022113584
16( 16) 4746FU, 8,-0.124,bias=0.0021512555
17( 17) 5756FU, 8,-0.139,bias=0.0021158846
18( 18) 7978GI, 7,-0.148,bias=0.0020119294
19( 19) 4938KI, 6,-0.167,bias=0.0018089956
20( 20) 2868HI, 3,-0.285,bias=0.0014737499
21( 21) 6958KI, 2,-0.317,bias=0.0011572307
22( 22) 2878HI, 2,-0.276,bias=0.0011555279
best:9796FU,15432, 55.68%( 0.114),bias= 0.007
+9796FU -3334FU +6978KI -8384FU +7776FU -8485FU +2726FU -4132KI +2625FU -8586FU +8786FU -8286HI +2524FU -2324FU +2824HI -5152OU +2434HI -2233KA +3436HI -8684HI +3626HI -3122GI +0087FU -7162GI +5968OU -7374FU +3948GI -8173KE +4958KI -6151KI
49.96 sec, c=30,net_v=0.093,h_use=42001,po=42000,841/s,ave_ply=16.7/54 (0/0),Noise=0,g=1,mt=1,b=1
bestmove 9g9f
初手96歩について少しだけ議論させてください。
自前のMCTSでw000000003459でMCTSさせると、
4300プレイアウトぐらいまで7八金。 9800プレイアウトぐらいまで2六歩。 31000プレイアウトぐらいまで再び7八金。 90000プレイアウトぐらいまで再び2六歩。
という結果でした。 また、ポリシーの値は
▲7八金 0.4216414 ▲2六歩 0.4216414 ▲1六歩 0.0767866 ▲9六歩 0.007368987
でした。 (自前のコードのほうが色々デバッグしやすいので活用しています。なので上記結果にバグが含まれている可能性もあります)
「序盤の手順を重視しない」という考察には疑問があって、AlphaZero MCTSはその場合ポリシーが大きな手を先に指すと思います。 長考で2六歩より9六歩のプレイアウトが増えるのはAobaZeroのコードに何か問題がありそうな気がします。 オリジナルのコードでもポリシーの値など確認していただければ幸いです。
バグがある可能性は高いです。
MCTSの結果が異なるのはハッシュ表の違いかもしれません。 AobaZeroはハッシュ表で
- ▲26歩△34歩▲76歩△84歩
- ▲76歩△84歩▲26歩△34歩 この2つの手順での4手目の局面を別局面、として扱っています。 これは過去7手までの手順をNNの入力としているためです。
自前MCTSでは局面手番だけでハッシュを生成していたので、ハッシュ表をオフにしてやってみました。
5000プレイアウトぐらいまで7八金。 9600プレイアウトぐらいまで2六歩。 36000プレイアウトぐらいまで再び7八金。 89000プレイアウトぐらいまで再び2六歩。(ここでメモリ不足で停止)
候補手が変わるタイミングが少し変わりましたが傾向は一緒のようです。
すいません。自前MCTSのためのウェイト変換にバグがありました。 修正して再度初手推奨手の遷移を見たところ、
(ハッシュ表あり) 3900プレイアウトぐらいまで2六歩。 6000プレイアウトぐらいまで1六歩。 90000プライアウトぐらいまで7六歩。(ここでメモリ不足で停止)
(ハッシュ表なし) 6000プレイアウトぐらいまで2六歩。 89000プライアウトぐらいまで7六歩。(ここでメモリ不足で停止)
という結果になりました。 (AobaZeroではなく自分のプログラムのイシュースレッドみたいになってしまいましたが、情報の訂正の意味で投稿しました)
ご報告ありがとうございます。 Macでも▲96歩は選びそうだ、ということが分かり少しほっとしました。
また自前MCTSにバグが見つかり(持ち駒のフィーチャーの値が間違っていました)、修正したところ、
(ハッシュ表あり) 1700プレイアウトまで2六歩と7八金が入れ替わり。 66000プレイアウトまで2六歩。 それ以降9六歩。
(ハッシュ表なし) 45000プレイアウトまで2六歩と7八金が入れ替わり。 74000プレイアウトまで7八金 それ以降9六歩。
タイミングは違いますがAobaZeroと同様、長考で9六歩を選ぶようになりました。 お騒がせしました。 (でも初手9六歩が最善ってかなり不思議な気分です)
ご連絡ありがとうございます。 最近のAobaZeroだと▲76歩は後回しにして▲96歩と突く方が重視されてるようです。 初手端歩、は少し阪田三吉っぽいかもしれません。南禅寺の決戦では実際は2手目△94歩ですが。