Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save musalys/5db80976980df736ad43bb5e9dcd6ef7 to your computer and use it in GitHub Desktop.

Select an option

Save musalys/5db80976980df736ad43bb5e9dcd6ef7 to your computer and use it in GitHub Desktop.

Revisions

  1. @haje01 haje01 revised this gist Mar 14, 2016. 1 changed file with 5 additions and 0 deletions.
    Original file line number Diff line number Diff line change
    @@ -171,6 +171,11 @@ CUDA가 동작하는 지 확인합니다.
    Memory Clock rate: 2500 Mhz
    ...

    호스트 머신에서 CUDA를 사용할 때를 위해 `~/.profile`에 아래를 추가해둡니다.

    export PATH=/usr/local/cuda/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

    이제 GPU 머신의 준비가 끝났습니다. **여기까지의 작업을 AMI로 만들어 놓으면 필요할 때 바로 생성**해 쓰실 수 있습니다.

    ## Caffe 설치
  2. @haje01 haje01 revised this gist Mar 14, 2016. 1 changed file with 1 addition and 1 deletion.
    Original file line number Diff line number Diff line change
    @@ -129,7 +129,7 @@ CUDA 인스톨러를 받습니다.
    드라이버를 설치합니다.

    $ cd nvidia_installers
    $ sudo ./NVIDIA-Linux-x86_64-340.29.run
    $ ./NVIDIA-Linux-x86_64-340.29.run

    라이센스에는 Accept 후 나머지는 기본 값을 선택합니다. 설치가 끝나면 NVIDIA 커널 모듈을 로딩 후

  3. @haje01 haje01 revised this gist Mar 14, 2016. 1 changed file with 1 addition and 1 deletion.
    Original file line number Diff line number Diff line change
    @@ -129,7 +129,7 @@ CUDA 인스톨러를 받습니다.
    드라이버를 설치합니다.

    $ cd nvidia_installers
    $ ./NVIDIA-Linux-x86_64-340.29.run
    $ sudo ./NVIDIA-Linux-x86_64-340.29.run

    라이센스에는 Accept 후 나머지는 기본 값을 선택합니다. 설치가 끝나면 NVIDIA 커널 모듈을 로딩 후

  4. @haje01 haje01 revised this gist Dec 17, 2015. 1 changed file with 1 addition and 1 deletion.
    Original file line number Diff line number Diff line change
    @@ -275,7 +275,7 @@ CPU 모드로는 **19분 30초**가 걸렸습니다. 수행 시간에 큰 차이

    CUDA를 도커 컨테이너에서 쓰기 위해서는 호스트와 컨테이너의 NVIDIA드라이버 버전이 같아야 한다는 제약이 있습니다. 따라서 도커의 장점인 환경 분리는 많이 약해진 것 같습니다.

    그러나 **호스트 환경은 AMI로, 다양한 딥러닝 패키지는 도커 이미지로 만들어 두면 필요에 따라 조합**해 활용할 수 있는 장점이 있겠습니다.
    그러나 **호스트 환경은 AMI로, 다양한 딥러닝 패키지는 도커 이미지로 만들어 두면 필요에 따라 선택**해 활용할 수 있는 장점이 있겠습니다.

    다 사용한 스팟 인스턴스는 제거해 비용을 아끼도록 합시다.

  5. @haje01 haje01 revised this gist Dec 17, 2015. 1 changed file with 1 addition and 1 deletion.
    Original file line number Diff line number Diff line change
    @@ -275,7 +275,7 @@ CPU 모드로는 **19분 30초**가 걸렸습니다. 수행 시간에 큰 차이

    CUDA를 도커 컨테이너에서 쓰기 위해서는 호스트와 컨테이너의 NVIDIA드라이버 버전이 같아야 한다는 제약이 있습니다. 따라서 도커의 장점인 환경 분리는 많이 약해진 것 같습니다.

    그러나 **호스트 환경은 AMI로, 다양한 딥러닝 프레임워크 환경은 도커 이미지로 만들어 두면 필요에 따라 조합**해 활용할 수 있는 장점이 있겠습니다.
    그러나 **호스트 환경은 AMI로, 다양한 딥러닝 패키지는 도커 이미지로 만들어 두면 필요에 따라 조합**해 활용할 수 있는 장점이 있겠습니다.

    다 사용한 스팟 인스턴스는 제거해 비용을 아끼도록 합시다.

  6. @haje01 haje01 revised this gist Dec 17, 2015. 1 changed file with 1 addition and 1 deletion.
    Original file line number Diff line number Diff line change
    @@ -275,7 +275,7 @@ CPU 모드로는 **19분 30초**가 걸렸습니다. 수행 시간에 큰 차이

    CUDA를 도커 컨테이너에서 쓰기 위해서는 호스트와 컨테이너의 NVIDIA드라이버 버전이 같아야 한다는 제약이 있습니다. 따라서 도커의 장점인 환경 분리는 많이 약해진 것 같습니다.

    그러나 **호스트 환경은 AMI로, 다양한 딥러닝 프레임워크 환경은 도커로 만들어 두면 필요에 따라 조합**해 활용할 수 있는 장점이 있겠습니다.
    그러나 **호스트 환경은 AMI로, 다양한 딥러닝 프레임워크 환경은 도커 이미지로 만들어 두면 필요에 따라 조합**해 활용할 수 있는 장점이 있겠습니다.

    다 사용한 스팟 인스턴스는 제거해 비용을 아끼도록 합시다.

  7. @haje01 haje01 revised this gist Dec 17, 2015. 1 changed file with 1 addition and 1 deletion.
    Original file line number Diff line number Diff line change
    @@ -230,7 +230,7 @@ Caffe 컨테이너를 시작합니다.

    Caffe 모듈 `import`를 테스트 해봅니다.

    $ipython
    $ ipython
    Python 2.7.6 (default, Jun 22 2015, 17:58:13)
    Type "copyright", "credits" or "license" for more information.

  8. @haje01 haje01 revised this gist Dec 17, 2015. 1 changed file with 2 additions and 2 deletions.
    Original file line number Diff line number Diff line change
    @@ -254,7 +254,7 @@ MNIST 데이터를 설치합니다.
    $ ./data/mnist/get_mnist.sh
    $ ./examples/mnist/create_mnist.sh

    설치 중 libdc1394 관련 에러는 무시하셔도 됩니다.
    마찬가지로 libdc1394 관련 에러는 무시하셔도 됩니다.

    학습을 시작합니다.

    @@ -275,7 +275,7 @@ CPU 모드로는 **19분 30초**가 걸렸습니다. 수행 시간에 큰 차이

    CUDA를 도커 컨테이너에서 쓰기 위해서는 호스트와 컨테이너의 NVIDIA드라이버 버전이 같아야 한다는 제약이 있습니다. 따라서 도커의 장점인 환경 분리는 많이 약해진 것 같습니다.

    그러나 호스트 환경은 AMI로, 다양한 딥러닝 프레임워크 환경은 도커로 만들어 두면 필요에 따라 조합해 활용할 수 있는 장점이 있겠습니다.
    그러나 **호스트 환경은 AMI로, 다양한 딥러닝 프레임워크 환경은 도커로 만들어 두면 필요에 따라 조합** 활용할 수 있는 장점이 있겠습니다.

    다 사용한 스팟 인스턴스는 제거해 비용을 아끼도록 합시다.

  9. @haje01 haje01 revised this gist Dec 17, 2015. 1 changed file with 9 additions and 3 deletions.
    Original file line number Diff line number Diff line change
    @@ -226,7 +226,7 @@ Caffe 컨테이너를 시작합니다.
    +------------------------------------------------------+
    | NVIDIA-SMI 340.29 Driver Version: 340.29 |

    드라이버의 버전이 호스트와 다르면 CUDA가 동작하지 않습니다.
    참고로 **드라이버의 버전이 호스트와 다르면 CUDA가 동작하지 않습니다.**

    Caffe 모듈 `import`를 테스트 해봅니다.

    @@ -245,7 +245,7 @@ libdc1394 에러가 발생할 수 있으나, 무시해도 됩니다.

    ## MNIST 학습

    이 과정은 컨테이너 안에서 진행합니다. 먼저 Caffe가 설치된 폴더로 이동합니다.
    컨테이너 안에서 Caffe가 설치된 폴더로 이동합니다.

    cd /opt/caffe

    @@ -254,6 +254,12 @@ MNIST 데이터를 설치합니다.
    $ ./data/mnist/get_mnist.sh
    $ ./examples/mnist/create_mnist.sh

    설치 중 libdc1394 관련 에러는 무시하셔도 됩니다.

    학습을 시작합니다.

    $ examples/mnist/train_lenet.sh

    제 경우, 기본 옵션인 GPU 모드로 **3분 40초**가 걸렸습니다. 비교를 위해서 다음과 같이 CPU로도 해보겠습니다.

    `examples/mnist/lenet_solver.prototxt` 파일 아래 쪽의 `solver_mode: GPU``solver_mode: CPU`로 바꾸어 줍니다.
    @@ -267,7 +273,7 @@ CPU 모드로는 **19분 30초**가 걸렸습니다. 수행 시간에 큰 차이

    ## 마치며

    CUDA를 도커 컨테이너에서 쓰기 위해서는 **호스트와 컨테이너의 NVIDIA드라이버 버전이 같아야 한다** 제약이 있습니다. 따라서 도커의 장점인 환경 분리는 많이 약해진 것 같습니다.
    CUDA를 도커 컨테이너에서 쓰기 위해서는 호스트와 컨테이너의 NVIDIA드라이버 버전이 같아야 한다는 제약이 있습니다. 따라서 도커의 장점인 환경 분리는 많이 약해진 것 같습니다.

    그러나 호스트 환경은 AMI로, 다양한 딥러닝 프레임워크 환경은 도커로 만들어 두면 필요에 따라 조합해 활용할 수 있는 장점이 있겠습니다.

  10. @haje01 haje01 revised this gist Dec 17, 2015. 1 changed file with 5 additions and 0 deletions.
    Original file line number Diff line number Diff line change
    @@ -264,12 +264,17 @@ MNIST 데이터를 설치합니다.

    CPU 모드로는 **19분 30초**가 걸렸습니다. 수행 시간에 큰 차이가 나는 것을 확인할 수 있습니다.


    ## 마치며

    CUDA를 도커 컨테이너에서 쓰기 위해서는 **호스트와 컨테이너의 NVIDIA드라이버 버전이 같아야 한다**는 제약이 있습니다. 따라서 도커의 장점인 환경 분리는 많이 약해진 것 같습니다.

    그러나 호스트 환경은 AMI로, 다양한 딥러닝 프레임워크 환경은 도커로 만들어 두면 필요에 따라 조합해 활용할 수 있는 장점이 있겠습니다.

    다 사용한 스팟 인스턴스는 제거해 비용을 아끼도록 합시다.

    ![terminate](https://dl.dropboxusercontent.com/u/3391261/2015/terminate.png)

    ----

    감사합니다.
  11. @haje01 haje01 revised this gist Dec 17, 2015. 1 changed file with 14 additions and 11 deletions.
    25 changes: 14 additions & 11 deletions 도커와 AWS를 활용한 클라우드 딥러닝 환경 구축.md
    Original file line number Diff line number Diff line change
    @@ -76,11 +76,7 @@ GPU 정보를 확인합니다.

    NVIDIA 드라이버의 설치를 위해 아래의 작업이 필요합니다.

    #### 커널 관련 설치

    $ sudo -i
    $ apt-get install linux-source
    $ apt-get install linux-headers-`uname -r`
    $ apt-get install linux-image-extra-virtual

    마지막에 grub에 관한 질문이 나오면 "install the package maintainer's version"을 선택합니다.
    @@ -110,10 +106,15 @@ nouveau(누보)는 NVIDIA 그래픽카드를 위한 오픈소스 드라이버입

    ### NVIDIA 드라이버 설치

    빌드에 필요한 패키지를 받습니다.
    빌드에 필요한 패키지를 받고

    $ sudo -i
    $ apt-get update && apt-get install build-essential
    $ apt-get install build-essential

    커널 소스를 설치합니다.

    $ apt-get install linux-source
    $ apt-get install linux-headers-`uname -r`

    CUDA 인스톨러를 받습니다.

    @@ -125,12 +126,12 @@ CUDA 인스톨러를 받습니다.
    $ mkdir nvidia_installers
    $ ./cuda_6.5.14_linux_64.run -extract=`pwd`/nvidia_installers

    드라이버 설치를 합니다.
    드라이버를 설치합니다.

    $ cd nvidia_installers
    $ ./NVIDIA-Linux-x86_64-340.29.run

    설치가 끝나면 NVIDIA 커널 모듈을 로딩 후
    라이센스에는 Accept 후 나머지는 기본 값을 선택합니다. 설치가 끝나면 NVIDIA 커널 모듈을 로딩 후

    $ modprobe nvidia

    @@ -148,6 +149,8 @@ CUDA 인스톨러를 받습니다.
    $ ./cuda-linux64-rel-6.5.14-18749181.run
    $ ./cuda-samples-linux-6.5.14-18745345.run

    설치 중 나오는 라이센스는 스페이스키를 눌러 끝까지 스킵 후 `accept`를 입력하면 됩니다. 나머지는 기본값을 선택합니다.

    CUDA가 동작하는 지 확인합니다.

    $ cd /usr/local/cuda/samples/1_Utilities/deviceQuery
    @@ -179,7 +182,7 @@ Caffe는 강력한 딥러닝 툴이지만, 설치가 까다로워 접근하기
    다음과 같이 도커를 설치합니다.

    $ wget -qO- https://get.docker.com/ | sh
    $ sudo usermod -aG docker ubuntu
    $ usermod -aG docker ubuntu

    계정 설정 적용을 위해 로그아웃 후 로그인 하면 docker를 사용할 수 있습니다.

    @@ -193,14 +196,14 @@ Caffe는 강력한 딥러닝 툴이지만, 설치가 까다로워 접근하기

    도커 컨테이너 안에서 호스트의 GPU 디바이스를 사용하기 위해서는 컨테이너 생성시 `--device`옵션을 사용해야 합니다.

    다음과 같이 호스트에서 컨테이너로 전달할 NVIDIA 디바이스를 확인합니다.
    먼저 호스트에서 컨테이너로 전달할 NVIDIA 디바이스를 확인하고,

    $ ls -la /dev | grep nvidia
    crw-rw-rw- 1 root root 252, 0 12월 16 02:41 nvidia-uvm
    crw-rw-rw- 1 root root 195, 0 12월 16 02:41 nvidia0
    crw-rw-rw- 1 root root 195, 255 12월 16 02:41 nvidiactl

    다음의 명령으로 Caffe 컨테이너를 시작합니다.
    Caffe 컨테이너를 시작합니다.

    $ docker run -dit --device /dev/nvidia-uvm:/dev/nvidia-uvm --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --name caffe haje01/caffe-gpu

  12. @haje01 haje01 revised this gist Dec 17, 2015. 1 changed file with 6 additions and 5 deletions.
    Original file line number Diff line number Diff line change
    @@ -76,13 +76,16 @@ GPU 정보를 확인합니다.

    NVIDIA 드라이버의 설치를 위해 아래의 작업이 필요합니다.

    #### 커널 소스 설치
    #### 커널 관련 설치

    $ sudo -i
    $ apt-get install linux-source
    $ apt-get install linux-headers-`uname -r`
    $ apt-get install linux-image-extra-virtual

    마지막에 grub에 관한 질문이 나오면 "install the package maintainer's version"을 선택합니다.


    #### nouveau 해제

    nouveau(누보)는 NVIDIA 그래픽카드를 위한 오픈소스 드라이버입니다. 이것이 NVIDIA 드라이버의 커널 모듈과 충돌하기에 해제해야 합니다.
    @@ -97,13 +100,13 @@ nouveau(누보)는 NVIDIA 그래픽카드를 위한 오픈소스 드라이버입
    alias nouveau off
    alias lbm-nouveau off

    커널에서 nouveau를 비활성화 후 리부팅 합니다.
    커널에서 nouveau를 비활성화 후

    $ echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
    $ update-initramfs -u
    $ reboot

    리부팅 후 다시 접속합니다.
    리부팅이 끝나면 다시 접속합니다.

    ### NVIDIA 드라이버 설치

    @@ -126,8 +129,6 @@ CUDA 인스톨러를 받습니다.

    $ cd nvidia_installers
    $ ./NVIDIA-Linux-x86_64-340.29.run

    grub에 관한 질문이 나오면 "package maintainers version"을 선택합니다.

    설치가 끝나면 NVIDIA 커널 모듈을 로딩 후

  13. @haje01 haje01 revised this gist Dec 17, 2015. 1 changed file with 4 additions and 3 deletions.
    Original file line number Diff line number Diff line change
    @@ -68,7 +68,9 @@ GPU 정보를 확인합니다.

    00:03.0 VGA compatible controller: NVIDIA Corporation GK104GL [GRID K520] (rev a1)

    간단히 GPU 머신이 준비되었습니다.
    간단히 GPU 머신이 준비되었습니다! 일단 OS 패키지를 업데이트해둡니다.

    $ sudo apt-get update

    ### 드라이버 설치 준비

    @@ -77,7 +79,6 @@ NVIDIA 드라이버의 설치를 위해 아래의 작업이 필요합니다.
    #### 커널 소스 설치

    $ sudo -i
    $ apt-get update
    $ apt-get install linux-source
    $ apt-get install linux-headers-`uname -r`
    $ apt-get install linux-image-extra-virtual
    @@ -108,7 +109,7 @@ nouveau(누보)는 NVIDIA 그래픽카드를 위한 오픈소스 드라이버입

    빌드에 필요한 패키지를 받습니다.

    $ su -i
    $ sudo -i
    $ apt-get update && apt-get install build-essential

    CUDA 인스톨러를 받습니다.
  14. @haje01 haje01 revised this gist Dec 17, 2015. 1 changed file with 11 additions and 4 deletions.
    15 changes: 11 additions & 4 deletions 도커와 AWS를 활용한 클라우드 딥러닝 환경 구축.md
    Original file line number Diff line number Diff line change
    @@ -76,26 +76,27 @@ NVIDIA 드라이버의 설치를 위해 아래의 작업이 필요합니다.

    #### 커널 소스 설치

    $ su -i
    $ sudo -i
    $ apt-get update
    $ apt-get install linux-source
    $ apt-get install linux-headers-`uname -r`
    $ apt-get install linux-image-extra-virtual

    #### nouveau 해제

    nouveau(누보)는 NVIDIA 그래픽카드를 위한 오픈소스 드라이버입니다. 이것은 NVIDIA 드라이버의 커널 모듈과 충돌하기에 해제해야 합니다.
    nouveau(누보)는 NVIDIA 그래픽카드를 위한 오픈소스 드라이버입니다. 이것이 NVIDIA 드라이버의 커널 모듈과 충돌하기에 해제해야 합니다.

    $ vi /etc/modprobe.d/blacklist-nouveau.conf

    하고, 다음 행들을 추가합니다.
    , 다음 행들을 추가합니다.

    blacklist nouveau
    blacklist lbm-nouveau
    options nouveau modeset=0
    alias nouveau off
    alias lbm-nouveau off

    커널에서 Nouveau를 비활성화 후 리부팅 합니다.
    커널에서 nouveau를 비활성화 후 리부팅 합니다.

    $ echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
    $ update-initramfs -u
    @@ -273,3 +274,9 @@ http://tleyden.github.io/blog/2014/10/25/cuda-6-dot-5-on-aws-gpu-instance-runnin

    http://tleyden.github.io/blog/2014/10/25/running-caffe-on-aws-gpu-instance-via-docker/







  15. @haje01 haje01 revised this gist Dec 17, 2015. 1 changed file with 7 additions and 8 deletions.
    Original file line number Diff line number Diff line change
    @@ -42,7 +42,7 @@ GPU 인스턴스 g2.2xlarge를 선택합니다.

    ![choose instance type](https://dl.dropboxusercontent.com/u/3391261/2015/choose%20instance%20type.png)

    스토리지는 넉넉하게 20GiB 정도로 설정합니다. 용량이 부족하면 `docker pull`에서 에러가 발생합니다.
    스토리지는 기본이 8GiB인데 넉넉하게 20정도로 설정합니다. 용량이 부족하면 `docker pull`에서 에러가 발생합니다.

    ![add storage](https://dl.dropboxusercontent.com/u/3391261/2015/add%20storage.png)

    @@ -76,16 +76,16 @@ NVIDIA 드라이버의 설치를 위해 아래의 작업이 필요합니다.

    #### 커널 소스 설치

    su -i
    apt-get install linux-source
    apt-get install linux-headers-`uname -r`
    apt-get install linux-image-extra-virtual
    $ su -i
    $ apt-get install linux-source
    $ apt-get install linux-headers-`uname -r`
    $ apt-get install linux-image-extra-virtual

    #### nouveau 해제

    nouveau(누보)는 NVIDIA 그래픽카드를 위한 오픈소스 드라이버입니다. 이것은 NVIDIA 드라이버의 커널 모듈과 충돌하기에 해제해야 합니다.

    vi /etc/modprobe.d/blacklist-nouveau.conf
    $ vi /etc/modprobe.d/blacklist-nouveau.conf

    하고, 다음 행들을 추가합니다.

    @@ -147,7 +147,7 @@ grub에 관한 질문이 나오면 "package maintainers version"을 선택합니

    CUDA가 동작하는 지 확인합니다.

    cd /usr/local/cuda/samples/1_Utilities/deviceQuery
    $ cd /usr/local/cuda/samples/1_Utilities/deviceQuery
    $ make
    $ ./deviceQuery
    ./deviceQuery Starting...
    @@ -273,4 +273,3 @@ http://tleyden.github.io/blog/2014/10/25/cuda-6-dot-5-on-aws-gpu-instance-runnin

    http://tleyden.github.io/blog/2014/10/25/running-caffe-on-aws-gpu-instance-via-docker/


  16. @haje01 haje01 revised this gist Dec 17, 2015. 1 changed file with 4 additions and 11 deletions.
    15 changes: 4 additions & 11 deletions 도커와 AWS를 활용한 클라우드 딥러닝 환경 구축.md
    Original file line number Diff line number Diff line change
    @@ -50,9 +50,7 @@ $0.1로 비딩을 하겠습니다.

    ![bid](https://dl.dropboxusercontent.com/u/3391261/2015/bidding.png)

    KeyPair 등의 설정을 마치고 인스턴스를 생성합니다.

    인스턴스 생성 및 접속 관련 막히는 부분이 있으면 [이재홍님의 글](http://pyrasis.com/book/TheArtOfAmazonWebServices) 을 참고하시기 바랍니다.
    KeyPair 등의 설정을 마치고 인스턴스를 생성합니다. 인스턴스 생성 및 접속 관련 막히는 부분이 있으면 [이재홍님의 글](http://pyrasis.com/book/TheArtOfAmazonWebServices)을 참고하시기 바랍니다.

    잠시 시간이 걸리고 스팟 인스턴스 탭에서 인스턴스가 Active 상태가 되면 인스턴스 탭으로 가서 접속 IP를 확인 합니다.

    @@ -62,7 +60,7 @@ KeyPair 등의 설정을 마치고 인스턴스를 생성합니다.

    확인한 IP로 `ssh` 로그인 하고

    ssh ec2-user@{IP 주소} -p22 -i {.pem파일 경로}
    ssh ubuntu@{IP 주소} -p22 -i {.pem파일 경로}

    GPU 정보를 확인합니다.

    @@ -250,15 +248,15 @@ MNIST 데이터를 설치합니다.
    $ ./data/mnist/get_mnist.sh
    $ ./examples/mnist/create_mnist.sh

    제 경우, 기본 옵션인 GPU 모드로 3분 40초가 걸렸습니다. 비교를 위해서 다음과 같이 CPU로도 해보겠습니다.
    제 경우, 기본 옵션인 GPU 모드로 **3분 40초** 걸렸습니다. 비교를 위해서 다음과 같이 CPU로도 해보겠습니다.

    `examples/mnist/lenet_solver.prototxt` 파일 아래 쪽의 `solver_mode: GPU``solver_mode: CPU`로 바꾸어 줍니다.

    다시 학습을 시작합니다.

    $ examples/mnist/train_lenet.sh

    CPU 모드로는 19분 30초가 걸렸습니다. 수행 시간에 큰 차이가 나는 것을 확인할 수 있습니다.
    CPU 모드로는 **19분 30초** 걸렸습니다. 수행 시간에 큰 차이가 나는 것을 확인할 수 있습니다.

    ## 마치며

    @@ -276,8 +274,3 @@ http://tleyden.github.io/blog/2014/10/25/cuda-6-dot-5-on-aws-gpu-instance-runnin
    http://tleyden.github.io/blog/2014/10/25/running-caffe-on-aws-gpu-instance-via-docker/







  17. @haje01 haje01 created this gist Dec 17, 2015.
    283 changes: 283 additions & 0 deletions 도커와 AWS를 활용한 클라우드 딥러닝 환경 구축.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,283 @@
    # 도커와 AWS를 활용한 클라우드 딥러닝 환경 구축

    글쓴이: 김정주([email protected])

    최근 딥러닝 관련 패키지들은 대부분 CPU와 GPU를 함께 지원하고 있습니다. GPU를 사용하면 보다 빠르게 학습 결과를 낼 수 있지만, GPU를 활용하기 위해서는 NVIDIA계열의 그래픽 카드, 드라이버 S/W 그리고 CUDA의 설치를 필요로 합니다.

    이 글에서는 AWS의 GPU 인스턴스와 도커를 활용해 딥러닝 패키지(Caffe)를 편리하게 사용하는 방법을 소개합니다.

    ---

    ## GPU 머신 준비

    클라우드 GPU 인스턴스 사용에는 다음과 같은 두가지 걸림돌이 있습니다.

    1. 높은 가격
    2. NVIDIA 드라이버 및 CUDA 설치

    높은 가격은 Spot Instance를 쓰는 것으로, 드라이버 및 CUDA설치는 AMI를 사용하는 것으로 해결합니다.

    ### 스팟 인스턴스 만들기

    현재 ap-northeast 리전에는 다음과 같은 GPU 인스턴스 타입이 있습니다.

    - g2.2xlarge (1GPU, 8vCPU, 15GiB)
    - g2.8xlarge (4GPU, 32vCPU, 60GiB)

    주의점은, GPU 인스턴스의 경우 리전을 아시아 태평양(토쿄)로 사용하면 스팟의 가격도 비쌉니다. 따라서 응답 속도는 느리지만 US East (N. Virginia) 리전에서 합니다.

    ![GPU 스팟 인스턴스 가격](https://dl.dropboxusercontent.com/u/3391261/2015/gpu%20spot%20price.png)

    AZ(Availability Zone)에 따라 다르긴 하지만, g2.2xlarge의 경우 시간당 100원 수준으로 저렴하게 이용할 수 있습니다. (AZ는 비딩 가격에 맞는 것이 자동으로 찾아집니다.)

    Spot Request탭에서 Request Spot instance를 선택합니다.

    ![request spot](https://dl.dropboxusercontent.com/u/3391261/2015/request%20spot.png)

    AMI선택 화면에서 기본 Ubuntu를 선택합니다

    ![choose image](https://dl.dropboxusercontent.com/u/3391261/2015/choose%20image.png)

    GPU 인스턴스 g2.2xlarge를 선택합니다.

    ![choose instance type](https://dl.dropboxusercontent.com/u/3391261/2015/choose%20instance%20type.png)

    스토리지는 넉넉하게 20GiB 정도로 설정합니다. 용량이 부족하면 `docker pull`에서 에러가 발생합니다.

    ![add storage](https://dl.dropboxusercontent.com/u/3391261/2015/add%20storage.png)

    $0.1로 비딩을 하겠습니다.

    ![bid](https://dl.dropboxusercontent.com/u/3391261/2015/bidding.png)

    KeyPair 등의 설정을 마치고 인스턴스를 생성합니다.

    인스턴스 생성 및 접속 관련 막히는 부분이 있으면 [이재홍님의 글](http://pyrasis.com/book/TheArtOfAmazonWebServices) 을 참고하시기 바랍니다.

    잠시 시간이 걸리고 스팟 인스턴스 탭에서 인스턴스가 Active 상태가 되면 인스턴스 탭으로 가서 접속 IP를 확인 합니다.

    ![enter image description here](https://dl.dropboxusercontent.com/u/3391261/2015/instance.png)

    ### 머신 환경 확인

    확인한 IP로 `ssh` 로그인 하고

    ssh ec2-user@{IP 주소} -p22 -i {.pem파일 경로}

    GPU 정보를 확인합니다.

    $ lspci | grep -i nvidia

    00:03.0 VGA compatible controller: NVIDIA Corporation GK104GL [GRID K520] (rev a1)

    간단히 GPU 머신이 준비되었습니다.

    ### 드라이버 설치 준비

    NVIDIA 드라이버의 설치를 위해 아래의 작업이 필요합니다.

    #### 커널 소스 설치

    su -i
    apt-get install linux-source
    apt-get install linux-headers-`uname -r`
    apt-get install linux-image-extra-virtual

    #### nouveau 해제

    nouveau(누보)는 NVIDIA 그래픽카드를 위한 오픈소스 드라이버입니다. 이것은 NVIDIA 드라이버의 커널 모듈과 충돌하기에 해제해야 합니다.

    vi /etc/modprobe.d/blacklist-nouveau.conf

    하고, 다음 행들을 추가합니다.

    blacklist nouveau
    blacklist lbm-nouveau
    options nouveau modeset=0
    alias nouveau off
    alias lbm-nouveau off

    커널에서 Nouveau를 비활성화 후 리부팅 합니다.

    $ echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
    $ update-initramfs -u
    $ reboot

    리부팅 후 다시 접속합니다.

    ### NVIDIA 드라이버 설치

    빌드에 필요한 패키지를 받습니다.

    $ su -i
    $ apt-get update && apt-get install build-essential

    CUDA 인스톨러를 받습니다.

    $ wget http://developer.download.nvidia.com/compute/cuda/6_5/rel/installers/cuda_6.5.14_linux_64.run

    압축을 풉니다.

    $ chmod +x cuda_6.5.14_linux_64.run
    $ mkdir nvidia_installers
    $ ./cuda_6.5.14_linux_64.run -extract=`pwd`/nvidia_installers

    드라이버 설치를 합니다.

    $ cd nvidia_installers
    $ ./NVIDIA-Linux-x86_64-340.29.run

    grub에 관한 질문이 나오면 "package maintainers version"을 선택합니다.

    설치가 끝나면 NVIDIA 커널 모듈을 로딩 후

    $ modprobe nvidia

    드라이버 버전을 확인합니다.

    $ nvidia-smi
    Thu Dec 17 06:01:05 2015
    +------------------------------------------------------+
    | NVIDIA-SMI 340.29 Driver Version: 340.29 |

    ### CUDA 설치

    이제 CUDA와 샘플을 설치합니다.

    $ ./cuda-linux64-rel-6.5.14-18749181.run
    $ ./cuda-samples-linux-6.5.14-18745345.run

    CUDA가 동작하는 지 확인합니다.

    cd /usr/local/cuda/samples/1_Utilities/deviceQuery
    $ make
    $ ./deviceQuery
    ./deviceQuery Starting...

    CUDA Device Query (Runtime API) version (CUDART static linking)

    Detected 1 CUDA Capable device(s)

    Device 0: "GRID K520"
    CUDA Driver Version / Runtime Version 6.5 / 6.5
    CUDA Capability Major/Minor version number: 3.0
    Total amount of global memory: 4096 MBytes (4294770688 bytes)
    ( 8) Multiprocessors, (192) CUDA Cores/MP: 1536 CUDA Cores
    GPU Clock rate: 797 MHz (0.80 GHz)
    Memory Clock rate: 2500 Mhz
    ...

    이제 GPU 머신의 준비가 끝났습니다. **여기까지의 작업을 AMI로 만들어 놓으면 필요할 때 바로 생성**해 쓰실 수 있습니다.

    ## Caffe 설치

    Caffe는 강력한 딥러닝 툴이지만, 설치가 까다로워 접근하기가 쉽지 않습니다. 이에 도커를 사용하여 설치합니다.

    ### 도커 설치

    다음과 같이 도커를 설치합니다.

    $ wget -qO- https://get.docker.com/ | sh
    $ sudo usermod -aG docker ubuntu

    계정 설정 적용을 위해 로그아웃 후 로그인 하면 docker를 사용할 수 있습니다.

    ### 이미지 설치

    미리 빌드해서 올린 도커 이미지 파일을 내려 받습니다.

    $ docker pull haje01/caffe-gpu

    ### 컨테이너 생성

    도커 컨테이너 안에서 호스트의 GPU 디바이스를 사용하기 위해서는 컨테이너 생성시 `--device`옵션을 사용해야 합니다.

    다음과 같이 호스트에서 컨테이너로 전달할 NVIDIA 디바이스를 확인합니다.

    $ ls -la /dev | grep nvidia
    crw-rw-rw- 1 root root 252, 0 12월 16 02:41 nvidia-uvm
    crw-rw-rw- 1 root root 195, 0 12월 16 02:41 nvidia0
    crw-rw-rw- 1 root root 195, 255 12월 16 02:41 nvidiactl

    다음의 명령으로 Caffe 컨테이너를 시작합니다.

    $ docker run -dit --device /dev/nvidia-uvm:/dev/nvidia-uvm --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --name caffe haje01/caffe-gpu

    컨테이너의 정보를 살펴봅니다.

    $ docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    4209a9436996 haje01/caffe-gpu "/bin/bash" 2 seconds ago Up 2 seconds caffe

    ### 컨테이너 확인
    이제 컨테이너 안으로 들어가겠습니다.

    $ docker exec -ti caffe bash

    컨테이너의 드라이버 버전을 확인합니다.

    $ nvidia-smi
    Thu Dec 17 06:01:16 2015
    +------------------------------------------------------+
    | NVIDIA-SMI 340.29 Driver Version: 340.29 |

    드라이버의 버전이 호스트와 다르면 CUDA가 동작하지 않습니다.

    Caffe 모듈 `import`를 테스트 해봅니다.

    $ipython
    Python 2.7.6 (default, Jun 22 2015, 17:58:13)
    Type "copyright", "credits" or "license" for more information.

    IPython 4.0.0 -- An enhanced Interactive Python.

    In [1]: import caffe
    libdc1394 error: Failed to initialize libdc1394

    libdc1394 에러가 발생할 수 있으나, 무시해도 됩니다.

    이제 Caffe를 사용할 수 있는 환경이 되었습니다.

    ## MNIST 학습

    이 과정은 컨테이너 안에서 진행합니다. 먼저 Caffe가 설치된 폴더로 이동합니다.

    cd /opt/caffe

    MNIST 데이터를 설치합니다.

    $ ./data/mnist/get_mnist.sh
    $ ./examples/mnist/create_mnist.sh

    제 경우, 기본 옵션인 GPU 모드로 3분 40초가 걸렸습니다. 비교를 위해서 다음과 같이 CPU로도 해보겠습니다.

    `examples/mnist/lenet_solver.prototxt` 파일 아래 쪽의 `solver_mode: GPU``solver_mode: CPU`로 바꾸어 줍니다.

    다시 학습을 시작합니다.

    $ examples/mnist/train_lenet.sh

    CPU 모드로는 19분 30초가 걸렸습니다. 수행 시간에 큰 차이가 나는 것을 확인할 수 있습니다.

    ## 마치며

    CUDA를 도커 컨테이너에서 쓰기 위해서는 **호스트와 컨테이너의 NVIDIA드라이버 버전이 같아야 한다**는 제약이 있습니다. 따라서 도커의 장점인 환경 분리는 많이 약해진 것 같습니다.

    그러나 호스트 환경은 AMI로, 다양한 딥러닝 프레임워크 환경은 도커로 만들어 두면 필요에 따라 조합해 활용할 수 있는 장점이 있겠습니다.

    ----

    감사합니다.

    ## 참조 링크
    http://tleyden.github.io/blog/2014/10/25/cuda-6-dot-5-on-aws-gpu-instance-running-ubuntu-14-dot-04/

    http://tleyden.github.io/blog/2014/10/25/running-caffe-on-aws-gpu-instance-via-docker/