MOB-LOG

モブおじの記録 (Programming, 統計・機械学習)

CUDAで使用するGPUのVRAM容量を制限する・制限を解除する。が、なぜかすべてのVRAMを使用してくれない。

TL;DR

未解決

問題:普段PyTorchで深層学習を行っていて、たまに以下の様にVRAMに余裕があるのにすべて予約せずにOut of Memoryを吐いてくることがある(↓例では10GiBの容量があるのに PyTorchは5.72 GiBしか予約していない)。

RuntimeError: CUDA out of memory. Tried to allocate 98.00 MiB (GPU 0; 9.78 GiB total capacity; 5.61 GiB already allocated; 15.38 MiB free; 5.72 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

CUDAでGPUのVRAMの使用容量を制限できるようなので、それがかかってのかも、と調べてみた。 nvidia-smiのGOM設定でVRAM制限・制限解除ができるようだが、制限なしの状態でもこのエラーが現れるので、もはや何が悪いのかわからない。。。

GPU Operation Mode (GOM) property

GOMを設定することにより、GPUの利用に制限を掛けることができるらしい。

nvidia-smi --help-query-gpu 曰く、

(nvidia-smi --help-query-gpu | grep GOM -n10)

123-Section about gom properties
124:GOM allows to reduce power usage and optimize GPU throughput by disabling GPU features. Each GOM is designed to meet specific user needs.
125-In "All On" mode everything is enabled and running at full speed.
126-The "Compute" mode is designed for running only compute tasks. Graphics operations are not allowed.
127-The "Low Double Precision" mode is designed for running graphics applications that don't require high bandwidth double precision.
128:GOM can be changed with the (--gom) flag.
129-
130-"gom.current" or "gpu_operation_mode.current"
131:The GOM currently in use.
132-
133-"gom.pending" or "gpu_operation_mode.pending"
134:The GOM that will be used on the next reboot.

GOM値の確認

まずは現在の設定値を確認したい。nvidia-smiでGPU関連の設定値を調べるには、nvidia-smi --queryで全設定値を読み込むか、--query-gpu=[PROPERTY] として特定の値を指定する (--fotmatも指定しないといけないらしい)。

nvidia-smi --query-gpu=[PROPERTY] --format=csv

nvidia-smi --query-gpu=gom.current --format=csv としてクエリを与えると返してくれる。

nvidia-smi --query-gpu=gom.current --format=csv
gom.current
[N/A]

[N/A] と返ってきたので、恐らく設定されていないのだと。。。(じゃあなぜ6GiBしか予約してくれないんだ…)

明示的に”All On”を設定しないとダメなのか???

GOMを設定・解除

ここでは記述されていないが、nvidia-smi --gom=0とすると”All On" に設定できるらしいので、今走らせている学習プロセスが終了したら実施したい。

CUDAでGPUのVRAM容量を制限したり、解除したりするには、NVIDIAGPUを制御するためのツールやライブラリを使用する必要があります。以下に、GPUのVRAM制限と解除の方法を説明します。

  1. GPU VRAMの制限:

    GPU VRAMの制限には、NVIDIAGPU制御ツールである"NVIDIA System Management Interface (nvidia-smi)"を使用します。以下は、GPU VRAMの制限方法です:

    • ターミナルを開き、以下のコマンドを実行して、GPUのVRAMを制限します。-gom=xxxの部分には、VRAMの容量をメガバイト単位で指定します。

        nvidia-smi --gom=xxx
      
    • 例えば、VRAMを4GBに制限する場合は、次のようにコマンドを実行します。

        nvidia-smi --gom=4096
      
  2. GPU VRAMの制限を解除:

    制限を解除するには、nvidia-smiを再起動するか、再起動することなく制限を解除する方法があります。

    • nvidia-smiを再起動して制限を解除する場合:

        nvidia-smi --gom=0
      
    • システムを再起動せずに制限を解除する場合、以下のコマンドを実行します。

        nvidia-smi --gom=auto
      

    これにより、GPU VRAMの制限が解除される。