WSL2を試してみた

  

Windows 2004を入れずに試せるってことなのでやってみました。

WSL1(区別するために敢えてこう呼ぶ)は出た時から普段使いなので,比較として気が付いた点だけメモしておきます。

 

技術的に変わったところ。

WSL1:入出力を偽装してLinuxAPIを搭載したWindowsカーネル

WSL2:仮想マシン技術で動く実Linuxカーネル(ただしカスタム品)

 

使ってすぐに気づいたところ。

WSL1は入出力が遅い。ファイルIO,ネットワークIO,大容量メモリの確保など。

WSL2は上記の弱点は相当克服されているが仮想マシンなので100%のマシンパワーは期待できないであろうと思ったが90%くらいは行けそうです。

それでも数値解析などではWSL1しか選択肢はないですね(想定通り)

 

WSL2はメモリの確保は早いが解放が遅いようです。実行プロセスが解放した後に仮想マシンが不要と判断してWindowsに返すまでが遅いのではないかと思います。

これに対応して仮想マシンを即落とすコマンドが追加されて「wsl --shutdown」「wsl -t ***」です。

また,.wslconfigというファイルを設定すれば仮想マシンが使用するリソースの上限を設定できます。

 

そんな感じですね。

CUDAはPreveiw版が要るらしいので試してません。そのうち一般に落ちてから対応しようかな。

おまけとしてはWSL1のファイルシステムが謎システムだったのに対して,WSL2はvhdxらしいです。

個人的には/mnt以下を中心に使うので比較的どうでもいいです。

文字コードUTF-8ですが,改行コードだけどうしようか迷ってます。

 

インストールイメージ毎にWSL1とWSL2を混在させられるようですが,リソース消費を考えると何に使うのか今のところあまり思いつきません。

過渡期の謎技術として後のベテランエンジニアあるあるになりそうなネタかと思います。(もちろん実用的で便利ですよ)

---

追記:

 そりゃそうだなってオチ。

VNNIの話

コンピュータ将棋発の局面評価関数であるNNUEがチェス界を騒がせているらしい。

https://blog.stockfishchess.org/post/625828091343896577/introducing-nnue-evaluation

blog.stockfishchess.org

 

  

チェスや将棋のソフトウェアは局面評価と探索の二輪で開発されているので,今回半分ごっそり新しくなったと言っていい。控えめに言っても革命。実質別ソフトと言っていいと思う。

加えてVNNI対応を遂げたらしい。

 

  

さて,VNNIとは何だろうか。

正式名はVector Neural Network Instructions。Intel社が最近のCPU向けに追加した拡張命令群である。INT8のニューラルネットに特化したもので,どれだけIntel社がAI分野に興味があるかを示していると思う。

詳しくは下記リンク。

www.intel.com

 

実は今年の選手権に向けてNNUEのVNNI実装を試してた。

そのためにCascadeLakeのi9をひとつだけ買い入れて試行錯誤を行って,ある程度の高速化が確認されていた。

問題はAWSの環境で直前計測ではパフォーマンスが若干マイナスの効果であったため本番では使えなかった。

恐らく高速化の効果とサーバ用XeonでのAVX-512ペナルティが相殺された形であろう。AVX-512のペナルティとは演算量の多い拡張命令を多用すると安全のためにクロック上限を下げてくる機能である。ハイエンドデスクトップでは緩い規制であったが,AWSで使われるようなXeonではきっちり下がってくるようである。

ということで,実装しても性能出ないというのが今春の段階だった。

 

まぁ,チェス界隈は技術力があるのかどうかさっくりと実装してくれたみたい。

ソース見て確認させてもらおうかと思う。

 

技術的に停滞するとか誰かおっしゃってましたが,今年も色々と忙しいですね。

 

 ---

追記:

VNNI搭載CPUはCascadeLake-SPと言われる多ソケット用のXeon,CascadeLake-Xと言われるハイエンドデスクトップのi9,省電力ノート用のIceLakeのUプロセッサと現行三ラインしかない。

まだまだ過渡期で一般的に流行るのはこれからですね。 

PyTorch 1.6の新機能の話

先日より色々と深層学習で試行錯誤をしているとミニバッチサイズをパラメータとして振りたくなったが、メモリ不足で上限があまり上げられなかった。

たまたま、相談したところV100搭載機を借りることができたのでGPUメモリが32GBの環境が使えることになった。

 

環境を整えるところでPyTorchの最新版が1.6になっていることに気づく。

