floodgateのユニーク局面数(Aperyの初期局面の話)

2016年当時の電王トーナメントを前に平岡さんからAperyの教師データ生成に関して不特定多数の協力依頼があった。今日の話題はここから始まる。

 

 

私も当時とくに将棋に関わっていたわけでもないが手持ちのマシンのパフォーマンス計測として一通り計測してみた。考えてみるとこれが私の関わりの最初かもしれない。

ベンチマーク - 48's diary

ちなみに,一番下のドスパラ機がshotgunの開発機で,その上のVAIO Zが世界コンピュータ将棋選手権優勝機である。

 

で,この際にAperyの自己対局で100万局面生成して送るわけであるが,その初期局面がroots.hcpと言う名の巨大なファイルである。

このファイル,後のdlshogiにおいても初期局面として使われることになる。

将棋AIの進捗 その19(初期局面集) - TadaoYamaokaの開発日記

 

二番絞りも強化学習過程において利用しているが,そもそも手段を選ばないで最高精度を目指すというコンセプトのためあまり深く考えていなかった。今回諸事情で平岡さんに確認を行ったところfloodgate棋譜由来と記憶しているとのことであった。

 

ということでfloodgateにおける古いユニーク局面を評価することにした。

計測においてCSAファイルの読み込みにはcshogi,ユニーク局面の生成にはnumpy.uniqueメソッド,重複局面の生成にはnumpy.intersect1dメソッドを用いた。

 

まず,2008年~2016年までの棋譜で3つ壊れているものがあった。

wdoor+floodgate-900-0+gps_l+MyMove900+20080621063001.csa
途中で切れている?

wdoor+floodgate-900-0+Gekisashi_X5590_1c+gps_+20120702000001.csa
初手がない

wdoor+floodgate-900-0+Sunfish3-trial04+your_program_name+20130107230005.csa
妙な文字が入っているうえ短い

エラー処理の方が面倒なので削除した。

 

次に上記1.15.0のroots.hcpのユニーク局面を数えた。ファイル上は46855837局面であるが僅かに重複がありユニーク局面は45945496局面である。

以後,各年度のユニーク局面数およびそれがroots.hcpに含まれる数を示す。

 

2011年
7032153
353798

2012年
9967477
9964794

2013年
10476209
10475665

2014年
7998208
7997057

2015年
6932244
6928346

2016年
6834503
4226259

 

2010年以前も計測したが1~3%程度であったので省略する。2011年は5%程度が含まれているが,2016年時点で恐らく年単位のアーカイブが存在したはずなので平岡さんの性格から考えてみても2011年分の一部を採用したとは考えにくい。

比べて,2012年~2015年はほぼすべての局面が含まれておりこれは全て採用したと考えることが出来る。若干抜けがあるのは何らかのフィルタが行われた可能性がある。

2016年はこのファイルが生成されたのが10月であることを考えれば妥当な割合と思われる。データ生成直前までの棋譜を採用されたのであろう。

 

逆に2012年から2016年のユニーク局面数を合計してもroots.hcpに一割程度届かないことも分かる。年度間の重複も考えれば更に不足分は多いと考えられる。

もう少し正確に出せるが意外と時間もかかるのでこれくらいにしておく。

 

ということで,9割近くがfloodgateの2012年から2016年10月由来で1割程度由来不明というのが結論である。

 

小さなことからコツコツと(二番絞り近況)

小さなことからコツコツと,西川きよし師匠の座右の銘ですね。

一年の計は元旦にあると申しますので,その「計」とやらを少し。

 

2017年2月はじめての機械学習

40の手習い - 48's diary

機械学習の入門が深層学習な人のことを若者と俗称します。

古典機械学習も勉強しましょうね。

 

2017年4月はじめての将棋深層学習

chainerも入れてみた - 48's diary

floodgateの棋譜を教師に山岡さんの一致率が25%程度のところを一気に35%ほどまで持っていく。これ以降dlshogiにも色々と貢献することになる。

 

2018年5月Hefeweizen世界選手権準優勝

まぁ,まぐれっぽいですよね。検証するのに随分と時間かかりました。

5手予測で95%以上の予測的中率はMulti Ponderシステムの肝です。

 

2019年5月Kristallweizen世界選手権準優勝

このときのプレッシャーというか鬼気迫る周りの圧が凄かったです。前年は気楽だったんですがねぇ。このKristallweizen,オーパーツのようで現行でも問題なく強いです。

今も多くの計測などで使われています。

 

2020年7月命名二番絞り

電竜戦予行2 - 48's diary

深層学習のノウハウは地味に溜めていましたが,二番絞りは電竜戦と共に生まれたのです。

 

2022年5月二番絞り世界選手権準優勝

第32回世界コンピュータ将棋選手権 - 48's diary

