Search

딥러닝 고속화

밑바닥부터 시작하는 딥러닝 1권의 8.3 내용
빅데이터 / 네트워크 발전 → 딥러닝의 대량연산

GPU

NN학습시 convolution 계층 계산에 시간이 많이 걸림 ( 단일 곱셈 - 누산 과정 )
GPU의 병렬 수치 연산 → GPU 컴퓨팅
대량 병렬연산으로 인해 단일 곱셈-누적 과정을 빠르게 연산할 수 있다.
convolution 연산은 큰 행렬의 내적으로 바꿔 계산할 수 있다 ( GPU 구현에 적합. GPU는 작은단위 계산보다는 큰 덩어리를 한번에 계산하는 것에 유리 )
CPU라고 무조건 못하는 것은 아니다. 연속적인 복잡한 연산을 잘 처리하여 준다
CUDA - Nvidia의 GPU 컴퓨팅용 통합 개발 환경
cuDNN - CUDA위에서 동작하는 라이브러리. 딥러닝에 최적화된 함수 등이 구현

분산학습

1회 학습에 걸리는 시간을 최대한 단축하고자 딥러닝 학습을 수평확장하자는 아이디어 이다
다수의 GPU와 기기로 계산을 분산하는 것이다
당연히 속도가 굉장히 빨라질 것이다
그러나 ‘어떻게 분산시키느냐’ 가 매우 어려운 문제이기 때문에
컴퓨터 사이 통신 / 데이터 동기화 등 어려운 문제를 해결하고자 뛰어난 프레임워크가 개발되고 있다.

연산 정밀도 / 비트 줄이기

계산능력만이 딥러닝 고속화에 있어 bottleneck이 되는 것은 아니다. 메모리 용량 및 버스 대역폭 등도 될 수 있다.
메모리 용량 면에서는 대량의 가중치 매개변수와 중간데이터를 메모리에 저장해야한다는 점을 생각해야하고
버스대역폭 면에서는 GPU / CPU 의 버스를 흐르는 데이터가 많아져 한계를 넘어서면 bottleneck이 된다. 이러한 경우 고려시 네트워크로 주고받는 데이터의 비트 수를 최소한으로 만드는 것이 바람직하다.
딥러닝은 높은 수치 정밀도를 요구하지 않는다 ( 수치를 몇 비트로 표현하느냐 )
딥러닝은 이미지에 노이즈가 조금 섞여있어도 출력결과가 잘 변하지 않는 견고성이 있기 떄문에 신경망을 흐르는 데이터를 비트를 줄여 조금 퇴화시켜도 출력에 영향을 크게 미치지는 않는다
따라서 32bit single precison / 64bit double precision 등의 포맷 대신 16bit half precision 만 사용해도 학습에 크게 문제가 없다고 알려진 바 있다. 이에 관련해서는 이전 블로그 글을 첨부하겠다
python : 일반적으로 64bit double precision 사용. numpy : 16bit half precision도 지원. → 큰 정확도 차이 없음.