caffeをubuntu16.04のVirtualBoxにインストールする

#0 初めに
caffeは今、機械学習の主流のframeworkになっているが、virtualboxにインストールするのはなかなか難しい。virtualboxはGPUをサポートしてないらしい。でも、どうしてもvirtualboxに入れて自由に遊んで見たいからやって見るしかない。
#1 対象のOS
cent os、ubuntuなどいくつ試したが、Ubuntu 16.04 LTS を選択。ネットを調べるとほとんどが、ubuntuをベースにしている。下記のサイトからダウンロードできる。
http://www.osboxes.org/category/ubuntu/

バージョンがいろいろあるが、16.04を選択。
#2 CUDAをインストールしない
caffeのサイトを見るとCUDAのインストールが必須のように見える。でもCPUモードでは実際CUDAがなくても、caffeオフィシャル提供のexampleを実行できる。virtualboxにcaffeを入れる時、一番の問題はGPUがないことなので、CUDAを割愛するしかない。CUDAを手順通りにインストールして見たが、結局動かなかった。

![image](https://qiita-image-store.s3.amazonaws.com/0/156797/4ab4f92a-14b2-73b5-6c11-b526ed20fd13.png)

#3 Guest Additionをインストール
virtualboxのデバイスメニューから簡単にインストールできる。まさにubuntuの素晴らしいところ。![image](https://qiita-image-store.s3.amazonaws.com/0/156797/2b2f3747-17e7-f462-cfe3-fa868b0f87c3.png)

#4 caffeをインストール
##4.1 必要なパッケージをインストール
ここはcaffeのdockerファイルを参考。(https://github.com/BVLC/caffe/blob/master/docker/standalone/cpu/Dockerfile)

sudoコマンドでうまく行かない場合は、sudo su でルートユーザになって実行する

`apt-get update && apt-get install -y --no-install-recommends \
        build-essential \
        cmake \
        git \
        wget \
        libatlas-base-dev \
        libboost-all-dev \
        libgflags-dev \
        libgoogle-glog-dev \
        libhdf5-serial-dev \
        libleveldb-dev \
        liblmdb-dev \
        libopencv-dev \
        libprotobuf-dev \
        libsnappy-dev \
        protobuf-compiler \
        python-dev \
        python-numpy \
        python-pip \
        python-scipy && \
        rm -rf /var/lib/apt/lists/*`


実行すると、下記のlockエラーが発生することがある。
E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)

いろいろ調べたが、lockを削除する方法で問題解決。
`osboxes@osboxes:~$ sudo rm /var/lib/apt/lists/lock
osboxes@osboxes:~$ sudo rm /var/cache/apt/archives/lock
osboxes@osboxes:~$ sudo rm /var/lib/dpkg/lock`

このサイトを参考（http://askubuntu.com/questions/15433/unable-to-lock-the-administration-directory-var-lib-dpkg-is-another-process）
やばい方法だと書いてあるが、仕方ない。
lockを削除して再度パッケージをインストールしてOK. パッケージが多いので、実行には時間がかかる。
##4.2 caffe本体のインストール
caffeはgithubから持ってきて、コンパイルする。
4.2.1 環境変数を設定
caffeのdockerファイルを参考。(https://github.com/BVLC/caffe/blob/master/docker/standalone/cpu/Dockerfile)
ホームフォルダーで実行。bashの環境変数設定。
`root@osboxes:/home/osboxes# CAFFE_ROOT=/opt/caffe
root@osboxes:/home/osboxes# CLONE_TAG=master`
4.2.2 githubからソースを取得
`git clone -b ${CLONE_TAG} --depth 1 https://github.com/BVLC/caffe.git`
4.2.3 pythonの必要な設定とcaffeのビルド
上記ダウンロードしたcaffeのフォルダーに移動して実行する。 
`root@osboxes:/home/osboxes/caffe# for req in $(cat   
python/requirements.txt) pydot; do pip install $req; done && \
mkdir build && cd build && \
cmake -DCPU_ONLY=1 .. && \
make -j"$(nproc)"`
    
これまた時間がかかる。一気にcaffeのビルドまで行う。下記のメッセージが出ればOK.
![image](https://qiita-image-store.s3.amazonaws.com/0/156797/f16d6974-4104-8d92-1cd5-f70fe9f25e76.png)

4.2.4 caffeの環境変数の設定
`root@osboxes:/home/osboxes/caffe/build# PYCAFFE_ROOT=\$CAFFE_ROOT/python   
root@osboxes:/home/osboxes/caffe/build#PYTHONPATH=\$PYCAFFE_ROOT:\$PYTHONPATH   root@osboxes:/home/osboxes/caffe/build#PATH=\$CAFFE_ROOT/build/tools:\$PYCAFFE_ROOT:$PATH
root@osboxes:/home/osboxes/caffe/build# echo "$CAFFE_ROOT/build/lib" >> /etc/ld.so.conf.d/caffe.conf && ldconfig`
    


これで、caffe本体のインストールは完了であるが、まだjupyterのインストールが残っている。caffeのexampleはnotebookなので、jupyterのインストールが必要になる。

##4.3 jupyterをインストール
基本的にルート権限でインストールする。
ここを参考(https://github.com/kyamagu/caffe-docker/blob/master/docker/jupyter/Dockerfile)
4.3.1 pipをインストール
`sudo wget https://bootstrap.pypa.io/get-pip.py && \`
`python get-pip.py && \`
`rm get-pip.py`

4.3.2 jupyter本体をインストール
`sudo pip --no-cache-dir install ipykernel jupyter matplotlib sklearn hmmlearn && python -m ipykernel.kernelspec`
4.3.3 scikit-imageをインストール
なぜかこのパッケージが入ってなかったので追加。
`sudo pip install scikit-image`
4.3.4 tiniをインストール
tiniをインストールしなくてもjupyterは動くが、dockerファイルにあったのでとりあえずインストール。
`root@osboxes:/home/osboxes# wget https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini`
`root@osboxes:/home/osboxes# cp tini /usr/bin/tini`

#5 caffeのexampleを試す
##5.1 jupyterを立ち上げる
`root@osboxes:/home/osboxes# jupyter notebook`

実行するとfirefoxが立ち上がってcaffeのフォルダーが見れる。
![image](https://qiita-image-store.s3.amazonaws.com/0/156797/b39130a2-20ab-8eb5-3548-15dbfb4df25c.png)
##5.2 exampleのnotebookを開く
![image](https://qiita-image-store.s3.amazonaws.com/0/156797/591df0ce-d260-0a58-096c-f2f41ae90fc9.png)

ctrl+enterを押して、notebookを実行して見る。
![image](https://qiita-image-store.s3.amazonaws.com/0/156797/c92bf9d4-189a-4146-c906-8cae7d6a81fe.png)

#6 結語
以上で、virtualboxでcaffeのインストールが完了となる。ポイントはCUDAをインストールしないこどである。caffeのdockerファイルが意外な情報を提供している。