윈도우10 + 텐서플로 GPU 버전 설치

얼마만인지 모르겠다.
블로그에 올린 많은 글들 중에
나름 봐줬으면 하는 글들이 꽤 있는데
통계를 보면 우분투에 텐서플로 GPU 버전을 설치하는 글이 가장 인기가 많다.
왜 그런지는 모르겠다.
아직 그 부분이 해결되지 않았나?

엔비디아 1060에 GPU 버전을 설치해서 쓰고 있었는데
애들 핑계로 1070을 구매했고 지나가는 길에 설치를 시도했는데.. 잘 되지 않았다.
큰 아들 우재한테 시켰더니
며칠째 끙끙대기만 하고 결과가 나오지 않는다.

첫 번째 설치는 당연히 실패하고
여기저기 찾아다닌 끝에 3시간만에 성공했다.
그 후에 이 방식이 맞는지 검증하기 위해 다시 3시간을 보냈다.

설치 환경을 요약하면 아래와 같다.

- 운영체제 : 윈도우 10
- 그래픽카드 : 엔비디아 1070 TI
- 드라이버 : 419.67
- CUDA : 10.0
- cudnn : 10.0
- 파이썬 : 3.6.8
- 텐서플로 GPU : 1.13.1

 

2019년 3월 31일 현재 최신 버전은 CUDA 10.1 버전이다.
그런데.. 설치가 되질 않는다.
10.0을 설치하는 방법과 똑같이 진행을 했는데.. 실패다.
대여섯번 하다가 안 되면 그만할 줄도 알아야 한다.
컴퓨터 2대에서 시도했고, 아쉽지만 이번에는 10.0에서 만족하기로 했다.

파이썬은 미리 설치되어 있다고 가정한다.
엔비디아 그래픽 카드 드라이버는 
기본 설치 버전이 있는 상태에서 최신 버전인 419.67 버전을 설치했더니
자연스럽게 기본 버전은 제거가 됐다.

 

윈도우10에 설치된 엔비디아 그래픽 카드 프로그램 목록

 

얼마나 실패를 할지 몰라
이번에도 단단히 준비를 하고 시작했다.
GPU 버전 설치는 어찌 보면 다양한 버전들로부터 궁합이 잘 맞는 버전을 찾는 문제일 수 있다.

다운로드 받아 놓은 설치 파일들

 

설치 파일을 다운로드할 수 있는 사이트를 정리했다.
맨 앞의 텐서플로 공식 사이트에서 말하는 내용 정도는 보는 것이 좋겠다.
최신 버전을 설치하려면
시도한 사람이 많지 않은 상태에서는 부족하긴 하지만 공식 문서가 최신일 수도 있다.

 

 

설치 파일을 다운로드하는 화면은 넣지 않았다.
운영체제 버전 선택하는 그런 것들이 필요해 보이지는 않는데..
다만 설치 환경이 모두 다를 수 있기 때문에
자신의 환경에 맞는 버전을 정확하게 선택해야 할 것이다.

 

그래픽 카드 드라이버 다운로드

 

GPU 버전 설치는 CUDA와 cuDNN 설치가 전부일 수 있다.
가장 최신의 버전인 CUDA 10.1은 설치할 수 없어서 10.0 버전을 설치했다고 앞에서 얘기했다.

 

1. CUDA 10.0 설치
그림 상단에 버전 번호가 표시되어 있다. 
별도 옵션을 선택하는 것은 필요 없었다. 기본값인 [빠른 설치] 선택하고 [다음] 버튼으로 진행한다.
설치가 완료되고 나면 창을 닫는다.

 

CUDA 10.0 설치

 

2. cuDNN 복사
cuDNN 라이브러리는 압축 파일로 되어 있고
압축을 풀면 3개의 폴더가 나오고 그 안에는 각각 1개씩의 파일이 들어 있다.

일반적으로는 이들 파일은 CUDA 라이브러리가 설치된 폴더에 복사해서 덮어써야 하는데
어떤 블로그에서 덮어쓰는 것보다 복사해서 사용하는 것을 추천해서 나도 그렇게 했다.
덮어써도 될 수 있기는 한데
잘못될 경우를 대비해서 원본 파일을 보관해야 하는데
그것보다 cuDNN 폴더를 복사하는 것이 훨씬 쉽다.

cuDNN 라이브러리는 CUDA 라이브러리와 똑같은 버전을 사용해야 한다.
CUDA가 10.0이니까 cuDNN도 10.0을 사용한다.
압축을 푼 폴더에 가면 그 안에 cuda 폴더가 있고 그 안에 bin, include, lib 폴더가 있다.
cuda 폴더를 바탕화면에 복사한다.
이 시점에서 특별한 폴더를 찾을 생각하지 말고
설치에 성공하고 나면 원하는 폴더로 옮기는 것은 어렵지 않다.

 

3. 환경변수에 경로 추가
cuda 폴더를 덮어쓰지 않았기 때문에
cuDNN 파일들에 대한 경로를 환경에 추가해야 한다.

[내 PC] - [속성] - [고급 시스템 설정]으로 들어간다.

 

[환경 변수] - [사용자 변수] - [Path] - [편집]으로 들어가서
바탕화면에 추가된 bin, include, lib 폴더의 경로를 추가한다.

앞의 그림 중에 가운데 그림에 보면
[시스템 변수]에 CUDA_PATH 항목이 보이는데, CUDA 라이브러리 설치가 잘 되었다는 뜻이다.

 

4. 가상환경 생성
파이썬 가상환경을 반드시 만들어야 하는 것은 아니지만
잘 안될 수도 있고 CPU와 GPU 버전을 함께 사용해야 할 수도 있으니까.

커맨드 창을 연다. 관리자 모드로 열지 않아도 된다.
가상환경을 여러 번 구축해야 할 수도 있으니까 폴더 이름 뒤에 숫자를 붙였다.

가상환경 생성 및 진입

 

순서대로 아래 명령어를 입력한다.
python -m venv tf_1
cd tf_1
Scripts\activate.bat

 

5. 텐서플로 설치
activate 명령을 통해 가상환경으로 들어갔다.
여기서부터는 나만의 파이썬을 사용한다고 생각하면 된다.

텐서플로 GPU 버전을 설치하는 명령을 입력한다.
버전을 명시하지 않았기 때문에 현재 시점에서 최신 버전인 1.13.1을 설치한다.


pip install tensorflow-gpu

텐서플로 설치 중..

 

설치를 마치고 나면 노란색 글자가 보여 걱정이 된다.
pip 모듈을 업데이트하라는 말인데.. 텐서플로 GPU 버전하고는 상관없다. 하지 않아도 된다.

텐서플로 설치 완료

 

6. 설치 확인
python이라고 입력해서 파이썬 인터프리터를 구동한다.
갈매기(>>>) 프롬프트가 보이면 딱 한 줄만 입력하면 된다.

>>> import tensorflow

이 코드 한 줄에 대해 에러가 나지 않으면 성공이다.
그래픽 카드 버전을 뜻하는 빨간색의 메시지는 나타나지 않는다.
나중에 코드를 더 넣고 구동하게 되면 그때는 볼 수 있다.

이 한 줄의 코드로 안심이 되지 않는다면
파이참 등의 에디터를 통해 텐서플로 코드를 구동해 본다.
나는 mnist를 비롯해서 고양이와 강아지도 돌려봤다. 
너무 감격적이다.


많은 글을 읽었는데
성공의 핵심은 cuDNN 라이브러리를 바탕화면에 복사해서 사용한 것이 아닐까 생각한다.
별별정보님께서 올려놓은 [tensorflow gpu install - NVIDIA CUDA 설치하기]를 참고했다.

추가로 될거라고 생각했던 것도 있는데 CUPTI와 관련된 것이다.
텐서플로 공식 페이지에서 이 부분에 대해 언급했기 때문에 어떤 식으로든 설치에 관여할 것이라 생각했다.
[Windows 10에서 tensorflow-gpu 설치]에 설명되어 있고
혹시 앞의 과정에서 에러가 난다면 시도해 볼 수 있는 방법이다.

하나 더.
1.13 버전이 나온지 얼마 안되었기 때문에
설치 관련 글을 읽어보면 CUDA 9.0 또는 9.2 버전에 대한 얘기가 많다.
10.0 설치가 잘 되지 않았다면
굳이 10.0을 고집할 필요는 없어 보인다.

처음에 CUDA 9.0 버전 설치로 성공했는데
10.0 버전도 되는지 확인하고 싶었고 성공했다.
다만 9.0 버전을 설치할 때는 반드시 텐서플로 1.12 버전을 사용해야 한다.
텐서플로를 설치할 때 버전 번호를 명시하면 된다.

pip install tensorflow-gpu==1.12

수업을 해야 해서
내가 가장 많이 볼 거라고 생각하고 만들었다.
새벽 1시 30분.
졸려서 혹시 빠진 내용이 있을지도 모르겠다.
확인은 내일 하는 걸로.

 

[파이썬] scipy 설치

윈도우 환경에서 대부분의 모듈이 파이참 내부에서 설치가 되는데 유독 안되는 것이 scipy 모듈이다.

numpy와 matplotlib, pandas는 설치가 너무 잘 된다.

수업 시간 중에 설치 관련 문제가 생겨서 정리하게 됐다.


scipy 설치에서 중요한 점은

scipy 모듈을 우선 설치해야 하기 때문에 나머지 관련 모듈도 같은 방식으로 설치해야 한다는 점.

특히 numpy 모듈은 반드시 mkl을 포함하고 있는 버전을 설치해야 한다. 


1. 구글에서 install scipy window 검색

   현재 시점에서는 첫 번째 항목을 선택하면 되는데.. 바뀔 수 있으니 제목을 보고 판단해야 한다.


2. Installing the SciPy Stack — SciPy.org (첫 번째 항목)

   클릭하면 scipy 공식 홈페이지로 이동한다. (링크)


3. 페이지 맨 아래쪽 Windows packages

   위의 설치 페이지로 이동한 후에, 화면 맨 아래에 보면 윈도우 도움말이 나온다.

   pre-built Windows installers 클릭 (링크)

   실제 모듈을 찾기 위해서는

   아래와 같이 복잡한 형태에서 찾아야 하므로 검색(Ctrl+F) 기능을 이용하는 것이 좋다.


4. Unofficial Windows Binaries for Python Extension Packages

   이동한 페이지 제목이 조금 이상하다.

   왜 unofficial(비공식)인지는 찾아보지 않았는데.. 설치 가능한 모듈이 잔뜩 들어있다.

   scipy 모듈이 아니어도 계속적으로 만나야 하는 사이트이다.


5. numpy-1.11+mkl 설치 페이지로 이동 (링크)

   버전이 여러 가지가 있기 때문에 주의가 필요하다.

   설치 시점에서 텐서플로우가 파이썬 3.6 버전을 지원하지 않아서 3.5 버전을 설치했다. 

   파이썬 3.5 버전에 윈도우 64비트라면 아래와 같다.

   numpy‑1.11.3+mkl‑cp35‑cp35m‑win_amd64.whl


   whl 파일을 설치할 때 사용하는 명령은 아래와 같다.

   pip install [whl 파일명]



