TECH 으로 돌아가기
TECH HACKER NEWS 오늘 8분 읽기 22 READS

애플 뉴럴 엔진 해부: 독립형 NPU 시대는 왜 저무는가

애플 뉴럴 엔진 해부: 독립형 NPU 시대는 왜 저무는가
SOURCE IMAGE · HACKER NEWS

애플의 뉴럴 엔진(ANE)을 리버스 엔지니어링해 온 한 개발자가 3년 만에 다시 코드를 열었다. 그가 작업을 중단했던 이유는 냉정하다. ANE 블록이 생각만큼 쓸모 있지 않다는 결론에 이르렀기 때문이다. 리눅스 드라이버로 하드웨어 API를 열어젖혀도 ANE가 처리할 수 있는 워크로드의 폭은 넓어지지 않았고, 아키텍처 자체가 지나치게 '한 방향으로 고집스럽게' 설계돼 범용 가속기 플랫폼의 토대가 되기 어려웠다. 실제로 macOS조차 파인더에서 미리보기 이미지를 업샘플링하는 정도로만 ANE를 상시 활용한다.

다시 M1의 ANE로 돌아온 계기는 2025년 M5다. M5의 핵심 마케팅 포인트는 'LLM 성능'이었고, 애플은 ANE 코어를 GPU 코어 안으로 접어 넣었다. 저자는 이를 독립형 NPU의 종말이 시작된 신호로 읽는다. 이번 분석의 목표도 과거처럼 ANE에서 연산을 돌려 '쓸모 있게' 만드는 것이 아니라, 컴퓨트·데이터패스·스케줄러·메모리·실행 모델이라는 내부 구조 전체를 지도로 그리는 것이다. 그 설계 결정들이 2017년 A11 Bionic 시절 애플이 실리콘에 먼저 새겨 넣은 ML 워크로드 가정을 드러내고, CNN 시대의 NPU에서 트랜스포머를 돌리는 오늘날 GPU로의 전환을 설명해 주기 때문이다.

MAC은 평범하고, 데이터 흐름이 특별하다

ANE는 16개의 컴퓨트 코어를 갖고, 각 코어는 128개의 FP16(또는 256개의 INT8) MAC 레인을 병렬로 둔다. 전체로는 2048개의 MAC 레인이 매 사이클마다 공간적으로 병렬 축약을 수행하며, 유일한 축약 축은 시간이다. 각 레인은 곱셈기·덧셈기·32비트 누산기로 구성되고, 부분합을 레인 내부에 국소적으로 유지하는 피드백 경로 덕분에 사이클 사이에 외부 메모리를 오가지 않는다. 내부적으로는 16비트 곱셈을 Q16.16 고정소수점으로 누적한 뒤 FP16으로 읽어내며, 누산기는 2의 15승에서 포화된다.

저자가 강조하는 핵심은, 합성곱의 내적이든 어텐션의 쿼리-키 내적이든 결국 같은 내적이고 MAC은 그것만 한다는 점이다. 2017년 CNN에 ANE를 특화시킨 것은 MAC 자체가 아니라 그 주변의 데이터 흐름, 즉 입력과 출력이 언제 어디로 들어오고 머무르고 이동하는지였다. 트랜스포머, 특히 자기회귀 디코드가 깨뜨린 전제는 바로 이 '예측 가능한 재사용 패턴'이었다. M5가 ANE 컴퓨트 코어를 GPU 안에 살려 둔 결정은 코어 자체는 트랜스포머에도 여전히 유용하되, 다른 데이터 흐름 안에서라야 한다는 사실을 확인해 준다.

활성화 함수는 룩업 테이블로 굽는다

