RedHat 에 Tensorflow GPU 모드로 설치하기



이번 포스팅에서는 RedHat 에 Tensorflow 를 GPU 모드로 설치해 보려고 합니다.


방법은 VirtualEnv 를 사용할 것입니다. 그리고 Tensorflow 는 pip 를 통해서 설치합니다.

현재 최신 Tensorflow 는 1.3.0 입니다.

그리고 제가 사용하는 그래픽카드는 Tesla K80 입니다.




CUDA 설치





1. gcc 설치

sudo yum groupinstall 'Development Tools'


2. Kernel header 와 development package 설치

sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)


3. Nouveau driver 종료


설치를 위해서는 현재 실행중인 Nouveau driver 를 종료시켜야 합니다.

Nouveau driver 의 실행유무는 아래 명령어를 통해서 확인 가능합니다.


lsmod | grep nouveau

어떤 항목이라도 출력되는게 있다면, Nouveau driver 가 로드되었다는 뜻입니다.

실행을 막기 위해서 아래 절차를 실행합니다.


/etc/modprobe.d/blacklist-nouveau.conf 파일을 아래 내용으로 만들어 넣습니다.

blacklist nouveau
options nouveau modeset=0

그 뒤에 아래 명령어를 통해서, kernel initramfs 를 재생성 합니다.

sudo dracut --force


4. runlevel 3 으로 재부팅

Runlevel 3 으로 재부팅 합니다. 현재 부팅모드는 아래 커맨드로 확인 가능합니다.
runlevel


이후 다시 아래 명령을 통해서 Nouveau driver 가 로드되지 않았음을 확인합니다.

lsmod | grep nouveau

아무것도 출력되지 않았으면, 재대로 된 것입니다.





5. NVIDIA CUDA Toolkit 설치 (Runfile 설치 방식)


포스팅을 하는 현재 기준으로, Tensorflow 는 NVIDIA CUDA Toolkit 8.0 과 cuDNN v6 을 지원합니다. 하지만 Nvidia 에 최신 CUDA Toolkit 은 9.0 입니다. 만약 9.0을 설치한다면 Tensorflow 가 정상적으로 동작하지 않을 수 있습니다. 그러므로 주의해서 반드시 8.0 을 설치하도록 합니다.


아래 주소에서 다운로드를 받습니다.

https://developer.nvidia.com/cuda-80-ga2-download-archive


Patch 2 도 반드시 함께 다운로드 받습니다.

https://developer.nvidia.com/compute/cuda/8.0/Prod2/patches/2/cuda_8.0.61.2_linux-run


그리고 toolkit 과 Patch 2 를 각각을 아래와 같은 형식으로 설치합니다.

$ sudo sh cuda_<version>_linux.run




6. Graphic Driver 설치 실패시.

만약 드라이버 설치에 실패한다면, CUDA Toolkit 에 내장된 드라이버 목록에 현재 그래픽카드 드라이버가 없을 수 있습니다.
이때는 직접 드라이버를 직접 다운로드 받아서 설치합니다.

저는 Nvidia K80 이므로 아래처럼 다운로드 후 설치하였습니다.

sudo sh NVIDIA-Linux-x86_64-375.51.run


그리고나서 CUDA Toolkit 을 다시 설치합니다. 이때 NVIDIA Accelerated Graphics Driver 를 설치는 skip 합니다.




7. Graphical interface 를 다시 로드하기 위한 재부팅

위의 모든 것을 다시 로드하기 위해서 재부팅을 합니다.




8. Device Node 검증


/dev/nvidia* 에 파일들이 있는지 확인합니다.

그 어떤 파일도 없다면 아래 스크립트를 만들고 실행하여, 생성합니다.

#!/bin/bash 

/sbin/modprobe nvidia 

if [ "$?" -eq 0 ]; then 
    # Count the number of NVIDIA controllers found. 
    NVDEVS=`lspci | grep -i NVIDIA` 
    N3D=`echo "$NVDEVS" | grep "3D controller" | wc -l` 
    NVGA=`echo "$NVDEVS" | grep "VGA compatible controller" | wc -l` 
    
    N=`expr $N3D + $NVGA - 1` 
    for i in `seq 0 $N`; do 
        mknod -m 666 /dev/nvidia$i c 195 $i 
    done 
    
    mknod -m 666 /dev/nvidiactl c 195 255 
    
