본문 바로가기
Development/for Machine Learning

CUDA / CuDNN / Theano / TensorFlow 설치하기

by IMCOMKING 2014. 7. 7.

Ubuntu 14.04 LTS에서 GPU 컴퓨팅을 위한 기본적인 설치 방법이다.


만약 거의 아무것도 설치하지 않은 방금 깐 unbuntu 라면 바로 1, 2, 3번만 설치한 후 7번 항목으로가서 글을 읽기를 활용할 것을 추천한다.(이 방법은 모든 딥러닝 라이브러리를 한 번에 사용할 때 유용함)

그렇지 않고 기존에 사용하던 서버에서 추가적인 설치가 필요한 경우나, 아니면 선택적으로 딥러닝 라이브러리를 사용할 경우 나머지 항목을 참조하기 바란다.


- 본 글은 2017.3월 현재 최신 버전의 설치 방법을 정리하였다.


0) GPU device의 CUDA 지원 유무확인
lspci | grep -i nvidia 또는
sudo lshw -C display 명령어로 내 GPU 장치를 확인하고, 
https://developer.nvidia.com/cuda-gpus 에서 지원하는 리스트 중에 있는지 확인한다.



1) CUDA 8.0 설치

우분투에서 현재 경로에 CUDA 설치파일인 RUN 파일을 이용한 설치 방법. (deb파일 즉, 데비안 패키지 를 이용한 방식은 dpkg를 활용해서 패키지 정보를 추가한 뒤 apt-get으로 설치하는 것 같다. 그러나 이 경우 GPU의 드라이버가 강제 업데이트 되서, 내가 원하는 버전의 드라이버를 깔지 못할 수 있다. http://nicellama.blogspot.kr/2015/04/cuda-70.html)


아래의 설치 과정은 https://developer.nvidia.com/cuda-downloads 에 접속해서
Linux x86에서 RUN파일의 경로를 복사하고, Linux Getting Started Guide(http://developer.download.nvidia.com/compute/cuda/7.5/Prod/docs/sidebar/CUDA_Installation_Guide_Linux.pdf)의 챕터 4의 Linux Getting Started Guide을 보고 따라한 과정을 요약한 것이다.

만약 본인의 컴퓨터가 방금 설치한 ubuntu 14.04 이 아니고, 특수한 경우 반드시 위의 문서대로 pre-installation action을 거쳐 설치를 해야한다. (일반적인 경우는 별 문제 없음)

- 설치 방법
wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda_8.0.61_375.26_linux-run
chmod 777 cuda_8.0.61_375.26_linux-run
sudo service lightdm stop
sudo ./cuda_8.0.61_375.26_linux-run --no-opengl-libs --silent
sudo printf "\nexport PATH=/usr/local/cuda/bin:$PATH\nexport LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH\n" >> $HOME/.bashrc
source $HOME/.bashrc

# 주의사항.
--no-opengl-libs : 이 옵션을 넣어서 설치해야, Xserver관련된 에러가 발생하지 않는다.
sudo service lightdm stop 을 입력하는 순간 모든 GUI화면이 꺼져버린다. 따라서 이후의 설치과정을 진행하기 위해서는 다른 컴퓨터에서 ssh로 해당 컴퓨터에 접속하여 CUDA설치를 마무리 하고, 아래의 명령어를 통해 GUI를 켜주어야한다. 
혹은 Ctrl + Alt + F1 을 클릭해보자(커맨드 모드로 전환된다고 함..)
sudo service lightdm start -> GUI, X window를 다시 켜고 싶을 때 입력. 만약 서버로서의 GPU 컴퓨팅이 목적이라면 이 명령어를 켜둘 경우 성능상에 손해가 발생한다. 이 기능을 꺼둘 경우 GUI없이 shell로만 작동한다.)
(위의 명령어를 실행하면, 해당 경로가 2 번 씩 추가되는데, 그 이유는 아마도 "export ~~"가 실행되어 이미 $PATH에 등록된 이후에 다시 $PATH를 불러와서 그런듯..?)

# 만약, 아래와 같은 방법으로 export로 환경변수를 설정하면, 세션을 새로 접속할때마다 환경변수를 다시 설정해주어야 한다. 따라서 위에서 printf를 이용한 방법이 보다 편리하다.
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
(export 할 때, 뒤에 $PATH를 붙이는 이유는 기존의 경로들 앞에 경로를 추가하기 위해서이다.)

- 설치 확인
nvcc -V
nvidia-smi
cat /proc/driver/nvidia/version
NVIDIA_CUDA-7.5_Samples/1_Utilities/deviceQuery 경로로 이동 후(CUDA 설치할 때, example을 생성한 위치) make 입력. (만약 make 명령어를 실행했을 때, 에러가 발생한다면 이는 build-essential이 제대로 설치안 된 것)
./deviceQuery 로 실행해서 Result = PASS 이면 설치 성공


- 기타 참고 사항(export 한 path 수정하기)
export의 반대 명령어: unset (경로이름)
->해당 이름의 경로를 통째로삭제

또는 잘못된 $PATH 설정시, 새로 정의해서 덮어 씌워버리면 됨.
evn | grep PATH 으로도 확인가능

- Cuda 삭제:
sudo /usr/local/cuda/bin/uninstall_cuda_8.0.pl



2) NVIDIA GPU 드라이버 최신버전으로 업그레이드
Cuda설치하는 과정에서 드라이버가 같이 설치되긴 하지만, 그러면 내가 원하는 드라이버를 설치하지 못하고 무조건 cuda run파일 안에 있는 낮은 버전의 드라이버만 설치된다. 예를 들어 cuda 7.5.18를 설치하면서 동시에 driver 352.x 버전을 깔수도 있지만, gtx 1080등을 사용하려면 driver 367.x 버전이 필요하다.


sudo service lightdm stop
wget http://us.download.nvidia.com/XFree86/Linux-x86_64/375.39/NVIDIA-Linux-x86_64-375.39.run
chmod +x NVIDIA-Linux-x86_64-375.39.run
sudo ./NVIDIA-Linux-x86_64-375.39.run -s -z --no-opengl-files
# --no-opengl-files (혹은 --no-opengl-libs) : 이 옵션을 함께 써주어야만, X server와 충돌이 발생하는 버그가 없다
# --no-kernel-module 만약 이 옵션을 주면, GPU driver만 설치하고, nvidia-smi 등의 커널 모듈은 설치하지 않는다. 그리고 이렇게 깐 경우, 나중에 다시 -K 옵션을 주어 모듈만 따로 설치할 수 있다. 
# -z 옵션은 nouveau 모듈이 실행중인 것을 무시하고 설치하는 옵션이다.
# 32bit환경에 대한 호환성이 없다는 Warning은 가뿐히 무시해주자.
# 'nvidia.ko' 모듈이 없다는 에러가 또 뜨면, -z 옵션으로는 해결이 안되니 아래를 참조해서  nouveau를 직접 삭제해주어야한다.

# kernel module은 nvidia-uvm / nvidia-smi 등의 프로그램을 말한다. Docker 이미지를 만들 때에는 커널 모듈을 설치하려하면 에러가 뜬다. 그래서 --no-kernel-module 옵션을 주고 이미지를 만들어야 하는 반면, 그냥 일반 서버 컴퓨터에서 설치할 때에는 모듈을 같이 설치해야 에러가 생기지 않는다... 신기한 세상이야

# NVIDIA driver 삭제 :
sudo /usr/bin/nvidia-uninstall

3) CuDNN 5.1 설치
<ubuntu 14.04>
wget http://developer.download.nvidia.com/compute/redist/cudnn/v5.1/cudnn-8.0-linux-x64-v5.1.tgz
tar xvzf cudnn-8.0-linux-x64-v5.1.tgz
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/lib64/libcudnn*


<ubuntu 16.04>
cd cuda
sudo cp include/cudnn.h /usr/include
sudo cp lib64/libcudnn* /usr/lib/x86_64-linux-gnu/
sudo chmod a+r /usr/lib/x86_64-linux-gnu/libcudnn*

# 참고 사항
- cuda 설치 경로 확인: which nvcc or ldconfig -p | grep cuda


4) Theano 설치

2015.8.28 일자 theano/keras에서 cudnn3을 사용하는 함수는 최신 GPU titan X 등의 그래픽RAM이 4기가가 넘는 GPU 사용시 float32로 세팅해서 사용할 경우 overflow가 일어나서 학습이 안되는걸로 추정된다. 그리고 float64로 설정하면 keras에서 에러가난다.(theano에서는 float64사용이 안됨)

3일전에 올라온 해결책에 따르면, theano와 keras의 bleeding-edge(최첨단) 버전을 설치하면 해결된다고 한다.
(git clone한다음 인스톨하는 방법 or git에서 가져와서 업데이트하는 방법)

- Bleeding Edge Theano 설치

http://deeplearning.net/software/theano/install.html#bleeding-edge-install-instructions

http://deeplearning.net/software/theano/install_ubuntu.html#install-ubuntu


sudo pip install --upgrade --no-deps git+git://github.com/Theano/Theano.git




자신의 $Home 경로에 .theanorc 파일 생성(touch나 cat 명령어) 후 다음 내용을 입력한다.

[global]
floatX = float32
device = gpu0
cuda.root =  /usr/local/cuda/bin

[nvcc]
fastmath = True

또는 다음의 명령어를 통해서도 한줄에 처리 가능하다.
printf "[global]\ndevice=gpu0\nfloatX=float32\ncuda.root=/usr/local/cuda/bin\n[nvcc]\nfastmath=True" > $HOME/.theanorc


튜토리얼 돌려보기.

설치를 원하는 경로에서 다음을 입력.


git clone git://github.com/lisa-lab/DeepLearningTutorials.git


theano 성능테스트

python `python -c "import os, theano; print os.path.dirname(theano.__file__)"`/misc/check_blas.py
http://deeplearning.net/software/theano/install_ubuntu.html#manual-openblas-instruction



5) TensorFlow 설치


# 주의사항
tensorflow 설치 도중, cuda 버전 관련된 문제가 자꾸 발생할 경우 ./configure를 실행하거나 또는 vi confiure로 직접 수정해서 처리해주어야 한다.


- TensorFlow 기본 설치

sudo apt-get install python-pip python-numpy swig python-dev

# 1.0.1 버전설치방법 : 기존에는 직접 url을 입력해야했던 것과 달리, 이제는 아래와 같은 방법으로 설치가능. 단 반드시 CUDA 8.0버전을 미리 설치해야함.
sudo pip install tensorflow-gpu


- TensorFlow Bleeding Edge 버전에서 설치하기 : bleeding edge 버전은 완전히 최신으로 개발중인 tf를 받는 것으로, 안정성에 다소 문제가 있음. 아주 특수한 목적, 예를 들어 개발중인 버전에서 어떠한 버그가 해결되었다든지 하는 경우가 아니면, 기본 설치 방법을 따를 것.
개발중인 RC버전은 MLP성능이 deep하게 쌓을 경우 매우 낮아지는 현상이 빈번히 발생한다. 가능하면 stable버전을 사용할 것을 권장한다.(필자도 이것때문에 상당히 고생함 ㅜ)

git clone --recurse-submodules https://github.com/tensorflow/tensorflow
cd tensorflow

vi google/protobuf/src/google/protobuf/io/coded_stream.h 

에서 Line611의 kDefaultTotalBytesLimit의 숫자를 512 << 20 으로 수정할 것

(최신 버전에서는 이 문제가 해결됨)

sudo ./configure && \
    bazel build -c opt --config=cuda tensorflow/tools/pip_package:build_pip_package && \
    bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/pip
sudo pip install --upgrade /tmp/pip/tensorflow-*.whl




- TensorFlow 설치 확인

python

import tensorflow as tf

hello = tf.constant('Hello, TensorFlow!')

sess = tf.Session()

print(sess.run(hello))

-> Hello, TensorFlow!


a = tf.constant(10)

b = tf.constant(32)

print(sess.run(a + b))

-> 42

- TensorFlow 버전 확인
pip freeze | grep tensorflow
pip show tensorflow



- TensorFlow 설치 에러 해결

> [Errno 1] _ssl.c:510: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

이상하게 공식 가이드대로 설치를 시도하면,  위와 같은 에러가 발생하여 안된다. 그래서 다음 방식 처럼, wget으로 whl파일을 다운 받은 다음에 설치할 것


wget https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.10.0rc0-cp27-none-linux_x86_64.whl
sudo pip install tensorflow-0.10.0rc0-cp27-none-linux_x86_64.whl


> cannot import name pywrap_tensorflow : 이 에러는 tensorflow directory 내에서 import tensorflow를 시도 해서 발생. 다른 경로에서 해볼 것.


> No module named protobuf : 이 에러는 tensorflow의 버전과 이에 필요한 protobuf의 버전이 달라서 그럼. 다음을 실행해서 protobuf를 지우고, 최신 버전으로 재설치한다.


pip uninstall protobuf
sudo pip install --upgrade protobuf==3.0.0b2



- bazel 설치 (pre-trained 모델을 사용하기 위해서 필요함. 만약 pre-trained 모델을 쓰지 않는다면 당장은 설치할 필요가 없음.). http://bazel.io/docs/install.html


sudo add-apt-repository ppa:webupd8team/java

sudo apt-get update

sudo apt-get install oracle-java8-installer


sudo apt-get install pkg-config zip g++ zlib1g-dev unzip


(https://github.com/bazelbuild/bazel/releases 에서 최신 bazel installer를 다운받는다.)

wget https://github.com/bazelbuild/bazel/releases/download/0.1.5/bazel-0.1.5-installer-linux-x86_64.sh

chmod 777 bazel-0.1.5-installer-linux-x86_64.sh

./bazel-0.1.5-installer-linux-x86_64.sh --user

sudo printf "\nexport PATH=$PATH:$HOME/bin\n" >> $HOME/.bashrc

source $HOME/.bashrc

- bazel 설치 확인

bazel version





# 기타 TensorFlow 활용 방법(설치와 무관함)

- TensorBoard 켜기(나중에 TensorFlow로 개발할 때 필요)
python tensorflow/tensorboard/tensorboard.py --logdir=path/to/log-directory


TensorBoard 종료 --> ctrl + c 혹은 ctrl + \


- TensorFlow Pre-trained CNN 모델을 로딩하기 (이것은 bin 모델을 만들지 않음)

만약 위에서 말한 방법대로 설치하지 않았을 경우 https://github.com/ry/tensorflow-vgg16의 모델을 다음과 같은 코드를 사용해로딩하려고하면 2가지 문제가 발생한다. 


with open("../vgg16-20160129.tfmodel", mode='rb') as f:

    fileContent = f.read()


graph_def = tf.GraphDef()

graph_def.ParseFromString(fileContent)


이를 해결하려면 아래의 방법을 따라야한다.


(1) tensorflow 를 최신 버전으로 업데이트(master). 


git pull


(본문의 "TensorFlow Bleeding Edge 버전 설치하기" 참조.)


(2) tensorflow 내부의 protobuf 의 소스코드를 수정 후 다시 빌드

https://github.com/tensorflow/tensorflow/issues/582


vi google/protobuf/src/google/protobuf/io/coded_stream.h#Line611 에서 kDefaultTotalBytesLimit의 숫자를 5121 << 20 으로 수정할 것. 이왕 하는 거 바로 밑에 Warning 도 똑같이 크게 잡아 줄 것.

이는 다음의 명령으로도 처리가 가능하다.


cd tensorflow

sed -i "s/kDefaultTotalBytesLimit = 64/kDefaultTotalBytesLimit = 5121/g" google/protobuf/src/google/protobuf/io/coded_stream.h

sed -i "s/kDefaultTotalBytesWarningThreshold = 32/kDefaultTotalBytesWarningThreshold = 5121/g" google/protobuf/src/google/protobuf/io/coded_stream.h



sudo ./configure && \
    bazel build -c opt --config=cuda tensorflow/tools/pip_package:build_pip_package && \
    bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/pip
sudo pip install --upgrade /tmp/pip/tensorflow-*.whl



- TensorFlow Pre-trained CNN 모델의 bin 파일 빌드 후 실행하기

(https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/label_image)


cd tensorflow
sudo ./configure      ( 이게 일단 잘 되어야만, bazel build가 가능하다 )

wget https://storage.googleapis.com/download.tensorflow.org/models/inception_dec_2015.zip

unzip inception_dec_2015.zip -d tensorflow/tensorflow/examples/label_image/data/

git submodule update --init

bazel build tensorflow/examples/label_image/...

bazel-bin/tensorflow/examples/label_image/label_image

bazel-bin/tensorflow/examples/label_image/label_image --image=my_image.png




- ubuntu 16.04에서의 tensorflow 설치 방법

https://www.ahnbk.com/?p=398



6) 기타 설치 (git, screen, ipython, h5py)