6. Microsoft Visual C++ 2015 Redistributable 설치 (텐서플로우 설치 페이지에서 클릭)

   unofficial 사이트에서도 해당 모듈에 대한 링크를 제공하는데.. 최신 버전이 아니었다.

   텐서플로우 설치에서 이번 모듈을 설치한 경험이 있어서.. 쉽게 최신 버전을 설치했다.

   업데이트가 되면서 주소가 달라진다면, 텐서플로우 설치 페이지에서 확인하면 된다. (이동


7. scipy 설치 페이지로 이동 (링크)

   앞에서 설치한 numpy 모듈과 같은 방식으로 설치할 수 있다.

   파이썬 3.5 버전에 윈도우 64비트는 아래와 같다.

   scipy‑0.18.1‑cp35‑cp35m‑win_amd64.whl


8. scikit-learn, matplotlib, pandas 설치

   추가로 필요한 모듈이 있다면 설치한다.

   scikit-learn 모듈을 설치하는 과정에서 scipy 모듈이 필요했기 때문에 이들 모듈도 설치했다.

   모듈 이름을 검색해서 whl 파일을 다운로드한다.

   sklearn은 scikit-learn의 다른 이름이고, import에서 sklearn으로 표시되기 때문에 헷갈릴 수 있다.

텐서플로우 0.10 + 우분투 16.04 + CUDA 8.0 + 파이썬 3.5 설치

이번 글의 수명이 길지는 않을 것으로 보인다. 텐서플로우는 RC 버전이고, 그래픽 카드 또한 최신이고, 우분투 16.04도 방금 나온 최신 버전이고, 파이썬도 최신 버전이고. 검증하지 않은 것들이 모일 수 있기 때문에 설치 과정에서 수많은 시행착오를 거칠 수밖에 없었다. 최신이어서 참고할 사이트도 많이 없다.


컴퓨터 사양


문제점

1. 지포스 10 시리즈는 PASCAL 방식으로 제작되었다고 한다. 그래서인지 CUDA 7.5와 연동하면 정확도가 떨어지는 문제점이 있었다. 90%의 정확도가 아니라 10%의 정확도로 나와서 경악을 금치 못했다. 속도는 무지 빨랐다.

2. 텐서플로우 0.10과 CUDA 7.5 연동이 잘 되지 않았다. 처음에는 괜찮았던 기억이 있는데, 어느 순간부터는 충돌이 발생하면서 설치할 수 없었다. CUDA 8.0 설치를 포기해야겠다고 생각하면서 하위 버전 설치에 꽤나 주력했었다.

3. CUDA 8.0을 사용하려면 텐서플로우를 바이너리 버전이 아니라 소스코드 버전으로 설치해야 한다. 현재 시점에서는 텐서플로우 0.10에 대한 링크가 없어서 바이너리 버전 설치는 불가능했다. 당연히 0.9 버전을 설치하기 위해서도 많이 애를 썼었다. 소스코드 버전 설치는 컴파일부터 진행하기 때문에 해야 할 게 무척 많아진다.


공통 사항

1. 터미널(콘솔)

단축키 : ctrl + alt + t 또는 ctrl + alt + f1
처음에 터미널 창을 열면 항상 ~ 폴더에서 시작한다. ~ 폴더는 사용자의 홈 폴더를 말하고, 어디에 있건 "cd ~" 명령을 통해 항상 홈 폴더로 이동할 수 있다.

모든 설치는 터미널에서 진행되기 때문에 그래픽 화면이 전혀 사용되지 않는다. 화면 캡쳐할 것이 없다는 뜻이다. 입력하기가 번거롭기 때문에 본문에 있는 명령을 붙여 넣는 것이 쉬울 것이다. 터미널에서는 [ctrl+c, ctrl+v] 단축키가 동작하지 않으므로, 마우스 오른쪽 버튼 메뉴를 사용해야 한다.

[ctrl + alt + f1]은 그래픽 모드로부터 완전히 벗어난 형태의 터미널을 생성한다. 모니터 전체를 터미널이 덮는 모드를 말한다. 이와 같은 전체 터미널 모드는 엔비디아 드라이버를 설치할 때, 딱 한 번만 사용하고, 나머지는 모두 [ctrl + alt + t]를 사용한다.


2. 명령줄 자동완성

파일 이름을 입력할 때, TAB키를 누르면 일치하는 파일 이름을 자동으로 입력해 준다. 파일 이름을 여러 번 입력하기 때문에 기억하면 매우 편리하다. 간혹 동작하지 않을 때도 있는데, 잘못된 것이 아니라 리눅스의 환경 문제이므로, 그런 경우에는 차분하게 파일 이름을 모두 입력해야 한다.


3. 무한 로그인 에러 해결 방법

[ctrl + alt + f1] 단축키를 사용해서 터미널로 이동해서 다시 엔비디아 드라이버를 설치하면 된다. 무한 로그인 에러는 엔비디아 드라이버와의 충돌 과정에서 발생하기 때문에 다시 설치하면 사라진다.

이 에러는 상상을 초월할 정도의 유명한 에러인데, 별의별 방법으로 해결을 하려고 노력했지만 끝내 하지 못했었다. 이 방법을 알고 있었다면, 우분투 설치 횟수를 25회 정도로 막을 수도 있었다. 생각할수록 화가 난다.

그래픽 화면으로 넘어갈 때는 [alt + f7] 단축키. 다만 그 전에 아래 명령을 사용해서 그래픽 모드를 활성화시켜야 한다.
$ sudo service lightdm start


4. 텍스트 파일 편집

경로 등을 저장하기 위해 텍스트 파일을 편집하게 되는데, 이 때 gedit 프로그램을 사용한다. 파일을 열거나 저장할 때 아래와 같은 경고가 뜨는데, 설치와는 전혀 상관없다. 터미널에서 그래픽에 접근하는 과정에서 표시되는 경고일 뿐이다.

(gedit:27848): IBUS-WARNING **: The owner of /home/python-kim/.config/ibus/bus is not root!
(gedit:27848): Gtk-WARNING **: Calling Inhibit failed: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.gnome.SessionManager was not provided by any .service files

** (gedit:27848): WARNING **: Set document metadata failed: metadata::gedit-spell-enabled 속성 설정은 지원하지 않습니다
** (gedit:27848): WARNING **: Set document metadata failed: metadata::gedit-encoding 속성 설정은 지원하지 않습니다
** (gedit:27848): WARNING **: Set document metadata failed: metadata::gedit-position 속성 설정은 지원하지 않습니다


참고 사이트

1. 성공 사이트

https://marcnu.github.io
https://marcnu.github.io/2016-08-17/Tensorflow-v0.10-installed-from-scratch-Ubuntu-16.04-CUDA8.0RC-cuDNN5.1-1080GTX

순서대로 정리가 너무 잘 되어 있는 외국 사이트. 텐서플로우KR에 누가 올려놓은 자료인데.. 일단 내 컴퓨터와는 궁합이 너무 잘 맞았다.


2. 실패 사이트

http://textminingonline.com/dive-into-tensorflow-part-iii-gtx-1080-ubuntu16-04-cuda8-0-cudnn5-0-tensorflow

이 사이트의 내용에 대해서는 매번 실패를 했지만, CROSSTOOL.tlp 파일을 수정하는 부분만 있으면 성공할 거라고 생각한다. 이 방식은 그래픽 모드에서 전혀 벗어나지 않기 때문에 설치된다고 하면 이 방식이 훨씬 낫다. 설치 명령과 함께 에러 메시지도 표시하기 때문에 안심하고 진행할 수 있는 장점도 있다.


엔비디아 다운로드

헷갈리지 않게 미리 다운로드 받아서 설치 가능한 상태로 만들어 놓고 시작한다. 순서가 너무 많아서 헷갈린다. 윈도우와 똑같이 다운로드한 파일은 다운로드 폴더에 저장된다. 다운로드한 파일을 모두 홈 폴더로 복사하자. 나 같은 리눅스 초보는 홈 폴더에서 작업하는 것이 좋다. 리눅스 공부는 설치가 끝난 다음에 하도록 하자. 파일 복사는 윈도우와 동일한 탐색기를 사용하면 된다.


1. 드라이버 다운로드 (버전 367.44)

자신의 그래픽 카드에 맞는 드라이버를 다운로드 받아야 한다. 현재 버전은 367.44이고, Linux 64-bit 버전이어야 한다. 64비트 버전이 보이지 않으면, Operatiing System 항목에서 [Show all Operating Systems] 메뉴를 선택한다. 쉽게 실행할 수 있도록 실행 모드를 추가한다. 이제 실행 파일처럼 더블클릭으로 실행할 수 있는 상태가 된다.

$ chmod +x NVIDIA-Linux-x86_64-367.44.run


2. CUDA 다운로드 (버전 8.0RC) 회원 가입 필수

그림에 나와 있는 것처럼 정확하게 우분투16.04, 64비트 버전을 선택한다. 파일을 다운로드 받아서 설치하는 runfile(local)까지 선택한다. 이 파일의 확장자는 run이다. 현재 시점에서는 우분투에 기본 설치되는 gcc 5.4에 대한 패치 파일이 별도로 존재한다. 이 파일까지 함께 받는다. 파일 2개에 대해 한 번에 실행 권한을 준다.

$ chmod +x cuda_8.0.27_linux.run  cuda_8.0.27.1_linux.run


3. cuDNN 다운로드 (버전 5.1 Library for Linux) 회원 가입 필수

다운로드한 파일의 압축을 풀고, 외부 모듈이 실행할 수 있도록 이동하고 접근 권한을 바꾼다. 압축을 풀면 현재 폴더에 cuda 폴더를 생성하고 그 안에 파일을 넣어 둔다. 여기서는 CUDA 8.0을 사용하기 때문에 목표 폴더 이름에 cuda-8.0이 들어간다.


엔비디아 설치

1. 드라이버 설치

윈도우와 같은 그래픽 환경에서 이 글을 볼 것이다. 그렇다면 [ctrl + alt + f1]을 눌러서 터미널로 이동한다. 그래픽 화면을 종료하고 그래픽 카드를 구동하는 드라이버를 설치한다. 드라이버가 설치되면, 게임도 할 수 있고, 동영상도 볼 수 있고, 그래픽 카드를 사용하는 대부분의 것들을 할 수 있게 된다. 내 경우는 모니터 2대를 연결해서 사용할 수 있게 되었다. 드라이버 설치가 끝나면, 컴퓨터를 껐다가 켠다. (리부팅)

지금 보는 화면은 그래픽 화면이기 때문에 터미널 모드로 들어가면, 지금 보는 설명을 볼 수 없다. 외워도 좋고, 안 되면 종이에 써놓고 터미널로 입장하자.

드라이버 설치할 때 여러 번 엔터 키를 눌러야 한다. accept나 yes와 같은 긍정적인 것들만 선택하도록 한다. 6~7번 정도 필요하다.

$ sudo service lightdm stop
$ sudo init 3
$ sudo ./NVIDIA-Linux-x86_64-367.44.run
$ sudo reboot


드라이버 파일에 실행 권한을 주지 않았다면, 아래 명령을 통해서 run 파일을 구동할 수 있다. 다만 파일 이름을 자동으로 완성할 수 없기 때문에 직접 입력해야 한다.

$ sudo sh NVIDIA-Linux-x86_64-367.44.run


2. CUDA 메인 설치

컴퓨터가 새로 켜졌다. 터미널 모드로 입장해야 하니까, [ctrl + alt + t] 단축키를 누른다. 패치 파일을 포함한 2개 파일을 순서대로 모두 설치한다. 메인 파일에만 --override 옵션이 붙는다. gcc 5.3까지만 인정하기 때문에 이걸 무시하기 위해 추가하는 것이 override 옵션이다. 이걸 수정하기 위한 파일이 패치 파일이다.

$ sudo ./cuda_8.0.27_linux.run --override

드라이버 설치와 마찬가지로 실행 권한을 주지 않았다면, 아래 명령을 사용한다.

$ sudo sh cuda_8.0.27_linux.run --override

아래에 빨간 글자처럼 입력한다. '엔터'라고 되어 있는 항목은 default 값을 사용한다는 뜻이다. 가장 중요한 항목은 두 번째에 있는 361.77 드라이버 설치 문항이다. yes라고 입력하면, 앞에서 설치한 최신 버전을 덮어 쓴다. sample은 설치하지 않아도 되지만, CUDA가 설치되었는지 sample을 통해 확인할 수 있기 때문에 설치하는 것이 좋다.


# ----------------------------- 설치 내용 --------------------------------- #

Do you accept the previously read EULA? accept/decline/quit: accept
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 361.77? (y)es/(n)o/(q)uit: n
Install the CUDA 8.0 Toolkit? (y)es/(n)o/(q)uit: y
Enter Toolkit Location [ default is /usr/local/cuda-8.0 ]: 엔터
Do you want to install a symbolic link at /usr/local/cuda? (y)es/(n)o/(q)uit: y
Install the CUDA 8.0 Samples? (y)es/(n)o/(q)uit: y
Enter CUDA Samples Location [ default is /home/python-kim ]: 엔터

Installing the CUDA Toolkit in /usr/local/cuda-8.0 ...
Missing recommended library: libGLU.so.
Missing recommended library: libX11.so
Missing recommended library: libXi.so
Missing recommended library: libXmu.so

Installing the CUDA Samples in /home/python-kim ...
Copying samples to /home/python-kim/NVIDIA_CUDA-8.0_Samples now...

Finished copying samples.

============ Summary ============

Driver:   Not Selected
Toolkit:  Installed in /usr/local/cuda-8.0
Samples:  Installed in /home/python-kim, but missing recommended libraries

Summary에서 Driver는 설치되지 않은 것을 볼 수 있다. Toolkit은 설치되었지만, Samples는 설치되지 않은 항목이 있다. 361.77 드라이버를 설치할 때, OpenGL 라이브러리 설치를 물어보는데, 우리는 설치하지 않았기 때문에 OpenGL 샘플도 설치하지 않았다는 뜻이다. OpenGL은 우분투에서 그래픽 카드와 충돌나기로 유명하다. 우리는 자연스럽게 설치를 피했다.


3. CUDA 패치 설치

우분투에 기본으로 설치된 gcc 5.4 버전을 위한 패치 파일을 실행시킨다. override 옵션은 필요 없다. 설치가 너무 간단해서 신경써서 입력할 항목이 없다.

$ sudo ./cuda_8.0.27.1_linux.run


드라이버 설치와 마찬가지로 실행 권한을 주지 않았다면, 아래 명령을 사용한다.

$ sudo sh cuda_8.0.27.1_linux.run


# ----------------------------- 설치 내용 --------------------------------- #

Do you accept the previously read EULA?
accept/decline/quit: accept

Enter CUDA Toolkit installation directory
[ default is /usr/local/cuda-8.0 ]: 엔터

Installation complete!
Installation directory: /usr/local/cuda-8.0


4. 환경 구성

라이브러리와 CUDA를 사용할 수 있도록 경로를 추가한다. 먼저 환경 파일을 연다.

$ sudo gedit ~/.bashrc


아래 내용은 .bashrc 파일의 마지막에 추가한다.

export CUDA_HOME=/usr/local/cuda-8.0
export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}


