読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

iOSアプリのシンプルなプライバシーポリシー

この度、iOSアプリを一つ申請し承認いただきました。(契約関係でトラブっていてまだApp Storeには掲載されていません)
6年ぶりのiOSアプリ申請で色々新鮮でした。
中でもすべてのアプリにプライバシーポリシーURLの掲載を求められたことがびっくりしました。
(ニュースで話題になったのかも知れませんが当時iOSアプリを出す予定はなく気にしていませんでした)
ネットをググればプライバシージェネレータなるものも多数あり、やってみましたが、個人情報を全く収集しなくても結構なボリュームになります。
今回、アプリのローカリゼーションを行ったこともあってできるだけ短い記述で済ませたいと思い自分で書きました。
以下がそのページです。

https://new3rs.github.io/a_master_of_go/privacy_policy.html

一言語で7行程度です。
法律的にどうなのかはわかりませんが、少なくともこれでApp Storeの申請は通りました。
ご参考に。

クラウドでLeela Zeroを動かしてローカルのLizzieで見る

以前、VPSサービスGPUEaterでLeela ZeroとLizzie動かす方法を紹介しました。

nextliteracy.hatenablog.com

VPSVNCで繋いて、VPS側でLizzieを動かす方法でしたが、この方法だとVPS側にデスクトップ関連のインストールする必要があってその時間が比較的長く、サクッと使ってみる気にはなれないものでした。

今回は、ローカル(自分のパソコン)でLizzieを動かして、Leela ZeroはVPSサービスで動かす方法を紹介します。元ネタは以下のイシューです。

github.com

VPSサービスとしてGPUEaterを例にしますが、sshでつながるVPSならどれでも同じだと思います。

手順

GPUEaterでアカウントを作る。

省略^^:

インスタンスを生成する。

省略^^:

SSHで接続してインストール作業をする。

SSH接続手順は省略^^;

Leela Zeroをインストールする。

シェルから以下を順に実行してください。スクリプトにして一括実行するのもいいかと思います。おおよそ2分30秒です。
最後のwgetは私のDropboxに置いてあるELF OpenGo v1ウェイトです。お好きなものを用意してください。

apt update
git clone -b next http://github.com/gcp/leela-zero.git
cd leela-zero
git submodule update --init --recursive
apt install -y libboost-dev libboost-program-options-dev libboost-filesystem-dev opencl-headers ocl-icd-libopencl1 ocl-icd-opencl-dev zlib1g-dev
mkdir build && cd build
cmake ..
cmake --build .
wget https://www.dropbox.com/s/qxd2bu0xb59lb5f/elf_converted_weights.txt.gz

次に以下を実行して、OpenCL最適化を終わらせておきます。

cd
leela-zero/build/leelaz --weights leela-zero/build/elf_converted_weights.txt.gz --gtp
Setting max tree size to 4136 MiB and cache size to 459 MiB.

という感じのメッセージで止まったら終了してください。

以上でサーバ準備完了です。VPSインスタンスの起動を含めても5分かからないはずです。

ローカルのLizzieの設定ファイルを変更する。

(普通ローカル環境も維持したいかと思いますので、変更するよりはもう一式Lizzieをインストールしてから設定することをおすすめします)
以下のように、engine-commandプロパティを変更してください。

