酔猿の件(電竜戦予行5の顛末)

ABEMAトーナメント開幕でしたね。

船江先生がひとり満足気な表情だったので勝負師の気質ってものを感じました。

ずっとそっちを見てたので電竜戦予行5は対戦開始を確認しただけで放置プレイでした。運営に不具合はなかったようですね。

カツ丼さん乙です。

 

こっちはと言うと,3つ投入しておりました。

 

二番絞りは深層学習系で最新モデルです。マシンはRTX2060のノートなので昨年の電竜戦決勝と同じPCです。同じモデル(40ブロック10週目)がRTX3070で現在floodgateに放流中です。

地ビールは以前からGo言語で0から作ってあるエンジンでアルゴリズムのテスト等に使っております。半年くらい放置してどこまで更新したか自分でもメモ見ないと忘れています。

予行4のshotgunは不評のようで,今回の3つ目が酔猿です。

 

白ビール系列で放り込んでもよかったのですがKristallweizenは一般ユーザでもfloodgateでも広く普及して2年ですから見飽きている感があるのでちょっと変えてみました。

二番絞りのインフラとして用いているdlshogiですが,指し手生成や局面データ構造の部分はAperyから流用されています。そこでバックポートを試みました。

 

考えたことは単純です。

二番絞りの逆ですね。最新の深層強化学習で生成した教師データを今やクラシックと言える三駒関係のモデルに適用するとどうなるかという実験です。

AperyのソースをダウンロードしてきてLEARNオプションを有効にしてビルドするくらいのことですので技術的にも簡単ですし,数億局面のデータも一晩くらいで学習を終えました。

簡単に確認してみたところApery SDT5といい勝負をする感じです。当時もやねさんが絶賛されていましたがApery SDT5は三駒関係では抜群の逸品です。膨大な計算量か高度な統計処理か詳細は知りませんが滑らかでバランスの良いものです。

これに対して数億程度の流用データで作成したものはさすがに対戦中でも粗が目立つくらいの変動具合です。それに深層学習系でありがちな初期局面相当先手有利評価ですし振り飛車に辛い点付けです。しかしながら戦型選択はモダンになっています。その辺で相殺されて互角級になっているのでしょう。

想定より弱いイメージでしたので,普通のPCと言いながらRyzen 1700搭載ノートPCを選択しておきました。(2018年選手権現場でクジラ養分になってたやつ)

命名が毎回苦労しており,今回は映画酔拳のDrunk Monkeyをもじりました。

結果は御覧の通りです。

第2回世界将棋AI 電竜戦 予行演習5 勝敗表

 

42チーム参加で,10位二番絞り,21位酔猿,30位地ビールです。

 

bleu48.hatenablog.com

ええ,予行4と同じで3つ放り込んでほぼ四分点を押さえてます。

