llama.cpp をコンパイルする Metal
Apple Silicon搭載のMacでは、llama.cppを3つのコマンドでコンパイルでき、Metalはデフォルトで有効になっています。リポジトリをクローンし、cmake -B build、続いてcmake --build build --config Releaseを実行してください。GPUツールキットのインストールは不要です。Homebrewを使えば、コンパイルせずにインストールすることもできます。llama-cliとllama-serverのバイナリは、MシリーズチップのGPUで計算を実行します。実行できるモデルのサイズを決めるのは、純粋な計算性能よりもユニファイドメモリです。
llama.cpp は Ollama と LM Studio の基盤となる推論エンジンで、Macでネイティブに動作します。このガイドでは、Metalを使ってインストールまたはコンパイルする方法、GGUFモデルを実行する方法、APIとして提供する方法、macOSのGPUメモリ上限を引き上げる方法、M1からM5までのチップについて公開されているベンチマークを正しく読み取る方法を紹介します。
#Macで使うllama.cpp:Metalがもたらすメリット
macOSでは、Appleのグラフィックスおよび計算APIであるMetalを介してGPUを利用し、llama.cppもこれを直接活用します。プロジェクトのREADMEには、Apple Siliconが主要な対応プラットフォームとして扱われ、ARM NEON、Accelerate、Metalによって最適化されていると明記されています。つまり、デフォルトの設定でコンパイルするだけで、追加オプションなしにGPUを使うエンジンが生成されます。また、ユニファイドメモリによりCPUとGPUの間でデータを転送する必要がなく、モデルはメモリ上に1つだけ保持されます。したがって、Macで制約となるのは、このメモリの容量と帯域幅です。
#前提条件
お使いのマシンで、プライベートかつ無料のChatGPTを1時間で構築 — LM Studio、Ollama、Open WebUI、ご自身のドキュメント、クラウド不要。
- 永久に利用できるオンラインスペース
- PDF + ファイル
- 生涯アップデート
- Apple Silicon搭載のMac
- M1からM5までがこのガイドの対象です。Intelプロセッサ搭載のMacはほとんどメリットを得られません。
- Appleのコンパイルツール
- xcode-select --install で Command Line Tools をインストールしてください。
- CMake と Git
- Homebrew から利用可能:brew install cmake git
- モデル用のメモリ
- 当サイトでの目安は、コンテキスト分を除いて、Q4の8Bモデルが約5GB、14Bが約9GB、32Bが19〜20GBです。
#コンパイルなしでインストール:Homebrew
特別なコンパイルオプションが必要なければ、Homebrewを使うのが最も速い方法です。llama.cppのインストールドキュメントによると、Homebrewのformulaは、プロジェクトの新しいバージョンが公開されるたびに自動更新されます。Metalに対応した同じ実行ファイルを、そのまま使える状態で入手できます。
リポジトリの最新版を使いたい場合、ブランチを試したい場合、またはコンパイルオプションを変更したい場合は、自分でコンパイルしてください。それ以外ならHomebrewで十分です。コンパイルにかかる時間を省け、更新はbrew upgradeで行えます。
#1. Metalを使用してコンパイル
ビルドのドキュメントには明記されています。macOSではMetalがデフォルトで有効になり、計算はGPU上で実行されます。追加するオプションはありません。Georgi Gerganovのアカウントにあった旧リポジトリ名からは、現在プロジェクトが置かれているggml-org組織へリダイレクトされます。バイナリはbuild/binに生成され、ターミナル用のllama-cliやAPI用のllama-serverなどが含まれます。
2つの便利なオプションがあります。ドキュメントによると、-DGGML_METAL=OFF を指定するとコンパイル時に Metal が無効化され、Metal でコンパイルされたバイナリは --n-gpu-layers 0 を使用して CPU での実行に強制できます。速度を比較する際に便利です。
#2. 最初のモデルを起動する
新しいエンジンはモデルを自動でダウンロードできます。-hf オプションは Hugging Face リポジトリ名を指定し、量子化はサフィックスで指定します。サフィックスがなければ、デフォルトで Q4_K_M が使用されます。既にダウンロード済みのファイルについては、-m でファイルのパスを指定してください。
GPU に配置するレイヤー数は -ngl で設定します。デフォルト値は auto で、ユニファイドメモリを搭載した Mac に適しています。すべてのレイヤーを読み込むには、-ngl all と指定することもできます。Ollama のフォルダ内でモデルのパスを探さないでください。モデルファイルは内部形式で保存されており、そのまま利用できる GGUF ファイルではありません。
#llama-serverでOpenAI互換APIを提供する
llama-serverは、チャット、応答、埋め込み向けにOpenAI APIと互換性のあるルートを提供します。デフォルトでは127.0.0.1のポート8080で接続を待ち受けるため、ご自身のMacからしかアクセスできません。ネットワークからアクセスできるようにするには、--hostを明示的に指定する必要があります。その場合は、アクセスを保護することが適切です。
#4. macOS の GPU メモリ制限
Apple Siliconでは、macOSがGPUに利用させるのはユニファイドメモリの一部だけです。その範囲を超えるモデルは、メモリの総容量が十分でも、読み込みを拒否されるか、一部の処理がCPUに回ります。エンジンは起動時に実際の値を表示します。llama-cliまたはllama-serverのログで、ggml_metal_init: recommendedMaxWorkingSetSizeという行を探してください。
sysctl iogpu.wired_limit_mbコマンドで、この上限を引き上げられます。値はメガバイト単位で指定します。たとえば60 GBなら61 440です。llama.cppリポジトリの貢献者は、この設定は永続化されないため、起動のたびにコマンドを実行し直す必要があると注意を促しています。また、100%まで引き上げることは勧めていません。システムにはGPUが確保している領域以外にもメモリが必要で、十分に残しておかないと正常に動作しなくなるためです。
#統合メモリに応じたモデルの選定
ユニファイドメモリはmacOS、使用中のアプリ、モデルの間で共有され、GPUに割り当てられるのはその一部だけです。当サイトの目安では、Q4の8Bモデルの重みは約5 GB、14Bは約9 GB、32Bは約19〜20 GBです。これにコンテキストキャッシュの容量が加わります。表は余裕を見込んだ概算です。基準となるのは、エンジンが表示する recommendedMaxWorkingSetSize の値です。
| Macのメモリ | 妥当なモデル | 注記 |
|---|---|---|
| 8 GB | 3B(2 GB) | 8Bモデルは実行できますが、macOS用に残るメモリの余裕が少なすぎます。 |
| 16 GB | 8B(5GB)、中程度のコンテキスト長 | デフォルトのGPU制限は十分です |
| 24から32GB | 14B(9 GB)、あるいは8BをQ8で | Q4量子化した32Bモデルには、GPUのメモリ上限を引き上げる必要があります |
| 48から64GB | 32B(19~20 GB)を長いコンテキストで使用 | エンジンがモデルの読み込みを拒否する場合は、GPU の上限を引き上げる |
| 96 GB 以上 | 70B(約40 GB)およびMoEモデル | ダウンロード前に recommendedMaxWorkingSetSize を確認してください |
これらは安全側に見積もった概算であり、実測値ではありません。長いコンテキスト、追加のモデル、リソースを多く消費するアプリケーションのいずれかがあるだけで、状況は変わります。メモリ専用のガイドで、計算方法を詳しく説明しています。
#5. 重要となるオプション
| オプション | 役割 | デフォルト値 |
|---|---|---|
| -ngl, --n-gpu-layers | VRAMに配置するレイヤー数(数値、auto、またはall) | auto |
| -fa, --flash-attn | Flash Attention:on、off、auto | auto |
| -ctk、-ctv | キーと値に使用するKVキャッシュの型(f16、q8_0、q4_0…) | f16 |
| -hf | ダウンロードするHugging Faceリポジトリ(量子化は任意) | サフィックスを省略した場合はQ4_K_M |
| -c | コンテキストのサイズ(トークン単位) | モデルによって異なります |
Flash Attentionはデフォルトで自動モードになっているため、ほとんどの場合、手動で有効にする必要はありません。Flash Attentionが有効であれば、-ctkと-ctvでKVキャッシュを量子化できます。q8_0ではf16と比べてキャッシュのメモリ使用量がほぼ半分になりますが、その代わりに精度がわずかに低下するため、ご自身の用途で確認することをお勧めします。専用ガイドでこのトレードオフを詳しく説明しています。
#6. チップ別の性能:公開ベンチマークが測定していること
QuelLLMはこれらのマシンの性能を測定していません。参考となるのは、llama.cppリポジトリ内の「Performance of llama.cpp on Apple Silicon M-series」のディスカッションです。ここで各貢献者はLLaMA 7B Q4_0を同じテストで実行しています。以下の表はその一部を示しており、各測定のllama.cppバージョンも記載されています。M1からM4までのデータは同じバージョンで、M5のデータはそれより新しいバージョンです。
| チップ(GPUコア数) | 帯域幅 | Prompt | 生成 | 理論的上限の割合 |
|---|---|---|---|---|
| M2 Pro (19) | 200 GB/s | 341,19 | 38,86 | 74 % |
| M3 Pro (18) | 150 GB/s | 341,67 | 30,74 | 78 % |
| M4 Pro (20) | 273 GB/s | 439,78 | 50,74 | 71 % |
| M5 Pro (20) | 307 GB/s | 1 620,64 | 66,33 | 82 % |
| M4 Max (40) | 546 GB/s | 885,68 | 83,06 | 58 % |
理論上限は、帯域幅をモデルのデータサイズ(3.56GiB、つまり3.82GB)で割った値です。Proチップはこの上限の71〜82%に達しますが、Maxチップはわずか58%にとどまります。ある水準を超えると、メモリだけが制約ではなくなり、より高い帯域幅にお金を払っても、仕様表から期待するほどの効果は得られません。
ここから3つのことが分かります。生成速度はメモリ帯域幅に左右されます。M3 Proはチップの世代が新しいにもかかわらず、帯域幅が150 GB/sのため、200 GB/sのM2 Proより遅くなります。帯域幅がはるかに大きいMaxチップが優位です。また、プロンプトの読み取り速度はM5で飛躍的に向上しました。GPUコア数が同じM4 Proの439.78トークン/秒に対し、M5 Proは1,620.64トークン/秒で、3.7倍です。この差は長い文書やRAGでは重要ですが、チャットでは影響がずっと小さくなります。
Macが遅いと結論づける前に、同じモデルをまず-ngl 0で、次にデフォルト値で実行し直して比較する習慣を付けるとよいでしょう。両者の差から、そのマシンでGPUが実際にどれだけ寄与しているかが分かり、計算が確かにMetal経由で行われていることも確認できます。使用したllama.cppのバージョンも記録してください。Metalの最適化は急速に進んでおり、古いバイナリは最近のバージョンより大幅に遅い場合があります。
#トラブルシューティング:よくあるエラー
| 症状 | 考えられる原因 | 解決の手がかり |
|---|---|---|
| 生成速度が非常に低く、CPU使用率が100% | モデルがCPU側に読み込まれている | -nglを確認し、起動ログを読む |
| GPUのメモリ割り当てエラー | GPUに割り当てられたRAMよりも大きなモデル | iogpu.wired_limit_mbの値を引き上げる、モデルを小さくする、またはコンテキストを短くする |
| Macの動作が遅くなる、またはフリーズする | GPU に割り当てるメモリの上限が高すぎて、macOS 用の余裕がない | iogpu.wired_limit_mb の値を下げます |
| コンパイルが失敗します | Appleの開発ツールがない、またはCMakeが古すぎる | xcode-select --install その後 brew upgrade cmake |
| モデルが見つかりません | Hugging Face のリポジトリパスまたは名前が誤っています | 既知のリポジトリで -hf をテストするか、絶対パスで -m を使用する |
MacでMetalを使用するにはllama.cppをコンパイルする必要がありますか?+
llama.cppがMacでGPUを用いているか確認する方法は?+
Apple Silicon搭載MacでGPUにより多くのメモリを割り当てるには、どうすればよいですか?+
Macではllama.cppとOllamaのどちらを選ぶべきですか?+
M4 Pro搭載のMacでllama.cppを使うと、どの程度の速度が期待できますか?+
ご意見、誤りのご指摘、補足はありますか?ぜひお知らせください。皆さんにとってより良いガイドにするために役立ちます。