GPU를 사용하도록 설정 for tensorflow

소개



2018/2/8 추가
TensorFlow의 GPU 환경 설정의 개인 결정판 (ubuntu 16.04))에 지금은 이것이 좋지 않다는 잠정판 메모를 썼습니다.

1.GPU 확인



GPU를 계산에 사용하고 싶다고 생각하고 Centos7에 환경을 도입했다. 목표는 tensorflow라고 하는지 keras의 계산을 GPU로 할 수 있도록 하는 것.
$ lspci | grep VGA
01:00.0 VGA compatible controller: NVIDIA Corporation GK208 [GeForce GT 710B] (rev a1)

htp : // bg. 아메다마. jp/엔트리/2017/03/13/123742
이 기사에 따르면, Compute Capability가 3.0 이상이 아니면 현재 보급되고 있는 CUDA8.0에 대응하고 있지 않다고 한다.
이 GPU는 초절 오래된 녀석이지만, Compute Capability가 3.5이므로 길을 갈 것 같다.

2.Keras에서 GPU를 사용하는 데 필요한 것



htp : // bg. 아메다마. jp/엔트리/2017/02/26/120215
이 기사에 따르면 다음 세 가지를 다운로드하면됩니다.
  • CUDA
  • cuDNN
  • TensorFlow-gpu

  • 3.CUDA 설치



    nvidia의 다음 문서를 따랐다.
    htp // // cs. 응아아. 코 m / 쿠다 / 쿠다 - s s 탓 치 온구이 - ぃ ん x / 어서 x. html # a xz z4l4RhQh5L

    우선은 환경의 확인으로부터.
    $ python --version
    # Python 3.5.2 :: Anaconda 4.2.0 (64-bit)
    
    $ uname -m && cat /etc/*release
    # CentOS Linux release 7.3.1611 (Core) 
    
    $ gcc --version
    # gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11)
    
    $ uname -r
    # 3.10.0-514.10.2.el7.x86_64
    

    모두 위의 URL의 시스템 요구 사항을 충족합니다.

    그래서 cuda를 설치하십시오.
    htps : //에서 ゔぇぺぺr. 응아아. 코 m / 쿠다 - ww 아아 ds



    위 그림과 같이 base installer를 cuda-downloads에 있는 대로 다음의 명령을 실행하여 설치할 수 있었다.
    sudo rpm -i cuda-repo-rhel7-8.0.61-1.x86_64.rpm
    sudo yum clean all
    sudo yum install cuda
    

    4.cuDNN 설치



    그런 다음 cuDNN을 설치합니다.
    htps : //에서 ゔぇぺぺr. 응아아. 이 m / 로
    여기에서 개발자 계정을 만들고,
    htps : //에서 ゔぇぺぺr. 응아아. 코 m / rdp / 쿠 드 - w w ぉ 아 d
    여기서 cuDNN을 다운로드합니다. linux cuda-8.0 버전을 다운로드했습니다.
    $ tar -xvzf cudnn-8.0-linux-x64-v5.1.tgz 
    

    여기에서 확장 된 것은 /usr/local/cuda/usr/local/cuda-8.0의 각 include, lib64 디렉토리로 이동했다. 자세한 내용은 6.1을 참조하십시오.

    다른 기사를 참고로 이하의 path를 추가했지만, 불필요한 것도 들어 있을지도.
    # CUDA path
    export CUDA_ROOT="/usr/local/cuda"
    export LIBRARY_PATH=$CUDA_ROOT/lib:$CUDA_ROOT/lib64:$LIBRARY_PATH  
    export LD_LIBRARY_PATH=$CUDA_ROOT/lib64/
    
    source ~/.bash_profile
    

    5.tensorflow-gpu 다운로드


    $ pip install tensorflow-gpu
    

    6.1.libcudnn.so.5를 찾을 수 없는 오류


    In [2]: import keras
    (import tensorflowでも)
    ImportError: libcudnn.so.5: cannot open shared object file: No such file or directory
    

    원래 cuda를 저장하는 디렉토리는 /usr/local/cuda에있었습니다. 거기에 cuDNN을 이동합니다. /usr/local/ 아래에는 cudacuda-8.0가 있으며 둘 다로 이동했습니다.
    $ sudo cp ./cudnn.h /usr/local/cuda/include
    $ sudo cp ./cudnn.h /usr/local/cuda-8.0/include
    
    $ sudo cp ./* /usr/local/cuda/lib64
    $ sudo cp ./* /usr/local/cuda-8.0/lib64
    

    둘 중 하나라면 ImportError: libcudnn.so.5: cannot open shared object file: No such file or directory
    오류가 발생했습니다.

    6.2. 드라이버가 없는 오류


    In [1]: %timeit -n 1 -r 1 %run mnist_cnn.py
    Using TensorFlow backend.
    x_train shape: (60000, 28, 28, 1)
    60000 train samples
    10000 test samples
    Train on 60000 samples, validate on 10000 samples
    Epoch 1/12
    2017-06-26 14:03:56.377779: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
    2017-06-26 14:03:56.377825: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
    2017-06-26 14:03:56.418415: E tensorflow/stream_executor/cuda/cuda_driver.cc:406] failed call to cuInit: CUDA_ERROR_UNKNOWN
    2017-06-26 14:03:56.418677: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:145] kernel driver does not appear to be running on this host (cosmos): /proc/driver/nvidia/version does not exist
     3584/60000 [>.............................] - ETA: 127s - loss: 1.4717 - acc: 0.5474
    
    

    이와 같이 드라이버가 없어 GPU를 검출 할 수 없다는 표시가 나왔다.

    6.3. 드라이버 다운로드





    드라이버를 넣으려고했지만 다음과 같은 Nouveau 커널 드라이버에 대한 오류가 발생했습니다.



    이 기사에서,

    Nouveau kernel driver가 존재하기 때문에 CUDA 드라이버를 설치할 수 없을 때의 조치

    참고로 Black list에 Nouveau를 추가하여 재부팅했습니다. 이렇게하면 드라이버를 성공적으로 설치할 수있었습니다.

    7.완성



    움직였다!
    In [1]: %timeit -n 1 -r 1 %run mnist_cnn.py
    Using TensorFlow backend.
    x_train shape: (60000, 28, 28, 1)
    60000 train samples
    10000 test samples
    Train on 60000 samples, validate on 10000 samples
    Epoch 1/12
    2017-06-26 16:53:56.009383: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
    2017-06-26 16:53:56.009431: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
    2017-06-26 16:53:56.848793: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:893] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
    2017-06-26 16:53:56.849080: I tensorflow/core/common_runtime/gpu/gpu_device.cc:940] Found device 0 with properties: 
    name: GeForce GT 710
    major: 3 minor: 5 memoryClockRate (GHz) 0.954
    pciBusID 0000:01:00.0
    Total memory: 980.75MiB
    Free memory: 970.88MiB
    2017-06-26 16:53:56.849126: I tensorflow/core/common_runtime/gpu/gpu_device.cc:961] DMA: 0 
    2017-06-26 16:53:56.849143: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971] 0:   Y 
    2017-06-26 16:53:56.849180: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GT 710, pci bus id: 0000:01:00.0)
    60000/60000 [==============================] - 114s - loss: 0.3256 - acc: 0.9009 - val_loss: 0.0758 - val_acc: 0.9759
    Epoch 2/12
    60000/60000 [==============================] - 110s - loss: 0.1120 - acc: 0.9670 - val_loss: 0.0527 - val_acc: 0.9831
    Epoch 3/12
    60000/60000 [==============================] - 110s - loss: 0.0855 - acc: 0.9745 - val_loss: 0.0443 - val_acc: 0.9858
    Epoch 4/12
    60000/60000 [==============================] - 110s - loss: 0.0719 - acc: 0.9789 - val_loss: 0.0370 - val_acc: 0.9865
    Epoch 5/12
    60000/60000 [==============================] - 110s - loss: 0.0621 - acc: 0.9817 - val_loss: 0.0362 - val_acc: 0.9879
    Epoch 6/12
    60000/60000 [==============================] - 110s - loss: 0.0570 - acc: 0.9835 - val_loss: 0.0326 - val_acc: 0.9885
    Epoch 7/12
    60000/60000 [==============================] - 110s - loss: 0.0499 - acc: 0.9853 - val_loss: 0.0344 - val_acc: 0.9894
    Epoch 8/12
    60000/60000 [==============================] - 110s - loss: 0.0485 - acc: 0.9855 - val_loss: 0.0298 - val_acc: 0.9911
    Epoch 9/12
    60000/60000 [==============================] - 110s - loss: 0.0441 - acc: 0.9874 - val_loss: 0.0304 - val_acc: 0.9899
    Epoch 10/12
    60000/60000 [==============================] - 109s - loss: 0.0416 - acc: 0.9878 - val_loss: 0.0289 - val_acc: 0.9910
    Epoch 11/12
    60000/60000 [==============================] - 110s - loss: 0.0398 - acc: 0.9882 - val_loss: 0.0295 - val_acc: 0.9899
    Epoch 12/12
    60000/60000 [==============================] - 109s - loss: 0.0374 - acc: 0.9888 - val_loss: 0.0274 - val_acc: 0.9909
    Test loss: 0.0273571792022
    Test accuracy: 0.9909
    1 loop, best of 1: 22min 31s per loop
    

    덧붙여서 core i7의 multiprocess로 28분으로, GPU를 사용해 22분이므로, 그렇게 변하지 않는 웃음(Geforce 710이므로 어쩔 수 없다)

    8. 추가: 기타 오류



    2017/12/11에 새로운 GPU를 구입해 설정했으므로 그 때의 메모.
    GTX1060을 샀다. 그건 그렇고, 환경은 centos에서 우분투로 바뀌었다.

    8.1 드라이버 버전의 엇갈림


    17-12-11 20:23:00.970215: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:189] libcuda reported version is: 384.90.0
    2017-12-11 20:23:00.970253: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:369] driver version file contents: """NVRM version: NVIDIA UNIX x86_64 Kernel Module  384.98  Thu Oct 26 15:16:01 PDT 2017
    GCC version:  gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.5)
    """
    2017-12-11 20:23:00.970277: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:193] kernel reported version is: 384.98.0
    2017-12-11 20:23:00.970288: E tensorflow/stream_executor/cuda/cuda_diagnostics.cc:303] kernel version 384.98.0 does not match DSO version 384.90.0 -- cannot find working devices in this configuration
    

    일단 드라이버를 지우고 6.3과 같은 방법으로 384.98.0의 드라이버를 넣으면 사라졌다.384.98.0의 드라이버는 영어 사이트에서는 좀처럼 발견되지 않고, 일본 사이트에서는 곧 발견된 것이 수수께끼다.

    9. 참고 정보



    2017/12/11 현재
    tensorflow 출시을 보면 1.5.0에서 cuda9.0에 대응할 예정이다. 현재 (1.4.0)는 지원되지 않습니다.
    출시되어 대응했다.

    10. 참고 링크



    Ubuntu에 Nvidia GPU의 Driver + CUDA를 Install (GTX1080 대응 버전)

    좋은 웹페이지 즐겨찾기