AppleのNeural Engineを、いまさらM1世代までさかのぼって逆解析し直した、というのが今回の話です。しかも目的は「使えるようにする」ことではなく、内部構造そのものをできるだけ正確に地図化することにあります。作者は、Appleが最初にA11 BionicでNPU的なものをシリコンに焼き込んだころから、どんな前提で機械学習向けハードを設計していたのかを読み解こうとしています。背景にあるのは、CNN中心だった時代のNPUと、いまGPUで回っている transformer 系ワークロードのズレです。
元記事では、作者が3年前に止めていたApple Neural Engine(ANE)の逆解析を、M1を対象にやり直しています。理由は単純で、M5では「LLM performance」が売り文句になり、ANEのコアがGPU側に取り込まれたため、専用NPUの終わりが近いと感じたからです。そこで今回は、単に命令を動かす話ではなく、compute、datapath、scheduler、memory、execution model まで含めて、ANEの内部設計を追い直しています。
まずcomputeについて。ANEには16のcompute coreがあり、各コアは128本のFP16、もしくは256本のINT8のMAC laneを持ちます。MACは multiply-accumulate のことで、掛け算した結果を加算器で足し込んでいく処理です。作者は、ここだけ見ても「何向けのアクセラレータか」は分からないと指摘します。畳み込みでも attention でも、結局は dot product だからです。違いはMACそのものではなく、その前後でデータがどう流れるかにある。ANEがCNN時代に強かったのは、演算の種類ではなく、入力や中間結果をどこに置き、いつ再利用するかという前提がCNNに合っていたからだ、という見方です。
それを裏づけるように、作者は内部の数値の扱いも調べています。各MAC laneは、32-bit accumulator に部分和を溜め、最後にFP16として読み出します。実験では、1だけのベクトルで dot product を作り、加算がどこで飽和するかを確認しています。その結果、FP16の出力オーバーフローでは説明できず、アキュムレータ内部で (2^{15}) にクランプされていると分かりました。つまり、内部は符号付き32-bit固定小数点Q16.16のように振る舞っている、という読みです。
その次はactivationです。ANEはMACの結果をいったん外部メモリに戻さず、後段の activation block に直接渡します。ここで面白いのは、tanh を単なる数式としてではなく、33個のFP16値を並べた lookup table として実装している点です。mode 2 では 33-entry の piecewise-linear LUT が使われ、入力は (u=2^R|x|) にスケールされます。R=3なら刻みは (1/8) です。さらに、単一のスパイクを入れた LUT を使って測ると、出力が三角形状に変化し、隣接点間を線形補間していることが分かる、としています。ReLUや線形スケールとbiasの処理も、コンパイラ段階で畳み込まれ、MAC後の同じ経路にまとめられることが確認されています。
後半ではschedulerに話が移ります。ANEのドライバは、CONVやMATMULやRELUのような高級命令を直接ハードに送っていません。代わりに、すでにコンパイル済みの task descriptor(TD)をメモリに置き、TM_ADDR と TM_INFO でその場所とサイズを指定し、TM_PUSH を叩くと処理が始まります。ハード側が実行を引き受け、終わるとARM64に割り込みを返す仕組みです。作者はこれを、GPUの pushbuffer や command processor に近いと見ています。さらに TM_INFO には descriptor の総数が入り、固定長のディスクリプタを順に処理するハードウェアカウンタが見える、と解析しています。この記事はここで途切れますが、少なくともANEが「NN用の命令セット」を持つというより、固定化されたデータフローを高効率に流す機械だったことが、かなり具体的に示されています。
読んでまず感じたのは、この逆解析が懐古趣味ではなく、かなり冷静な設計批評になっていることです。作者はANEを持ち上げません。むしろ、最初から一般用途のアクセラレータには向いていなかった、とかなりはっきり言っています。これは重要で、NPUは「AIなら何でも速い箱」ではない、という当たり前を、ハードの内部から証明しようとしているからです。MACが2048本ある、という数字だけでは見えない制約が、実際にはデータ流れと再利用の前提に埋め込まれていたわけです。
ここで面白いのは、Appleが間違っていたという話ではない点です。2017年のA11 Bionicから考えれば、CNNを端末で回すにはかなり筋のいい設計だったはずです。問題は、その設計が「時代が変わってもそのまま伸びる」タイプではなかったことだと思います。transformer の decode は、再利用のパターンがCNNほど素直ではありません。しかもM5でANEのコアがGPUに溶け込んだのなら、Apple自身がその限界を見切り始めた、と読むのが自然ではないでしょうか。専用NPUの勝ち筋は、用途を広げることではなく、特定の型に極端に最適化することだった。そこが今、少しずつ効かなくなっている。
tanh を33個の値で表し、さらに補間までしている、という部分はかなり印象に残ります。派手さはありませんが、むしろここにANEの本性が出ています。ハード単体が賢いのではなく、コンパイラとハードが一体で「この範囲なら近似できる」と割り切っている。つまり、精密な汎用計算機ではなく、前提条件つきの高速な近似機械です。これはモバイル向けチップとしては合理的ですが、モデル側の変化には弱い。
しかも、作者は ReLU や bias までもコンパイル時に畳み込んでいます。ここから見えるのは、AppleのANEが「演算をそのまま実行する装置」ではなく、「実行前にできるだけ形を整えられたモデルだけを食べる装置」だということです。これはCore ML という土台と相性はいい一方で、研究用途や実験用途にはかなり窮屈です。逆に言えば、ANEを一般公開したとしても、用途が爆発的に増えるタイプではなかった、という作者の最初の判断は筋が通っていると思います。
M5で「LLM performance」が前面に出て、ANEコアがGPUに統合されたというくだりは、単なる製品話以上の意味があります。CNN時代のNPUは、入力画像のように局所性が高く、再利用の形が読みやすい処理に強かった。でも今の主役は transformer で、しかも生成の後半、つまり decode が効いてくる。ここでは「同じ計算を大量に並べる」だけでは足りず、メモリ帯域やスケジューリング、ワークロードの揺れ方まで含めて見ないと性能が出ません。だからGPUに寄っていくのは自然です。
私は、ANEのような専用NPUはなくなるというより、主張の仕方を変えていくのだと思います。端末内の小さなモデル推論、カメラ処理、音声、画像の前処理のように、形の決まった仕事に閉じるなら、専用ブロックはまだ強い。ただ、LLMの中心がそこに移ると、固定化されたデータフローの価値は下がる。AppleがコアをGPU側へ寄せたのは、その現実を先に受け入れた動きに見えます。逆解析の記事なのに、結局は「ハードは流行より長生きしない」という、少し寂しい結論が浮かび上がってきました。
この文章の価値は、ANEの仕様を並べたこと以上に、どの設計判断が何年後に効いて、何年後に足を引っ張るかを見せているところにあります。16コア、2048 MAC lane、33点のLUT、固定長ディスクリプタ。どれも賢く見えますが、同時に「その時代のモデル」を前提にした数値でもある。ハードウェアは書き換えられないので、前提が外れた瞬間に、強みがそのまま制約に変わるんですね。
だからこの記事は、AppleのANEを暴いた研究ノートであると同時に、これからのAIチップをどう見るべきかのヒントでもあります。スペック表だけでは分からない。命令セットだけでも足りない。実際には、入力がどう流れて、どこで固定化され、どの段階で柔らかさを捨てたのかを見ないと、そのアクセラレータが何年持つかは分からない。作者が3年越しに戻ってきて掘り直した意味は、まさにそこにあると思います。
参考: Retrospectively Reverse-Engineering Apple's Neural Engine | Eileen Yoon