Caffe

1.はじめに

Caffeとはディープラーニングフレームワークの一種です。
開発はBerkeley AI Research (BAIR)/The Berkeley Vision and Learning Center (BVLC)とコミュニティによって行われています。CaffeはBDS 2-Clause licenseでリリースされています。
BVLCによるCaffeはバージョン1.0(現状最新)が2017年4月19日にリリースされていますが、
2017年にBVLCのCaffeからフォークされたNVIDIA社によるCaffe(NVCaffe)がリリースされています。
NV-Caffeは16ビット(半精度)の浮動小数点演算によるトレーニングと推論がサポートされ、NVIDIAが公開しているcuDNNとも統合されており様々な追加機能を利用できます。本サイトではNV-Caffeが利用できます。

DDBJ スパコンではmodule loadをすることで以下のバージョンが利用できます。

2.使用可能なバージョン

Caffe 0.17 environmental modulesの配下

利用可能なノード/キュー

login_gpu.q(Intel+Volta)
gpu.q(Intel+Volta)

3.(参考)外部ドキュメント

Caffe公式ページ
http://caffe.berkeleyvision.org/

Caffe githubページ
https://github.com/BVLC/caffe

Nvidia Caffe githubページ
https://github.com/NVIDIA/caffe

Nvidia Caffe User Guide
https://docs.nvidia.com/deeplearning/frameworks/caffe-user-guide/index.html

Caffeの詳細利用については、マニュアル等を参照してください。

4.使用方法

モジュールの内容確認

$ module show caffe
-------------------------------------------------------------------
/cm/shared/modulefiles/caffe/0.17:

module-whatis adds caffe-nv to your environment variables
module load cm-ml-pythondeps
module load cudnn/7.0
module load openblas
module load cuda91/toolkit
module load hdf5_18
module load nccl2
module load protobuf
module load opencv3
module load gcc5
prepend-path PATH /cm/shared/apps/caffe/0.17/bin
prepend-path LD_LIBRARY_PATH /cm/shared/apps/caffe/0.17/lib
append-path PYTHONPATH /cm/shared/apps/caffe/0.17/python
setenv CAFFE_ROOT /cm/shared/apps/caffe/0.17/

モジュールファイルの読み込み

$ module load caffe

Working Directoryの作成

$ mkdir nv-caffe
$ cd nv-caffe

gitからのClone

$ git clone https://github.com/NVIDIA/caffe

githubからダウンロードしたディレクトリに移動

$ cd caffe

テスト用データのダウンロード

$ bash data/mnist/get_mnist.sh

examples/mnist/create_mnist.sh をベースに改変する

$ cp examples/mnist/create_mnist.sh examples/mnist/create_mnist.edit.sh
$ vi examples/mnist/create_mnist.edit.sh

オリジナルは

#!/usr/bin/env sh
# This script converts the mnist data into lmdb/leveldb format,
# depending on the value assigned to $BACKEND.
<中略>
$BUILD/convert_mnist_data.bin $DATA/train-images-idx3-ubyte \
$DATA/train-labels-idx1-ubyte $EXAMPLE/mnist_train_${BACKEND} --backend=${BACKEND}
$BUILD/convert_mnist_data.bin $DATA/t10k-images-idx3-ubyte \
$DATA/t10k-labels-idx1-ubyte $EXAMPLE/mnist_test_${BACKEND} --backend=${BACKEND}

echo "Done."

改変後は

#!/usr/bin/env sh
# This script converts the mnist data into lmdb/leveldb format,
# depending on the value assigned to $BACKEND.
<中略>
##$BUILD/convert_mnist_data.bin $DATA/train-images-idx3-ubyte \ <- comment out
convert_mnist_data.bin $DATA/train-images-idx3-ubyte \
$DATA/train-labels-idx1-ubyte $EXAMPLE/mnist_train_${BACKEND} --backend=${BACKEND}
##$BUILD/convert_mnist_data.bin $DATA/t10k-images-idx3-ubyte \ <- comment out
convert_mnist_data.bin $DATA/t10k-images-idx3-ubyte \
$DATA/t10k-labels-idx1-ubyte $EXAMPLE/mnist_test_${BACKEND} --backend=${BACKEND}

echo "Done."

改変したシェルの実行

$ bash examples/mnist/create_mnist.edit.sh

トレーニング用のシェルの変更

examples/mnist/train_lenet.sh をベースに改変する

$ cp examples/mnist/train_lenet.sh examples/mnist/train_lenet.edit.sh
$ vi examples/mnist/train_lenet.edit.sh

オリジナル

#!/usr/bin/env sh

./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt

改変後

#!/usr/bin/env sh

caffe.bin train --solver=examples/mnist/lenet_solver.prototxt

改変したシェルの実行

$ bash examples/mnist/train_lenet.edit.sh

以下のようなコンソール上の表示が得られることを確認する。

<省略>
I0525 21:24:58.929373 26781 solver.cpp:481] Iteration 10000, loss = 0.000995909
I0525 21:24:58.929396 26781 solver.cpp:516] Iteration 10000, Testing net (#0)
I0525 21:24:58.985199 26884 data_reader.cpp:320] Restarting data pre-fetching
I0525 21:24:58.987820 26781 solver.cpp:602] Test net output #0: accuracy = 0.99
I0525 21:24:58.987848 26781 solver.cpp:602] Test net output #1: loss = 0.0278919 (* 1 = 0.0278919 loss)
I0525 21:24:58.987900 26781 caffe.cpp:264] Solver performance on device 0: 774 * 64 = 4.954e+04 img/sec (10000 itr in 12.92 sec)
I0525 21:24:58.987931 26781 caffe.cpp:267] Optimization Done in 25s

モジュールのUnload

$ module unload caffe

 以上