この手のは今まで使っていた旧バージョンとの差異で躓くリスクと新機能の恩恵をなんとなくイメージして迷うところだけど、深層学習分野は劇的に進化中なので即最新の1.6をインストールする。

 

普段はWindows環境なのだがお借りしたのがUbuntuだったので環境の差異に戸惑っていたが2,3日で何とか同じプログラムを動かせるようになった。予定していたミニバッチサイズも簡単に今までの二倍以上はいけそうだ。

 

ところで、以下のような話題も気になっておりそのうちテストしたいなぁと思っていた。

qiita.com

 

具体的には計算精度を単精度から半精度などに落とすことにより演算速度を二倍、使用メモリを半分にするような機能である。NVIDIAGPUだと最近のやつは使えるそうだ。

ただ、ライブラリとして出たばかりで完成度に不安があった。

 

ところが、本件の仕組みをPyTorch 1.6では公式に取り込まれていた上に、Windows環境も動作対象に入っていた。

ってことで公式ドキュメントを元にやってみたところ、わずか10分足らずのコーディングで二倍速を得ることができた。使用メモリは半分までにはならなかった。

 

Introducing native PyTorch automatic mixed precision for faster training on NVIDIA GPUs | PyTorch

pytorch.org

 

とても簡単で性能が上がるので是非試していただきたい。

確認事項はGPUとしてTensorCore搭載、PyTorchは1.6です。OSはWindowsでも動きます。

---

追記:

元ネタはこの辺だからとても速い対応で公式に取り込まれたんだとおもう。

github.com

---

追記:

本機能のテストとしてdlshogiの学習を高速化しておいたものを本家に送っておいた。無事より良い形で取り入れられたようだ。

---

追記2:

うちでも測定していたが、やはり二倍速くらいだそうな。

 

tadaoyamaoka.hatenablog.com

探索ノード数とハッシュメモリの話

独り歩きしている数字として探索ノード数とハッシュメモリの話をメモしておきます。

 

たまたま最近AlphaZero式(PV-MCTSと言う表現の方が通り良くなったかもしれませんが)で将棋のプログラム開発を再開しました。元ネタは2017年春ですので3年近く地下に沈んでました。

その間,dlshogiやAobaZeroがどんどん強くなって来ましたので一気にキャッチアップしたいと思います。オンラインで質問させて頂けるのは感謝感謝です。

で,ふとオリジナルの論文を確認してたところelmoにハッシュメモリを1GBしか渡してないというところが気になりました。CPUが64スレッドのDual Xeonなのに!?

 

たまたまハードウェア構成を変更していたThreadripperの負荷テストを兼ねて本条件のレーティング計測をやっています。

100戦程度終わってからblogを書くつもりだったのですが,チームメイトにも早々に見つかってしまいましたので計測中としてリンクを晒しておきます。

wdoor.c.u-tokyo.ac.jp

 

マシンスペックとしては第二世代のThreadripper 32コア64スレッドです。評価関数は選手権優勝時のelmo,探索エンジンは最新のやねうら王(古いのを探すのが面倒で)です。ベンチマーク上は20Mnps前後だったと思います。

現在レーティングが3700程度,探索ノード数固定のKrist_483_473stb_16t_100mにも及びませんし,JKishi18gouにも負けています。JKishi18gouは確か6コアのノートPCです。

elmoと同世代の話をするとデスクトップの4コアでレート3800くらいを記録した記憶があります。β版のshotgunがノートPCで3500です。

 

ということで,ハッシュメモリを適切に設定しないと探索の大半が無駄になり弱いことが明白です。無駄は理解していたのですがどの程度酷い行為であるかを確認したのは無駄過ぎて今回が初めてです。

 

え~っと,これでも20Mnpsだと言われれば20Mnpsで探索した結果です。

メモリが足りないとどんだけ早いマシンもどれだけ長時間探索させてもあまり意味がありません。そういうお話です。やねうら王エンジンを初めて使われる方がよくやることでこのメモリ設定を疎かにしがちです。かならず適当な分量のメモリを用意してあげて下さい。

 

 ところで,AbemaTVの探索エンジンの話です。

直接情報を得ているわけではないので多くの推察からですが,探索ノード数を時間経過で計測された方によると13500knps程度だそうです。ハイエンドデスクトップの領域ですから,結構良いマシンです。

ただ,使われ方が3エンジン並列にMultiPVが5だと言うことでひとつの読み筋に対して15分の1しか使われていません。

