IT shoveler

GTX1080으로 Fast RCNN 돌려보기

작성일 작성자 최혁두

내 돈으로 살수 없는 GTX 1080을 회사돈으로 껴보았다.

이 글은 GTX 1080을 이용해 Fast RCNN의 demo.py를 돌려보는 것을 목표로 한다.

따라서 그 기반이 되는 OpenCV와 Caffe를 빌드하는 것이 주 내용이 될 것이다.

환경은 Ubuntu 14.04 64 bit로 아직 16.04로는 넘어가지 못 했다.


여기서는 기본적인 내용은 건너뛰고 내가 삽질했던 내용 위주로만 적어보고자 한다.

GTX 1080이 새로운 아키텍쳐인 Pascal을 기반으로 하고 있어 오픈소스들이 거기에 맞춰 대응이 되어있지 않는 경우가 있다.

이런 문제들을 해결하고 1.5일을 투입한 끝에 겨우 Fast RCNN의 demo.py를 돌려볼 수 있었다.

회사에서 했기 때문에 이미지도 없고 빠진 내용도 좀 있지만 삽질하던 사람에게 도움이 되길 바란다.

그런데 이런 문제들을 시간이 좀 지나면 오픈소스에서 잘 대응해서 저절로 해결된 문제일 것 같기도 하다.


하여간 Nvidia driver 설치와 CUDA, CUDNN 설치는 Nvidia 홈페이지에서 받아서 설치하고 자세한 방법은 다른 블로그를 참고하기 바란다.

NVIDIA driver는 여기서 367 이상의 최신 버전을 설치한다.

CUDA 8.0은 여기서 받아 설치한다.

CUDNN은 여기서 "Download cuDNN v5.1 (August 10, 2016), for CUDA 8.0 RC"을 받는다.

Fast RCNN이 뭔지는 Arxiv를 참고하길 바란다.


1. OpenCV


A. Pascal 아키텍쳐 선택

http://opencv.org/ 에서 바로 받을 수 있는 버전은 opencv-3.1.0 이다.

그런데 받아서 cmake-gui로 configure를 해보면 CUDA_GENERATION에 Maxwell, Kepler 등은 있는데 GTX 10 시리즈부터 탑재된 Pascal 아키텍쳐는 선택할 수 없다.

그냥 Auto로 하게 되면 모든 아키텍쳐에 대해 다 빌드하게 되는데 낭비일 뿐더러 돌아가지도 않는다.

그래서 좀 찾아봤는데 github에서 최신 버전을 받으면 Pascal을 선택할 수 있다.

git clone https://github.com/opencv/opencv.git

(2016.8.26 수정)

opencv-3.1.0은 CUDA 8.0을 지원하지 않는다. 다시 빌드해보니 opencv의 graphcut 알고리즘이 cudalegacy 모듈을 사용하는데

CUDA 8.0에서는 레거시를 지운 것 같다. 그래서 GTX 10 시리즈를 쓰든 말든 CUDA 8.0을 설치하면 opencv도 master로 맞춰줘야 한다.


B. CUDART_VERSION

분명히 CUDA 8.0을 깔았고 cmake-gui에서도 CUDA_VERSION을 8.0으로 인식했는데 빌드할 때 자꾸 

"Insufficient Cuda Runtime library version, please update it."


이란 에러 메시지가 뜬다. "private.cuda.hpp"에서 나는 에러인데 여기 70라인에서 볼 수 있다.

#  if (CUDART_VERSION < CUDART_MINIMUM_REQUIRED_VERSION)

#    error "Insufficient Cuda Runtime library version, please update it."

#  endif

그래서 CUDART_VERSION 라는 게 어디서 선언이 됐는지 grep으로 암만 찾아봐도 나오지가 않는다.

저게 빌드하면서 생기는 건지 바이너리에 들어있는 건지 어디에 있는 건지 모르겠지만 암튼 저것 때문에 빌드가 되지 않는다.

private.cuda.hpp 뿐만 아니라 private.cuda.hpp 을 include 하는 다른 파일에서도 같은 에러가 나므로 해결을 해야만 한다.

그래서 내가 한 방법은 그냥 define을 넣는 것이다. 내가 CUDA 8.0을 설치한 것은 확실하니 저 에러만 없애면 될 것 같다.

#  define CUDART_VERSION   8000

#  if (CUDART_VERSION < CUDART_MINIMUM_REQUIRED_VERSION)

#    error "Insufficient Cuda Runtime library version, please update it."

#  endif


C. Thrust error

저 에러를 해결하고 나니 thrust 생성자 에러가 난다. 에러문과 해결책은 아래 링크에 있다.

https://github.com/opencv/opencv/issues/6632

https://github.com/thrust/thrust/issues/800

해결책은 thrust 소스를 받아서 cuda 내부의 thrust 소스와 교체를 해주면 된다.

git clone https://github.com/thrust/thrust.git

sudo mv /usr/local/cuda-8.0/include/thrust /usr/local/cuda-8.0/include/thrust_old

sudo cp -r /thrust/thrust /usr/local/cuda-8.0/include


아... OpenCV 하나 빌드하는것도 이렇게 힘들구나...

OpenCV의 나머지 설정은 블로그의 여기를 참고하길 바란다.



2. Fast RCNN (Caffe)


https://github.com/rbgirshick/fast-rcnn

여기 있는 코드를 돌려보는 것이 오늘의 목표다. 일단 받자. 다운받은 폴더를 FRCN_ROOT 라 하자.

Installation에서 caffe를 빌드하는 4번만 빼고 1,2,3,5 번을 따라해보자.

Fast RCNN은 caffe의 master를 사용하는 게 아니라 자신들이 직접 layer를 추가한 버전을 받아서 빌드해야 한다.