완성된 MAC 합은 메모리를 거치지 않고 곧바로 후처리 활성화 블록으로 흘러든다. 활성화가 점별(pointwise) 연산이라 스칼라 하나가 완성되면 즉시 적용할 수 있기 때문이다. tanh를 구현하는 방식이 흥미롭다. CoreML 모델을 컴파일하면 33개의 FP16 워드가 나타나는데, 이는 tanh를 양자화한 33개 샘플로 32개 구간을 이루는 조각별 선형 룩업 테이블이다. 임펄스를 주입해 스윕한 결과가 삼각형 모양으로 나타나 인접 항목 간 선형 보간을 확인할 수 있었다. 나아가 ax+b 형태의 선형 스케일·바이어스 변환도 같은 보간 하드웨어를 공유하며, 컴파일 시점에 합성곱 안으로 접혀 들어간다.

드라이버는 지루하고, 그래서 본질이 보인다

저자의 표현대로 드라이버 소스는 '실망스러울 만큼 지루하다'. 드라이버는 ANE에 CONV·MATMUL·RELU 같은 명령을 주지 않는다. 모든 신경망 연산은 이미 태스크 디스크립터(TD)의 명령 스트림으로 컴파일돼 있고, 소프트웨어는 태스크를 메모리에 올려 포인터(TM_ADDR, TM_SIZE)를 설정한 뒤 도어벨(TM_PUSH)을 울리기만 한다. 이후 하드웨어가 완료까지 소유권을 쥐고 끝나면 인터럽트를 올린다. 이 구조는 NVIDIA의 푸시버퍼 방식처럼 GPU의 명령 제출 프런트엔드를 닮았다. 다만 TM_INFO가 디스크립터 총개수만 담는다는 점에서 ANE의 디스크립터는 가변 길이가 아니라 고정 크기임을 알 수 있다. 태스크 큐는 8개(qid 0~7)이며, 32개 항목의 BAR 테이블이 상대 오프셋으로만 표현된 가상 주소에 기준 주소를 제공한다. 즉 ANE에는 가상 주소로 동적 로드·스토어를 발행하는 GPU식 명령이 없다.

TD를 열어 보면 그것이 실행 가능한 명령 스트림이 아님이 분명해진다. ANE에는 ISA가 없다. TD는 입력 차원, 입출력 주소, 활성화 함수 같은 하드웨어 설정 레지스터에 값을 밀어 넣는 'ControlDMA' 버스트 쓰기 패킷의 나열, 사실상 데이터패스 레지스터 파일을 직렬화한 덤프다. 하나의 'ANE 프로그램'이란 데이터패스를 한 번 통과시키기 위한 설정에 지나지 않는다. 우리는 고정된 데이터패스가 노출하는 손잡이만 조절할 수 있을 뿐, 그것이 무슨 연산을 할 수 있는지나 순서를 바꿀 수는 없다.

실무자에게 남는 것: 병목은 유연성이 아니라 대역폭

결론적으로 ANE는 임의 명령을 실행하는 GPU가 아니라 고정 기능 데이터 흐름 엔진이다. 인터페이스를 좁게 제한한 대가로 면적, 지연, 전력을 줄였고, 그 대신 컴파일러가 텐서의 움직임을 명시적으로 스케줄링해야 한다. 그러나 저자는 이것이 정당한 트레이드오프라고 본다. 모델의 형태는 대개 컴파일 시점에 이미 알 수 있고, 텐서 크기를 고정한다고 가변 길이를 못 다루는 것도 아니기 때문이다. 예컨대 늘어나는 KV 캐시는 크기만큼 루프를 돌면 되고, 그 디스패치 오버헤드는 사소하다. 실무자가 새겨 둘 진짜 교훈은 여기에 있다. ANE를 CNN에 최적화되고 트랜스포머에 인색하게 만든 것은 동적 실행 능력의 부재가 아니라 메모리 이동, 곧 메모리 스트리밍 대역폭이라는 점이다. 어떤 가속기를 평가하든 가장 느린 링크가 어디인지부터 찾아야 최적화가 의미를 가진다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://eiln.github.io/posts/ane.html
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기
처리 중...