(MAX を導入する意味)=
# MAX を導入する意味
## この章で学ぶこと
- なぜ microgpt.py / Mojo 版のままでは速さに限界があるのか
- MAX が解決しようとしている問題とは何か
- Graph・Module・Weight という三つの中心概念
- MAX と Mojo の役割分担
---
## microgpt.py と Mojo 版の限界
{ref}`microgpt.py を Mojo で書き直す` で実装した Mojo 版は、すべての演算を**スカラー単位でテープに追記**していきます。
```
t.add(a, b) → テープにノードを 1 個追記
t.mul(c, d) → テープにノードを 1 個追記
... → 推論 1 ステップで数千〜数万ノードが積み上がる
```
これは自動微分(学習)のためには正しい設計ですが、**推論だけを速く動かしたい場合には非効率**です。
| 実装 | 特徴 | 問題 |
|------|------|------|
| Python 版 | 短く読みやすい | Python インタプリタのオーバーヘッド |
| Mojo 版 (Tape) | 型安全・自動微分可能 | スカラーループ、JIT/SIMD 最適化なし |
| **MAX** | グラフを先に構築してから実行 | → 次節で説明 |
---
## MAX とは何か
**MAX**(Modular Accelerated Execution)は、モデルの計算を**グラフとして表し、実行しやすい形へ整理する基盤**です。
microgpt.py のような実行方式と MAX の実行方式を比べると次のようになります。
:::: {container} mermaid-flow-half
```{mermaid}
flowchart LR
subgraph "Python / Mojo Tape 方式"
direction TB
A1["入力"] --> B1["演算1
(その場で実行)"]
B1 --> C1["演算2
(その場で実行)"]
C1 --> D1["出力"]
end
subgraph "MAX 方式"
direction TB
A2["Graph 構築
(形だけ定義)"] --> B2["コンパイル
(最適化)"]
B2 --> C2["実行
(高速)"]
end
```
::::
MAX では先に「**何をどんな順で計算するか**」というグラフを組み立て、その後でコンパイル・最適化してから実行します。このため:
- **演算の融合**(複数の小さな演算を1回のカーネルにまとめる)
- **SIMD/GPU への自動マッピング**
- **メモリレイアウトの最適化**
が可能になります。
---
## 三つの中心概念
### Graph — 計算の設計図
`Graph` は「何を入力にし、どんな演算を経て、何を出力するか」を**実行前に定義する設計図**です。
```
Graph
├── 入力ノード(TensorType で型・形状を宣言)
├── 演算ノード(ops.matmul, ops.relu, ...)
└── 出力ノード
```
グラフを定義しただけでは何も実行されません。`InferenceSession` に渡してコンパイルして初めて動きます。
### Module — 層や重みを持つまとまり
`Module` は、PyTorch の `nn.Module` に近い概念です。層・重み・計算の流れをひとまとまりで表します。
microgpt の例で言えば、次のような単位を `Module` として整理できます。
```
GPTModule
├── wte (Weight: トークン埋め込み)
├── wpe (Weight: 位置埋め込み)
├── AttentionModule (サブモジュール)
├── MLPModule (サブモジュール)
└── lm_head (Weight: 出力線形層)
```
### Weight — 学習される値を明示する
`Weight` は、モデルの学習可能なパラメータを表します。入力テンソルと区別して明示することで、「どれが固定値でどれが更新される値か」がグラフ上で明確になります。
---
## MAX と Mojo の役割分担
MAX と Mojo は競合ではなく、**役割を分けて組み合わせる**設計になっています。
```{mermaid}
flowchart LR
A["モデルの流れを整理
(Graph / Module / Weight)"] -- MAX --> B["実行・最適化"]
C["カスタム演算
(独自のカーネル)"] -- Mojo カスタム ops --> B
```
| 役割 | 担当 |
|------|------|
| モデル全体の計算グラフを組む | MAX(Python API) |
| 標準にない演算を高速実装する | Mojo(custom ops) |
| 学習(自動微分・Adam) | Mojo の Tape(または別途 MAX Engine) |
| 推論の高速実行 | MAX(InferenceSession) |
典型的な進め方は「**まず標準の MAX ops でグラフを組み、ボトルネックになった部分だけを Mojo の custom ops に置き換える**」です。
---
## まとめ
- Python ループ / Mojo Tape のスカラー実行は学習には適しているが、推論の高速化には限界がある
- MAX は計算グラフを先に構築し、コンパイル・最適化してから実行する
- `Graph`(設計図)・`Module`(まとまり)・`Weight`(学習パラメータ)が三つの中心概念
- MAX と Mojo は競合せず役割分担する
次章では MAX の Python API を使った具体的なコード例を示します。
## 次に読む章
{numref}`MAX でコードを書く`({ref}`MAX でコードを書く`)へ進みます。