- Phân tích trực tiếp cấu trúc bên trong của Apple Neural Engine (ANE) để triển khai cách bỏ qua CoreML và truy cập trực tiếp vào phần cứng
- Loại bỏ tầng trừu tượng của CoreML và thông qua API
_ANEClient để tự thực hiện biên dịch, nạp và chạy mô hình
- Phân tích MIL (Machine Learning Intermediate Language) và định dạng nhị phân E5 để xác nhận ANE là một bộ máy thực thi đồ thị dựa trên các primitive phép toán cố định
- Chứng minh khả năng truyền dữ liệu zero-copy giữa GPU↔ANE bằng bộ nhớ chia sẻ IOSurface
- Nghiên cứu này là phần đầu tiên trong loạt 3 bài khám phá đo hiệu năng thực tế và khả năng huấn luyện trên ANE của M4, đồng thời có ý nghĩa như trường hợp điều khiển trực tiếp đầu tiên đối với phần cứng riêng tư của Apple
Cách tiếp cận reverse engineering với sự cộng tác giữa con người và AI
- Nghiên cứu được thực hiện với sự hợp tác giữa nhà nghiên cứu con người và Claude Opus 4.6 của Anthropic
- Con người định hướng khám phá, AI thực hiện phân tích dữ liệu và viết mã
- Mục tiêu khởi đầu từ câu hỏi: “Liệu có thể huấn luyện trực tiếp mô hình trên Apple Neural Engine hay không?”
- Apple không công khai ISA, cấu trúc nội bộ và giao diện lập trình trực tiếp của ANE
- Chỉ có thể truy cập thông qua CoreML, khiến việc hiểu cách phần cứng hoạt động trở nên khó khăn
- Vì vậy, nhóm nghiên cứu đã lần ngược toàn bộ ngăn xếp phần mềm từ CoreML đến driver kernel IOKit và xác lập được đường đi mã lệnh để điều khiển ANE trực tiếp
Cấu trúc của Neural Engine
- ANE không phải GPU hay CPU mà có dạng bộ máy thực thi đồ thị (graph execution engine)
- Chạy toàn bộ đồ thị mạng nơ-ron đã biên dịch như một phép toán nguyên tử duy nhất
- ANE trên chip M4 (tên mã H16G) có 16 lõi, độ sâu hàng đợi yêu cầu 127, điều khiển DVFS độc lập, và khả năng ngắt điện 0mW khi nhàn rỗi
- Apple lần đầu đưa ANE 2 lõi vào A11 (2017) và đã mở rộng qua từng thế hệ
Khác biệt so với các nghiên cứu trước đây
- Các tài liệu công khai hiện có:
- Tài liệu về hoạt động và phân tích hiệu năng ANE của Matthijs Hollemans
- Mẫu reverse engineering ban đầu của mdaiter/ane
- Driver Linux reverse engineered của Asahi Linux
- Mã tối ưu hóa transformer chính thức của apple/ml-ane-transformers
- Thành quả riêng của nghiên cứu này:
- Truy cập trực tiếp vào API
_ANEClient mà không cần CoreML
- Giải mã đường biên dịch MIL trong bộ nhớ
- Đo thông lượng thực tế sau khi loại bỏ overhead của CoreML
- Thực hiện huấn luyện mô hình trên phần cứng vốn chỉ dành cho suy luận
Phương pháp phân tích
- Khám phá lớp: dùng lệnh
dyld_info -objc để trích xuất danh sách các lớp trong AppleNeuralEngine.framework
- Method swizzling: chặn lời gọi CoreML để xác định đường gọi vào framework riêng tư
- Phân tích nhị phân: giải mã bundle E5 đã biên dịch để xác định định dạng chương trình
- Phân tích scaling: thay đổi kích thước ma trận, độ sâu đồ thị và số kênh để suy luận topology phần cứng
- Kết quả là phát hiện hơn 40 lớp riêng tư như
_ANEClient, _ANEModel, _ANERequest, _ANEIOSurfaceObject, _ANEInMemoryModel
Bỏ qua CoreML: truy cập trực tiếp _ANEClient
- Thông qua
_ANEClient, có thể điều khiển trực tiếp toàn bộ pipeline biên dịch → nạp → đánh giá mô hình
- CoreML thực chất chỉ là một tầng tiện ích bao quanh quá trình này
- ANE hỗ trợ tối đa 127 yêu cầu đánh giá đồng thời (queue depth), phù hợp cho suy luận streaming thông lượng cao
- Có thể truyền bộ nhớ chia sẻ giữa GPU và ANE bằng I/O buffer dựa trên IOSurface
MIL: ngôn ngữ đầu vào của ANE
- CoreML sử dụng MIL (Machine Learning Intermediate Language) thay vì ONNX hay protobuf
- Dựa trên static single assignment (SSA), khai báo rõ kiểu và shape
- Trong mã ví dụ, phép toán
matmul được biểu diễn rõ ràng
- Layout tensor dùng định dạng NCDHW + Interleave với cấu trúc
[Batch, Channels, Depth, Height, Width]
Định dạng nhị phân E5
- Chương trình MIL được biên dịch thành nhị phân FlatBuffer E5
- Nhân ma trận 1024×1024: 2.688 byte, nhân ma trận 128×128: 2.680 byte
- Kích thước mã gần như giống nhau → chỉ chứa thông tin cấu hình được tham số hóa, không phải thuật toán phép toán ma trận
- Điều này cho thấy ANE thực thi đồ thị bằng cách kết hợp các primitive phép toán cố định như Conv, MatMul, Elementwise
Đường biên dịch trong bộ nhớ
- Có thể dùng
_ANEInMemoryModelDescriptor để biên dịch MIL ngay trong bộ nhớ mà không cần truy cập đĩa
- Vấn đề chính và cách xử lý:
milText không phải NSString mà cần NSData (byte UTF-8)
weights phải ở dạng dictionary ánh xạ tên–dữ liệu
- Bên trong vẫn cần truy cập thư mục tạm → bắt buộc phải có quyền ghi
- Phát hiện lỗi chính tả
Desctiptor trong mã nội bộ của Apple
Hồ sơ phần cứng
- Kết quả phân tích IOKit cho thấy ANE có kênh quản lý điện năng và xung nhịp (DVFS) độc lập
- Có nhiều trigger phần cứng/phần mềm như
ANE_ADCLK_TRIG, ANE_PPT_TRIG
- Trong ANECompiler.framework, Conv được xác nhận là primitive phép toán cốt lõi
- Ở Part 2, việc chuyển 1×1 Conv thành MatMul được cho là sẽ tăng hiệu năng gấp 3 lần
Giao thức IOSurface
- Toàn bộ dữ liệu vào/ra đều được xử lý thông qua đối tượng bộ nhớ chia sẻ IOSurface
- Cùng cơ chế chia sẻ texture như GPU
- Mở ra khả năng xây dựng pipeline zero-copy GPU↔ANE
Cấu trúc bộ nhớ đệm biên dịch
- Trình biên dịch ANE lưu cache nhị phân E5 trên đĩa
- Đường dẫn:
~/Library/Caches/.../com.apple.e5rt.e5bundlecache/.../H16G.bundle/
- Lần biên dịch đầu mất 20–40ms, nếu trúng cache thì chạy gần như ngay lập tức
- Có lợi cho suy luận, nhưng với huấn luyện thì cần biên dịch lại do trọng số thay đổi
Các vùng chưa được khám phá
- Những lớp chưa được phân tích:
_ANEChainingRequest — có thể cho phép nối nhiều mô hình trong một lần dispatch
_ANESharedEvents, _ANESharedSignalEvent, _ANESharedWaitEvent — fence/signal để đồng bộ GPU↔ANE
_ANEPerformanceStats — có thể là bộ đếm hiệu năng phần cứng
_ANEVirtualClient — có thể liên quan đến truy cập ảo hóa đa tiến trình
- Các mục vẫn chưa xác nhận:
- Vi kiến trúc lõi và ISA của ANE
- Cách phân bổ lõi cho các phép toán trong đồ thị
- Tần số xung nhịp và cấu trúc SRAM
Kế hoạch tiếp theo
- Part 2: scaling của nhân ma trận, nút thắt SRAM, so sánh hiệu năng Conv và MatMul, kiểm chứng con số “38 TOPS” của Apple
- Part 3: huấn luyện mạng nơ-ron trên ANE
- Toàn bộ mã được công khai trong thư mục
ane/ của github.com/maderix/ANE
- Môi trường thử nghiệm: M4 Mac Mini, macOS 15.x
2 bình luận
Tham khảo: trình điều khiển ANE out-of-tree của Asahi Linux
Ý kiến trên Hacker News
Tôi nghĩ tác giả đã làm một việc thực sự xuất sắc, và cũng đang mong chờ phần 3
Tôi chủ yếu dùng các thư viện Python ML như lightgbm, sklearn, xgboost và numpy
Tôi muốn biết liệu các phép tính này có được tăng tốc trên phần cứng Apple hay không, và có cách đơn giản nào để benchmark không
Hầu hết benchmark đều ở mức hàm C, nên tôi không rõ ở các thư viện mức cao có hiệu quả hay không
ChatGPT lại bảo tôi so sánh Intel Mac với Apple Silicon, nghe mà buồn cười. Chắc đây cũng là một phần lý do khiến mọi người vẫn ghét AI
Lý do là NPU thường được tối ưu riêng cho từng nhà sản xuất, nên các nhà phát triển mã nguồn mở rất khó hỗ trợ
Apple ANE cũng không phải ngoại lệ, và nghiên cứu lần này có vẻ là một nỗ lực giải quyết vấn đề đó trong phạm vi riêng của Apple ANE
Theo bài Inside the M4 Apple Neural Engine, nó đạt hiệu năng 6.6 FLOPS/W và khi không dùng thì tắt hoàn toàn nên tiêu thụ 0W
Apple tính “38 TOPS INT8” bằng cách lấy FP16 19 TFLOPS × 2, nhưng phần cứng thực tế không chạy phép toán INT8 nhanh gấp đôi
Cách tính này khiến tôi thấy giống một kiểu phóng đại hơi không giống Apple
LLM có thể tạo ra thông tin sai nhưng rất thuyết phục, đủ để đánh lừa cả chuyên gia
Tôi nghi ngờ liệu mọi dữ kiện có được kiểm chứng thủ công hay không. Xét ở khía cạnh đó, việc cảnh báo trước như vậy lại khiến tôi thấy may vì có thể khỏi cần đọc
Trong bài cũng có thể thấy vài benchmark kỳ quặc như vậy
Ngay cả trước thời LLM, giới học thuật đã đầy những bài báo bị thao túng và các nghiên cứu không thể tái lập
Cuối cùng, kiểu phân tích này chỉ đáng tin khi có thêm nhiều kỹ sư khác cùng kiểm chứng
Có quá nhiều câu chuyện không liên quan đến chủ đề
Có lẽ đó cũng là một trong những lý do khiến Awni, người phụ trách dự án MLX, rời Apple
Nhưng điểm hay của bài này là nó xác nhận sâu hơn và mở rộng thêm các nội dung đó
Nếu CoreML gần như không có overhead với các phép toán matmul lớn, thì vẫn còn nhiều dư địa để các framework AI chạy cục bộ tận dụng ANE cho giai đoạn prefill
Tuy vậy, bước decode lại bị giới hạn bởi băng thông bộ nhớ, và quá trình biến matmul thành 1x1 convolution thì kém hiệu quả, nên lợi ích rõ ràng là không nhiều
Tên của nó là Core AI, và được cho là sẽ giúp tích hợp LLM bên thứ ba vào ứng dụng dễ dàng hơn
Bài liên quan: Bloomberg newsletter
Dù vậy tôi vẫn thấy nó cực kỳ hữu ích và thú vị
Kho GitHub được nhắc trong bài cũng rất đáng tham khảo
Đoạn đó đúng là có dấu vết do AI viết
Điều quan trọng hơn cả việc reverse engineering ANE là Manjeet đã mở rộng năng lực kỹ thuật của mình đến mức nào nhờ AI
Đây chính là thời đại mà AI đang tăng tốc năng suất của lập trình viên