コラボのカスタムVMで仮想メモリを有効にする

2022/03/14

ローカルで学習する時と違ってコラボだとよくRAMが足りなくてクラッシュするなぁ…なんてことない?

コラボのVMって普通は仮想メモリによるスワップが有効化されてないから少しでもRAMをはみ出るとアウトなんだよね。

カスタムVMならメモリの容量を任意に指定できるけど、容量積むと値段もそれなりにお高くなっちゃう。GPU環境だと積めるメモリに制限があるし。

そんな時にはスワップを使おう。スペックそのままでクラッシュを回避できるようになるかも。

メモリスワップ

RAMに収まりきらない分のデータをディスク上に書き出す機能。

ディスクはRAMと比べたアクセス速度が比にならないぐらい遅いから結構もっさりしちゃうけど、容量不足によるクラッシュは回避できる。

それこそディスクがHDD主流だった時代は遅くなりすぎてスワップが始まるとフリーズしたような感じになっちゃってたけど、最近のSSDはすごい速いから若干もっさりするぐらいで済んだりするよね。

机で作業する時の距離感に例えるとして、RAMが机の上で手が届く範囲だとするとSSDは隣の部屋ぐらいの感じ?

HDDは…なんだろう、最寄駅ぐらい?笑

手順

1. VMにsshでログインする

スワップの設定をする時はいつも通りセルからコマンドを実行するやり方は使えなくてVMに直接SSH接続する必要がある。

まずはGCPのVM一覧からVMの詳細画面へ進んでSSHボタンをクリック。SSHでVMにログインしよう。

vm ssh

ログインに成功すればターミナル画面が表示されるはず。

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でかなり激しい負荷がかかるからダメなんだろうな😇