추가한 내용을 즉각 반영한다.

$ source ~/.bashrc


5. 드라이버 및 CUDA 설치 확인

$ nvcc --version

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Wed_May__4_21:01:56_CDT_2016
Cuda compilation tools, release 8.0, V8.0.26


$ nvidia-smi

터미널에서는 깔끔하게 출력이 되는데, html 파일에서는 깨진다. 감안하고 보자.

Tue Aug 30 19:59:47 2016
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 367.44         Driver Version: 367.44        |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 106...  Off  | 0000:01:00.0      On |        N/A |
| 33%   33C    P8    10W / 130W |    257MiB /  6064MiB |   0%   Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes:             GPU Memory |
|  GPU  PID  Type  Process name     Usage |
|=============================================================================|
|   0   2733   G   /usr/lib/xorg/Xorg       227MiB |
|   0   3461   G   compiz      28MiB |
+-----------------------------------------------------------------------------+


6. CUDA 샘플 구동

현재 폴더(사용자 홈)에 샘플 폴더가 설치되고, 이름은 NVIDIA_CUDA-8.0_Samples. 이 폴더 안에 들어가면 여러 개의 폴더가 보이는데, 모두 CUDA로 확인할 수 있는 샘플들이다. 샘플을 구동하는 규칙은 모두 같다. 해당 폴더로 이동해서 make 명령을 입력하고, 생성된 실행 파일을 실행시킨다.

$ cd NVIDIA_CUDA-8.0_Samples/1_Utilities/bandwidthTest/
$ make

"/usr/local/cuda-8.0"/bin/nvcc -ccbin g++ -I../../common/inc  -m64    -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -gencode arch=compute_37,code=sm_37 -gencode arch=compute_50,code=sm_50 -gencode arch=compute_52,code=sm_52 -gencode arch=compute_60,code=sm_60 -gencode arch=compute_60,code=compute_60 -o bandwidthTest.o -c bandwidthTest.cu
"/usr/local/cuda-8.0"/bin/nvcc -ccbin g++   -m64      -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -gencode arch=compute_37,code=sm_37 -gencode arch=compute_50,code=sm_50 -gencode arch=compute_52,code=sm_52 -gencode arch=compute_60,code=sm_60 -gencode arch=compute_60,code=compute_60 -o bandwidthTest bandwidthTest.o
mkdir -p ../../bin/x86_64/linux/release
cp bandwidthTest ../../bin/x86_64/linux/release

$ ./bandwidthTest 

[CUDA Bandwidth Test] - Starting...
Running on...

 Device 0: GeForce GTX 1060 6GB
 Quick Mode

 Host to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)    Bandwidth(MB/s)
   33554432            12542.1

 Device to Host Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)    Bandwidth(MB/s)
   33554432            12322.1

 Device to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)    Bandwidth(MB/s)
   33554432            141467.7

Result = PASS

NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.


7. cuDNN 설치

이건 설치할 게 없다. 다운로드한 파일을 압축을 풀어서 복사해서 붙여넣기만 하면 된다. 앞에서 CUDA 샘플을 구동하기 위해 샘플 폴더로 이동했기 때문에 홈 폴더로 이동하는 것까지 포함한다.

