MATLAB ユーザーコミュニティー

MATLAB & Simulink ユーザーコミュニティー向け日本語ブログ

Apple Accelerate を使用して Apple Silicon 上の MATLAB をさらに高速化

※この投稿は 2023 年 12 月 13 日に The MATLAB Blog へ 投稿されたものの抄訳です。


行列同士の乗算:3.7 倍、LU 分解:2 倍、コレスキー分解:1.7 倍、そして線形代数が絡むその他の場面でのさらなる高速化の可能性。これらすべてが、今すぐ Apple Silicon マシンで実現できるとしたら興味がありますか?続きをお読みください。

すべては BLAS から

もしかしたら聞いたことのない名前かもしれませんが、BLAS (Basic Linear Algebra Subprograms) は最も重要なライブラリです。2 つの行列を掛け合わせたり、ベクトルにスカラーを掛けるといった処理をします。とても単純な操作なので、MATLAB のようなソフトウェアがそれらを実行するためにライブラリを使用するとは思わないかもしれません。
MATLAB が BLAS を使用する理由は実行速度です!上で挙げたような行列演算を実装することは、速度を気にしなければ比較的簡単ですが、現代のハードウェアを最大限に活用するような方法で実装することは決して簡単ではありません。ざっくり書かれた行列同士の乗算ルーチンと最適化されたものでは、速度差に何千倍もの違いがでることもあります。

線形代数は現代の技術計算の中心に位置しているため、Intel、AMD、Apple などのチップメーカーは、ハードウェア上で線形代数を行う際にできる限り高速に処理したいと考えています。なのでそれぞれのCPU の特性を完璧に引き出すように精巧にチューニングされた BLAS ライブラリの独自実装を持っています。

もちろん、ブログの常連読者にとってはこれらは何も新しいことではありません。私は BLAS、そしてその兄弟である LAPACK に少し執着心をもっており、Trying out AMD’s AOCL や Apple Silicon の MATLAB ベータ版に関する投稿(これこれ)などの記事で何度も取り上げられてきました。これらの記事では、特に Apple Silicon に対する MATLAB の BLAS サポートが最近どのように進化してきたかを解説しました。

Apple Silicon の MATLAB で Apple Accelerate を BLAS として使用できるようになりました

Apple Silicon 向けの最初の正式リリースである MATLAB R2023b は OpenBLAS を使用しており、6 月に報告したように、パフォーマンスはかなり良いです。ただユーザーから「なんで Apple の BLAS 実装が含まれている Apple Accelerate を使用しないの?」とのコメントを頂いていました。それなりの理由がありました(この記事の該当セクションを参照)が、状況は変わり利用できるアップデート版をリリースしました。しかし、、ほとんどの人が見逃しているかも・・ということでここで改めてお知らせします!

まず R2023b Update 4 以降が必要です。そもそも R2023b より前のものは Apple Silicon 上でネイティブ対応してません。R2023b をインストールしましたら、version コマンドでどの Update 版かを確認してください。

version
ans =
‘23.2.0.2428915 (R2023b) Update 4’
Update 3 以前の場合は Help->Check for Updates からアップデートしてください。
それが完了したら、OpenBLAS から Apple Accelerate への切り替え方法は、「How can I use the BLAS implementations included in Apple Accelerate Framework with MATLAB R2023b Update 4」を参照してください。

パフォーマンスの話

言うまでもなく、線形代数演算に注目しなければ・・この変更によってパフォーマンスの違いは見られないかもしれません。しかし、これは MATLAB の話なので、きっと多くの線形代数演算を含む関数で恩恵があるでしょう。

このページのベンチマークを自分で試されたい場合、私が使用したスクリプトは GitHub にあります。

行列同士の乗算

行列同士の乗算で最も大きい速度の向上がみられました。これは Apple によって BLAS がかなり最適化されていることを示します。

Matrix Size
OpenBLAS time (s)
Apple Accelerate time (s)
x Speed-up
1,000
0.0172
0.0046
3.74
5,000
1.1583
0.4171
2.78
10,000
6.8977
3.3186
2.08

LU 分解

LU 分解は LAPACK の処理であり、今回は LAPACK ライブラリを変更していません。しかし、LAPACK は BLAS を利用するので、BLAS を高速化すれば、LAPACK も当然高速になります。

Matrix Size
OpenBLAS time (s)
Apple Accelerate time (s)
x Speed-up
1,000
0.0124
0.0115
1.08
5,000
0.4345
0.2556
1.7
10,000
3.5928
1.6821
2.14
Cholesky 分解も試しましたが、1.28 倍から 1.77 倍の速度アップがみられました。

固有値

固有値計算のテストには、eig の単一出力バージョンを使用しました。e = eig(A) です。他のテストと同様に、ランダムな行列を試しました。小さい行列ではうまくいき、速度向上が見られましたが、大きな行列では、OpenBLAS のオリジナルと比較して、私の M2 マシンではかなりの遅延が見られました。

このことについて M1 を持っている同僚と議論しましたが、彼の環境では遅延は見られず、eig に Apple Accelerate を使用する方が常に速い。これは M2 固有の問題であると考えられるので、何が起こっているのかをより詳しく調査する予定です。

Matrix Size
OpenBLAS time (s)
Apple Accelerate time (s)
x Speed-up
1,000
0.4245
0.2407
1.76
5,000
22.8654
24.74
0.92
10,000
145.4076
201.57
0.72

テスト環境の詳細

今回電源に接続された状態の M2 ベースの MacBook Pro を使用しました。File Exchangeで入手可能な cpuinfo コマンドの出力は以下の通りです。

cpuinfo
ans =
structwith fields:
CPUName: ‘Apple M2 Pro’
Clock: ‘N/A’
Cache: 65536
TotalMemory: 1.7180e+10
NumCPUs: 1
TotalCores: 10
OSType: ‘macOS’
OSVersion: ‘13.3.1’
eig に関する問題はいずれ解決されることを願っていますが、Apple Accelerate に切り替えることは非常に有益なようです。Apple Silicon Mac をお持ちの場合は、試してみて、どのような結果が出たか教えてください。

|
  • print

コメント

コメントを残すには、ここ をクリックして MathWorks アカウントにサインインするか新しい MathWorks アカウントを作成します。