반응형

8.3 더 빠르게 (딥러닝 고속화)

CPU만으로 딥러닝을 처리하기는 부족하게 현실입니다.

GPU Graphics processing unit


8.3.1 풀어야 할 숙제

시간이 오래 소요 할 수 있다.

AlexNet에서는 오랜 시간을 합성곱 계층에서 소요합니다.

합성곱 계층 단일 곱셈-누산

그래서 딥러닝 고속화라는 주제는 대량의 '다인 곱셈-누산'을 어떻게 고속으로 효율적으로 계산하느냐는 것입니다.

 

8.3.2 GPU를 활용한 고속화

GPU는 원래 그래픽 전용보드에 이용해왔습니다.

그러나 최근에는 그래픽 처리뿐 아니라 범용 수치 연산에도 이용합니다.

gpu 컴퓨팅

 gpu 로 범용 수치 연산을 수행하는 것을 gpu 컴퓨팅이라고 합니다.

cuDNN이라는 딥러닝에 최적화된 라이브러리를 이용하면 더욱 빨라짐을 확인할 수 있습니다.

GPU는 엔비디아와 AMD 두 회사가 제공합니다.

두 회사의 GPU 모두 범용 수치 연산에 이용할 수 있지만, 딥러닝과 더 '친한' 쪽은 아직까지는 엔비디아입니다.

엔비디아의 GPU컴퓨팅용 통합 개발 확경인 CUDA를 사용하기 때문이죠 

cuDNN은 CUDA위에서 동작하는 라이브러리로 , 딥러닝에 최적화된 함수 등이 구현 되어 있습니다.

 

합성곱 계층에서 행하는 연산은 im2col을 이용해 큰 행렬의 곱으로 변환할 수 있습니다. 

이러한 im2col의 방식은 gpu로 구현하기에도 적합합니다. 

GPU는 '작은 단위로 계산하기 보다는 큰 덩어리를 한번에 계산하는 데 유리하기 때문이죠 ,즉 im2col로 거대한 행렬의 곱으로 한 번에 계산하여 gpu의 잠재력을 끌어내는 것입니다.

 

8.3.3 분산 학습

수평확장 scale out하자는 아이디어 즉 분산 학습 가 중요해지는 것입니다.

gpu와 기기로 계산을 분산하기도 합니다.

cntk computational network toolkit는 분산 학습에 역점을 두고 개발하고 있습니다.

저지연 고처리량 low latency, high throughput 네트워크 위에서 이 프레임워크들이 수행하는 분산 학습은 놀라운 효과를 보이고 있습니다.

 

8.3.4 연산 정밀도와 비트 줄이기

계산 능력 외에도 메모리 용량과 버스 대역폭 등이 딥러닝 고속화에 병목이 될 수 있습니다.

메모리 용량 면에서는 대량의 가중치 매개변수와 중간 데이터를 메모리에 저장해야 한다는 것

버스 대역폭 면에서는 gpu (혹은 cpu)의 버스를 흐르는 데이터가 많아져 한계를 넘어서면 병목이 됩니다.

이러한 경우를 고려하면 네트워크로 주고받는 데이터의 비트 수는 최소로 만드는 것이 바람직합니다.

 

다행히 딥러닝은 높은 수치 정밀도(수치를 몇 비트로 표현하느냐)를 요구하지 않습니다.

이는 신경망의 중요한 성질중 하나로 , 신경망의 견고성에 따른 특성입니다.

 

컴퓨터에서 실수를 표현하는 방식으로 32비트  단정밀도 와 64비트 배정밀도 부동소수점 등의 포맷이 있지만, 지금 까지의 실험으로는 딥러닝은 16비트 반정밀도 만 사용해도 학습에 무제가 없다고 알려져 있습니다. 

실제로 엔비디아의 2016년 gpu인 파스칼 아키텍처는 이 포맷을 지원하여 , 이제는 반정밀도 부동소수점이 표준적으로 이용되리라 생각합니다.

 

 

 

엔비디아의 맥스웰 세대 gpu는 반정밀도 부동소수점 수를 스토리지 (데이터를 저장하는 기능)로 지원하고 있었지만, 연산 자체는 16비트로 수행하지 않았습니다. 이것이 파스칼 세대에 와서 연산 역시 16비트로 하기 시작하여 이전 세대보다 2배 정도 빨라졌습니다.

 

파이썬에서는 일반적으로 64비트 배정밀도 부동소수점 수를 사용합니다.

