Tensorflow(gpu) C++ 프로젝트에서 사용하기steemCreated with Sketch.

in zzan •  5 years ago  (edited)

여기서 굵은 절취선 해놓은데 까지 푸념이다.

얼굴에서 landmark를 인식해서 face alignment를 하려고 하는데 딥러닝으로 학습된 모델이 성능이 좋다고 지표가 나와있었다.

현재 프로젝트는 C++로 만들어져 있기때문에 왠만하면 c++로 짜져있는 코드가 필요했다. tensorflow에서 c++로 학습 시키고 테스트 하는 게 되어있는 face alignment 코드를 찾았다.

https://github.com/bobetocalo/faces_framework

그게 위 링크인데

이걸 Cmake 빌드하려다 보니 골때리는게 한두가지가 아니다.

우선 opencv는 깔려져 있으니 패스

Boost는 빌드 해서 shared library만 cmake로 연결해주니 어찌저찌 되었는데

문제는

https://github.com/bobetocalo/bobetocalo_prl19/

faces_framework submodule로 존재하는 여기서 tensorflow를 연결해주어야 한다.

해당 깃에는 tensorflow 버전을 몇을 쓰라는지 적혀있는 내용이없어 그냥 대충 git 날짜 보고
2.0만 아니면 되겠지 라는 생각으로 1.4를 통째로 받아서

연결만 하면 될 줄 알았는데

python에서 tensorflow를 사용하는건

 pip install tensorflow

이러면 땡이였는데

c++에선 그냥 make 만 해서 되는게 아니였다. ㅋㅋㅋㅋㅋㅋ


여기저기 뒤지다 우선 tensorflow build 하는 문서를 찾았고

https://www.tensorflow.org/install/source

1. 먼저 bazel 부터 깔아야된다. (docker python 등등 쓸게 아니면..)

bazel도 버전을 잘 맞춰서 깔아야 된다. (2.0.0 버전 깔았다가 다시 지우고 개고생 했다.)

tensorflow 버전에 따른 bazel,cuda,cudnn test completed version은 아래링크 에서 확인할 수 있다.
https://www.tensorflow.org/install/source#tested_build_configurations

tensorflow 공식 문서에도 적혀있지만

bazelink 를 쓰면 쉽게 깔린다고 하는데 나는 무시하고 그 아래 그냥 bazel 설치하는 링크로 들어갔다.

https://docs.bazel.build/versions/master/install.html

나는 우분투니 우분투 기준으로 하고 installer를 다운받아서 하는 방법을 택했다.
그 외의 경우 위링크에서 확인하면 된다.

의존성 패키지를 깔면 된다.(사실 왠만하면 깔려있을것이다.)

sudo apt install g++ unzip zip

그 다음에는 자바를 까는데 자바프로젝트를 빌드하고 싶으면 까는 건데 굳이 tensorflow 빌드하는데 필요는 없어보이지만 혹시모르니 깔았다. (필요없을거같긴한데)

# Ubuntu 16.04 (LTS) uses OpenJDK 8 by default:
sudo apt-get install openjdk-8-jdk

# Ubuntu 18.04 (LTS) uses OpenJDK 11 by default:
sudo apt-get install openjdk-11-jdk

그다음에 installer를 다운 받아야 한다.
https://github.com/bazelbuild/bazel/releases
여기서 다운 받으면 된다.

r1.14 를 빌드하려고 하는 경우 그냥 0.26.0 받으면 된다. ( 그외의 경우는 알아서 잘... duckduckgo 같은데 잘 뒤져보면 있을걸..?)

그리고 아래 처럼 실행 권한 주고 실행하면 된다.

chmod +x bazel-<version>-installer-linux-x86_64.sh
./bazel-<version>-installer-linux-x86_64.sh --user

2.cuda toolkit 설치

이게 개빡친다.

tensorflow 에서 gpu를 사용하려면 cuda관련 된 것들이 연결 되어야 하는데 이걸 안깔고 하면 bazel로 configure 할때 계속 파일 없다고 뜨면서 진행이 안된다.

cuda toolkit 다운 링크
https://developer.nvidia.com/cuda-downloads

알아서 잘 선택 하면 되는데 나는 runfile 방식으로 설치할 것이다.

wget http://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installers/cuda_10.2.89_440.33.01_linux.run
sudo sh cuda_10.2.89_440.33.01_linux.run

근데 이것만 깔면 될줄 알았는데 또 cudnn을 못찾는 댄다.

3. cudnn 설치

아 정말 cuda toolkit에 제발 한번에 넣어줬으면 좋겠다. 내가 모르는 건가..

https://developer.nvidia.com/rdp/cudnn-download

여기서 받아야 되는데 또 빡치는건 로그인을 해야된다.

로그인 하기 싫은 사람을 위해 다운링크(cuda 10.2 x86-64 linux 만 된다. cudnn v7.6.5) 딴거 받고싶으면 로그인하시고...
https://developer.nvidia.com/compute/machine-learning/cudnn/secure/7.6.5.32/Production/10.2_20191118/cudnn-10.2-linux-x64-v7.6.5.32.tgz

(아 이제 다운로드가 어느 정도 됬다.)

다운받고 나서는 압축 풀고.

