KL情報量調査の追試

少し前に山岡さんがdlshogiにおけるKL情報量の調査時間制御への実装を行っていました。
手数毎におけるPolicyと各子ノードの訪問回数それぞれの確率分布の差異を可視化することで、
将棋、特にdlshogiにおいてはどこに時間をかけて探索するべきなのかがよく分かる結果になっていました。

一方、Lightweightの方はどうなっているのか気になったので追試がてら調査してみることにしました。


算出方法は山岡さんと同じ方法をとっており、ルートノードにおけるPolicyと各子ノードの訪問回数それぞれの確率分布から算出しています。
まだまだスパイクが残っていますが、取り急ぎ結果を確認したかったので以下に載せておきます。(水匠と50対局を行い、その平均をプロットしています)

基本的な傾向としてはdlshogiと同様で、50手目付近までは大きくなっていったあと、しばらく横ばいに推移して100手を過ぎたくらいから段々と減少してくるようです。

また改めて自分で調査してみて判明したことですが、1対局における手数毎のKL情報量は変動が激しいです。
これを数十局、数百局と数多く平均を取ることで、全体の傾向として上図のような形になっていくように見受けられました。(山岡さんのように1000単位以上でサンプル取れれば、かなり滑らかになるのかも)



■気になったこと(自分用メモ)
①非負性について
KL情報量は2つの確率分布の差異を見ることができるものですが、この式を最初に見たときに値が負になることがないのか気になりました。
ただ、どうやらKL情報量の性質として非負性があるようで、調べると色々と解説しているページが出てきました。
特にこちらの資料の3.2章が分かりやすかったです。

②AobaZeroやdlshogiとの差異
上記2ソフトと比べ、算出したKLDが2倍くらい大きくなっているのですが、これがモデル精度の差なのか実装ミスなのかが単純に気になりました。
直観的にはKLDが小さいほうがモデル精度が良いような気はするのですが、2つの確率分布が完全に独立になっていない(PUCTアルゴリズムの中でPolicyを使っている)ため、より決定論的なモデルでありさえすれば多少KLDも小さくなるのでは....と考えています。

③探索中のKL情報量の算出について
dlshogiは探索中にKLDを計算した上で基本時間に乗じる...という方法を取っているとのことですが、具体的にどのように実装しているのかが不明でした。
そもそも既存での時間制御部分についてもあまり細かい所まで見れていないので、まずは既存仕様の把握から行う予定です。

入力特徴量作成処理改善の取り込み&NPS測定

先日、本家dlshogiのほうで入力特徴量作成の速度改善が行われていたため、Lightweight-EFにも取り込みました。
また、同時にNPSの測定も行いましたので結果を以下に記載しています。


【測定結果】
■前提
DNNモデル:第2回電竜戦で使用したLightweight-EF
CPU:Ryzen 7 3700X
GPU:RTX3080 & RTX3070
UCT_Threads:3
DNN_batch_size:1024

■比較対象
①Lw-EF_2gpu_MLTstream(以前のマルチGPU化の際に使用した③と同一のもの)
②Lw-EF_2gpu_MLTstream_features(ベースラインである①に対し入力特徴量の改良を行ったもの)

■測定方法
前回同様のため省略

■その他
こちらのスクリプトを改変したものを利用しています。
べた書きされている局面は特に変更していません。


ということで、結果はこちら。
f:id:Rheinmetall:20220102230234p:plain
アベレージで20%のNPS向上が確認できました。
NPSが平均/中央値ともに12.5万を上回っており、第2回電竜戦時のLightweight-EF(GPU1枚)と比較してみると、平均NPSが約2倍となっています。(前回の記事を参照)


最後に今回の測定結果のサマリを表形式で記載しておきます。

nps Lw-EF_2gpu_MLTstream Lw-EF_2gpu_MLTstream_features
max 158589 185777 (+17.14%)
min 40411 43738 (+8.23%)
ave 104313.29 126016.53 (+20.81%)
med 106375 132208.5 (+24.29%)

※括弧内の数字はベースラインとの比較となります。

マルチGPU化を試してみる②

