Win10 KerasでGPU使用時のCUBLAS_STATUS_ALLOC_FAILEDエラー
Win10 でkerasを導入したところ,
[failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED]
というエラーが発生して学習が実行できませんでした.
どうやら使用中のGPUのメモリ使用率が高すぎることが原因のようでした.
引用記事ではtotalMemoryとfreeMemoryの値を参考にメモリ使用率を指定せよとのことでしたが,うちの環境ではさらにメモリ使用率を下げないと同じエラーが発生してしまいました. 原因がわかっていないのですが,とりあえず状況をメモしておきます.
環境
- OS: Windows 10 (64bit)
- GPU: NVIDIA GeForce GTX 750 Ti(2GB)
- NVIDIA GPU driver 418.96
- python 3.6.8
- keras 2.2.4
- tensorflow 1.13.1
- CUDA 10.1
- cuDNN 7.5.1
エラーの内容
↓のコードを実行した際に,
totalMemory: 2.00GiB freeMemory: 1.64GiB
だったので8割くらい行けるだろうと思って
config.gpu_options.per_process_gpu_memory_fractionを0.8としたのですが
successfully opened CUDA library cublas64_90.dll locally
というメッセージの後,
failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
が発生しました.
メモリ使用率を0.3程度に下げると一応実行できるようになりました.
コード
import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from keras.layers.recurrent import LSTM from keras.models import Sequential from keras.layers import Dense, Activation from keras.optimizers import Adam # GPUを使用している場合,メモリ使用率を制限する import tensorflow as tf from keras.backend.tensorflow_backend import set_session config = tf.ConfigProto() config.gpu_options.per_process_gpu_memory_fraction = 0.3 set_session(tf.Session(config=config)) # データの読み込み (略) # モデルの作成 model = Sequential() num_in_units = 1 num_hidden_units = 20 model.add(LSTM(units=num_hidden_units, input_shape=(input_length, num_in_units), kernel_initializer="random_normal", stateful=False, return_sequences=False)) num_out_units = 1 model.add(Dense(units=num_out_units, kernel_initializer="random_normal")) model.add(Activation('linear')) model.compile(loss="mean_squared_error", optimizer=Adam(lr=0.01, beta_1=0.9, beta_2=0.999)) # モデルの学習 model.fit(train_x, train_y, epochs=20, batch_size=10, validation_data=(val_x, val_y)) # ここでエラー
GPUを使用しない
ちなみにkeras-gpu,tensorflow-gpuがインストールされている環境でも
上記のエラー等があってGPUを使用したくない場合,kerasのimport前に
環境変数 "CUDA_VISIBLE_DEVICES"を"-1"とすればCPUで実行できるようです.
# GPUを使わない場合 import os os.environ["CUDA_VISIBLE_DEVICES"] = "-1" import keras