月別アーカイブ: 2020年2月

Android UserLAnd で PyTorch を使う。C++ API

Android スマートフォンの上に PyTorch の開発環境を作ってみました。かなり遅いですが、電車の中で書いたコードのビルドテストをしたり、簡単な実験をするくらいには使えそうです。

以下作業メモです。

使用した端末は Essential Phone PH-1 (Snapdragon 835, RAM 4GB, Android 10)。もちろん C++ だけでなく Python からも使えます。

●UserLAnd の準備

UserLAnd を使うと Android 上に Linux 環境を作ることができます。root 不要でただの Android アプリとして動きます。今回は最小構成にするため Ubuntu + SSH Terminal を選択しました。

●PyTorch のビルド

UserLAnd の Ubuntu を起動し Terminal で作業します。または PC 等から ssh で接続することもできます。

先に更新しておきます。

$ sudo apt update
$ sudo apt upgrade -y

必要なソフトのインストール

$ sudo apt install  git cmake g++
$ sudo apt install  libopenblas-dev

Python3 の準備

$ sudo apt install  python3-dev python3-setuptools
$ sudo apt install  python3-numpy python3-cffi
$ sudo apt install  python3-yaml python3-wheel

pytorch の準備。展開フォルダは仮に ~/pytorch とします。

$ cd
$ git clone --recursive https://github.com/pytorch/pytorch
$ cd pytorch
$ git submodule sync
$ git submodule update --init --recursive

ビルドします。複数スレッド使うとメモリ不足で落ちるので MAX_JOBS=1 を指定します。

$ cd ~/pytorch
$ USE_CUDA=0 USE_CUDNN=0 BUILD_TEST=0 USE_MKLDNN=0 USE_DISTRIBUTED=0 MAX_JOBS=1 python3 setup.py build_clib

Python 向けにビルドする場合は最後の “build_clib” を “install” にしてください。

かなり時間がかかるので電源に接続したまましばらく待ちます。

もし途中で↓のようなエラーが出た場合はコードを一部修正します。

... 8x8-dq-aarch64-neon.S:662: Error: operand mismatch -- `mov V8.4s,V9.4s'

“aten/src/ATen/native/quantized/cpu/qnnpack/src/q8gemm/8×8-dq-aarch64-neon.S” の 662行~669行あたりにある

    MOV V8.4s, V9.4s
    MOV v10.4s, v11.4s
    MOV v12.4s, V13.4s
    MOV V14.4s, V15.4s
    MOV V16.4s, V17.4s
    MOV V18.4s, V19.4s
    MOV V20.4s, V21.4s
    MOV V22.4s, V23.4s

これらの行を下のように変更します。

    MOV V8.16b, V9.16b
    MOV v10.16b, v11.16b
    MOV v12.16b, V13.16b
    MOV V14.16b, V15.16b
    MOV V16.16b, V17.16b
    MOV V18.16b, V19.16b
    MOV V20.16b, V21.16b
    MOV V22.16b, V23.16b

AArch64 の NEON にはもともとレジスタ同士の move 命令がありません。mov vdest, vsrc はアセンブラ内部で「 or vdest, vsrc, vsrc 」に置き換えられます。浮動小数点数で論理演算はできないので、アセンブラによっては 4s (単精度 32bit x4 = 128bit) の型指定がエラーになってしまうのだと考えられます。これは 16b (byte 8bit x16 = 128bit) に変更すれば OK です。

● C++ から利用する

前回も書いたように ~/pytorch/torch 以下が libtorch 相当になります。

include path に

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

link path に

~/pytorch/torch/lib

を指定してコンパイルします。必要なライブラリは libc10 と libtorch_cpu です。コンパイルオプションの指定例は下記の通り。

$ clang -L~/pytorch/torch/lib -lc10 -ltorch_cpu  torchtest.cpp -o torchtest

実行時は LD_LIBRARY_PATH が必要です。

$ export LD_LIBRARY_PATH=~/pytorch/torch/lib

一度ビルドしておけば他の AArch64 Android の UserLAnd 上でも使えます。Raspberry Pi 4 の Ubuntu Server (AArch64) でも動きました。

● Python で使う

Python の場合は “build_clib” の代わりに “install” を使います。途中でエラーが出ますが問題ありません。(“bdist_wheel” は途中で止まるので保留中)

$ USE_CUDA=0 USE_CUDNN=0 BUILD_TEST=0 USE_MKLDNN=0 USE_DISTRIBUTED=0 MAX_JOBS=1 python3 setup.py install

これで import torch できるようになります。torchvision が必要な場合も同じようにビルドしておきます。

$ sudo apt install zlib1g-dev libjpeg-dev
$ git clone https://github.com/pytorch/vision.git
$ cd vision
$ MAX_JOBS=1 python3 setup.py install

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

関連エントリ
RADEON (ROCm) で PyTorch を使う。C++ API
Jetson Nano で TensorFlow の C 言語 API を使う
Android UserLAnd の更新と VNC 画面設定
UserLAnd : Android 9.0 で Ctrl + SPACE を使えるようにする
Android Termux で日本語入力を行う / UserLAnd との併用
Android 9.0 と Bluetooth Keyboard による日本語入力
Android で動く Linux 環境 UserLAnd が XServer XSDL に対応
Oculus Go を文章書き&開発マシンにする
UserLAnd とブラウザ
Android 上の開発環境と UserLAnd
OS の中の Linux (WSL/Chrome OS/Android UserLAnd)
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd