Mac OSX에서 eGPU 프로그래밍 환경 구축 (Keras, Tensorflow)

원래 GPU를 쌓지 않은 mac에서 GPU를 사용한 기계 학습을 하고 싶기 때문에, 외장 GPU 박스와 그래픽 보드를 준비해 환경 구축까지 실시했습니다.

환경


  • Mac Mini (macOS Sierra 10.12.6)
  • Python 3.6.3 (pyenv 사용)
  • AKiTiO Node Thunderbolt3 eGFX Box
  • NVIDIA GeForce GTX1080

  • Mac Mini는 Thunderbolt3을 지원하지 않으므로 Thunderbolt3 to Thunderbolt2 어댑터 필요

    GPU 설정



    이 기사를 참조하여 GPU를 설정했습니다.
    Macbook Pro에서 Thunderbolt 2 연결 외부 GPU 사용(Netstor NA211TB + GeForce GTX 760)

    NVIDIA Web Driver는 378.05.05.25f01을 설치합니다.



    CUDA, cuDNN 설치



    CUDA8.0을 설치하고 업데이트하면 Tensorflow가 제대로 GPU를 인식했습니다.
    추천 기사: Tensorflow에서 OSX GPU가 지원되었습니다.

    CUDA





    CUDA Toolkit 8.0 GA2 (Feb 2017) 설치
    htps : //에서 ゔぇぺぺr. 응아아. 코 m / 쿠다 - 토키 t - 아 r ゔ

    설치 후 업데이트

    시스템 환경 설정 -> CUDA -> Install CUDA Update
    path 추가

    ~/.bash_profile
    #CUDA
    export CUDA_HOME=/usr/local/cuda
    export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib"
    export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:$CUDA_HOME/lib"
    export PATH="$CUDA_HOME/bin:$PATH"
    

    cuDNN



    다운로드하려면 등록 필요
    Download cuDNN v5.1 (Jan 20, 2017), for CUDA 8.0
    htps : //에서 ゔぇぺぺr. 응아아. 코 m / rdp / 쿠 드 - w w ぉ 아 d

    다운로드 한 내용을 압축 해제하고 내용을 cuda의 해당 폴더로 이동합니다.
    Finder로 부딪 칠 수 있습니다.
    $ cd ダウンロードしたフォルダ
    $ tar xzvf cudnn-8.0-osx-x64-v5.1.tgz
    $ sudo mv -v cuda/lib/libcudnn* /usr/local/cuda/lib
    $ sudo mv -v cuda/include/cudnn.h /usr/local/cuda/include
    

    GPU용 Tensorflow 설치


    pip에서 gpu 용 tensorflow (v1.1.0)를 설치하십시오.
    $ easy_install --upgrade pip
    $ easy_install --upgrade six 
    $ pip install tensorflow-gpu
    

    Tensorflow 동작 확인


    $ python
    Python 3.6.3 (default, Nov  1 2017, 20:28:06) 
    [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.38)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import tensorflow as tf
    >>> hello = tf.constant("Hello, TensorFlow")
    >>> sess = tf.Session()
    
    .
    .
    . 
    name: GeForce GTX 1080
    major: 6 minor: 1 memoryClockRate (GHz) 1.8095
    pciBusID 0000:c3:00.0
    Total memory: 8.00GiB
    Free memory: 7.19GiB
    .
    .
    .
    >>> print(sess.run(hello))
    'Hello, TensorFlow'
    >>> a = tf.constant(10)
    >>> b = tf.constant(16)
    >>> print(sess.run(a + b))
    26
    >>> b = tf.constant(32)
    >>> print(sess.run(a + b))
    42
    
    

    tf.Session ()에서 GPU를 인식하지 못하면 cuDNN 버전이 올바르지 않거나 올바르게 설치되지 않았을 수 있습니다.

    실행 속도 측정



    mnist에서 cpu, gpu의 실행 속도가 변경되었는지 확인하십시오.
    참고: Keras(TensorFlow 백엔드) 으로 MNIST(DCNN)

    Keras가 들어 있지 않은 경우
    pip install keras
    

    time 명령을 붙여 cpu, gpu 실행 시간을 비교해 본다.
    코드는 참고한 링크에서 인용

    mnist.py
    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    
    from keras.datasets import mnist
    from keras.utils import np_utils
    from keras.models import Sequential
    from keras.layers.convolutional import Convolution2D, MaxPooling2D
    from keras.layers.core import Activation, Flatten, Dense
    from keras.callbacks import EarlyStopping
    
    (X_train, y_train), (X_test, y_test) = mnist.load_data()
    nb_classes = 10
    
    X_train = X_train.reshape(-1, 1, 28, 28).astype('float32')
    X_test = X_test.reshape(-1, 1, 28, 28).astype('float32')
    X_train /= 255
    X_test /= 255
    y_train = np_utils.to_categorical(y_train, nb_classes)
    y_test = np_utils.to_categorical(y_test, nb_classes)
    
    model = Sequential()
    
    model.add(Convolution2D(nb_filter = 16, nb_row = 3, nb_col = 3, border_mode = 'same', input_shape = (1, 28, 28)))
    model.add(Activation('relu'))
    
    model.add(Convolution2D(nb_filter = 32, nb_row = 3, nb_col = 3, border_mode = 'same'))
    model.add(Activation('relu'))
    
    model.add(MaxPooling2D(pool_size = (2, 2), border_mode = 'same'))
    
    model.add(Convolution2D(nb_filter = 64, nb_row = 3, nb_col = 3, border_mode = 'same'))
    model.add(Activation('relu'))
    
    model.add(Convolution2D(nb_filter = 128, nb_row = 3, nb_col = 3, border_mode = 'same'))
    model.add(Activation('relu'))
    
    model.add(MaxPooling2D(pool_size = (2, 2), border_mode = 'same'))
    
    model.add(Flatten())
    
    model.add(Dense(1024))
    model.add(Activation('relu'))
    model.add(Dense(1024))
    model.add(Activation('relu'))
    model.add(Dense(nb_classes))
    model.add(Activation('softmax'))
    
    early_stopping = EarlyStopping(monitor = 'val_loss', patience = 2)
    
    model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
    model.fit(X_train, y_train, nb_epoch = 5, batch_size = 100, callbacks = [early_stopping])
    score = model.evaluate(X_test, y_test)
    print('Test loss:', score[0])
    print('Test accuracy:', score[1])
    
    time python mnist.py
    

    결과


  • cpu 4m18.574s
  • gpu 0m26.091s

  • 10배 가까이 빨라지고 있는 것을 확인할 수 있었습니다.
    했어.

    좋은 웹페이지 즐겨찾기