else 
    exit 1 
fi 

/sbin/modprobe nvidia-uvm 

if [ "$?" -eq 0 ]; then 
    # Find out the major device number used by the nvidia-uvm driver 
    D=`grep nvidia-uvm /proc/devices | awk '{print $1}'` 
    
    mknod -m 666 /dev/nvidia-uvm c $D 0 
else 
    exit 1 
fi


9. Driver 설치 확인


간혹 CUDA 8.0 에 포함된 Nvidia 드라이버가 현재 설치된 그래픽카드를 지원하지 않는 경우가 있다.

아래 명령어를 통해서 그래픽 카드 이름이 제대로 표시되는지 확인한다.


nvidia-smi

만약 제대로 표시되지 않는다면, Nvidia 홈페이지에서 그래픽카드 드라이버를 새로 받아서 드라이버만 재설치하면 된다.

설치 한 뒤에, 재부팅하고 아래 명령어를 실행해 준다.

modprobe --force-modversion nvidia-uvm



10. 환경변수 설정


설치가 완료되고나면, CUDA 와 Libary 경로를 잡아줍니다.

export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}


64비트일 경우,

export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64\
                         ${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

32비트일 경우,

export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib\
                         ${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}




cuDNN 설치




1. cuDNN 설치


먼저 아래 주소에서 cuDNN for Linux 를 다운로드 합니다.


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


주의할것은 이후에 설치할 Tensorflow 가 cuDNN v6.0 밖에 지원하지 않으므로, cuDNN v6.0 을 받아야 합니다.

글을 작성하는 현재로서는 그렇습니다.(Tensorflow 1.3.0)


이후 아래처럼 압축을 푼 후, 파일들을 CUDA 폴더에 복사해 줍니다.


tar -xzvf cudnn-8.0-linux-x64-v6.0.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/include/cudnn.h



2. 환경변수 설정


아래처럼 CUDA_HOME 을 추가시켜 줍니다.

export CUDA_HOME=/usr/local/cuda








Python 환경 설정




1. virtualenv 설치


경험상 virtualenv 에 설치하는게 가장 나은것 같습니다.


먼저 python-pip 를 설치하려면 EPEL-Repository 가 추가되어 있어야 합니다.

추가는 아래처럼 합니다.

sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

이후 virtualenv 는 아래처럼 설치 합니다.

sudo yum install python-pip python-devel.x86_64 python-virtualenv

이후 설치한 것들을 업데이트를 합니다.
sudo pip install --upgrade pip
sudo pip install --upgrade setuptools
sudo pip install --upgrade virtualenv


2. virtualenv 를 통해서 가상공간 만들기

이제 Tensorflow 를 위한 가상공간을 만들어야 합니다.
virtualenv --system-site-packages ~/tensorflow

그리고 활성화는 아래처럼 합니다.
source ~/tensorflow/bin/activate


3. Tensorflow 설치


pip install --upgrade tensorflow-gpu






설치 최종확인




아래 샘플코드를 돌려서 Tensorflow 가 제대로 돌아가는지 확인합니다.

>>> import tensorflow as tf 
>>> hello = tf.constant('Hello, TensorFlow!') 
>>> sess = tf.Session() 
>>> print(sess.run(hello))


이상없이 동작하면, 설치 완료입니다.


만약 libcusolver.so.8.0 과 같은 *.so 파일을 찾지 못하는 에러가 발생하는데, 실제로 /usr/local/cuda-8.0 에 파일이 있다면,
아래와 같이 .bash_profile 에 LD_LIBRARY_PATH 를 추가시켜 줍니다.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64/

이후 .bash_profile 을 다시 읽어줍니다.
source ~/.bash_profile






추가 - 버전에 따른 설치




본 포스팅 이후 텐서플로우의 버전은 나날이 올라가고 있습니다.
하지만 기본적인 설치 방법은 크게 바뀌거나 변경된 것이 없습니다.

텐서플로우 공식페이지에 가면, 각 버전별로 어떤 CUDA 와 LIBRARY 를 설치해야 하는지 나와 있습니다.
현재 최신버전인 1.7 을 보면 아래처럼 안내하고 있습니다.



CUDA Toolkit 은 9.0

cuDNN 은 7.0


버전별로 해당 의존 라이브러리 버전만 다릅니다 :)

이를 참고하여 버전만 맞게 설치하시면 됩니다.