Transformers documentation
Apple Silicon
Apple Silicon
Apple Silicon (Mシリーズ) チップは、Metal Performance Shaders (MPS) バックエンドを介して PyTorch を実行し、デバイス文字列は mps です。CPU と GPU は、1 つのユニファイドメモリプールを共有します。
MPSは標準的なtorchインストールで動作します。Apple Silicon向けの現在のPyTorchリリースでは、macOS 14以降が必要です。PyTorchがMPS対応でビルドされており、GPUを認識できることを確認してください。
import torch
print(torch.backends.mps.is_available())MPSが使用可能になるとTrueが出力されます。
アテンションバックエンドを選択
モデルの読み込み時にattn_implementationでアテンションバックエンドを設定すると、推論と学習の両方に適用されます。モデルはデフォルトでSDPAを使用します。PyTorch 2.13以降では、MPS上のSDPAは、キーとバリューのヘッドを先に複製することなく、グループクエリアテンションを直接処理します。
学習にSDPAを使用します。
- kernels-community/metal-flash-sdpa は、パックされたシーケンスや、アテンションマスクにパディングを含むバッチなど、可変長の入力のみをサポートしています。単一のプロンプトのようなパディングのないバッチでは、エラーが発生します。クエリ、キー、バリューの射影に対する勾配は計算されません。gpt-oss は、MPS 上でフラッシュアテンションを要求した場合に、自動的にこれに切り替わります。
kernelsがインストールされている場合、ggml-org/ggml-attn はtransformers serveおよび GGUF モデルのデフォルトです。
どちらかのカーネルを使用するには、kernelsエクストラをインストールしてください。Transformersがサポートするバージョンがインストールされます。
pip install "transformers[kernels]"推論を実行する
device_map="mps" を from_pretrained() に渡します。device を渡さない場合、pipeline() は自動的に MPS を選択します。
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 は OpenAI 互換のサーバーを起動します。--device オプションのデフォルト値は auto であるため、追加のフラグなしでモデルを MPS にロードできます。サービング用の依存関係をインストールし、サーバーを起動してください。
pip install "transformers[serving]"
transformers serveサーバーは、リクエストでモデル名が指定された最初のときにモデルを読み込みます。http://localhost:8000 にチャットリクエストを送信してください。
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
}'{"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 を使用し、起動時に警告を出力します。代わりに SDPA を使用するには、--attn-implementation sdpa を渡してください。
モデルの量子化
モデルの重みは、macOSおよびMac上で実行されている他のすべてのプロセスと統一メモリを共有するため、量子化を行うことで、推論やファインチューニングのためにより大きなモデルを収容できます。Metalはモデルを読み込む際に量子化を実行しますが、GGUFはすでに量子化済みのチェックポイントを動作させます。どちらも推論専用です。
- Metalは、HubからのMetalカーネルを使用して2、4、または8ビットに量子化します。
ggml-org/ggml-quantizationカーネルが利用可能な場合、GGUF は MPS 上で重みをパックした状態に保ちます。- bitsandbytesは、ネイティブのMPSカーネルを使用して4ビットに量子化します。
メモリに収まらないモデルをファインチューニングするには、bitsandbytes を使用して 4-bit で読み込み、PEFT で LoRA アダプターを学習します。
Trainerで学習
TrainingArgumentsはMPSを検出し、デバイスをmpsに設定するため、Trainerはデバイス設定なしでMPS上で学習を実行します。bf16とfp16の混合精度の両方が動作します。metal-flash-sdpaはアテンションの射影の勾配を計算しないため、モデルはデフォルトのSDPAアテンションで読み込む必要があります。
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は MPS 上でdataloader_multiprocessing_context="fork"を設定するため、ワーカーは学習プロセスのコピーから起動されます。データソースが fork 安全でない場合は、"spawn"に設定してください。
グラフキャッシュの増加を制限する
MPS は、確認した各テンソル形状に対して Metal カーネルをコンパイルし、それらを決して削除されないグラフキャッシュに保持します。可変長の入力での学習では、新しい形状ごとにカーネルが追加され、ユニファイドメモリが不足する可能性があります。
pad_to_multiple_of 引数を使用して、DataCollatorWithPadding によって各バッチを固定長の倍数にパディングし、形状の数を減らします。
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のFP8チェックポイントはMPSで読み込むことができますが、最初のフォワードパスで重みが展開されるため、推論時のメモリ削減にはなりません。
- Macには1つのデバイスしか存在しないため、Tensor parallelismはサポートされていません。
- 一部の PyTorch 操作にはまだ MPS 実装がありません。エラーを発生させる代わりに CPU で実行するには、
PYTORCH_ENABLE_MPS_FALLBACK=1を設定してください。
次のステップ
- サポートされている操作と既知の問題については、PyTorchのMPSバックエンドのメモをお読みください。
attn_implementationがどのようにアテンション関数を選択するかを学ぶには、Attention backendsガイドをお読みください。- 量子化の概要のMetal列を確認し、MPSで実行可能なすべての量子化方法を見つけてください。