この記事の対象読者
- Macで機械学習やディープラーニングを始めたい方
- 「eGPUを買えばMacでもCUDAが使える」と思っている方
- PyTorchやTensorFlowの環境構築で悩んでいる方
- Apple SiliconとIntel Macの違いを理解したい方
この記事で得られること
- eGPUの仕組みと、MacでCUDAが使えない技術的・歴史的背景の理解
- 自分のMacがeGPUに対応しているか確認するコード
- Mac環境での機械学習における現実的な代替手段と設定ファイル
- 「無駄な出費を避ける」ための判断材料
この記事で扱わないこと
- Windows/LinuxでのeGPUセットアップ手順
- Hackintoshの構築方法
- GPUの詳細なハードウェアアーキテクチャ
1. eGPUとの出会い—そして絶望
「MacでCUDAを動かしたい」
RTX 5090を積んだWindows PCを組んだ私は、ふと思った。「Thunderbolt経由でeGPUを繋げば、MacBook Proでもディープラーニングできるんじゃないか?」と。
調べてみると、eGPU(external GPU)という製品が存在する。Razer Core X、Sonnet Breakaway Box、AKiTiO Node Titan...。Thunderbolt 3ケーブル一本で、ノートPCに外付けGPUの演算パワーを追加できる夢のデバイスだ。
「これだ!」と興奮して調査を進めた私を待っていたのは、3つの残酷な現実だった。
- Apple Silicon(M1/M2/M3/M4)はeGPUを一切サポートしない
- Intel MacでもNVIDIA GPUはmacOS Mojave以降で使えない
- CUDAはNVIDIA専用技術なので、AMD GPUでは動かない
つまり、「MacでeGPU経由でCUDA」は、2026年現在ほぼ不可能なのだ。
この記事では、同じ轍を踏もうとしているMacユーザーを救うべく、なぜこの組み合わせが成立しないのかを技術的・歴史的背景から解説する。そして、Macで機械学習をするための現実的な代替手段を提示する。
ここまでで、なぜこの記事が必要なのか理解できたはずだ。次は、eGPUとCUDAの基本概念を整理しよう。
2. 前提知識の確認
本題に入る前に、この記事で使う用語を整理しておく。
2.1 eGPU(external GPU)とは
eGPUは「外付けグラフィックスカード」のこと。Thunderbolt 3/4ケーブルを通じて、デスクトップ用のGPUをノートPCに接続する仕組みだ。エンクロージャ(筐体)にGPUを挿し、PCと接続することで、ノートPC単体では得られないグラフィックス性能を実現できる。
2.2 CUDAとは
CUDA(Compute Unified Device Architecture)は、NVIDIAが開発したGPU向け並列コンピューティングプラットフォームだ。PyTorch、TensorFlow、JAXといった主要な機械学習フレームワークは、CUDAを通じてNVIDIA GPUの演算能力を活用する。重要なのは、CUDAはNVIDIA独自の技術であり、AMD GPUやApple Silicon GPUでは動作しないという点だ。
2.3 Thunderboltとは
Thunderboltは、IntelとAppleが共同開発した高速データ転送規格だ。Thunderbolt 3/4は最大40Gbpsの帯域幅を持ち、PCIeトンネリングによってeGPUのような外部デバイスとの通信を可能にする。USB-Cと同じコネクタ形状だが、全く別の規格である点に注意が必要だ。
2.4 Metalとは
Metalは、Appleが開発したグラフィックスおよびGPUコンピューティングAPI(Application Programming Interface)だ。macOS、iOS、iPadOSで動作し、Apple Silicon GPUとAMD GPUをサポートする。CUDAの代替として機能するが、NVIDIAとの互換性は一切ない。
これらの用語が押さえられたら、次に進もう。
3. eGPUが生まれた背景—そしてAppleとNVIDIAの決裂
3.1 eGPUの誕生と普及
eGPUの概念自体は2000年代から存在したが、一般に普及したのはThunderbolt 3が登場した2015年以降だ。Appleは2017年のWWDCでeGPUサポートを正式発表し、macOS High Sierra 10.13.4からIntel Mac + AMD GPUの組み合わせを公式サポートした。
当時、MacBook Proのグラフィックス性能に不満を持つクリエイターやゲーマーにとって、eGPUは救世主だった。
3.2 AppleとNVIDIAの蜜月時代
実は、AppleとNVIDIAにはかつて良好な関係があった。2001年、Macintoshは世界で初めてGeForce 3を搭載したプラットフォームだった。2008年のMacBook Proには、NVIDIA製チップセットが採用され、グラフィックス性能の飛躍的向上に貢献した。
3.3 決裂の始まり—ハンダ問題と訴訟
2008年、NVIDIAのGPUに使用された鉛フリーハンダに起因する不良が発生し、大量のMacBook Proが故障した。Appleはリコール対応を強いられ、両社の関係は急速に冷え込んだ。
その後、AppleはGPUの調達先をAMDに切り替え始めた。公式には「AMDの方が電力効率が良い」とされたが、業界ではNVIDIAとの確執が主因と見られている。
3.4 macOS MojaveでのNVIDIAドライバ排除
2018年、macOS Mojave(10.14)がリリースされた際、AppleはNVIDIA Web Driverの署名を拒否した。これにより、サードパーティのNVIDIA GPUはmacOS Mojave以降で完全に使用不能となった。
NVIDIAは自社フォーラムで「Appleがドライバの署名を承認しない」と公式に発表。両社の対立は決定的となった。
3.5 CUDA 10.2が最後のmacOSサポート
2019年11月、NVIDIAは「CUDA 10.2がmacOSをサポートする最後のバージョン」と発表した。これにより、macOSでCUDAを使う道は事実上閉ざされた。
"CUDA 10.2 (Toolkit and NVIDIA driver) is the last release to support macOS for developing and running CUDA applications."
— NVIDIA CUDA Toolkit Release Notes
背景がわかったところで、抽象的な概念から具体的な技術制約に話を進めよう。
4. MacでeGPU + CUDAを使えない3つの壁
4.1 壁①:Apple Silicon(M1/M2/M3/M4)はeGPUを完全に非サポート
Appleの公式サポートページには、明確にこう記載されている。
"To use an eGPU, a Mac with an Intel processor is required."
— Apple Support: Use an external graphics processor with your Mac
Apple Siliconは、CPU、GPU、Neural Engine、メモリを1つのSoC(System on a Chip)に統合したアーキテクチャだ。この統合設計により、外部GPUを追加する余地がアーキテクチャレベルで存在しない。
| Mac種別 | eGPUサポート |
|---|---|
| M1/M2/M3/M4 Mac | 非対応 |
| Intel Mac (Thunderbolt 3) | 対応(AMDのみ) |
| Intel Mac (Thunderbolt 2以前) | 非公式・要ハック |
4.2 壁②:Intel MacでもNVIDIA GPUはmacOS Mojave以降で使用不可
仮にIntel Macを持っていても、NVIDIAのeGPUは使えない。理由は前述の通り、AppleがNVIDIA Web Driverの署名を拒否しているからだ。
| macOSバージョン | NVIDIA GPUサポート |
|---|---|
| High Sierra (10.13)以前 | Web Driver経由で動作 |
| Mojave (10.14)以降 | 完全に非対応 |
2026年現在、High Sierraはセキュリティアップデートも終了しており、実用的な選択肢ではない。
4.3 壁③:CUDAはNVIDIA専用—AMD GPUでは動作しない
「じゃあAMD GPUのeGPUを買えばいいのでは?」と思うかもしれない。
確かに、Intel Mac + AMD GPU(例:Radeon RX 6800)の組み合わせはmacOSで公式サポートされている。しかし、CUDAはNVIDIA独自技術であり、AMD GPUでは一切動作しない。
PyTorchやTensorFlowのcuda()や.to("cuda")は、NVIDIA GPUでのみ機能する。AMD GPUでは代わりにROCm(Radeon Open Compute)という別のスタックが必要だが、ROCmはmacOSをサポートしていない。
| フレームワーク | NVIDIA (CUDA) | AMD (ROCm) | Apple Silicon (Metal/MPS) |
|---|---|---|---|
| PyTorch | 完全サポート | Linux版のみ | MPSバックエンド |
| TensorFlow | 完全サポート | Linux版のみ | tensorflow-metal |
| JAX | 完全サポート | 実験的 | jax-metal |
ここまでで、MacでeGPU + CUDAが成立しない理由が明確になった。次は、実際にコードで自分の環境を確認してみよう。
5. 実際に確認してみよう—環境診断スクリプト
5.1 環境構築
以下の手順で診断環境を構築する。
# 仮想環境の作成(推奨)
python3 -m venv egpu-check
source egpu-check/bin/activate
# 必要なパッケージのインストール
pip install torch psutil
5.2 診断スクリプト
以下のスクリプトをコピーして実行すると、自分のMac環境でGPUが使えるかどうかを診断できる。
#!/usr/bin/env python3
"""
Mac GPU環境診断スクリプト
使い方: python check_gpu_environment.py
"""
import platform
import subprocess
import sys
def get_mac_chip_info():
"""Macのチップ情報を取得"""
try:
result = subprocess.run(
["sysctl", "-n", "machdep.cpu.brand_string"],
capture_output=True,
text=True
)
cpu_brand = result.stdout.strip()
# Apple Silicon判定
arch = platform.machine()
is_apple_silicon = arch == "arm64"
return {
"cpu_brand": cpu_brand,
"architecture": arch,
"is_apple_silicon": is_apple_silicon
}
except Exception as e:
return {"error": str(e)}
def check_cuda_availability():
"""CUDA利用可能性をチェック"""
try:
import torch
cuda_available = torch.cuda.is_available()
cuda_device_count = torch.cuda.device_count() if cuda_available else 0
cuda_version = torch.version.cuda if cuda_available else None
return {
"cuda_available": cuda_available,
"device_count": cuda_device_count,
"cuda_version": cuda_version
}
except ImportError:
return {"error": "PyTorch not installed"}
def check_mps_availability():
"""MPS (Metal Performance Shaders) 利用可能性をチェック"""
try:
import torch
mps_available = torch.backends.mps.is_available()
mps_built = torch.backends.mps.is_built()
return {
"mps_available": mps_available,
"mps_built": mps_built
}
except ImportError:
return {"error": "PyTorch not installed"}
except AttributeError:
return {"mps_available": False, "mps_built": False, "note": "PyTorch version too old"}
def check_egpu_possibility():
"""eGPU利用可能性を判定"""
mac_info = get_mac_chip_info()
if mac_info.get("is_apple_silicon"):
return {
"egpu_possible": False,
"reason": "Apple Silicon MacはeGPUを一切サポートしていません",
"recommendation": "MPS (Metal) バックエンドまたはMLXを使用してください"
}
else:
return {
"egpu_possible": True,
"reason": "Intel MacはAMD GPUのeGPUをサポートしています",
"warning": "ただしNVIDIA GPUはmacOS Mojave以降で使用できません",
"recommendation": "CUDAが必要な場合はBoot Camp (Windows)の使用を検討してください"
}
def main():
print("=" * 60)
print("Mac GPU環境診断レポート")
print("=" * 60)
# Mac情報
print("\n【Macハードウェア情報】")
mac_info = get_mac_chip_info()
print(f" CPU: {mac_info.get('cpu_brand', 'Unknown')}")
print(f" アーキテクチャ: {mac_info.get('architecture', 'Unknown')}")
print(f" Apple Silicon: {'はい' if mac_info.get('is_apple_silicon') else 'いいえ'}")
# CUDA
print("\n【CUDA (NVIDIA GPU) サポート】")
cuda_info = check_cuda_availability()
if "error" in cuda_info:
print(f" エラー: {cuda_info['error']}")
else:
print(f" CUDA利用可能: {'はい' if cuda_info['cuda_available'] else 'いいえ'}")
if cuda_info['cuda_available']:
print(f" CUDAバージョン: {cuda_info['cuda_version']}")
print(f" 検出されたGPU数: {cuda_info['device_count']}")
# MPS
print("\n【MPS (Metal) サポート】")
mps_info = check_mps_availability()
if "error" in mps_info:
print(f" エラー: {mps_info['error']}")
else:
print(f" MPS利用可能: {'はい' if mps_info['mps_available'] else 'いいえ'}")
print(f" MPSビルド済み: {'はい' if mps_info['mps_built'] else 'いいえ'}")
# eGPU判定
print("\n【eGPU利用可能性判定】")
egpu_info = check_egpu_possibility()
print(f" eGPU利用可能: {'はい' if egpu_info['egpu_possible'] else 'いいえ'}")
print(f" 理由: {egpu_info['reason']}")
if egpu_info.get('warning'):
print(f" 警告: {egpu_info['warning']}")
print(f" 推奨: {egpu_info['recommendation']}")
# 結論
print("\n" + "=" * 60)
print("【結論】")
if mac_info.get("is_apple_silicon"):
print(" あなたのMacはApple Siliconです。")
print(" eGPU経由でのCUDA利用は不可能です。")
print(" 代替手段: MPS、MLX、クラウドGPU")
else:
print(" あなたのMacはIntel Macです。")
print(" AMD eGPUは使用可能ですが、CUDAは使えません。")
print(" 代替手段: Boot Camp、クラウドGPU")
print("=" * 60)
if __name__ == "__main__":
main()
5.3 実行結果の例
上記のスクリプトを実行すると、以下のような出力が得られる。
============================================================
Mac GPU環境診断レポート
============================================================
【Macハードウェア情報】
CPU: Apple M3 Pro
アーキテクチャ: arm64
Apple Silicon: はい
【CUDA (NVIDIA GPU) サポート】
CUDA利用可能: いいえ
【MPS (Metal) サポート】
MPS利用可能: はい
MPSビルド済み: はい
【eGPU利用可能性判定】
eGPU利用可能: いいえ
理由: Apple Silicon MacはeGPUを一切サポートしていません
推奨: MPS (Metal) バックエンドまたはMLXを使用してください
============================================================
【結論】
あなたのMacはApple Siliconです。
eGPU経由でのCUDA利用は不可能です。
代替手段: MPS、MLX、クラウドGPU
============================================================
5.4 よくあるエラーと対処法
| エラー | 原因 | 対処法 |
|---|---|---|
ModuleNotFoundError: No module named 'torch' |
PyTorch未インストール |
pip install torch を実行 |
AttributeError: module 'torch.backends' has no attribute 'mps' |
PyTorchバージョンが古い |
pip install --upgrade torch を実行 |
| MPS利用可能だがモデルが動かない | macOSバージョンが古い | macOS 12.3以上にアップグレード |
基本的な環境確認ができたので、次は実践的なユースケースごとの代替手段を見ていこう。
6. ユースケース別ガイド—Macで機械学習をする現実的な方法
eGPU + CUDAが使えないことはわかった。では、Macユーザーはどうすればいいのか?ユースケース別に具体的な代替手段を紹介する。
6.1 ユースケース1:LLMのローカル推論(Ollama、llama.cpp)
想定読者: ローカルでLLMを動かしたい、プライバシーを重視する方
推奨構成: MLX + Ollama
Apple Siliconの統合メモリは、大規模モデルのロードに有利だ。M3 Maxの128GB RAMなら、量子化された70Bモデルもローカルで動作する。
環境設定ファイル(開発用)
# config.development.yaml - MLX-LM開発環境用
# このままコピーして使える設定ファイル
environment:
name: "mlx-llm-dev"
python_version: "3.11"
model:
name: "mlx-community/Llama-3.2-3B-Instruct-4bit"
quantization: "4bit"
max_tokens: 2048
temperature: 0.7
hardware:
device: "mps" # Apple Silicon GPU
memory_limit_gb: 24 # 開発時は控えめに
logging:
level: "DEBUG"
file: "./logs/dev.log"
環境設定ファイル(本番用)
# config.production.yaml - MLX-LM本番環境用
# このままコピーして使える設定ファイル
environment:
name: "mlx-llm-prod"
python_version: "3.11"
model:
name: "mlx-community/Llama-3.2-3B-Instruct-4bit"
quantization: "4bit"
max_tokens: 4096
temperature: 0.3 # 安定性重視
hardware:
device: "mps"
memory_limit_gb: 64 # 本番はRAMをフル活用
logging:
level: "INFO"
file: "/var/log/mlx-llm/app.log"
環境設定ファイル(テスト用)
# config.test.yaml - MLX-LMテスト環境用
# CI/CDで使用する軽量設定
environment:
name: "mlx-llm-test"
python_version: "3.11"
model:
name: "mlx-community/Llama-3.2-1B-Instruct-4bit" # 軽量モデル
quantization: "4bit"
max_tokens: 256
temperature: 0.0 # 再現性重視
hardware:
device: "cpu" # CI環境はCPUのみの場合も
memory_limit_gb: 8
logging:
level: "WARNING"
file: "./test_logs/test.log"
サンプルコード
#!/usr/bin/env python3
"""
MLX-LMを使ったLLM推論サンプル
必要なパッケージ: pip install mlx-lm pyyaml
"""
import yaml
from pathlib import Path
def load_config(config_path: str = "config.development.yaml") -> dict:
"""設定ファイルを読み込む"""
with open(config_path, "r") as f:
return yaml.safe_load(f)
def run_inference(prompt: str, config: dict) -> str:
"""MLX-LMで推論を実行"""
from mlx_lm import load, generate
model_name = config["model"]["name"]
max_tokens = config["model"]["max_tokens"]
temperature = config["model"]["temperature"]
print(f"モデルをロード中: {model_name}")
model, tokenizer = load(model_name)
print(f"推論実行中...")
response = generate(
model,
tokenizer,
prompt=prompt,
max_tokens=max_tokens,
temp=temperature
)
return response
def main():
# 設定ファイルの読み込み
config_path = Path("config.development.yaml")
if not config_path.exists():
print("設定ファイルが見つかりません。デフォルト設定を使用します。")
config = {
"model": {
"name": "mlx-community/Llama-3.2-1B-Instruct-4bit",
"max_tokens": 256,
"temperature": 0.7
}
}
else:
config = load_config(str(config_path))
# 推論実行
prompt = "Pythonでフィボナッチ数列を生成する関数を書いてください。"
response = run_inference(prompt, config)
print(f"\n応答:\n{response}")
if __name__ == "__main__":
main()
6.2 ユースケース2:PyTorchでのモデル訓練
想定読者: 自作モデルを訓練したい研究者・学生
推奨構成: PyTorch + MPS (Metal Performance Shaders)
PyTorch 1.12以降、MPSバックエンドが正式サポートされた。CUDAほどの性能は出ないが、CPUよりは大幅に高速だ。
サンプルコード
#!/usr/bin/env python3
"""
PyTorch MPS バックエンドでのモデル訓練サンプル
必要なパッケージ: pip install torch torchvision
"""
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
def get_device():
"""利用可能な最適なデバイスを取得"""
if torch.cuda.is_available():
return torch.device("cuda")
elif torch.backends.mps.is_available():
return torch.device("mps")
else:
return torch.device("cpu")
class SimpleCNN(nn.Module):
"""シンプルなCNNモデル"""
def __init__(self, num_classes: int = 10):
super().__init__()
self.features = nn.Sequential(
nn.Conv2d(1, 32, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
)
self.classifier = nn.Sequential(
nn.Flatten(),
nn.Linear(64 * 7 * 7, 128),
nn.ReLU(),
nn.Linear(128, num_classes),
)
def forward(self, x):
x = self.features(x)
x = self.classifier(x)
return x
def train_one_epoch(model, dataloader, criterion, optimizer, device):
"""1エポックの訓練を実行"""
model.train()
total_loss = 0.0
correct = 0
total = 0
for batch_idx, (data, target) in enumerate(dataloader):
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
total_loss += loss.item()
_, predicted = output.max(1)
total += target.size(0)
correct += predicted.eq(target).sum().item()
if batch_idx % 100 == 0:
print(f" Batch {batch_idx}: Loss={loss.item():.4f}")
accuracy = 100.0 * correct / total
avg_loss = total_loss / len(dataloader)
return avg_loss, accuracy
def main():
# デバイス設定
device = get_device()
print(f"使用デバイス: {device}")
# データセット準備
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
train_dataset = datasets.MNIST(
root="./data",
train=True,
download=True,
transform=transform
)
train_loader = DataLoader(
train_dataset,
batch_size=64,
shuffle=True
)
# モデル、損失関数、オプティマイザの設定
model = SimpleCNN().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 訓練実行
num_epochs = 3
for epoch in range(num_epochs):
print(f"\nEpoch {epoch + 1}/{num_epochs}")
loss, accuracy = train_one_epoch(
model, train_loader, criterion, optimizer, device
)
print(f" 平均損失: {loss:.4f}, 精度: {accuracy:.2f}%")
# モデル保存
torch.save(model.state_dict(), "model_mps.pth")
print("\nモデルを保存しました: model_mps.pth")
if __name__ == "__main__":
main()
6.3 ユースケース3:どうしてもCUDAが必要な場合
想定読者: 特定のCUDA専用ライブラリ(cuDNN、TensorRT等)が必須の方
推奨構成: クラウドGPU(AWS、GCP、Lambda Labs)
ローカルでCUDAが使えないなら、クラウドに頼るしかない。以下に主要なクラウドGPUサービスを比較する。
| サービス | GPU | 時間単価目安 | 特徴 |
|---|---|---|---|
| AWS EC2 (p4d.24xlarge) | A100 x8 | $32.77/h | 大規模訓練向け |
| Google Colab Pro+ | A100/V100 | $49.99/月 | 手軽、Jupyter統合 |
| Lambda Labs | RTX 4090 | $0.80/h | コスパ良好 |
| Paperspace | RTX 4000 | $0.45/h | 低価格帯 |
サンプルコード(SSH経由でリモートGPUを使用)
#!/usr/bin/env python3
"""
リモートGPUサーバーでのジョブ実行スクリプト
必要なパッケージ: pip install paramiko
"""
import paramiko
import os
from pathlib import Path
def run_remote_training(
host: str,
username: str,
key_path: str,
script_path: str,
remote_dir: str = "/home/ubuntu/training"
) -> str:
"""リモートサーバーで訓練スクリプトを実行"""
# SSH接続
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
private_key = paramiko.RSAKey.from_private_key_file(key_path)
ssh.connect(hostname=host, username=username, pkey=private_key)
try:
# スクリプトをアップロード
sftp = ssh.open_sftp()
remote_script = f"{remote_dir}/train.py"
sftp.put(script_path, remote_script)
sftp.close()
# リモートで実行
command = f"cd {remote_dir} && python train.py"
stdin, stdout, stderr = ssh.exec_command(command)
output = stdout.read().decode()
errors = stderr.read().decode()
if errors:
print(f"Errors:\n{errors}")
return output
finally:
ssh.close()
def main():
# 設定(環境変数から読み込み)
host = os.environ.get("GPU_SERVER_HOST", "gpu.example.com")
username = os.environ.get("GPU_SERVER_USER", "ubuntu")
key_path = os.environ.get("GPU_SERVER_KEY", "~/.ssh/id_rsa")
print(f"リモートサーバーに接続: {username}@{host}")
output = run_remote_training(
host=host,
username=username,
key_path=os.path.expanduser(key_path),
script_path="./train_cuda.py"
)
print(f"実行結果:\n{output}")
if __name__ == "__main__":
main()
ユースケースが把握できたところで、この記事を読んだ後の学習パスを確認しよう。
7. 学習ロードマップ
この記事を読んだ後、次のステップとして以下をおすすめする。
初級者向け(まずはここから)
-
PyTorch公式チュートリアル(MPS対応)を試す
- URL: https://pytorch.org/tutorials/
- 特に「Accelerating PyTorch with CUDA」の章をMPSに読み替えて実践
-
OllamaをインストールしてローカルLLMを体験
- URL: https://ollama.ai/
-
ollama run llama3.2で手軽にLLMを試せる
-
Google Colabで無料GPUを使ってみる
- URL: https://colab.research.google.com/
- 無料枠でもT4 GPUが使える
中級者向け(実践に進む)
-
MLXフレームワークを本格的に学ぶ
- URL: https://github.com/ml-explore/mlx
- Apple公式の機械学習フレームワーク
-
Hugging Face TransformersのMPS対応を活用
- URL: https://huggingface.co/docs/transformers/
-
device_map="mps"で自動的にApple GPUを使用
-
AWS/GCPのGPUインスタンスを使いこなす
- Spot Instanceを活用してコストを抑える技術を習得
上級者向け(さらに深く)
-
Metal Performance Shadersの内部実装を理解
- URL: https://developer.apple.com/documentation/metalperformanceshaders
- カスタムGPUカーネルの実装
-
PyTorchのMPSバックエンドにコントリビュート
- URL: https://github.com/pytorch/pytorch/tree/main/aten/src/ATen/mps
- オープンソースへの貢献
8. まとめ
この記事では、eGPUの概念と、MacユーザーがCUDAを使えない技術的・歴史的背景を解説した。
押さえるべきポイント
- Apple Silicon(M1/M2/M3/M4)はeGPUを一切サポートしない
- Intel MacでもNVIDIA GPUはmacOS Mojave以降で使用不可
- CUDAはNVIDIA専用技術。AMD GPUやApple Silicon GPUでは動作しない
- 代替手段はMPS、MLX、クラウドGPU
私の所感
正直なところ、「MacでCUDA」の組み合わせを夢見たユーザーの一人として、この現実は辛い。AppleとNVIDIAの確執は、技術的な問題というよりビジネス上の対立に起因しており、ユーザーが割を食っている形だ。
しかし、Apple SiliconのMPS/MLXエコシステムは急速に進化している。2024年のベンチマークでは、MLXがPyTorch MPSを多くの操作で上回り、一部の操作ではCUDA GPUに匹敵する性能を見せている。
「MacでCUDA」を諦めて、「MacでMetal」に軸足を移すのが、2026年現在の現実的な選択だろう。
eGPUを買う前にこの記事を読んでくれたあなたは、少なくとも無駄な出費を避けられたはずだ。その分の予算を、クラウドGPUの利用料や、Apple Silicon Macのメモリ増設に充ててほしい。
参考文献
- Apple Support: Use an external graphics processor with your Mac
- NVIDIA CUDA Toolkit Release Notes
- PyTorch MPS Backend Documentation
- MLX Documentation
- eGPU.io - Definitive macOS Thunderbolt eGPU Compatibility Registry
- Apple and Nvidia Are Over - Gizmodo
- AppleInsider: Video - Nvidia support was abandoned in macOS Mojave, and here's why