🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

CUDA

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Q&A

解決済

1回答

12244閲覧

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

koyamashinji

総合スコア45

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

CUDA

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

0グッド

1クリップ

投稿2020/11/26 09:27

<やりたいこと>

下記の環境で以下のシンプルなニューラルネットワークモデルを実行しました。
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


Code1

1import tensorflow as tf 2from tensorflow import keras 3import numpy as np 4 5fashion_mnist = keras.datasets.fashion_mnist 6(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data() 7train_images = train_images/225.0 8test_images = test_images/225.0 9 10model = keras.Sequential([ 11 keras.layers.Flatten(input_shape=(28,28)), 12 keras.layers.Dense(units=128, activation="relu"), 13 keras.layers.Dense(units=10, activation="softmax") 14]) 15model.compile(optimizer='adam', 16 loss='sparse_categorical_crossentropy', 17 metrics=['accuracy']) 18model.fit(train_images, train_labels, epochs=10)

Code2

1import tensorflow as tf 2from tensorflow.keras import datasets, layers, models 3 4(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data() 5train_images, test_images = train_images / 255.0, test_images / 255.0 6 7model = models.Sequential() 8model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3))) 9model.add(layers.MaxPooling2D((2, 2))) 10model.add(layers.Conv2D(64, (3, 3), activation='relu')) 11model.add(layers.MaxPooling2D((2, 2))) 12model.add(layers.Conv2D(64, (3, 3), activation='relu')) 13model.add(layers.Flatten()) 14model.add(layers.Dense(units=64, activation='relu')) 15model.add(layers.Dense(units=10)) 16model.compile(optimizer='adam', 17 loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), 18 metrics=['accuracy']) 19model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))

Error

1Train on 50000 samples, validate on 10000 samples 2Epoch 1/10 3 32/50000 [..............................] - ETA: 29:19 4--------------------------------------------------------------------------- 5 6UnknownError Traceback (most recent call last) 7<ipython-input-48-ce520e3e9c1d> in <module>() 8 21 loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), 9 22 metrics=['accuracy']) 10---> 23 model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels)) 11 12C:\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) 13 726 max_queue_size=max_queue_size, 14 727 workers=workers, 15--> 728 use_multiprocessing=use_multiprocessing) 16 729 17 730 def evaluate(self, 18 19C:\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) 20 322 mode=ModeKeys.TRAIN, 21 323 training_context=training_context, 22--> 324 total_epochs=epochs) 23 325 cbks.make_logs(model, epoch_logs, training_result, ModeKeys.TRAIN) 24 326 25 26C:\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) 27 121 step=step, mode=mode, size=current_batch_size) as batch_logs: 28 122 try: 29--> 123 batch_outs = execution_function(iterator) 30 124 except (StopIteration, errors.OutOfRangeError): 31 125 # TODO(kaftan): File bug about tf function and errors.OutOfRangeError? 32 33C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\keras\engine\training_v2_utils.py in execution_function(input_fn) 34 84 # `numpy` translates Tensors to values in Eager mode. 35 85 return nest.map_structure(_non_none_constant_value, 36---> 86 distributed_function(input_fn)) 37 87 38 88 return execution_function 39 40C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\eager\def_function.py in __call__(self, *args, **kwds) 41 455 42 456 tracing_count = self._get_tracing_count() 43--> 457 result = self._call(*args, **kwds) 44 458 if tracing_count == self._get_tracing_count(): 45 459 self._call_counter.called_without_tracing() 46 47C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\eager\def_function.py in _call(self, *args, **kwds) 48 518 # Lifting succeeded, so variables are initialized and we can run the 49 519 # stateless function. 50--> 520 return self._stateless_fn(*args, **kwds) 51 521 else: 52 522 canon_args, canon_kwds = \ 53 54C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\eager\function.py in __call__(self, *args, **kwargs) 55 1821 """Calls a graph function specialized to the inputs.""" 56 1822 graph_function, args, kwargs = self._maybe_define_function(args, kwargs) 57-> 1823 return graph_function._filtered_call(args, kwargs) # pylint: disable=protected-access 58 1824 59 1825 @property 60 61C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\eager\function.py in _filtered_call(self, args, kwargs) 62 1139 if isinstance(t, (ops.Tensor, 63 1140 resource_variable_ops.BaseResourceVariable))), 64-> 1141 self.captured_inputs) 65 1142 66 1143 def _call_flat(self, args, captured_inputs, cancellation_manager=None): 67 68C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\eager\function.py in _call_flat(self, args, captured_inputs, cancellation_manager) 69 1222 if executing_eagerly: 70 1223 flat_outputs = forward_function.call( 71-> 1224 ctx, args, cancellation_manager=cancellation_manager) 72 1225 else: 73 1226 gradient_name = self._delayed_rewrite_functions.register() 74 75C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\tensorflow_core\python\eager\function.py in call(self, ctx, args, cancellation_manager) 76 509 inputs=args, 77 510 attrs=("executor_type", executor_type, "config_proto", config), 78--> 511 ctx=ctx) 79 512 else: 80 513 outputs = execute.execute_with_cancellation( 81 82C:\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) 83 65 else: 84 66 message = e.message 85---> 67 six.raise_from(core._status_to_exception(e.code, message), None) 86 68 except TypeError as e: 87 69 keras_symbolic_tensors = [ 88 89C:\Users\koyamashinji\anaconda3\envs\gpu_trial\lib\site-packages\six.py in raise_from(value, from_value) 90 91UnknownError: 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. 92 [[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] 93 94Function call stack: 95distributed_function

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2020/11/27 04:14 編集

