M2チップの発熱による性能低下の対策を検討しました。
M2 チップの動作条件
M2チップは、他のプロセッサ同様、負荷が大きくなると表面温度も上昇するため、熱による損傷からチップを保護するために、動作クロックを落とします。これをサーマルスロットリングと言います。
M2は、サーマルスロットリングの閾値を105°に設定してあります。
CPU使用率が100%になるような高い負荷のかかる処理を実行した場合、ピーク周波数で実行できるのは2分程度です。
チップの温度センサーが105°の閾値を超えた温度を検知し、サーマルスロットリングが働きます。このとき、チップの動作周波数は、3.5GHz->1.8GHzにフォールバックします。その後、温度が下がり、閾値を超えない程度の動作クロックで動作を続けます。
M2の四つの高効率コアのフォールバックする動作周波数は、以下のようになっています。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
3504MHz | 3408MHz | 3324MHz | 3204MHz | 3096MHz | 2988MHz | 2868MHz | 2724MHz | 2568MHz |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | |
2400MHz | 2208MHz | 1968MHz | 1704MHz | 1452MHz | 1188MHz | 924MHz | 660MHz |
通常のモバイル環境での使用は、消費電力を抑えるために低い周波数で動作します。
高負荷時の問題
高負荷処理の例として、モンテカルロシミュレーションを行い、サンプラー(NUTS)を動かします。
以下のように、NUTS実行時にPythonのプロセスをCPUコア数分起動します。CPU使用率は100%になります。
上のモニタ表示ではPythonのプロセスが四つ動いていますが、MCMCのライブラリがバックエンドの処理でプロセス当たり8個のスレッドを生成し、M2の8コアに各スレッドを割り当てています。
Rのパラレルライブラリ(paralell)で並列処理のプログラムを組んで、データ処理に使った場合は、以下のようにM2の8コアすべてにプロセスを割り当てます。Rのparalellライブラリはコア数分、プロセスをforkします。UNIX系のfork()を使っているため、Windowsでは働きません。
以下の表示はサンプラー実行時のものです。サンプラー開始後数十時間後に、フロントエンドのブラウザとの通信ができていないの状態になり、仕方なくリセットしました。
ブラウザがリロードしてプログレスバーが進んでいません。
問題は二点ありました。一つは高負荷時のブラウザの動作、もう一つはサーマルスロットリングのために処理が高い負荷状態が長時間続くことです。
- 高負荷時のブラウザの動作
- サーマルスロットリング
【高負荷時のブラウザ】
safari 「問題が起きたため、Webページが再読み込みされました」
CPUの負荷が重い状態で、他の処理、例えば、mds_storeプロセスが重なった時に、ブラウザ(safari)に問題が起きてページをリロードします。
ここでは、中断せずにNUTSを終了させたいので、上記問題を避けるため、一旦、safariの使用を中止し、JupyterのフロントエンドにChromeを使います。
Safariの問題は別途調査し、ここではサーマルスロットリングにフォーカスします。
上記アクティビティモニタに表示されているように、大量のデータをRで並列処理する場合も、NUTSを動かす時と同様に、CPU使用率は100%になります。CPU使用率が高くなると発熱のためサーマルスロットリングが働いてピーク性能で動くのは2分程度です。
【サーマルスロットリング】
高負荷時、処理の進捗が、開始時に比べて遅くなります。ここではサーマルスロットリングの対策をして、ピーク性能の動作時間を伸ばす処置を行います。
ツール
メニューバーに温度を表示し、プルダウンメニューでグラフを表示します。動作チェック用に、使用しました。
ソースコードは以下のGitに公開されてあります。
https://github.com/macmade/Hot
最新バージョンは、1.9.1です。インストール後に更新してください。
出力は以下のようになります。
$ sudo /usr/bin/powermetrics -s cpu_power -n 1
Machine model: Mac14,2
OS version: 22F82
Boot arguments:
Boot time: Thu Jul 6 19:02:56 2023
*** Sampled system activity (Fri Jul 7 07:17:07 2023 +0900) (5003.61ms elapsed) ***
**** Processor usage ****
E-Cluster HW active frequency: 2423 MHz
E-Cluster HW active residency: 100.00% (600 MHz: 0% 912 MHz: .04% 1284 MHz: .02% 1752 MHz: .01% 2004 MHz: 0% 2256 MHz: 0% 2424 MHz: 100%)
E-Cluster idle residency: 0.00%
E-Cluster instructions retired: 0
E-Cluster instructions per clock: 0
CPU 0 frequency: 2423 MHz
CPU 0 idle residency: 0.00%
CPU 0 active residency: 100.00% (600 MHz: 0% 912 MHz: .04% 1284 MHz: .02% 1752 MHz: .01% 2004 MHz: 0% 2256 MHz: 0% 2424 MHz: 100%)
CPU 1 frequency: 2423 MHz
CPU 1 idle residency: 0.00%
CPU 1 active residency: 100.00% (600 MHz: 0% 912 MHz: .04% 1284 MHz: .02% 1752 MHz: .01% 2004 MHz: 0% 2256 MHz: 0% 2424 MHz: 100%)
CPU 2 frequency: 2423 MHz
CPU 2 idle residency: 0.00%
CPU 2 active residency: 100.00% (600 MHz: 0% 912 MHz: .04% 1284 MHz: .02% 1752 MHz: .01% 2004 MHz: 0% 2256 MHz: 0% 2424 MHz: 100%)
CPU 3 frequency: 2423 MHz
CPU 3 idle residency: 0.00%
CPU 3 active residency: 100.00% (600 MHz: 0% 912 MHz: .04% 1284 MHz: .02% 1752 MHz: .01% 2004 MHz: 0% 2256 MHz: 0% 2424 MHz: 100%)
P-Cluster HW active frequency: 1927 MHz
P-Cluster HW active residency: 100.00% (660 MHz: 0% 924 MHz: 0% 1188 MHz: 0% 1452 MHz: 0% 1704 MHz: 16% 1968 MHz: 83% 2208 MHz: .71% 2400 MHz: 0% 2568 MHz: 0% 2724 MHz: 0% 2868 MHz: 0% 2988 MHz: 0% 3096 MHz: 0% 3204 MHz: 0% 3324 MHz: 0% 3408 MHz: 0% 3504 MHz: 0%)
P-Cluster idle residency: 0.00%
P-Cluster instructions retired: 0
P-Cluster instructions per clock: 0
CPU 4 frequency: 1927 MHz
CPU 4 idle residency: 0.00%
CPU 4 active residency: 100.00% (660 MHz: 0% 924 MHz: 0% 1188 MHz: 0% 1452 MHz: 0% 1704 MHz: 16% 1968 MHz: 83% 2208 MHz: .71% 2400 MHz: 0% 2568 MHz: 0% 2724 MHz: 0% 2868 MHz: 0% 2988 MHz: 0% 3096 MHz: 0% 3204 MHz: 0% 3324 MHz: 0% 3408 MHz: 0% 3504 MHz: 0%)
CPU 5 frequency: 1927 MHz
CPU 5 idle residency: 0.00%
CPU 5 active residency: 100.00% (660 MHz: 0% 924 MHz: 0% 1188 MHz: 0% 1452 MHz: 0% 1704 MHz: 16% 1968 MHz: 83% 2208 MHz: .71% 2400 MHz: 0% 2568 MHz: 0% 2724 MHz: 0% 2868 MHz: 0% 2988 MHz: 0% 3096 MHz: 0% 3204 MHz: 0% 3324 MHz: 0% 3408 MHz: 0% 3504 MHz: 0%)
CPU 6 frequency: 1927 MHz
CPU 6 idle residency: 0.00%
CPU 6 active residency: 100.00% (660 MHz: 0% 924 MHz: 0% 1188 MHz: 0% 1452 MHz: 0% 1704 MHz: 16% 1968 MHz: 83% 2208 MHz: .71% 2400 MHz: 0% 2568 MHz: 0% 2724 MHz: 0% 2868 MHz: 0% 2988 MHz: 0% 3096 MHz: 0% 3204 MHz: 0% 3324 MHz: 0% 3408 MHz: 0% 3504 MHz: 0%)
CPU 7 frequency: 1927 MHz
CPU 7 idle residency: 0.00%
CPU 7 active residency: 100.00% (660 MHz: 0% 924 MHz: 0% 1188 MHz: 0% 1452 MHz: 0% 1704 MHz: 16% 1968 MHz: 83% 2208 MHz: .71% 2400 MHz: 0% 2568 MHz: 0% 2724 MHz: 0% 2868 MHz: 0% 2988 MHz: 0% 3096 MHz: 0% 3204 MHz: 0% 3324 MHz: 0% 3408 MHz: 0% 3504 MHz: 0%)
System instructions retired: 0
System instructions per clock: nan
CPU Power: 5247 mW
GPU Power: 33 mW
ANE Power: 0 mW
Combined Power (CPU + GPU + ANE): 5280 mW
この出力で知りたいのは、高効率コア四つの動作周波数です。
P -Clusterのハードウエア、CPU 4,5,6,7で番号が振られています。
実測値
MAC上で負荷の高いタスクとして、MCMCのサンプラーを実行します。この時、CPU使用率は100%を継続します。
- サンプラー起動時
P-Cluster HW active frequency: 3204 MHz
P-Cluster HW active residency: 100.00% (660 MHz: 0% 924 MHz: 0% 1188 MHz: 0% 1452 MHz: 0% 1704 MHz: 0% 1968 MHz: 0% 2208 MHz: 0% 2400 MHz: 0% 2568 MHz: 0% 2724 MHz: 0% 2868 MHz: 0% 2988 MHz: 0% 3096 MHz: 0% 3204 MHz: 100% 3324 MHz: 0% 3408 MHz: 0% 3504 MHz: 0%)
P-Cluster idle residency: 0.00%
P-Cluster instructions retired: 0
P-Cluster instructions per clock: 0
CPU 4 frequency: 3504 MHz
CPU 4 idle residency: 0.00%
CPU 4 active residency: 100.00% (660 MHz: 0% 924 MHz: 0% 1188 MHz: 0% 1452 MHz: 0% 1704 MHz: 0% 1968 MHz: 0% 2208 MHz: 0% 2400 MHz: 0% 2568 MHz: 0% 2724 MHz: 0% 2868 MHz: 0% 2988 MHz: 0% 3096 MHz: 0% 3204 MHz: 0% 3324 MHz: 0% 3408 MHz: 0% 3504 MHz: 100%)
動作クロック:3504MHz
2. 2分経過後(温度108°表示後、低下)
P-Cluster HW active frequency: 1927 MHz
P-Cluster HW active residency: 100.00% (660 MHz: 0% 924 MHz: 0% 1188 MHz: 0% 1452 MHz: 0% 1704 MHz: 16% 1968 MHz: 83% 2208 MHz: .71% 2400 MHz: 0% 2568 MHz: 0% 2724 MHz: 0% 2868 MHz: 0% 2988 MHz: 0% 3096 MHz: 0% 3204 MHz: 0% 3324 MHz: 0% 3408 MHz: 0% 3504 MHz: 0%)
P-Cluster idle residency: 0.00%
P-Cluster instructions retired: 0
P-Cluster instructions per clock: 0
CPU 4 frequency: 1927 MHz
動作クロック:1927MHz
動作開始後、2分経過後にM2の動作クロックは、3.5GHz->1.9GHzにフォールバックしています。
このように、確率モデルによっては長時間サンプラーを動かすので、サーマルスロットリングがかかり、さらに時間がかかるという悪循環に陥ります。MAC以外の動作環境として業務用サーバーで組んだ並列システムがありますが、MACのM2の性能を引き出して実行する方法を検討しました。
MAC Book Airのソリューション
M2の性能を引き出す方法を検討しました。
1.サーマルパッド
BookAirはBookProのように冷却用のファンはないため、ロジックボードにサーマルパッドをはって、筐体に熱を逃すという方法があります。暑さ1mm程度のシリコンサーマルパッドが放熱パッドとして入手できます。
熱の伝導効率は、空気と市販のサーマルパッドで、以下のように大きな差があり、パッドには効果があります。
- 0.002kW / 空気
- 12kW / サーマルパッド
サーマルパッドには、様々な種類があり、主に6kW~12kWの熱伝導効率のものが市販されています。数値の大きいものが伝導効率が高くなります。
この処置を施すと筐体が熱くなります。プラスチック部分の耐久性など、トータルバランスに問題を起こす可能性のある処置は避けたいものです。筆者の使用環境では、モンテカルロシミュレーションか、大量のデータ処理を実行する以外、CPU使用率が100%の状態で使用することはありません。大量のデータ処理を行う場合は電源を電源アダプタに接続しています。モバイル環境ではむしろ、クロックを落として消費電力を下げる通常の仕様の方が扱いやすいと思います。
2. アイスまくら
他の方法を検討しました。要は温度を下げれば良いので、ソフトアイスまくら(氷まくら)をヒートシンクに使うことにしました。
筆者の実行環境ではMCMCを走らせる時以外、CPU使用率が100%に達する処理を実行することは少ないので、高負荷時にのみ使用できる良いソリューションです。
試しに使ってみると、うまくいきました。
高分子ジェルのアイスまくらをドラッグストアで調達しMac Bookの底に敷きます。
冷やさず、常温であっても熱伝導率が高いため、ジェルが熱を吸収して冷却効果があります。
サーマルパッドをロジックボードに貼る必要はありません。ノーマルのMac BookAirの下にジェルのアイスまくらを敷くだけです。
常温使用
以下は、アイスまくらをBookAirの下に置いた時の動作周波数です。
処置前
P-Cluster HW active frequency: 1927 MHz
P-Cluster HW active residency: 100.00% (660 MHz: 0% 924 MHz: 0% 1188 MHz: 0% 1452 MHz: 0% 1704 MHz: 16% 1968 MHz: 83% 2208 MHz: .71% 2400 MHz: 0% 2568 MHz: 0% 2724 MHz: 0% 2868 MHz: 0% 2988 MHz: 0% 3096 MHz: 0% 3204 MHz: 0% 3324 MHz: 0% 3408 MHz: 0% 3504 MHz: 0%)
P-Cluster idle residency: 0.00%
P-Cluster instructions retired: 0
P-Cluster instructions per clock: 0
CPU 4 frequency: 1927 MHz
CPU 4 idle residency: 0.00%
CPU 4 active residency: 100.00% (660 MHz: 0% 924 MHz: 0% 1188 MHz: 0% 1452 MHz: 0% 1704 MHz: 16% 1968 MHz: 83% 2208 MHz: .71% 2400 MHz: 0% 2568 MHz: 0% 2724 MHz: 0% 2868 MHz: 0% 2988 MHz: 0% 3096 MHz: 0% 3204 MHz: 0% 3324 MHz: 0% 3408 MHz: 0% 3504 MHz: 0%)
アイスまくら使用
P-Cluster HW active residency: 100.00% (660 MHz: 0% 924 MHz: 0% 1188 MHz: 0% 1452 MHz: 0% 1704 MHz: 0% 1968 MHz: 0% 2208 MHz: 0% 2400 MHz: 0% 2568 MHz: 51% 2724 MHz: 46% 2868 MHz: 3.6% 2988 MHz: 0% 3096 MHz: 0% 3204 MHz: 0% 3324 MHz: 0% 3408 MHz: 0% 3504 MHz: 0%)
P-Cluster idle residency: 0.00%
P-Cluster instructions retired: 0
P-Cluster instructions per clock: 0
CPU 4 frequency: 2650 MHz
CPU 4 idle residency: 0.00%
CPU 4 active residency: 100.00% (660 MHz: 0% 924 MHz: 0% 1188 MHz: 0% 1452 MHz: 0% 1704 MHz: 0% 1968 MHz: 0% 2208 MHz: 0% 2400 MHz: 0% 2568 MHz: 51% 2724 MHz: 46% 2868 MHz: 3.6% 2988 MHz: 0% 3096 MHz: 0% 3204 MHz: 0% 3324 MHz: 0% 3408 MHz: 0% 3504 MHz: 0%)
アイスまくらを底面に設置した環境では、動作クロックが 1927MHz -> 2650MHz に大幅に改善しています。(冷蔵庫で冷やしていません、常温のアイスまくらです)
これだけで、38%高速になります。
冷却使用
冷凍庫で冷却したアイスまくら使用した場合、ピーク周波数3.5GHzでの動作が数時間持続できます。82%高速になりました。
$ sudo /usr/bin/powermetrics -s cpu_power -n 1
Password:
Machine model: Mac14,2
OS version: 22F82
Boot arguments:
Boot time: Thu Jul 6 19:02:56 2023
*** Sampled system activity (Fri Jul 7 18:28:03 2023 +0900) (5002.87ms elapsed) ***
**** Processor usage ****
E-Cluster HW active frequency: 2424 MHz
E-Cluster HW active residency: 100.00% (600 MHz: 0% 912 MHz: 0% 1284 MHz: 0% 1752 MHz: 0% 2004 MHz: 0% 2256 MHz: 0% 2424 MHz: 100%)
E-Cluster idle residency: 0.00%
E-Cluster instructions retired: 1.23246e+11
E-Cluster instructions per clock: 2.62358
CPU 0 frequency: 2424 MHz
CPU 0 idle residency: 0.00%
CPU 0 active residency: 100.00% (600 MHz: 0% 912 MHz: 0% 1284 MHz: 0% 1752 MHz: 0% 2004 MHz: 0% 2256 MHz: 0% 2424 MHz: 100%)
CPU 1 frequency: 2424 MHz
CPU 1 idle residency: 0.00%
CPU 1 active residency: 100.00% (600 MHz: 0% 912 MHz: 0% 1284 MHz: 0% 1752 MHz: 0% 2004 MHz: 0% 2256 MHz: 0% 2424 MHz: 100%)
CPU 2 frequency: 2424 MHz
CPU 2 idle residency: 0.00%
CPU 2 active residency: 100.00% (600 MHz: 0% 912 MHz: 0% 1284 MHz: 0% 1752 MHz: 0% 2004 MHz: 0% 2256 MHz: 0% 2424 MHz: 100%)
CPU 3 frequency: 2424 MHz
CPU 3 idle residency: 0.00%
CPU 3 active residency: 100.00% (600 MHz: 0% 912 MHz: 0% 1284 MHz: 0% 1752 MHz: 0% 2004 MHz: 0% 2256 MHz: 0% 2424 MHz: 100%)
P-Cluster HW active frequency: 3204 MHz
P-Cluster HW active residency: 100.00% (660 MHz: 0% 924 MHz: 0% 1188 MHz: 0% 1452 MHz: 0% 1704 MHz: 0% 1968 MHz: 0% 2208 MHz: 0% 2400 MHz: 0% 2568 MHz: 0% 2724 MHz: 0% 2868 MHz: 0% 2988 MHz: 0% 3096 MHz: 0% 3204 MHz: 100% 3324 MHz: 0% 3408 MHz: 0% 3504 MHz: 0%)
P-Cluster idle residency: 0.00%
P-Cluster instructions retired: 1.71986e+11
P-Cluster instructions per clock: 2.77491
CPU 4 frequency: 3504 MHz
CPU 4 idle residency: 0.00%
CPU 4 active residency: 100.00% (660 MHz: 0% 924 MHz: 0% 1188 MHz: 0% 1452 MHz: 0% 1704 MHz: 0% 1968 MHz: 0% 2208 MHz: 0% 2400 MHz: 0% 2568 MHz: 0% 2724 MHz: 0% 2868 MHz: 0% 2988 MHz: 0% 3096 MHz: 0% 3204 MHz: 0% 3324 MHz: 0% 3408 MHz: 0% 3504 MHz: 100%)
CPU 5 frequency: 3504 MHz
CPU 5 idle residency: 0.00%
CPU 5 active residency: 100.00% (660 MHz: 0% 924 MHz: 0% 1188 MHz: 0% 1452 MHz: 0% 1704 MHz: 0% 1968 MHz: 0% 2208 MHz: 0% 2400 MHz: 0% 2568 MHz: 0% 2724 MHz: 0% 2868 MHz: 0% 2988 MHz: 0% 3096 MHz: 0% 3204 MHz: 0% 3324 MHz: 0% 3408 MHz: 0% 3504 MHz: 100%)
CPU 6 frequency: 3504 MHz
CPU 6 idle residency: 0.00%
CPU 6 active residency: 100.00% (660 MHz: 0% 924 MHz: 0% 1188 MHz: 0% 1452 MHz: 0% 1704 MHz: 0% 1968 MHz: 0% 2208 MHz: 0% 2400 MHz: 0% 2568 MHz: 0% 2724 MHz: 0% 2868 MHz: 0% 2988 MHz: 0% 3096 MHz: 0% 3204 MHz: 0% 3324 MHz: 0% 3408 MHz: 0% 3504 MHz: 100%)
CPU 7 frequency: 3504 MHz
CPU 7 idle residency: 0.00%
CPU 7 active residency: 100.00% (660 MHz: 0% 924 MHz: 0% 1188 MHz: 0% 1452 MHz: 0% 1704 MHz: 0% 1968 MHz: 0% 2208 MHz: 0% 2400 MHz: 0% 2568 MHz: 0% 2724 MHz: 0% 2868 MHz: 0% 2988 MHz: 0% 3096 MHz: 0% 3204 MHz: 0% 3324 MHz: 0% 3408 MHz: 0% 3504 MHz: 100%)
System instructions retired: 2.95233e+11
System instructions per clock: 2.70966
CPU Power: 14026 mW
GPU Power: 2 mW
ANE Power: 0 mW
Combined Power (CPU + GPU + ANE): 14029 mW
冷凍したソフトアイスまくらとMAC Bookの間ににハンカチを1枚敷いて使用しました。
通常は発熱のために、3.5GHzでの動作は、2分で終了しますが、この処置により、ピーク周波数での動作を持続させることができます。
モンテカルロシミュレーション実行時に使用して、ピーク性能でサンプラーを動かすことができました。
ピーク周波数で動作時、消費電力は14Wになります。
(注)日本は、湿度が高いので、結露に注意してください。ロジックボードが結露することはありませんが、筐体は結露します。
Ockham's Razor
これを使用して、4つの高効率コアが82%高速になりました。
発熱で性能が低下する問題は冷やせば解決します。CPU負荷が高い処理で、M2のピーク性能を引き出すシンプルな問題解決の例です。