質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.36%

GPUでTensorflowモデルを実行 - UnknownError: Failed to get convolution algorithm.

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 5,405

score 45

<やりたいこと>

下記の環境で以下のシンプルなニューラルネットワークモデルを実行しました。
Code1   Denseレイヤのみを使用したモデル
Code2   Convolutionレイヤを使用したモデル(CNN)

Code1は、正常に実行されましたが、2のモデル実行時に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.のエラーが出てしまい。
色々と検索し、原因を探りましたが、解決できず。。皆様のお力をお借りしたく。

<確認したこと>
  • GPUを認識していること(tf.test.gpu_device_name() にて確認)
  • CUDA、Tensorflow等のバージョン互換性が一致していること
  • GPU RAMが別のプロセスによって不足になっていないこと

環境

Windows 10
NVIDIA GeForce GTX1650

python 3.6.12
conda 4.9.2
TensorFlow-GPU 2.0.0

Visual Studio Community 2017
CUDA 10.0
cuDNN 7.4.2


import tensorflow as tf
from tensorflow import keras
import numpy as np

fashion_mnist = keras.datasets.fashion_mnist 
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data() 
train_images = train_images/225.0
test_images = test_images/225.0

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28,28)),
    keras.layers.Dense(units=128, activation="relu"), 
    keras.layers.Dense(units=10, activation="softmax") 
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=10) 
import tensorflow as tf
from tensorflow.keras import datasets, layers, models

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_images, test_images = train_images / 255.0, test_images / 255.0

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(units=64, activation='relu'))
model.add(layers.Dense(units=10))
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))
Train on 50000 samples, validate on 10000 samples
Epoch 1/10
   32/50000 [..............................] - ETA: 29:19
---------------------------------------------------------------------------

UnknownError                              Traceback (most recent call last)
<ipython-input-48-ce520e3e9c1d> in <module>()
     21               loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
     22               metrics=['accuracy'])
---> 23 model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))

C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
    726         max_queue_size=max_queue_size,
    727         workers=workers,
--> 728         use_multiprocessing=use_multiprocessing)
    729 
    730   def evaluate(self,

C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py in fit(self, model, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, **kwargs)
    322                 mode=ModeKeys.TRAIN,
    323                 training_context=training_context,
--> 324                 total_epochs=epochs)
    325             cbks.make_logs(model, epoch_logs, training_result, ModeKeys.TRAIN)
    326 

C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py in run_one_epoch(model, iterator, execution_function, dataset_size, batch_size, strategy, steps_per_epoch, num_samples, mode, training_context, total_epochs)
    121         step=step, mode=mode, size=current_batch_size) as batch_logs:
    122       try:
--> 123         batch_outs = execution_function(iterator)
    124       except (StopIteration, errors.OutOfRangeError):
    125         # TODO(kaftan): File bug about tf function and errors.OutOfRangeError?

C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\keras\engine\training_v2_utils.py in execution_function(input_fn)
     84     # `numpy` translates Tensors to values in Eager mode.
     85     return nest.map_structure(_non_none_constant_value,
---> 86                               distributed_function(input_fn))
     87 
     88   return execution_function

C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\eager\def_function.py in __call__(self, *args, **kwds)
    455 
    456     tracing_count = self._get_tracing_count()
--> 457     result = self._call(*args, **kwds)
    458     if tracing_count == self._get_tracing_count():
    459       self._call_counter.called_without_tracing()

C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\eager\def_function.py in _call(self, *args, **kwds)
    518         # Lifting succeeded, so variables are initialized and we can run the
    519         # stateless function.
--> 520         return self._stateless_fn(*args, **kwds)
    521     else:
    522       canon_args, canon_kwds = \

C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\eager\function.py in __call__(self, *args, **kwargs)
   1821     """Calls a graph function specialized to the inputs."""
   1822     graph_function, args, kwargs = self._maybe_define_function(args, kwargs)
-> 1823     return graph_function._filtered_call(args, kwargs)  # pylint: disable=protected-access
   1824 
   1825   @property

C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\eager\function.py in _filtered_call(self, args, kwargs)
   1139          if isinstance(t, (ops.Tensor,
   1140                            resource_variable_ops.BaseResourceVariable))),
-> 1141         self.captured_inputs)
   1142 
   1143   def _call_flat(self, args, captured_inputs, cancellation_manager=None):

