2018年4月24日火曜日

android上でkerasを動かす:CNTK編

[概要]
androidのArchLinux上でCNTKバックエンドのkerasを動作させる。

[詳細]
TermuxArch環境は準備しておく。OpenBLASなども。
詳細は下記の記事参照
http://oregaji.blogspot.jp/2018/04/androidkeras2018415.html?m=1

CNTKをビルドする。
ビルドは下記に従う。
https://docs.microsoft.com/en-us/cognitive-toolkit/Setup-CNTK-on-Linux#quick-test-of-cntk-build-functionality

pacmanでprotobufを入れても
libprotobuf.aは無かったので
configureの該当箇所ををlibprotobuf.soに修正

> pacman -S swig
> mkdir -p build/release
> cd build/release
> ../../configure --with-openblas=/usr/local --with-swig --with-py36-path

MakefileのSSE_FLAGS = -msse4.1 -mssse3はSSE_FLAGS = のように空にしとく。
sys/io.hが無いとかエラーが出たらsys/uio.hとかに書き換えてみる。
なぜかMultiversoが失敗したので、Multiversoだけ手動でcmake, make, make installして、cntkのMakefileからMultiversoの箇所をコメントアウトして進めた。

make instadellが無いのでビルドしたbin以下の
cntk
cntk.core.bs
を/usr/local/bin/にコピー。
ビルドしたlib以下を/usr/local/libにコピー。

実行時なぜかlibmpi.so.12が無いとエラーが出るので、下記のようにシンボリックリンクを作成する。
ln -s /usr/lib/openmpi/libmpi.so /usr/lib/openmpi/libmpi.so.12

> cd CNTK/bindins/python
> python setup.py install

~/.keras/keras.jsonを
"backend": "cntk"
に変更。

-kerasのサンプルで
> python mnist_cnn.py
が動いたら成功っぽいです。
手元のスマホ(年末のハイエンドスマホ)では1 epochは予測33分と出ました。mxnetバックエンドのほうが早い...

2018年4月23日月曜日

TermuxArch Tips

[ps, top commands]
-At Android 8.0, ps and top commands are not available, because /proc/stat is not permissive.
Alternatively /system/bin/ps and /system/bin/top commands are available some devices.
-Modify /data/data/com.termux/files/usr/bin/startarch like the follows and add proot args "-b /system/" to mount android /system directory to TermuxArch /system.

exec proot --kill-on-exit --link2symlink -0 -r /data/data/com.termux/files/home/arch -b $ANDROID_DATA -b /dev/ -b $EXTERNAL_STORAGE -b $HOME -b /proc/ -b /storage/ -b /sys/ -b /system/ -b /vendor/ -w "$PWD" /usr/bin/env -i HOME=/root TERM=xterm-256color /bin/bash -l

[sshd]
- sshdはTermuxArchでは失敗するのでTermuxで実行する。Termuxで証明書ログインしたあとstartarchしてTermuxArchを使う。ちなみにパスワードログインはできない。

TermuxArchの小ネタ

[ps, topコマンド]
-android 8.0から/proc/statが使えないため、ps, topが使えない。端末によっては/system/bin/以下のps, topが使える。
-/systemをマウントするには、/data/data/com.termux/files/usr/bin/startarchを変更しprootの引数に-b /system/ を追加する。
例: exec proot --kill-on-exit --link2symlink -0 -r /data/data/com.termux/files/home/arch -b $ANDROID_DATA -b /dev/ -b $EXTERNAL_STORAGE -b $HOME -b /proc/ -b /storage/ -b /sys/ -b /system/ -b /vendor/ -w "$PWD" /usr/bin/env -i HOME=/root TERM=xterm-256color /bin/bash -l

[sshd]
- sshdはTermuxArch側では失敗するのでTermux側で実行する。Termuxで証明書ログインしたあとstartarchしてTermuxArchを使う。ちなみにパスワードログインはできない。

2018年4月15日日曜日

How to create Keras development environment on Android at April 2018.

[Abstract]
Creating Keras development environment in order to develop Deep Learning anytime, anywhere.

[Conclusion]
-This environment is too slow to learn data firmly, but this is useful to try tiny Keras code quickly.
-It's useful to be available full Linux distribution on the smartphone.
-Perfect development environment while sleeping in the bedroom have been constructed! :-)

