2018年4月15日日曜日

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分)と出ました。

0 件のコメント:

コメントを投稿