2019-03-04 02:41:31.338657: E tensorflow/stream_executor/cuda/cuda_dnn.cc:378] Loaded runtime CuDNN library: 7201 (compatibility version 7200) but source was compiled with 7004 (compatibility version 7000).  If using a binary install, upgrade your CuDNN library to match.  If building from sources, make sure the library loaded at runtime matches a compatible version specified during compile configuration.
2019-03-04 02:41:31.339958: F tensorflow/core/kernels/conv_ops.cc:717] Check failed: stream->parent()->GetConvolveAlgorithms( conv_parameters.ShouldIncludeWinogradNonfusedAlgo<T>(), &algorithms) 


실제로 tensorflow-gpu실행 도중 얻은 에러이다. 

결론적으로 주황색 글에만 집중하면 된다. 

but source was compiled with 7004(compatibility version 7000)

이말은 즉, cuDNN버전을 위와 같은 버전으로 바꾸라는 말이다. 7004는 7.04, 7000은 7.00 을 뜻하는것 같고, 현재 내가 7.2의 cuDNN의 버전을 깔았고 무언가와 안맞다는 말이다. 

(tensorflow version, CUDA version, CPU performance 등등)


다시 결론에 들어가면 cuDNN버전을 명시해 준 버전으로 깔면 해결된다.

ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory

 

해결방법

sudo ldconfig /usr/local/cuda/lib64

하니까 바로 됨!

+ 서버를 원격으로 사용하면서, 외부 ip를 통해 jupyter notebook으로 사용하고 있는 경우는 아래와 같은 방법으로 사용한다.

import getpass
import os

password = getpass.getpass()
command = "sudo -S ldconfig /usr/local/cuda/lib64"
os.system('echo %s | %s' % (password, command))

1. Install CUDA

먼저 현재 상황은 nvidia driver는 설치가 된 상태 + linux버전의 CUDA 설치파일을 가지고 있는 상태(runfile)

설치파일이 없다면 다음과 같이 하면 된다.

$ cd 설치경로

$ wget https://developer.nvidia.com/compute/cuda/9.0/Prod/local_installers/cuda_9.0.176_384.81_linux-run

다음은 이 파일을 총 3개로 분리(추출)합니다.

  1. NVIDIA Driver installer
  2. CUDA installer
  3. CUDA Samples installer

 

1번은 이미 설치를 했으니 생략하고, 2번과 3번(생략해도됨)을 설치합니다.

$ chmod +x cuda_9.0.176_384.81_lnux.run

$ ./cuda_9.0.176_384.81_linux.run --extract=$HOME

이 방법을 택한 이유는 추출하여 따로따로 하지 않고 통째로 설치하니 에러가 떠서 이 방법으로 해보니 바로 설치가 되더군요.(에러 원인은 찾지 못하였습니다..)

이렇게하면 ~/home경로에 3개의 파일이 추출된 것을 볼 수 있습니다.

 

두번째로는 CUDA install 입니다.

$ sudo ./cuda-linux.9.0.176-22781540.run

 

세번쨰는 CUDA Samples install 입니다.

$ sudo ./cuda-samples.9.0.176-22781540-linux.run

 

여기까지가 참조1 블로그를 참조한것이고, 다음부터는 참조2 블로그에서 했습니다.

CUDA를 설치했으니 경로를 지정해주어야 작동하겠죠?

 

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

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

$ source ~/.bashrc

$ nvcc --version

이렇게 하면 nvcc --version에 의해 CUDA버전이 정상적으로 나와야합니다.


2. CUDNN install

cudnn을 nvidia 사이트에서 받았다고 가정하겠습니다. (버전에 따라 밑의 이름이 달라질 수 있으니 주의하세요, 무작정 따라하면 안됩니다!)

$ cd 설치경로

$ sudo tar -xzvf cudnn-9.0-linux-x64-v7.0.tgz 

$ cd cuda

$ sudo cp include/cudnn.h /usr/local/cuda/include

$ sudo cp lib64/libcudnn* /usr/local/cuda/lib64

$ sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

$ cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

 

출력 화면에 CUDNN_MAJOR가 포함되어 있으면 cudnn도 설치 완료!

 

사실 여러 블로그에서도 잘 설명이 되있지만, 우분투에 처음 설치해본 나로서는 자꾸 여러 에러가 떳는데, 

sudo apt-get remove --auto-remove nvidia-cuda-toolkit 을 통해 전부 삭제를 하고 저 위의 두 블로그를 참고하면서 했더니 곧장 잘 되었다. 

 

Reference

https://medium.com/@zhanwenchen/install-cuda-and-cudnn-for-tensorflow-gpu-on-ubuntu-79306e4ac04e
https://yunsangq.github.io/articles/2017-02/Ubuntu-16.04(64bit),-CUDA-8.0,-cuDNN-5.1-Install

