딥러닝 연산은 합성곱 계층에서 대부분의 시간을 차지합니다.
AlexNet의 forward 처리 시에 합성곱 계층에서만 거의 90% 정도 시간을 소요합니다.
(GPU는 전체시간의 95%, CPU는 89%)
병렬 수치 연산을 고속으로 처리할 수 있는 GPU를
딥러닝에 사용하면서 속도가 많이 빨라졌지만
아직도 딥러닝 연산에는 시간이 많이 들고 시간을 줄이기 위해 많은 노력을 하고 있습니다.
그래서 나온 아이디어가 바로 "분산 학습"입니다.
다수의 GPU와 기기를 이용해서 계산을 분산하여
딥러닝 학습을 수평 확장 Scale out 하자는 아이디어입니다.
최근 분산 학습 연구에 박차를 가하고 있는
모두가 아는 두 기업이 있습니다.
바로
Google과 Microsoft 입니다.
구글의 딥러닝 프레임워크인 텐서플로와
마이크로소프트의 CNTK(Computational Network Toolkit)은
분산 학습을 위해 개발을 하고 있습니다.
이런 프레임워크들이 수행하는 분산학습은 벌써
놀라운 효과를 보여주고 있습니다.
출처: https://tensorflow.blog/2016/04/14/tensorflow-0-8-distributed/
GPU 수가 늘어나면서 학습 속도도 그에 비례하게 아주 빨라집니다.
여러 기기를 이용해서 GPU를 100개까지 사용했더니
딥러닝 학습 속도가 GPU 1개일 때에 비해서
56배가 빨라졌다고 합니다.
계산을 분산시킨다는 게
말로는 간단해 보여도
사실은 굉장히 복잡한 문제입니다.
컴퓨터 사이의 통신,
데이터 동기화
같이 쉽게 해결할 수 없는 문제들을 풀어야만 할 수 있습니다.
이 외에도 딥러닝 연산 시간을 빠르게 하기 위해서는
연산 정밀도와 비트를 줄이기도 합니다.
네트워크로 주고받는 데이터의 비트수를 최소로 만들면
GPU나 CPU의 버스 대역폭에 부담이 줄어들게 되고
메모리 사용량이 줄고
계산에 드는 비용이 줄어듭니다.
하지만 적은 비트를 사용하면 많은 비트를 사용할 때보다
계산 오차가 커질 수 밖에 없습니다.
부동소수점 수를 사용해서 실수를 표현하는 64비트나 32비트로
계산을 해야 당연히 계산 오차가 더 정밀해지겠죠.
하지만 신경망을 견고하게 잘 만들면 노이즈가 섞여 있어도
출력물에는 문제가 없듯이
비트를 줄인다고 해서 결과에 큰 영향을 미치지 않을 것으로 보입니다.
지금까지의 연구에 따르면
딥러닝은 16비트 반정밀도만 사용해서 학습해도
학습에 문제는 없다고 알려져 있습니다.
(Gupta, Suyog, et al. "Deep learning with limited numerical precision." International Conference on Machine Learning. 2015.)
파이썬에서는 일반적으로 64비트 배정밀도 부동소수점 수를 사용하지만
넘파이는 16비트 반정밀도 부동소수점도 지원합니다.
가중치와 중간 데이터를 1비트로 표현하는
Binarized Neural Networks라는 방법도 제시된 적이 있습니다.
(Hubara, Itay, et al. "Binarized neural networks." Advances in neural information processing systems. 2016.)
이처럼 딥러닝 연산 속도를 빠르게 하기 위한 다양한 연구가 진행되고 있습니다.
이번 포스트가 도움이 되셨길 바라면서 이만 마치겠습니다~!
시간을 가장 많이 잡아먹는 합성곱 계층에 대해 공부하고 파이썬으로 직접 구현하고자 하시는 분들은 아래 포스트를 참고해주세요~
2020/07/28 - [Computer Science/Deep Learning] - [비전공자용] [Python] CNN(합성곱 신경망) - 합성곱 계층 구현
[출처] Deep Learning from Scratch, ゼロ から作る
'Computer Science > Deep Learning' 카테고리의 다른 글
Anaconda 아나콘다로 Tensorflow 1.15.0 설치하기 (0) | 2021.04.28 |
---|---|
[비전공자용] 딥러닝은 대체 어디에 사용하는 걸까? (스크롤 압박 주의) (0) | 2020.07.30 |
[비전공자용] 딥러닝이 몇 년 전부터 뜨고 있는 이유 (feat. AlexNet) VGG, GoogLeNet, ResNet은 무엇? (3) | 2020.07.30 |
[비전공자용] [Python] 직접 딥러닝으로 손글씨 숫자 인식하기 (정확도 99% 이상) (0) | 2020.07.30 |
[비전공자용] 대표적인 CNN 네트워크 - LeNet과 AlexNet (0) | 2020.07.29 |