sudo pip install -U pip

(pip 는 업데이트 후 세션 재접속이 필요하다.)

sudo apt-get install git

sudo apt-get install screen

sudo pip install "ipython[notebook]==3.2.1"

sudo apt-get install -y python-matplotlib

sudo apt-get install -y python-h5py

sudo apt-get install python-skimage

sudo apt-get install libjpeg-dev

sudo pip install --upgrade pillow


sudo pip install -U scikit-learn

sudo pip install --upgrade Request


sudo apt-get install redis-server

sudo service redis-server restart

sudo pip install euclid

sudo pip install future



7) Docker로 한 번에 설치하기

지금까지 (4)~(6)번의 설치한 과정을 원스텝으로 한 번에 설치하는 방법이 있다.(1,2번의 CUDA와 CuDNN은 설치해야한다.) 바로 필자가 만든 docker 이미지를 사용하는 것이다. 다음의 명령어를 차례대로 실행하면 위에서의 설치 과정이 대부분 완료된다. (참고 자료: https://hub.docker.com/r/imcomking/bi_deeplearning/)


다음을 참조하여 docker를 설치한다. https://docs.docker.com/engine/installation/linux/ubuntulinux/

위 문서의 내용 중 ubuntu 14.04 에서의 docker 최신버전 설치 방법만 정리하면 다음과 같다.


- docker 설치

sudo apt-get update

sudo apt-get install apt-transport-https ca-certificates

sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D


sudo printf "deb https://apt.dockerproject.org/repo ubuntu-trusty main" >> /etc/apt/sources.list.d/docker.list


sudo apt-get update

sudo apt-get purge lxc-docker

sudo apt-cache policy docker-engine


sudo apt-get install linux-image-extra-$(uname -r)

sudo apt-get install apparmor


sudo apt-get install docker-engine

sudo service docker start

sudo docker run hello-world

sudo docker version


(sudo apt-get install docker.io (이렇게하면 한 번에 설치는 되나, 구버전이 설치된다.))




- docker image 다운 받기


sudo docker pull imcomking/bi_deeplearning

sudo docker run -p 22 -p 6006 -p 8888 -it --device /dev/nvidiactl --device /dev/nvidia-uvm --device /dev/nvidia0 imcomking/bi_deeplearning


그러면 pull 하는데 걸리는 N시간 이후 바로 설치가 완료된 환경에서 작업이 가능하다.

다음은 ssh/sft 설정이다.

passwd

(enter your password)

wget https://raw.githubusercontent.com/bi-lab/deeplearning_tutorial/master/sshd_config -O /etc/ssh/sshd_config

/usr/sbin/sshd -D



docker와 관련된 명렁어나 지식은 다음을 참조하기 바란다.

http://newsight.tistory.com/228




'Development > for Machine Learning' 카테고리의 다른 글

Practical Theano Tutorial  (0) 2015.03.11
Theano 사용법  (0) 2015.01.20
CUDA Programming  (2) 2014.11.17
Weka  (0) 2014.06.23
MATLAB 문법, API, 단축키, 환경설정  (0) 2014.06.23

댓글