読み書きプログラミング

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

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!

Maximaマニュアルを5.42.0に更新しました。

maxima.osdn.jp

置換用パッケージcombinatoricsと最悪ケース解析パッケージwrstcseが追加されましたね。
稚拙な訳ですがご活用ください。

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と言えるかも

追追追記 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 :: 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一枚かな…)

GPUEaterでLeela Zeroを動かす

追記 2018/10/06
Leela Zeroのコンパイル手順が古くなっています。
GitHub - gcp/leela-zero at nextの記述に従ってください。

https://pbs.twimg.com/media/DjGFRRyUUAAn2eM?format=png

GPUEaterというGPUサーバーレンタルサービスがあります。

www.gpueater.com

RX Vega 56などハイエンドのPCやワークステーションに搭載されるGPUマシンをお手頃な値段で時間貸ししてくれます。RX Vega 56の場合、1時間$0.4794(≒53円)。

ここではAMDGPUマシンを借りて、Leela Zero、Lizzieをインストールし、VNCで接続して遊ぶ手順を公開します。

手順

GPUEaterでアカウントを作る。

省略^^:

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

省略^^:
ここでの手順はAMD GPU用なので、インスタンスはa1.rx580, a1.vega56, a1.vegafeのいずれかを選んでください。
ImageはデフォルトのAMD-ROCm 1.8 192+TensorFlow1.8 Ubuntu 16.04 x64ではなく、Ubuntu 16.04 x64を選択してください。ROCmのOpenCLではLeela Zeroが正常動作しませんでした。(a1.vega56インスタンスで確認。)

追記(2018/08/07)
今日、Leela Zero nextブランチ488de43コミットで確認したところ、AMD-ROCm 1.8 192+TensorFlow1.8 Ubuntu 16.04 x64イメージで動きました。なのでこのイメージを使えば以下の「OpenCLのインストール」は必要ありません。
488de43コミットはhalf float auto detectionもサポートしています。ROCm OpenCLドライバはVegaのhalf floatがサポートされているので、amdproドライバと比較してLeela Zeroのパフォーマンスが1.5倍(netbench比較)になりました。
追追記(2018/08/08)
動くのは特定ウェイト(62b5417b64c46976795d10a6741801f15f857e5029681a42d02c9852097df4b9)のようで、best-networkでは動かないことを確認しました。イメージは変わっていないので、ROCmドライバにバグがあって、地雷を踏むウェイトとそうじゃないウェイトがあるようです。

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

SSH接続手順は省略^^;

OpenCLのインストール

以下のスクリプトを走らせてください。

# OpenCLのインストール

apt update

# AMDのサイトから直接ダウンロードできなかったのでDropboxに落としたものをダウンロード
wget https://www.dropbox.com/s/r1totpsb5e5z1lb/amdgpu-pro-18.20-606296.tar.xz
apt install xz-utils
tar -Jxvf amdgpu-pro-18.20-606296.tar.xz
cd amdgpu-pro-18.20-606296
dpkg --add-architecture i386
./amdgpu-install --opencl=pal
#実行途中でインストールの意思を聞かれるのでYを入力
reboot

最後にrebootするのでSSHが一旦切れます。再度SSHで接続してください。

OpenCLがインストールされたか確認したい場合、以下を実行してください。

apt install -y clinfo && clinfo
Leela Zeroのインストール

以下のスクリプトを実行してください。ウェイトはELF OpenGo移植ウェイトを選びました。

git clone -b next http://github.com/gcp/leela-zero.git
cd leela-zero/src
apt install -y g++ libboost-dev libboost-program-options-dev libopenblas-dev opencl-headers ocl-icd-libopencl1 ocl-icd-opencl-dev zlib1g-dev
make
cd ..
wget http://zero.sjeng.org/networks/62b5417b64c46976795d10a6741801f15f857e5029681a42d02c9852097df4b9.gz

Leela Zeroが動くか確認したい場合、以下を実行してください。

src/leelaz -g --weights 62b5417b64c46976795d10a6741801f15f857e5029681a42d02c9852097df4b9.gz

a1.vega56dでのnetbenchの結果は以下の通りでした。

 1600 evaluations in  4.59 seconds -> 348 n/s
VNC関連のインストール

以下のスクリプトを実行してください。

apt install -y --no-install-recommends ubuntu-desktop gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal
apt install -y vnc4server

(軽量なデスクトップにしてインストール時間を短くしたかったのですが、それだと以下に出てくるxstartupがうまく設定できなかったのでUbuntu 1604のデフォルトデスクトップUnityを使いました。Unityは開発中止になっているので、せめてGnomeのほうがよかったかもしれません。軽量なデスクトップでいいものがあれば設定方法含めて教えてください。)

VNCの初期設定のために以下を実行してください。(これはサーバー起動コマンドです。)

vncserver :1

一旦サーバーは停止させます。

vncserver -kill :1

.vnc/xstartupというファイルが生成されますので、中身を以下に変えてください。

#!/bin/sh

# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc

#[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
#[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
#xsetroot -solid grey
#vncconfig -iconic &
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &

export XKL_XMODMAP_DISABLE=1
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
gnome-session &
gnome-panel &
gnome-settings-daemon &
metacity &
nautilus &
gnome-terminal &

xstartupの中身を変えたら、再度VNCサーバーを起動します。

vncserver :1
Lizzieのインストール

以下のスクリプトを実行してください。

apt install -y default-jre
wget https://github.com/featurecat/lizzie/releases/download/0.5/Lizzie.0.5.Mac-Linux.zip
unzip Lizzie.0.5.Mac-Linux.zip
cd lizzie
# config.txtの設定
mv ~/leela-zero/src/leelaz .
mv ~/leela-zero/62b5417b64c46976795d10a6741801f15f857e5029681a42d02c9852097df4b9.gz network.gz

以上でインストール作業終了です。

遊び方

VNCクライアントソフトでVNCサーバ接続します。(手順省略^^;)

接続すると、ターミナルが開いているのでそこで、以下のコマンドを実行してください。

cd lizzie
java -jar Lizzie.jar

これでLizzieが起動します。(初回はLeela Zeroの起動に少し時間がかかります) Enjoy!