- Die interne Struktur der Apple Neural Engine (ANE) wurde direkt analysiert, um eine Methode zu implementieren, CoreML zu umgehen und direkt auf die Hardware zuzugreifen
- Durch das Entfernen der Abstraktionsschicht von CoreML und über die API
_ANEClient werden Modellkompilierung, Laden und Ausführung direkt durchgeführt
- Durch die Analyse von MIL (Machine Learning Intermediate Language) und dem binären E5-Format wurde bestätigt, dass die ANE eine Graph-Ausführungs-Engine auf Basis fester Rechenprimitiven ist
- Mithilfe von gemeinsam genutztem IOSurface-Speicher wurde die Möglichkeit eines Zero-Copy-Datentransfers zwischen GPU und ANE nachgewiesen
- Diese Forschung ist der erste Teil einer dreiteiligen Reihe, die sich mit der Messung der realen Leistung und der Lernfähigkeit der M4 ANE befasst, und ist als erstes Beispiel direkter Steuerung von nicht öffentlich dokumentierter Apple-Hardware von Bedeutung
Reverse-Engineering-Ansatz durch Mensch-KI-Zusammenarbeit
- Die Forschung wurde in Zusammenarbeit zwischen einem menschlichen Forscher und Anthropic Claude Opus 4.6 durchgeführt
- Der Mensch gab die Richtung der Untersuchung vor, die KI übernahm Datenanalyse und Codeerstellung
- Ausgangspunkt war die Frage: „Kann man Modelle direkt auf der Apple Neural Engine trainieren?“
- Apple veröffentlicht weder die ISA, die interne Struktur noch die direkte Programmierschnittstelle der ANE
- Zugriff ist nur über CoreML möglich, was das Verständnis des Hardwareverhaltens erschwert
- Deshalb wurde der gesamte Software-Stack von CoreML bis zum IOKit-Kerneltreiber zurückverfolgt und ein Codepfad zur direkten Steuerung der ANE erschlossen
Struktur der Neural Engine
- Die ANE ist keine GPU oder CPU, sondern eine Graph-Ausführungs-Engine (graph execution engine)
- Sie führt den gesamten kompilierten neuronalen Graphen als eine atomare Operation aus
- Die ANE des M4-Chips (Codename H16G) verfügt über 16 Kerne, 127 Request-Queues Tiefe, unabhängige DVFS-Steuerung und 0-mW-Abschaltung im Leerlauf
- Apple führte die erste 2-Kern-ANE mit dem A11 (2017) ein und hat sie seitdem über die Generationen hinweg erweitert
Abgrenzung zu früheren Arbeiten
- Bisher öffentlich verfügbare Materialien:
- Dokumentation zum ANE-Verhalten und Leistungsanalysen von Matthijs Hollemans
- Frühe Reverse-Engineering-Beispiele von mdaiter/ane
- Reverse-engineerte Linux-Treiber von Asahi Linux
- Offizieller Transformer-Optimierungscode von apple/ml-ane-transformers
- Eigenständige Ergebnisse dieser Untersuchung:
- Erfolgreicher direkter Zugriff auf die API
_ANEClient ohne CoreML
- Entschlüsselung des In-Memory-Kompilierungspfads für MIL
- Messung des realen Durchsatzes nach Entfernen des CoreML-Overheads
- Ausführung von Modelltraining auf reiner Inferenz-Hardware
Analysemethodik
- Klassenerkundung: Extraktion der internen Klassenliste aus
AppleNeuralEngine.framework mit dem Befehl dyld_info -objc
- Method Swizzling: Abfangen von CoreML-Aufrufen zur Bestimmung des Aufrufpfads in private Frameworks
- Binäranalyse: Entschlüsselung kompilierter E5-Bundles zur Bestimmung des Programmformats
- Skalierungsanalyse: Variation von Matrixgrößen, Graph-Tiefe und Kanalanzahl zur Ableitung der Hardware-Topologie
- Insgesamt wurden mehr als 40 private Klassen identifiziert, darunter
_ANEClient, _ANEModel, _ANERequest, _ANEIOSurfaceObject, _ANEInMemoryModel
CoreML umgehen: direkter Zugriff über _ANEClient
- Über
_ANEClient lässt sich die gesamte Pipeline Modell kompilieren → laden → auswerten direkt steuern
- CoreML ist letztlich nur eine Komfortschicht, die diesen Prozess umhüllt
- Die ANE unterstützt bis zu 127 gleichzeitige Evaluierungsanfragen (queue depth) und ist damit für Streaming-Inferenz mit hohem Durchsatz optimiert
- Mit IOSurface-basierten I/O-Buffern ist Shared-Memory-Transfer zwischen GPU und ANE möglich
MIL: Eingabesprache der ANE
- CoreML verwendet statt ONNX oder protobuf MIL (Machine Learning Intermediate Language)
- basiert auf Static Single Assignment (SSA), mit expliziten Typen und Shapes
- im Beispielcode ist die Operation
matmul klar dargestellt
- Das Tensor-Layout hat das Format NCDHW + Interleave mit der Struktur
[Batch, Channels, Depth, Height, Width]
Binärformat E5
- MIL-Programme werden zu binären E5-FlatBuffer-Dateien kompiliert
- 1024×1024-Matrixmultiplikation: 2.688 Byte, 128×128-Matrixmultiplikation: 2.680 Byte
- Die Codegröße ist nahezu identisch → enthalten sind nur parametrisierte Konfigurationsinformationen statt Matrixalgorithmik
- Das bedeutet, dass die ANE Graphen durch Kombination fester Rechenprimitive (Conv, MatMul, Elementwise usw.) ausführt
In-Memory-Kompilierungspfad
- Mit
_ANEInMemoryModelDescriptor ist MIL-Kompilierung im Speicher ohne Festplattenzugriff möglich
- Wichtige Probleme und Lösungen:
milText benötigt kein NSString, sondern NSData (UTF-8-Bytes)
weights liegt als Dictionary mit Name-Daten-Zuordnung vor
- Intern ist Zugriff auf ein temporäres Verzeichnis nötig → Schreibberechtigung ist zwingend erforderlich
- Im Apple-internen Code wurde der Tippfehler
Desctiptor entdeckt
Hardwareprofil
- Laut IOKit-Analyse besitzt die ANE eigene Kanäle für Leistungs- und Taktverwaltung (DVFS)
- Es existieren verschiedene Hardware-/Software-Trigger wie
ANE_ADCLK_TRIG, ANE_PPT_TRIG usw.
- Unter den in ANECompiler.framework bestätigten unterstützten Operationen ist Conv das zentrale Rechenprimitiv
- In Teil 2 soll gezeigt werden, dass die Umwandlung von 1×1-Conv in MatMul eine dreifache Leistungssteigerung bringt
IOSurface-Protokoll
- Sämtliche Daten-Ein- und -Ausgaben erfolgen über IOSurface-Shared-Memory-Objekte
- derselbe Mechanismus wie beim Teilen von GPU-Texturen
- damit besteht die Möglichkeit, eine Zero-Copy-Pipeline GPU↔ANE aufzubauen
Struktur des Compiler-Caches
- Der ANE-Compiler cached E5-Binärdateien auf der Festplatte
- Pfad:
~/Library/Caches/.../com.apple.e5rt.e5bundlecache/.../H16G.bundle/
- erste Kompilierung 20–40 ms, bei Cache-Treffer sofortige Ausführung
- vorteilhaft für Inferenz, aber bei Training ist wegen geänderter Gewichte eine Neukompilierung nötig
Noch unerforschte Bereiche
- Noch nicht analysierte Klassen:
_ANEChainingRequest — möglicherweise zur Verknüpfung mehrerer Modelle in einem einzelnen Dispatch
_ANESharedEvents, _ANESharedSignalEvent, _ANESharedWaitEvent — Fences/Signale für GPU↔ANE-Synchronisation
_ANEPerformanceStats — möglicherweise Hardware-Leistungszähler
_ANEVirtualClient — möglicherweise Zugriff auf Multiprozess-Virtualisierung
- Noch unbestätigte Punkte:
- Mikroarchitektur und ISA der ANE-Kerne
- Art der Kernzuweisung für Operationen innerhalb eines Graphen
- Taktfrequenzen und SRAM-Struktur
Ausblick
- Teil 2: Skalierung der Matrixmultiplikation, SRAM-Engpässe, Leistungsvergleich von Conv und MatMul, Überprüfung von Apples „38 TOPS“-Angabe
- Teil 3: Training neuronaler Netze auf der ANE
- Der gesamte Code ist im Verzeichnis
ane/ auf github.com/maderix/ANE veröffentlicht
- Testumgebung: M4 Mac Mini, macOS 15.x
2 Kommentare
Hinweis: Asahi Linux out-of-tree ANE-Treiber
Hacker-News-Kommentare
Ich finde, der Autor hat wirklich hervorragende Arbeit geleistet, und ich freue mich schon auf Teil 3
Ich nutze hauptsächlich Python-ML-Bibliotheken wie lightgbm, sklearn, xgboost sowie numpy
Ich frage mich, ob solche Berechnungen auf Apple-Hardware beschleunigt werden und ob es eine einfache Möglichkeit gibt, das zu benchmarken
Die meisten Benchmarks bewegen sich auf Ebene von C-Funktionen, daher weiß ich nicht, ob sich das auch bei High-Level-Bibliotheken auswirkt
Ich musste lachen, als ChatGPT vorschlug, einen Intel Mac mit Apple Silicon zu vergleichen. Wahrscheinlich ist genau das einer der Gründe, warum die Leute AI immer noch nicht mögen
Der Grund ist, dass NPUs stark herstellerspezifisch sind, was die Unterstützung für Open-Source-Entwickler schwierig macht
Auch Apple ANE ist hier keine Ausnahme, und diese Untersuchung wirkt wie der Versuch, dieses Problem speziell für Apple ANE anzugehen
Laut dem Artikel Inside the M4 Apple Neural Engine erreicht sie 6,6 FLOPS/W und verbraucht im Leerlauf 0 W, weil sie dann vollständig abgeschaltet wird
Apple hat „38 TOPS INT8“ berechnet, indem FP16 19 TFLOPS × 2 angesetzt wurden, aber die tatsächliche Hardware führt INT8-Operationen nicht mit doppelter Geschwindigkeit aus
Diese Art der Berechnung wirkt für Apple ungewöhnlich übertrieben
LLMs können plausibel klingende Falschinformationen erzeugen, die selbst Experten täuschen
Ich bezweifle, dass alle Fakten manuell überprüft wurden. Insofern bin ich fast dankbar für die Vorwarnung, weil ich den Text dadurch gar nicht erst lesen muss
Solche merkwürdigen Benchmarks sieht man auch in diesem Artikel
Schon vor LLMs gab es in der Wissenschaft viele manipulierte Papers und nicht reproduzierbare Studien
Am Ende kann man solchen Analysen erst vertrauen, wenn mehr Engineers sie überprüft haben
Vieles hat mit dem eigentlichen Thema nichts zu tun
Vielleicht ist das einer der Gründe, warum Awni, der Leiter des MLX-Projekts, Apple verlassen hat
Aber es ist gut, dass dieser Artikel das noch tiefergehend bestätigt und erweitert
Wenn CoreML bei großen matmul-Operationen fast keinen Overhead hat, gibt es in lokalen AI-Frameworks viel Spielraum, ANE für Prefill zu nutzen
Die Decode-Phase ist allerdings durch die Speicherbandbreite begrenzt, und die Umwandlung von matmul in 1x1 convolution ist ineffizient, sodass der Vorteil nicht eindeutig ist
Es soll Core AI heißen und die Integration von Third-Party-LLMs in Apps erleichtern
Zugehöriger Artikel: Bloomberg-Newsletter
Trotzdem war er sehr informativ und interessant zu lesen
Das im Artikel erwähnte Github-Repository ist ebenfalls einen Blick wert
Das ist eindeutig eine Spur davon, dass dieser Teil von AI geschrieben wurde
Wichtiger als das Reverse Engineering des ANE ist, wie sehr Manjeet mit Hilfe von AI seine Engineering-Fähigkeiten erweitert hat
Genau jetzt erleben wir die Ära, in der AI die Produktivität von Entwicklern beschleunigt