$ cd ~
$ tar xvzf cudnn-8.0-linux-x64-v5.1.tgz
$ sudo cp cuda/include/cudnn.h /usr/local/cuda-8.0/include/
$ sudo cp cuda/lib64/* /usr/local/cuda-8.0/lib64/


텐서플로우 설치

1. 파이썬 환경 구축

우분투 16.04에는 파이썬 2.7과 3.5가 모두 설치되어 있다. 최신 버전을 무조건 좋아하기 때문에 여기서는 3.5 버전을 중심으로 얘기한다. 일단 텐서플로우 설치에 사용할 파이썬 도구를 설치한다. 혹시라도 이번 명령이 동작하지 않으면, 바로 아래 있는 [자바 JDK 설치]를 먼저 진행하기 바란다.컴퓨터를 껐다 켜게 되면, 설치 중인 정보가 날아가서 이번 명령이 실패할 수도 있다. 이때, [자바 JDK 설치]가 정보를 복구해줄 수도 있다.


파이썬 3.5
$ sudo apt-get install python3-pip python3-numpy swig python3-dev python3-wheel

파이썬 2.7
$ sudo apt-get install python-pip python-numpy swig python-dev python-wheel


2. 자바 JDK 설치

텐서플로우를 빌드하기 위해 JDK를 먼저 설치해야 한다. Bazel에서 필요로 한다. 이 부분은 파이썬 버전과 상관이 없다.

$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer


3. Bazel 설치

Bazel은 구글 내에서 사용하는 프로젝트를 빌드하기 위한 범용 도구이다. 여기서는 텐서플로우를 빌드하기 위해 사용한다. 이번 명령이 좀 길기는 하지만, 복사해서 붙여넣기할 거니까 빠지지 않도록 조심한다. 리눅스 명령에 익숙하면 분리할 수도 있는데, 좀 해봤는데.. 잘 안됐다. 나중에 고민하도록 하자.

$ echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
$ curl https://storage.googleapis.com/bazel-apt/doc/apt-key.pub.gpg | sudo apt-key add -
$ sudo apt-get update && sudo apt-get install bazel
$ sudo apt-get upgrade bazel


4. 텐서플로우 소스코드 다운로드

git을 설치한다. 혹시 설치되어 있다면, 당연히 건너뛰어도 된다.

$ sudo apt install git


텐서플로우 소스코드 저장소 구축

$ git clone -b r0.10 https://github.com/tensorflow/tensorflow


5. CROSSTOOL 파일 수정

이 부분이 가장 중요하게 생각된다. 실제로 이전에 시도한 수없이 많은 방법 중에서 이 부분을 제외하면 그다지 다를 것이 없었다. 그런데, 동작하지 않았다. 수정할 파일은 홈 폴더의 "tensorflow/third_party/gpus/crosstool" 폴더에 있는 CROSSTOOL.tpl 파일이다.


파일 열기
$ sudo gedit ~/tensorflow/third_party/gpus/crosstool/CROSSTOOL.tpl


추가할 내용
cxx_builtin_include_directory: "/usr/local/cuda-8.0/include"


추가할 위치(내 경우엔 67행)
cxx_builtin_include_directory: "/usr/lib/gcc/"
cxx_builtin_include_directory: "/usr/local/include"
cxx_builtin_include_directory: "/usr/include"
cxx_builtin_include_directory: "/usr/local/cuda-8.0/include"    <----- 여기 추가
tool_path { name: "gcov" path: "/usr/bin/gcov" }


6. Bazel 환경 구축

먼저 tensorflow 폴더로 이동한 다음에 configure 파일을 실행시킨다. 역시 빨간색으로 처리된 부분을 정확하게 입력하도록 한다. 파이썬 3.5를 사용하기 때문에 첫 번째 항목에서 python3이라고 했다. 2.7을 사용한다면 아무 것도 입력하지 않으면 된다. 구글 플랫폼의 두 번째 항목은 필요없기 때문에 No라고 입력했다.

마지막의 그래픽 카드 버전이 가장 여려운데, 기본은 3.5와 5.2의 두 가지다. 1060의 경우 6.1로 입력해야 하는데, 다음 주소를 통해 그래픽 카드의 버전 숫자를 찾을 수 있다. (그래픽 카드 버전 숫자 찾기로 이동)


$cd ~/tensorflow
$ ./configure
Please specify the location of python. [Default is /usr/bin/python]: /usr/bin/python3
Do you wish to build TensorFlow with Google Cloud Platform support? [y/N] N
No Google Cloud Platform support will be enabled for TensorFlow
Do you wish to build TensorFlow with GPU support? [y/N] y
GPU support will be enabled for TensorFlow
Please specify which gcc should be used by nvcc as the host compiler. [Default is /usr/bin/gcc]: 엔터
Please specify the Cuda SDK version you want to use, e.g. 7.0. [Leave empty to use system default]: 엔터
Please specify the location where CUDA  toolkit is installed. Refer to README.md for more details.
[Default is /usr/local/cuda]: usr/local/cuda-8.0
Please specify the Cudnn version you want to use. [Leave empty to use system default]: 엔터
Please specify the location where cuDNN  library is installed. Refer to README.md for more details.
[Default is /usr/local/cuda-8.0]: 엔터
Please specify a list of comma-separated Cuda compute capabilities you want to build with.
You can find the compute capability of your device at: https://developer.nvidia.com/cuda-gpus.
Please note that each additional compute capability significantly increases your build time and binary size.
[Default is: "3.5,5.2"]: 6.1

...

INFO: All external dependencies fetched successfully.
Configuration finished


7. 텐서플로우 설치

bazel을 사용해서 텐서플로우를 빌드한다. 빌드한 결과물은 /tmp/tensor_pkg 폴더에 들어간다.

$ bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg


앞에서 사용한 결과물을 pip 명령을 통해 설치한다. 버전2와 버전3에서 파일 이름이 다른데, 중요하지 않다. 중요한 것은 /tmp/tensorflow_pkg 폴더에 있는 파일을 사용해야 한다는 점이다. 이름을 외울 필요는 없다. tensor까지 입력하고 tab 키를 누르면 자동 완성된다. 파일이 1개밖에 없다.


파이썬 3.5
$ pip3 install /tmp/tensorflow_pkg/tensorflow-0.10.0rc0-py3-none-any.whl

파이썬 2.7
$ pip install /tmp/tensorflow_pkg/tensorflow-0.10.0rc0-py2-none-any.whl


8. 텐서플로우 사용

아쉽지만, 우분투를 재시동해야 한다. 내 경우는 그랬다. 조금만 참자.
컴퓨터가 새로 켜졌다면 터미널에 아래와 같이 입력해 보자.


파이썬 3.5
$ python3 -c 'import tensorflow'

파이썬 2.7
$ python -c 'import tensorflow'


출력 결과는 아래와 같이 나와야 한다. 만약 아무 것도 출력되지 않았다면, 실패한 것이다. 이 시점에서 정말 많은 눈물을 흘려야 했다. 나타나지 않았다면, 우분투를 다시 설치하는 것부터 시작하면 된다. 윈도우는 그대로 둬도 된다.

I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcurand.so locally


잘 됐다면 진짜 코드로 확인을 해야 한다. mnist 예제를 돌려 보자.


파이썬 3.5
$ python3 tensorflow/tensorflow/models/image/mnist/convolutional.py

파이썬 2.7
$ python tensorflow/tensorflow/models/image/mnist/convolutional.py


놀랍게도 1시간 걸리던 예제가 불과 1분만에 해결됐다. 에러는 0.8*, 정확도 99.2%의 훌륭한 결과를 보여줬다.

I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcurand.so locally
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting data/train-images-idx3-ubyte.gz
Extracting data/train-labels-idx1-ubyte.gz
Extracting data/t10k-images-idx3-ubyte.gz
Extracting data/t10k-labels-idx1-ubyte.gz
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:925] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_init.cc:102] Found device 0 with properties:
name: GeForce GTX 1060 6GB
major: 6 minor: 1 memoryClockRate (GHz) 1.759
pciBusID 0000:01:00.0
Total memory: 5.92GiB
Free memory: 5.55GiB
I tensorflow/core/common_runtime/gpu/gpu_init.cc:126] DMA: 0
I tensorflow/core/common_runtime/gpu/gpu_init.cc:136] 0: Y
I tensorflow/core/common_runtime/gpu/gpu_device.cc:838] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1060 6GB, pci bus id: 0000:01:00.0)
Initialized!
Step 0 (epoch 0.00), 19.7 ms
Minibatch loss: 12.054, learning rate: 0.010000
Minibatch error: 90.6%
Validation error: 84.6%
...
...
Step 8400 (epoch 9.77), 7.2 ms
Minibatch loss: 1.596, learning rate: 0.006302
Minibatch error: 0.0%
Validation error: 0.8%
Step 8500 (epoch 9.89), 7.2 ms
Minibatch loss: 1.603, learning rate: 0.006302
Minibatch error: 0.0%
Validation error: 0.8%
Test error: 0.8%


듀얼 부팅 - 윈도우 10 + 우분투 16.04

좋은 컴퓨터를 혼자 사용할 수가 없어서 듀얼 부팅을 하기로 했다. 이전 글에서 울분을 토했던 것처럼 50여번의 설치 끝에, 이제는 방법을 배운 것 같다.


윈도우 10 설치

1. 사용하고 있는 윈도우에서 윈도우 10 USB 부팅디스크를 작성한다. 부팅 디스크를 만드는 과정에서 윈도우10 다운로드까지 진행하기 때문에 별도로 운영체제를 다운로드하지 않아도 된다.

   참고 사이트 : 윈도우10 usb 설치 부팅디스크 만들기 방법

2. 설치할 컴퓨터에 USB를 꽂은 다음에 전원을 켠다. BIOS 설정으로 들어가야 하니까, 잘 보고 있다가 DEL 혹은 F2 키를 누른다.

   참고 사이트 : Windows 10 과 Ubuntu 15.10 듀얼 부팅 하기
   참고 사이트 : [Ubuntu] 윈도우 10에서 우분투 듀얼부팅 하기(멀티부팅) - 1

3. 최근의 컴퓨터는 UEFI를 지원하고 있고, BIOS 화면에서 UEFI로 부팅되도록 설정한다.

4. 저장하고 빠져나온다. 자동으로 켜지면, USB로 부팅되고 윈도우 설치화면이 나타난다.

5. 윈도우 10을 설치한다. 아무 생각하지 말고 윈도우만 설치하는 것처럼 설치하면 된다.

6. 윈도우 설치가 끝나면, 왼쪽 하단 검색창에서 "디스크"라고 입력한다. [하드 디스크 파티션 만들기 및 포맷]을 선택한다.

7. 파티션이 2개일 때와 3개일 때가 있었다. 2개일 때는 이후 진행에 문제가 발생했다. 반드시 3개로 나누어져야 한다. 내 경우는 대부분 3개로 나누어졌고, 각각 450MB, 100MB, 나머지 전체였었다. 아래 그림은 어떤 외국 사이트에서 가져온 그림. 다시 설치하면서 캡쳐하기가 어려워서 남의 사진으로 대체. ^^

Shrink Volume to Resize Partition


아래 사진은 우분투까지 설치된 화면이고, 두 번째 하드 디스크까지 표시되었다. [디스크 0]에서 왼쪽에 있는 3개처럼 나누어졌다. 오른쪽에 있는 214.80GB와 7.94GB의 파티션은 우분투에서 사용한다.


9. [(C:) 223.84GB NTFS] 영역에서 마우스 오른쪽 버튼을 누르고 [볼륨 축소] 메뉴를 선택한다. 아래 그림은 백업 디스크의 두 번째 파티션에서 [볼륨 축소]를 선택한 화면이다.

파티션 크기를 줄인 공간에는 우분투를 설치할 것이다. 나는 텐서플로우가 목적이어서 절반으로 나누었지만, 대부분은 50GB 안쪽으로 설정한다.


10. 윈도우 설치는 끝났다. 그러나, 우분투 설치는 시행착오를 거칠 수 있기 때문에 우분투에서 사용할 파일들을 미리 윈도우 폴더에 다운로드하면 편리하다. 놀랍게도 우분투에서 윈도우 운영체제의 폴더에 접근할 수 있다.

나는 C드라이브에 LINUX 폴더를 만들고, 텐서플로우에서 사용할 엔비디아 그래픽 관련 파일을 저장해서 정말 편리하게 사용했고, 시간을 많이 절약할 수 있었다.


우분투 16.04 설치

윈도우처럼 우분투 또한 USB 인스톨러가 필요하다. 여러 가지가 있는데, 개인적으로는 Universal USB Installer가 가장 좋았다. 사용하기가 쉬웠고, 굉장히 안정적으로 느껴졌다. 우분투 설치하기에 앞서 컴퓨터는 유선으로 인터넷에 연결되어 있는 것이 좋다.

1. 윈도우에서 우분투 16.04 버전을 다운로드해서 저장해 놓는다.

   참고 사이트 : Linux Ubuntu 16.04 LTS 설치하기

2. Universal USB Installer를 다운로드해서 실행한다. 두 번째 USB를 연결한다.

   참고 사이트 : Universal USB Installer - 만능 부팅USB 제작 프로그램
   참고 사이트 : Universal USB Installer 다운로드


3. USB Installer를 실행한다. 다운로드한 우분투 16.04 파일과 설치할 USB를 선택하고 Create 버튼을 누른다.

4. 완성이 되면, 윈도우를 다시 시작한다.

5. 윈도우10을 설치할 때처럼 BIOS로 들어가서 USB로 부팅이 되도록 설정한다.

6. 우분투 설치 화면이 나타난다. 언어를 한국어로 고르면, 이후 메뉴는 한글로 표시된다.


7. [설치 중 업데이트 다운로드]와 [서드 파티 소프트웨어 설치]는 선택해도 되고 안해도 된다. 내 경우에는 시행착오를 여러 번 겪었으니까, 처음에는 선택하지 않았다. 자신감이 붙은 시점부터는 선택했다. 선택하면, 설치 시간이 조금이라도 길어진다.


8. 여기가 제일 중요하다. [Windows Boot Manager을(를) 그대로 두고 Ubuntu 설치] 메뉴가 동작할 줄 알았다. 여러 번 해봤는데, 잘 안된다. 우분투가 설치는 되지만, 듀얼 부팅에 문제가 있었던가.. [디스크를 지우고 Ubuntu 설치]는 윈도우까지 지우고 우분투만 설치하는 메뉴다.

상당히 불편하긴 한데 다른 방법이 없다. 마지막에 있는 [기타]를 선택해야 한다.


9. 우분투 설치에서 가장 중요한 단계. 아까 그 외국 사이트에서 가져온 사진이다. 그림에서는 "free space"라고 되어 있는데, 한글 메뉴로는 "남은 공간"이라고 표시된다. 윈도우에서 [볼륨 축소]를 통해 미리 우분투 공간을 만들었는데, 그 공간을 뜻한다. 

Create Root Partition for Ubuntu 16.04


10. 더하기(+) 버튼을 눌러 마운트시킨다. 화면이 열리면 위의 그림처럼 대부분 선택되어 있고, 마운트 위치(Mount point)만 비어 있다. 콤보박스를 열어서 그림처럼 루트(/)를 선택한다. 우분투에는 C드라이브와 같은 개념 대신 루트(root)라는 파일 시스템을 사용한다. 용도(Use as)에는 "EXT4 저널링 파일 시스템"이라고 되어 있다.

여기서 추가로 home과 swap 영역까지 지정하는데, 메모리가 충분하기 때문에 별도 공간을 할애할 필요는 없다. 다만 swap 영역을 지정하지 않으면, swap 영역 지정하지 않았다는 경고 메시지는 뜬다. 얼마를 할당할지부터 고민이 되는 관계로 가볍게 무시하고 넘어간다.

11. 그림 하단의 "부트로더를 설치할 장치(Device for boot loader Installation)"는 그냥 두면 된다. 충분한 경험이 쌓이기 전에는 이 부분을 변경해야 한다고 해서 여러 번 실패를 했다. 듀얼 부팅이 아니라 멀티 부팅이라면 수정할 수도 있겠지만, 내 경우엔 윈도우가 설치된 파티션 전체를 가리키는 sda가 항상 선택되어 있었다. 수정하지 않는다.

12. [지금 설치] 버튼을 누르고 이후 설치를 진행한다. [계속] 버튼을 누르고 시간(지역)과 키보드 설정을 하게 된다.

13. 계정을 생성하는 화면에서 여러 번 시도할 수도 있지만, 한 번에 성공할 가능성이 높기 때문에 사용자 이름은 정확하게 준다. 나는 어쩔 수 없이 "python-kim"을 사용하게 된 관계로 이걸로 했다. 사용자 이름은 바꾸기가 왠지 피곤할 것 같았다. 그러나, 암호는 최대한 간단하게 준다. 나는 스페이스 1개를 사용했다. 설치 과정에서 여러 번 입력해야 한다.


14. 우분투 설치가 끝났다면 우분투를 다시 시작한다. 화면에 팝업 창이 떠 있고 [지금 다시 시작] 버튼을 누르면 된다. 컴퓨터가 켜질 때, USB는 컴퓨터로부터 분리한다.

15. GNU GRUB이라는 화면이 나타나고, 첫 번째 항목에는 Ubuntu, 세 번째 항목에는 Windows Boot Manager가 있다. 선택하지 않으면, 우분투가 기본으로 실행된다.


우분투 16.04 재설치

텐서플로우에서 사용할 엔비디아 그래픽 카드가 원하는 형태로 설치되지 않아 수도 없이 재설치를 했다. 처음에는 윈도우부터 새로 설치했었는데, 나중에는 우분투만 설치해도 괜찮다는 확신을 얻을 수 있었다. 윈도우에는 전혀 피해가 가지 않고, 우분투만 새로 지우고 설치할 수 있다.

1. 우분투를 처음 설치할 때처럼, 우분투 USB 인스톨러를 연결하고 부팅해서, 우분투 설치 화면으로 간다.

2. 설치 형식 화면에서 꼭대기에 있는 [우분투 지우고 다시 설치] 메뉴를 선택한다. 설치된 우분투가 사용하던 영역에 덮어쓰기 때문에 마운트가 필요 없어서 훨씬 쉽다. 기존 우분투를 다시 설치하는 것이기 때문에, 우분투의 모든 내용은 사라진다. 이게 내가 원하던 거였다. 혹시 설정이 남아있을까봐 걱정하지 않아도 된다.


3. 나머지 과정은 우분투 처음 설치와 완전히 동일하다.

너무 많이 고생해서 [우분투 지우고 다시 설치]도 동작하지 않을 줄 알았는데, 너무 잘 동작해서 감격했다. 덕분에 50여회의 텐서플로우 및 엔비디아 그래픽 카드 설치 실패에서 엄청난 시간을 줄일 수 있었다.

[도커] 윈도우 폴더 공유

도커는 정말 너무 좋다.
너무 쉽게 텐서플로우를 비롯해서 파이썬까지 다룰 수 있게 해준다.

이전 도커 관련 글에서는 도커의 기본 사용법에 대해 정리했다.
도커를 쉽게 사용하기 위해서는 윈도우와 도커 간의 파일 공유가 절대적이다.
이전 글을 작성할 때는 잘 몰라서 도커로 파일을 복사하는 것에 대해서만 정리를 했었다.
그런데, 파일을 복사할 필요없이 그냥 폴더를 함께 쓰는 방법이 있었다.

이런 기능이 필요한 이유는 도커에서 그래픽 환경의 편집기를 사용할 수도 있지만,
이게 생각만 해도 피곤이 밀려올 정도로 난이도 있는 작업일 수도 있다.
그래서, 필요한 입력은 윈도우 편집기를 사용하고, 결과는 터미널에서 확인하는 구조를 만들 수 있다.

이 글은 Docker For Windows에 대해서만 동작한다.
혹시 Docker Toolbox를 사용하는 사람들은 따로 찾아보도록 하자.

도커는 당연히 실행된 상태여야 한다. 그래야 콘솔에서 명령어를 입력해서 컨테이너를 구동할 수 있을 테니까.
윈도우 하단에서 도커를 찾아 마우스 오른쪽 버튼을 눌러서 팝업 메뉴를 표시한다.
세 번째 있는 Settings... 항목을 선택한다.


Shared Drives 탭을 열어서 공유하려고 하는 드라이브를 선택한다.
체크 박스 형태로 되어 있으니까, 컴퓨터에 있는 모든 폴더에 공유할 수 있다는 것을 알 수 있다.
나는 E 드라이브를 선택했다. 오른쪽 하단에 있는 Apply 버튼을 누른다.


폴더를 공유하기 위해서는 암호가 설정되어 있어야 한다.
리눅스 계열에서는 암호가 당연하지만, 윈도우에서는 불편해서 사용하지 않는 것이 일반적이다.
암호 없이 사용하고 있다면, 사용자 이름 입력하고 확인 버튼 누르면 초기화된다.
반드시 암호가 필요하다.


컨테이너에 들어간 상태이다. 공유할 폴더로는 E 드라이브의 DockerPython을 지정했다.
home 폴더로 이동해서 폴더 내용을 보니까, DockerPython과 condauser의 2개 폴더가 표시된다.
DockerPython은 당연히 윈도우에 만들어 놓은 일반 폴더이다.

DockerPython 폴더 안에는 미리 만들어 놓은 loop.py 파일이 들어있다.
이제 윈도우에서 more.py 파일을 DockerPython 폴더에 만들었다.
터미널 창에 있는 것처럼 컨테이너에서는 아무 것도 하지 않았다. 이전 명령인 ls를 입력했다.
결과는 more.py가 귀신처럼 나타났다. 컨테이너에서는 진짜 아무 것도 안 했는데..

python3 more.py 명령으로 구동시켰더니 결과도 잘 나왔다. 굿잡.

폴더 공유 명령은 다음과 같다. 도커 이미지 이름은 xblaster/tensorflow-jupyter이다.

  docker run -v E:/DockerPython:/home/DockerPython -it xblaster/tensorflow-jupyter bash

-v 옵션으로 폴더를 지정한다.
E:/DockerPython는 윈도우 폴더, :/home/DockerPython는 컨테이너에서 접근할 폴더 경로이다.
컨테이너가 윈도우의 특정 폴더를 뒤쪽에 지정한 이름으로 마운트(mount)해 달라는 요청으로 보면 된다.

마지막에 있는 -it xblaster/tensorflow-jupyter bash 명령은 컨테이너를 구동하는 일반적인 내용이다.
공유 폴더 부분만 없애면 컨테이너를 구동하는 명령과 100% 동일하다.

작업 중에 exit로 컨테이너로부터 빠져나가게 되면, 컨테이너는 중지 상태가 된다.
다시 run 명령을 사용하면 새로운 컨테이너가 만들어지고, 이전 컨테이너와 별개가 된다.
이때는 start 명령을 통해 컨테이너를 다시 시작하고, attach 명령으로 컨테이너로 진입해야 한다.
이들 명령에는 -v 옵션으로 폴더 공유를 할 필요가 없다.
이미 공유되어 있는 컨테이너에 입장하는 거라서 공유하지 않는 것이 맞다.

[내용 추가]
새로운 사실을 알아냈다. 앞의 내용처럼 폴더를 공유할 수도 있지만, 사용자 폴더에 포함된 폴더라면 드라이브 선택과 같은 과정이 필요하지 않다. 아래 명령은 C 드라이브의 사용자 폴더(Users)에 생성된 docker라는 이름의 폴더를 공유하는 명령이다.

  docker run -v /c/Users/docker:/home/DockerPython -it xblaster/tensorflow-jupyter bash

윈도우 폴더 쓸 때 주의가 필요하다. "C:"라고 입력하면 안 되고, 반드시 "/c/"라고 입력해야 공유할 수 있다. 대소문자 또한 정확하게 입력해야 한다.

아래 그림은 사용자 폴더에 만들어진 docker 폴더를 보여준다. 경로창에는 로컬디스크와 사용자로 표시되지만, 실제 경로는 C:/Users가 된다. 경로창을 선택한 후에 복사하면 쉽게 처리할 수 있다.

텐서플로우 GPU 버전 설치 문제점

이 글을 쓰는 이유는
나처럼 여기저기 흩어진 문서를 참고해서 수십 번의 실패를 한 후에 울지 않았으면 하는 바램 때문이다.
수십 번 실패하고 나니까, 중간에 성공할 수도 있었겠다는 생각이 많이 들었다.
부족한 부분이 뭐였는지 알려주고 싶었다. 아래 정리한 부분을 보강해서 다시 해보자. 빠이링~!

설치 성공한 글은 여기에 자랑했다. ^^  우분투 16.04 LTS에 텐서플로우 설치

텐서플로우는 여러 번 설치한 경험이 있다.
가장 먼저 설치한 곳은 맥북이었고, 텐서플로우 홈페이지에 있는대로 하니까 됐다.
안 된다고 얘기한 사람들이 많이 있는데, 이해를 하지 못했다.

두 번째는 수업에 활용해야 하는 관계로 윈도우에서 설치를 했다.
이 때는 도커에 대해 모를 때라 도커를 익히기 위한 시간이 많이 들어갔다.
집에 있는 모든 윈도우에 설치했고, 우리집에는 윈도우가 3개 있다.

마지막으로 최근에 구매한 엄청난 GPU가 달린 데스크탑.
mnist를 돌리는 과정에서 너무 오래 걸리는 것을 보고
CPU 버전으로는 되는게 아니구나.. 라는 것을 느낀 후에 구해한 마이 머신.

이 좋은 컴퓨터를 혼자 사용할 수 없어서, 멀티부팅으로 방향을 잡고 시작했는데..
우분투 설치 횟수는 50회 이상은 될 것 같고, 윈도우 설치만도 5번은 넘을 듯..
금요일 저녁부터 수요일 오전까지 계속.
화요일에 애들 데리고 바닷가 하루 다녀왔으니까, 4일 꼬박 들어갔다.
나중에는 손놀림도 빨라지고 파일 다운로드도 백업 받아서 처리하는 잔머리를 써서
한 시간에 3회 설치라는 놀라운 기적까지 이루어 냈다.

1. 계획의 부재
아무런 생각이 없었다. 이것저것 하다 보면 될 줄 알고 정리를 하지 않았다.
다양한 방법을 적용하면서 주먹구구식으로 접근했다.
기록했어야 했다. 10번 해서 안되면 그랬어야 하는 것 아닐까?
단순히 우분투 버전 쓰고, 어떤 옵션 선택했는지 간단하게 기록하면 일찍 끝낼 수 있었다.

2. 다양한 버전
우분투에는 다양한 버전이 존재한다. 예전에는 그렇지 않았는데..
처음에는 16.04로 시작을 해서 안 되길래
15.04로도 해보고 14.04로도 해보고 리눅스민트까지 손을 댔다.
그러다 도저히 안되서 16.04로 다시 시도해서 성공.
최신 버전이 문서도 없고 해서 설치가 어려운 면이 있다. 나에게는 최후의 보루였었다.

우분투 설치를 안정적으로 하려면 LTS가 붙은 버전을 사용하는 것이 좋다.
최신 버전이 부담되면, 15.04보다는 14.04에 설치하는 것이 좋다.
LTS는 Long Term Support의 약자로 장기간 지원되기 때문에 안정성이 탁월하다.
우분투는 2년에 한 번 LTS 버전을 출시하고, 짝수 버전이 LTS가 된다.

3. 우분투 설치
리눅스 계열은 설치할 때 디스크를 분할해서 적용하는 과정이 중요하다.
대충 찾아보고 시도하는 바람에 윈도우를 여러 번 날려 먹었다.
거기에 기존 설치된 우분투도 날라가고 해서 고생이 많았다.

최종적으로는 우분투에 할당된 파티션 전체에 대해 root(/)만 할당해서 사용.
스왑 디스크와 같은 것들은 우분투가 나중에 알아서 잡아줬다.
이 부분이 너무 헷갈려서 하다 보니까 그렇게 되는 걸 알았다.

여기서 제일 중요한 것은 "부트로더를 설치할 장치" 선택이다.
윈도우가 설치된 위치를 정확하게 가리켜야 하는데, 초보자에게는 이게 어렵다.
이 부분을 먼저 보고 시작한다면 한결 쉽다.
특히 인터넷에서 많이 얘기하는 "윈도우와 함께 설치"라는 메뉴가 나에게는 표시되지 않았다.

4. 부팅 디스크
이제는 윈도우도 우분투도 USB로 부팅을 해서 설치한다.
이렇게 부팅할 수 있는 USB로 설치하면 UEFI로 설치했다고 얘기한다.
레거시로 설치한다고도 하는데, 아직도 이게 뭔지 모른다.

설치하기 전에 윈도우에서 윈도우10과 우분투 16.04를 USB로 부팅 가능하게 만들었다.
이제 차례대로 꽂아가면서 OS를 설치한다.
이때 USB로 부팅이 안되거나 내가 원하는 화면으로 부팅되지 않으면
컴퓨터를 다시 켜서 CMOS 화면으로 들어가기 위해 DEL 키를 연신 눌러댄다.

운영체제 한 개당 USB 1개.
리눅스 버전이 많은데다 윈도우도 있어서 시간이 많이 걸렸다.
USB를 5개 정도 준비해서 윈도우, 우분투 14, 우분투 16, 민트 17, 민트 18을 만들면 일이 쉽다.
20~30회 정도 실패하면 이 생각이 든다. 부팅 디스크 만드는 것이 설치보다 오래 걸린다.
나는 3개의 USB를 사용했다. 윈도우, 우분투 16, 민트 18.

5. 그래픽 카드
이 부분이 가장 어려웠다. 멀티부팅은 어찌어찌 하다 보면 되는데, 그래픽 카드는 아니다.

첫 번째는 그래픽 카드 드라이버를 먼저 설치해야 하는지 몰랐다.
윈도우10도 엔비디아 그래픽 카드를 그냥 잡아주지 않는 것처럼 기본 설치되지 않는다.
엔비디아에서 다운로드 받아서 직접 설치해야 한다.

두 번째는 굉장히 잘 정리된 글에서
cuda를 설치하면 드라이버까지 함께 설치된다고 해서 cuda만 설치하려고 했다.
드라이버가 설치되어 있을 경우, 오히려 충돌이 나기 때문에 지우고 시작했었다.
나는 이 부분이 맞지 않았고,
그래픽 카드 드라이버를 먼저 설치한 이후에 cuda를 설치했을 때 아무런 문제도 없었다.
내 경우는 먼저 설치하지 않으면 nvidia-smi에서 계속 에러가 발생했다.

세 번째는 설치된 이후에 부팅을 하면, 로그인 화면에서 무한반복을 하는 버그를 만났다.
정확하게 입력해도 진입할 수 없었고, 이쪽에서는 굉장히 유명했다.
다양한 해결 방법이 나와있는데, 나는 하나도 먹히질 않았다.
설치가 됐는지 확인할 길도 없고 해서, 이럴 경우 우분투를 다시 깔아야 했다.

6. 참고 사이트
구글에서 "우분투 cuda 설치"로 검색했다.
그 중에서 충분히 신뢰할 수 있는 두 개 페이지를 찾았고, 이들을 참고해서 설치하려고 했다.
물론 모두 실패했지만, 다른 컴퓨터와 다른 그래픽 카드라면 충분히 될 수 있다고 본다.

cuda 설치까지가 제일 어려운데, 이 부분을 자세히 설명한다.
cuda가 설치됐다면 반드시 nvidia-smi 명령으로 설치를 확인해야 한다.

 (Part 2) CUDA 설치
 Ubuntu에 CUDA 설치

우분투 16.04 설치 이후 작업

1. GRUB 메뉴 표시 시간 변경
참고 - OS 부팅 순서 바꾸기 (Grub 설정변경)
     
부팅 순서도 바꿀 수 있음. 윈도우 번호 입력. GRUB 부팅될 때의 순서.
아래 명령 입력하고 timeout 찾아서 수정한다.
sudo gedit /boot/grub/grub

grub 처음 화면에서의 위치. ubuntu는 처음, 윈도우는 3번째 있었다. 윈도우로 부팅.
GRUB_DEFAULT=2

grub 메뉴 대기시간
GRUB_TIMEOUT=3

2. 한글 입력기 수정

영어와 한글 전환하려면 super+space를 3번 눌러야 한다. 3번이 1회전.
첫 번째 있는 한국어는 동작하는지 어떤지 모르지만, 한글 입력 안됨
[시스템 설정] - [텍스트 입력창] 메뉴로 가서 [사용할 입력 소스]로부터 제거.
화면에는 "영어(미국)"과 "Hangul(Fcitx)"만 있어야 함.
오른쪽 화면에서 모든 창에 동일한 소스 사용 선택

3. 가상화면 추가
화면을 4개로 만들어 주는 기본 기능 탑재되어 있음
[시스템 설정] - [모양] - [동작 방식] 메뉴 들어가서 "작업 공간 바꾸기 사용" 선택
설치 이후에는 ctrl + alt + 화살표로 이동하는 방식과 아이콘을 클릭하는 2가지 방식으로 사용할 수 있다.

4. 파이참 설치
참고 - 우분투에서 PyCharm 파이썬 IDE를 설치 15.04

$ sudo sh -c 'echo "deb http://archive.getdeb.net/ubuntu vivid-getdeb apps" >> /etc/apt/sources.list'
$ wget -q -O- http://archive.getdeb.net/getdeb-archive.key | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install pycharm

5. 에디터 설치
참고 - 서브라임 텍스트(sublime text) 설치
아쉽게도 서브라임 텍스트는 한글 입력이 되지 않는다. 추가 설정이 필요하다.

$ sudo add-apt-repository ppa:webupd8team/sublime-text-3
$ sudo apt-get update
$ sudo apt-get install sublime-text-installer

참고 - 우분투에 Atom 설치하기
한글 문제 때문에 atom을 사용한다. 또 다른 이유로는 엄청 좋아졌다고 해서.

$ sudo add-apt-repository ppa:webupd8team/atom
$ sudo apt-get update
$ sudo apt-get install atom

6. 크롬 설치
파이어폭스에서 해도 되고 "크롬 설치" 검색해서 다운로드 받아서 설치하면 된다.
명령어로 입력하는 방법도 있지만, 나한테는 여전히 이게 편하다.
다만 여러 번 클릭해야 한다. 윈도우가 아니라서 조금 환경이 다르다.

현재는 항목을 선택하면 현재 페이지가 열린다. 나는 새로운 페이지에서 열리는 게 좋다.
아무 거나 검색한 다음에 오른쪽에 있는 [환경설정] 버튼 누르고, "검색 환경 설정"을 선택한다.
하단에 "검색 결과 여는 창"에서 "선택한 검색결과를 새 브라우저 창에서 열기" 항목을 선택한다.

7. 기타 설정
참고 - [Linux] Ubuntu 16.04 LTS 설치 후 세팅
     
여기 좋은 거 엄청 많다. 그냥 있는 그대로 따라하기. 고민하지 않았다.
여기 주인장이 이거 말고도 엄청 좋은 거 많이 해놨다. 따라해 보면 기분이 좋아질 것이다.


우분투 16.04 LTS에 텐서플로우 설치 (실패)

이 방법으로 된줄 알았다.
그런데.. 샘플을 돌려보니 정확도가 말도 안되게 엉터리로 나왔다. 90%가 아니라 10%의 정확도라니..
아래 있는 2개의 글을 참고한다.

듀얼 부팅 - 윈도우 10 + 우분투 16.04
텐서플로우 0.10 + 우분투 16.04 + CUDA 8.0 + 파이썬 3.5 설치

-----------------------------------------------------------------

텐서플로우 GPU 버전을 설치하기 위해 최소 50회는 설치했다 지웠다를 반복한 것 같다.
페이스북에서 누가 30번이나 했는데 안 된다고 우는 글을 봤는데,
30번쯤 하고 나니까 진짜 눈물이 날 것 같았다. 컴퓨터 집어던질려고 했다. 부자였다면..

가장 큰 실수 하나만 언급한다.
cuda를 설치하면 그래픽카드 드라이버까지 함께 설치되는 줄 알았다.
그래픽 드라이버만 별도 설치할 때는 설치도 잘 되고 했는데,
이후 cuda를 설치하는 과정에서 에러가 발생했기 때문에 누군가의 그 말을 믿어버렸다.

두 번째는 주의할 점인데.. 윈도우10을 잘 설치해야 한다.
나는 SSD와 HDD를 하나씩 달아서, 디스크가 2개였다. 우분투에서 이게 sda와 sdb로 잡힌다.
윈도우10을 첫 번째 SSD에 설치할 때, 전체 디스크에 대해 설치하는 것이 좋다.
그런 연후에 윈도우에서 "볼륨 축소" 명령을 통해 우분투 공간을 확보해야 한다.
내 느낌으로는 이렇게 하면 파티션 분할이 잘 되고, 윈도우 부트매니저가 화면에 표시됐다.
우분투 설치할 때, 윈도우 파티션은 3개로 나누어져 있어야 한다. 진짜 어려웠다.

1. 아래 사이트를 참고했다. 내 환경과 일부 다른 부분이 있긴 했는데, 순조롭게 진행할 수 있었다.
   나는 그림을 싣지 않았고, 일종의 보충 설명이기 때문에 참고 사이트를 함께 보는 것을 추천한다.

   http://www.popit.kr/tensorflow-install-ubuntu16/

2. 이 부분이 완전 달라서 사실은 여기서 울었다.
   계속 버전 14와 15에 설치하려고 하다가 16으로 넘어온 건데, 이 부분이 달랐다.

   참고 사이트에서는 그래픽카드 드라이버가 소프트웨어 업데이트에 표시된다고 했는데,
   내 화면에서는 엔비디아 관련된 것은 아무 것도 없었다. 전혀 없었다.

   수십 번의 설치가 헛된 것은 아니어서 안될 줄 알면서 드라이버를 직접 설치했다.
   이 부분은 다른 글로 저장해 두었다. ([우분투] nvidia 드라이버 설치)

3. cuda 툴킷을 설치한다. 그런데, 여기 화면도 나랑 달랐다.
   참고 사이트 화면은 굉장히 간단한데, 나는 엄청 많은 일들이 터미널에서 일어났다.
   앞에서 직접 설치하는 바람에 전부 틀어진 것 같다는 생각이 들었다.
   소프트웨어 업데이트에 표시할 수 있는 방법을 찾아야 하는 거 아닌가.. 하는 생각도 들었다.

   sudo apt-get install nvidia-cuda-toolkit

   여기서 한 가지 이전에 시도했던 방법과 비교해서 좋았던 점은 특정 버전을 지칭하지 않았던 것이다. 
   이전에는 정확하게 7.5와 같은 버전을 명시했는데, 그게 없었다.
   특정 버전을 가리키리면 파일 이름부터 그래픽 카드까지 알아야 하는 등의 번거로움이 발생한다.
   이전에 사용했던 파일은 run과 deb의 두 가지. 당연히 모두 실패했었다.

   설치가 끝나면, 마지막에 done.이라고 뜬다. 왜 그런지는 모르지만 2회 출력된다.

4. cuDNN v4 설치
   이 부분은 이전 설치와 비슷했다. 다운로드 받아서 압축을 풀어야 한다. (여기 클릭)
   여기서 조금 번거로운데, cuDNN은 회원에 대해서만 다운로드를 허용한다.
   회원 가입 이후에도 몇 번 클릭해야 해당 페이지까지 이동할 수 있다.

   아래 그림에서 이것과 관련된 내용을 선택한다. 7.5 버전의 Linux Library를 선택한다.
   현재 버전 4가 가장 아래 버전이고, 나머지는 버전 5로 아직 시험 중에 있다.

   Download cuDNN v4 (Feb 10, 2016), for CUDA 7.0 and later.
   cuDNN v4 Library for Linux

   헐.. 첫 번째 링크는 동작하지 않는데, 두 번째는 동작한다. 회원 가입하지 않아도 된다.
   "cuDNN v4 Library for Linux"를 클릭하면 다운로드가 시작된다. 확장자는 tgz로 매우 생소하다.

   다운로드 화면을 캡쳐했다. 가장 밑에 있는 항목이다.


5. 다운로드 받은 파일의 압축을 풀어서 home 폴더로 옮긴다. 그래야 이동이 쉽다.
   할 수 있다면 압축을 풀 때 직접 /usr/local에 풀면 가장 좋다.

   나처럼 잘 모르면 home 폴더에 풀던가 풀어서 home 폴더로 옮기던가.. 한다.
   권한 문제 때문에 /usr/local 폴더로 잘 옮겨지지 않는다. 그래서, 명령어로 대신한다.

   sudo mv cuda /usr/local/

   현재 폴더에 반드시 압축 푼 결과인 cuda 폴더가 있어야 한다.
   rwx에 관련된 권한을 변경한다.

   sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

6. 경로 추가
   설치한 모듈에 접근할 수 있도록 환경변수에 경로를 추가한다.
   .bashrc와 .bash_profile 중에서 아무 거나 사용해도 된다. 난 .bashrc 사용

   sudo gedit ~/.bashrc

   gedit 프로그램이 열린다. 아래 내용을 파일 맨 아래에 추가한다.

   export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64"
   export CUDA_HOME=/usr/local/cuda

   추가했으면, 저장하고 종료한다.

7. 참고 사이트에서는 이 부분에서 파이썬 가상환경을 사용한다.
   여러 개의 파이썬 환경을 구축할 수 있는게 장점인데, 나는 그런 게 번거로워서 일부 수정했다.

   우분투 16.04에는 2.7과 3.5가 모두 설치되어 있고, python은 2.7을 가리킨다.
   아래 명령어를 사용하지만 가상환경은 사용하지 않았다. 나중을 위해 설치한 것일 뿐.

   sudo apt-get install python3-pip python3-dev python-virtualenv

8. 텐서플로우 연동
   이번 내용은 tensorflow.org에 있는 내용과 같다. (텐서플로우 홈페이지)

   CPU 버전을 비롯해서 윈도우, 맥, 우분투 등의 여러 가지 버전이 존재한다. 그 중에 우분투 + GPU + 파이썬 3.5 사용.
   터미널에서 아래 명령을 입력한다.

   export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.9.0-cp35-cp35m-linux_x86_64.whl
   pip3 install --upgrade $TF_BINARY_URL

9. 여기까지 왔으면 무조건 되야 한다.
   텐서플로우 홈페이지에 있는 소스코드를 가져왔다. 터미널에 입력하고 결과를 확인한다.
   텐서플로우가 설치된 경로를 화면에 표시해야 한다.

   python3 -c 'import os; import inspect; import tensorflow; print(os.path.dirname(inspect.getfile(tensorflow)))'

   이거 때문에 여기까지 온 셈이다. mnist 예제를 돌려본다.
   
   python3 -m tensorflow.models.image.mnist.convolutional

   여기서 cuDNN 에러가 발생할 수도 있다. 이것만 3번 설치했는데, 뒤에 두 번은 계속 에러가 났다.
   컴퓨터를 껐다가 켠다. mnist 예제를 다시 구동하면 정상 동작했다.
   1시간 이상 걸리던 것이 3분으로 줄었다. 잘 했다. ^^


[우분투] nvidia 드라이버 설치

우분투에 엔비디아 드라이버를 설치하는 것이 어렵지는 않다.
내가 사용한 버전은 Ubuntu 데스크탑 16.04 LST 버전이다.
이전에 설치 과정에서 로그인 무한반복의 쓴 맛을 본 관계로 그냥 겁이 났었다.

일단 무한반복에 걸리면 답이 없다. 우분투를 다시 설치하는 것이 제일 좋다.
수많은 구글링을 통해 여러 방법을 시도했는데, 네 경우에는 벗어날 수 없었다.
민트(mint) 버전에 설치하고 싶었는데,
어느 순간부터 cd로부터 읽어오지 못했다는 에러가 뜨기 시작해서 패쓰.

1. 엔비디아 웹사이트로부터 드라이버 다운로드 (여기 클릭)
   자신의 그래픽 카드에 맞는 버전을 선택한다. 나는 큰 맘 먹고 구입한 GTX 1060.
   파일 확장자는 엄청 생소한 run.
   다운로드한 파일은 사용하기 편하도록 home 폴더로 옮기는 것이 좋다. 우분투 탐색기를 사용해서 드래그 앤 드롭.



[여기서부터 외부 사이트 참고]
http://askubuntu.com/questions/481414/install-nvidia-driver-instead-nouveau

2. Blacklist the modules. Open the blacklist.conf file.
   gedit 텍스트 편집기로 blacklist.conf 파일 편집
   아래 명령을 실행시키려면 터미널이 있어야 한다. 단축키 ctrl + alt + t.

   sudo gedit /etc/modprobe.d/blacklist.conf

3. add the following modules in the file.
   아래 내용을 복사해서 붙여 넣으면 된다.
   그러나, 내 경우에는 첫 번째 항목인 amd76x_edac는 이미 존재하기 때문에 무시했다.

   blacklist amd76x_edac #this might not be required for x86 32 bit users.
   blacklist vga16fb
   blacklist nouveau
   blacklist rivafb
   blacklist nvidiafb
   blacklist rivatv

   gedit 프로그램에서 저장 버튼 누르고 닫기. 저장 ctrl + s.

4. 엔비디아의 모든 패키지 삭제. 위에서 열었던 터미널 창에서 입력

   sudo apt-get remove --purge nvidia*

5. 엔비디아 드라이버 설치를 위해서는 디스플레이 매니저(display manager)를 종료해야 함.
   앞에서 열어 놓은 터미널을 사용하면 안됨.
   GUI와 관계 없는 터미널 생성. 단축키 ctrl + alt + f1.
   f1부터 f6까지 사용할 수 있다. ctrl + alt + f7은 윈도우 그래픽 화면으로 이동한다.
   사용자 아이디와 암호를 입력해야 터미널 사용이 가능하다.

6. 디스플레이 매니저 사용 중지. lightdm은 우분투에 최초 설치된 디스플레이 매니저.
   sudo는 관리자 모드로 명령을 실행한다는 뜻.

   sudo service lightdm stop

7. 처음에 run 파일을 home 폴더에 복사했다.
   현재 작업 중인 터미널에서 한글을 입력하려면 뭔가를 설치해야 한다.
   이 부분을 피하려면, 한글 입력이 없게 만들어야 하는데 인터넷 파일은 '다운로드'라는 한글 폴더에 들어간다.

   다운로드 받은 파일을 실행 가능한 상태로 변경한다.
   chmod +x NVIDIA-Linux-x86_64-361.42.run

   run 파일을 실행한다. 파일 이름은 다운로드 받은 파일로 변경한다.
   가장 쉬운 방법은 N까지만 입력하고 tab키를 누르는 것이다. home 폴더에 N으로 시작하는 파일은 하나밖에 없다.

   sudo ./NVIDIA-Linux-x86_64-367.35.run

8. 설치 끝나면 디스플레이 매니저를 시작한다.

   sudo service lightdm start

   그래픽으로 전환(ctrl + alt + f7). 컴퓨터를 껐다켜지 않아도 동작한다.

9. 설치 완료 및 검사
   ctrl + alt + t 눌러서 터미널 창을 열고, 아래 2개의 명령을 입력한다.
   여기서 명령어가 없다는 등의 메시지가 뜨면 실패.
   첫 번째는 텍스트 화면에서, 두 번째는 그래픽 화면에서 스펙을 표시한다.

   nvidia-smi
   nvidia-settings


mnist 데이터셋 정리

TensorFlow  샘플에 보면 mnist 데이터셋이 많이 등장한다.
mnist를 잘 알면, 이후 코드를 보는데 도움이 될 것 같아서 정리해 놓는다.

1. input_data.py
TensorFlow 샘플에 포함된 예제인데, mnist 데이터셋이 없을 경우 인터넷으로부터 다운로드한다.
추가로 DataSet 클래스 등의 정의가 이 안에 들어 있다.
mnist 데이터셋을 다루는 코드의 꼭대기에는 대부분 input_data.py를 import하는 코드가 들어 있다.

2. mnist 로딩
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)

코드마다 조금 다를 수 있는데, 이 코드가 제일 좋은 것 같다.
tensorflow를 설치했다면, 그 안에 있는 input_data.py를 사용하고 있다.
꼭 현재 폴더에 있어야 하는 건 아니다. 
눈에 보이지 않고 최신 버전으로 유지되기 때문에 좋은 코드다.

"/tmp/data/"는 리눅스나 맥에서
루트(/) 폴더 밑에 tmp 폴더 밑에 data 폴더에 저장하라는 뜻이다.
간혹 현재 폴더를 가리키는 도트(.)으로 시작하는 경로가 있기도 하다.
tmp 폴더는 삭제해도 괜찮은 파일을 저장하는 용도로 사용하는 폴더이다.

one_hot은 label 데이터셋을 만들 때, label을 one-hot 방식으로 처리할 것인지를 가리킨다.
기본값은 False이기 때문에 사용할 경우 반드시 True를 전달해야 한다.
데이터가 one-hot 방식으로 넘어오면 처리하는 시점에 변환하지 않아도 되므로 편하다.

3. mnist 자료형
앞의 코드에서 반환한 mnist 변수의 자료형은 DataSets 클래스이다.
input_data.py 파일에 정의된 클래스로 mnist 샘플에서만 사용하는 임시 클래스이다.

DataSets 클래스는 구조체처럼 사용하기 위해 만든 클래스다.
train, validation, test의 3개 멤버 변수만 갖고 있고, 이들은 모두 DataSet 클래스이다.
멤버 함수와 같은 것은 전혀 없다.
DataSet 클래스는 마지막에 s가 없는 단수다.

4. test, validation, test
이들의 자료형은 DataSet 클래스라고 얘기했다.
DataSet 클래스는 mnist 샘플에서 가져다 쓸 수 있도록 다양한 멤버들을 갖추고 있다.

mnist 데이터셋은 전체 4개의 파일로 이루어져 있는데,
2개는 이미지 파일이고, 2개는 이미지가 어떤 숫자인지 알려주는 label 파일이다.
이 안에는 validation 파일은 없고, train과 test 파일만 있다.

train 파일에는 6만 개의 이미지가 들어 있고, test 파일에는 1만 개가 들어 있다.
그런데, validation 파일이 없어서 train에 포함된 5,000개를 validation으로 만들어서 사용한다.
이미지와 label 갯수는 train이 55,000, validation이 5,000, test가 10,000개이다.

이들의 자료형은 모두 numpy의 다차원 배열인 ndarray.
차원 변환과 transpose를 할 수 있고, 행렬 연산도 지원하기 때문에 당연히 numpy가 되는 것이 맞다.

train.images 데이터셋을 출력한 결과. 55,000x784 행렬. 1차원으로 하면 43,120,000개.
<class 'numpy.ndarray'> (55000, 784) 43120000

5. DataSet 클래스
images : 이미지 데이터셋
labels : label 데이터셋
num_examples : 데이터 갯수
next_batch : 데이터셋으로부터 필요한 만큼의 데이터를 반환하는 함수

print('갯수 :', len(mnist.train.images))
print('갯수 :", mnist.train.num_examples)

# train 데이터셋으로부터 데이터 100개 가져오기. (이미지, label) 튜플
train_images, train_labels = mnist.train.next_batch(100)

6. 주의
주의랄 것은 없는데, input_data.py 파일의 버전이 여러 개다.
tensorflow를 배포할 때, 일부 수정된 내용이 반영될 수 있다.
파이썬 3에서 예전 버전을 사용했더니 빨간색 경고가 떴다. 코드는 동작했지만, 기분이 좋지 않았다.
최신 버전의 코드로 바꾸니까, 아무런 문제도 발생하지 않았다.

2015년 12월에 배포된 버전 보기. 클릭하면 github로 이동한다.

도커 사용법

윈도우에서 텐서플로우를 사용하는 과정에서 도커에 대해 배울 수 있었다.
이렇게 좋은 게 있었는데.., 이걸 모르고 살았다니..
설치 과정에 답답했던 몇 가지만 기록한다.

1. 도커 설치
도커 툴박스와 도커포윈도우 중에서 선택할 수 있다.
윈도우 10 이상의 최신 버전이라면 도커포윈도우를 쓰는 것이 낫다. 
도커 툴박스와 도커포윈도우 설치는 윈도우에서 텐서플로우 설치하기를 클릭하면 볼 수 있다.

Docker Quickstart Terminal 메뉴는 도커 툴박스를 설치하면 시작 메뉴에서 확인할 수 있다.
도커포윈도우 설치하고 이거 찾는다고 난리를 쳤다.

이 문서에서는 도커포윈도우만 다루고 있다. 도커 툴박스에 대한 정리는 아래 링크에서 확인할 수 있다.
Docker Machine을 이용하여 Mac에서 docker 운영하기

2. 도커 버전 확인
버전을 확인하는 명령으로 -v 또는 --version을 사용할 수 있다.

  docker -v

3. vm 생성
이 부분에서 에러가 발생했는데, 해결할 생각이 없어서 해결책은 모른다.
docker-machine 명령으로 가상 머신을 생성할 수 있는데, 이게 도커 이미지와 같은 역할을 한다.
성공적으로 생성하면 이 안에서 필요한 작업을 수행할 수 있다.

주의할 점은 도커포윈도우는 가상 머신이 아니라 Hyper-V를 사용하기 때문에
virtual-machine 대신 hyperv 옵션을 사용해야 한다.
검색해서 자신에게 어떤 게 맞는지 제대로 판단해서 사용하도록 하자.
나는 hyperv로 잘 했는데, 에러가 발생했다. 구글링을 해도 답이 없어서 그만 뒀다.
그리고, 이렇게 직접 만드는 것보다 다른 사람이 만든 것을 쓰는 게 훨씬 쉽다.
이미 다 만들어 놨다.

4. 도커 허브(Docker Hub)
사용자가 만들어서 올린 도커 이미지를 모아 놓은 곳이다. (https://hub.docker.com)

tensorflow라고 검색했더니 나타난 화면이다.
텐서플로우가 우분투에서 잘 돈다고 해서 ubuntu로도 검색을 해서 이미지를 받았다.

오른쪽 끝에 있는 DETAILS 버튼을 누르면 도커 명령이 있는 페이지가 나타난다.
이 명령을 복사해서 콘솔에 붙여 넣고 엔터를 누르면 설치한 리눅스를 바로 사용할 수 있다.

  docker run -it -p 8888:8888 tensorflow/tensorflow

가령, 위와 같은 명령이 DETAILS 페이지에 명시되어 있다.

5. 도커 이미지 사용
이미지 설치가 끝나면 자동으로 해당 이미지로 들어간다. 리눅스 콘솔이 나타난다.
빠져나올 때는 exit이라고 입력한다.

이미지를 사용할 때는 run 명령을 사용한다. 처음에만 한 번 사용하면 된다.
설치 이후에는 run 대신 start와 attach 옵션을 사용한다.

  docker run -it ubuntu bash

우분투의 경우에는 아래처럼 오른쪽에 bash라고 명시하면 된다.
도커 콘솔에 붙여 넣을 때, 붙여넣기가 안 된다. 이때 붙여넣은 다음에 마우스 오른쪽 버튼 누르면 된다.
이게 왜 그런 방식으로 동작하는지는 모른다. 그냥 됐다.

6. 도커 명령어
여러 개의 이미지를 사용하고 IPython Notebook을 사용하다 보면 에러가 많이 발생한다.
에러를 해결할 수 있는 기본 명령어만 정리한다.
명령어에 대한 자세한 설명은 Docker 치트 시트를 참고한다. 


docker images
설치된 모든 이미지 목록을 나열한다.
이미지 크기도 함께 나타나는데, 생각보다 크기가 크다. 필요없는 것은 지우자.
함께 표시되는 이미지 이름(REPOSITORY)은 매우 중요하다.
run 명령으로 이미지를 실행시킬 때 사용하는 이름이다.

docker rmi "이미지 이름"
설치한 이미지를 삭제한다.

docker run "이미지 이름"
도커 이미지를 사용해서 컨테이너를 생성한다.
컨테이너에서 작업한 내용은 컨테이너를 삭제하기 전까지 보존된다.
exit 명령으로 컨테이너에서 빠져나올 경우, 컨테이너는 삭제되는 것이 아니라 동작을 멈추는 것이다.


docker ps -s
삭제되지 않은 컨테이너의 목록을 보여준다.
이 안에는 현재 동작 중인 것도 있고, 동작을 멈추고 sleep 상태에 있는 것도 있다.

docker ps -a -f status=running
실행 중인 컨테이너만 보여준다.
이미지는 서버에서 가져온 것. 여기에 여러분이 무언가 추가하기 때문에 컨테이너가 된다.
우리처럼 느슨하게 사용한다면, 이 명령을 실행했을 때 아무 것도 나오지 않아야 한다.

docker stop "컨테이너 ID 또는 이름"
실행 중인 컨테이너를 종료시킨다. 컨테이너 ID와 이름은 ps 명령으로 알 수 있다.
앞의 명령으로 확인한 다음 stop 명령을 사용한다.

docker start "컨테이너 ID 또는 이름"
exit 명령으로 빠져나온 컨테이너를 다시 구동시킨다.
외부에서 멈출 때는 stop을 사용하지만, exit으로 종료하는 순간 멈추게 된다.
run 명령은 매번 새로운 컨테이너를 생성하기 때문에
이전에 작업했던 결과를 가져올 수 없다. run은 한 번만 실행하고, 항상 start를 사용해야 한다.

docker attach "컨테이너 ID 또는 이름"
구동을 시작한 컨테이너에 합류한다.
start 명령을 호출했다고 해서 바로 컨테이너에 입장할 수는 없다.

docker rm "컨테이너 ID 또는 이름" 
멈춰 있거나 동작 중인 컨테이너를 삭제한다.
도커 이미지 위에 우리가 작업한 내용이 컨테이너에 포함되어 있는데, 모두 삭제된다.

7. 파일 복사
리눅스가 일반 사용자한테 어렵게 느껴지는 것은
그래픽 환경이 일반적이지 않아서라고 생각하는 1인이다.
고수라고 하는 사람들은 항상 검정 콘솔 화면에서 일하는 것을 선호하고 그것을 최고라 칭한다.

윈도우에서 작업한 파일을 도커의 컨테이너로 전달하거나 그 반대가 가능하다.
이걸 알고는 얼마나 기뻤던지..

  docker cp test.py ubuntu:/sample.py
  docker cp ubuntu:/sample.py test.py

도커의 cp 명령으로 두 가지를 할 수 있다.
첫 번째 줄은 윈도우의 test.py 파일을 ubuntu 컨테이너의 루트(/)에 sample.py로 복사한다.
두 번째 줄은 컨테이너의 파일을 윈도우로 복사한다.
만약에 루트 아래 있는 Home 폴더에 snu라는 폴더에 복사를 한다면..

  docker cp test.py ubuntu:/Home/snu/sample.py

지금 설명하는 게 어렵다면, 도커 책임이 아니라 리눅스가 낯설기 때문이다.
콘솔에서 타이핑하는 것이 어려운 것이다. 이 부분은 리눅스 기본 명령어를 참고해야 한다.
우분투에 폴더를 만들어야 한다면, mkdir 명령이 필요하다.

cp 명령은 스택오버플로우에서 영감을 얻었다. (Copying files from host to docker container)
cp 명령에 대한 도커 공식 문서도 있다. (cp 도커 문서)

cp 명령에 사용할 수 있는 컨테이너는
docker ps -a 명령으로 보여지는 모든 컨테이너에 대해 가능하다.
다시 말해, 동작 중인 컨테이너뿐만 아니라
동작을 멈춘, 그러나 삭제되지 않은 컨테이너에도 복사할 수 있다.

8. 주의사항
이건 나한테 주는 주의사항이다.
도커에 대해 여전히 모르니까, 계속해서 run 명령만 실행시켰다.
그랬더니 ps -a 명령으로 보면 수십 개씩 있었다. 너무 많아서 히스토리라고 생각했다.
그런데, history 명령은 따로 있었다. docker라고만 입력하면 다양한 옵션과 명령을 확인할 수 있다.

이상한 것이 새벽에 설치한 파이썬이 보이질 않는 것이었다.
여러 번 해봤는데, 매번 설치하는데 다음에 들어가면 없었다.
이게 run 명령을 사용해서 그런 것이었다. 당연히 매번 새로 만드니까, 없는 것이었는데..
이 글을 보는 사람들은 나처럼 바보 짓을 하지 말자.