先日、マルチGPU化を実施しましたが、それによる性能測定や比較は実施できていなかったので今週末に実施しました。
また、ちょうどdlshogi本家側でマルチストリーム対応がなされていたので、それも同時に測定・比較を行っています。


ベンチマーク測定】
■測定対象
第2回電竜戦で使用したLightweight-EFを選定しました。ハードもソフトそのまま当時のものを利用します。(以下、Lw-EFと記載することがあります)

■比較対象
①Lw-EF_base(上で書いたように、第2回電竜戦で使用したものです。これをベースラインとします)
②Lw-EF_2gpu(①をマルチGPU化させたもの。RTX3070, 3080を使用)
③Lw-EF_2gpu_MLTstream(②をさらにMulti-Stream化させたもの)

■測定方法
サンプリングした100局面に対し、上記①②③をそれぞれbyoyomi=5000で思考させています。

■その他
こちらのスクリプトを改変したものを利用しています。
べた書きされている局面は特に変更していません。


繰り返しにはなりますが、①の2021年11月の第2回電竜戦時点のものをベースラインとし、②マルチGPU化、③マルチGPU化&マルチストリーム対応のものと比較する形を取ります。
また先に断っておきますが、これはあくまで自分の手元の環境で測定した結果であり、それ以外での結果を保証するものではないです。また、ベンチ結果≒棋力であることもご注意ください。




ということで、長くなってしまいましたが以下が測定結果となります。
結論としては、予想通り③>②>①という結果になっています。



まずはNPSから。
f:id:Rheinmetall:20211213005856p:plain
まず目を引くのはNPSの最大値で、ベースラインでは90,000台だったNPSが、③のマルチストリーム化によって160,000に届く勢いで伸びています。また、平均や中央値も伸びており、平均NPSは100,000台に乗っています。
dlshogiがA100×8を使用して平均344,963NPSであったことを考えると、これでも本家のフルパワーと比較しても約3割程度ということになります。A100×8こわい。(あくまでNPSだけを見た場合です)



次にnodesです。
f:id:Rheinmetall:20211213005904p:plain
こちらも最大値はマルチGPU化の倍以上になっていて、平均や中央値で見ても2倍以上、ベースラインと比較すると約3倍のノード数となっています。



最後にdepth。
f:id:Rheinmetall:20211213005912p:plain
一見、こちらはnpsやnodesのような派手な向上は無いように見えますが、平均で見ると5秒間の思考での平均探索深さが約3, 4手先まで深くなっています。最小値は変わらずですが、最大値はdepth=48まで伸びていることが分かります。


よって、npsやnodes, depthといった指標に対して、マルチGPU化の効果やマルチストリーム化の効果があることが確認できました。特にマルチストリーム化は思っていた以上の後押しになっているように思います。

また、最後に今回の測定結果のサマリを表形式で記載しておきますので、興味のある方は見てみてください。

nps Lw-EF_base Lw-EF_2gpu Lw-EF_2gpu_MLTstream
max 94251 127199(+134.96%) 158589(+157.90%)
min 24323 44462(+183.80%) 40411(+166.27%)
ave 66064.75 97019.76(+146.86%) 104313.29(+157.90%)
med 69813 102556(+146.90%) 106375(+152.37%)
nodes Lw-EF_base Lw-EF_2gpu Lw-EF_2gpu_MLTstream
max 474178 642867(+135.58%) 1597948(+336.99%)
min 123124 227917(+185.11%) 414342(+336.52%)
ave 332798.26 492504.96(+147.99%) 1051298.83(+315.90%)
med 351162.5 520989.5(+148.36%) 1072053(+305.29%)
depth Lw-EF_base Lw-EF_2gpu Lw-EF_2gpu_MLTstream
max 44 46(+104.55%) 48(+109.09%)
min 7 7(+0.00%) 7(+0.00%)
ave 25.31 25.85(+102.13%) 29.38(+116.08%)
med 25 25(+0.00%) 28(+112.00%)

※括弧内の数字はベースラインとの比較となります。

ベンチマーク用スクリプトを使いやすくする

