1. ホーム
  2. テンソルフロー

テンソルフロー CUDA メモリ不足

2022-03-01 18:03:56

今日、サーバーを立ち上げたばかりなのに、プログラムが動かなくて、ビックリしそうになったよ。

エラーの種類 cuda_erroe_out_of_memory

E tensorflow/stream_executor/cuda/cuda_driver.cc:924] failed to alloc 17179869184 bytes on host: CUDA_ERROR_OUT_OF_MEMORY
W . /tensorflow/core/common_runtime/gpu/pool_allocator.h:195] could not allocate pinned host memory of size: 17179869184
Killed

実は結構わかりやすいんですよ。一般的な考え方は、サーバーのGPUサイズがM

tensorflowはN個(N<M)の要求しかできない。

つまり、tensorflowはGPUの全リソースを要求できないことを告げて終了します。

解決方法

コード内のSessionを探す

セッション定義の前に

config = tf.ConfigProto(allow_soft_placement=True)

# 最大70%のgpuリソース
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.7)

# まずはtensorflowにすべてのGPUリソースを与えず、必要に応じて追加することから始めます。
config.gpu_options.allow_growth = True です。
sess = tf.Session(config=config)

これでいい

実は、tensorflowは欲張りなツールなのです。

device_idでgpuを指定しても、別のGPUのメモリリソースを占有するので、プログラムの前に実行する必要があります

実行する

export CUDA_VISIBLE_DEVICES=n python main.py

(nは可視サーバー番号)

そして、他のGPUリソースを占有しないように、python code.pyを実行しに行きます。

最近tensorflowを始めたばかりで、それ以前はcaffeでした

今週は3日連続で、研究室の人たちから「サーバーのリソースを使いすぎている」という報告がありました。

つまり、コードを実行する前に、export CUDA_VISIBLE_DEVICES=n を実行します。

1つまたは個々のGPUのみを可視化し、他を不可視化する。

例えば、サーバー上に8つのGPUがあり、3人でサーバーを共有している場合、コードを実行する前にまず次のコマンドを入力します。

nvidia-smi

上記のコマンドで、どのGPUが使われていないか、例えば#3と#5が使われていないことを確認し、次のコマンドでプログラムを実行します。

export CUDA_VISIBLE_DEVICES=3,5 python main.py