기본적으로 사전에 설치해야 하는 것들은 Caffe Ubuntu Install 을 참고해 설치한다.


A. Protobuf

이게 제일 해결이 어려운 문제였다. 기본 설정으로 caffe를 빌드하고 나서 FRCN_ROOT/tools/demo.py를 실행해보면

[libprotobuf ERROR google/protobuf/descriptor_database.cc:57] File already exists in database: caffe.proto

[libprotobuf FATAL google/protobuf/descriptor.cc:954] CHECK failed: generated_database_->Add(encoded_file_descriptor, size):

이런 에러가 나온다.

구글링을 해보니 libprotobuf.so 대신 libprotobuf.a 를 이용해 빌드하랜다.

cmake-gui에서 protobuf로 검색해서 나오는 라이브러리 파일들을 .so에서 .a로 바꿔주면 된다.

이렇게 했는데 또 다른 에러가 난다. ㅡㅡ;;

~~~ can not be used when making a shared object; recompile with -fPIC 

~~~

찾다 찾다보니 여기서 해결책을 찾았다.

(2016.8.26 수정)

protobuf 소스를 받아 -fPIC 옵션으로 static library (.a)를 빌드하여 사용해야 한다.

빌드는 protobuf github의 설치가이드를 따라 하면 되는데 configure만 아래와 같이 한다.

./configure --disable-shared CPPFLAGS="-fPIC"


이후 caffe를 빌드할 때 cmake-gui에서 protobuf 라이브러리 파일들을 방금 빌드한 것들로 바꿔주면 된다.

그럼 이제 caffe 빌드는 잘 된다.

이것이 GTX 1080과 관련이 있어보이진 않는데... 예전에 다른 컴퓨터에서는 Caffe가 그냥 잘 설치가 됐다.

Fast RCNN에 내장된 Caffe 버전이 문제일 수도 있고... 암튼 protobuf 문제는 해결이다.


B. NVIDIA driver

이제 demo.py를 돌려보면 좀더 돌아가긴 하는데 결국 또 죽는다.

modprobe: ERROR: could not insert 'nvidia_361_uvm' ~~~

그래픽 드라이버랑 CUDA 잘 설치했는데 이게 왠말?

알고 보니 잘 못 설치했다. NVIDIA driver 367.35를 설치했지만 CUDA를 설치할 때 CUDA에 내장되어 있는 하위 버전 드라이버를 생각없이 설치해 버린 것이다...;;

이런 에러가 뜬다면 여기서 jonathanstrong 님의 재설치 가이드를 따라가면 된다.

sudo apt-get purge nvidia*

sudo stop lightdm

# ctrl + alt + F1 누른 후 로그인

# ~/Downloads에 설치 파일들을 받아뒀다면

cd Downloads

sudo ./nvidia~~~.run --uninstall     # 이름은 탭으로 자동완성

sudo ./nvidia~~~.run                 # 드라이버 설치

sudo ./cuda~~~.run                  # cuda 설치


C. cuDNN

지난주에 cuDNN을 붙여보려고 많이 찾아봤지만 결국 포기했다. 지난주 일이라 에러문이 잘 생각인 안난다;;;

cuDNN은 필수가 아니므로 일단 스킵했다.


D. CUDA Arch

이만큼 했으면 좀 돌아가야 하련만 또 cuda architecture가 발목을 잡는다.

위까지 하고 demo.py를 돌려보면 

~~~~

Check failed: error == cudaSuccess (8 vs. 0) invalid device function

뭐 이런 에러가 뜬다. 관련 이슈는 여기서 확인할 수 있다.

스레드를 보니 대충 아키텍쳐를 잘 선책해야 한다고 하는데 cmake-gui에서 CUDA_ARCH_NAME을 보면 선택지에 Pascal이 없는데 어쩌란 말인가?!!

(나는 Makefile을 직접 건드리는 무시무시한 짓은 잘 못 한다고;;)

그래서 CUDA_ARCH_NAME을 Manual로 하고 configure를 눌러보았더니 

CUDA_ARCH_BIN 이라는 변수가 튀어나왔다. 20 30 40 .. 등등 적혀있는데 다 지우고 60으로 적었다.

저 숫자들은 CPU에서 sm_xx 에 붙는 숫자인데 sm은 stream multiprocessor의 약자라나...

자세한 내용은 잘 모르지만 OpenCV에서 Pascal을 선택했을 때 CUDA_ARCH_BIN을 6.0으로 자동설정 하는 것을 보고 대충 눈치봐서 60을 넣었다. ㅎ ㅏㅎ ㅏ^^

암튼 그렇게 설정하고 빌드하니....


드디어 demo.py가 돌아간다. 동물이랑 자동차 등을 찾는것이 보인다!! 이 글을 쓰는 것은 집컴이라 스샷을 첨부하지 못해 아쉽다.


돌아가고 나서 이 에러 내용을 정리하기 위해 다시 Fast RCNN을 받아서 빌드해 보았는데 그때는 CUDA_ARCH_NAME을 auto로 해도 configure를 눌러보면

cmake-gui 결과 창에

NVIDIA CUDA:

   Target GPU(s): Auto

   GPU Arch(s): sm_61

라고 자동으로 설정이 된다. 이렇게 빌드해도 demo.py가 돌아간다.

뭐가 달라진건지 모를 일이다. 그 며칠새 girshick이 commit을 하지도 않았는데...

암튼 에러가 나면 Manual을 선택해서 직접 CUDA_ARCH_BIN에 60(이나 61)을 넣어주면 되겠다.

(60이 정확한 건지 61이 정확한 건지는 누가 알면 알려주세요;;)


IT shoveler의 하루는 또 이렇게 갔다...




맨위로
통합 검색어 입력폼