ソースコンパイルされたTensorflowビルドを使用してKerasで畳み込みネットワークを実行するのに問題があります。私はCUDA 10.0とCuDNN 7.4を使用していますが、両方とも正しくコンパイルされており、サンプルのmakefileで確認されています。密集したネットワークではなくconvネットを実行すると、これらのエラーが発生します。
UnknownError: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
[[{{node conv2d_1/convolution}}]]
[[metrics/acc/Mean/_169]]
CUDAとCuDNNへのパスをパスに直接追加しようとしましたが、TensorFlowを再インストールして再コンパイルしようとしましたが、結果はありませんでした。これはこのマシンへの新規インストールなので、バージョンの競合に関する問題はありません。
import keras
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D, Dropout
from keras.datasets import mnist
import sys
def one_hot(data, num_categories):
oh = np.zeros((len(data),num_categories))
for i,entry in enumerate(data):
oh[i, entry] = 1
return oh
# import data
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# preprocess data
x_train = x_train.reshape( (60000,28,28,1) ) / 256
x_test = x_test.reshape( (10000,28,28,1) ) / 256
y_train = one_hot(y_train, 10)
y_test = one_hot(y_test, 10)
# build the model
model = Sequential()
input_shape=(28,28,1)
model.add(Conv2D(filters=32,
kernel_size=(3,3),
activation='relu',
input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2,2),
strides=(2,2)))
model.add(Conv2D(filters=32,
kernel_size=(3,3),
activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2),
strides=(2,2)))
model.add(Flatten())
model.add(Dropout(0.5))
model.add(Dense(units=256,
activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(units=10,
activation='softmax'))
# load model weight
# compile model
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.summary()
# train
num_epochs = 20
if num_epochs != 0:
# train the model
model.fit(x_train, y_train,
batch_size=32,
epochs=num_epochs)
# evaluate model
score = model.evaluate(x_test, y_test)
print('\nScore: ', score)
私が実行しているコードは、専用GPUを備えていない私のラップトップで完全にうまく機能しますが、CUDA/CuDNNをこのデスクトップで稼働させようとしています。この問題の診断に役立つ情報をいただければ幸いです。
更新:ソースからTFをビルドするとき、最新バージョンとは対照的に、デフォルトのNCCLの使用に関連するエラーがあるようです。 OSに依存しないバージョンの最新のNCCLをインストールしようとしています。これにより、新しいエラーが発生します。ldconfigはNCCLをリストしますが、ライブラリを見つけることができません。このため、最新のNCCLを使用してソースからビルドすることはできません。そのため、これが根本的な原因かどうかはわかりません。
このエラーメッセージは、解決策が異なる3つの理由で表示されています。
pythonプロセスをシャットダウンし、~/.nv
ディレクトリを削除して(Linuxではrm -rf ~/.nv
)、Pythonプロセス。これが機能する理由は正確にはわかりません。おそらく、少なくとも部分的に2番目のオプションに関連しています。
このエラーは、グラフィックカードのRAMが不足した場合にも表示されることがあります。 nvidia GPUでは、nvidia-smi
を使用してグラフィックカードのメモリ使用量を確認できます。これにより、使用中のGPU RAMの使用量(ほぼ限界に達している場合は6025MiB / 6086MiB
のようなもの)だけでなく、プロセスはGPU RAMを使用しています。
RAMが不足している場合は、プロセスを再起動して(RAMを解放する必要があります)、メモリをあまり使用しないアプローチをとる必要があります。いくつかのオプションは次のとおりです。
import keras
import tensorflow as tf
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.9
keras.backend.tensorflow_backend.set_session(tf.Session(config=config))
上記の項目と一緒に使用しないと、モデルの評価が遅くなる可能性があります。
同様のモデルが機能していない場合は、VRAMおよびが不足していないため、キャッシュはクリーンです。戻って設定します。利用可能な最良のインストールガイドを使用したCUDA + TensorFlow-NVIDIA/CUDAサイトの手順ではなく、 https://www.tensorflow.org/install/gp の指示に従うことで最も成功しました。