実際高レベルのマシンと対戦者がいないと計測が成立しない状況です。マシンリソースがない我々は自分の実力すら測れません。最終局の最終盤のアレがなければ優勝でしたね。

予算規模が三桁違うとルーレットや競馬だと2回一点で当ててから勝負って感じですが実際そんなギャンブルです。確率論じゃないので勝負になるわけですが

 

2022年10月探索無しの二番絞りLishogi投入

Lishogiやってみました - 48's diary

探索無しのKataGoが欧州囲碁トッププレイヤー級とのこと

プロ級とは - 48's diary

 

年末年始で探索無しの二番絞りを将棋俱楽部24に放り込みました。

年始にレート2500に達し,六段認定頂きました。

通信部分はカツ丼将棋さんのカツ丼坊2です。

CSA協会誌のカツ丼さんの記事(下記PDF p.69)によりますとfloodgateの2200は将棋俱楽部24の六段相当とのことでした。

http://www2.computer-shogi.org/journal/CSA_vol29.pdf

六段と言えばアマ全国レベルと表現されています。

24と世間一般の段級レベル比較|対局に関して|将棋倶楽部24

盤面を一手も動かさずにこの大局観です。

何億局面も評価する古典モデルとは大違いですね。

 

そういえば2022年末にマイナビニュース杯電竜戦ハードウェア統一戦が開始されました。

年越しで240戦の予選があります。評価値・読み筋や探索ノード数なども出力されますのでAobaZeroチームの山下さんが集計されました。

AobaZeroと二番絞りが探索速度がずば抜けて遅いそうです(笑)

探索ノード数が少なくても強くできる証明がされたと言って良いでしょうか。

http://www.yss-aya.com/bbs/patio.cgi?read=34&ukey=0

第1回マイナビニュース杯電竜戦統一ハードウェア戦 勝敗表

 

と言うあたりで冒頭に繋がりました。5年かかって将棋の深層学習モデルがここまで到達したってことですね。

さて,今後はどうしましょう。

(書きながら何かまとまると思っていましたがダメでした)

 

もう次の選手権のエントリーが始まっているのですよね。一年が早い。

第33回世界コンピュータ将棋選手権 参加者募集

 

ーーー

1月2日追記:

七段だそうです。

指導対局モード(レート変動が無いワザと負けていいモード)が使えるとか聞きました。

ーーー

更に追記:

 

電竜戦マイナビニュース杯ハードウェア統一戦開幕

随分と苦労しましたが,準備してきましたものが始まりました。

www.youtube.com

 

開幕局のゲストに勝又先生をお呼びできたのも何かの縁でしょうか。

覚えていらっしゃる方も居るかもしれません私がコンピュータ将棋界にデビューした際の2017年11月第5回電王トーナメントの決勝の解説・立会も勝又先生でした。

コンピュータ将棋界のハードウェアスペック統一戦もあれ以来となります。

 

選手権に限らず資金力の差が勝敗に大きく影響する状況は簡単に変わりません。なんとか当日対戦するハードウェアだけでも同じものに出来ないかと画策するような構想は電竜戦の当初からありました。が,なかなか実現には至りませんでした。

電竜戦初日 - 48's diary

 

様々な方に軽い打診や具体的な相談を多く試み,実現性を増したころに具体的な討論会を開きました。何度かの相談を煮詰めた後,公開の討論会も行いました。

専用のSNSチャンネルも設け多くの御意見を頂きました。

ハードウェア提供のスポンサーにも深く感謝申し上げます。

 

www.youtube.com

電竜戦マイナビニュース杯について - 48's diary

第3回電竜戦の件 - 48's diary

 

正直言うと自分が参加したいとイメージしていたのですがどう考えても下準備して運営側に回ると公平感に問題があるということでプレイヤーとしては辞退する予定でした。

公開討論会ではプレイヤーとして参加を認める意見が多く,またスポンサーからも期待の声を頂きました。

プレイヤーとして参加する上で客観的に証明できませんが自分なりの縛りを入れております。春の世界選手権秋の電竜戦本戦同様に定跡を入れておりません。また,他のプレーヤーから受け付ける前に準備したソフトウェアの更新も行っておりません。加えて万が一優勝することがあれば他の参加者に検討頂けるようファイル提供するつもりにしております。

 

そもそも今運営側として勝ち負けよりもリーグ戦が無事消化できることを第一に考えております。私の電竜戦はずっとそのつもりです。

参加者からベンチマーク計測の依頼があればネットワークやメモリ,GPU性能などの数値結果を提供し,また言語環境やライブラリの必要など共通域で合意が得られるものを用意させて頂きました。一部予定締切を延長したりちょっとお手伝いをしたりやっと全参加者が対局に漕ぎつけたわけです。(15チーム相手すると正直他の仕事が手に付かないレベルですね)

