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の普及が促進されることに超期待しています。

2015年1月22日木曜日

HD, ウルトラHD, スーパーHD

世界的な家電展示会CES2015でパナソニックだ次世代Blu-rayの「Ultra HD Blu-ray」プレイヤーを参考出品しました。
解像度をこれまでの2Kから4Kまで高精細になりHDRでダイナミックレンジも広がり益々きれいになるようです。
ディスクの記憶容量を50GBから100GBに高めることでこれを実現しています。

むむっ!? 記憶容量が2倍になったって収まり切らないでしょ?だって映像は2次元だから2Kから4Kになったら帯域4倍使うでしょ! と気づいた方は鋭い。

映像コーデックにこれまでの2倍の効率のH.265 HEVCも使っているのです。

HD映像コーデックの歴史を見てみるとMPEG2に始まり2倍の効率のH.264、さらに2倍のH.265と進化を続けています。
H.264ができた当初は詰め込めるだけのアルゴリズムは詰め込んだ!もうこれ以上は無い!とまで言われていましたがそこからさらに2倍の効率を実現したとは驚きの限りです。きっとさらに複雑高度なアルゴリズムが追加されたのでしょう。(関係者曰わく単純にマクロブロックを大きくしたのが一番効いたという話はここだけの秘密です。)

ここまですごい映像技術が将来には地上波で皆さんのお宅に放送されるなんていう噂もありますが、(今の地上波はMPEG2の2Kだから、H.265使えば4K突っ込めちゃうね。おおっぅ。)
どうせなら地上波放送を画質そのままH.265にかえて使う電波帯域を4分の1に圧縮し、余った電波を携帯とかに回したほうがみんなしあわせになれるんじゃないかと...

Windows10の気になる二大特徴

Windows10が公式に発表されました。
色々な機能満載のようですがには下記の二つの機能に注目です。

●大型テレビからスマホまで同じOSで対応

Windows10では端末の画面サイズ、種別(PCやタブレットなど)によって異なるユーザーインターフェースを表示するようです。
これによって上は84型の超大型テレビから、下はスマホまで、一つのOSで対応ができるわけです。
世の中に1OSでここまで対応したものはまだなおので結構大変なことですね。
今までマイクロソフトはWindow for tablet, Windows Phone, Windows Media Centerなど端末毎別々のエディションを出してきて鬱陶しい上に互換性も微妙とういイケていない状況でしたが改善されそうです。
Windows7, 8からの無償アップグレードも期間限定ですが行われるようでエンドユーザーとしては最新機能を使えてメリットも大きいです。

マイクロソフトとしても古いOSのメンテナンスコストを下げて新しい機能やサービスに注力できるメリットがありそうです。
最近、開発ツールのVisual Studioも個人向けに無償提供始めてエディションを統一したり、Internet Explorerも最新版のみサポートにしたりと、ナデルCEOになってからのマイクロソフトは価値を産む新機能、新サービスに注力したい傾向がありそうです。
(AppleやGoogleなどの競合がいなければ、古い製品のサポートで大きな収益を上げていたのでしょうが。)

●3Dメガネ「HoloLens」

こういうモノはなかなかヒットしないけどドンドンやってほしいです。マイクロソフトが出した意義は大きい。業務用の特定分野ではイケるのでは。

2015年1月21日水曜日

新64bit CPU Snapdragon 820の噂

クアルコムの次期64bit CPUであるSnapdragon 820の情報がリークされたようです。
主な仕様は64bitオクタコアTS2コア。謎だらけのCPUコアですが、
弟分Snapdragon 815のコアがTS1iとTS1のbig.LITTLE構成なのが、TS2コアはそれだけでオクタコアを構成している模様。bigコアだけの8コアなのかも。クアルコムは32bitの独自コアKraitの頃はARMのbig.LITTLEコアを設計が悪いとさんざんバカにしていたので、64bitコア2代目のTS2で低消費電力低クロックのbigオンリー構成に目処がついたのかもしれないです。
GPUもAdreno530とこれまた謎だらけのチップですが時期的には大改造が予定されているOpenGL5.0に対応してほしいところ。競合のNvidiaがTegra X1で頑張ってきているのでこっちも頑張れ。
さてベースバンドの性能ですが、LTE-Aカテゴリー10対応MAX450Mbpsともはやなんだかわからんくらい高速になっています。月々3GBの通信プランなら1分かからず使い切れますよ!(理論値はいいから実効速度を速くしてくれキャリア様。)

このチップを載せたスマホがでる来年の今頃にはみんななかよくVoLTEでお話できたらいいな。(現実的なオチはこのくらいかと。)