The jonki

呼ばれて飛び出てじょじょじょじょーんき

MacBook Pro(M1 Pro)とColab Proでディープラーニング

はじめに

年末年始に少し時間があったので,趣味で書いているコードを動かすGPUインスタンスについて調べていました.以前はちゃんとGPU持っていたのですが,あまり使っていなかったので全部売っていました.買い直しも検討しましたが,未だにGPUは高いですし,我が家の冬は暖房等の使いすぎでブレーカーがよく落ちるので,何か適当なクラウドサービスを使おうかなと思っていました. AWSの安いGPUインスタンスであれば1時間100円ぐらいなので悪くはなさそうでしたが,時間課金はソワソワしちゃうので辞めました.そこで日本でも使えるようになった月額1000円程度のColab Proを使い始めました.

この記事ではMacbook Pro (M1 Pro)とColab Proを使ったディープラーニングの開発に関して,そのワークフロー,ベンチマーク,Tipsを簡単にまとめたので共有します. Colabはこれまで簡単なpythonのコードチェックぐらいでしか使ったことないですが,今回本格的に使い始めたので共有します.もっといい方法あるよ!という方はぜひコメント下さい.

Colab Proについて

Colab Proは最近日本で使えるようになったGoogleのサービスです.詳しくは下記の記事が詳しいです.月1000円程度で通常のColabよりGPUインスタンスが長く使えるのが特徴です.Pro+にすればGPUがP100からV100と更に良くなり(RAMは16GB → 32GB!),バックグラウンド実行もできるようになります,月5000円ぐらいかかるので本格的な人向けです.

atmarkit.itmedia.co.jp

ベンチマーク(M1 Pro vs Colab vs Colab Pro)

結局一番気になるのは学習速度.実はM1 Pro,素のColab (K80)より早いやんという話もあり調べてみました.ちなみに私のM1 ProはM1 Proの中でも最弱です(コア数という意味で). Colab上で試したのはTPUでなくGPUインスタンスです.計測のためのコードはpytorchの公式例をそのまま使い,MNISTの分類と言語モデルを試しました.Linear, CNN, RNN系のコードです.計測では1つのミニバッチの処理時間をまとめてみました.M1 Pro比でどれぐらい早いかカッコ内に書いてあります.

モデル M1 Pro (8 cores) Colab (Tesla K80, 12GB) Colab Pro (Tesla P100, 16GB)
MNIST, batch_size=64 0.028s 0.007s (4x) 0.003 s (9.3x)
LM (RNN, batch_size=20) 0.113s 0.006s (18.8x) 0.003s (37.7x)
LM (RNN, batch_size=100) 0.449s 0.162s (2.8x) 0.044s (10.2x)
LM (Transformer, batch_size=20) 0.103s 0.009s (11.4x) 0.005s (20.6x)
LM (Transformer, batch_size=100) 0.432s 0.160s (2.7x) 0.044s (9.8x)

M1 Proはこの中だと一番遅いですが,意外と早いですね.本格的な学習には厳しいですが,動作確認程度なら全然問題なさそうです.K80はM1 Proより遅いと思っていましたが,意外と奮闘していますね.P100はちゃんと早いですね.P100は2080Tiにやや劣るぐらいのFLOPSだけどメモリは多い,というものなのでなかなか悪くないと思います.RAM 16GBというのは中々絶妙で昨今では10GBぐらいでは足りないケースも増えてきたので16GBはありがたいです.これぐらいメモリが載ってるものってコンシューマー向けには3090とかになってしまうので中々手が出ません.一方でColab Proは実行制約等があるものの,電気代気にせず1000円というのは趣味用途では全然ありだと思いました.まず素のColabで運用して物足りなくなったらProにするというのもアリだと思います.

ベンチマーク等についてはこちらもご覧ください.

開発構成について

