LoginSignup
7
6

More than 1 year has passed since last update.

PyTorch : CUDAのメモリ不足によるエラーを解決する

Last updated at Posted at 2022-05-27

作成日: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

error_torchinfo_summary.py
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()については下の記事を参照した。

備考

作業時に記録をきちんと残していなかったので、エラーメッセージや解決の流れ等、不正確な記述があると思われる。ご留意されたい。

また、賢者の皆様からのコメント・訂正等も歓迎します。

参考リンク(再掲)

  1. 対処法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. エラーの具体例について
    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コマンドを用いたメモリ解放について、記述を追加しました。また、見出しを整理しました。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6