본문 바로가기
machine learning

[DeepLearning] 우분투 14.04에 Caffe 설치 하기

by 유주원 2015. 4. 28.

파이썬에서 유명한 Deep learning 패키지 중에 Caffe와 Theano 가 있는데 우분투 14.04에 Caffe를 설치해보기로 했다.


우선 필수 빌드 패키지와 최신 커널 헤더를 설치한다.


$> sudo apt-get install build-essential

$> sudo apt-get install linux-headers-`uname -r`


Caffe를 설치하기 위해서는 CUDA 설치가 필수적이다.

CUDA(Compute Unified Device Architecture)를 설명하기 위해서는 우선 Multicore와 Manycore에 대한 개념 설명이 있어야 하는데 우선 Multicore는 지금 현재 나와 있는 듀얼코어 CPU, 쿼드코어 CPU 등이라고 할 수 있다. 커다란 CPU 틀안에 2개 혹은 4개의 cpu core를 포함시켜 놓은 후 각각의 업무를 병력적으로 처리하는 방식이다. 

이에 반해 Manycore는 수백개의 core를 하나의 CPU안에 적재해 놓은 방식을 말한다.

그런데 여기서 적재되어 있는 core는 Multicore와 비슷한 코어를 적재하는 것이 아니라 단순한 연산 등의 처리를 하는 작은 코어를 적재해 놓는 것이다.


'어?? 그럼 Multicore에 core를 늘리면 되지 않나???'


라는 생각이 분명히 들 것인데.. Multicore가 단순히 core만 늘리면 되는 것이 아니라 core 간의 공유 메모리도 늘려야 하고 그에 따른 처리 시간도 감수해야 하기 때문에 일정 이상의 core를 늘리면 오히려 성능이 감소되는 단점을 지니고 있다.

그래서 아마도 지금까지 쿼드코어 이상의 CPU는 안나온게 아닐까란 생각을 해본다.


그렇다고 Manycore가 그럼 더 좋은것이냐?? 그것도 맞다고 볼 수는 없는 것이 Manycore의 일종인 GPU는 비디오 프레임 계산을 위한 수치 계산 위주로 설계가 되어 있고, 어떤 점에서는 CPU보다 성능이 더 안좋을 수도 있다.

그래서 CPU와 GPU를 적절히 배분하여 프로그래밍 연산을 처리하는 방식이 바로 CUDA이다.

간단하게 CPU를 통해 순차적 연산을 진행하고 복잡하고 병렬적 연산이 발생할땐 GPU로 처리 흐름을 넘겨서 처리 속도와 성능을 향상시키는 프로그래밍 방법이라 하겠다.

CUDA에 대한 설명은 후에 자세히 설명하기로 하고,

혹시 아직까지 CPU(Multicore)와 GPU(manycore)에 대해 이해가 안된다면 아래의 영상을 보면 도움이 될 것 같다.


http://www.nvidia.co.kr/object/what-is-gpu-computing-kr.html


서론이 길었는데 그럼 이제 CUDA를 설치해보자.


$> curl -O "http://developer.download.nvidia.com/compute/cuda/6_5/rel/installers/cuda_6.5.14_linux_64.run"

$> chmod +x cuda_6.5.14_linux_64.run

$> sudo cuda_6.5.14_linux_64.run --kernel-source-path=/usr/src/linux-headers-`uname -r`/


마지막 cuda를 실행하면 터미널에 약관 창이 나타난다.

약관 창이 나타나면 Accept를 입력하고, 그 후에 graphics card driver는 설치하지 않는다.

toolkit과 symbolic link, sample은 설치한다고 입력하면 CUDA에 대한 설치는 종료된다.


그 후에 아래와 같이 CUDA의 환경 변수 설정을 해준다.


$> echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc

$> echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/lib' >> ~/.bashrc

$> source ~/.bashrc


의존성 있는 라이브러리들을 설치한다.


$> sudo apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler gfortran libjpeg62 libfreeimage-dev libatlas-base-dev git python-dev python-pip libgoogle-glog-dev libbz2-dev libxml2-dev libxslt1-dev libffi-dev libssl-dev libgflags-dev liblmdb-dev




caffe 소스를 다운 받고, requirements를 통해 필요한 python 패키지를 다운받는다.


$> git clone https://github.com/BVLC/caffe.git

$> cd caffe

$> cat python/requirements.txt | xargs -L 1 sudo pip install


usr/local에 해당하는 python library와 numpy에 대한 심볼릭 링크를 만들어 주고 이를 참조하자. (나중에 충돌 방지)


$> sudo ln -s /usr/include/python2.7/ /usr/local/include/python2.7

$> sudo ln -s /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy /usr/local/include/python2.7/numpy


Makefile을 복사한 후 필요한 부분을 수정한다. 

(우린 GPU를 안쓸 것이기 때문에 CPU만 쓰겟다는 설정을 해주고, PYTHON_INCLUDE 경로를 바꿔준다.)


$> cp Makefile.config.example Makefile.config

$> vi Makefile.config

......

......

CPU_ONLY := 1

PYTHON_INCLUDE := /usr/local/include/python2.7 \

                                          /usr/local/include/python2.7/numpy


이제 pycaffe를 make한다.


$> make pycaffe

$> make all

$> make test


설치가 무사히 완료되었으면 이제 ImageNet Caffe model과 Label을 다운로드 한다.


$> python scripts/download_model_binary.py models/bvlc_reference_caffenet

$> sh data/ilsvrc12/get_ilsvrc_aux.sh


python/classify.py 파일을 열어서 --print_results option 구문을 추가해 준다.


이제 실제 테스트를 실행해본다.


$> python python/classify.py --print_results examples/images/cat.jpg foo




실행 결과로 foo.npy 파일과 실행 결과가 아래와 같이 출력된다.



혹시 아래와 같은 에러들이 발생했을 경우엔 다음과 같이 각각 해결해준다.


1. fatal error: gflags/gflags.h:No such file or directory


$> wget https://github.com/schuhschuh/gflags/archive/master.zip

$>  unsip master.zip

$> cd gflags-master

$> mkdir build && cd build

$> export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1

$> make

$> sudo make install




2. ImportError: No module named google.protobuf.internal


$> pip install protobuf


3. ImportError: No module named skimage


$> pip install scikit-image


4. ValueError: Mean shape incompatible with input shape


확실히는 모르겠지만, 해당 stackoverflow에서는 contributor가 코드를 잘못짠 것처럼 말하고 있으며, 실제 해당 코드를 변경하니 원할하게 동작하는 것을 확인 했다.

해당 코드 위치는 python/caffe/io.py의 아래 부분이다.


if ms != self.inputs[in_][1:]:

    raise ValueError('Mean shape incompatible with input shape.')


이 부분을 아래와 같이 변경한다.


if ms != self.inputs[in_] :

   print(self.inputs[in_])

  in_shape = self.inputs[in_][1:]

    m_min, m_max = mean.min(), mean.max()

  normal_mean = (mean - m_min) / (m_max - m_min)

    mean = resize_image(normal_mean.transpose((1,2,0)), in_shape[1:]).transpose((2,0,1)) * (m_max - m_min) + m_min  


해당 stackoverflow 링크를 남긴다.

http://stackoverflow.com/questions/28692209/using-gpu-despite-setting-cpu-only-yielding-unexpected-keyword-argument