AI
oga at 18:37
Deep Learning フレームワークのほとんどが Python を使っています。C++ など他の言語も使えますが、Python と同じ使い方ができるものはあまり多くありません。

例えば CNTK の場合 Keras の backend として使うとこんな感じです。

# Keras
model= models.Sequential([
    layers.Dense( 64, input_shape=(784,), activation='relu' ),
    ~
  ])

CNTK の Python API を使った場合↓

# CNTK
xinput= cntk.input_variable( 784, np.float32 )
model= layers.Sequential([
    layers.Dense( 64, activation=cntk.relu ),
    ~
  ])

CNTK の C++ の場合 Parameter を確保して複数の Function に分解する必要があるのでこうなります。↓

// CNTK + C++
auto device= CNTK::DeviceDescriptor::UseDefaultDevice();
auto xinput= CNTK::InputVariable( { 784 }, CNTK::DataType::Float, L"xinput" );
auto weight= CNTK::Parameter( { 64, 784 }, CNTK::DataType::Float, CNTK::HeNormaliInitializer(), device );
auto bias= CNTK::Parameter( { 64 }, CNTK::DataType::Float, 0.0f, device );
auto x= CNTK::ReLU( CNTK::Plus( bias, CNTK::Times( weight, xinput ) ) );

PyTorch の場合は C++ でも Python と同じ書き方で同じ API なので覚えることが少なくて済みます。

// PyTorch C++
class ModelImpl : public torch::nn::Module {
    torch::nn::Linear  fc0;
public:
    ModelImpl()
    {
        fc0= register_module( "fc0", torch::nn::Linear( 784, 64 ) );
        ~
    }
    torch::Tensor  forward( const torch::Tensor& x )
    {
        ~
        return  torch::relu( fc0( x ) );
    }
};
TORCH_MODULE(Model);


AMD RADEON を使用する場合の選択肢はいくつかあります。Python の場合は Keras + PlaidML が最も簡単で Windows/macOS でも使用できます。Linux の場合は ROCm が使えるため PlaidML 以外の選択肢が増えます。今回は C++ API を使いたいので Linux 上で ROCm を使用しました。

以下 RADEON で PyTorch (C++ API) を使うための作業メモです。


● ROCm の install

使用した環境は RADEON RX Vega 64 (gfx900) + Ubuntu 18.04 LTS です。

ROCm Documentation: Installation Guide

上のページを見ると Supported OS に 18.04.3 (Kernel 5.0) と書かれているため最初に Kernel を更新します。下記ページを参考にさせていただきました。

virtualiment: Ubuntu18.04にカーネル 5.0 をインストールする手順

カーネルの更新

$ sudo apt install --install-recommends linux-generic-hwe-18.04 xserver-xorg-hwe-18.04
$ sudo reboot

次に手順通りに ROCm を入れます。こちらは下記のページを参考にさせていただきました。

ニートが始めるUE4開発日誌: RX470で機械学習ことはじめ その3 ~ROCmとTensorFlowのインストール~

install 前の更新とライブラリインストール

$ sudo apt update
$ sudo apt dist-upgrade
$ sudo apt install libnuma-dev
$ sudo reboot

リポジトリ追加と ROCm のインストール

$ wget http://repo.radeon.com/rocm/apt/debian/rocm.gpg.key
$ sudo apt-key add rocm.gpg.key
$ echo 'deb [arch=amd64] http://repo.radeon.com/rocm/apt/debian/ xenial main' | \
   sudo tee /etc/apt/sources.list.d/rocm.list
$ sudo apt install rocm-dkms
$ sudo usermod -a -G video $LOGNAME
$ sudo reboot



● PyTorch のビルド

PyTorch を ROCm でビルドします。ビルド手順は下記ページを参考にさせていただきました。

Lernapparat: Building PyTorch on ROCm

事前の準備

$ sudo apt install git cmake
$ sudo apt install python3-pip
$ pip3 install setuptools numpy

ビルドに必要な ROCm のパッケージを入れます。

$ sudo apt install rocm-libs miopen-hip rccl roctracer-dev

cmake のパッチのため下記のスクリプトを使います。