dlshogiに付属するベンチマーク計測用のスクリプトについて、少し使いにくい点があったためコードを一部書き直しました。

■不便であった点
今回いじったbenchmark.pyは、スクリプト内にベタ書きされた局面を読み込み、それを秒読み指定で局面数分ループを回していますが、各指定局面での探索結果(bestmove, info)は特に保存しておらず、ただ標準出力しているだけでした。
これだとサマリとしてnpsやdepth、nodesの平均や最大最小値をとることが出来ず、計測作業には不便です。

■改良点
ベンチを回した結果をlogファイルに書き出すように、一部書き直しました。具体的には、書き出す情報は一旦nps, nodes, depthの3つとし、これらの最大、最小、平均、中央値を出すようにしています。また、これに伴い、cshogi側も一部コードを書き直して、infoを取得できるようにしています。

以下は、電竜戦で使用したLightweight-EFをbyoyomi=5000で回した際の結果になります。

nps_ave=66710.78
nodes_ave=336131.11
depth_ave=25.61

nps_median=70183.0
nodes_median=353832.0
depth_median=24.0

nps_max=94505.0
nodes_max=475269.0
depth_max=44.0

nps_min=24390.0
nodes_min=124978.0
depth_min=7.0

問題なく出力できていそうです。
これでベンチマークテストも少しやりやすくなったかと思います。

今後はヒストグラム出力にも対応させる予定です。

マルチGPU化を試してみる①

第2回電竜戦も終了し、今年の大会がひと段落したところで以前より検討していたマルチGPU化を実施してみました。

 

実はdlshogiは既にマルチGPUによるスケールアウトに対応しているのですが、未だに自身のAWSアカウントのvCPUの上限緩和がされないため、本当にマルチGPUに対応しているのか?NPSの伸びはどれくらいか?というところは未知数でした。(GCTチーム等、大会で動いていることは知っていますが、実際に自分が手元で検証したわけではないので)

また、自分は自作の学習スクリプトを用意して、24時間Lightweightの学習サイクルを回しているのですが、GPUが1枚だとテスト対局や他のモデル・探索部の実験/検証により、学習サイクルを止めざるを得ないというデメリットがありました。そこに自由に使えるGPUが1枚増えることで、上記を並行して進められるようになります。

上記の理由から、今後の開発作業にとってもプラスになると考え、今回のマルチGPU化を試みた、という経緯になります。(一応、学習に関してだけはAWSインスタンスを立てたりColaboをフル活用するという手も十分検討できたのですが、個人的に2枚差しをやってみたかったというハード側の好奇心もあり...)

 

また、他にもマルチGPU化を検討している方がいらっしゃるかもしれませんので、一応自身の考えるメリット・デメリットを以下にまとめておきます。

■メリット

GPU一枚分のリソースが増えることで、開発の効率化が見込める(上記参考)

・対局時のNPS向上(≒棋力の上昇)

■デメリット

・消費電力の増大(今回のマルチGPU化にあたり、電源も約2倍に変更しています。電気代...)

・PC購入元のサポート対象外になる可能性がある(秋葉原に行って事前に検討・相談したのですが、どの店舗でも「正直あまりお勧めはできません」と回答されました。ただ、いずれもゲーミング用途としての回答のように見受けられたので、将棋ソフト開発の場合は少し事情が異なる可能性はあります)

・ケース自体やマザー側が増設に対応していない場合、そこから変える必要がある(特にマザーは、PCIeスロットに余りがあっても転送速度問題が出てくることもあります)

・夏場の排熱問題(冬は暖房代わりになって良いですが、夏は本当に怖い....)

 

 

上記も踏まえて検討し、マルチGPU化を実施したのですが変更点は以下の2つです。

①電源の交換(650W→1200W)

②グラフィックボードの増設(RTX3080の増設)

※②についてですが、当初は3090も視野に入れていたもののお財布事情と電源側の容量が不足することから断念しています(3090入れてみたかった...)

 

 

ということで、今年の1月にもPCを購入したドスパラさんの通販にて、上記①②を購入して増設を実施。無事に問題なく動作することを確認できました。下記は、3080で学習中の様子となります(※オプションで使用GPUを3080に指定しているので、このとき3070側は使っていないです)

