반응형
텐서플로우 윈도우 버전이 나와서 윈도우 8.1 환경에 설치하고 테스트를 해 봤다.
설치 과정에서 참고한 자료는 다음과 같다.
- GPU TensorFlow on Window 10(goodtogreate.tistory.com) - 이 문서를 참고해서 CUDA와 cuDNN을 설치했다.
- Installation Quickstart: TensorFlow, Anaconda, Jupyter
CUDA, cuDNN 설치
GPU 관련 설치 과정을 요약하면 다음과 같다.
- https://developer.nvidia.com/cuda-downloads 사이트에서 CUDA Toolkit 8 버전 다운받아 설치한다. 용량이 1G를 넘으니 인내심이 필요하다. 기본 설치 경로는 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0이고, 설치가 끝나면 PATH에 관련 경로가 추가된다.
- https://developer.nvidia.com/cudnn 사이트에서 cuDNN 다운받는다. 회원 가입을 해야 다운로드 받을 수 있다. 다운 받은 파일을 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0에 압축풀면 된다.
아나콘다(Anaconda)와 텐서플로우(Tensorflow) 설치
아나콘다를 이용해서 파이선 3.5를 설치했다. https://www.continuum.io/downloads 사이트에서 아나콘다를 다운 받아 설치하면 된다.
GPU 버전 텐서플로우와 CPU 버전의 텐서플로우를 테스트하기 위해 두 개의 가상 환경을 만들었다. 먼저 GPU 버전 텐서플로우를 위한 환경을 만들고 설치에 사용한 명령어는 다음과 같다.
C:\>conda create -n tensorflow-gpu python=3.5
C:\>activate tensorflow-gpu
(tensorflow-gpu) C:\>pip install tensorflow-gpu
다른 창을 열어 CPU 버전 텐서플로우 환경을 생성했다.
C:\>conda create -n tensorflow-cpu python=3.5
C:\>activate tensorflow-cpu
(tensorflow-cpu) C:\>pip install tensorflow
간단한 성능 확인
간단하게 성능을 비교하기 위해 '텐서플로 첫걸음' 책의 CNN 예제를 돌려봤다. 참고로 PC 환경은 다음과 같다. 장비1은 GPU가 있고, 장비2에는 GPU가 없다.
- 장비1
- CPU: Intel Core i7-4712MQ CPU @ 2.30 GHz
- RAM: 16G
- GPU: GeForce 840M 5.0, memoryClockRate (GHz) 1.124, memory 2.0GiB
- 장비2
- CPU: Intel Core i7-6700 CPU @ 3.40 GHz x 8
학습을 1000회 실행하는데, 50회마다 시간을 출력하고 학습이 끝나면 시간을 출력했다. GPU와 CPU에 대해 각 3회씩 실행하고 그 평균을 기록했다.
step | GPU (초) 장비1 |
CPU (초) 장비1 |
장비1 CPU/GPU (시간 비율) | CPU2 장비2 |
0 | 1.119 | 0.056 | 0.028 |
|
50 | 3.004 |
7.751 | 2.58 | 3.646 |
100 | 4.817 | 15.417 | 3.20 | 7.282 |
150 | 6.632 | 23.008 | 3.47 | 10.922 |
200 | 8.445 | 30.666 | 3.63 | 14.557 |
250 | 10.261 | 38.283 | 3.73 | 18.212 |
300 | 12.077 | 45.845 | 3.80 | 21.833 |
350 | 13.891 | 53.471 | 3.85 | 25.491 |
400 | 15.704 | 61.094 | 3.89 | 29.110 |
450 | 17.518 | 68.672 | 3.92 | 32.755 |
500 | 19.333 | 76.37 | 3.95 | 36.380 |
550 | 21.15 | 83.973 | 3.97 | 40.023 |
600 | 22.964 | 91.584 | 3.99 | 43.640 |
650 | 24.777 | 99.26 | 4.01 | 47.275 |
700 | 26.593 | 106.839 | 4.02 | 50.911 |
750 | 28.409 | 114.4 | 4.03 | 54.559 |
800 | 30.222 | 122.071 | 4.04 | 58.191 |
850 | 32.036 | 129.627 | 4.05 | 61.825 |
900 | 33.852 | 137.188 | 4.05 | 65.461 |
950 | 35.666 | 144.953 | 4.06 | 69.089 |
전체 | 37.471 | 152.721 | 4.08 | 72.702 |
실행 결과를 보면 장비1에서 GPU를 사용한 결과가 CPU를 사용한 결과보다 4배 정도 빠른 것을 알 수 있다. 또한, 장비2의 CPU 결과보다도 2배 정도 빠른 것을 알 수 있다.
GPU와 OOM 주의 사항
GPU로 예제를 돌릴 때 다음 코드에서 OOM when allocating tensor with shape[10000,32,28,28] 에러가 발생했다.
print("test accuracy %g"% sess.run(accuracy, feed_dict={
x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))
에러가 발생하는 이유는 GPU 메모리가 부족하기 때문이다. 이를 처리하는 가장 쉬운 방법은 mnist.test.images 전체가 아닌 일부만 구해서 정확도를 구하는 것이다.
for i in range(200):
testSet = mnist.test.next_batch(50)
print("test accuracy %g" % sess.run(accuracy,
feed_dict={ x: testSet[0], y_: testSet[1], keep_prob: 1.0}))
* CNN 테스트에 사용한 코드: https://github.com/madvirus/tfstudy/blob/master/nn/cnn.py