애플 뉴럴 엔진(ANE)을 뒤돌아보며 역공학으로 분석하다
1. 이게 뭔가요?
애플 M1 칩에 내장된 인공지능 전용 처리 장치인 애플 뉴럴 엔진(ANE)의 내부 하드웨어 구조를 역공학으로 정밀 분석한 글입니다. 뉴럴 엔진은 스스로 명령어를 해석해 실행하는 범용 프로세서가 아니라, 미리 컴파일된 작업 지시서에 맞춰 고정된 데이터 통로의 설정을 바꾸는 고정 기능 가속기입니다. 이 장치는 16개의 연산 코어와 코어들이 공유하는 2MB L2 메모리, 코어마다 독립 배속된 64KB 커널 메모리, 시스템 메모리에서 데이터를 실어 나르는 직접 메모리 접근(DMA) 엔진들로 구성되어 있습니다.
2. 왜 화제인가요?
2017년 처음 선보인 뉴럴 엔진은 가중치 데이터를 내부 메모리에 올려두고 여러 번 재사용하는 이미지 합성곱 신경망(CNN)에 최적화되어 설계되었습니다. 반면 챗GPT 같은 최신 트랜스포머 기반 거대언어모델은 토큰을 하나 생성할 때마다 방대한 전체 가중치를 주기억장치에서 계속 새로 읽어와야 합니다. 이 글은 구형 뉴럴 엔진의 메모리 전송 구조와 읽기 대역폭 한계가 언어 모델 처리에서 어떻게 심각한 병목을 일으키는지 실험으로 입증하며, 왜 애플이 차세대 M5 칩에서 뉴럴 엔진 코어를 그래픽 처리 장치(GPU) 안으로 흡수할 수밖에 없었는지 기술적 근거를 제시합니다.
3. 핵심 내용
글쓴이는 3년 전 중단했던 리눅스용 뉴럴 엔진 드라이버 개발 경험을 바탕으로 M1 뉴럴 엔진의 내부 아키텍처를 완전히 분석했습니다. 2025년 발표된 M5 칩이 거대언어모델 성능을 전면에 내세우며 뉴럴 엔진 코어를 GPU 내부로 통합함에 따라, 독립된 신경망 처리 장치(NPU)의 시대가 저물고 있다는 점이 계기가 되었습니다.
뉴럴 엔진의 계산 핵심부에는 16개의 연산 코어가 배치되어 있습니다. 각 코어는 16비트 부동소수점 기준 128개, 8비트 정수 기준 256개의 병렬 곱셈-누산(MAC) 연산 통로를 갖추어 칩 전체에서 총 2048개의 통로가 동시에 작동합니다. 곱셈-누산은 두 수를 곱한 뒤 이전 누적값에 더하는 연산으로, 행렬 곱셈이나 합성곱 같은 인공지능 연산의 기본 단위입니다. 연산 통로는 데이터의 차원 구조를 알지 못하며 시간 축에 따라 숫자를 누적할 뿐입니다. 내부 연산은 고정소수점 형태로 32비트 누산기에서 32768(2의 15제곱)에 도달하면 값이 제한되는 포화 특성을 보입니다. 계산을 마친 결과는 외부 메모리를 거치지 않고 곧바로 후처리 활성화 함수 장치로 전달됩니다. 쌍곡탄젠트(tanh) 같은 복잡한 비선형 곡선은 33개의 기준점을 선형으로 보간하는 32구간 하드웨어 참조 표를 통해 즉시 계산되며, 스케일링과 편향(bias) 변환은 컴파일 단계에서 합성곱 계수에 미리 병합되거나 후처리 통로에서 함께 처리됩니다.
소프트웨어 드라이버는 매우 단순하게 작동합니다. 드라이버는 하드웨어에 덧셈이나 곱셈 같은 기계어 명령을 직접 내리지 않으며, 신경망 작업 전체는 사전에 '작업 기술서(Task Descriptor)'라는 628바이트 크기의 고정 패킷 묶음으로 컴파일됩니다. 드라이버가 이 묶음을 시스템 메모리에 올리고 레지스터를 호출하면 하드웨어 내부의 작업 관리자가 대기열에서 작업을 가져와 제어 레지스터에 기록하며 데이터 통로를 엽니다. 가상 주소 역시 사전에 고정된 32개의 기준 주소 레지스터(BAR)를 통해서만 상대 오프셋으로 참조할 수 있어, GPU처럼 가상 주소에서 동적으로 읽고 쓰는 기능은 지원하지 않습니다.
성능의 실질적인 한계는 내부 메모리 구조에서 드러납니다. M1 뉴럴 엔진의 최대 연산 성능은 1초에 11조 번(11 TOP/s)이지만 시스템 메모리 대역폭은 초당 68기가바이트(GB/s) 수준입니다. 곱셈-누산기가 2번의 연산을 할 때 4바이트의 데이터를 소비하므로, 외부 메모리에서 데이터를 계속 직접 퍼 올려 연산기를 100% 가동하려면 초당 22테라바이트(TB/s)라는 불가능한 대역폭이 필요합니다. 이는 실제 메모리 대역폭보다 300배 이상 빠른 수치입니다. 따라서 메모리 병목을 피하려면 외부에서 가져온 데이터 1바이트당 최소 162번 이상의 연산을 코어 내부에서 재사용해야 합니다. 재사용 비율이 162 미만인 작업에서는 계산 능력이 아무리 뛰어나도 메모리 전송 속도에 발이 묶입니다.
애플은 이를 극복하기 위해 코어 외부에 2MB 크기의 공유 L2 메모리를 두고, 16개 코어 각각에 64KB 크기의 커널 가중치 전용 메모리(총 1MB)를 독립 배치했습니다. 메모리 이동은 세 가지 DMA 통로가 맡는데, 가중치를 시스템 메모리에서 코어 전용 커널 메모리로 가져오는 통로, 입력 데이터를 L2로 가져오는 통로, 완성된 결과를 L2에서 시스템 메모리로 내보내는 통로로 엄격히 나뉩니다. 가중치 통로는 외부에서 내부로 읽기만 하는 단방향 통로로, 가중치를 코어 안에 고정해 두고 여러 번 재사용할 것을 전제했습니다. 심지어 새로운 가중치는 2MB L2를 거치지 않고 반드시 시스템 메모리에서 직접 가져오도록 설계되었습니다.
주기억장치 읽기 속도를 실측한 결과, 뉴럴 엔진의 가중치 DMA 통로는 초당 37.99기가바이트, 입력 데이터 DMA 통로는 초당 59.08기가바이트에 머물렀습니다. 반면 같은 M1 환경에서 GPU는 단독으로 초당 77.70기가바이트의 지속 읽기 속도를 기록했습니다. 게다가 실험 결과 뉴럴 엔진의 가중치 전송과 입력 데이터 전송은 동시에 겹쳐 진행되지 않고 하나가 완전히 끝난 뒤 다음 작업이 이어지는 순차적 방식으로 실행되어 두 지연 시간이 그대로 합산되었습니다. 단어를 하나 생성할 때마다 거대한 모델 가중치 전체를 다시 읽어와야 하는 거대언어모델 환경에서는, 데이터 재사용을 전제로 설계된 독립 뉴럴 엔진이 GPU보다 전송 대역폭과 처리 효율 면에서 뒤처질 수밖에 없습니다.
4. 나에게 어떤 영향이 있나요?
일반 맥 사용자의 환경이 당장 바뀌는 것은 아니지만, 과거 CNN 모델에 맞춰 굳어진 특화 가속기 구조가 최신 언어 모델 환경에서 겪는 한계를 보여줍니다. 맥 환경에서 인공지능 프로그램을 개발하거나 실행할 때, 순차적 단어 생성을 요구하는 거대언어모델 작업에는 구형 독립 뉴럴 엔진보다 메모리 읽기 대역폭이 넓은 GPU 가속을 활용하는 편이 훨씬 유리하다는 실질적 지침을 제공합니다. 또한 리눅스 등 오픈소스 진영에서 애플 실리콘을 제어하려는 개발자들에게 상세한 하드웨어 레지스터 맵과 DMA 데이터 전송 흐름의 작동 원리를 명확히 밝혀주는 기술적 자료가 됩니다.