하지만 numpy는 16비트 반정밀도 부동소수점도 지원하며 , 이를 사용해도 정확도가 떨어지지 않는 것을 쉽게 확인할 수 있습니다.

 

8.4 딥러닝의 활용

사물 인식: 손글씨 숫자 인식

이미지 ,음성, 자연어 등 수많은 분야에서 딥러닝은 뛰어난 성능을 발휘

8.4.1 사물 검출

이미지 속에 담긴 사물의 위치와 종류(클래스)를 알아내는 기술입니다.

사물 검출은 사물 인식보다 어려운 문제입니다.

CNN을 이용하여 사물 검출을 수행하는 방식은 몇 가지가 있는데 , 그 중에서도 R-CNN이 유명합니다. 

 

R-CNN의 처리 흐름

1. 입력 이미지 

2. 후보 영역 추출

추출한 영역으로 

3. CNN 특징 계산

4. 영역 분류

 

먼저 사물이 위치한 영역을 (어떤 방법으로 ) 찾아내고 , 추출한 각 영역에 CNN을 적용하여 클래스를 분류하는 것이죠 . 

여기서 이미지를 사각형으로 변형하거나 분류할 때 서포트 벡터 머신 SVM을 사용하는 등 실제 처리 흐름은 다소 복잡하지만 , 큰 틀에서는 이 두가지 후보(우보 영역 추출과 CNN 특징 계산)로 구성됩니다.

 

후보 영역 추출 (사물처럼 보이는 물체를 찾아 처리)에는 컴퓨터 비전 분야에서 발전해온 다양한 기법을 사용할 수 있고 , R-CNN논문에서는 Selective Search기법을 사용했습니다.

최근에는 이 후보 영역 추출까지 cnn으로 Faster R-cnn기법도 등장했습니다. 

Faster R-cnn 은 모든 일을 하나의 cnn에서 처리하기 때문에 아주 빠릅니다.

 

8.4.2 분할

분할 segmentation이란 이미지를 픽셀 수준에서 분류하는 문제입니다.

픽셀 단위로 객체마다 채색된 지도 supervised데이터를 사용해 학습합니다.그리고 추론할 때 입력 이미지의 모든 픽셀을 분류합니다.

 

신경망을 이용해 분할하는 가장 단순한 방법은 모든 픽셀 각각을 추론하는 것입니다. 

짐작한 대로 이런 식으로는 픽셀의 수만큼 forward처리를 해야 하여 긴 시간이 걸리게 됩니다(정확히는 합성곱 연산에서 많은 영역을 쓸데없이 다시 계산하는 것이 문제가 됩니다.)

이러한 낭비를 줄여주는 기법으로 fcn fully convolutional network이 고안됬습니다. 이는 단 한번의 forward처리로 모든 픽셀의 클래스를 분류해주는 놀라운 기법입니다.

fully convolutional network를 직역하면 '합성곱 계층만으로 구성된 네트워크'가 됩니다.

일반적인 cnn이 완전연결 계층을 이용하는 반면, fcn은 이 완전연결 계층을 '같은 기능을 하는 합성곱 계층'으로 바꿉니다.

사물 인식에서 사용한 신경망의 완전연결 계층에서는 중간 데이터의 공간 볼륨(다차원 형태)을 1차원으로 변환하여 한 줄로 늘어선 노드들이 처리했으나 , fcn에서는 공간 볼륨을 유지한 채 마지막 출력까지 처리할 수 있습니다.

 

fcn에서 보듯 마지막에 공간 크기를 확대하는 처리를 도입했다는 것도 특징입니다.

이 확대 처리로 인해 줄어든 중간 데이터를 입력 이미지와 같은 크기까지 단번에 확대할 수 있습니다.

fcn의 마지막에 수행하는 확대는 이중 선형 보간 bilinear interpolation에 의한 선형 확대입니다.

fcn에서는 이 선형 확대를 역합성곱 연산으로 구현해내고 있습니다.

 

완전 연결 계층에서는 출력이 모든 입력돠 연결됩니다.

 

반응형

' > 밀바닥부터 시작하는 딥러닝' 카테고리의 다른 글

08-3. 딥러닝  (0) 2021.01.06
08-1. 딥러닝  (0) 2020.12.28
07-3 합성곱 신경망(CNN)  (0) 2020.12.18
07-2. 합성곱 신경망(cnn)  (0) 2020.12.09
07-1. 합성곱 신경망(cnn)  (0) 2020.11.19

+ Recent posts