そしてこの読み筋ですと2コアのノートくらいじゃないかと予測したものと一致しております。

bleu48.hatenablog.com

 

種明かし終わりと言った感じです。

 

また,記事になっているものを読む限りだとハッシュメモリの設定が上手にされているかちょっと不安な表現もありました。それはさすがに大丈夫と思いたいですね。

 

もう少し真面目な話をすると探索ノード数は比例して寄与するものではありません。

GPS将棋の論文などが詳しいですが密結合でも4ノードで2倍,疎結合なら8ノードで2倍と言われています。木構造の探索はアルゴリズム上難しく並列計算で効率よく求めるのが困難なのです。

え~っと上記の例にすると64スレッドの探索だと4の3乗倍のノード数ですが,探索速度は2の3乗倍と単純に推測できます。8倍速です。64倍の計算量で速度が8倍ですから相当無駄が多いことが分かります。

これに8個の条件を順番に計算させるとなんと1倍速と同じ性能しか出ません。

64スレッドが独立に64個の条件を計算したときと同じ速度です。

 

ちょっと分かりにくいかもしれませんが大勢いても仕事が捗るとは限らないので小さな仕事は完全に手分けした方がいいと言う話です。

分かっている人は分かっていると思うので,近いうちに棋譜解析などでやねうら王にも搭載して頂けるような気がします。

 

その辺を前提において,電王トーナメントのshotgunの効用の話がやっと始まります。

---

追記:

検討エンジン用のMultiPV実装については以前に記載している。これだと局面評価精度をあまり落とすことなくMultiPVができる。良し悪しは当然あって全く読み筋が外れる手については探索が遅れるし,当然以前のエンジンのように同時にPVが見られるわけでもないのでGUI側にも対応が必要になる。

bleu48.hatenablog.com

---

追記2:

Abemaの件,15エンジン別働の方がマシって表現もある気がした。もちろん前向きな改善策としての提案である。

AobaZeroで遊ぼう15(入玉宣言編)

前回はAobaZeroが馬を抜かれる話でした。

 

今回は話題の入玉宣言です。

そもそもAobaZeroが初期局面から固定探索数の対局しか対応していなかったために,任意の局面から検討できるように勝手に改造しておりました。時間制御部も入れたのでそこそこ上手に対戦もします。

 

今回はそこに入玉宣言部を加えました。(と言っても本家のルーチンをコピペで移植した程度です。)

github.com

 

4連休の頭に完成していたのでfloodgateなどで対戦させていたのですが,floodgate上の256手の手数制限では一局しか宣言勝ちを決めることができませんでした。一応動作チェックにはなっています。

宣言勝ちできそうな適当な相手と当たるのは運ですね。

  

山下さんによるとAobaZeroは512手制限の自己対局で学習棋譜を生成しており,自己対戦での宣言勝ちはさほど増えていないがelmoやKristallweizen相手の宣言勝ちが劇的に増えているそうです。とくに勝ちの半分が宣言勝ちとか言う過激な状態だそうです。

確認のために探索制限を入れたKrsitallweizenと対戦させてみたところ300手前後の宣言勝ちがすぐに数局できました。

 

ということで動作チェック完了でバイナリを配布しますって話です。

お手元で異次元の入玉将棋をご堪能下さい。

 

実行バイナリの名前を変更してあるのは手違いでも本家の学習棋譜を汚さないためですのでリネームして元の位置に置くようなことは決して行わないで下さい。

 ---

追記:

本家がfloodgateに投入しているバイナリは手数偽装が行われているそうです。具体的には512手制限で学習したものを256手制限の場に持ってきたために深層学習部に渡す手数を水増しすることで,入玉を急かしている形です。

本バイナリでは本来の姿なので入玉を急ぎません。

AobaZeroで遊ぼう14(続・近況編)

昨日の記事が一部の関係者には衝撃的だったようです。

トップレベルの実力をつけてきたはずがトンデモナイ落とし穴があったという話です。

 

bleu48.hatenablog.com

 

事実棋譜見て酷いなぁと思いました。

私の場合は将棋が趣味なので,定期的に棋譜チェックするのですがそうではない方は対戦勝率やレーティングなどしか見ていないようでこういった落とし穴にハマります。

将棋に限らずAI関係者が気を付けなければいけない点ですね。

 

  

バグであって欲しいと思います。そして修正されたAobaZeroがAlphaZeroの追試として成功することを願っています。

