한국어 뉴스
최신
AI & 기술

cuda-convnet 내부: AlexNet의 듀얼 GPU 레이어와 ImageNet 시대

프로세서 다이를 보여 주는 예시 이미지이며, 기사에서 다루는 NVIDIA GPU가 아닙니다.
프로세서 다이를 보여 주는 예시 이미지이며, 기사에서 다루는 NVIDIA GPU가 아닙니다.

2012년 AlexNet의 이정표는 저수준 GPU 엔지니어링(cuda-convnet)과 분할된 듀얼 GPU 아키텍처에 힘입은 것이었으며, 이는 더 깊고 더 효율적인 컴퓨터 비전 모델을 향한 빠른 경쟁을 직접 촉발했다.

1. cuda-convnet은 내부에서 어떻게 동작했는가

NVIDIA가 cuDNN을 만들기 전, Alex Krizhevsky는 초기 Fermi 아키텍처 GPU(GTX 580)에서 최대 속도를 끌어내기 위해 순수 CUDA C++로 cuda-convnet을 작성했다. 현대의 라이브러리는 보통 합성곱을 거대한 행렬 곱셈(im2col)으로 펼치는데, 이는 막대한 메모리를 소비한다. GTX 580 한 장에는 VRAM이 3GB밖에 없었기 때문에, Krizhevsky는 메모리를 아끼는 직접 방식의 GPU 루틴을 설계했다.

  • 배치 우선 메모리 레이아웃(CHWN). 현대 프레임워크는 기본적으로 NCHW(배치, 채널, 높이, 너비)를 사용하며, 이는 한 이미지의 모든 픽셀을 메모리에서 서로 인접하게 배치한다. Krizhevsky는 텐서를 CHWN 순서로 저장해 배치 차원(N)을 마지막에 두었다. 워프의 GPU 스레드 32개가 서로 다른 32개 이미지의 정확히 같은 픽셀 위치를 처리할 때, 이들의 메모리 읽기는 완전히 연속적(coalesced)이어서 VRAM 대역폭을 최대한 활용했다.
  • 공유 메모리 타일링. 전역 VRAM에서 읽는 데는 수백 클록 사이클이 걸리지만, 온칩 공유 메모리(GTX 580에서는 스트리밍 멀티프로세서당 48KB뿐)는 몇 사이클이면 된다. 스레드 블록은 이미지 픽셀과 필터 가중치의 작은 2D 패치를 공유 메모리에 올려 두고, 최종 결과를 VRAM에 다시 쓰기 전에 수십 번의 내적을 계산했다.
  • 워프 수준 레지스터 재사용. Krizhevsky는 각 스레드 블록이 여러 필터에 걸쳐 출력 픽셀 타일을 동시에 계산하도록 배정했다. 필터 가중치를 빠른 GPU 레지스터에 유지함으로써, 공유 메모리에서 한 번 불러온 이미지 패치 하나를 여러 필터에 동시에 재사용할 수 있었고, 메모리 트래픽이 크게 줄었다.

2. AlexNet의 구체적인 레이어와 듀얼 GPU 분할

AlexNet은 학습되는 레이어 8개(합성곱 5개와 완전 연결 3개)로 구성되었고 파라미터는 총 약 6천만 개였다. GTX 580 한 장에는 활성화, 가중치, 그래디언트에 필요한 3GB 이상의 VRAM이 없었기 때문에, Krizhevsky는 네트워크를 세로로 나누어 두 개의 병렬 스트림으로 만들었다.