#!/bin/bash
for fn in $(find /opt/rocm/ -name \*.cmake ); do
  sudo sed --in-place='~' 's/find_dependency(hip)/find_dependency(HIP)/' $fn
done

上記の内容をファイル(replace_script.sh)に保存してから下記のように実行します。

$ bash ./replace_script.sh

PyTorch を checkout します。仮に展開場所を ~/pytorch とします。

$ git clone --recursive http://github.com/pytorch/pytorch

pytorch フォルダで下記のコマンドを実行します。

$ cd ~/pytorch
$ python3 tools/amd_build/build_amd.py

ビルドします。

$ cd ~/pytorch
$ RCCL_DIR=/opt/rocm/rccl/lib/cmake/rccl/ PYTORCH_ROCM_ARCH=gfx900 hip_DIR=/opt/rocm/hip/cmake/ USE_NVCC=OFF BUILD_CAFFE2_OPS=0 PATH=/usr/lib/ccache/:$PATH USE_CUDA=OFF python3 setup.py bdist_wheel


しばらくしたら Python 向けのパッケージが ~/pytorch/dist/*.whl にできます。C++ 向けの libtorch 相当が ~/pytorch/torch 以下になります。

include path は下記の通り。

~/pytorch/torch/include
~/pytorch/torch/include/torch/csrc/api/include

library は下記の場所に入るので、ビルド時の libpath と実行時の LD_LIBRARY_PATH に追加します。

~/pytorch/torch/lib

Link 時のライブラリ指定はこんな感じ。

-lc10 -ltorch -lc10_hip -ltorch_hip -ltorch_cpu -lc10


これで CUDA 向けのコードがそのまま RADEON で動くようになりました。ROCm (hip) でも PyTorch の API は cuda のままです。C++ API でも to( torch::kCUDA ) で OK。

import torch
for di in range(torch.cuda.device_count()):
    print( di, torch.cuda.get_device_name(di), torch.cuda.get_device_capability(di) )

例えば Python で↑のコードを実行すると次のように表示されます。

0 Vega 10 XT [Radeon RX Vega 64] (3, 0)

起動時に少々待たされますが起動してしまえば十分速いです。BatchSize は 64 以上がおすすめです。


関連ページ
HYPERでんち: Deep Learning

関連エントリ
Jetson Nano で TensorFlow の C 言語 API を使う


UE4
oga at 00:17
Ryzen 9 3950X は 16 core 32 thread の CPU です。少し前まで 4 core 8 thread の CPU をメインに使っていたことを考えると、これ 1つで従来の PC の 4台分に相当します。

実際に速度を調べてみました。UE4 のコンパイル速度の比較は下記の通り。本当に 4台分、コンパイル時間が 1/4になっています。

● UE4 4.24.0 (GitHub版) の Engine コンパイル時間

CPU Core Thread Build 時間 (A) Build 時間 (B)
Ryzen 9 3950X Zen2 16C/32T 966 (16:06) 833 (13:53)
Ryzen 7 1800X Zen 8C/16T 2481 (41:21) 2240 (37:20)
Core i7-6700K Skylake 4C/8T 3787 (63:07) 3564 (59:24)

・Build 時間の単位は秒、値が小さい方が高速

Skylake Core i7-6700K で 1時間かかるビルドが Ryzen 9 3950X だと 16分で終わっています。4倍高速です。1800X と比べても 2.5倍速くなっています。これくらい速ければ分散ビルドなしで十分使えそうです。

ちなみに条件を統一するため 3台とも SATA 接続の SSD の上でビルドしています。NVMe ならもっと時間を短縮できると思われます。


・(A) は Total のビルド時間で UnrealHeaderTool と ShaderCompileWorker が含まれています。また UHT のヘッダ生成は並列化されないためシングルスレッドの時間が含まれます。

・(B) は Engine の ParallelExecutor だけの時間で、最後の Link 以外は並列化されています。シングルスレッドの時間が短いため (A) よりも Thread 数の差が出やすくなります。

・一旦 clean してから Engine\Build\BatchFiles\Build.bat を使い DevelopmentEditor Win64 でビルドしています。

Ryzen9

Ryzen9
↑16 core でも小さい Socket AM4。箱の中身は殆どが黒いスポンジ。


● ARM デバイスの比較に使っているコンパイルベンチの速度

CPU Core Clock Thread Build 時間 WSL
Ryzen 9 3950X Zen2 3.5 GHz 16C/32T 10 (00:10)
Ryzen 7 1800X Zen 3.6 GHz 8C/16T 26 (00:26)
Core i7-6700K Skylake 4.0 GHz 4C/8T 40 (00:40)
Core i7-4790K Haswell 4.0 GHz 4C/8T 41 (00:41)

・Build 時間の単位は秒、値が小さい方が高速

これも UE4 とほぼ同じで 4倍速くなっています。詳しくはこちら


● vfpbench の結果

CPU Thread Single-Thread Multi-Thread
Ryzen 9 3950X 16C/32T 123.3 GFLOPS 1898.0 GFLOPS
Ryzen 7 1800X 8C/16T 61.4 GFLOPS 476.2 GFLOPS
Core i7-6700K 4C/8T 135.6 GFLOPS 542.3 GFLOPS

・GFLOPS の値が大きい方が高速。単精度のみ。

1.9 TFLOPS (1898 GFLOPS) という見たことがない数値が出ました。あくまでメモリアクセスを無視した理想的な条件での値です。だいたい PS4 の GPU に相当します。実際のアプリケーションでこの速度が出るわけではないので参考程度にお願いします。

下記は計測結果のログです。Single Thread 単精度のみ。倍精度はまだ調査中です。

Group 0:  Thread=32  Clock=3.493000 GHz  (mask:ffffffff)
  SingleThread HP max: -
  SingleThread SP max:  122.851 GFLOPS
  SingleThread DP max:   52.722 GFLOPS
  MultiThread  HP max: -
  MultiThread  SP max: 1894.097 GFLOPS
  MultiThread  DP max:  954.959 GFLOPS

* Group 0:  Thread=1  Clock=3.493000 GHz
                                  TIME(s)   MFLOPS      MOPS    FOP IPC
SSE mulss (32bit x1) n8       :    0.244     8605.0     8605.0 (  1 2.5)
SSE addss (32bit x1) n8       :    0.244     8591.2     8591.2 (  1 2.5)
FMA vfmaddss (32bit x1) n8    :    0.317    13239.6     6619.8 (  2 1.9)
FMA vfmaddss (32bit x1) n12   :    0.365    17246.0     8623.0 (  2 2.5)
SSE mulps (32bit x4) n8       :    0.245    34194.1     8548.5 (  4 2.4)
SSE addps (32bit x4) n8       :    0.243    34520.1     8630.0 (  4 2.5)
SSE mul+addps (32bit x4) n8   :    0.183    45837.4    11459.3 (  4 3.3)
FMA vfmaddps (32bit x4) n8    :    0.303    55334.8     6916.9 (  8 2.0)
FMA vfmaddps (32bit x4) n12   :    0.364    69104.3     8638.0 (  8 2.5)
SSE ml+ad+adps (32bit x4) n9  :    0.218    43313.8    10828.4 (  4 3.1)
SSE mulss (32bit x1) ns4      :    0.368     5699.9     5699.9 (  1 1.6)
SSE addss (32bit x1) ns4      :    0.368     5698.4     5698.4 (  1 1.6)
SSE mulps (32bit x4) ns4      :    0.367    22812.0     5703.0 (  4 1.6)
SSE addps (32bit x4) ns4      :    0.366    22916.4     5729.1 (  4 1.6)
AVX vmulps (32bit x8) n8      :    0.258    65052.1     8131.5 (  8 2.3)
AVX vaddps (32bit x8) n8      :    0.260    64581.5     8072.7 (  8 2.3)
AVX vmul+addps (32bit x8) n8  :    0.157   106474.3    13309.3 (  8 3.8)
FMA vfmaddps (32bit x8) n8    :    0.318   105391.7     6587.0 ( 16 1.9)
FMA vfmaddps (32bit x8) n12   :    0.408   123302.0     7706.4 ( 16 2.2)
FMA vfma+mlps (32bit x8) n12  :    0.408    92570.0     7714.2 ( 12 2.2)
FMA vfma+adps (32bit x8) n12  :    0.345   109457.1     9121.4 ( 12 2.6)
AVX vml+ad+adps (32bit x8) n9 :    0.345    54644.5     6830.6 (  8 2.0)
FMA vfma+ml+adps (32bit x8) n9:    0.307    81930.4     8193.0 ( 10 2.3)


関連ページ
Compile Benchmark
VFP Benchmark Log 計測結果まとめ

関連エントリ
UE4 UnrealBuildTool の設定 BuildConfiguration.xml
UE4 UnrealBuildTool VisualStudio の選択を行う
UE4 UnrealBuildTool *.Build.cs のコードを共有する
AMD CPU Ryzen とコンパイル時間の比較 (2)
AMD CPU Ryzen とコンパイル時間の比較


Huawei P30 Lite と Fire HD 10 (2019年新型) のコンパイル時間を調べてみました。P30 Lite は電源設定をパフォーマンスモードにしています。いずれも Android 9.0 で Termux clang 9.0 を使用しています。

Device SoC CPU Clock core RAM time
Huawei P30 Lite Kirin 710 A73+A53 2.2+1.7 4+4 4GB 71
Fire HD 10 (2019) MT8183 A73+A53 2.0+2.0 4+4 2GB 83

・time はコンパイル時間で単位は秒、値が小さい方が高速です。
・clock は GHz

CPU はどちらも Cortex-A73 + Cortex-A53 の big.LITTLE 8 core ですが RAM 容量に差があります。

↓UserLAnd + Ubuntu 18.04 でも比較してみました。clang は 8.0 になります。

Device SoC CPU Clock core RAM time
Huawei P30 Lite Kirin 710 A73+A53 2.2+1.7 4+4 4GB 85
Fire HD 10 (2019) MT8183 A73+A53 2.0+2.0 4+4 2GB 86

思ったほど Termux と差がなくなっています。これなら Termux を併用せずに UserLAnd だけの利用で十分かもしれません。

他のデバイスも含めて比べてみました。

Device SoC CPU Clock core OS time
Google Pixel 3 Snapdragon 845 Kryo385 2.8+1.8 4+4 Termux 35
Essential Phone Snapdragon 835 Kryo280 2.5+1.9 4+4 Termux 40
Google Pixel 3 Snapdragon 845 Kryo385 2.8+1.8 4+4 UserLAnd 51
Essential Phone Snapdragon 835 Kryo280 2.5+1.9 4+4 UserLAnd 61
Huawei P30 Lite Kirin 710 A73+A53 2.2+1.7 4+4 Termux 71
Fire HD 10 (2019) MT8183 A73+A53 2.0+2.0 4+4 Termux 83
Huawei P30 Lite Kirin 710 A73+A53 2.2+1.7 4+4 UserLAnd 85
Fire HD 10 (2019) MT8183 A73+A53 2.0+2.0 4+4 UserLAnd 86
Jetson Nano Tegra X1 A57 1.43 4 Ubuntu 18.04 118
Raspberry Pi 4 BCM2711 A72 1.5 4 Raspbian 10 186
Raspberry Pi 3 BCM2837 A53 1.2 4 Raspbian 10 331

・time はコンパイル時間で単位は秒、値が小さい方が高速です。

この表↑では clang の Version に違いがあるのでより詳しいデータを見たい方は こちら を参照してください。

Pixel3 の UserLAnd でも新しい Filesystem / Session を作って Ubuntu をインストールし直したところ、メタファイルがなくなり以前よりもかなり速くなっていました。いつ更新されてのか把握していませんが、1年以上前から古いファイルシステムを使い続けている場合はインストールし直した方が良いかもしれません。

今日 Raspberry Pi 4 (4GB) が届いたので軽く調べています。とりあえずコンパイルは Raspberry Pi 4 より Jetson Nano の方が速いです。

関連ページ
HYPERでんち: Compile Benchmark

関連エントリ
Android: UserLAnd + Termux を Note PC 代わりに使う
Jetson Nano で TensorFlow の C 言語 API を使う
Jetson Nano / Clang の Version とコンパイル速度の比較
Oculus Quest も文章書き&開発マシンにする
Snapdragon 835 と 845 のコンパイル時間の比較&浮動小数点演算能力
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd
ARM CPU 上の開発環境とコンパイル時間の比較


VR
oga at 23:01
Oculus Quest が PC 接続に対応しました。まだベータですが、Oculus Quest で PC 向けの VR ゲームも遊べるようになります。

Oculus Questスタートガイド。

使い方は上のページから「Oculus Questヘッドセットを設定するにはどうすればよいですか。」→「Oculus LinkでQuestを設定する」の順で開くと出てきます。

Oculus Quest は 6.6DoF、頭と両手合わせて合計自由度 18 に対応しつつ完全ワイヤレス化を実現した VR HMD です。外部のセンサー設置も不要で準備いらず。ルームスケール対応の本格的な VR ゲームができるのに充電して電源を入れるだけ。携帯ゲーム機のような手軽さが魅力の一体型 VR です。

ただし Platform は Android ベースの独自のもので、Quest 対応ソフトしかプレイできませんでした。Oculus Go/GearVR との互換性もなかったのですが、この辺りは徐々に解消されつつあるようです。

さらに Oculus Link 機能によってハイエンド系 VR ゲームもプレイできるようになります。つまり PC とケーブルがあれば Oculus Quest が Oculus Rift/Oculus Rift S の代わりになりるわけです。

まだ専用の Oculus Link ケーブルが発売されていないので、β版を試すには USBケーブルが必要です。

OculsuQuest

↑推奨のケーブル (Anker USB 3.0 3m) を使用しています。

専用ケーブルではないのでコネクタが斜め前方に飛び出して少々じゃまになりがち。ケーブルを引っ張ると簡単に抜けてしまうので写真ではベルトで止めています。

使い方は Oculus Rift と同じです。予め PC 側で Oculus アプリをインストールしておくと、接続時に Quest を認識します。Quest 側にダイアログが出るので許可すれば OK です。

Oculus LInk

Oculus Store で Rift 向けアプリがプレイできますし、そのまま SteamVR を起動すれば Steam の VR ゲームも動きました。

SteamVR

特に遅延なども見られず遜色ない動きです。使用した PC は Ryzen 7 1800X + GeForce RTX 2070 SUPER。モバイルも据え置きもこれ一台。今お勧めできるデバイスを選ぶとしたら Quest 一択になりそうです。


関連エントリ
Oculus Quest 5万円ちょうどで買えるフルスペック VR
Oculus Quest も文章書き&開発マシンにする
Android/Oculus Go/Daydream の画面をミラーリングするツールを作ってみた
Oculus Go で一般 Android アプリを起動できるランチャーを作ってみた
VR で物が大きく見えたり小さく見えたりするわけ
Oculus Go は VR ができる新しい携帯ゲーム機


外出時のちょっとしたメモ取りやドキュメントのまとめ作業で Note PC の代わりに使っています。

UserLAnd + Termux

以前も触れていますが、UserLAnd 経由で Termux を使用しています。UserLAnd だけでなく Termux を併用している理由はいくつかあります。

◎Termux を使う理由

・proot オーバーヘッドが無いのでファイルアクセスが高速
・Mercurial が安定して動く (UserLAnd は HardLink を使うソフトで問題が出やすい)
・Termux 内のファイルを Android 側から直接アクセスできる

◎UserLand を使う理由

・mozc による日本語入力が可能
・Window (Desktop) 環境が使える
・Android 9 以降で Ctrl+SPACE を入力できない問題の回避 (xmodmap)

Termux で ssh サーバーを起動する方法

$ pkg up
$ pkg install openssh
$ passwd
  <ログインパスワードを設定>
$ sshd

UserLAnd から Termux にログインする方法

$ ssh localhost -p 8022
  <ログインパスワードを入力>

UserLAnd に日本語入力環境を構築する方法や Ctrl+SPACE 問題については下記を参照してください。なお Android 10 (Q) も Android 9 (Pie) 同様 Ctrl + SPACE の入力ができませんでした。

HYPERでんち: LserLAnd
UserLAnd : Android 9.0 で Ctrl + SPACE を使えるようにする
Android Termux で日本語入力を行う / UserLAnd との併用


●PC との同期

データの管理に git や mercurial のリポジトリを使用しているので、PC からも直接同期することができます。

Termux で持ち運べるモバイルリポジトリを作る Mercurial/Git

sshd を起動しておけば PC 側から「git ssh://~」や「hg ssh://~」で直接同期できます。

同期のタイミングでは UserLAnd 不要で Termux 上で sshd が動いていれば OK です。ファイルの転送だけなら scp (WinSCP 等) も使えます。


●クラウドへの転送

PC を経由せずに他のスマートフォンやタブレットにファイルを転送する場合は、Android の「ファイル」アプリが使えます。Termux 内のファイルが見えるので、直接 Google Drive や One Drive 等への転送ができます。

File App

「ファイル」アプリを使う場合は特に sshd が動いている必要はありません。


●共有ストレージの扱い

Android 10 から共有ストレージの仕様が変更されています。"/sdcard" (という名の内部共有ストレージ) は以前のような無制限なアクセスができなくなっています。代わりに「ファイル」アプリを使って、それぞれアプリケーション毎の個別領域にアクセスすることができます。

UserLAnd の場合は少々特殊で、ファイル毎のメタ情報があるので proot を通さずにファイル操作を行うと関連付けが壊れる可能性があります。そのため「ファイル」アプリから共有可能な別の領域「/storage/internal」が用意されています。ここは proot の管理対象外です。必要なデータを /storage/~ に転送しておけば「ファイル」アプリから見えますし、逆に Android から UserLAnd への転送にも使えます。

UserLAnd: Importing and exporting files in UserLAnd

termux の場合特に問題がないので、「ファイル」アプリから Home ディレクトリがそのまま見えるようになっています。


●UserLAnd でブラウザ

UserLAnd の Ubuntu 上でも Firefox が動くようになっています。以前は真っ暗な画面のままでした。下記ページの手順に従い firefox-esr を install します。

FAQ: Installing Firefox on Ubuntu


●Termux で Mercurial

若干パッケージに変更があったようで python2-dev が不要となりました。下記の手順で install できます。

$ pkg up
$ pkg install python2 clang
$ pip2 install mercurial

No more -dev packages


●実際に使用して速度面など

コンパイル速度の比較を見てわかるように、ハイエンドスマートフォンは基礎的な性能面で Note PC と殆ど変わらなくなっています。Atom 系や旧型 PC よりパフォーマンスは上です。

ただし UserLAnd 上では性能を体感できなくなっており、快適度では PC に大きく劣ります。

・proot のオーバーヘッドで数倍遅い
・GPU 非対応なので Desktop などの GUI は全体的に描画が遅い

機種ごとの差も結構あります。以前テストしたミドルクラスのスマートフォンで SoC のスペック通りのパフォーマンスが出ないことがありました。Android 上では動作も軽く何の問題もないのですが、CPU のピーク clock が抑えられているのか Termux 上でのコンパイルに予想の数倍時間がかかりました。

また速度面ではありませんが、OS がカスタマイズされており物理キーボードのキーマップが変更できないものもあります。

お勧めはできるだけカスタマイズされていないハイエンド系となります。Snapdragon 835, 845, 855 など。

良い点は荷物が増えないこと。(Bluetooth キーボードやマウスは別として) またスマートフォンなので Sleep や復帰が安定しており信頼できる点が魅力です。


関連ページ
HYPERでんち: LserLAnd
HYPERでんち: Termux

関連エントリ
Oculus Quest も文章書き&開発マシンにする
UserLAnd : Android 9.0 で Ctrl + SPACE を使えるようにする
Android Termux で日本語入力を行う / UserLAnd との併用
Termux で持ち運べるモバイルリポジトリを作る Mercurial/Git


| 次のページ(日付が古い方向)>>