今回のWCSC29(第29回世界コンピュータ将棋選手権)では、AWSを利用するチームが目立った。ハイスペックなPCを持ち込んで戦うよりは、軽量なノートPCだけ持ち込んでAWSを使ったほうが機材の搬入が楽だし、スペックも悪くない。しかし、普段sshを使うこともないような人にとっては知らないことだらけでどうやって良いのか戸惑うことも多かった。かくいう私もその一人であった。そういう人の助けとなるように記事にまとめておく。
WCSC28でelmoが反則負けした件
まず、この原因を書いておくところから。この原因を知らないと怖くてsshが使えない。
elmoの瀧澤さんにWCSC29で尋ねたところ、「あれはMicrosoft製のsshを使っていて、1年以上更新していなかったもので、そのバージョンが古く、1行のバッファが1024文字までだったのが原因です。」とのことであった。
1行が1024文字までなのでUSIでは1手が5文字程度で表現されるので200手目ぐらいで初期局面から現在の局面にいたる指し手手順を送る文字列(USIの”position”文字列)が途中でちょん切れて、現在の局面より1手前の局面に対して思考エンジンが思考して指し手を返すので不正な指し手をサーバーに返してしまい、反則負けになる。
この問題、最新のsshでは直っているし、わざわざsshの実行ファイルをどこかからダウンロードしてこなくともWindows 10なら標準でインストールされているようである。
Windows10でsshする
https://qiita.com/TukamotoRyuzo/items/7bd4ff6810421bdc9924
標準入出力のリダイレクト
思考エンジンは標準入力から局面を入力して、思考を開始し、標準出力にその局面のベストな指し手が返ってくる。標準入出力を使う仕組みで動いている。
Unix(Linux)なり、その仕組みを模倣したMS-DOSなりは、この標準入出力をリダイレクトできるようになっている。
例えば、MS-DOSの.bat(バッチファイル)で、思考エンジンを起動したとする。
engine.batというファイルを作って、
YaneuraOu.exe
と書く。
このとき、YaneuraOu.exeの標準出力は、このバッチファイルの標準出力に流れてくる。このバッチファイルへの標準入力は、思考エンジンの標準入力に流れてくる。(これをリダイレクトと呼ぶ。)
なので、このバッチファイルは、思考エンジンと同じ挙動をする。
将棋所では、バッチファイルを思考エンジンとして登録できるようになっているので、このバッチファイルを思考エンジンとして登録すると思考エンジンとみなされるし、普通に対局もできる。
リダイレクトについて詳しい説明は以下の記事でもどうぞー。
※ 標準入力・標準出力ってなに? : https://qiita.com/angel_p_57/items/03582181e9f7a69f8168
sshを使うと何が嬉しいの?
sshが何であるかはググって欲しい。
sshもバッチファイルと同様に、リモートPCの標準入出力をローカルPCのsshの標準入出力にリダイレクトする。
ついでに、sshコマンドの引数として、リモートPCで実行するコマンドを指定できる。
よって、次のようにバッチファイルを作成したとする。
aws-engine.bat
1 2 3 |
echo off cd "c:\Users\yane" ssh.exe -i "yane_aws.pem" ubuntu@ec2-XXXX.XXXX.compute.amazonaws.com ./YaneuraOu-by-gcc |
そうすると、リモートPC(AWS側のパソコン)に接続後、リモートPCでYaneuraOu-by-gccを実行してくれる。
このYaneuraOu-by-gccの標準入出力はsshにリダイレクトされていて、さらにsshの標準入出力は、バッチファイルの標準入出力にリダイレクトされている。
つまりは、このaws-engine.batを将棋所から思考エンジンとして登録するとリモートPCにsshで接続して、リモートPCでやねうら王のエンジンを起動してくれて、それがさもローカルで動いているかのように振る舞ってくれるわけであるな。新たなプログラム何も要らない。ssh、すごすぎ。標準入出力のリダイレクトはOSの基本機能ではあるけども、この仕組みを最初に考えた人、すごすぎ。
ssh設定上の注意点
Windows 10の標準でインストールされているsshは、OpenSSHという実装らしく、設定方法などはそれに準じるのでOpenSSHでググれカスなのであるが、いくつか注意点だけ書いておく。
さきほどの例だと
“c:\Users\yane”
というフォルダでssh.exeを実行している。ssh.exeは、カレントフォルダ配下の .ssh というフォルダがあり、そこに設定が書かれているものとして動作する。
そこで、 .ssh/config というファイルを作成(.sshというフォルダのなかにconfigという拡張子なしのファイルを作成)して、設定を書いておく。
私は以下のように書いた。
1 2 3 4 5 |
host *.*.*.* StrictHostKeyChecking no ServerAliveInterval 120 ServerAliveCountMax 3 |
StrictHostKeyCheckingはオフにしておかないと1度目の接続のときに「このホストでほんまにええんか?」という趣旨の確認メッセージが出てくる。AWSを使うとき、インスタンスを起動するごとに違うホストアドレスになるのが普通なので、インスタンス起動ごとにこの確認が出てくるのは面倒である。だからこの機能をオフにする。
次に、sshでの通信内容がしばらくないと勝手に回線が切断されてしまう。(思考エンジンから定期的に読み筋が返ってくるので通常、通信内容がまったくない状態にはならないのだが、相手番でponderが外れて、相手が長考している場合、ないとも言い切れない。)
そこで定期的にダミーのメッセージを送ってやる必要がある。
この送信間隔は、ServerAliveIntervalで指定するようである。
サーバー側のほうで設定してもいいらしいのだが、クライアント側でやるほうが簡単っぽいので上のように私は設定した。
来年以降のWCSCに参加する人に
WCSCでは対戦はLANで行い、インターネット用のネットワークと分離しているようで、AWSを利用するならパソコンに2つのネットワークアダプター(ネットワークケーブルは2本)が必要になる。(私は運営から来てるメール、よく読んでなかったので、初日にやらかしてしまいました。)
ノートPCで参加するなら、USB接続型のネットワークアダプター×2などを用意すると良い。
関連記事
AWSのアカウント取得から設定まで → 将棋ソフトのためにノートPCを買い変える前に
AWS側のUbuntuでコンパイルする方法など → コンピュータ将棋開発者がAWSで機械学習を回すには?
.ssh はカレントではなく、ユーザのホームフォルダにあるような?
C:\Users\yane はユーザのホームフォルダっぽい場所でお寿司。
そして、カレントの~にしたいときは、 -F .ssh/config でよさそうな雰囲気。
おお、なるほど!カレントではなくホームフォルダ見てるんですね > ssh
フォローありがとうございます(`・ω・´)b
そして、カレントディレクトリのkey.pemを読ませるためのオプションが -i key.pem だよというググったらここに到達するための仕込みw
WindowsのOpenSSHは、デフォルトで %USERPROFILE%\.ssh の中のファイルを見るようになってるっぽい?
ユーザーのホームディレクトリの.sshフォルダの中で、ファイルの名前は id_dsa id_ecdsa id_ed25519 ed_rsa のどれかにしておけば -i オプションが不要になるっぽい。
あ、ディレクトリとフォルダの表記揺れw
おお、なるほど。”-i”つけとかないと、カレントディレクトリのkey.pem見に行かないんですね。うおー!
awsで1億局面m4.largeで生成するといくらかかりますか?
400knps/threadぐらいなのでm4.largeなら2vCpuで800knps程度。
depth 8で1局面およそ2kn(n = nodes),depth 10で7kn,depth 12で20kn。
あとは割り算してくだされ…。
初めまして。恐れ入ります。将棋神やねうら王を購入してRyzen 5 2400G+メモリ32GB+SSDのデスクトップで使わせて頂こうと考えているのですが、PCスペック的にはこれで十分でしょうか?
動作推奨スペックは十分満たしています(`・ω・´)b
CPUコア数が多いほうが強いのは強いですけども、まあ、人間に簡単に体感できるような差でもないでしょうし…。
お忙しいところ大変初歩的な質問にお答えさせてしまい申し訳ございませんでした。購入させていただこうと思います。素晴らしい品物を作ってくださり本当にありがとうございます。
linuxでやねうら王を実行したいときはどのようにすれば良いでしょうか?
Ubuntuではmakefileついてるのでそれでビルドできます(`・ω・´)b (他の環境は知らないです…。)
docs/解説.txtの「Makefileを使ったmake方法」のところをどぞ~。
!make -j8 tournament TARGET_CPU=AVX2 COMPILER=g++ YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE ENGINE_NAME=”YaneuraOu\(tournament\)”を実行するとmake: *** No rule to make target ‘tournament’. Stop.と出てしまいます。どうすれば良いですか?
Makefile古いだとか? Makefileが
https://github.com/yaneurao/YaneuraOu/blob/master/source/Makefile
と同一か確認しましょう…。
確認したのですがまったく同じの物でした。一体どうすれば良いですか?
ENGINE_NAMEのところ、単に”YaneuraOu”に変更してみて駄目なら、配布しているのと異なるMakefileを参照しているような…。
makeコマンドを実行するときのフォルダでcat Makefileなどとして、配布しているものと同一か調べてみてください。
それで同一だとしたらmakeコマンド自体がおかしいような。そのmakeコマンドは、どこから持ってきたmakeコマンドなのでしょう?