Trong môi trường macOS sử dụng chip Apple Silicon (M1, M2, M3...), thay vì dùng cuda, bạn cần sử dụng backend Metal Performance Shaders (MPS) của PyTorch. Tuy nhiên, có một điểm cực kỳ quan trọng cần lưu ý đó là thiết lập torch_dtype.

MPS là gì?

  • MPS là khung (framework) tăng tốc GPU do Apple cung cấp.
  • PyTorch bắt đầu hỗ trợ backend MPS từ phiên bản 1.12.
  • Trên Apple Silicon, bạn phải sử dụng torch.mps thay vì torch.cuda.
import torch

# Thiết lập thiết bị (device)
device = torch.device("mps" if torch.backends.mps.is_available() else "cpu")
Mẹo nhỏ: Bạn có thể sử dụng hàm kiểm tra thiết bị sau đây để đảm bảo code chạy ổn định trên mọi môi trường:
def get_device():
    device = torch.device("cpu")
    if torch.cuda.is_available():
        print("Sẵn sàng sử dụng CUDA")
        device = torch.device("cuda")
    elif torch.backends.mps.is_available():
        print("Sẵn sàng sử dụng MPS")
        device = torch.device("mps")
    else:
        print("Không tìm thấy CUDA hay MPS, sử dụng CPU.")
    return device

Các kiểu dữ liệu (torch_dtype) được khuyến nghị trên MPS

Screenshot 2026-02-06 134854.png
Ví dụ thiết lập an toàn:
# float32 là lựa chọn an toàn nhất trên MPS
x = torch.ones((2, 2), device=device, dtype=torch.float32)

Lưu ý khi sử dụng float16

Mặc dù bạn có thể khai báo dtype=torch.float16, nhưng code có thể gặp phải các vấn đề sau:
  • Lỗi thực thi: RuntimeError: Float16 is not supported on MPS.
  • Kết quả tính toán không chính xác.
  • Hiệu suất giảm hoặc hệ thống tự động chuyển về dùng CPU (fallback).
  • Nếu bắt buộc phải dùng float16, bạn nên cân nhắc sử dụng môi trường hỗ trợ CUDA để đảm bảo tính ổn định.

Mẫu code an toàn khi dùng MPS và torch_dtype

import torch

device = torch.device("mps" if torch.backends.mps.is_available() else "cpu")
dtype = torch.float32 # Kiểu dữ liệu được hỗ trợ ổn định nhất trên MPS

x = torch.randn((3, 3), device=device, dtype=dtype)
model = MyModel().to(device=device, dtype=dtype)

Kết luận

  • Trên macOS, hãy dùng MPS thay cho CUDA.
  • Nên sử dụng torch.float32 làm kiểu dữ liệu mặc định để đảm bảo an toàn nhất.
  • Cần thận trọng khi dùng float16 và tránh dùng bfloat16 vì chưa được hỗ trợ tốt.
  • MPS hiện vẫn còn một số hạn chế so với CUDA, vì vậy nó phù hợp cho việc chạy mô hình (inference) hơn là huấn luyện (training).

Mẹo tối ưu hiệu suất PyTorch trên môi trường MPS

  • Sử dụng PyTorch mới nhất: Khuyến nghị phiên bản 2.1 trở lên để có sự hỗ trợ tính toán tốt nhất.
  • Điều chỉnh Batch size: Do bộ nhớ GPU hạn chế, hãy dùng batch size nhỏ (ví dụ: 4~32).
  • Thu nhỏ kích thước đầu vào: Giảm độ phân giải hình ảnh hoặc độ dài âm thanh khi xử lý.
  • Dọn dẹp bộ nhớ:
import gc
import torch

# Giải phóng bộ nhớ thủ công
if torch.backends.mps.is_available():
    torch.mps.empty_cache()
gc.collect()
  • Cân nhắc dùng CoreML: Để có hiệu suất chạy mô hình (inference) tốt nhất trên Mac, bạn có thể chuyển đổi mô hình PyTorch sang định dạng CoreM
Nguồn bài viết ryukato.github.io