加えて,木曜夜に開始したリーグ戦が既にトラブルで土曜朝から対応に追われ審判団協議中にこの文章を書いているくらいです。(私は審判団ではなく指示通り動くオペレータとなっています。)

 

既に公開されていますが,本日対応中のトラブルのひとつは読み筋の問題です。

電竜戦では選手権などの他の対戦と異なり観る将への情報提供もその課題としております。そのため参加者には指し手以外に評価値や読み筋を送って頂くようお願いして,中継サイトではそれを見やすく表示するようにしております。

勝敗を決するだけですと不要ですし,相手に利する行為ともなりかねないわけですがこれを隠ぺいするタイプの参加者は実に稀です。素晴らしい精神だと思っています。

今回これを連続自動対戦するスクリプト部分を改造していたのですが,読み筋を対戦エンジンが用いるUSIプロトコルから通信対局を行うCSAプロトコルに変換する際に一部未対応な部分がありました。練習対局で千日手の不具合が発覚し対応していたのですが,本予選開始後に発覚したのは読み筋中の宣言でした。

また,読み筋中に宣言が出ると言うことは完全な読み切りだろうということで再実験でも宣言勝ちが確認されました。

ということで,さっそくリーグ戦に審判団からの手入れが入ることになりました。

 

 

いやぁ,運営も思ったより大変ですわ。

 

 

 

 

 

 

 

 

 

 

 

 

 

WindowsでJAX環境構築メモ

例によって自分用のメモ書き

#誰かが幸せになるとそれもいいよね

 

説明する必要もないかもしれないが、JAXはGoogleが出している比較的低レベルのライブラリである。

Autograd and XLAと書かれているように自動微分と高速な行列演算が出来るが、それで何が嬉しいかというと主に機械学習分野である。もちろん流体計算などのシミュレーション分野に利用されてもいるので幅広く使われている模様。

深層学習用にはJAXそのままではなく更に一段ライブラリを挟むのが主流である。(そういう意味で比較的低レベルと称した)

 

github.com

 

で、公にはWindowsバイナリは配布されていないが

【高速なnumpy】WindowsでJAXを使おう【Python】 - Qiita

こういう記事が出ている。

 

つまり、ここにバイナリがある。

https://whls.blob.core.windows.net/unstable/index.html

 

適当なものをダウンロードすれば難なく入る。

CUDA使う人は事前に入れましょう。

 

今のところ不具合もないのでそのうち公式にも正式対応してバイナリ配布されるんじゃないかと甘く見ている。

いくつかのサンプルも問題なく動くが完全に自作のコードでパフォーマンスを出すのはそんなに簡単なことじゃない感じ。

 

また、以下に囲碁強化学習を実装されたものがあったので試しに実行してみた。

GitHub - NTT123/a0-jax: AlphaZero in JAX

 

RTX3090で最初のステップが2時間半程度と出たので、200ステップで500時間かぁ。

3週間コースだな。と適当に思っていたがこれは自己対局分で学習部分を入れるとほぼ倍になる。

(直感的には学習時間が長すぎる気がする)

加えて、メモリ128GB程度ではスワップ始めて数ステップで全然進まなくなることが分かった。

過激なサンプルプログラムはどのくらいリソース使うかちょっと書いておいて欲しいね。

 

第3回電竜戦の件

関係者お疲れさまでした。

私も疲労が蓄積しておりBlog更新がおくれてしまいました。

まぁ,予選がアレでしたのでモチベーションも下がりますよね。

 

ということで簡単に結果報告です。

二番絞りの予選,5.6勝4.4敗で11位。

決勝,16勝1敗で1位でした。

【予選】 第3回世界将棋AI電竜戦本戦 勝敗表

【B級】 第3回世界将棋AI電竜戦本戦 勝敗表

 

敗因は周りが強くなったことが一番だと思います。

ウチの方は色々と準備していたのがまだ間に合っていないので実質的に春の選手権と同等です。加えてこいつがfloodgateで負け棋譜を多く残しているために定跡で綺麗に負けるパターンに入ったようです。事後コメントしても意味ありませんが,floodgateなどに流していたものと別バージョンの方がよかったかもしれません。

しかし,強化学習をワンステップ進めるのに2カ月単位なのですから計算機リソース不足は否めません。

 

また,順位とは別に独創賞を頂くことになりました。

独創賞の選考は将棋に限らず囲碁などのゲームに関しても取り組んでおられる「電気通信大学エンターテイメントと認知科学研究ステーション」に委託しており,我々大会運営とは独立しています。とは言ってもコンピュータ将棋協会やゲーム情報学研究会のメンバーと被っており内輪感があって少し気恥ずかしい気もします。今回のアピール文もゲームプログラミングワークショップの流用でした。

