FrontPage

cuda and chainer on centos7

1. CUDAの導入

   https://developer.nvidia.com/cuda-downloadsから、cuda_8.0.44_linux.runをダウンロードする(事前にユーザ登録しておくこと、Linux、X86_64、CentOS、7、runfile(local)を選択)
   sudo init 3でXサーバを停止する
   再ログインして、sudo sh cuda_8.0.44_linux.run、入力するパラメータはデフォルトのまま
   sudo rebootで再起動
   再ログインして、.bash_profileに以下を追加し、source .bash_profile

CUDA_ROOT_DIR="/usr/local/cuda-8.0"
export CUDA_ROOT_DIR
PATH="$PATH:${CUDA_ROOT_DIR}/bin"
export PATH
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${CUDA_ROOT_DIR}/lib64/"
export LD_LIBRARY_PATH

2. CUDAのサンプルプログラムのコンパイル

   sudo yum install freeglut freeglut-devel(makeする際に、エラーが出たので左記を実施)
   cd ~/NVIDIA_CUDA-8.0_Samples/
   make
   bin/x86_64/linux/release/deviceQueryでGPUの情報を確認

3. cuDNNの導入

   https://developer.nvidia.com/cudnnより、cudnn-8.0-linux-x64-v5.1.tgzをダウンロード
   ダウンロード先のディレクトリにて、tar xvfz cudnn-8.0-linux-x64-v5.1.tgz
   cd cuda
   sudo cp lib64/libcudnn* /usr/local/cuda/lib64/
   sudo cp include/cudnn.h /usr/local/cuda/include

4. Chainerの導入

   su
   CUDA_PATH=/usr/local/cuda pip install chainer
   exit

5. Chainerの動作確認

   wget https://github.com/pfnet/chainer/archive/v1.16.0.tar.gz
   tar xzf v1.16.0.tar.gz
   [CUDAなしで実行] python chainer-1.16.0/examples/mnist/train_mnist.py
   [CUDAありで実行] python chainer-1.16.0/examples/mnist/train_mnist.py --gpu 0  (nvidia-smiで確認すると、グラフィックカードの電力消費が増えているのが分かる)

trial DL on OSX

$ brew install wget
CaffeをインストールしてないMacで試す
$ sudo pip install chainer --upgrade

 学習させるためにCaltech101をダウンロード、chainer_imagenet_toolsで加工

$ cd
$ git clone https://github.com/shi3z/chainer_imagenet_tools.git
$ cd chainer_imagenet_tools
$ wget http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz
$ tar xzvf 101_ObjectCategories.tar.gz
$ python make_train_data.py 101_ObjectCategories

 images、train.txt、test.txtが出来上がる  (256x256)に拡大縮小して認識させるためにcrop.pyを使って画像データを加工

$ mv images images_raw
$ mkdir images
$ python crop.py images_raw images

次にchainerをgit cloneしてexamplesにあるmodelzooに行き、諸々ダウンロード

$cd
$git clone https://github.com/pfnet/chainer.git
$cd chainer/examples/modelzoo
$python download_model.py googlenet
$python download_mean_file.py 

準備完了

bvlc_googlenet.caffemodel と、ilsvrc_2012_mean.npyが揃ったので、実際にCaffeのモデルであるbvlc_googlenet.caffemodelを使ってCaltech101を学習

$cp ~/chainer_imagenet_tools/train.txt .

3行分削る

$ python evaluate_caffe_net.py -B 100 train.txt googlenet bvlc_googlenet.caffemodel

Loading Caffe model file bvlc_googlenet.caffemodel... Loaded 100 / 6900

学習済みデータから画像分類をする

