Transformers documentation
Apple Silicon
Apple Silicon
Apple Silicon (M serisi) çipleri, PyTorch'u Metal Performance Shaders (MPS) arka ucu üzerinden çalıştırır ve cihaz dizgesi mps'dir. CPU ve GPU, tek bir birleşik bellek havuzunu paylaşır.
MPS, standart torch kurulumuyla çalışır. Apple Silicon için mevcut PyTorch sürümleri macOS 14 veya daha yeni bir sürüm gerektirir. PyTorch'un MPS ile derlendiğinden ve GPU'yu görebildiğinden emin olun.
import torch
print(torch.backends.mps.is_available())MPS kullanıma hazır olduğunda True yazdırır.
Bir dikkat arka ucunu seçin
Bir model yüklerken attn_implementation ile dikkat (attention) arka ucunu belirleyin; bu ayar hem çıkarım hem de eğitim için geçerlidir. Modeller varsayılan olarak SDPA kullanır. PyTorch 2.13 veya daha yeni sürümlerde, MPS üzerindeki SDPA, anahtar ve değer başlıklarını önce tekrarlamadan gruplu sorgu dikkatini (grouped-query attention) doğrudan işler.
Eğitim için SDPA kullanın.
- kernels-community/metal-flash-sdpa yalnızca değişken uzunluklu girdileri, örneğin paketlenmiş dizileri veya dikkat maskesi dolgular (padding) içeren bir partiyi destekler. Dolgu içermeyen bir parti, örneğin tek bir istem (prompt), hata verir. Sorgu, anahtar ve değer projeksiyonları için gradyan hesaplamaz. MPS üzerinde flash attention istediğinizde gpt-oss otomatik olarak buna geçer.
kernelsyüklüyken ggml-org/ggml-attn,transformers serveve GGUF modelleri için varsayılandır.
Herhangi bir çekirdeği kullanmak için kernels ekini yükleyin. Transformers'ın desteklediği bir sürümü yükler.
pip install "transformers[kernels]"Çıkarım çalıştır
device_map="mps" değerini from_pretrained() fonksiyonuna iletin. device parametresini iletmezseniz pipeline() MPS'yi otomatik olarak seçer.
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'yi hedefleyen bir device_map ile Transformers, safetensors ağırlıklarını doğrudan MPS cihazına yükler.
Bir model sun
transformers serve, OpenAI ile uyumlu bir sunucu başlatır. --device seçeneğinin varsayılan değeri auto olduğu için modeller, ek bayraklar gerektirmeden MPS üzerinde yüklenir. Sunucuya ait bağımlılıkları yükleyin ve sunucuyu başlatın.
pip install "transformers[serving]"
transformers serveSunucu, bir istek modelin adını ilk kez içerdiğinde modeli yükler. http://localhost:8000 adresine bir sohbet isteği gönderin.
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 yüklendiğinde, transformers serve MPS üzerinde varsayılan olarak ggml-org/ggml-attn kullanır ve başlangıçta bir uyarı kaydeder. Bunun yerine SDPA kullanmak için --attn-implementation sdpa parametresini iletin.
Modelleri kuantize et
Model ağırlıkları, Mac'te çalışan macOS ve diğer her şeyle birleşik belleği paylaştığından, bunları kuantize etmek, çıkarım veya ince ayar için daha büyük bir modelin sığmasını sağlar. Metal, bir modeli yüklediğinizde onu kuantize ederken GGUF, zaten kuantize edilmiş kontrol noktalarını çalıştırır. İkisi de yalnızca çıkarım içindir.
- Metal, Hub'daki Metal çekirdekleriyle 2, 4 veya 8 bitle kuantize eder.
ggml-org/ggml-quantizationçekirdeği mevcut olduğunda GGUF, ağırlıkları MPS üzerinde sıkıştırılmış tutar.- bitsandbytes, yerel MPS çekirdekleriyle 4 bitleştirme (quantization) yapar.
Belleğe sığmayan bir modeli ince ayar yapmak için, modeli bitsandbytes ile 4-bit olarak yükleyin ve PEFT ile LoRA adaptörlerini eğitin.
Trainer ile Eğitim
TrainingArguments, MPS'yi algılar ve cihazı mps olarak ayarlar; bu sayede Trainer, herhangi bir cihaz ayarı yapılmadan üzerinde eğitim yapar. Hem bf16 hem de fp16 karma hassasiyet çalışır. metal-flash-sdpa, dikkat projeksiyonları için gradyan hesaplamadığından, modeli varsayılan SDPA dikkatiyle yükleyin.
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./outputs",
bf16=True,
)
print(training_args.device)Trainer GPU üzerinde eğitim yapacaksa mps yazdırır.
macOS'ta Python, varsayılan olarak spawn ile işçi süreçlerini başlatır; bu, betiğinizi yeniden içe aktarır ve picklenebilir bir veri seti ile collate_fn gerektirir. dataloader_num_workers 1'den büyük olduğunda, TrainingArguments MPS üzerinde dataloader_multiprocessing_context="fork" ayarını yapar, böylece işçiler eğitim sürecinin bir kopyasından başlatılır. Bir veri kaynağı fork-güvenli değilse bunu "spawn" olarak ayarlayın.
Graf önbellek büyümesini sınırla
MPS, gördüğü her tensör şekli için bir Metal çekirdeği derler ve bunları asla boşaltılmayan bir grafik önbelleğinde tutar. Değişken uzunluklu girdilerle eğitim, her yeni şekil için bir çekirdek ekler ve birleşik belleğin dolmasına neden olabilir.
DataCollatorWithPadding'in pad_to_multiple_of argümanını kullanarak her batch'i sabit bir uzunluğun katına kadar doldurarak şekil sayısını azaltın.
from transformers import AutoTokenizer, DataCollatorWithPadding
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B")
data_collator = DataCollatorWithPadding(tokenizer, pad_to_multiple_of=64)Bunu Trainer'a data_collator=data_collator ile iletin.
Kısıtlamalar
device_map="auto", katmanları CPU'ya taşıyamaz çünkü MPS ve CPU aynı belleği paylaşır. Taşma diske gider.- compressed-tensors FP8 checkpoint'ları MPS üzerinde yüklenir, ancak ağırlıkları ilk ileri geçişte sıkıştırması açılır; bu nedenle çıkarım sırasında belleği azaltmazlar.
- Bir Mac'in yalnızca bir cihaza sahip olması nedeniyle Tensor parallelism desteklenmez.
- Bazı PyTorch işlemlerinin henüz bir MPS uygulaması yoktur. Bu işlemleri hata fırlatmak yerine CPU üzerinde çalıştırmak için
PYTORCH_ENABLE_MPS_FALLBACK=1değerini ayarlayın.
Sonraki adımlar
- Desteklenen işlemler ve bilinen sorunlar için PyTorch MPS backend notlarını okuyun.
attn_implementation'in bir dikkat fonksiyonunu nasıl seçtiğini öğrenmek için Dikkat arka uçları kılavuzunu okuyun.- MPS üzerinde çalışan tüm kuantizasyon yöntemlerini bulmak için kuantizasyon genel bakışındaki Metal sütununu kontrol edin.