第18章. CUDA / ROCm / Metal / DirectML
この章の目的
この章では、LLMの推論や学習を高速に実行するために不可欠なGPUアクセラレーション技術の主要なソフトウェアスタック(CUDA, ROCm, Metal, DirectML)について理解を深めます。それぞれの技術がどのようなハードウェアに対応し、どのような特徴を持つのかを学ぶことで、多様な実行環境におけるLLMのパフォーマンス最適化の基礎を築きます。
この章で覚えるべきこと
- CUDA, ROCm, Metal, DirectMLがそれぞれどのGPUベンダーの技術か
- 各技術が提供する機能と、LLM実行における役割
- NVIDIAがLLM分野で優位に立つ理由
- Apple SiliconにおけるMetalの位置づけ
backendとkernelという用語の具体的な意味
導入
LLMの学習や推論は、膨大な量の並列計算を必要とします。この計算を効率的に行うために、GPU(Graphics Processing Unit)が不可欠であることは、第17章で学びました。しかし、GPUは単体ではその性能を最大限に発揮できません。GPUのハードウェア性能を引き出すためには、その上で動作するソフトウェアスタック、すなわちプログラミングモデルやライブラリ群が重要になります。
本章では、主要なGPUベンダーが提供するソフトウェアスタックであるCUDA(NVIDIA)、ROCm(AMD)、Metal(Apple)、DirectML(Microsoft)に焦点を当てます。これらの技術は、LLMのような大規模な並列計算をGPU上で効率的に実行するための基盤を提供します。それぞれの技術がどのような背景を持ち、どのような特徴があるのかを理解することは、LLMの実行環境を最適化する上で非常に重要です。
基本概念
GPUそのもの vs ソフトウェアスタック
まず、GPUハードウェアとそれを動かすソフトウェアスタックの違いを明確にしましょう。
ひとことで言うと: GPUは計算を行う「物理的な装置」であり、ソフトウェアスタックはその装置を「どのように使うか」を定義するツール群です。
何のカテゴリか:
- GPUそのもの: ハードウェア
- ソフトウェアスタック: ソフトウェア(プログラミングモデル、API、ライブラリ、コンパイラなど)
何に使うのか:
- GPUそのもの: 大規模な並列計算を実行する。
- ソフトウェアスタック: プログラマーがGPUの計算能力を効率的に利用するためのインターフェースを提供し、特定のタスク(例: 行列乗算、畳み込み)を高速化する。
代表例:
- GPUそのもの: NVIDIA A100, AMD Instinct MI250, Apple M2 Ultra
- ソフトウェアスタック: CUDA (NVIDIA), ROCm (AMD), Metal (Apple), DirectML (Microsoft)
よく混同される用語: GPUとCUDAが同じものだと誤解されることがありますが、CUDAはNVIDIA製GPU上で動作するソフトウェアプラットフォームであり、GPUそのものではありません。
初心者向け注意点: GPUの性能はハードウェアスペックだけでなく、その上で動作するソフトウェアスタックの成熟度や最適化の度合いに大きく左右されます。特にLLMのような最先端の計算では、ソフトウェアスタックの選択が性能に直結します。
backend
ひとことで言うと: 特定のタスクを実行するために、裏側で実際に処理を行うシステムやライブラリのこと。
何のカテゴリか: ソフトウェアアーキテクチャの構成要素。
何に使うのか: プログラマーが直接ハードウェアの詳細を意識することなく、高レベルなAPIを通じて計算を実行できるようにする。例えば、PyTorchやTensorFlowのようなフレームワークは、計算グラフを構築し、それを特定のバックエンド(例: CUDA, ROCm)に渡して実行させます。
代表例:
- PyTorchのCUDAバックエンド
- TensorFlowのROCmバックエンド
- ONNX RuntimeのDirectMLバックエンド
よく混同される用語: 「フレームワーク」と混同されることがありますが、フレームワークはバックエンドを利用する上位の層です。バックエンドはフレームワークが利用する「実行エンジン」のようなものです。
初心者向け注意点: LLMの推論や学習では、どのバックエンドが利用可能か、そしてそれがどの程度最適化されているかが、パフォーマンスを決定する重要な要素となります。
kernel
ひとことで言うと: GPU上で実行される、並列処理の最小単位となる関数やプログラム。
何のカテゴリか: GPUプログラミングにおける基本的な実行単位。
何に使うのか: 大量のデータを同時に処理するために、GPUの多数のコア(ストリーミングプロセッサなど)で並行して実行される。例えば、行列乗算では、各要素の計算が個別のカーネルとして実行されることがあります。
代表例:
- CUDA C++で書かれた行列乗算カーネル
- OpenCLで書かれた畳み込みカーネル
よく混同される用語: 「スレッド」や「プロセス」と混同されることがありますが、カーネルはGPUのアーキテクチャに特化した並列実行単位です。
初心者向け注意点: LLMの推論や学習の高速化は、いかに効率的なカーネルが実装されているかにかかっています。特に、メモリアクセスパターンや計算の並列性を考慮したカーネル設計が重要です。
例えば、行列 $A$ と行列 $B$ の積 $C = A \times B$ を計算する場合、結果行列 $C$ の各要素 $C_{ij}$ は以下のように計算されます。 $$ C_{ij} = \sum_{k=1}^{N} A_{ik} B_{kj} $$ この計算は、各 $C_{ij}$ が独立して計算できるため、GPUのカーネルとして並列に実行するのに適しています。各カーネルは、特定の $C_{ij}$ の計算を担当し、GPUの多数のコアで同時に実行されます。
主要なGPUソフトウェアスタック
CUDA
ひとことで言うと: NVIDIA製GPU向けの並列コンピューティングプラットフォーム。
何のカテゴリか: GPUプログラミングモデル、API、ライブラリ、開発ツールキット。
何に使うのか: NVIDIA製GPUの計算能力を最大限に引き出し、科学技術計算、機械学習、ディープラーニングなどの並列処理を高速化する。
代表例: cuDNN (ディープラーニングプリミティブライブラリ), cuBLAS (線形代数ライブラリ), TensorRT (推論最適化ライブラリ)。
よく混同される用語: NVIDIA GPUそのものと混同されることがある。
初心者向け注意点: LLM分野でNVIDIAが圧倒的な優位性を持つ最大の理由の一つは、CUDAエコシステムの成熟度と広範な採用にあります。
ROCm
ひとことで言うと: AMD製GPU向けのオープンソースな並列コンピューティングプラットフォーム。
何のカテゴリか: GPUプログラミングモデル、API、ライブラリ、開発ツールキット。
何に使うのか: AMD製GPUの計算能力を利用し、機械学習やHPC(高性能計算)タスクを高速化する。CUDAの代替を目指している。
代表例: MIOpen (ディープラーニングプリミティブライブラリ), rocBLAS (線形代数ライブラリ)。
よく混同される用語: AMD GPUそのものと混同されることがある。
初心者向け注意点: ROCmはオープンソースであるため、透明性が高く、コミュニティによる貢献が期待されますが、CUDAに比べてエコシステムの成熟度や対応するフレームワークの数がまだ限定的です。
Metal
ひとことで言うと: Apple製ハードウェア(Mac, iPhone, iPadなど)向けの低レベルグラフィックスおよび計算API。
何のカテゴリか: グラフィックスAPI、計算API。
何に使うのか: Apple Siliconを含むApple製デバイスのGPU性能を最大限に引き出し、グラフィックスレンダリングや機械学習タスクを高速化する。
代表例: Core ML (Appleの機械学習フレームワーク) のバックエンドとして利用される。
よく混同される用語: OpenGLやVulkanといった汎用グラフィックスAPI。MetalはAppleハードウェアに特化している点が異なる。
初心者向け注意点: Apple Silicon搭載MacでLLMを動かす場合、Metalが重要な役割を果たします。特に、llama.cppのようなプロジェクトではMetalを利用して高速な推論を実現しています。
DirectML
ひとことで言うと: Windows上で動作する機械学習に特化した低レベルAPI。
何のカテゴリか: 機械学習API。
何に使うのか: Windows PCの様々なGPU(NVIDIA, AMD, Intelなど)上で機械学習ワークロードを高速化する。DirectX 12 APIの一部として提供される。
代表例: ONNX Runtimeのバックエンドとして利用される。
よく混同される用語: DirectXそのもの。DirectMLはDirectXファミリーの一部だが、機械学習に特化している。
初心者向け注意点: Windows環境で、特にゲーミングGPUなど汎用的なGPUでLLMを動かす際に、DirectMLが選択肢となることがあります。
具体例
LLM推論におけるバックエンドの選択
LLMの推論を行う際、どのバックエンドを利用するかは、使用するハードウェアとソフトウェアフレームワークによって決まります。
Mermaid図: LLM推論バックエンドの選択フロー
graph TD
A[LLM推論開始] --> B{ハードウェアは?}
B -- NVIDIA GPU --> C[CUDA利用可能]
C --> D{フレームワークは?}
D -- "PyTorch/TensorFlow" --> E[CUDAバックエンド]
D -- TensorRT-LLM --> F["TensorRT (CUDAベース)"]
E --> G[高速推論]
F --> G
B -- AMD GPU --> H[ROCm利用可能]
H --> I{フレームワークは?}
I -- "PyTorch/TensorFlow" --> J[ROCmバックエンド]
J --> G
B -- Apple Silicon --> K[Metal利用可能]
K --> L{フレームワークは?}
L -- "llama.cpp/Core ML" --> M[Metalバックエンド]
M --> G
B -- "Windows PC (汎用GPU)" --> N[DirectML利用可能]
N --> O{フレームワークは?}
O -- ONNX Runtime --> P[DirectMLバックエンド]
P --> G
G[LLM推論実行]
この図が示すように、LLMの推論を行う際には、まず手元のハードウェア(NVIDIA GPU、AMD GPU、Apple Silicon、汎用Windows PCなど)を確認し、それに対応するソフトウェアスタック(CUDA, ROCm, Metal, DirectML)が利用可能かを確認します。その後、使用するLLMフレームワーク(PyTorch, TensorFlow, llama.cpp, ONNX Runtimeなど)がそのソフトウェアスタックをバックエンドとしてサポートしているかを確認し、最適な組み合わせを選択します。
`llama.cpp`におけるバックエンドの例
第7章で紹介したllama.cppは、様々なバックエンドをサポートすることで、多様なハードウェアでのLLM推論を可能にしています。
| バックエンド名 | 対応ハードウェア | 特徴 |
|---|---|---|
CUDA |
NVIDIA GPU | 最も成熟しており、高性能。 |
ROCm |
AMD GPU | AMD GPUでの高速化。 |
Metal |
Apple Silicon | Apple製チップでの最適化。 |
OpenCL |
汎用GPU (Intel, AMDなど) | 比較的古いGPUでも動作可能だが、性能は限定的。 |
Vulkan |
汎用GPU (Intel, AMDなど) | 新しい汎用GPU API。 |
CPU |
全てのCPU | GPUがない場合のフォールバック。 |
llama.cppは、これらのバックエンドをコンパイル時に選択したり、実行時に自動検出したりすることで、ユーザーが特別な設定なしに手元のハードウェアでLLMを実行できるようにしています。特にMetalバックエンドは、Apple SiliconのNPU(Neural Processing Unit)とGPUを効率的に利用し、驚くべき推論速度を実現しています。
Mermaid図: llama.cppのバックエンド選択と実行フロー
graph TD
A[llama.cpp 実行] --> B{ハードウェア検出}
B -- Apple Silicon --> C["Metal バックエンド"]
B -- NVIDIA GPU --> D["CUDA バックエンド"]
B -- AMD GPU --> E["ROCm バックエンド"]
B -- その他 GPU --> F["OpenCL/Vulkan バックエンド"]
B -- CPUのみ --> G["CPU バックエンド"]
C --> H["LLM推論 (Metal)"]
D --> I["LLM推論 (CUDA)"]
E --> J["LLM推論 (ROCm)"]
F --> K["LLM推論 (OpenCL/Vulkan)"]
G --> L["LLM推論 (CPU)"]
subgraph "Apple Silicon Optimization"
C
C1
end
subgraph "NVIDIA Optimization"
D
D1
end
subgraph "AMD Optimization"
E
E1
end
この図は、llama.cppがどのようにして多様なハードウェア環境でLLM推論を実行するかを示しています。ハードウェアを検出し、それに応じた最適なバックエンドを選択することで、各プラットフォームの性能を最大限に引き出そうとします。
よく混同される用語との比較
GPUそのもの vs ソフトウェアスタック
| 特徴 | GPUそのもの | ソフトウェアスタック (CUDA, ROCmなど) |
|---|---|---|
| カテゴリ | ハードウェア | ソフトウェア |
| 役割 | 計算を実行する物理的な装置 | GPUの計算能力を引き出すためのツール群 |
| 例 | NVIDIA A100, AMD Instinct MI250, Apple M2 | CUDA, ROCm, Metal, DirectML |
| 依存関係 | ソフトウェアスタックはGPUハードウェアに依存 | GPUハードウェアはソフトウェアスタックなしでは性能を発揮しにくい |
| 開発者視点 | 物理的なリソース | プログラミングインターフェース |
主要なGPUソフトウェアスタックの比較
| 特徴 | CUDA (NVIDIA) | ROCm (AMD) | Metal (Apple) | DirectML (Microsoft) |
|---|---|---|---|---|
| 対応GPU | NVIDIA GPU | AMD GPU | Apple Silicon | 汎用GPU (NVIDIA, AMD, Intel) |
| エコシステム | 成熟、広範 | 成長中、オープンソース | Apple製品に特化 | Windows環境に特化 |
| 主要用途 | DL学習/推論, HPC | DL学習/推論, HPC | グラフィックス, ML (オンデバイス) | Windows上のML推論 |
| フレームワーク統合 | PyTorch, TensorFlowなど深く統合 | PyTorch, TensorFlow (限定的) | Core ML, llama.cppなど | ONNX Runtimeなど |
| 強み | 性能, ライブラリ, 開発者コミュニティ | オープンソース, AMD GPU活用 | 統合メモリ, Apple HW最適化 | Windowsエコシステム, 汎用性 |
| 弱み | プロプライエタリ, 高コスト | 成熟度, フレームワーク対応 | Apple HW限定 | Windows限定, 性能はHW依存 |
NVIDIA優位の理由
LLMを含むディープラーニング分野でNVIDIAが圧倒的な優位性を持つ理由は、単に高性能なGPUを製造しているからだけではありません。
- CUDAエコシステムの成熟度:
- 歴史: 2006年にCUDAを発表して以来、長年にわたり開発と改善を続けてきました。
- ライブラリ: cuDNN, cuBLAS, TensorRTなど、ディープラーニングに特化した高性能ライブラリが充実しています。これらのライブラリは、主要なディープラーニングフレームワーク(PyTorch, TensorFlow)に深く統合されており、開発者はGPUプログラミングの詳細を知らなくても、簡単に高速な計算を利用できます。
- 開発者コミュニティ: 膨大な数の開発者がCUDAを利用しており、情報やノウハウが豊富です。
- ツール: プロファイリングツールやデバッガなど、開発を支援するツールも充実しています。
- 早期からの投資: ディープラーニングの黎明期からGPUコンピューティングの可能性に着目し、研究開発に多大な投資を行ってきました。
- ハードウェアとソフトウェアの統合: NVIDIAはGPUハードウェアとCUDAソフトウェアスタックを垂直統合して開発しているため、ハードウェアの性能を最大限に引き出すソフトウェア最適化が可能です。
- 市場シェア: データセンター向けGPU市場で圧倒的なシェアを持ち、事実上の業界標準となっています。
AMDのROCmやAppleのMetal、MicrosoftのDirectMLも進化していますが、CUDAが築き上げてきたエコシステムと市場での地位は、現時点では揺るぎないものとなっています。
Apple Siliconでの位置づけ
Apple Silicon(Mシリーズチップ)は、CPU、GPU、NPU(Neural Processing Unit)を統合したSoC(System on a Chip)アーキテクチャを採用しています。この統合アーキテクチャにおいて、Metalは非常に重要な役割を果たします。
- 統合メモリ: Apple SiliconはCPUとGPUが同じ物理メモリを共有する「統合メモリ」アーキテクチャを採用しています。これにより、CPUとGPU間のデータ転送オーバーヘッドが劇的に削減され、LLMのような大規模モデルの処理において大きなメリットとなります。
- Metal API: Metalは、この統合メモリとApple SiliconのGPU/NPUを効率的に利用するための低レベルAPIです。
llama.cppがMetalバックエンドを利用することで、Apple Siliconのハードウェア性能を最大限に引き出し、CPUのみの場合と比較して大幅な高速化を実現しています。 - Core ML: Apple独自の機械学習フレームワークであるCore MLもMetalをバックエンドとして利用しており、Appleデバイス上でのオンデバイスAI処理を最適化しています。
このように、Apple Siliconは独自のハードウェアとソフトウェアスタック(Metal)の組み合わせにより、NVIDIAやAMDとは異なるアプローチでLLMの高速実行を実現しています。
Mermaid図: Apple Siliconの統合アーキテクチャとMetal
graph TD
A["Apple Silicon (SoC)"] --> B["CPU (Neural Engine)"]
A --> C["GPU (Neural Engine)"]
A --> D["NPU (Neural Engine)"]
A --> E["統合メモリ"]
subgraph "ソフトウェアスタック"
F
Metal
API
F
F
F
end
subgraph "LLMアプリケーション"
G
llama
cpp
H
Core
ML
end
G --> I["高速LLM推論"]
H --> I
この図は、Apple Siliconの統合アーキテクチャと、その上でMetal APIがどのようにCPU、GPU、NPU、統合メモリを連携させ、LLMアプリケーションの高速実行を可能にしているかを示しています。統合メモリによるデータ転送の効率化が、特にLLMのような大規模データ処理において重要な役割を果たします。
実務での位置づけ
LLMの実務において、これらのGPUソフトウェアスタックの知識は、以下のような場面で役立ちます。
- ハードウェア選定: 新しいLLMサーバーを構築する際、NVIDIA GPUを選ぶか、AMD GPUを選ぶか、あるいはApple Silicon搭載Macを選ぶかといった判断に、各ソフトウェアスタックの成熟度やエコシステムの状況が影響します。特に、利用したいフレームワークやライブラリがどのバックエンドをサポートしているかを考慮する必要があります。
- パフォーマンス最適化: LLMの推論速度が遅い場合、どのバックエンドが利用されているか、そのバックエンドが最新のバージョンか、そしてそのバックエンド向けにモデルが最適化されているか(例: TensorRTによる最適化)を確認することが、パフォーマンス改善の第一歩となります。
- トラブルシューティング: GPU関連のエラーが発生した場合、それがハードウェアの問題なのか、CUDA/ROCm/Metalのドライバやライブラリの問題なのかを切り分けるために、これらの知識が役立ちます。
- クロスプラットフォーム開発: 異なるOSやハードウェアでLLMアプリケーションを動作させる場合、各プラットフォームに対応するバックエンドを理解し、適切な実装を選択する必要があります。例えば、Windowsユーザー向けにはDirectML、Macユーザー向けにはMetalといった選択肢が考えられます。
- コストと可用性: NVIDIA GPUは高性能ですが高価であり、入手困難な場合もあります。ROCmやDirectMLを利用することで、より安価なAMD GPUや汎用GPUを活用できる可能性があります。
まとめ
3行まとめ
- CUDA, ROCm, Metal, DirectMLは、それぞれNVIDIA, AMD, Apple, Microsoftが提供するGPUアクセラレーションのためのソフトウェアスタックである。
- NVIDIAはCUDAエコシステムの成熟度によりLLM分野で優位に立ち、Apple SiliconはMetalを通じて独自の高性能を実現している。
backendは実行環境の基盤、kernelはGPU上で実行される並列処理の最小単位を指す。
混同しやすい用語
- GPU と CUDA: GPUはハードウェア、CUDAはNVIDIA製GPU用のソフトウェアプラットフォーム。
- フレームワーク と バックエンド: フレームワークは高レベルなAPIを提供し、バックエンドはそのフレームワークが利用する実行エンジン。
次に読むべき章
- 第19章: 量子化の応用と実践
- 第20章: 推論最適化のテクニック
- 第21章: クラウドGPUサービスとオンプレミス環境の比較