f:id:Rheinmetall:20211205140728p:plain

後日②として、実際に運用した際の所感やNPSベンチマークの結果等を記載する予定です。

第2回世界将棋AI電竜戦に出場してきました

2021/11/20(土)に第2回電竜戦が開催されました。

7月のTSECに引き続き、自分も出場してきましたのでその所感をつらつらと書きます。

 

 

出場ソフトは全部で44チームで、ソフトのみ/人間のみ/ソフトと人間の合議制のパターン何れかで出場が可能。人間のみでの参加も数人いらっしゃいました。

出場者は以下にあるので気になった方は見てみてください。

golan.sakura.ne.jp

 

 

この中で自分は「Lightweight-EF」として参加していました。

こちらは、夏のTSECからいくつか修正点を盛り込んだ、ローカルPCでも戦えることを目指して作ったdlshogiのクローン「Lightweight」の改良型になります。

アピールポイントは事前提出したアピール文書に提示した通りですが、ここでざっくり紹介すると主に下記の3点です。

・DNNモデルの再構築(GhostNet→EfficientNetに変更)

強化学習の実施(TSECのLightweightでは教師あり学習のみだった)

・PUCTアルゴリズムにおける着手確率を用いた簡易枝刈り(最大UCB値選択処理の効率化)

 

DL系将棋ソフトは、AWS, GCP等のクラウドサービスを使った高級インスタンスを用意しスケールアップ&アウトした上で大会に出てくることが多いですが、ローカルPCに比べて導入ハードルが高く、また個人で負担するコストもかなり大きくなってしまうのが欠点となります。(一部HEROZさんのような例外的なパターンもありますが...)

最近はGCTの加納さんがColabo等を用いた、学習コストを抑える方法を積極的に紹介してくださっていますが、高級インスタンスを用意するハードルは依然として(特に新規参入者にとっては)高いままであると思っています。(構築手順もお金の面も)

実際に、自分もこれまでクラウドコンピューティングサービスを利用したことがなかったため、環境構築にはそれなりに時間がかかった記憶があります。

そういった背景から、「ローカルPCでも大会である程度戦えるソフトを用意したい」というコンセプトを掲げ、開発・制作・改良したものが今回の「Lightweight-EF」です。

 

 

といった前置きをしつつ、早速今回の所感を書いていこうと思います。

1日目は、2日目の所属リーグを決めるための予選となります。あくまで10位、28位が基準となり、それより上か下かというボーダ争いを全チームで行うことになります。

 

まず1日目ですが、開幕こそ2連勝したものの、そこからtanuki-チームとPALに立て続けに黒星をくらったため、急ぎ定跡ファイルを都度入れ替えて戦う(定跡で序盤ブーストかけて、有利な形かつ中盤に時間を残す)ことにしました。しかし、それでもあまり結果はふるわずに全体22位(B級決定)で1日目が終了しました。特にShotogunさんやいちびんさんとの対局では後手番となってしまい、ずるずると差を広げられてしまったように思います。

 

続く2日目は、対局開始が8:30であるのに起床が8:26となってしまい、なんとか対局開始前にLightweight-EFを放り込みました。(夜中まで友人とApexしていたせいだと思います)

2日目は1日目の反省を生かして、最初から先手と後手を見て定跡ファイルを適宜入れ替えて戦いましが、「とあるバイトの猪突猛進」に黒星を喰らった(おそらく頓死。将棋の知識がほぼ無いため、違ったらすいません)ところで、再び緊急修正することに。

最新のモデルが一番test_accuracyやlossの結果が良いのですが、その少し前の断面のモデルに切り替えました。。本業での障害対応に追われており事前に最新版のテストができなかったため、一旦最新のモデルを使っていたのですが、確実に勝ちを拾いに行くためにfloodgateで実績のあったモデルに差し替えました。

まあ結果的に、Qhapaq, PALなどの格上相手には予想通りボコされましたが...。

ただ、格上のW@nderERさん相手に白星を拾うことが出来たことは非常に嬉しかったです。(全く勝てるとは思っていなかったので)

 