Windows 10, python 3.7.9, tensorflow 1.15 (GPU版)で、Code2も動きました tensorflowのバージョンが違うので、参考にならないかもしれませんが
meg_

2020/11/27 00:58

参考情報ですが、ubuntu18+anaconda+tensorflow2のCNNで同様のエラーが発生しました。 python3.8をインストール(ソースからビルド)し、環境構築したところCNNも問題なく動きました。
koyamashinji

2020/11/27 12:33

皆様ご回答ありがとうございます。下名はwindows 10 なので、jbpb0さんのコメントの python 3.7.9, tensorflow 1.15 (GPU版)の環境を作成して試してみましたが、やはり同じエラーが出ます。jbpb0さんは、CUDA等のバージョンは何をご利用されていますか?
jbpb0

2020/11/27 13:13

CUDA 10.0, cuDNN 7.6.4 です
jbpb0

2020/11/27 14:03

Code2実行中に、Windowsの タスクマネージャー→パフォーマンス→GPU 0 の専用GPUメモリ が 9.2/11.0 GB となります GeForce GTX1650はメモリ4GBではありませんでしたっけ?
jbpb0

2020/11/27 15:37

バッチサイズを小さくしても、9.2GBは減りませんでした tensorflowは、実際に必要かどうかは別にして、GPUのメモリーの大部分を確保してしまうみたいです
jbpb0

2020/11/28 01:55

環境変数 TF_FORCE_GPU_ALLOW_GROWTH を true に設定したら、必要な分しかGPUのメモリーを確保しなくなるとのこと https://cocoinit23.com/tensorflow-keras-tf-force-gpu-allow-growth/ それでやってみたら、Code2実行中の専用GPUメモリ は 0.8/11.0 GB になりました(バッチサイズ指定無しの場合) python起動前の状態で 0.3/11.0 GB だったので、差分は 0.5GB です GTX1650でも全然余裕ですね
koyamashinji

2020/11/28 03:27

アドバイスいただき有難うございます。 昨晩からずっと検証を続けていましたが、今回のエラー発生の直接的な原因は、ソースのコンパイル時に使用されたCuDNNライブラリのバージョンが7.6.0だったため、ランタイム時に読み込まれるcuDNNライブラリ7.4.2と不一致を起こしていたことに起因することがわかりました。 cuDNNを7.6.0にアップデートすると、正常動作しました。 ただ、メモリの使用に関しては、ご指摘のとおり、常に上限いっぱいの4G近くを使用してしまっている状態です。 提示いただいた方法含め、メモリ量の割り当てを制限するコードを書いて試しましたが、依然として上限いっぱいの4Gが使われてしまいます。 今回の質問については自己解決とし、メモリ使用に関しては別の質問を立てたいと思います。 下名メモリ使用については全く知識がなかったため、大変助かりました。
jbpb0

2020/11/28 05:18 編集

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

2020/11/28 11:55

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

回答1

0

自己解決

エラーの原因

  • 「ランタイム時に読み込まれた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

投稿2020/11/28 03:51

koyamashinji

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問