tar -xzvf cudnn-10.2-linux-x64-v7.6.5.32.tgz

그냥 무식하게 압축 푼 거를 다 usr/local/cuda (cuda 기본 설치 경로) 에 복사하면 된다.
(이게 내가 만든게 아니고 공식 문서에 있는 내용 임.. 진짜..
https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html)

sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

4.(선택) TensorRT 설치.

아.. 정말 깔게 많다..
TensorRT가 뭐냐면 실수형을 정수형으로 변환해 빠르게 Inference 할수 있게 도와주는 툴이다.

솔직히 실시간 할께 아니면 필요없는데....

또 양아치 같은 nvidia 홈페이지에 들어가야한다.

https://developer.nvidia.com/nvidia-tensorrt-download
여기서 나는 tensorRT 6을 받을 것이다.
다운받으려면 설문을 해야되는데 걍 매우 귀찮았기 때문에 회사명에 ㅁㄴㅇㄹㅁㄴㅇㄹ를 적음..

버전 6을 받은 이유는 그냥 은 아니고 ubuntu16.04에 cuda10.2 를 만족하는 최소 버전이라서..?
다른 분들은 눈치껏 잘 받기 바란다. 안그러면 또 bazel에서 빠꾸먹는다.

슬슬 지치기 시작하기 때문에 편한 deb 설치파일을 받아서 설치했다.

그냥 더블클릭해서 깔아도 되긴한데 command가 편한 분들을 위해

sudo apt install ./nv-tensorrt-repo-ubuntu1604-cuda10.2-trt6.0.1.8-ga-20191108_1-1_amd64.deb 

5.Bazel configure 하기.

자 이제 준비가 되었으니(사실 나는 5번 과정을 bazel한테 빠꾸먹고 시행착오로 1,2,3,4 스텝을 만들었다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ)

tensorflow 다운 받았던 폴더로 들어가서

혹시나 다운이 안되있으면
아래처럼 하면 된다. 용량 개많음 주의.. (r1.14 는 내꺼 기준이라.. 원하는 버전으로.하면됨.)

git clone https://github.com/tensorflow/tensorflow.git
git checkout r1.14

자 다운을 받았으니 configure를 해볼까...

./configure

그냥 아래 내용 나오면 다 엔터 쳐주면 된다.

(설마하니 python이 안깔린 사람은 없겟지)
Please specify the location of python. [Default is /usr/bin/python]:
Please input the desired Python library path to use. Default is [/usr/local/lib/python2.7/dist-packages]

Do you wish to build TensorFlow with XLA JIT support? [Y/n]: Y

이거 N 해야 된다. 안그러면 깔게 매우 많다.

Do you wish to build TensorFlow with OpenCL SYCL support? [y/N]: N

SYCL ROCm 다 N 해줘야된다.

Do you wish to build TensorFlow with ROCm support? [y/N]: N

gpu 사용할거기때문에 Y

Do you wish to build TensorFlow with CUDA support? [y/N]:

그냥 N하는게 정신건강에 좋다.(하다 포기했다. 다음에 도전)

Do you wish to build TensorFlow with TensorRT support? [y/N]: N

Please specify the CUDA SDK version you want to use. [Leave empty to default to CUDA 10]:

Please specify the cuDNN version you want to use. [Leave empty to default to cuDNN 7]:

Please specify the TensorRT version you want to use. [Leave empty to default to TensorRT 5]:
Please specify the locally installed NCCL version you want to use. [Leave empty to use http://github.com/nvidia/nccl]:
Please specify the comma-separated list of base paths to look for CUDA libraries and headers. [Leave empty to use the default]:

Please note that each additional compute capability significantly increases your build time and binary size, and that TensorFlow only supports compute capabilities >= 3.5 [Default is: 3.5,7.0]:

Do you want to use clang as CUDA compiler? [y/N]: n

그냥 나머지 다 엔터

하고 Configuration finished 뜨면 완료 된 것이다.

그리고

bazel build tensorflow

하면 전부다 빌드를 한다.

사실 core만 따로 빌드하면 되었는데 괜히 다 빌드 한것 같다.

나중에 기회 되면 따로 빌드하는 것을 올려보겠다.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

오 응원합니다.
무슨프로젝트하시나요?

아 스팀 관련된건 아니고 음성인식에 얼굴 방향을 인식 하는 게 필요해서 찾아보고 있습니다 ㅎㅎ

오 재밌군요.
오디오 신호로만 방향찾으시나요?
Speech to text는 요새 라이브러리가 많은데

사람 두명이 서로 대화 하는지 판단하는게 필요하다고 해서
멀티모달로 얼굴 방향정보와 음성신호를 같이 사용해서 하면 어떨까 해서 해보는중입니다

Stt 가 꼭 필요하지는 않은것 같아요
감사합니다

네 텍스트가 필요한게 아니라면 stt는 필요없을거같습니다.

멀티모달이 마이크가 여러개달린거 였나요?
감사합니다. 마이크 여러개달린거로 어디서 말하는지 추정하는걸 본거같네요

멀티모달이 영상 제스처 음성등 여러 정보를 같이 모아서 새로운 정보를 얻어내는 것인데
마이크 여러개달린거로 추정하는 것도 어찌보면 멀티모달로 볼수도 있겠네요