DEVGRU

プログラミングと競馬予想について書きます

(お詫びと訂正)Android版COCOAがバグった理由

2021/02/06 21時35分 追記

参照したGoogleの資料が古く、現在はAppleと同じ仕様になっております。

先日報じられた不具合の原因はこちらのIssueと思われます。

訂正が遅くなり申し訳ありません。


調べたらそれっぽいのがわかったのでメモ。

広告


報道発表の時期から、原因はこのコミットだと思われる。

怪しいのはこの変更。

-                 MinimumRiskScore = 1,
+                MinimumRiskScore = 21,

(Minimum)RiskScore の定義を調べると、GoogleApple で異なる。

Appleの場合

https://docs-assets.developer.apple.com/published/7cd84254a3/rendered2x-1591113781.png

Google の場合

f:id:katoken-0215:20210203223636p:plain
https://www.blog.google/documents/68/Android_Exposure_Notification_API_documentation_v1.2.pdf

Apple は0~8の整数値を取る4つのパラメータの積で、0〜4096の値を取る。 それに対して、Google は 1〜8の値を取る4つのパレメータに更に重みを加味して正規化した、1〜8の値を取る。

そのため、RiskScore = 21 というのはApple 仕様の定義では適切だが、Google仕様ではありえない数値となる

結果として、iOSでは検知するがAndroidでは検知しないという状況が出来上がったと考えられる。

当たっているだろうか?

はじめてのAndroidプログラミング 第5版

はじめてのAndroidプログラミング 第5版

Ubuntu 20.04 (on Google Cloud Platform Compute Engine) で GPU サポートが有効な LightGBM をビルドする

サーバを作り直すときに調べたのでメモがてら。

公式に書き方は載っているが、記述が古いので掲題に特化した方法を載せる。

lightgbm.readthedocs.io

前提として、Compute Engine で GPU が有効なインスタンスがあり、そこに pyenv でPython 3.8.6がインストールされているものとする。

CUDA のインストール

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.2.0/local_installers/cuda-repo-ubuntu2004-11-2-local_11.2.0-460.27.04-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-11-2-local_11.2.0-460.27.04-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu2004-11-2-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda

ドライバーのインストール

必要なパッケージをインストールする

sudo apt update
sudo apt install --no-install-recommends nvidia-driver-390 nvidia-headless-390 nvidia-opencl-dev opencl-headers

以下のコマンドでインスタンスを再起動する。 SSH コネクションが切断されるが、30秒程度待つと再接続できるようになる。

sudo init 6

ビルドツールチェインのインストール

sudo apt-get install --no-install-recommends git cmake build-essential libboost-dev libboost-system-dev libboost-filesystem-dev

ソースコードのチェックアウトとビルド

git clone --recursive https://github.com/microsoft/LightGBM
cd LightGBM
mkdir build ; cd build
cmake -DUSE_GPU=1 -DOpenCL_LIBRARY=/usr/local/cuda/lib64/libOpenCL.so -DOpenCL_INCLUDE_DIR=/usr/local/cuda/include/ ..
make -j$(nproc)

Python パッケージのビルドとインストール

cd ../python-package
pip install setuptools numpy scipy scikit-learn wheel -U
python setup.py install --gpu

以上で、GPUが有効な lightgbm パッケージをインストールすることができた。

カテゴリ変数の数に影響があったりするので、気をつけること。

Google Cloud Platform Compute Engine の VM インスタンスにSSHでつなぐ

BigQuery を使っている縁(?)から、計算用のインスタンスもGoogle Cloud Platform (GCP) を使っている。

具体的には、 AI Platform の Notebook インスタンスを立てているのだが、これは結局 Compute Engine の VM インスタンスに Jupyter Lab をプリインストールしただけのものだったりするので、 SSHログインは可能(ただし、Jupyter Labのユーザではログインできず、別ユーザとなる)

IPアドレスはエフェメラル(起動ごとに変わる)がデフォルトで、staticにすることで固定もできるが、まあまあお金がかかる。 しかし gcloud コマンドでVMインスタンスのIPアドレスを調べられるので、 ssh config と組み合わせれば接続が可能なので、その方法を紹介する。

事前に gcloud コマンドのセットアップとAPIの許可は済ませておいてほしい( ここ を参照)。

まず、ダッシュボードからプロジェクトIDを取得する。 英単語-英単語-数値 のフォーマットとなる。

次に、サイドバーから Compute Engine → VMインスタンスを開き、インスタンスの一覧から SSH 対象のインスタンスの名前とゾーンを調べて控えておく。 インスタンスの名前は作成時につけた任意の英数、ゾーンはリージョン+ハイフン、アルファベットの形式(Ex. asia-northeast1-a)となる。

ローカルでターミナルを開き、以下のコマンドで .ssh/config に設定を書き込む(適宜書き換えてください)。

ssh インスタンスの名前.ゾーン.プロジェクトID

すると、 .ssh/config に設定が書き込まれる。

Host インスタンスの名前.ゾーン.プロジェクトID
    HostName 実際のIP
    IdentityFile /Users/myname/.ssh/google_compute_engine
    UserKnownHostsFile=/Users/myname/.ssh/google_compute_known_hosts
    HostKeyAlias=compute.~~~
    IdentitiesOnly=yes
    CheckHostIP=no

このままでも使えそうだが、 HostName のIPはインスタンス再起動ごとに変わるのと、Hostが使いにくいので、書き換える必要がある。

Host は任意の文字列を入れられるので、 my-instance としておく。 HostName の代わりに、ProxyCommand で動的にIPを調べるコマンドを入れる。

Host my-instance
    ProxyCommand /usr/bin/nc $(gcloud compute instances describe インスタンスの名前 --zone ゾーン --format='get(networkInterfaces[0].accessConfigs[0].natIP)') %p
    IdentityFile /Users/myname/.ssh/google_compute_engine
    UserKnownHostsFile=/Users/myname/.ssh/google_compute_known_hosts
    HostKeyAlias=compute.~~~
    IdentitiesOnly=yes
    CheckHostIP=no

nc コマンドのパスは macOS の場合だが、 Linux の場合は異なるパスにある可能性があるので、 which nc などして調べる(またはインストールしておく)。

最後に、以下のコマンドでログインできることを確認する。

ssh アカウント名@my-instance

GCPの教科書

GCPの教科書