Pythonスキルの習得

【Python】PyTorchをAppleシリコン搭載Mac(M1、M2)にインストールする方法 – AppleシリコンGPUで動かす方法も、併せて紹介 –

【Python】PyTorchをAppleシリコン搭載Mac(M1、M2)にインストールする方法 - AppleシリコンGPUで動かす方法も、併せて紹介 -

こんにちは、Zero-Cheeseです。

本記事では、Appleシリコンを搭載したMac

  • Pytorchのインストール方法
  • AppleシリコンGPUで、学習・推論するための方法(Pythonコード)

ご紹介します。

下記の方を対象にした、記事となっています。

  • Pytorchを、少しでも使った事のある方
  • Apple Silicon 搭載Macで、PyTorchを動かしたい方

「M2 Pro」、「M2 Max」も、動作確認済みです。

「Appleシリコン以外のPCへの、PyTorchインストール方法」を知りたい方は、下記リンクまでどうぞ。

【入門】PyTorchのインストール方法 - Mac, Windows, Ubuntu - GPU版インストールも、あわせて紹介
【入門】PyTorchのインストール方法 - Mac, Windows, Ubuntu - GPU版インストールも、あわせて紹介PyTorchのインストール方法を解説した記事です。紹介したOSは、Windows、Mac、Ubuntuです。GPUを使用するための、注意点も併せて、ご紹介しました。...

AppleシリコンMacに、PyTorchをインストールする方法

2022年5月18日時点で、PyTorch公式より、「Appleシリコン上のGPUで、動くようになりました!」という、アナウンスがありました。

必要要件(バージョン)は、以下の通りです。

  • MacOS: 12.3以上
  • Python:3.7以上
  • PyTorch:1.12以上
  • Xcodeがインストールされている事

前準備

Python、およびパッケージ管理ツールpipを、インストールしておいて下さい。

Pythonのインストール方法に関して、詳細を知りたい方は、こちらまで。(リンク先の記事では、IDEの導入も紹介していますが、任意で大丈夫です。)

Pythonの導入方法(環境構築)
Pythonの導入方法(環境構築)PythonとIDE(総合開発環境)のインストール方法を紹介しました。Windows、Mac両方を解説しています。プログラムの楽しい世界を、ちょっとだけ覗いてみようという企画記事の一環です。...

またpipのインストール方法の詳細は、下記までどうぞ。

【Python】pipの使い型入門 - コマンドライン、Anaconda、PyCharmからの操作方法を解説 -
【Python】pipの使い方入門 - コマンドライン、Anaconda、PyCharmからの操作方法を解説 -Python入門者を対象に、pipの使い型を解説した記事です。 コマンドライン、Anaconda、PyCharmからの操作方法を、わかりやすく解説しました。 ...

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を使用する場合、

  1. device = torch.device(‘mps’)
  2. {データ}.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コードが分からない方は、下記リンクまで、どうぞ。

【 入門 】初めてのPyTorch - 実際にコードを書いて、体験してみる -
【 入門 】初めてのPyTorch - 実際にコードを書いて、体験してみる -Python初心者以上の方で、ディープラーニングに興味はあるが、まだコードを書いた事の無い方、もしくは、「PyTorch」初めての方を対象に、「PyTorch」を実際に体験してみて、特徴の把握、自分に合う・合わないを、実感するという内容になっています。...

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 〇〇)

情報がまとまりましたら、こちらの記事にも、リンクを貼けます。

後日、記事にしました。興味がありましたら、ぜひどうぞ。

【PyTorch】M2Max GPUによる、ディープラーニング性能検証 - RTX3090、Intel製CPUとの比較 -
【PyTorch】M2Max GPUによる、ディープラーニング性能検証 - RTX3090、Intel製CPUとの比較 -M2Max GPUによる、ディープラーニング処理性能を検証しました。RTX3090や、Intel製CPUとの比較結果もご紹介しています。...

私は外出先で、プログラムをよく作っています。

ディープラーニングを作る場合、ノートパソコン上で作成 → 動作確認した上で、遠隔PCにプログラム一式を送って、処理させる事が多々あります。

このような使い方の場合、ノートPCでディープラーニングが、ある程度の速度で、動いてくれる必要があります。

M1Max、M2Maxは、その要望に十分、ミートするPCです。

(ディープラーニングされる方は、遠隔PCのOSが、Linux(Ubuntu)であるケースが多いと思います。

よって、Linuxと互換性のある「UnixであるMac」は、その点でもポイントが高いです。)

もしディープラーニング用の遠隔PCを、自作PCで安く済ませたい場合、下記が参考になると思います。(プライベートで使用する場合とか、該当すると思います。)

求められるスペック情報や注意点を、整理しているので、ご興味がありましたらどうそ。

ディープラーニング 自作PC に必要なスペックと注意点、おすすめパーツのご紹介
ディープラーニング 自作PC に必要なスペックと注意点、おすすめパーツのご紹介ディープラーニング用の自作PCとして、必要なスペック、注意点、オススメのパーツを紹介した記事です。...

最後まで付き合って下さり、ありがとうございました。

それではまた、お会いしましょう!