作成日:20210313
言語:Python
記事の用途:自分用メモ
概要
CUDAのメモリ不足に関連するエラーで時間を取られることが何度かあったので、未来の自分のために解決方法をまとめておく。
エラーメッセージ例
RuntimeError: CUDA error: out of memory.
環境
環境:
Python 3.6.10 :: Anaconda, Inc.
PyTorch Version: 1.7.1
Torchvision Version: 0.8.2
GPU:
NVIDIA-SMI 430.34
Driver Version: 430.34
CUDA Version: 10.1
※ Google ColaboratoryからローカルGPUのランタイムに繋げて使っている。
トラブルシューティングの前に
メモリ使用率を確認するには、
nvidia-smi
の出力をみる。
対処法
対処法1. まずはランタイムを再起動しよう
解決する時は、まずはランタイムを再起動してみる。大体これで直る。
特に、今まで問題なく回っていたのに、ある時
RuntimeError: CUDA error: out of memory.
と出てきたら、何かの操作でメモリが埋まってしまった可能性がある。
再起動後、もう一度 nvidia-smi
で確認して、メモリが空いていたら、この時点で解決。
私は再起動をせずにネット記事を漁り始め、半日を無駄に潰しました。
対処法2. プロセスを消す
何らかの事情でランタイムの再起動ができない場合や、再起動してもメモリが解放されなかった場合は、kill
コマンドでメモリを圧迫しているプロセスを消す。
kill [PID]
メモリ解放については下の記事を参照した。
kill
コマンドについては下の記事を参照した。
エラー発生場所の具体例
具体例1. torchinfo.summary() で RuntimeError
from torchinfo import summary
summary(model, (1, 3, 224, 224))
でCUDAのRuntimeErrorが出た。
summary(model)
とinputを指定せずに実行するとエラーは出ない。
次に、GPUを介さなければ良いだろうと考えて、
summary(model.to('cpu'), (1, 3, 224, 224))
とやってみたが、『CUDAの』RuntimeErrorが出る。→ ん???
どうやら、torchinfo.summary
は、問答無用でモデルをGPU上に移動させているらしい。加えて、複数のGPUが利用可能な場合でも、1枚目のGPU上で動作するらしい。たとえば、
summary(model.to('cuda:2'), (1, 3, 224, 224))
のように、メモリ空いているGPUの番号を指定しても、指定したGPUには入っていない模様。
(おそらくtorchinfoにはGPUを細かく指定するオプションが存在するのだと思う。
しかし、私はここまで分かったところで上記の「ランタイムを再起動」して1枚目のメモリを空けた。そして解決した。したがって、torchinfoの詳細については調べていない。)
torchinfo.summaryについては下の記事を参照した。
具体例2. model.load_state_dict() で RuntimeError
model.load_state_dict(torch.load(modelname))
でcudaのランタイムエラーが出た時は、モデルがCPUで保存してあることを確認する。
モデルをGPUで保存してしまうと、読み込みの時にGPUのメモリを経由するので、メモリが足りなくなる場合がある。この問題を回避するために、モデルの保存時に、cpuに下ろしてから保存しておくと良いらしい。
model.load_state_dict()については下の記事を参照した。
備考
作業時に記録をきちんと残していなかったので、エラーメッセージや解決の流れ等、不正確な記述があると思われる。ご留意されたい。
また、賢者の皆様からのコメント・訂正等も歓迎します。
参考リンク(再掲)
-
対処法2、プロセス消去について
1-1.kill
コマンドでメモリ解放
https://qiita.com/miyamotok0105/items/033b850a205f958808e9
https://www.think-self.com/machine-learning/pytorch-out-of-memory/
1-2.kill
コマンドの説明
https://eng-entrance.com/linux-command-kill -
エラーの具体例について
2-1.torchinfo.summary()
について
https://qiita.com/tand826/items/ae3349495944048fd120
2-2.model.load_state_dict()
時のRuntimeErrorについて
https://katakori3.hatenablog.com/entry/2021/02/01/132525
更新履歴
20220713 kill
コマンドを用いたメモリ解放について、記述を追加しました。また、見出しを整理しました。