혜온의 이것저것

[Chapter 1 신경망 복습] 5 계산 고속화 / 6 정리 본문

Deep Learning/밑바닥부터 시작하는 딥러닝2

[Chapter 1 신경망 복습] 5 계산 고속화 / 6 정리

혜온 :) 2022. 2. 9. 10:42

신경망의 학습과 추론에 드는 연산량은 상당하다. 그래서 신경망에서는 얼마나 빠르게 계산하느냐가 매우 중요한 주제이다.

 

1.5.1 비트 정밀도

넘파이의 부동소수점 수는 기본적으로 64비트 데이터 타입을 사용한다. (OS나 파이썬/넘파이 버전 등에 따라 바뀔 수 있음)

실제로 64비트 부동소수점 수가 사용되는지 다음 코드를 통해 확인 가능하다.

import numpy as np
a=np.random.randn(e)
a.dtype
# dtype('float64')

넘파이는 64미트 부동소수점 수를 표준으로 사용한다. 그러나 신경망의 추론과 학습은 32비트 부동소수점 수로도 인숙률을 거의 떨어뜨리는 일 없이 수행할 수 있다고 한다.

메모리관점에서는 항상 32비트가 더 좋다고 말할 수 있고, 신경망 계산 시 데이터를 전송하는 버스대역폭(bus bandwidth)이 병목이 되는 경우가 어서 이런 경우에도 데이터 타입이 작은 게 유리하다.

또한 계산 속도 측명에서도 32비트 부동소수점 수가 일반적으로 더 빠르다.

 

넘파이에서 32비트 부동소수점 수를 사용하려면 다음과 같이 데이터타입을 설정하면 된다.

b=np.random.randn(3).astype(np.float32)
b.dtype
#dtype('float32')

c=np.random.randon(3).astype('f')
c.dtype
#dtype('float32')

일반적으로 CPU와 GPU는 연산 자체를 32비트로 수행해서 16비트 부동소수점 수로 변환하더라도 계산 자체는 32비트로 이루어져 처리 속도 측명에서는 혜택이 없을 수도 있지만 학습된 가중치를 저장할 때는 16비트 부동소수점 수가 유효하다.

16비트로 저장하면 32비트를 쓸 때보다 절반의 용량만 사용한다.

 

1.5.2 GPU(쿠파이)

딥러닝의 계산의 대량의 곱하기 연산으로 구성된다. 이 대량의 곱하기 연산 대부분은 벙렬로 계산할 수 있는데, 바로 이 점에서는 CPU보다 GPU가 유리하다.

쿠파이는 GPU를 이용해 병렬 계산을 수행해주는 라이브러리인데, 엔비디아의 GPU에서만 동작한다. 또한 CUDA라는 GPU 전용 범용 병렬 컴퓨팅·플랫폼을 설치해야 한다.

 

쿠파이를 사용하면 엔비디아 GPU를 사용해 간단하게 병렬 계산을 수행할 수 있다. 쿠파이는 넘파이와 호환되는 API를 제공한다.

 

import sys
sys.path.append('..')
import numpy as np
from common import config
# GPU에서 실행하려면 아래 주석을 히제하세요(쿠파이 필요)
# =================
# config.GPU=True
# =================

CPU에서 실행하면 몇 시간이 걸리는 코드도 GPU를 사용하면 수십 분 정도로 단축된다. 이 코드에서는 # config.GPU=True 의 주석을 풀기만 하면 넘파이 대신 쿠파이가 사용되고, 쿠파이가 계산은 GPU에 위임하여 학습이 빠르게 이뤄진다.

 

1.6 정리

Chapter1에서 배운 내용

  • 신경망은 입력층, 은닉층(중간층), 출력층을 지닌다.
  • 완전연결계층에 의해 선형 변환이 이뤄진고, 활성화 함수에 의해 비선형 변환이 이뤄진다.
  • 완전연결계층이나 미니배치 처리는 행렬로 모아 한꺼번에 계산할 수 있다.
  • 오차역전파법을 사용하여 신경망의 손실에 관한 기울기를 효율적으로 구할 수 있다.
  • 신경망이 수행하는 처리는 계산 그래프로 시각화할 수 있으며, 순전파와 역전파를 이해하는 데 도움이 된다.
  • 신경망의 구성요소들을 '계층'으로 모듈화해두면, 이를 조립하여 신경망을 쉽게 구성할 수 있다.
  • 신경망 고속화에는 GPU를 이용하여 병렬 계산과 데이터의 비트 정밀도가 중요하다.

 

Comments