Transformers documentation
Apple Silicon
Apple Silicon
Chip Apple Silicon (dòng M) chạy PyTorch thông qua backend Metal Performance Shaders (MPS), với chuỗi thiết bị là mps. CPU và GPU chia sẻ một vùng bộ nhớ thống nhất.
MPS hoạt động với cài đặt torch tiêu chuẩn. Các bản phát hành PyTorch hiện tại cho Apple Silicon yêu cầu macOS 14 trở lên. Hãy kiểm tra xem PyTorch đã được biên dịch với MPS và có thể nhìn thấy GPU hay chưa.
import torch
print(torch.backends.mps.is_available())Nó in ra True khi MPS đã sẵn sàng để sử dụng.
Chọn một backend chú ý
Đặt backend chú ý bằng attn_implementation khi bạn tải một mô hình, và nó áp dụng cho cả suy luận và huấn luyện. Các mô hình sử dụng SDPA theo mặc định. Với PyTorch 2.13 trở lên, SDPA trên MPS xử lý trực tiếp grouped-query attention, mà không cần lặp lại các đầu key và value trước.
Sử dụng SDPA cho huấn luyện.
- kernels-community/metal-flash-sdpa chỉ hỗ trợ đầu vào có độ dài thay đổi, chẳng hạn như các chuỗi được đóng gói (packed sequences) hoặc một batch mà attention mask chứa padding. Một batch không có padding, chẳng hạn như một prompt đơn lẻ, sẽ gây ra lỗi. Nó không tính toán gradient cho các phép chiếu (projections) của query, key và value. gpt-oss sẽ tự động chuyển sang sử dụng nó khi bạn yêu cầu flash attention trên MPS.
- ggml-org/ggml-attn là mặc định cho
transformers servevà cho các mô hình GGUF khikernelsđược cài đặt.
Cài đặt phần mở rộng kernels để sử dụng bất kỳ kernel nào. Nó sẽ cài đặt phiên bản mà Transformers hỗ trợ.
pip install "transformers[kernels]"Chạy suy luận
Truyền device_map="mps" vào from_pretrained(). pipeline() sẽ tự động chọn MPS khi bạn không truyền device.
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))Với device_map nhắm đến MPS, Transformers nạp trọng số safetensors trực tiếp lên thiết bị MPS.
Cung cấp một mô hình
transformers serve khởi động một máy chủ tương thích với OpenAI. Tùy chọn --device của nó mặc định là auto, do đó nó sẽ tải các mô hình lên MPS mà không cần cờ bổ sung. Cài đặt các phụ thuộc phục vụ và khởi động máy chủ.
pip install "transformers[serving]"
transformers serveMáy chủ sẽ nạp mô hình vào lần đầu tiên một yêu cầu gọi tên nó. Gửi một yêu cầu chat đến 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}}Khi kernels được cài đặt, transformers serve mặc định sử dụng ggml-org/ggml-attn trên MPS và ghi một cảnh báo khi khởi động. Truyền --attn-implementation sdpa để sử dụng SDPA thay thế.
Lượng tử hóa mô hình
Trọng số của mô hình chia sẻ bộ nhớ thống nhất với macOS và mọi thứ khác đang chạy trên Mac, do đó việc lượng tử hóa chúng cho phép một mô hình lớn hơn vừa đủ để suy luận hoặc tinh chỉnh. Metal lượng tử hóa mô hình khi bạn tải nó, trong khi GGUF chạy các checkpoint đã được lượng tử hóa. Cả hai đều chỉ dành cho suy luận.
- Metal thực hiện lượng tử hóa xuống 2, 4 hoặc 8 bit bằng các kernel Metal từ Hub.
- GGUF giữ các trọng số được đóng gói trên MPS khi kernel
ggml-org/ggml-quantizationkhả dụng. - bitsandbytes thực hiện lượng tử hóa xuống 4 bit bằng các kernel MPS native.
Để tinh chỉnh một mô hình không vừa trong bộ nhớ, hãy tải nó ở 4-bit bằng bitsandbytes và huấn luyện các adapter LoRA với PEFT.
Huấn luyện với Trainer
TrainingArguments phát hiện MPS và đặt thiết bị thành mps, do đó Trainer huấn luyện trên thiết bị này mà không cần bất kỳ cài đặt thiết bị nào. Cả hai chế độ chính xác hỗn hợp bf16 và fp16 đều hoạt động. Hãy tải mô hình với chú ý SDPA mặc định, vì metal-flash-sdpa không tính toán gradient cho các phép chiếu chú ý.
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./outputs",
bf16=True,
)
print(training_args.device)Nó in ra mps khi Trainer sẽ huấn luyện trên GPU.
Trên macOS, Python khởi động các tiến trình worker với spawn theo mặc định, điều này sẽ nhập lại script của bạn và yêu cầu một dataset có thể picklable cùng với collate_fn. Khi dataloader_num_workers lớn hơn 1, TrainingArguments sẽ đặt dataloader_multiprocessing_context="fork" trên MPS, do đó các worker sẽ được khởi động từ một bản sao của tiến trình huấn luyện. Hãy đặt giá trị này thành "spawn" nếu nguồn dữ liệu không an toàn khi fork.
Hạn chế tăng trưởng bộ nhớ đệm đồ thị
MPS biên dịch một kernel Metal cho mỗi hình dạng tensor mà nó gặp và lưu chúng trong một bộ nhớ đệm đồ thị không bao giờ bị loại bỏ. Huấn luyện với các đầu vào có độ dài thay đổi sẽ thêm một kernel cho mỗi hình dạng mới và có thể làm cạn kiệt bộ nhớ thống nhất.
Giảm số lượng hình dạng bằng cách đệm mỗi batch lên bội số của một độ dài cố định bằng đối số pad_to_multiple_of của DataCollatorWithPadding.
from transformers import AutoTokenizer, DataCollatorWithPadding
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B")
data_collator = DataCollatorWithPadding(tokenizer, pad_to_multiple_of=64)Truyền nó vào Trainer với data_collator=data_collator.
Hạn chế
device_map="auto"không thể offload các lớp sang CPU, vì MPS và CPU dùng chung bộ nhớ. Phần tràn sẽ được ghi ra đĩa.- compressed-tensors FP8 checkpoints có thể được nạp trên MPS, nhưng trọng số của chúng sẽ được giải nén bởi lần truyền tiến đầu tiên, do đó chúng không giảm bộ nhớ trong quá trình suy luận.
- Tensor parallelism không được hỗ trợ vì Mac chỉ có một thiết bị.
- Một số thao tác PyTorch chưa có bản triển khai MPS. Đặt
PYTORCH_ENABLE_MPS_FALLBACK=1để chạy chúng trên CPU thay vì gây ra lỗi.
Các bước tiếp theo
- Đọc ghi chú về backend MPS của PyTorch để biết các thao tác được hỗ trợ và các vấn đề đã biết.
- Đọc hướng dẫn Các backend Attention để tìm hiểu cách
attn_implementationchọn một hàm attention. - Kiểm tra cột Metal trong tổng quan về lượng tử hóa để tìm tất cả các phương pháp lượng tử hóa chạy trên MPS.