$ git clone https://github.com/BVLC/caffe.git
$ cd caffe/data/ilsvrc12
$ ./get_ilsvrc_aux.sh
$ ls
caffe_ilsvrc12.tar.gz		imagenet_mean.binaryproto	test.txt
det_synset_words.txt		synset_words.txt		train.txt
imagenet.bet.pickle		synsets.txt			val.txt
$ cd ~/chainer/examples/modelzoo
$ cp ~/caffe/data/ilsvrc12/synset_words.txt .
$ cat synset_words.txt |awk '{print $2;}' > labels.txt
$ cp ~/chainer_imagenet_tools/inspect_caffe_net.py  .
  • inspect_caffe_net.pyを作成
#!/usr/bin/env python
from __future__ import print_function
import argparse
import os
import sys
import random

import cv2
import numpy as np
from PIL import Image

import chainer
from chainer import cuda
import chainer.functions as F
from chainer.functions import caffe

parser = argparse.ArgumentParser(
   description='Evaluate a Caffe reference model on ILSVRC2012 dataset')
parser.add_argument('image', help='Path to inspection image file')

parser.add_argument('model_type', choices=('alexnet', 'caffenet', 'googlenet'),
                   help='Model type (alexnet, caffenet, googlenet)')
parser.add_argument('model', help='Path to the pretrained Caffe model')
parser.add_argument('--mean', '-m', default='ilsvrc_2012_mean.npy',
                   help='Path to the mean file')
parser.add_argument('--gpu', '-g', type=int, default=-1,
                   help='Zero-origin GPU ID (nevative value indicates CPU)')

args = parser.parse_args()

#Caffeモデルをロード
print('Loading Caffe model file %s...' % args.model, file=sys.stderr)
func = caffe.CaffeFunction(args.model)
print('Loaded', file=sys.stderr)
if args.gpu >= 0:
   cuda.init(args.gpu)
   func.to_gpu()

if args.model_type == 'alexnet' or args.model_type == 'caffenet':
   in_size = 227
   mean_image = np.load(args.mean)

   def forward(x, t):
       y, = func(inputs={'data': x}, outputs=['fc8'], train=False)
       return F.softmax_cross_entropy(y, t), F.accuracy(y, t)
   def predict(x): #推測関数
       y, = func(inputs={'data': x}, outputs=['fc8'], train=False)
       return F.softmax(y)
elif args.model_type == 'googlenet':
   in_size = 224
   # Constant mean over spatial pixels
   mean_image = np.ndarray((3, 256, 256), dtype=np.float32)
   mean_image[0] = 104
   mean_image[1] = 117
   mean_image[2] = 123

   def forward(x, t):
       y, = func(inputs={'data': x}, outputs=['loss3/classifier'],
                 disable=['loss1/ave_pool', 'loss2/ave_pool'],
                 train=False)
       return F.softmax_cross_entropy(y, t), F.accuracy(y, t)
   def predict(x): #推測関数
       y, = func(inputs={'data': x}, outputs=['loss3/classifier'],
                 disable=['loss1/ave_pool', 'loss2/ave_pool'],
                 train=False)
       return F.softmax(y)

cropwidth = 256 - in_size
start = cropwidth // 2
stop = start + in_size
mean_image = mean_image[:, start:stop, start:stop].copy()
target_shape = (256, 256)
output_side_length=256

#画像ファイルを読み込み
image = cv2.imread(args.image)

#比較可能なサイズにリサイズ&クロップ
height, width, depth = image.shape
new_height = output_side_length
new_width = output_side_length
if height > width:
 new_height = output_side_length * height / width
else:
 new_width = output_side_length * width / height
resized_img = cv2.resize(image, (new_width, new_height))
height_offset = (new_height - output_side_length) / 2
width_offset = (new_width - output_side_length) / 2
image= resized_img[height_offset:height_offset + output_side_length,
width_offset:width_offset + output_side_length]

#画像から平均画像を引く
image = image.transpose(2, 0, 1)
image = image[:, start:stop, start:stop].astype(np.float32)
image -= mean_image

x_batch = np.ndarray(
       (1, 3, in_size,in_size), dtype=np.float32)
x_batch[0]=image

if args.gpu >= 0:
 x_batch=cuda.to_gpu(x_batch)