そんなこんなで最終的にはB級9位、全体で見ると全46チーム中、19位という結果となりました。(C級のみ参加のソフトも含む)

夏のTSEC後に立てた「A級に入る」という目標にはまだまだ遠いと実感しましたが、少なくともTSECと比べて手応えがあったように感じています。

 

 

改めまして、GCT電竜さん優勝おめでとうございます。

また、今回お忙しい中大会の企画から運営まで行ってくださったカツ丼さんを始めとする運営陣の方々、将棋の解説・聞き手をしてくださったプロ棋士の先生方、個性的なソフトで楽しませていただいた各開発者様や人間単独で出場された皆様に感謝申し上げます。

次の大会はWSCS32になるかと思いますが、それまでLightweightも再度改良を重ねていきますので、再び戦えることを楽しみにしております。

 

 

 

P.S  人間勢強すぎワロタ(震え声)

 

 

第2回 電竜戦TSECを終えて

将棋ソフトの大会はいくつか存在して、いちばん世間的にも有名だったもので言うと電王戦なのですが、今は無くなってしまったため現在は以下のものが主な大会なんじゃないか思います。(自分で知っている限りは)

・世界コンピュータ将棋選手権

・電竜戦

 

今回は2つ目の電竜戦に出場したため、その結果と振り返り、今後の目標についてここに書いていきます。

【結果】

リーグ  総合順位 勝ち数 負け数 ソルコフ
予選 37 11 13 298.4
B級第1部 34 9.4 12.6 242.8
B級第2部 37 9 13 255.2
B級第3部 20 12 10 246

※リーグ列の各行から勝敗表へ飛べます。

 

 

【振り返り】

今回の電竜戦TSECは将棋ソフト開発を始めて、最初の大会でした。

floodgateに時折流して想像はしていたものの、想像以上に皆さん手強かったです。

 

エントリーをした5月末当初は、LightweightとNavyの2本立てを考えていたものの、Navyのエラーが取れない&学習がうまく進まないという状況から好転せずにNavyは断念。Lightweightだけの出場となりました。(LightweightとNavyの違いはこちら

また、Navyによる遅れがLightweightにも響いたことで、学習途中での参戦となってしまいました。(基本的に出社&学習リソースがローカルPCのRTX3070の1枚だけのため、並行しての作業ができなった......)

 

そんな中でいよいよ予選が始まったのですが、wcsc31覇者のelmoをはじめとした強豪ソフトにボコられ、翌朝結果を見てみると37位という結果。

「ベースはdlshogiな訳だし意外と良い線いくのでは?」とかなり楽観的に構えていた自分の幻想を見事に打ち破っていただきました。ありがとうございました(震え声)

 

そんなこともあって、「これはまずい」とその日から一旦Navyを諦めて、Lightweightの学習に集中することに。

平日日中は出勤でPCを確認できないため、学習自動化のスクリプトを作成することで、平日日中も学習を回すようにし、B級戦までの2週間をできるだけ有効活用するようにしました。

その結果、2週間後のB級においてはコブラ系に再びボコられたものの、第3部ではなんとか20位に滑りこんだ形となりました。(第2部は滑り出しは良かったものの、elmoや苦手なコブラ軍団に当たってしまい順位をかなり下げてしまった......)

 

 

【今後の目標】

大きく二つ。

①今秋の電竜戦にてA級リーグに入る

②Navyの開発&実戦投入

まだまだ水匠のようにNNUE系が強さを見せつけているところもありますが、今大会のdlshogiの躍進のように、DL系も段々と大会での存在感が増してきているように感じます。

仕事の都合上、8月以降はかなり忙しくなることが予想されますが、休日を最大限活用して秋の電竜戦に望みたいと思います。

 

 

【最後に】

今回、ご多忙のところ貴重なお時間を割いて大会の運営に尽力してくださった、カツ丼将棋さんをはじめとする運営陣の方々、阿部建治郎七段、並びに今大会を盛り上げてくださった参加者、Vtuberの方々に対し御礼を申し上げます。

ありがとうございました。