4 Punkte von GN⁺ 2026-03-03 | 2 Kommentare | Auf WhatsApp teilen
  • 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

 
GN⁺ 2026-03-03
Hacker-News-Kommentare
  • Ich habe mehrere Jahre im Xcode-Team gearbeitet. Ich weiß gut, wie Apple solche Dinge absichtlich schwer zugänglich macht
    Ich finde, der Autor hat wirklich hervorragende Arbeit geleistet, und ich freue mich schon auf Teil 3
    • Früher konnte man die Xcode-Konsole in ein separates Fenster auslagern; ich frage mich, warum diese Funktion entfernt wurde
  • Ich verstehe nicht, wann die Neural Engine in Open-Source-Software überhaupt aktiv wird
    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
    • In den meisten Open-Source-Projekten wird die NPU kaum genutzt
      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
  • Teil 2 enthält Benchmarks
    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
    • Die von Apple behaupteten 38 TOPS entsprechen jedoch nicht der Realität
      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
  • Im Artikel heißt es, dass „wir“ eine Zusammenarbeit von maderix (Mensch) und Claude Opus 4.6 (Anthropic) seien, aber ehrlich gesagt fällt es mir schwer, das zu glauben
    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
    • Claude neigt dazu, Benchmarks so zu verstecken, dass der Nutzer nur gute Ergebnisse sieht
      Solche merkwürdigen Benchmarks sieht man auch in diesem Artikel
    • Auch Menschen haben schon immer plausibel klingende falsche Forschung geschrieben
      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
  • Ich mache solche Fehler auch, aber die meisten Kommentare scheinen in Richtung „irgendwas über Apple“ abzudriften
    Vieles hat mit dem eigentlichen Thema nichts zu tun
  • Es überrascht mich, dass der Quellcode von ANE selbst für das MLX-Team nicht offenliegt
    Vielleicht ist das einer der Gründe, warum Awni, der Leiter des MLX-Projekts, Apple verlassen hat
  • Über die Asahi-Linux-Dokumentation zu M1/M2 ANE waren die Grundlagen bereits bekannt
    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
  • Neueren Berichten zufolge bereitet Apple ein neues Framework als Ersatz für Core ML vor
    Es soll Core AI heißen und die Integration von Third-Party-LLMs in Apps erleichtern
    Zugehöriger Artikel: Bloomberg-Newsletter
  • Dieser Artikel wurde eindeutig von einem Menschen geschrieben, aber in einigen Sätzen erkennt man typische LLM-Formulierungen
    Trotzdem war er sehr informativ und interessant zu lesen
    Das im Artikel erwähnte Github-Repository ist ebenfalls einen Blick wert
    • In etwa einem Jahr könnte es so weit sein, dass durch die tägliche Interaktion mit LLMs der Stil von AI in die menschliche Sprache einsickert
    • Im Abschnitt „Prior Art“ gibt es viele unnötig wiederholte Verben wie „documenting“ oder „providing insight into“
      Das ist eindeutig eine Spur davon, dass dieser Teil von AI geschrieben wurde
  • Die Gegenwart von Software-Engineers ist bereits Zukunftsniveau
    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