- Análise direta da estrutura interna do Apple Neural Engine (ANE) para implementar uma forma de contornar o CoreML e acessar o hardware diretamente
- Remoção da camada de abstração do CoreML e execução direta de compilação, carregamento e execução de modelos via API
_ANEClient
- Análise de MIL (Machine Learning Intermediate Language) e do formato binário E5, confirmando que o ANE é um motor de execução de grafos baseado em primitivas de operação fixas
- Com memória compartilhada IOSurface, foi demonstrada a possibilidade de transferência de dados zero-copy entre GPU↔ANE
- Esta pesquisa é a primeira de uma trilogia que explora a medição de desempenho real e a possibilidade de treinamento no ANE do M4, sendo significativa como o primeiro caso de controle direto sobre hardware privado da Apple
Abordagem de engenharia reversa com colaboração entre humanos e IA
- A pesquisa foi conduzida em colaboração entre um pesquisador humano e o Claude Opus 4.6 da Anthropic
- O humano definiu a direção da exploração, e a IA realizou a análise de dados e a escrita de código
- O objetivo partiu da pergunta: “é possível treinar modelos diretamente sobre o Apple Neural Engine?”
- A Apple não divulga a ISA, a estrutura interna nem a interface de programação direta do ANE
- O acesso é possível apenas via CoreML, o que dificulta entender o funcionamento do hardware
- Por isso, o estudo rastreou toda a pilha de software, do CoreML até o driver de kernel do IOKit, garantindo um caminho de código para controlar o ANE diretamente
Estrutura do Neural Engine
- O ANE tem a forma de um motor de execução de grafos (graph execution engine), e não de uma GPU ou CPU
- Ele executa todo o grafo de rede neural compilado como uma única operação atômica
- O ANE do chip M4 (codinome H16G) conta com 16 núcleos, profundidade de fila de 127 requisições, controle DVFS independente e desligamento de energia para 0 mW quando ocioso
- A Apple introduziu o primeiro ANE de 2 núcleos no A11 (2017) e vem expandindo a arquitetura a cada geração
Diferenças em relação a trabalhos anteriores
- Materiais públicos existentes:
- Documentação sobre o funcionamento e análise de desempenho do ANE por Matthijs Hollemans
- Exemplos iniciais de engenharia reversa do mdaiter/ane
- Driver Linux com engenharia reversa do Asahi Linux
- Código oficial de otimização para transformers do apple/ml-ane-transformers
- Contribuições originais desta pesquisa:
- Sucesso no acesso direto à API
_ANEClient sem CoreML
- Decodificação do caminho de compilação em memória do MIL
- Medição do throughput real após remover o overhead do CoreML
- Execução de treinamento de modelos em hardware dedicado a inferência
Metodologia de análise
- Exploração de classes: extração da lista de classes internas do
AppleNeuralEngine.framework com o comando dyld_info -objc
- Method swizzling: interceptação de chamadas do CoreML para identificar o caminho de chamadas dos frameworks privados
- Análise binária: decodificação de bundles E5 compilados para entender o formato do programa
- Análise de escalabilidade: inferência da topologia de hardware variando tamanho de matrizes, profundidade do grafo e número de canais
- Como resultado, foram encontradas mais de 40 classes privadas, incluindo
_ANEClient, _ANEModel, _ANERequest, _ANEIOSurfaceObject e _ANEInMemoryModel
Contornando o CoreML: acesso direto a _ANEClient
- Com
_ANEClient, é possível controlar diretamente todo o pipeline de compilar → carregar → avaliar modelos
- O CoreML é apenas uma camada de conveniência que encapsula esse processo
- O ANE suporta até 127 requisições de avaliação simultâneas (queue depth), sendo otimizado para inferência em streaming de alto throughput
- Com buffers de E/S baseados em IOSurface, é possível fazer transferência por memória compartilhada entre GPU e ANE
MIL: linguagem de entrada do ANE
- O CoreML usa MIL (Machine Learning Intermediate Language) em vez de ONNX ou protobuf
- Baseado em SSA (atribuição estática única), com tipos e formas explícitos
- No código de exemplo, a operação
matmul é expressa claramente
- O layout de tensor segue o formato NCDHW + Interleave, com estrutura
[Batch, Channels, Depth, Height, Width]
Formato binário E5
- Programas MIL são compilados em binários FlatBuffer E5
- Multiplicação de matrizes 1024×1024: 2.688 bytes, multiplicação de matrizes 128×128: 2.680 bytes
- O tamanho do código é quase idêntico → contém apenas informações de configuração parametrizadas, e não o algoritmo de operação matricial em si
- Isso indica que o ANE executa grafos combinando primitivas de operação fixas (Conv, MatMul, Elementwise etc.)
Caminho de compilação em memória
- Com
_ANEInMemoryModelDescriptor, é possível compilar MIL em memória sem acesso a disco
- Principais problemas e soluções:
milText requer NSData (bytes UTF-8), não NSString
weights deve estar no formato de dicionário de mapeamento nome–dados
- Internamente, é necessário acesso a um diretório temporário → é indispensável ter permissão de escrita
- Foi encontrado um erro de digitação
Desctiptor no código interno da Apple
Perfil de hardware
- Pela análise do IOKit, o ANE possui canais independentes de gerenciamento de energia e clock (DVFS)
- Existem vários gatilhos de hardware/software, como
ANE_ADCLK_TRIG e ANE_PPT_TRIG
- Entre as operações suportadas identificadas no ANECompiler.framework, Conv é a principal primitiva de operação
- Na Parte 2, será mostrado que converter Conv 1×1 em MatMul traz ganho de desempenho de 3x
Protocolo IOSurface
- Toda a entrada e saída de dados é feita por meio de objetos de memória compartilhada IOSurface
- O mecanismo é o mesmo usado no compartilhamento de texturas da GPU
- Há potencial para montar um pipeline zero-copy entre GPU↔ANE
Estrutura do cache de compilação
- O compilador do ANE armazena binários E5 em cache no disco
- Caminho:
~/Library/Caches/.../com.apple.e5rt.e5bundlecache/.../H16G.bundle/
- A primeira compilação leva de 20 a 40 ms, e com cache hit a execução é imediata
- Isso favorece a inferência, mas no treinamento é preciso recompilar quando os pesos mudam
Áreas ainda não exploradas
- Classes ainda não analisadas:
_ANEChainingRequest — possibilidade de encadear vários modelos em um único dispatch
_ANESharedEvents, _ANESharedSignalEvent, _ANESharedWaitEvent — fences/sinais para sincronização GPU↔ANE
_ANEPerformanceStats — possível acesso a contadores de desempenho de hardware
_ANEVirtualClient — possível caminho para virtualização multiprocesso
- Itens ainda não confirmados:
- A microarquitetura dos núcleos do ANE e sua ISA
- O modo como as operações do grafo são distribuídas entre os núcleos
- Frequência de clock e estrutura de SRAM
Próximos passos
- Parte 2: escalabilidade da multiplicação de matrizes, gargalos de SRAM, comparação de desempenho entre Conv e MatMul, verificação do número “38 TOPS” da Apple
- Parte 3: treinamento de redes neurais no ANE
- Todo o código está disponível no diretório
ane/ de github.com/maderix/ANE
- Ambiente de teste: M4 Mac Mini, macOS 15.x
2 comentários
Referência: driver ANE out-of-tree do Asahi Linux
Comentários no Hacker News
Acho que o autor fez um trabalho realmente excelente e já estou esperando a parte 3
Eu uso principalmente bibliotecas de ML em Python como lightgbm, sklearn, xgboost e numpy
Fico curioso se essas operações são aceleradas no hardware da Apple e se existe uma forma simples de fazer benchmark disso
A maioria dos benchmarks fica no nível de funções em C, então não sei se isso faz efeito em bibliotecas de alto nível
Achei engraçado quando o ChatGPT mandou comparar um Intel Mac com Apple Silicon. Acho que é por isso que as pessoas ainda odeiam IA
Isso acontece porque as NPUs são muito específicas de cada fabricante, então é difícil para desenvolvedores open source darem suporte
O ANE da Apple não é exceção, e esta pesquisa parece ser uma tentativa de resolver esse problema especificamente para o ANE da Apple
Segundo o texto Inside the M4 Apple Neural Engine, ele entrega 6,6 FLOPS/W e, quando não está em uso, desliga completamente e consome 0W
A Apple calculou “38 TOPS INT8” como FP16 19 TFLOPS × 2, mas o hardware real não executa operações INT8 ao dobro da velocidade
Seguir essa forma de cálculo parece uma exageração pouco característica da Apple
LLMs conseguem produzir informações falsas plausíveis o suficiente para enganar até especialistas
Fico em dúvida se todos os fatos foram verificados manualmente. Nesse sentido, até agradeço pelo aviso prévio, porque assim nem preciso ler
O texto também mostra alguns benchmarks estranhos desse tipo
Mesmo antes dos LLMs, a academia já tinha muitos artigos manipulados e estudos irreproduzíveis
No fim, esse tipo de análise só se torna confiável quando mais engenheiros a verificam
Tem muita conversa sem relação com o tema
Talvez esse tenha sido um dos motivos para Awni, líder do projeto MLX, ter saído da Apple
Mas é bom ver que este texto confirmou e expandiu esse conteúdo em mais profundidade
Como o CoreML aparentemente quase não tem overhead em operações grandes de matmul, há bastante espaço para frameworks locais de IA usarem o ANE no prefill
Já a etapa de decode é limitada pela largura de banda de memória, e o processo de transformar matmul em convolução 1x1 é ineficiente, então o ganho não é tão claro
O nome seria Core AI, e ele deve facilitar a integração de LLMs de terceiros em apps
Artigo relacionado: newsletter da Bloomberg
Mesmo assim, achei a leitura muito útil e interessante
Também vale consultar o repositório no Github citado no texto
Essa parte com certeza tem sinais de ter sido escrita por IA
Mais importante do que a engenharia reversa do ANE é até que ponto Manjeet ampliou sua própria capacidade de engenharia com ajuda de IA
Este já é o momento em que a IA está acelerando a produtividade de desenvolvedores