애플 실리콘 안에 숨어 있는 세 번째 칩
M1 맥을 뜯어보면 CPU, GPU 말고 하나가 더 있어요. 뉴럴 엔진(Apple Neural Engine, ANE)이라는 건데요. 2017년 아이폰 X의 A11 칩에 2코어짜리로 처음 들어갔고, M1에선 16코어에 초당 11조 번 연산(11 TOPS), 최신 M4에선 38 TOPS까지 커졌어요.
이게 뭐냐면, 신경망 추론 하나만 하려고 설계한 전용 계산기예요. GPU가 뭐든 할 수 있는 만능 공작기계라면, ANE는 행렬 곱셈 하나만 아주 빠르게, 아주 적은 전력으로 찍어내는 프레스기 같은 거예요. Face ID, 사진 앱의 얼굴 인식, 카메라 인물 모드 같은 기능이 다 여기서 돌아가요.
문제는 애플이 이 하드웨어를 직접 만지는 방법을 전혀 공개하지 않는다는 거예요. 개발자가 쓸 수 있는 유일한 통로는 Core ML이에요. 모델을 Core ML 형식으로 변환해서 넘기면 애플이 알아서 CPU, GPU, ANE 중 어디서 돌릴지 정해요. 어떤 연산이 ANE에 올라갔는지도 잘 안 알려주고, 리눅스에선 그냥 전기만 먹는 실리콘 덩어리예요.
eiln이라는 개발자가 몇 년 전에 이 벽을 혼자 뚫었어요. M1 맥에 리눅스를 올리는 Asahi Linux 프로젝트를 위해 ANE 드라이버를 리버스 엔지니어링해서 만든 건데요. 이번에 그 작업 전체를 되돌아보는 회고 글을 올렸어요. 문서 한 줄 없는 하드웨어를 어떻게 이해하고 구동까지 갔는지, 그 여정이 꽤 배울 게 많아요.
문서 없는 하드웨어는 어떻게 읽어내나
리버스 엔지니어링이 뭐냐면, 완성품을 보고 설계도를 거꾸로 알아내는 거예요. 하드웨어 드라이버의 경우 방법이 사실상 하나예요. 이미 그 하드웨어를 잘 쓰고 있는 소프트웨어, 즉 macOS가 하드웨어에 뭘 쓰고 뭘 읽는지 전부 엿보는 거죠.
Asahi 프로젝트엔 이걸 위한 도구가 있어요. m1n1이라는 부트로더 겸 하이퍼바이저인데, macOS를 손님(게스트)으로 띄워 놓고 macOS가 하드웨어 레지스터에 접근할 때마다 그 내용을 기록해요. 레지스터는 하드웨어에 명령을 내리는 우편함 같은 거예요. 어떤 주소에 어떤 값을 쓰면 하드웨어가 무슨 동작을 하는지, 수천 번의 접근 기록을 보면서 패턴을 찾는 거죠.
ANE 같은 가속기는 메모리를 직접 읽고 쓰는 DMA 방식으로 동작하고, 그 앞에 DART라는 IOMMU가 붙어 있어요. IOMMU는 장치가 접근할 수 있는 메모리 범위를 통제하는 문지기예요. 그래서 드라이버가 할 일은 크게 네 가지로 정리돼요. 입력과 출력, 가중치가 들어갈 메모리를 잡고, IOMMU에 그 주소를 등록하고, 실행할 작업 설명서를 하드웨어에 넘기고, 끝났다는 인터럽트를 기다리는 것. eiln은 이 흐름을 macOS 트레이스에서 재구성해서 리눅스 커널 드라이버로 다시 썼어요.
진짜 난관은 드라이버가 아니라 컴파일러
여기까지는 절반이에요. ANE는 PyTorch 연산을 그대로 실행하는 게 아니라, 애플의 비공개 컴파일러가 만들어낸 고정된 명령 스트림을 실행하거든요. 이 컴파일러는 Core ML 안에 숨어 있고, 결과물은 hwx라는 바이너리 파일이에요. 형식은 맥 실행 파일과 같은 Mach-O예요.
이 컴파일러를 처음부터 다시 만드는 건 혼자서 할 수 있는 규모가 아니에요. 그래서 eiln이 택한 방법이 실용적이에요. macOS에서 애플 컴파일러를 그대로 불러 hwx를 뽑고, 그걸 리눅스 드라이버가 읽을 수 있는 형태로 포장하는 anecc라는 도구를 만들었어요. 맥에서 한 번 컴파일하면 그 결과물을 리눅스에서 계속 돌릴 수 있는 구조죠. 대신 맥이 없으면 새 모델을 컴파일할 수 없다는 한계가 남아요.
이 과정에서 ANE의 성격도 드러났어요. 이 칩은 본질적으로 합성곱(convolution) 엔진이에요. 행렬 곱셈 같은 다른 연산도 1×1 합성곱으로 바꿔서 처리해요. 숫자는 16비트 부동소수점(fp16)만 다뤄요. 그래서 fp32 모델을 그대로 올리면 정확도가 흔들리고, 트랜스포머처럼 입력 형태가 계속 바뀌는 모델은 올리기 까다로워요. 애플이 ‘ANE 최적화 트랜스포머’ 가이드를 따로 낸 이유가 이거예요.
그래서 지금 리눅스에서 ANE가 되나
지금까지도 리눅스 메인라인 커널에 애플 뉴럴 엔진 드라이버는 없어요. eiln의 작업은 실험적 드라이버와 도구 모음으로 남아 있고, 이번 회고는 그 궤적을 처음부터 다시 정리한 글이에요. 한 사람이 문서 없이 어디까지 갈 수 있는지, 그리고 어디서부터는 벤더 협조 없이는 안 되는지를 보여주는 기록이라고 보면 돼요.
업계 맥락: NPU 오픈 드라이버 지형도
재밌는 건 애플이 이 분야에서 유독 닫혀 있다는 점이에요.
- 인텔은 NPU 드라이버(ivpu)를 직접 리눅스 커널에 올렸어요.
- AMD도 XDNA NPU 드라이버(amdxdna)를 2025년에 메인라인에 넣었어요.
- 락칩 NPU는 커뮤니티가 리버스 엔지니어링해서 만든 오픈 드라이버가 메인라인까지 갔어요. Mesa의 Teflon 프레임워크로 TensorFlow Lite 모델을 바로 돌릴 수 있어요.
- 애플은 공식 드라이버도, 문서도, 커뮤니티 드라이버의 메인라인 합류도 없어요.
한국 개발자에게 주는 시사점
맥이나 아이폰에서 온디바이스 AI를 만드는 분이라면 실무에 바로 닿는 얘기예요. ANE를 쓰려면 Core ML 변환이 유일한 길이고, 그때 챙길 건 세 가지예요. fp16으로 바꿨을 때 정확도가 유지되는지, 입력 형태를 고정할 수 있는지, 쓰는 연산이 ANE 지원 목록에 있는지. Xcode의 Core ML 성능 리포트로 어떤 레이어가 어느 장치에서 돌았는지 확인할 수 있어요.
하드웨어에 관심 있는 분이라면 m1n1 하이퍼바이저 트레이싱 방식 자체가 공부거리예요. 문서 없는 칩을 다루는 가장 정직한 방법이거든요.
그리고 국내 NPU 회사들이 눈여겨볼 대목이 있어요. 하드웨어가 아무리 좋아도 소프트웨어 스택이 닫혀 있으면 생태계가 안 생겨요. 애플만큼 자체 생태계가 큰 회사도 ANE는 소수만 쓰는 칩이 됐잖아요. 드라이버와 컴파일러를 열어야 개발자가 붙는다는 걸, 이 회고가 역으로 증명하는 셈이에요.
정리
한 줄 요약: 애플이 문서 한 줄 안 준 뉴럴 엔진을 한 개발자가 macOS 트레이싱으로 뜯어내 리눅스에서 구동까지 갔지만, 비공개 컴파일러라는 벽이 남았다는 이야기.
여러분은 NPU 같은 전용 가속기가 정말 GPU를 대체할 수 있다고 보세요? 아니면 소프트웨어가 닫혀 있는 한 계속 소수만 쓰는 칩으로 남을까요?
🔗 출처: Hacker News