こんにちは、Zero-Cheeseです。
本記事では、Appleシリコンを搭載したMacへ
- Pytorchのインストール方法と
- AppleシリコンGPUで、学習・推論するための方法(Pythonコード)を
ご紹介します。
下記の方を対象にした、記事となっています。
- Pytorchを、少しでも使った事のある方
- Apple Silicon 搭載Macで、PyTorchを動かしたい方
「M2 Pro」、「M2 Max」も、動作確認済みです。
「Appleシリコン以外のPCへの、PyTorchインストール方法」を知りたい方は、下記リンクまでどうぞ。
AppleシリコンMacに、PyTorchをインストールする方法
2022年5月18日時点で、PyTorch公式より、「Appleシリコン上のGPUで、動くようになりました!」という、アナウンスがありました。
必要要件(バージョン)は、以下の通りです。
- MacOS: 12.3以上
- Python:3.7以上
- PyTorch:1.12以上
- Xcodeがインストールされている事
前準備
Python、およびパッケージ管理ツールpipを、インストールしておいて下さい。
Pythonのインストール方法に関して、詳細を知りたい方は、こちらまで。(リンク先の記事では、IDEの導入も紹介していますが、任意で大丈夫です。)
またpipのインストール方法の詳細は、下記までどうぞ。
PyTorchのインストール方法
PyTorchの、公式サイトに遷移してください。
遷移したサイトにて、下記のように選択して下さい。
画面一番下側の、「Run this Command」に、コマンドが表示されます。
Mac上で、ターミナルを立ち上げ、「Run this Command」に記載されている「コマンド」を入力・実行するば、インストール完了です。
問題なくインストールできたか、確認する
下記コードを実行して下さい。
- torch.backends.mps.is_available()
Trueが表示されれば、AppleシリコンGPUが、使える状態です。
Pythonコード:
import torch
print(torch.backends.mps.is_available())
コード紹介:AppleシリコンGPUで動かす方法
考え方
基本的な考え方は、Nvidia製GPUで動かす場合と、同じです。(ご存知ない方でも、以下の文章を読めば、大丈夫です。)
PyTorchをNvidia製GPUで動かすためには、扱うデータを「メインメモリ」から、「GPU上のメモリ」に移す必要があります。
AppleシリコンGPUの場合も同じで、データを、メインメモリから、GPU上のメモリに移す処理が必要です。
補足:(厳密な話なので、無視して頂いても大丈夫です。)
Appleシリコンは、ユニファイドメモリと呼ばれる、アーキテクチャーを採用しています。
「CPU、GPU」両方とも、同じメモリに、アクセスする事ができます。
よって、「GPU上のメモリにデータを移すという表現」は正確ではありませんが、イメージしやすいように、本記事では、この表現をつかいます。
Pythonコードのご紹介
AppleシリコンGPUを使用する場合、
- device = torch.device(‘mps’)
- {データ}.to(device)
を使用します。
(mpsとは、Metal Perfomance Shadersの略称です。)
例えば、あるテンソルデータを、GPU上のメモリに移すには、下記のようにコードを記載します。
import torch
device = torch.device('mps')
# inputデータの設定を、GPUのメモリに移動
input = torch.tensor([1, 2, 3], dtype=torch.float)
input = input.to(device)
print(input)
# ⬆ 実行結果 (Warningが出る場合もありますが、無視して下さい。)
# tensor([1., 2., 3.], device='mps:0')
結果をみると、tensor([1, 2, 3], device=’mps:0′)と、GPU上のメモリにデータが、移動している事が分かります。
ちなみに、CPU上のメモリに、データを戻す処理は、以下のとおりです。
# 上記のコードの続き
print(input.cpu())
# ⬆ 実行結果
# tensor([1., 2., 3.])
tensor([1, 2, 3])と、device表示がない事が分かります。
つまり、メインメモリ上にデータがある事を、表しています。
Pythonコード事例 (FashionMNISTを動かしてみる)
具体例を知りたい方を対象に、FashionMNISTデータを使って、画像分類を学習させるコードをご紹介します。
FashionMNIST??、という方や、後ほど紹介しているPythonコードが分からない方は、下記リンクまで、どうぞ。
GPUで処理させるため、
- device = torch.device(‘mps’)
- {データ}.to(device)
がポイントとなります。
Pythonコード:
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
num_epochs = 100 # 学習を何回、繰り返すか (エポックと呼ばれる。)
num_batch = 100 # 1度に、何枚の画像を取出すか
learning_rate = 0.001 # 学習率
image_size = 28*28 # 画像の画素数(幅x高さ)
# ニューラルネットワークモデルの定義
class NeuralNet(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 100)
self.fc2 = nn.Linear(100, 10)
self.relu = nn.ReLU() # 活性化関数 (説明省略)
def forward(self, x):
# 順伝播の設定
# 入力層 → 中間層の全結合
x = self.fc1(x)
# 活性化関数 (説明省略)
x = self.relu(x)
# 中間層 → 出力層の全結合
x = self.fc2(x)
return F.log_softmax(x, dim=1)
# 訓練データの準備
train_data = torchvision.datasets.FashionMNIST(
'./datasets', train=True, download=True,
transform=torchvision.transforms.ToTensor())
train_dataloader = torch.utils.data.DataLoader(train_data, batch_size=100, shuffle=True)
# GPUが使える場合は、GPU使用モードにする。
device = torch.device('mps') if torch.backends.mps.is_available() else torch.device('cpu')
# ニューラルネットワークの生成して、GPUにデータを送る
model = NeuralNet().to(device)
# モデルを訓練モードにする
model.train()
# 損失関数の設定
criterion = nn.CrossEntropyLoss()
# 最適化手法の設定
optimizer = torch.optim.Adam(model.parameters(), lr = learning_rate)
# 設定したエポック数分、学習する。
for epoch in range(num_epochs):
loss_sum = 0
for inputs, labels in train_dataloader:
# GPUが使えるならGPUにデータを送る
inputs = inputs.to(device)
labels = labels.to(device)
# optimizerを初期化
optimizer.zero_grad()
# ニューラルネットワークの処理を実施
inputs = inputs.view(-1, image_size) # 画像データ部分を一次元へ並び変える
outputs = model(inputs)
# 損失(出力とラベルとの誤差)の計算
loss = criterion(outputs, labels)
loss_sum += loss
# 学習
loss.backward()
optimizer.step()
# 学習状況の表示
print(f"Epoch: {epoch+1}/{num_epochs}, Loss: {loss_sum / len(train_dataloader)}")
実行結果:
Epoch: 1/100, Loss: 0.5891443490982056
Epoch: 2/100, Loss: 0.4261816442012787
Epoch: 3/100, Loss: 0.3868759870529175
Epoch: 4/100, Loss: 0.3647302985191345
Epoch: 5/100, Loss: 0.3436024785041809
Epoch: 6/100, Loss: 0.326227605342865
・・・・続く
まとめ
本記事では、Appleシリコン搭載Macへ
- PyTorchのインストール方法と
- GPU上で、PyTorchを動かす方法(Pythonコード)
をご紹介しました。
ターミナルから、コマンド入力・実行することで、PyTorchを簡単にインストールできます。
また、PyTorchをAppleシリコンGPUで動かすには、Pythonコード上で、device(‘mps’)や、{データ}.to(device) を使用します。
雑談
以下、雑談なので、お時間が許せる方は、どうぞ。
今度、M2Maxを使って、ディープラーニングの学習速度を評価したいと思っています。
具体的には、以下の比較をして、性能を調査する予定です。
- GPU使用のM2Max
- GPUを使用しない、M2Max
- RTX3090
(2018年製のMacBook Pro Corei7 〇〇)
情報がまとまりましたら、こちらの記事にも、リンクを貼けます。
後日、記事にしました。興味がありましたら、ぜひどうぞ。
私は外出先で、プログラムをよく作っています。
ディープラーニングを作る場合、ノートパソコン上で作成 → 動作確認した上で、遠隔PCにプログラム一式を送って、処理させる事が多々あります。
このような使い方の場合、ノートPCでディープラーニングが、ある程度の速度で、動いてくれる必要があります。
M1Max、M2Maxは、その要望に十分、ミートするPCです。
(ディープラーニングされる方は、遠隔PCのOSが、Linux(Ubuntu)であるケースが多いと思います。
よって、Linuxと互換性のある「UnixであるMac」は、その点でもポイントが高いです。)
もしディープラーニング用の遠隔PCを、自作PCで安く済ませたい場合、下記が参考になると思います。(プライベートで使用する場合とか、該当すると思います。)
求められるスペック情報や注意点を、整理しているので、ご興味がありましたらどうそ。
最後まで付き合って下さり、ありがとうございました。
それではまた、お会いしましょう!