nvidia 관련 작업을 할때, 예를 들어, nvidia-smi와 같은.. 

VNML: Driver/library version mismatch라는 에러를 볼 수 있다.

 

이를 해결하는 방법은 다음과 같다.


1. lsmod | grep nvidia

2. nvidia kernel을 언로딩 해주면 된다

- sudo rmmod nvidia_drm, nvidia_modeset, nvidia_uvm, nvidia ( 각 개인 상황에 따라 로딩되어있는게 다를 수 있음.)

3. 위와 같은 작업을 할 시 다음과 같은 에러도 많이 만날 수 있다.

- rmmod:ERROR: Module nvidia is in use

4. (3)번의 에러가 뜬다면 sudo lsof /dev/nvidia* 를 사용하여 현재 nvidia관련 프로세스를 확인한뒤에

sudo kill -9 process_id 를 사용하여 프로세스를 강제 종료시켜주면 된다.

5. 마지막으로 nvidia-smi를 사용하면 정상적인 결과를 볼 수 있다!

 

< Superpixel algorithm >

여러분들도 알다시피, 이미지는 그리드하게 픽셀로 이루어져 있습니다. 단일채널 또는 RGB채널 등으로 이루어져 있죠.

보통 이 알고리즘은 face detection이라던가 roadcrack에서 또는 다른 분야에서의 deep learning(이미지 분할)에 사용됩니다.

이 알고리즘에 의해서 얻을 수 있는 대략적인 이미지는 이렇습니다.

(이 이미지는 reference의 논문에 실려있습니다.)

이렇게 이미지를 pixel별로 구분하고, 후에는 grouping하여 사용할 수 있습니다.

이 grouping을 통해 이미지에서 일정 class나 object별로 구분지을 수 있겠죠?

(아래 그림은 두번째 논문에서 가져왔습니다.)

예를 들어, 밑 그림에서 색이 진한부분은 도로의 crack에 해당합니다.

 

 

https://ttic.uchicago.edu/~xren/research/superpixel/

에 따라 superpixel의 장점은 다음과 같습니다.

< properties of superpixel >

1. 계산 효율성: 위의 두 가지 예시처럼 각각 pixel을 grouping하는 것은 계산량이 꽤나 들것이라고 생각될 수도 있지만, 사실 이 알고리즘은 이미지의 복잡성을 수십 또는 수백만 픽셀 단위로 줄일 수 있습니다. 

2. 의미 공유: 이미지 안의 pixel은 단일 pixel로서의 의미는 가지지 않지만, superpixel로서의 pixel은 각각 그룹의 공통점을 공유하여 의미를 가지게 됩니다.

3. : 이미지에서의 객체 간 의미있는 바운더리를 찾아 분류할 수 있습니다. 이렇다 보면 사소한 특징을 분류할 수 없게 되기도 하지만, 위의 이미지와 같이 parameter(64, 256, 1024)을 통해 긍정적인 결과를 얻을 수 있습니다.

4. 표현 효율성(Representationally efficient) : 위의 말과 동일하게, 이미지를 단일 픽셀로 구분하게 되다보면 의미적으로, 계산적으로 상당히 비효율적입니다. 이에 반해서 이 알고리즘은 pixel 단위를 좀더 크게하여 좀 더 큰 의미를 가지는 pixel group을 형성하여 더욱 효율적으로 pixel끼리 상호작용할 수 있게 합니다. 

   

이 알고리즘은 크게 그래프 기반, gradient기반으로 이루어져 있습니다. 

  • graph-based : 각 픽셀을 그래프의 한 노드로, 노드 간 에지는 픽셀간 유사도에 비례하게 설정하여 그래프를 구성한다. 그리고 이 그래프의 cost를 최소화하는 상태를 선택하여 알고리즘을 실행한다. 
  • gradient-based : 미리 대충 나눠진 픽셀들에 대해서 클러스터링을 갱신하여 원하는 결과가 얻어질때까지 시행한다.

자세한 내용 및 식이나 알고리즘에 관한 설명은 이 곳을 참고하자.

 

Reference

Achanta, R., Shaji, A., Smith, K., Lucchi, A., Fua, P., & Süsstrunk, S. (2012). SLIC superpixels compared to state-of-the-art superpixel methods. IEEE transactions on pattern analysis and machine intelligence, 34(11), 2274-2282.
Varadharajan, S., Jose, S., Sharma, K., Wander, L., & Mertz, C. (2014, March). Vision for road inspection. In IEEE Winter Conference on Applications of Computer Vision (pp. 115-122). IEEE.
http://www.navisphere.net/1803/slic-superpixels-compared-to-state-of-the-art-superpixel-methods/
https://www.pyimagesearch.com/2014/07/28/a-slic-superpixel-tutorial-using-python/