#推測
x = chainer.Variable(x_batch, volatile=True)
score = predict(x)

if args.gpu >= 0:
 score=cuda.to_cpu(score.data)

#ラベルを読み込み
categories = np.loadtxt("labels.txt", str, delimiter="\t")
top_k = 20
prediction = zip(score.data[0].tolist(), categories)

#スコアが最も高いラベルからソートして表示
prediction.sort(cmp=lambda x, y: cmp(x[0], y[0]), reverse=True)
for rank, (score, name) in enumerate(prediction[:top_k], start=1):
   print('#%d | %s | %4.1f%%' % (rank, name, score * 100))

Caltech101のairplaneにある飛行機 http://i.gyazo.com/976bb7349bf31e7200439ae8d7cded3a.png

$cp ~/chainer_imagenet_tools/101_ObjectCategories/airplanes/image_0001.jpg .
$python inspect_caffe_net.py image_0001.jpg googlenet bvlc_googlenet.caffemodel
Loading Caffe model file bvlc_googlenet.caffemodel...
Loaded
#1 | airliner | 45.0%
#2 | speedboat | 11.8%
#3 | submarine, |  8.1%
#4 | projectile, |  7.6%
#5 | lakeside, |  7.4%
#6 | airship, |  6.0%
#7 | canoe |  4.8%
#8 | sandbar, |  1.7%
#9 | seashore, |  1.2%
#10 | missile |  0.8%
#11 | warplane, |  0.6%
#12 | barracouta, |  0.3%
#13 | promontory, |  0.3%
#14 | worm |  0.2%
#15 | platypus, |  0.2%
#16 | aircraft |  0.2%
#17 | solar |  0.2%
#18 | container |  0.2%
#19 | dugong, |  0.1%
#20 | killer |  0.1%

 airlinerが1位に出た。  これは正解!と言っていいんだよね。

 やーこれで認識・分類だけならMac(CUDAなし)でもできるようになったぞ。  こうすると遊びの幅も広がるよね

 しかしcaffemodelはデータがでかい。デカイだけにデータをロードするのに恐ろしく時間がかかる。  もっとPSYCHO-PASS的な、いーかんじの画像認識っぽい感じにしてみたい。

 ということでプログラムを追加 $python inspect_camera.py googlenet bvlc_googlenet.caffemodel  実行するとMacのWebカメラが立ち上がり、カメラに写ったものを認識

install cuda on OSX

  • .bashrc
    export PATH=/Developer/NVIDIA/CUDA-8.0/bin:$PATH
    export DYLD_LIBRARY_PATH=/Developer/NVIDIA/CUDA-7.5/lib:$DYLD_LIBRARY_PATH
  • .bash_profile
    if [ -f ~/.bashrc ]; then
            . ~/.bashrc
    fi

install opencv on OSX

$ brew update
$ brew install -v cmake
$ brew tap homebrew/science
$ brew install opencv
export PYTHONPATH="/usr/local/lib/python2.7/site-packages/:$PYTHONPATH"

install chainer on OSX

  • homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • and?
$ brew update
$ brew install python
$ which python
/usr/local/bin/python
pip install --upgrade pip
$ brew install pyenv
  • .bash_profile
    export PATH="/usr/local/Cellar/.pyenv/shims:$PATH"
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
  • install 2
    $ pyenv install anaconda2-4.2.0
  • install 3
    $ pyenv install anaconda3-4.2.0
  • check the version
    $ pyenv versions
  • toggle version
    $ pyenv global anaconda2-4.2.0
  • update pyenv
    $ pyenv rehash
$ conda list
$ pip install --upgrade pip
$ pip install chainer

install chainer on centos7

trial chainer on centos7

$ git clone https://github.com/pfnet/chainer.git
$ python chainer/examples/mnist/train_mnist.py

setup for chainer on centos7

# yum install git
# pip install matplotlib
# yum install python-devel

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-05-01 (月) 23:42:26 (1508d)