しかしながら,バグであった場合長期に渡って行われた学習を再度行う必要があるのか,バグを修正したとたんにレートが300程度跳ねるようなことになるのかまだみえてきません。

怖いのはバグではなかった場合です。

 

実のところAobaZero贔屓の観戦者として以前より自己対戦しかしていないことによる弊害というものを考えていました。

戦型も自己対戦でしか出てこない戦型のみしか学習しておりません。学習局面であれば探索なしでも好手を返すDL系エンジンも,未学習局面で読み抜けが多いことは言うまでもありません。

また,極端な例として本件の馬の利きについても自己対戦では馬が取られることはありませんから,一種の非合法手として扱われ学習されている恐れはあります。

 

それから,こういったのも自己対戦の弊害かもしれません。

  

是非この棋譜自身の目で追って下さい。

飛車と角が連続で素抜きに合います。

 

また,素抜きの典型例である空き王手の類がAobaZeroは以前から読めていません。

これも自己対戦では咎められることはないので学習機会を逸していたのではないかと憶測しています。

 

以前より(私が機械学習始めた2017年から)CNN構造では長い利きを学習するのは難しいと報告しております。

ここまでで分かると思いますが以前より個人的にはAlphaZeroの報告を訝しんでおります。

AobaZeroに関しては今後の改善を期待して,チーム外からやんわり応援したいとおもいます。

---

ちなみに囲碁の方のAIではAlphaZero型で学習しづらい部分を追加コードを入れることで修正するのが現在の主流らしく,すべてを自己強化学習する流行は終わっているようです。 

---

追記:

改造エンジンの敗着棋譜を追加しておきます。

 

 

 いずれも大駒の利きが見えていないようです。

AobaZeroで遊ぼう13(近況編)

シリーズ13まで続いています。

 

2020年も7月に入りリアルタイムで強化学習中のAobaZeroにも少し変化がありました。

 

学習率をさらに下げられました。AlphaZeroの追試としては最終段階になります。

既に計測レートが向上しているのがグラフで分かります。

ただ,目標値の3500までは少し遠いことは明白でしょう。

 

www.yss-aya.com

 

また,今年は新型コロナウイルスの影響で世界選手権が中止,オンライン大会として5月に開催されました。優勝は水匠でした。

その中でオンライン大会なら比較的容易に開催可能ではないかとの機運でカツ丼将棋さんを中心に年一のオンライン大会を計画しております。理想的には春の選手権,秋の電竜戦(新しいオンライン大会)となるように目指しております。

そこで,現在予行演習として対戦手続きの練習を行っており先週末第二回の予行演習がありました。第一回の予行演習では参加者が少なかったために人間による指し手などバラエティに富んで愉快なものでしたが第二回は質量ともに結構なメンバー構成でした。

 

golan.sakura.ne.jp

 

リンク先に飛んでいただければ分かるのですが,GPU6枚を用いたAobaZeroがエントリーされており春の大会で優勝した水匠を圧巻の将棋で押し切りました。

全勝のいない混戦ですがAobaZeroがそれなりのハードウェアを投入すればトップレベルで戦えることの証明にはなったと思われます。来年の選手権が実に楽しみですね。

 

ところで,その最新のAobaZeroも手元で試すことが出来るので遊んでみました。

f:id:the48:20200723032837p:plain

先手AobaZero後手二番絞りの50手目,1九角成りとしたところです。

次の手,AobaZeroは驚くことに9一馬と香車を取りました。

なんてことでしょう。

人間なら成ったばかりの馬の効きに馬を動かすような真似はしないと思うのですが・・・

 

テストしやすいようにusiプロトコルの局面を置いておきます。

AobaZeroは最新のw1554,エンジン部はsfen改造したものでした。

startpos moves 7g7f 3c3d 2g2f 8c8d 2f2e 8d8e 6i7h 4a3b 2e2d 2c2d 2h2d 8e8f 8g8f 8b8f 2d3d 2b3c 5i5h 5a4b 3g3f 3a2b 2i3g 8f8b P*8d 2b2c 3d3e 8b8d P*2b P*3d 3e6e 6c6d P*8e 8d9d 6e7e 3b2b 9g9f 7a6b 3g4e 3c8h+ 7i8h B*3g 9f9e 9d7d 7e7d 7c7d B*8c 6a5a 8c7b+ 6d6e 7b8a 3g1i+
 

数万ノード程度まで読ませましたが,9一馬で先手良しの評価は動きませんでした。

また,指した局面を検討させても同馬と取られると読んでませんでした。

まだまだ穴があるようです。