計算通りですね。(事後諸葛亮

CUDA11.2Update2 on Windows10(メモリリークとCUDAの作業メモ)

先日(2021年3月17日付け)のドライバアップデートから一部のマシンでメモリリーク祭がはじまった。

基本的にGPUの類は最新ドライバを使うのが最もパフォーマンスが出るとして推奨される。

実際他のハードウェアに比べアップデート頻度が高い。

 

様々なバージョンチェックの結果CUDAもアップデートしてやるとメモリリークが止まるらしいことを確認した。詳細な前後のバージョンやハードウェアの世代依存に関する詳細までは未確認である。

実際のリーク量は微量で一日中機械学習をするような真似をしない限り表にでないと思う。ただ,私には致命的だっただけだ。

 

 

で,CUDA11.2Update2という最新のものを入れてみたのだが一部動かないものがあった。

対応のTensorRTが7.2.3.4ということで同時に入れておいたのだが,この中のnvinfer.dllがCUDA11.1に入っているnvrtc64_111_0.dllに依存しているらしい。

これだけのために複数バージョンのCUDAを入れる気にもならないので,CUDA11.2に入っているnvrtc64_112_0.dllをコピーしてリネームしてやったら動いている。真似してはいけない。(バイナリエディタでバージョン弄るのとかもダメだ)

 

確認に使ったツールは以下。

GitHub - lucasg/Dependencies: A rewrite of the old legacy software "depends.exe" in C# for Windows devs to troubleshoot dll load dependencies issues.

 

まぁ,MSあるあるなんだがバージョン依存のライブラリとそうでないものがあると見せかけてnvinfer.dllなんてバージョン依存が無さそうに見えるものが依存してるというトラップである。(本件はNVIDIAだが)

ということで酷い対応だが公式バイナリも相当酷いことを確認して,しばらくこのまま様子見する。

 

年に一度あるかないかくらいだが酷い不具合に遭遇する。

今年は年始にWindowsのバッチファイルにおいてREM文(コメント文)が8192文字を超えると勝手に次の行になって解釈される不具合を発見した。一応報告しておいたが修正されるのだろうか。

そもそもREM文が無ければ一行8192文字を超えるバッチファイルが動いているのが結構感動ものであった。コマンドラインで引数400個くらい付けた気がする。

---

追記:

バッチファイルの一行上限が8192byteであるのは仕様らしい。

QUICハンズオン(GDG四国)

gdgshikoku.connpass.com

 

ハンズオン中のメモ。

 

ハンズオンだとちょっとしたところで躓く。

環境変数の設定

コマンドプロンプト:set

PowerShell

Set-Item Env:GOPATH "c:\test1\test2;"

または

$ENV:GOPATH="c:\test1\test2;"

確認はGet-ChildItem env:

 

go.modは手で作らない方がよさそう。(1.16以降デフォルトで必須)

go mod init

 

Tamさんは全集中で鬼滅ネタ

 

ALPNが強い!

Application-Layer Protocol Negotiation - Wikipedia

 

以下略。

QUICでしょぼいサーバとしょぼいクライアントを作られるようになった。

参考URL

GitHub - lucas-clemente/quic-go: A QUIC implementation in pure go

GitHub - tamx/quic-go-test

 

---

追記:

岩田プロの成果物のURLを残しておきます。

 

選手権の準備その2

しばらく囲碁にかまけてたのですが,そう言えば月末がアピール文の締切でした。

今回は以下の経緯で「二番絞り」でエントリーしましたので作文としてはそれなりに書くものがありますが,先日のゲーム情報学研究会で発表済みですのでズボラ人間にはコピペ(もしくはURL提示)で終わらせて良いかとの腹案も浮かんできます。

 

bleu48.hatenablog.com

 

以下,作文下書き。

 

二番絞りプロジェクト自体はそもそも電竜戦のサーバテスト用に多様性のあるエンジンでテスト対局をしたいとのネタで始めたものです。

その元ネタとなる深層学習部は山岡さんがdlshogiを始めたのとほぼ同時期に私も独自に始めたエンジンがスタート地点です。既に独自改造していたものに適当な教師データを食わせることで従来無い中途半端なものが生成できれば御の字との考えでした。終盤弱く頓死するとか,見たことのないような戦型が得意とか,考慮時間を使うのに弱いとか何か違えばテスト用には有用だろうとのことです。もちろんスコア付け,組み合わせ抽選などの工程で不具合が無いか実時間でどのくらいかとの計測が重要ですからね。

 

比較的小規模な学習モデルを既に作ってあった教師データで学習させたものが初期の二番絞りでしたが,そこそこ強くなることが確認できました。その後,よりよい教師データは無いかと考えて流用したのがAobaZeroの自己対戦棋譜でした。普通の教師データは大量に作るため生成コストを考え浅い探索を行うのですが,AobaZeroは複数年に渡り強化学習を進めており,また各モデルはfloodgateでのレートが出ているというお墨付きの棋譜データです。しかしながら,棋譜のみであり局面評価値が含まれていないのが欠点でした。そのため専用の学習機を用意しました。(GCTでは評価値0として教師データを混入させたらしいですがちょっと乱暴に思います。)

 

実のところAobaZeroのモデルをデータ変形するだけでPyTorchで使えるモデルを作ろうとも考えたのですが棋譜を学習させる方がコーディングコストが低いため先に学習から行ったというのが本音のところです。ですから,理想的にはAobaZeroと同等のモデルがPyTorch化されればOKというのが構想です。ということでここで,20ブロック256チャンネルのネットワークサイズが決定されました。

 

2週間程度かかったのですが,概ね似たようなものが完成したかなというのが電竜戦予行3回目だったかと思います。それでも対戦時人間の目にも若干甘い部分があるように見受けられました。

そこからはより良い教師データが存在しない域,つまり自己対戦による強化学習を加えることになります。予行4回目が強化学習1段階目,電竜戦本戦が強化学習2段階目です。AlphaZeroやAobaZeroでは教師データを作るたびに少量加えて過去のものを少量削って多くをオーバーラップさせて小さく強化学習をおこなうのですが,本件は強化学習初期段階で何もありません。AobaZero教師とはデータの互換性もありません。ということで,第1段階である程度の量を貯める工程に入りました。大凡1億局面程度できた段階で学習させました。(というより残り3日で教師生成を止めて学習に入ったというのが本音ですね)

 

電竜戦での結果は御存知の通りですが,以後学習を進めております。

とくに強化学習時に生成したデータを流用した実験を多数行い多くのデータ構造のモデルを生成しております。そういえばこれはNNUEのときも同じでした。ネットワーク構造を多くつくり最も適したものを見つける手作業です。

本件では15ブロック,20ブロック辺りが上手にできておりましたが,つい最近40ブロックでそこそこ良いものが出来るようになりました。

旧世代のGPUを用いてもfloodgateでそこそこの戦いが出来ております。具体的には以下の記事のような感じですね。

bleu48.hatenablog.com

 

5月の選手権では最も出来の良いものを投入予定ですが現時点ではどれと断定はできません。あしからずご了解下さい。

UEC杯雑感

bleu48.hatenablog.com

bleu48.hatenablog.com

 

以上に参加者としての私視点のページは書きましたが,会期中に余裕がなく他のチームの動向は見ておりませんでした。特に上位を占めた強豪の動向を中心に簡単にまとめてみました。

 

1.中国勢のレベルが違う

中国からの参加チームは4チームでしたが,全てAリーグ進出。決勝では1位2位4位5位と上位独占と言っていい状況でした。3位がKataGoなのですがUEC杯でこの順位なのかと驚愕です。KataGoはオープンソースで開発されているので良い練習ターゲットになっているのでしょう。

特に最終戦のKataGo vs RankaGoではRankaGoの半目勝ちを双方認識しており,判定でやきもきしていたのは人間だけだったとの辺りがAIのコンペらしい展開でした。

Bリーグで目数読み違ってたのとは大違いです。

 

2.世代が違う

私はおっさんですが,他のチームは比較的若い人だそうです。また,技術的にもAlphaGoのコピーから完全に一線を越えているようで追い付くだけで息切れしているようでは歯が立ちません。

優勝のVisionGoおよび6位のKohadaではInceptionモデルが使われており,またVisionGoは探索時の枝刈りを行っているとのことでした。

汎用技術を売りにしたAlphaZeroとは異なり専用のものとして改良が施されているようです。将棋で身に着けた技術利用だけで突貫工事した私が全く勝ち目ないわけです。

 

3.棋力が違う

2位に入ったRankaGoの開発者はプロのチェスプレイヤーだそうです。KataGoのWuさんも囲碁の高段者ではないかと懇親会で話がありました。中国勢は当然のようにチーム内に上級者がいるものと思われます。

見えている世界が違うんだろうなぁと思います。私がたまたま将棋で成功を修めたのもなんとなく盤面が読める棋譜に親しみがあるなどのアドバンテージが大きかったと再認識しました。正直大会中盤面見ても何もわからず,特に自分の対局が早めに終わるとうとうとすることが多かったです。興味・好奇心は不可欠ですね。

 

4.恐らくマシンパワーが違う

うちはRTX3090を2枚用いました。Bリーグでは演算力で勝っていたように感じます。特に囲碁知識がないので軽量な局面評価を暴力的な探索で補う策で準備していました。日本ルール実装の甘いチームなどを終盤で崩せたらいいなあ程度の妄想でしょうか。

KataGoや中国勢はクラウドを使っていたようですので恐らく8GPUなどのインスタンスでしょうか。意気込みも違いますね。

この辺は公平にするとまではしなくてもスペック公表義務くらいあっても良い気がします。

 

5.組織力が違う

懇親会で話題になった点ですが,日本では研究組織レベルで取り組んでいるチームが皆無です。今回も私含め個人参加が多かったように思います。

しかしながら,今大会に限らず開発規模を考えると多人数で分担し組織的な開発が上位を争うには不可欠と思われます。特に探索部の改良と深層学習モデルの改良を一人で行うのは技術・知識・労力すべての面で酷です。加えて資金力でしょうか。

とは言っても私自身「どこかのチームに加えてくれないか?」と打診しても断られることが多いので,この分野の人達は皆一匹狼気質なのかもしれません。

組織的に開発が行われていない弊害としてサーバの安定性やドキュメントの不整備などが結果として出てきます。電竜戦サーバの例を挙げるまでもなく将棋の方がずっと進んでいることは言うまでもありません。

勝敗判定の公式オープンソース実装がない状態で強化学習の練習対象にするのは非常に困難だと何度も書いておきます。

 

以上,突貫工事で参加した大会の雑感でした。

個人的には2年ほど前にGo言語の習作で作ったプログラムをきふわらべ化されたのがきっかけですが,結局PythonC++で(他のソフトのルーチンを流用しながら)組むことになりました。シチョウや目算ミス含めて致命的な不具合が相当ありそうなので今後の課題とさせて頂きます。

---

3/28追記:

某所で日本勢3位とコメント頂きました。

そう言われればそうなんですね。

順位気にするところまで考えてません。とりあえず短期開発にしてもシチョウ対応なしは酷かったと反省しております。

第12回UEC杯コンピュータ囲碁大会決勝

昨日ギリギリで予選通過したので決勝は全敗もありうるという気持ちです。

といっても何か今からできることは皆無なのでそのまま参ります。

そういえば電王トーナメントのときもそんな感じでした。

 

決勝1回戦 vs Ray

昨日やりましたよね。負けましたよね。またやるんですか!?

www.yss-aya.com

 

なんか,勝ちました。相手の投了なので判定も問題ないはずです。

決勝リーグ全敗逃れましたので今大会思い残すことはもうありませんといった心境です。

 

決勝2回戦 vs Crazy Stone

レジェンド中のレジェンドRemiさんです。

将棋の大会に来日頂いたのが私も初参加だった世界選手権でした。私の右にRemiさん,左に山口さんと並んで初参加だったのを強く記憶しています。色々お話したかったのですが何の余裕もなく自分のことで精いっぱいでした。

今日は相手の専門分野ですので胸を借りるという感じです。

http://www.yss-aya.com/uec2021/20210321_110050_crazystone_marble.html

 

結果は完敗といったところでしょうか。

見事お団子にされてしまいました。

 

決勝3回戦 vs Rn

これも昨日負けましたよね。

http://www.yss-aya.com/uec2021/20210321_130038_marble_rn.html

 

基本的によく分かってないのですが,途中まで大きな地が出来て平和的な囲碁だなぁと思っていたのですが突如争いが始まってもうなにやらわからんことになって終局。

投了しなかったので勝ってるつもりなんだろうと思っていたら,相手も同じで初の審判部屋への呼び出しを受けました。

目算が若干違うのが気になりますが,結果目数勝ちだそうです。

予選を考えると勝てると思ってなかったのですが強運でしょうか?恐ろしいことです。

 

決勝4回戦 vs Aya

これは昨日勝たせて頂いたカードですが,まぐれっぽいので安心してはいけません。

http://www.yss-aya.com/uec2021/20210321_142148_aya_marble.html

 

案の定負けてしまいました。

しかし,昨日のようにシチョウで負けたのではないのでヨシとしましょう。

それにしても予選で負けた相手に決勝で勝って,予選で勝った相手に決勝で負けるのはこの辺実力的に僅差ってことなんでしょうか?

 

決勝5回戦 vs QinoaIgo

これも昨日の対局カードです。

何故か将棋の方のDiscordで作戦を宣言されてまして

f:id:the48:20210321153157p:plain

 

二度ほど開始エラーがあって対局開始。

サーバとの通信部分に私はCgfGobanを使っているのですが,きのあさんは自前実装のようです。対局開始のネゴシエーション中に初手を送っているらしく黒番ではうまくスタートが切れない模様。仕方なく手番交代で対局です。

http://www.yss-aya.com/uec2021/20210321_153413_qinoaigo_marble.html

しばらくして,シチョウ局面。ドキドキしましたが初の回避です!!

万里の長城と呼べばいいんでしょうか?

その後はどの石も生かして帰さない殺戮モードで終了です。

 

で,トータル3勝2敗でした。

まずまずと言って良いのではないでしょうか。

---

初日の持ち時間設定以外のトラブルなしってのが一番の成果かもしれません。

第12回UEC杯コンピュータ囲碁大会予選

対戦しながら書いてます。

entcog.c.ooco.jp

 

こういうところはAI大会の楽なところです。

基本的に準備100%なので始まったら見てるだけですることがありません。

運営さんはZoomで見ている感じだと接続不良や対戦結果の判定や集計などで大忙しのようです。特に囲碁は中途半端な状態で終わると勝敗判定が難しいです。

本来AIで強化学習などを行うと自分で負けを認めるのですが大会では万が一があるのでこの判定をせず往生際が悪いことをする場合が多いです。

私は今回は99.99%負けなら投了しています。

 

予選1回戦 vs KataGo

いきなりKataGoです。デビュー戦の相手としては申し訳ない感じですね。

こっちは接続エラーとか反則負けとか気にしてます。

案の定,初っ端から持ち時間設定ミスで叱られました。

対戦が始まって安心してたらコレです。

  

シチョウに関しては知識はあったのですが,そこそこ探索していたら大丈夫じゃないかなぁと適当にサボってたわけです。で,それなりに自己対戦などやってシチョウ局面を見なかったので油断してました。

 

予選2回戦 vs Aya

レジェンドです。当たりきつくないですか?

www.yss-aya.com

もう,トラブルの心配しかしてない感じでまともな対戦になっていただけでうれしいです。自分自身が局面を読めないので相手が投了したと言われてもきょとんとしてました。公式戦初勝利です。感無量といったところでしょうか。

実装がどうなっているのか分かりませんがこのAyaは深層学習導入前かもしれません。

 

予選3回戦 vs DeepEsper

越川さんは何度も参加されている常連さんのようです。

よく分からず不思議な局面になって終了。ルール上は400手で終了なのですが,サーバはそういう設定になっておらず800手を超えておりました。

プロ棋士の大橋先生に(ネタとして)取り上げて頂けたのは光栄です。

 

実はこういった対局は自己対局(自作プログラムのバージョン違いの対局)で結構出てまして中国ルールで純粋に作るとあのようになります。

日本ルールだと無駄着手は結構損になるのでうちは相当パスをしているはずです。見た目は大敗に見える終局図ですが白の勝ちです。

そういえばプロの公式戦でもパスがあるという話をNHKでやってました。

 

予選4回戦 vs QinoaIgo

きのあさんとは将棋からの付き合いです。

選手権のときに頂いたマグカップが職場の常用になってます。

www.yss-aya.com

対局は勝たせて頂きました。本当によく分かってないのですがちゃんとした囲碁っぽくないでしょうか。普通に動いてそうで安心の一局でした。

 

予選5回戦 vs Rn

Rnの松崎さんも常連ですね。Rayの小林さんと組んでいたのも記憶にありますが,基本的に学会発表などもされているのでAIに関してアルゴリズムもプログラミングもしっかりした方と思っています。

ええ,まともにやっても勝ち目無いですが,シチョウが出ちゃいました。

www.yss-aya.com

 

予選6回戦 vs VisionGo

中国の方でしょうか。ちょっと分からないので運営に戦績を尋ねてみました。

ここまで全勝のチームのようです。予選だから当てて貰えてるんですが申し訳ないかんじです。

www.yss-aya.com

終局図見ても投了理由は(私は)分からないのですが,事後解析してみると割と早々に大差だったようです。強いやつの強い理由がまだ分からないくらいなので今後勉強しないとダメですね。

 

予選7回戦 vs Ray

Rayの小林さんも常連です。AobaZeroのメンバーでもあります。

何やら大会直前で不具合発生のツイートがあったので心配でした。

結果はシチョウが出て負けました。

事後聞きましたが探索速度が全然出てなかったそうで,探索速度だけならウチの方が二桁ほど上回っていたようです。中盤でうちが良かった局面もあったそうです。

でも,ダメですね(笑)

www.yss-aya.com

 

で,結局3勝4敗で負け越しました。

ただ,対戦相手が強豪ぞろいだったせいでソルコフポイントが溜まっており12チームが通過する予選を11位で通過できることになりました。

一晩でプログラム修正できるかと尋ねられましたが,それができるくらいならとっくにやってますとお応えして明日もそのまま投入する予定です。

いやぁ,勉強になりますね。