次はColab Proを使った際の開発構成の紹介です.以下のようにして落ち着きました.Colab上では学習したモデル等のデータは自分で保存する必要があるため,Google Driveとの連携は必須です.またノートブック上で本格的なコーディングはかなり辛いので,Google Drive上でコードを管理し(github),通常時はローカルのマシン(Macbook Pro)上でVisual Studio Codeで開発,というのが良さそうでした.

  1. Google Drive上を作業スペースとし,ここに自分のプロジェクトをgit cloneする.
  2. 通常開発時はMacbook Pro上で作業し,学習コードがちゃんと動くかM1 Proでチェック(私はVisual Studio Code使ってます).
  3. 学習を本格的に開始する段階で,Colab ProでGPUランタイムのノートブックを作成する.
  4. Colabのノートブック上でGoogle Driveをマウントし,プロジェクトディレクトリにchange directoryする.
  5. Colab上で学習を開始する.(例:! python train.py
  6. tensorboard等を使っている場合は,ノートブック上でtensorboardを使うか,ローカル側で自分でtensorboardのサーバーを立ち上げる.Google Drive上で作業しているのでログもsyncしており,ローカルでtensorboard立てられる(私はこれ).
  7. コードに修正があれば,手順2に戻る.

開発Tipsについて

いくつか覚えていて損がないことを書いておきます.

Google Driveのマウント

これはGUIとプログラムの2通りでマウントできます.GUIから行く場合は,左のサイドメニューのフォルダアイコンをクリックしてから辿れます.プログラムから行く場合は下記のような形でいけます.

from google.colab import drive
from pathlib import Path

def mount_drive():
    drive_path = Path('/content/drive')
    if not drive_path.exists():
        drive.mount(str(drive_path))

mount_drive()

Githubからprivateなリポジトリをcloneする

GithubのPersonal Access Tokensを使えば,自分のprivateリポジトリであっても簡単にcloneできます. Githubのページで Settings → Developer settings → Personal access tokens で full control of private repositoryトークンを生成しておきます. Creating a personal access token も参考にしてください.

そしてノートブック上で以下のようにしてcloneできます.簡単ですね.

import os
os.chdir('<your_work_space>')
%env TOKEN=<YOUR_TOKEN>
!git clone https://$$TOKEN@github.com/<user_name>/<repo_name>.git

実行環境がColab上かどうか判定する

これはローカルでの開発とノートブック上での開発で処理を切り替えたいときに便利です.

import sys
is_colab = 'google.colab' in sys.modules

ローカルとノートブック上でのファイル同期について

基本はGoogle Drive上で作業しているので,ファイルは勝手に同期されます.ただ手元で編集してすぐに反映,というわけにはいかないです.感覚的なものですが,数分ぐらいラグがある気がします. また同期されているつもりでノートブック上で実行したところ,古いコードが動いていた,ということもあるのでノートブック上でのコード確認は重要です. ただ結構面倒なので変更はすべてgit commit & pushしておき,ノートブック上ででgit pullしてから実行するようにした方が便利です.

Terminalどう?

Colab Proの目玉機能の1つではあると思うのですが,遅延が結構ひどく,インスタンスが再生成される度にルートディレクトリにcdしてしまい,正直使い勝手はよくないです.psnvidia-smiなどのプロファイル系のコマンド実行には良いかもしれませんが,思ったより使わないです.デフォルトでtmuxが動くのは良いのですけどね.重要な処理やノートブックのセル上で書いたほうが確実に実行できます.

ノートブックはターミナルのように利用する

ノートブック上でのpythonコードもかけるのですが,基本的に私は書いていないです.普通に.pyをVisual Studio Codeでコーディングしておき,ノートブック上はひたすらgit,前処理,学習の実行といった適当なファイルの実行を行っています.データ分析等の可視化をする場合は便利だとは思います.

自動接続

これはabuse感あるのですが,よくあるTipsとして紹介されています.ブラウザのDeveloper consoleを開き,以下のように再接続ボタンを継続的に押すようにスクリプトを仕掛けておきます.

function KeepClicking(){
    console.log("Clicking");
    document.querySelector("colab-connect-button").click() }
setInterval(KeepClicking,60000)

実行時間と再学習について

Colab Proでは最大実行時間は無料プランの倍の24時間になっていますが,通常のColabを常用していた訳ではないので体感的に伸びているかはよく分かりません.基本的には寝る前,起きたとき,午後,でノートブックをチェックして実行が止まっていたらノートブックのセルをRun allする感じです.特定のディレクトリの最新チェックポイントを自動でresumeするようなコードにしておくのが良いと思います(例: python trainer.py --resume ./your_exp_dir).ただ面倒であることは変わりないので,ある程度学習がうまくいくことが分かっている場合は,AWS等で専用のGPUインスタンスを立てても良いかなと思います.

まとめ

M1 ProとColab Proを使ったディープラーニング開発についてまとめました.Colab Proを単純なGPUインスタンス的に扱う,という用途でも使い物になりそうです.趣味でこれは結構良いと思いました.自前のGPUを使う場合,そのためのマシンを用意する必要がありますし,電気代も場所も取ります.GPUもそもそも毎年新しいものが出てくるので,サブスク性や従量課金制の方が今どきは良いなと思いました(もちろん用途によります).そういう意味ではColab Proはランチ1回分と考えるとかなりお買い得だと思いました. またM1 Proがまぁまぁ早いのも想定外でした.このMacbookで本格的な開発をする予定はなかったのですが,これならM1 Pro Maxを視野に入れてよかったなとちょっとだけ思いました.