[Install procedure]
-Install Termux from Google Play.
-Install Hacker's keyboard from Google Play too.
-Install ArchLinux via TermuxArch (https://sdrausty.github.io/TermuxArch/)
(-Install yaourt) *optional (https://wiki.archlinux.jp/index.php/Yaourt)
-Build and install OpenBLAS. (https://github.com/xianyi/OpenBLAS)
-Build and install mxnet. (https://github.com/apache/incubator-mxnet)
-Install latest version keras which support mxnet_backend.

[Difficult points of install]
-In some device, "proot" of termux apt-get causes error on execute. So get termux/proot from github and build from source and install. Then success.
-ArchLinux on TermuxArch works on user privilege in proot file system container. So, some command which require real root privilege will be failed.
-Server URL for yaourt AUR in /etc/pacman.conf must be
Server = http://repo.archlinux.fr/arm
not
Server = http://repo.archlinux.fr/$arch
-fix /usr/bin/makepkg as https://github.com/sdrausty/TermuxArch/issues/38. Then yaourt is available.

-Build and install OpenBLAS from source.
-Use make command for building OpenBLAS, not use cmake command.

-Add link path and include path like followings.
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
export LIBRARY_PATH=$LD_LIBRARY_PATH
export CPATH=/usr/local/include:$CPATH

-Install openmp and others via pacman -S command before building mxnet.
-Use "git clone --recursive" to get mxnet source code.
-Use cmake command for building mxnet.
-Fix CMakeLists.txt. add the following line just under add_library(mxnet_static STATIC ${SOURCE}).
   set_property(TARGET mxnet_static PROPERTY POSITION_INDEPENDENT_CODE ON)
Shared library works well by this.
-Use clang for building mxnet. gcc causes halt on compling some place of code.
-Use clang by the following.
> cmake -C ~/use-clang.cmake ..
~/use-clang.cmake is like followings:
set(CMAKE_C_COMPILER "/usr/bin/clang" CACHE string "clang compiler" FORCE)
set(CMAKE_CXX_COMPILER "/usr/bin/clang++" CACHE string "clang++ compiler" FORCE)
set(CMAKE_ASM_COMPILER "/usr/bin/clang")
#set(CMAKE_SYSTEM_PROCESSOR "aarch64")

-At building mxnet, do follow commands.
> cmake -C ~/use-clang.cmake ..
> ccmake -C ~/use-clang.cmake ..
-In ccmake command, turn off build sample, cuda related, mkl related, atlas, gperftools(tcmalloc), jemalloc, opencv, sse.
-Turn BUILD_SHARED on.
-Set BLAS=Open.
-Press "c" after setting ccmake.
> cmake -C ~/use-clang.cmake ..
> make -j 4
-It takes about 20 minites to build mxnet.
> make install
> mv /usr/local/lib64/libmxnet.a /usr/local/lib/
> mv /usr/local/lib64/libmxnet.so /usr/local/lib/

-In python3, install cython, setuptools, keras(keras_mxnet==2.1.5b3 latest version which support keras2_mxnet_backend) and others via pip command.
> cd python/
> python setup.py install

- Do git clone keras.
> cd keras/keras/example
> python mnist_cnn.py
If it works well, keras installation success!
In my 2017 high-end smartphone, It takes 24 minites per 1 epoch.

android上でkeras開発環境を構築するまでの長い道程(2018/4/15時点)

[概要]
いつでもどこでもディープラーニングの開発をできるようにするため、androidスマホ上にkeras開発環境を構築します。

[結論]
-ちゃんと学習させるには遅すぎるが、コードをちょっと試すには便利。
-スマホでフルのLinuxディストリビーションが使えるのは便利。
-寝ながら開発&寝落ちが実用的にできる環境が構築できた!

[手順]
-Google playでTermuxをインストール
-Google playでHacker's keyboardもインストール
-TermuxArchでArchLinuxをインストール(https://sdrausty.github.io/TermuxArch/)
(-yaourtをインストール) (https://wiki.archlinux.jp/index.php/Yaourt)
-OpenBLASをビルドしてインストール (https://github.com/xianyi/OpenBLAS)
-mxnetをビルドしてインストール(https://github.com/apache/incubator-mxnet)
-keras(mxnet_backendが使える最新版)をインストール

[以下ハマりポイント(多数)]
-prootはapt-getのものではなぜか失敗する端末がある。termux/prootをgithubから取ってきて自分でビルドし直しインストールすると成功
-TermuxArchのArchLinuxはproot内で一般ユーザー権限で動いているだけなので注意が必要。root権限は取れたふりをしているだけで実際はただの一般ユーザー。
-/etc/pacman.confの最後に追加するAUR frのURLの末尾は/$archは失敗するので/armに変更する。
-‎makepkgはrootとfakerootで失敗する。termuxarchのスクリプトで修正可能っぽい。yaourtも使えた。(自分は/usr/bin/makepkgを手動で同じように修正したら使えた。)

-openblasはyaourtで取れるAURのものは失敗するので、結局自分でビルドする必要がある。
-openblasはcmakeがまだ安定していないようなので、トップディレクトリでmakeでビルドする。
-リンクパス、インクルードパスは
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
export LIBRARY_PATH=$LD_LIBRARY_PATH
export CPATH=/usr/local/include:$CPATH
などして追加しておく。

-mxnetビルド前に、openmpなどはpacman -Sでインストールしておく。
-mxnetはgit clone --recursiveで取得する。
-mxnetはcmakeを使う。素のmakeだと失敗した。
-mxnetではCMakefile.txt を修正しておく。mxnet_staticのadd_library()の直下に下記を追加する。
set_property(TARGET mxnet_static PROPERTY POSITION_INDEPENDENT_CODE ON)
ビルド時の-fPICワーニングが消え、動的リンクができるようになる。
-mxnetはgccでビルドするとなぜか必ずgccが落ちる箇所があるのでclangでビルドする。
> cmake -C ~/use-clang.cmake ..
のように下記のuse-clang.cmakeを読み込んでclangを使う。
set(CMAKE_C_COMPILER "/usr/bin/clang" CACHE string "clang compiler" FORCE)
set(CMAKE_CXX_COMPILER "/usr/bin/clang++" CACHE string "clang++ compiler" FORCE)
set(CMAKE_ASM_COMPILER "/usr/bin/clang")
#set(CMAKE_SYSTEM_PROCESSOR "aarch64")

-mxnetビルドでは
> cmake -C ~/use-clang.cmake ..
> ccmake -C ~/use-clang.cmake ..
> ccmakeを使い、build sample, cuda関連, mkl関連, atlas, gperftools(tcmalloc), jemalloc, opencv, sseは外す。
設定変更したあとcを押して反映させるとBLASの設定がでるのでOpenにしとく。BUILD_SHAREDもONにしとく。
(gperftoolsは実行時にtcmalloc errorがでる。jemallocも失敗する。opencvはテストのビルドでgtkとかx11のリンクエラーがでる。)
> cmake -C ~/use-clang.cmake ..
> make -j 4
20分程度ビルドにかかる。
make -j 8にすると端末が不安定になる気がする。

make install するとなぜか /usr/local/lib64 に配置されるので
mv /usr/local/lib64/libmxnet.a /usr/local/lib/
mv /usr/local/lib64/libmxnet.so /usr/local/lib/
で移動。

-python3でcython, setuptools, keras(keras_mxnet==2.1.5b3などmxnet_keras2_backend対応した新しいバージョンのもの)とかはpipでインストールしておく。
-mxnetのpython/ディレクトリで
> python setup.py install
する。

- kerasのサンプルで
> python mnist_cnn.py
が動いたら成功っぽいです。
手元のスマホ(年末のハイエンドスマホ)では1 epochは実測24分(予測18分)と出ました。

2015年3月10日火曜日

新MacBookのたった一つのUSBとAppleのポリシー

新MacBookに驚いた。
薄いとか軽いとかRetinaとかUSB3.1 TYPE-C電源とかは予想通りだったのですが、

いちばん驚いたのは外部インターフェースのUSBが一つしか無いことです。
電源を含めたら実質空いているものが一つも無い状態です。
普通の企画担当者なら最低2つはつける所を1つのみ!
これにはAppleの明確なポリシーみたいなものを感じます。

最近はiPhoneのiTunes連携や画面の共有もWi-Fiで行えるのでUSBが必須という状況は実はほとんどないのです。

ただそれをポリシーをもって主力商品に採用して全ユーザーに強要させられるAppleはすごい組織です。

VulkanとSPIR-VとGPGPU

次期OpenGLとして予告されていたVulkanがGDC2015でついに発表されました。

噂されていたようにMantle, DirectX12と似た現代のGPUにあわせたCPUオーバーヘッドの小さい薄いAPIとなるのは予想通りだったのですが、プログラミング言語環境と実行フレームワークに少し度肝を抜かれました。

その肝はVulkanと同時に発表されたSPIR-Vです。
VulkanでもGPUでのプログラム実行には従来からのシェーダー言語であるGLSLの拡張版がつかわれますが、今回からは事前コンパイルしてバイナリ中間コード化して使えます。
このバイナリ中間コードにつかわれるのがSPIR-Vです。
実態はLLVM-IRの拡張型ですが、
LLVMと同じようにフロントエンド言語に様々なものが選べます。
GLSLシェーダー言語以外にもやはり時同じくして発表されたOpenCL2.1などにも対応しています。
SPIR-VのようなGPU実行フレームワークが策定されたことで今後GPGPUの普及が促進されることに超期待しています。