원래 연구실에 서버가 2대였는데 큰 서버가 하나 생겨서 원래 서버에서 쓰던 GPU를 옮겨 장착하게 되었다. 옮겨 장작했더니 Tensorflow를 실행할 때 오류가 발생하여 프로그램이 터져버렸다..ㅎㅎ 검색해보니 이러한 경우에는
1. 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 확인
일단
$ 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 설치 확인

일단 결과를 보니
$ sudo apt-get install nvidia-docker //nvidia-docker 재설치
재부팅을 하고 아래의 명령어로 nvidia-docker 실행 여부를 확인한다.
$ nvidia-docker run --rm nvidia/cuda nvidia-smi //nvidia-docker 설치 확인

- https://devyurim.github.io/2018/05/25/17.html
예시 코드를 실행해보니
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