Apple Neural Engine in M1 SoC Shows Incredible Performance in Prediction

> 引用：これは、2021年1月7日に[Mediumに投稿した自分の記事](https://medium.com/macoclock/apple-neural-engine-in-m1-soc-shows-incredible-performance-in-core-ml-prediction-918de9f2ad4c)を日本語に戻し、要約したものです。Mediumの原文より一部を省いてあります。

![078208BD-8DBB-4FEF-9F57-3247E8AE6D59.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769547/640fa930-ad29-7294-e73c-5b6f9d92ab8c.jpeg)


##イントロダクション
Apple社のM1 SoCに関して、すでに多くのベンチマーク記事が出ている。それらの結果は、M1 SoCがCPUとしてだけではなく、GPUやNeural processorとしてもポテンシャルを持っていることを示している。

2020年12月の第二週に、新しいM1 MacBook Airがデスクに届いた。この新入りを迎え入れる前に、こいつのパフォーマンスを私の研究内容「CT画像のセマンティックセグメンテーション」を使って試してみたので報告する。


##マシンと方法
以下のPCとパフォーマンス比較を行った。

- MacBook Pro 15インチ、GPU: AMD Radeon Pro 560
- Hewlett-Packard ワークステーション、GPU: nVidia Titan RTX

MacBook Pro 15インチは2017年製のもので、クアッドコアのIntel Core i7とAMD Radeon Pro 560 (4 GB VRAM)を搭載している。私のメインマシンで、これを使って書類仕事から医療画像解析、Xcodeプログラミング、ディープラーニング用の大量のデータ作成、動画編集、家族のことなどをしている。２つめのWindows PCは2011年製のヒューレットパッカードのワークステーションだ。システム自体は古いが、nVidia社のTitan RTX (24 GB VRAM)を入れて、ディープラーニング用に強化している。以下の表にそれぞれのスペックを記載した。

> **Apple Neural Engine, ANE**
> ここで強調すべきは、M1チップはこれまでのMacにはない**Apple Neural Engine**という新しいユニットを内蔵していることだ。ANEについては開発者用の文書にもネット上にもあまり情報はない。Hollance氏が[自身のGithub](https://github.com/hollance/neural-engine)で貴重な情報や考察を公開しているので、興味ある方はどうぞ。

![Table 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769547/feb915cb-2956-8f31-baea-5851bc267ebb.png)

学習済みのニューラルネットワークで推論を実行するために、それぞれのプラットフォームで以下のソフトウェアを使った。

- macOS: **A.I.Segmentation version 3.2.0** - [OsiriX](https://www.osirix-viewer.com/) というDICOMビューアー上で動く[自家製のプラグイン](https://compositecreatures.jimdofree.com/a-i-segmentation/)。セマンティックセグメンテーションの処理は**Apple Core ML framework**を呼び出している。
- Windows: **Keras version 2.2.4** - 言わずと知れたライブラリ。バックエンドはGPU用の**TensorFlow 1.15.0**で、**nVidia CUDA 10.1** + **cuDNN 7.6.0**を入れている。

以下の表のKerasモデル（BENCHMARK.h5）はこのテスト用に作ったもので、U-net と類似の構造を持ち、大動脈のセグメンテーションをするように90,000枚以上のCT画像を学習させた。このKerasモデルを、Appleの[coremltools](https://github.com/apple/coremltools)を使ってmacOSのCore MLフォーマット（BENCHMARK.mlmodel）に変換し、A.I.Segmentationプラグインでセグメンテーションを行った。

> ニューラルネットワーク中にカスタムレイヤーがあるとANEで処理が実行されないという情報があったため、これらのBENCHMARK.h5/.mlmodelではカスタムレイヤーは使わず、Core MLで実装されているレイヤーのみを使っている。

![Table 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769547/9bfddcc7-8a90-93d4-8433-b8ba4d467170.png)

![Table 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769547/0f43f635-b25c-7be2-61d1-99f282e40eb7.png)

計算負荷としてCT画像200枚のセマンティックセグメンテーションを行い、推論に要した処理時間を計測した。A.I.Segmentationプラグインには計測用のコードをあらかじめ入れてある。Windows PCでは、推論実行にKerasのpredict(...)を使っているが、Modelクラスをオーバーライドして計測コードを入れた。

> 以下の動画は、A.I.SegmentationプラグインがOsiriXビューアー上で、画像スライスを順番に読み込みながら、大動脈のセグメンテーションの結果をウインドウに表示しているところである。

https://youtu.be/KUy8EOnRXzc


##結果
メインマシンのMacBook Pro 15インチは健闘したほうだろう。アクティビティ.appを立ち上げて観察すると、処理中にはRadeon GPUがほぼフルスピードで稼働している。

ANEが働いていないCPU+GPUのモードでは、M1 MacBook Airに数秒遅れるのみで、M1の7.182秒に対してCore i7 + Radeonでは8.810秒であった。これは約20%の遅れであるが、それらの製造年の３年という間隔を考えれば納得いく差だ。

しかし、M1 SoCでの処理をCPU+GPU+ANEに変えた途端、比較レンジを「パーセント」から「倍」に広げる必要があった。Core i7 + Radeonでは8.814秒と先ほどとほとんど変わらないのに対し、M1は1.987秒しかかからなかったからだ。M1は、各画像スライスのセグメンテーションを、まるで画像ビューをスクロールするかのように非常に高速に完了した。

さらに驚くべきことに、このテストではM1がnVidia Titan RTXに勝ってしまった...。A.I.Segmentationは、objective Cを使ってmacOSとCore MLに高度に最適化されている一方で、KerasはMinicondaのPythonで動作するためプログラミング上のオーバーヘッドがあるのではないかと考える。しかし、コンシューマー用としてnVidia Titan RTX以上の環境があるかというと、たぶんない（注：この時点で）。

![A9B1AA05-81CE-4A75-98C3-88B5CDBF6B54.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769547/f0ec856d-2bf9-42d4-3a14-a2954ffcfbba.jpeg)

![20674E08-D640-4EF4-B61D-45E7974CBA71.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769547/ed348115-8212-fa5d-10f4-133af24b2fba.jpeg)


##結論
私が実際に使用している環境で言えることは、M1チップを搭載したApple MacBook Airは、AMD Radeon Pro 560を搭載したMacBook Pro 15インチに比べて4.4倍、nVidia Titan RTXを搭載したWindows PCに比べて2.5倍の速度で、200枚のCT画像のセマンティック・セグメンテーションを行うことができるということ。

繰り返すが、これは私の日常的な問題における実践的な作業に基づいたベンチマークテストであり、GeekbenchやCinebenchなどのベンチマークアプリでの純粋なベンチマークテストではない。特にmacOS機とWindows機の間ではさまざまな条件が違う。しかし、AppleのCore MLとnVidiaのCUDAライブラリが、それぞれ自社製品であるM1 SoCとTitan RTXに最適化されていると仮定すると、今回の結果はその性能の一面を表している。それは、チップの中でトランジスタがどのように動作しているかではなく、私たちユーザーがコンピュータのインターフェイスを通じて、見て、触れて、感じて、体験するという側面だ。そういう意味で、Appleはすばらしいユーザー体験を提供する最も洗練された企業のひとつと言える。

最後に、新しく来たM1 MacBook Airにようこそと言おう！


##更新　[2021年1月16日]
- スライス数を増やした第2試合では、nVidia Titan RTXが逆転し、Apple M1が善戦 -

![12FB6F06-84C0-4DBD-A60C-365D263771BE.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769547/2c2d4ffe-4e74-8164-db58-0595b4c94217.jpeg)

![095DDFA4-B936-4776-B54A-FB021182B3CB.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769547/24791c2b-c620-e33f-6218-658f9beb33cf.jpeg)

最初から3つ目のテーブル「Computation Load」のスライス数を200から1,000、2,000、...、5,000に拡張してみた。Titan RTXは長い連続したデータが得意なのではないかと推測したからだ。

その結果、データ数が多いほどTitan RTXは一枚あたりで速くなるが、M1はほぼ一定であることがわかる。グラフの線は2,000枚の直前で交差した。

これは私見だか、Titan RTXは数千～数万枚の画像などの巨大なデータセットを用いた深層学習のための素晴らしい（RTX 3090以前はほぼ最高の）GPUだ。一方、Apple M1はモバイルノートPC向けのSoCで、膨大なデータセットでの深層学習よりも、小さなデータでの高速な推論が優先されたのだろう。

この追加の結果はこれらの特徴を表している。しかしチップのスピード勝負はこれからも続き、アップルが次のM1X（？）を搭載した新しいMacBook Pro 14/16インチを発売したときには、スコアが再び逆転するかもしれない。