ローカルで学習する時と違ってコラボだとよくRAMが足りなくてクラッシュするなぁ…なんてことない?
コラボのVMって普通は仮想メモリによるスワップが有効化されてないから少しでもRAMをはみ出るとアウトなんだよね。
カスタムVMならメモリの容量を任意に指定できるけど、容量積むと値段もそれなりにお高くなっちゃう。GPU環境だと積めるメモリに制限があるし。
そんな時にはスワップを使おう。スペックそのままでクラッシュを回避できるようになるかも。
メモリスワップ
RAMに収まりきらない分のデータをディスク上に書き出す機能。
ディスクはRAMと比べたアクセス速度が比にならないぐらい遅いから結構もっさりしちゃうけど、容量不足によるクラッシュは回避できる。
それこそディスクがHDD主流だった時代は遅くなりすぎてスワップが始まるとフリーズしたような感じになっちゃってたけど、最近のSSDはすごい速いから若干もっさりするぐらいで済んだりするよね。
机で作業する時の距離感に例えるとして、RAMが机の上で手が届く範囲だとするとSSDは隣の部屋ぐらいの感じ?
HDDは…なんだろう、最寄駅ぐらい?笑
手順
1. VMにsshでログインする
スワップの設定をする時はいつも通りセルからコマンドを実行するやり方は使えなくてVMに直接SSH接続する必要がある。
まずはGCPのVM一覧からVMの詳細画面へ進んでSSHボタンをクリック。SSHでVMにログインしよう。
ログインに成功すればターミナル画面が表示されるはず。
free
コマンドを実行してスワップが無効になっていることを確認してみよう。
free -h
Swapが0Bになってるね。
total used free shared buff/cache available
Mem: 51G 13G 855M 12M 36G 48G
Swap: 0B 0B 0B
2. スワップファイルを作成する
fallocate
コマンドを使ってホームディレクトリにスワップ用のファイルを作成しよう。
このファイルは通常のファイルと変わらずストレージ容量を消費するから自分のVMのスペックに従って適宜変更してね。
大体RAM容量の2倍ぐらいが目安と言われているよ。ここではVMのRAMが52GB
であると想定してスワップサイズを104GB
にしてる。
sudo fallocate -l 104G /home/swapfile
続いて作成したファイルをmkswap
コマンドでスワップ領域にしよう。
sudo mkswap /home/swapfile
これで準備OK。
3. スワップを有効にする
最後にswapon
コマンドでスワップを有効にして完了。
sudo swapon /home/swapfile
free
コマンドでスワップを確認してみると…
total used free shared buff/cache available
Mem: 51G 13G 855M 12M 36G 48G
Swap: 104G 0B 0B
スワップが認識されていることが分かるね。
この状態でNotebookを実行すると普段メモリ容量が足りなくてクラッシュしていたはずのタイミングでスワップが使われ始めてクラッシュを回避できるよ。動きは遅くなるんだけどね。
+104GBまで多くメモリを使えるって感じだね。
ちなみにVMを再起動するとスワップも解除されちゃうからswapon
だけやり直そう。
ただしこれで上手く行くのはあくまでPythonのプロセスがメモリ不足で落ちちゃってる時だけで、多分GPU側のメモリ不足には効かないと思うから注意してね。
何で普通のコラボではできないの?
コラボのセッションってVM内のDocker環境で動いてるからコンテナ単位の権限より上位の操作はできないみたい。
カスタムVMだとコンテナのホスト側に直接SSHでログインできるからいけるんだけど、普通のコラボだとそれもできないからね。
普通のコラボでもせめてメモリのスワップが出来ればめっちゃアツいと思うんだけど、スワップしてる時ってディスクのI/Oでかなり激しい負荷がかかるからダメなんだろうな😇