# Apple Silicon

Apple Silicon (Mシリーズ) チップは、[Metal Performance Shaders (MPS)](https://docs.pytorch.org/docs/stable/notes/mps.html) バックエンドを介して PyTorch を実行し、デバイス文字列は `mps` です。CPU と GPU は、1 つのユニファイドメモリプールを共有します。

MPSは標準的な`torch`インストールで動作します。Apple Silicon向けの現在のPyTorchリリースでは、macOS 14以降が必要です。PyTorchがMPS対応でビルドされており、GPUを認識できることを確認してください。

```py
import torch

print(torch.backends.mps.is_available())
```

MPSが使用可能になると`True`が出力されます。

## アテンションバックエンドを選択

モデルの読み込み時に`attn_implementation`でアテンションバックエンドを設定すると、推論と学習の両方に適用されます。モデルはデフォルトで[SDPA](./attention_interface)を使用します。PyTorch 2.13以降では、MPS上のSDPAは、キーとバリューのヘッドを先に複製することなく、グループクエリアテンションを直接処理します。

学習にSDPAを使用します。

- [kernels-community/metal-flash-sdpa](https://huggingface.co/kernels-community/metal-flash-sdpa) は、パックされたシーケンスやアテンションマスクにパディングを含むバッチなど、可変長の入力のみをサポートします。単一のプロンプトのようなパディングのないバッチではエラーが発生します。クエリ、キー、バリューの射影に対する勾配は計算されません。[gpt-oss](./model_doc/gpt_oss) は、MPS でフラッシュアテンションを要求した場合に自動的に切り替わります。
- `kernels` がインストールされている場合、[ggml-org/ggml-attn](https://huggingface.co/kernels/ggml-org/ggml-attn) は `transformers serve` および [GGUF](./quantization/gguf#attention) モデルのデフォルトです。

どちらかのカーネルを使用するには、`kernels`エクストラをインストールしてください。Transformersがサポートするバージョンがインストールされます。

```bash
pip install "transformers[kernels]"
```

## 推論を実行する

`device_map="mps"` を [from_pretrained()](/docs/transformers/main/ja/main_classes/model#transformers.PreTrainedModel.from_pretrained) に渡します。`device` を渡さない場合、[pipeline()](/docs/transformers/main/ja/main_classes/pipelines#transformers.pipeline) は自動的に MPS を選択します。

```py
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B", device_map="mps")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B")

inputs = tokenizer("Apple Silicon is", return_tensors="pt")
output = model.generate(**inputs, max_new_tokens=50, do_sample=False)
print(tokenizer.decode(output[0], skip_special_tokens=True))
```

MPSをターゲットとする`device_map`を使用すると、Transformersはsafetensorsの重みをMPSデバイスに直接読み込みます。

### モデルのサービング

[transformers serve](./serve-cli/serving) は OpenAI 互換のサーバーを起動します。`--device` オプションのデフォルト値は `auto` であるため、追加のフラグなしでモデルを MPS にロードできます。サービング用の依存関係をインストールし、サーバーを起動してください。

```bash
pip install "transformers[serving]"
transformers serve
```

サーバーは、リクエストでモデル名が指定された最初のときにモデルを読み込みます。`http://localhost:8000` にチャットリクエストを送信してください。

```bash
curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen/Qwen2.5-0.5B-Instruct",
    "messages": [{"role": "user", "content": "What is Apple Silicon? Answer in one sentence."}],
    "max_tokens": 64,
    "temperature": 0
  }'
```

```json
{"id":"b48e84c1-b3c6-484d-b781-4c9ce8022dff","choices":[{"finish_reason":"stop","index":0,"message":{"content":"Apple Silicon is a type of processor technology developed and manufactured by Apple Inc., designed to offer faster performance and lower power consumption compared to traditional silicon-based processors. This technology allows for the creation of more efficient and energy-efficient devices, such as high-performance computers, smartphones, and other Apple products.","role":"assistant"}}],"created":1791843839,"model":"Qwen/Qwen2.5-0.5B-Instruct@main","object":"chat.completion","usage":{"completion_tokens":59,"prompt_tokens":39,"total_tokens":98}}
```

`kernels` がインストールされている場合、`transformers serve` は MPS 上でデフォルトとして [ggml-org/ggml-attn](https://huggingface.co/kernels/ggml-org/ggml-attn) を使用し、起動時に警告を出力します。代わりに SDPA を使用するには、`--attn-implementation sdpa` を渡してください。

## モデルの量子化

モデルの重みは、macOSおよびMac上で実行されている他のすべてのプロセスと統一メモリを共有するため、量子化を行うことで、推論やファインチューニングのためにより大きなモデルを収容できます。Metalはモデルを読み込む際に量子化を実行しますが、GGUFはすでに量子化済みのチェックポイントを動作させます。どちらも推論専用です。

- [Metal](./quantization/metal)は、HubからのMetalカーネルを使用して2、4、または8ビットに量子化します。
- `ggml-org/ggml-quantization` カーネルが利用可能な場合、[GGUF](./quantization/gguf) は MPS 上で重みをパックした状態に保ちます。
- [bitsandbytes](./quantization/bitsandbytes)は、ネイティブのMPSカーネルを使用して4ビットに量子化します。

メモリに収まらないモデルをファインチューニングするには、bitsandbytes を使用して 4-bit で読み込み、[PEFT](./peft) で LoRA アダプターを学習します。

## Trainerで学習

[TrainingArguments](/docs/transformers/main/ja/main_classes/trainer#transformers.TrainingArguments)はMPSを検出し、デバイスを`mps`に設定するため、[Trainer](/docs/transformers/main/ja/main_classes/trainer#transformers.Trainer)はデバイス設定なしでMPS上で学習を実行します。bf16とfp16の混合精度の両方が動作します。[metal-flash-sdpa](#choose-an-attention-backend)はアテンションの射影の勾配を計算しないため、モデルはデフォルトのSDPAアテンションで読み込む必要があります。

```py
from transformers import TrainingArguments

training_args = TrainingArguments(
    output_dir="./outputs",
    bf16=True,
)
print(training_args.device)
```

`Trainer`がGPUでトレーニングを行う場合、`mps`が出力されます。

macOS では、Python はデフォルトで `spawn` を使用してワーカープロセスを起動します。これによりスクリプトが再インポートされるため、ピクルス化可能なデータセットと `collate_fn` が必要です。`dataloader_num_workers` が 1 より大きい場合、[TrainingArguments](/docs/transformers/main/ja/main_classes/trainer#transformers.TrainingArguments) は MPS 上で `dataloader_multiprocessing_context="fork"` を設定し、ワーカーはトレーニングプロセスのコピーから起動されます。データソースが fork 安全でない場合は、`"spawn"` に設定してください。

### グラフキャッシュの増加を制限する

MPS は、確認した各テンソル形状に対して Metal カーネルをコンパイルし、それらを決して削除されないグラフキャッシュに保持します。可変長の入力での学習では、新しい形状ごとにカーネルが追加され、ユニファイドメモリが不足する可能性があります。

[DataCollatorWithPadding](/docs/transformers/main/ja/main_classes/data_collator#transformers.DataCollatorWithPadding) の `pad_to_multiple_of` 引数を使用して、各バッチを固定長の倍数にパディングし、形状の数を減らします。

```py
from transformers import AutoTokenizer, DataCollatorWithPadding

tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B")
data_collator = DataCollatorWithPadding(tokenizer, pad_to_multiple_of=64)
```

`Trainer`に`data_collator=data_collator`を指定して渡します。

## 制限事項

- `device_map="auto"` では、MPS と CPU が同じメモリを共有しているため、レイヤーを CPU にオフロードできません。オーバーフローはディスクに書き出されます。
- [compressed-tensors](./quantization/compressed_tensors)のFP8チェックポイントはMPS上で読み込めますが、最初のフォワードパスで重みが展開されるため、推論時のメモリ削減にはなりません。
- Macには1つのデバイスしか存在しないため、Tensor parallelismはサポートされていません。
- 一部の PyTorch 操作にはまだ MPS 実装がありません。エラーを発生させる代わりに CPU で実行するには、`PYTORCH_ENABLE_MPS_FALLBACK=1` を設定してください。

## 次のステップ

- サポートされている操作と既知の問題については、PyTorchの[MPSバックエンド](https://docs.pytorch.org/docs/stable/notes/mps.html)のメモをお読みください。
- `attn_implementation`がどのようにアテンション関数を選択するかを学ぶには、[Attention backends](./attention_interface)ガイドをお読みください。
- [量子化の概要](./quantization/overview)のMetal列を確認し、MPSで実行可能なすべての量子化方法を見つけてください。

