원래 연구실에 서버가 2대였는데 큰 서버가 하나 생겨서 원래 서버에서 쓰던 GPU를 옮겨 장착하게 되었다. 옮겨 장작했더니 Tensorflow를 실행할 때 오류가 발생하여 프로그램이 터져버렸다..ㅎㅎ 검색해보니 이러한 경우에는 GPU들의 드라이버 버전이 안맞아서 생기는 경우인것 같아 NVIDIA 드라이버를 재설치 하기로 하였다. 기존에 있던 GPU는 Titan Xp였고 새로 끼운 GPU는 GTX Titan X이다.
1. NVIDIA 드라이버 제거
맨 처음 새로운 드라이버를 설치하기 위해 아래의 명령어로 설치되있던 NVIDIA 드라이버를 제거 한다.
$ sudo apt-get remove --purge nvidia-*
지워보니 역시 드라이버가 충돌 했던것 같다.
2. NVIDIA 패키지 업데이트
$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
$ sudo sh -c 'echo "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64 /" >> /etc/apt/sources.list.d/cuda.list'
$ sudo sh -c 'echo "deb http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64 /" >> /etc/apt/sources.list.d/cuda.list'
$ sudo apt-get update
3. 설치 할 NVIDIA 드라이버 버전 확인
맨 처음 설치 법과 동일하게 아래의 NVIDIA 홈페이지에 가서 그래픽 카드 드라이버 버전을 확인한다.
http://www.nvidia.com/Download/Find.aspx?lang=en-us
아래의 명령어를 통하여 설치 가능한 드라이버 버전을 확인한다.
$ apt-cache search nvidia
396은 베타버전이라서 390으로 설치하였다.
$ sudo apt-get install nvidia-390
설치후 드라이버가 적용 될 수 있도록 재부팅 해준다.
4. 드라이버 설치 확인
아래의 명령어로 GPU 정보와 드라이버 설치를 확인한다.
$ nvidia-smi
아래와 같이 정보가 잘 뜨면 드라이버 설치 완료이다.
** 확인 후 재설치 ** 5. cuda, cudnn, nvidia-docker 확인
일단 cuda, cudnn, nvidia-docker 존재 여부를 확인해본다.
$ cat /usr/local/cuda/version.txt // cuda 설치 확인
$ cat /usr/include/cudnn.h | grep -E "CUDNN_MAJOR|CUDNN_MINOR|CUDNN_PATCHLEVEL" // cuDNN 설치 확인
$ nvidia-docker run --rm nvidia/cuda nvidia-smi // nvidia-docker 설치 확인
일단 결과를 보니 nvidia-docker 만 같이 지워진것 같다. nvidia-docker를 다시 설치 해 준다.
$ sudo apt-get install nvidia-docker //nvidia-docker 재설치
재부팅을 하고 아래의 명령어로 nvidia-docker 실행 여부를 확인한다.
$ nvidia-docker run --rm nvidia/cuda nvidia-smi //nvidia-docker 설치 확인
[!!] 혹시 deamon 관련하여 오류가 났다면 아래의 링크의 포스팅에서 맨 밑에 해결방법을 적어 두었다.
https://devyurim.github.io/2018/05/25/17.html
예시 코드를 실행해보니 AttributeError 가 발생하였다. 기존의 컨테이너를 삭제하고 기존에 백업해두었던 이미지로 컨테이너를 재 생성해 주니 잘 실행되었다.(nvidia-docker로 컨테이너 재생성) 나만의 문제일 수도 있다.
6. Tensorflow test code 실행
Tensorflow 공식 문서 를 참고하여 테스트를 진행하였다.
import tensorflow as tf
# Creates a graph.
a = tf . constant ([ 1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 ], shape = [ 2 , 3 ], name = 'a' )
b = tf . constant ([ 1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 ], shape = [ 3 , 2 ], name = 'b' )
c = tf . matmul ( a , b )
# Creates a session with log_device_placement set to True.
sess = tf . Session ( config = tf . ConfigProto ( log_device_placement = True ))
# Runs the op.
print ( sess . run ( c ))
gpu를 모두 인식하고 잘 계산이 되었다!
아래의 multi-gpu버전 코드를 이용하여 gpu를 지정하여 계산을 실행해 보았다.
import tensorflow as tf
# Creates a graph.
c = []
for d in [ '/device:GPU:0' , '/device:GPU:1' ]:
with tf . device ( d ):
a = tf . constant ([ 1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 ], shape = [ 2 , 3 ])
b = tf . constant ([ 1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 ], shape = [ 3 , 2 ])
c . append ( tf . matmul ( a , b ))
with tf . device ( '/cpu:0' ):
sum = tf . add_n ( c )
# Creates a session with log_device_placement set to True.
sess = tf . Session ( config = tf . ConfigProto ( log_device_placement = True ))
# Runs the op.
print ( sess . run ( sum ))
짠! 성공적이다!
reference
https://devyurim.github.io/2018/05/25/17.html
https://devyurim.github.io/2018/05/24/15.html
http://limit0.tistory.com/entry/Ubuntu-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-Nvidia-GPU-%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84-%EC%84%A4%EC%B9%98-%EB%B0%A9%EB%B2%95%EC%99%84%EA%B2%B0
https://www.tensorflow.org/programmers_guide/using_gpu