4 pontos por GN⁺ 2026-03-03 | 2 comentários | Compartilhar no WhatsApp
  • 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

 
GN⁺ 2026-03-03
Comentários no Hacker News
  • Trabalhei por vários anos na equipe do Xcode. Conheço bem o jeito da Apple de tornar esse tipo de coisa intencionalmente difícil
    Acho que o autor fez um trabalho realmente excelente e já estou esperando a parte 3
    • Antigamente era possível separar o console do Xcode em uma janela própria, e fico curioso sobre por que removeram esse recurso
  • Não entendo quando o Neural Engine entra em ação em software open source
    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
    • Na maior parte do open source, a NPU quase não é utilizada
      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
  • A parte 2 inclui benchmarks
    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
    • Mas o número de 38 TOPS que a Apple divulga é diferente da realidade
      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
  • No texto, “nós” seria uma colaboração entre maderix (a pessoa) e Claude Opus 4.6 (Anthropic), mas sinceramente é difícil acreditar
    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 Claude tende a esconder benchmarks para que o usuário veja apenas resultados bons
      O texto também mostra alguns benchmarks estranhos desse tipo
    • Humanos também escrevem pesquisas falsas convincentes há muito tempo
      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
  • Eu também cometo esse tipo de erro, mas parece que a maioria dos comentários está desviando para “qualquer coisa relacionada à Apple”
    Tem muita conversa sem relação com o tema
  • É surpreendente que o código-fonte do ANE seja fechado até para a equipe do MLX
    Talvez esse tenha sido um dos motivos para Awni, líder do projeto MLX, ter saído da Apple
  • O básico já era conhecido por meio da documentação do Asahi Linux sobre o ANE do M1/M2
    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
  • Segundo notícias recentes, a Apple está preparando um novo framework para substituir o Core ML
    O nome seria Core AI, e ele deve facilitar a integração de LLMs de terceiros em apps
    Artigo relacionado: newsletter da Bloomberg
  • Este texto claramente foi escrito por uma pessoa, mas em algumas frases aparece um jeito de escrever típico de LLM
    Mesmo assim, achei a leitura muito útil e interessante
    Também vale consultar o repositório no Github citado no texto
    • Daqui a cerca de um ano, acho que vai surgir um fenômeno em que, com as pessoas interagindo com LLMs todos os dias, o estilo da IA vai se infiltrar na linguagem humana
    • Se olhar a seção ‘Prior Art’, há muitos verbos repetitivos desnecessários como “documenting” e “providing insight into”
      Essa parte com certeza tem sinais de ter sido escrita por IA
  • O presente do engenheiro de software já está em nível de futuro
    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