레이어유형전체 필터 / 뉴런 수GPU당 분할GPU 간 통신
입력RGB 이미지224 × 224 × 3두 GPU 모두에 복사됨없음
Conv 111×11 합성곱(스트라이드 4) + MaxPool필터 96개GPU당 필터 48개독립(동기화 없음)
Conv 25×5 합성곱 + MaxPool필터 256개GPU당 필터 128개독립(자기 GPU의 Conv 1만 읽음)
Conv 33×3 합성곱필터 384개GPU당 필터 192개완전 동기화(두 GPU의 256개 맵을 모두 읽음)
Conv 43×3 합성곱필터 384개GPU당 필터 192개독립(자기 GPU의 Conv 3만 읽음)
Conv 53×3 합성곱 + MaxPool필터 256개GPU당 필터 128개독립(자기 GPU의 Conv 4만 읽음)
FC 6완전 연결 + Dropout뉴런 4,096개GPU당 뉴런 2,048개완전 동기화(모든 Conv 5 출력에 연결)
FC 7완전 연결 + Dropout뉴런 4,096개GPU당 뉴런 2,048개완전 동기화(모든 FC 6 뉴런에 연결)
FC 8완전 연결(Softmax)클래스 1,000개클래스 1,000개(통합)완전 동기화(최종 ImageNet 예측을 출력)
  • 자연스러운 특징 전문화. 흥미롭게도 1, 2번 레이어는 GPU 간에 통신하지 않았기 때문에, 두 카드는 일관되게 서로 특화된 역할로 진화했다. 한 GPU는 색에 무관한 에지와 질감 검출기(그레이스케일의 Gabor 유사 필터)를 학습했고, 다른 GPU는 색에 특화된 블롭과 색조를 전문으로 학습했다.
  • PCIe 병목 최소화. 마더보드의 PCIe 버스로 데이터를 전달하는 것은 느렸다. Krizhevsky는 GPU 간 통신을 Conv 3과 완전 연결 레이어로만 엄격히 제한함으로써, 데이터 전송 때문에 멈추는 일 없이 GPU가 최고 속도로 계산하게 했다.

3. ImageNet 시대에 이후 벌어진 일

AlexNet의 승리는 ImageNet 대회에서 매년 이어지는 경쟁에 불을 붙였고, 불과 3년 만에 네트워크는 8개 레이어에서 150개 이상으로 커졌다.

  • 2013 – ZFNet(시각화와 튜닝). Matthew Zeiler와 Rob Fergus는 AlexNet이 은닉 레이어 안에서 실제로 무엇을 보고 있는지 시각화하기 위해 디컨볼루션 기법을 도입했다. AlexNet 첫 레이어의 필터 크기를 11×11에서 7×7로 줄이고 스트라이드를 낮춤으로써, ZFNet은 ImageNet top-5 오류율을 15.3%에서 14.8%로 낮췄다.
  • 2014 – VGGNet(균일한 3×3 필터를 통한 깊이). 옥스퍼드의 연구진은 작은 3×3 합성곱을 많이(최대 16개 또는 19개 레이어) 쌓는 것이 11×11이나 5×5 같은 큰 필터 하나를 쓰는 것보다 더 잘 작동함을 입증했다. 3×3 레이어 두 개를 쌓으면 더 적은 파라미터와 추가적인 비선형 ReLU 활성화로 동일한 5×5 시야 영역을 포괄하며, 오류율을 7.3%까지 낮췄다.
  • 2014 – GoogLeNet / Inception(다중 스케일 효율). Google은 같은 레이어 안에서 1×1, 3×3, 5×5 합성곱을 병렬로 실행하고 출력을 병합하는 Inception 모듈을 도입했다. 비싼 연산에 앞서 값싼 1×1 합성곱으로 채널 깊이를 압축함으로써, GoogLeNet은 AlexNet보다 파라미터를 12배 적게 쓰면서 22개 레이어와 6.7%의 오류율에 도달했다.
  • 2015 – ResNet(스킵 연결과 152개 레이어). 단순히 레이어를 더 쌓으면 역전파 중 그래디언트가 사라지기 때문에 결국 학습 정확도가 떨어졌다. Microsoft Research는 잔차 연결(스킵 연결)로 이 문제를 해결했고, 데이터가 직접적인 항등 지름길을 통해 레이어를 건너뛸 수 있게 했다. 이로써 152개 레이어의 네트워크가 가능해졌고, top-5 오류율 3.57%를 달성해 사상 처음으로 인간 수준의 벤치마크 성능(약 5%)을 넘어섰다.

더 많은 뉴스: AI & 기술