{
  "leelaz": {
    "automatically-download-latest-network": そのまま,
    "max-analyze-time-minutes": そのまま,
    "analyze-update-interval-centisec": そのまま,
    "network-file": そのまま,
    "max-game-thinking-time-seconds": そのまま,
    "engine-start-location": そのまま,
    "engine-command": "ssh -i ~/.ssh/gpueater.pem root@<IPアドレス> leela-zero/build/leelaz --weights leela-zero/build/elf_converted_weights.txt.gz --gtp --lagbuffer 0 --threads 3",
    "print-comms": そのまま
  },

~.ssh/gpueater.pemはご利用のVPSsshに合わせて変更してください。
<IPアドレス>はご利用のVPSインスタンスIPアドレスです。
--weightsはもしLeela Zeroのインストールの際に違うウェイトをダウンロードしたならそれに合わせてください。
--threadsはご利用のVPSインスタンスの性能に合わせて変えてください。

ダミーのファイルを作る

engine.start-locationとengine-commandの--weightsオプションを組み合わせたファイルを用意してください。空のファイルで結構です。
(Lizzieがウェイトファイルが存在するか確認するので、それを誤魔化すために作ります)

お疲れ様でした。以上で設定完了です。いつものようにLizzieを起動してください。VPS上のLeela ZeroをLizzieで使うことができます。

20万円近くする高性能パソコンを買わなくても、GPUEaterなら1時間50円程度で高性能パソコンと同等にLizzieを使うことができます。

対局場控室で、持ち込みのノートPCは非力とお嘆きの解説の先生がた!、この方法ならノートPCでもいくらでも高性能Lizzieになりますよ!

Enjoy!

Leela ZeroのウェイトをCore MLで計算させる

AZ.jsをSwiftに移植しました。

その際に、Leela ZeroのウェイトをCore ML上に移す作業があったのですが、ハマり所があったので、備忘録です。

Leela Zeroのウェイトは、leela-zeroレポジトリのtraining/tfフォルダ以下のスクリプトを使って、TensorFlowに読み込むことができます。なので、後はtfcoremlで.mlmodelに変換すれば完了です。
github.com

以下、ポイントは2点ありました。

  • tfcoremlはテンソルのフォーマットにNHWCしかサポートしていません。レポジトリのtfprocess.pyは(GPU用に)NCHWフォーマットなので、NHWCフォーマットに対応させました。
  • Core MLは、現在、モデルの実装が限定されているようです。無次元+チャンネルの場合バッチあり、2次元+チャンネルの場合バッチなしの2つです。1次元+チャンネルの場合2次元+チャンネルの1次元を要素数1にして代用するようです。なので本当の意味での1次元+チャンネルはサポートされていません。Leela Zeroは1次元+チャンネルを内部でreshapeする構造なのでこのままではCore MLに合わせることはできませんでした。なのでLeela Zeroのモデルを、内部のreshapeを取り払って2次元+チャンネルの入力に変更しました。

ELF OpenGo v1のウェイト(20b, 224c)を変換してみたところ、私のiMac(27インチ ,Late 2012, i5)で推論が1回170--220ms程度でした。同じマシンのChrome(webgl)でWebDNN上のものが360ms前後なので倍ぐらいのスピードですか。Core ML(tfcoreml?)は量子化をしているようで出力の数字が荒っぽくなります。

GeForce RTX 2080 Tiは2枚でAlphaGo Readyと言えるかも(言えないかも)

追追追追記 2019/09/23
Leela Zero 40bがV100で2219プレイアウト/秒出るそうです。20bなら雑に2倍して4438プレイアウト/秒、INT8で2倍になるとして8876プレイアウト/秒。
2枚あれば16000プレイアウト/秒以上出ますね。
V100相当のTuringカードがあれば2枚でAlphaGo Readyと言えそうです。

追追追追記 2018/11/29
TOPSという数字の追求だけでは心もとないので、もっと具体的な数値を見ました。
AlphaGo Zero(20b)は4TPUsで16000プレイアウト/秒です。
ELF OpenGo(20b)はV100でTensor Coreを使って1600プレイアウト/秒です。
TuringのINT8でプレイアウトが2倍になったとしても2枚で4倍にしかならず、10倍の4 TPUsには届きませんね。
AlphaGo Ready PCはまだまだ先のようです。


追追追記 2018/10/04
devblogs.nvidia.com
9月14日の記事ですが、RTXシリーズは、

  • packed fp16が実装されている。つまりTensor Coreを使わなくてもfp16で高速化を図れる
  • Tensor CoreはFP16積算の場合と比べてFP32積算では速度が半分

ということのようです。
cuDNN 7.3.1はまだTuring向けにチューンしたものではようで、FP32積算を使うようになっていると2080Tiは TITAN Vより速度が出ないということが起こりうるようです。


追追記 2018/09/23
将棋AIを開発されている山岡さんがTensor Coreを利用した記事を書かれていたので、質問して教えていただきました。
cuDNN Developer Guide :: NVIDIA Deep Learning SDK Documentationに、制約のある次元はfeature mapsのことであり、rows, columnsではないことが明記されていました。追記の記事にもchannelとあったのですが、ディープラーニングでのいわゆるチャンネルなのか、dimension一般のことかよくわからなかったので誤解しました。
というわけで、囲碁AIでも使えますね!


追記 2018/09/06
cuDNNは次元がそれぞれ8の倍数でないとTensor Coreを活用できないようです。
devblogs.nvidia.com
これだと、囲碁AIには使えないですね…

GeForceシリーズの新しいGPUが発表されました。Gamescomに先立って行われた講演では、リアルタイムレイトレーシングが強調されてTensor Coreに関しては搭載されているのかどうかはっきりしないものでしたが、2日経って詳細内容の記事が出てきました。
pc.watch.impress.co.jp

この記事によると、GeForce RTX-20シリーズにはすべてTensor Coreが搭載されていて、その仕様は、

2070 2080 2080 Ti
Tensor Core FP16 60 TFLOPS 81 TFLOPS 108 TFLOPS

とのことです。

TuringアーキテクチャTensor CoreはINT8, INT4もサポートするので、以下の仕様が想像できます。

2070 2080 2080 Ti
Tensor Core FP16 60 TFLOPS 81 TFLOPS 108 TFLOPS
Tensor Core INT8 120 TOPS 162 TOPS 216 TOPS
Tensor Core INT4 240 TOPS 324 TOPS 432 TOPS

AlphaGo Zeroの対局時の仕様はTPU v1 4個なので、INT8が92 TOPS * 4 = 368 TOPSという仕様です。

なので、RTX 2080 Tiを2枚で432 TOPSでAlphaGo Zeroの仕様を(単に数字の上だけですが)超えることになります。
RTX 2070を3枚なら 360 TOPSでAlphaGo Zeroにほぼ並びます。

499ドル 3枚(約17万円)、999ドル 2枚(約22万円)は決して安い値段ではありませんが、半年前にはTITAN V 2枚(80万円)でも届かない性能が今この値段!

なんという世の中でしょう。競争激しいGPU業界のたゆまぬイノベーション努力に感謝致します。

(でも財布の都合で買うならRTX 2070一枚かな…)