AI 개발을 하다보면 딥러닝 논문이나 구현된 모델의 코드에서 숫자만 나왔다하면 어째서인지 죄다 2의 제곱수인 것을 볼 수 있습니다. 레이어의 수, 은닉층 사이즈, 배치 사이즈 등에서 작게는 2, 4, 8 ... 더 나아가 1024, 2048..과 같이 2의 제곱인 숫자가 대부분 사용되는 것을 확인할 수 있습니다.
그런데 사실, 이것은 암묵적인 합의에 불과합니다. 즉, 2의 제곱수가 아닌 다른 숫자를 사용하더라도 코드는 아마 작동할 것입니다. 그럼에도 불구하고, 가급적이면 2의 제곱수로 여러분의 코드를 구성하는 것을 권장하고 싶습니다. 그 이유는 다음과 같습니다.
1. 컴퓨터는 2의 제곱수로 일을 합니다.
흔히 우리가 컴퓨터 작동 방식을 떠올릴 때 01101010101.. 이렇게 표현하듯이, 컴퓨터는 기본적으로 2의 제곱수를 기반으로 작업을 진행합니다. 예를 들어, 메모리 주소가 이진수로 표현되기 때문에, 2의 제곱수로 메모리를 정렬하면 주소 계산이 매우 간단해집니다.
또한 GPU와 같은 병렬 처리 유닛에서도 2의 제곱수 크기의 데이터를 사용하면 해당 유닛의 활용도가 극대화됩니다. 뿐만 아니라, 하드웨어 단에서 데이터 전송이 이루어질 때 전송 단위가 2의 제곱수(32비트 또는 64비트)입니다. 따라서 2의 제곱수 크기로 데이터를 전송할 때 전송 속도가 최적화됩니다.
AI 개발에서는 이러한 정보 처리 속도 차이가 성능을 좌우하기 때문에, 2의 제곱수는 거의 필수에 가까운 수준으로 권장되고 있습니다.
2. 패딩을 최소화할 수 있습니다.
패딩은 행렬이나 벡터의 크기를 연산을 위해 일정한 크기로 맞추는 것을 의미합니다. 입력 데이터가 고정된 크기가 아닌 경우, 경계에 0을 추가하여 크기를 맞춥니다.
패딩 오버헤드는 크기를 맞추기 위해 추가적인 패딩을 삽입할 때 발생하는 불필요한 메모리 사용량 혹은 연산 비용을 의미합니다. 패딩 오버헤드를 최소화해야만 메모리 사용을 최적화하고 연산 성능을 향상시킬 수 있습니다.
모델에서 미니배치를 처리할 때, 배치 크기가 2의 제곱수이면 패딩 오버헤드를 최소화할 수 있습니다. 이는 메모리와 병렬 처리가 최적화되기 때문인데, 앞서 언급한 2의 제곱수 기반의 컴퓨터 연산 원리와 같은 맥락에서 이해할 수 있습니다.
3. 효율적입니다.
딥러닝 모델은 기본적으로 행렬 계산을 수행합니다. 이때, 행렬 곱셈과 같은 연산은 2의 제곱수 크기의 데이터에서 가장 효율적으로 수행됩니다.
공간적 지역성이란 특정 메모리 위치에 접근한 후 가까운 메모리 위치에도 접근할 가능성이 높은 것을 의미합니다. 2의 제곱수 크기로 데이터를 정렬하면, 관련된 데이터가 메모리 내에서 연속적인 주소에 배치되어 캐시 메모리의 효율성이 증가합니다.
이는 캐시 히트율을 높여주며, 전체적인 알고리즘의 시간 복잡도를 줄이고 연산을 최적화하는 데 큰 도움이 됩니다. 따라서, 2의 제곱수로 이루어진 데이터 구조는 컴퓨터 시스템에서 매우 중요한 역할을 합니다.
2의 제곱수로 코드를 짜면 얻을 수 있는 장점에 대해서 다루어보았습니다. 위 내용은 비단 AI 뿐만 아니라 컴퓨터로 하는 작업 전반에 걸쳐 적용할 수 있는 개념입니다. 추가적으로 OS 공부를 하신다면 더 정확하게 이해할 수 있습니다.