iMacに搭載されているAppleシリコン「M1チップ」で遊んでみた🍺

StyleGAN2で画像生成

2023年6月23日19:24に投稿 / カテゴリ : dailylife

iMacに搭載されているAppleシリコン「M1チップ」で遊んでみた🍺

2023年6月23日19:24に投稿 / カテゴリ : dailylife 閲覧数 787回

最近のApple製品はIntelのものからAppleシリコンに切り替わってきている。
公式サイトなど眺めていると、「Neural Engine」がうんたらかんたら書いてある。
どうやらこれは、機械学習関連の処理に特化しているらしい。
となると、AIを研究テーマとしている自分としては性能がとても気になる。
気になったのは今に始まったことではなく、M1チップ搭載のiMacになってからずっと気になっていたのだが、うまく動作しなかったので使うのを諦めていた。
しかし、どんどん新しいAppleシリコンが登場するためどうしても気になり、pytorchの公式サイトを訪れてみると、なんとMacOSのバージョンが12.3以上であるとちゃんと動作するみたいだ。 ということで早速動かしていく。

1. ローカルにPytorchをインストール

インストールはかなり簡単で、pytorchの公式サイトに訪れ、条件を選択するだけである。以下がそれに当たる。これをターミナルで実行し、少し待つだけですぐ使えるようになる。(簡単すぎる。。。)

# MPS acceleration is available on MacOS 12.3+
pip3 install torch torchvision torchaudio
    

2. StyleGAN2で画像生成

最近、StyleGAN2に移行し、pytorchでも動くようになったので、こちらを使用して画像を生成する。
「Diffusion Modelが流行っているのに、まだStyleGANなの?」なんて絶対に言わないで欲しい(絶賛研究中)。 今回は画像生成の部分(Synthesis Network)のみに注目し、画像を100枚生成させる。この時間をCPU(M1)、GPU(M1)、GPU(NVIDIA:Tesla V100)で比較する。

import os
import time
import pickle
import numpy as np
import PIL.Image
import torch
    
# deviceをcpu、mps、cudaに切り替えて試す
device = torch.device('mps')

# 研究で使用している解像度256x256のモデルで検証
network_pkl = 'pkl/bedroom256_best.pkl'
with open(network_pkl, 'rb') as f:
    G = pickle.load(f)['G_ema'].to(device)

# 一つの潜在ベクトルwを生成
G.eval()
# 同じ画像を生成するため、seedを固定
torch.manual_seed(124)
z = torch.randn([1, G.z_dim]).to(device)
w = G.mapping(z, None)
    
# 100回生成するのを5回繰り返す
for j in range(5):
    start = time.time()
    for i in range(100):
        with torch.no_grad():
            img = G.synthesis(w, noise_mode='const', force_fp32=True)
    end = time.time()
    print(end - start)
    

その結果がこちらである。torch.device('mps')の場合、1回の処理で5回も繰り返すとメモリ不足になり実行が中断されるので、5回に分けて実行することにした。メモリ管理に関してまだ勉強不足であるため、解放の仕方が分かり次第追記する。

# mpsの場合
17.13364028930664
16.948246717453003
16.867655038833618
16.947510719299316
17.06121802330017

# cpuの場合
52.91600322723389
51.872626304626465
50.78024196624756
47.96811890602112
48.53954887390137

# cudaの場合
2.681710958480835
0.978827953338623
0.9776475429534912
0.9765019416809082
0.9730045795440674
    

結果の通り、cpuよりもmpsが速く、mpsよりもcudaが速いことがわかった。次は生成画像の質を見てみる。
LPIPSなど定量的に評価するのではなく、自分の目で評価する。
生成画像の質は人間がどう思うかが個人的に重要だと思う。
ということでその結果が以下である。

正直画像の質は全く変化がない。変わるのは時間だけである。

  • 特に急いでいない
  • 他の作業をしている間に画像を生成させておく
  • 他の作業にGPUを使いたい

こういった時にM1チップは使えるのかもしれない。あくまでも推論であるため、学習に使えるかどうかはまた話が別である。今後MNISTデータセットを用いて分類問題を解くのもありかもしれない(今後の自分に期待)。

3. 感想

初めてのマイパソコンがMacBookAir(2017年モデル)で、そこからずっとMacを使ってきたということもあり、研究室のパソコンをiMacにして頂いた。ちょうどそのあたりからIntel製のものからM1チップに変わりつつあったので、M1でAIができたらなんて考えていた。今回試してみて、全く使えないということはなかったので、個人的に嬉しかった(torch.device('mps')にするだけなので簡単)。今やM2チップが出ており、コア数が増えている。となると、今よりもっと速いスピードで計算することができるかもしれないし、cudaに負けない時代が来るかもしれない。そんな時代が来たら面白いなとも思う。もしM2チップ搭載のMacを手に入れることができたら、また試してみたいと思う。
ここまで読んでいただき、ありがとうございます。

4. 余談

タイトルの🍺について話させてください。
macにはhomebrewと呼ばれるパッケージ管理システムがあります。
そのhomebrewのサイトがこちらなのですが、リンク先に飛んでみるとなんとビールのアイコンが。
brewには「醸造する」という意味があるそうで、homebrewで「自家醸造」だそう。
このことから、homebrewというのは「ユーザが自らパッケージをビルドして使用する」のようなイメージだそうです(参考)。
使い方はとても簡単で、pip installのように、brew installと、ターミナルで打つだけ。
具体的には、pythonのバージョン管理をしてくれるpyenvなどをインストールすることができます。

        brew install pyenv
    

このようにbrew installを実行すると、ターミナルに🍺のアイコンが出てくるんですよね。
初めて見た時に、めちゃ可愛い!となりまして、そこからたまに🍺をつけたりしたくなったり、、、
今回もmacに関するお話だったので、タイトルにつけてみました。
macに関連する話だからhomebrewにつなげるのは浅すぎるかもしれませんが。。。実際にビールが好きというのもあって、🍺のアイコンにすごく愛着がありますね。みなさんも是非使ってみてください!!!

執筆者

今西 渉

大阪大学大学院
生命機能研究科 卒業