在 2022 年 5 月18 日的這一天,PyTorch 在 Official Blog 中宣布:在 PyTorch 1.12 版本中將可以使用 Apple Silicon 中的 GPU,也就是說如果你的 MacBook Air 或 MacBook Pro 的處理器是使用 M1 晶片而非 Intel 晶片,那麼你利用 PyTorch 框架所建立的 Neural Network,將可以使用 GPU 進行訓練 (過去只有 TensorFlow 可以)!
在本篇文章中,我們介紹如何安裝支援 M1 GPU 的 PyTorch,並透過一個簡單的分類問題,來測試 CPU 與 GPU 的效能。
在安裝 PyTorch 之前,必須先確保 MacOS 版本大於或等於 12.3,因為最新版的 PyTorch 底層使用 Apple’s Metal Performance Shaders (MPS) 。
打開 Terminal 並輸入以下指令,查看自己的 MacOS 版本:
sw_vers
在進行 Python 程式的開發時,不同專案需要不同的套件,比較好的做法是替每一個專案建立一個虛擬環境,讓專案與專案之間的套件彼此不受影響。
在 Python 中,管理套件的輔助工具有很多種,我們選擇使用 Anaconda 來管理我們的套件。但是在 Anaconda 中包含太多其他的工具,我們選擇安裝簡化版的 Anaconda —— Miniconda。
Miniconda 在許多作業系統中都可以使用,我們要安裝支援 MacOS M1 的版本,也就是 Miniconda3 macOS Apple M1 ARM 64-bit bash。
下載完成之後,開啟 Terminal 找到這個 script 檔案:
透過 chmod 確保這個檔案能夠被執行:
sudo chmod +x Miniconda3-py38_4.12.0-MacOSX-arm64.sh
接著,執行這個 script:
./Miniconda3-py38_4.12.0-MacOSX-arm64.sh
跟著指令操作完成 Miniconda 的安裝。
一樣打開 Terminal,建立一個名為「pytorch-m1」的虛擬環境,並指定 Python 版本為 3.8。
conda create --name pytorch-m1 python=3.8
接著,啟用這個虛擬環境:
conda activate pytorch-m1
透過 pip 安裝所需要的套件:
pip3 install --pre torch torchvision --extra-index-url https://download.pytorch.org/whl/nightly/cpu
等待大約 1 分鐘完成所有套件的安裝後,就大功告成囉!
過去我們在 PyTorch 中如果要使用 Nvidia 的 GPU 時,可以透過:
device = torch.device("cuda")
如果要使用 M1 GPU 只需要將 cuda 改為 mps,剩下的操作都和原本是一樣的 (將 Tensor 與 Model 移動到 Device 上):
device = torch.device("mps")
接著,我透過一個簡單的分類問題 —— MNIST Digit Classification,來比較使用 MacBook Air 2020 上 M1 CPU 與 M1 GPU 所需要的訓練時間。
我使用 GitHub 上 pytorch/examples 所提供的程式碼,分別使用 CPU 與 GPU 對模型進行訓練。皆訓練 5 個 Epochs 且 Batch Size 設為 64。
下圖為兩者的時間差異:
M1 CPU 一個 Epoch 大約花了 28.96 秒,M1 GPU 一個 Epoch 約花了 18.26 秒,時間上減少了 36.95%。
上面透過一個很簡單的模型與資料集來比較 CPU 與 GPU 的效能,sebastianraschka 在其部落格上還比較了不同硬體裝置使用 CIFAR-10 資料集訓練 VGG16 模型的效能:
若單純比較 M1 Pro CPU 與 M1 Pro GPU 可以發現 GPU 的時間比 CPU 減少了 44.54%!
本文說明如何在 PyTorch 中使用 M1 GPU,並比較 M1 CPU 與 M1 GPU 的效能差異。然而,儘管 PyTorch 可以支援 M1 GPU,但是使用筆電 (MacBook Air 或 MacBook Pro) 作為訓練神經網路的主要裝置,仍然是個不切實際的想法!畢竟訓練大型的神經網路,所需要的訓練時間更長,將會使得筆電長時間過熱,而造成壽命減短。