電気通信大学 エンターテイメントと認知科学研究ステーション

 

電竜戦運営として入賞時の賞金は受け取らないと決めてあったのですが,独創賞は外部の選考ということもあり選考差戻も失礼とお受けすることにしました。賞金はそのまま来年の独創賞に全額上乗せしますので,来年の電竜戦参加者は独創的な開発とそのアピールに力を入れて頂ければと思います。

 

また,本戦終了後上位者には以前よりアナウンスしております「マイナビニュース杯ハードウェア統一戦」への参加権が与えられます。

こちらは実行ファイルを運営に預けることで全対局を自動で行う仕組みになっております。初の試みということでスケジュールは流動的に行いますので乞うご期待といったところでしょうか。

電竜戦マイナビニュース杯について - 48's diary

(たぶん私ひとりバタバタする展開になりそうです。)

こちらも開幕戦や決勝戦などはYoutube中継の予定ですので,今後とも電竜戦の応援をよろしくお願いいたします。

----

追記:

スポンサー様の御尽力で色々とキャンペーンを行っております。

 

 

www.youtube.com

すっぴんのUbuntu 20.04 LTSに最短でCUDA入れるメモ(CUDA11.8編)

前回の一部改変

bleu48.hatenablog.com

 

すっぴんのUbuntu 20.04 LTSにCUDA11.8入れるメモ

(所謂自分用コピペ元)

 

まず以下を確認

https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/

 

コマンド3行

sudo wget -O /etc/apt/preferences.d/cuda-repository-pin-600 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub
sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /"

 

CUDA入れる(時間かかる)

sudo apt -y install cuda-11-8

 

環境変数設定

export CUDA_PATH=/usr/local/cuda-11.8
echo 'export CUDA_PATH=/usr/local/cuda-11.8' >> ${HOME}/.bashrc
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:${LD_LIBRARY_PATH}
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:${LD_LIBRARY_PATH}' >> ${HOME}/.bashrc
export PATH=/usr/local/cuda-11.8/bin:${PATH}
echo 'export PATH=/usr/local/cuda-11.8/bin:${PATH}' >> ${HOME}/.bashrc

 

周辺ライブラリも入れる

sudo apt-get install libnvinfer-dev libnvonnxparsers-dev libnvparsers-dev libnvinfer-plugin-dev

sudo apt-get install zip unzip

 

---

ということで第3回の電竜戦本戦の二番絞りはCUDA11.8を使います。

5月の選手権以来半年ぶりのフルパワーですね。

レースのときだけF1乗る感じですが脳内でチューニング済みですので大丈夫。

将棋AI界隈の宣言勝ちの話

その昔,将棋AIは宣言勝ち局面の対応がよくないとされていました。

具体的な例として挙がるのが電王戦の塚田九段戦ですね。

 

live.nicovideo.jp

 

これはもちろんプログラムとして十分に実装されていない機能なので仕方ないという他ありません。

ところでこの2013年他のソフトはどうだったかというと少なくとも大半の上位ソフトは対応されていたようです。例えば同年のfloodgateにはBlunderの宣言勝ちが多く記録されています。対応の甘いソフトも多かったためにfloodgate的にも例外的に宣言勝ちの多い年と記録されます。

ということで同様に7,8年前から大きな大会でも普通に宣言勝ちが行われていますし,それを阻止する側も相当な高レベルで不思議な人外棋譜が生まれます。

 

しかしながら,一度有名なネタになってしまった以上創作作品では色々と使われるようでAIでも判定が難しいとか今でも言われているようです。

1. 第1話 命懸け / 龍と苺 - 柳本光晴 | サンデーうぇぶり

 

あ~~大変重要なことを忘れておりました。

プロの将棋はアマチュアやAIと宣言勝ちの点数が違います。

連盟モバイルの勝率表示の件 - 48's diary

将棋の駒落ち戦の宣言法について - 48's diary

 

こちらの対応はアレ以後特に依頼も来ておりませんので現在対応していません。

正式に対応以来もないものを流用されているので,私は不具合あっても知りませんよってことです。

 

今何故このネタかというと昨日の棋王戦含め藤井さんが入玉含みで指すことが増えたというのが理由のひとつですね。

藤井聡太 竜王 vs. 伊藤 匠 五段 第48期棋王戦コナミグループ杯 挑戦者決定トーナメント - 無料の棋譜サービス 将棋DB2

プロ棋士と同じ宣言法でルール変えてやったらどうなるかは知りません。

 

電竜戦とかで一度やってみますか?

懸念は関係者ならすぐ思いつくのですが,基本的にレアケースですので意味ないかもしれないと言うのが一点,引き分けが激増するだろうという予測が一点ですね。