C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\eager\function.py in _call_flat(self, args, captured_inputs, cancellation_manager)
   1222     if executing_eagerly:
   1223       flat_outputs = forward_function.call(
-> 1224           ctx, args, cancellation_manager=cancellation_manager)
   1225     else:
   1226       gradient_name = self._delayed_rewrite_functions.register()

C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\eager\function.py in call(self, ctx, args, cancellation_manager)
    509               inputs=args,
    510               attrs=("executor_type", executor_type, "config_proto", config),
--> 511               ctx=ctx)
    512         else:
    513           outputs = execute.execute_with_cancellation(

C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\eager\execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
     65     else:
     66       message = e.message
---> 67     six.raise_from(core._status_to_exception(e.code, message), None)
     68   except TypeError as e:
     69     keras_symbolic_tensors = [

C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\six.py in raise_from(value, from_value)

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 sequential_7/conv2d_12/Conv2D (defined at C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\framework\ops.py:1751) ]] [Op:__inference_distributed_function_24004]

Function call stack:
distributed_function
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • koyamashinji

    2020/11/28 12:27

    アドバイスいただき有難うございます。

    昨晩からずっと検証を続けていましたが、今回のエラー発生の直接的な原因は、ソースのコンパイル時に使用されたCuDNNライブラリのバージョンが7.6.0だったため、ランタイム時に読み込まれるcuDNNライブラリ7.4.2と不一致を起こしていたことに起因することがわかりました。
    cuDNNを7.6.0にアップデートすると、正常動作しました。

    ただ、メモリの使用に関しては、ご指摘のとおり、常に上限いっぱいの4G近くを使用してしまっている状態です。
    提示いただいた方法含め、メモリ量の割り当てを制限するコードを書いて試しましたが、依然として上限いっぱいの4Gが使われてしまいます。

    今回の質問については自己解決とし、メモリ使用に関しては別の質問を立てたいと思います。
    下名メモリ使用については全く知識がなかったため、大変助かりました。

    キャンセル

  • jbpb0

    2020/11/28 14:18 編集

    メモリーをたくさん確保するのは、その方が計算速度的に有利だからなので、GPUを使うプログラムを同時に動かすのでなければ、気にしなくてもいいと思いますよ

    ただし、一旦確保したメモリーは、要らなくなっても開放しないので、pythonを完全に落とさないとメモリーは返ってきません
    別のGPUを使うプログラムを動かす場合は、前にGPUを使ったpythonは完全に落とさないといけません
    (AIの実行は終わっていても、そのpythonがまだ生きていたら「同時」になる)

    キャンセル

  • koyamashinji

    2020/11/28 20:55

    なるほど。将来的には、同時処理もできるように、やはりメモリ使用制限については気になるところです。
    色々ご教示頂き有難うございます。

    キャンセル

回答 1

check解決した方法

+1

エラーの原因

  • 「ランタイム時に読み込まれたCuDNNライブラリ」と「ソースのコンパイル時に使用されたCuDNNライブラリ」のバージョン不一致

これまで、TensorFlowで公開されているテスト済みビルド設定に気を付けて、バージョン互換を崩さないように環境を構築してきました。
逆に言えば、バージョン互換さえ守っていれば、動作は保証されていると過信していましたが、それが今回のエラー発生の原因でした。

コンソールで一から実行ログを見ていると、下記の警告に気づきました。

Loaded runtime CuDNN library: 7.4.2 but source was compiled with: 7.6.0.  
CuDNN library major and minor version needs to match or have higher minor version in case of CuDNN 7.0 or later version. If using a binary install, upgrade your CuDNN library.  
If building from sources, make sure the library loaded at runtime is compatible with the version specified during compile configuration.

NVIDIAアーカイブからcuDNN v7.6.0 for CUDA 10.0をダウンロードし、
ダウンロード先フォルダにPATHを設定し直したところ、正常動作しました。

ここにも書いありますが、テスト済みビルドのページはなかなか更新されないみたいなので、ちゃんとログにしたがって、バージョンを合わせることが必要みたいです。


以下の環境で正常動作を確認

Windows 10
NVIDIA GeForce GTX1650

python 3.7.9
conda 4.9.2
TensorFlow-GPU 1.15.0

Visual Studio Community 2017
CUDA 10.0
cuDNN 7.6.0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る