TensorFlow-GPU + Pythonマルチプロセッシングを使用すると、私は奇妙な動作に気付きました。TensorFlow-GPU + Pythonマルチプロセッシングを使用する場合のバグ?
私はDCGANを実装しています。これにはカスタマイズと独自のデータセットがあります。私はDCGANを特定の機能に調整しているので、トレーニングデータと評価用のテストデータがあります。
私のデータセットのサイズのため、Pythonのmultiprocessingを使用して並行して実行し、キューにプリロードするデータローダーを作成しました。
コードの構造は、大きく次のようになります。
class ConcurrentLoader:
def __init__(self, dataset):
...
class DCGAN
...
net = DCGAN()
training_data = ConcurrentLoader(path_to_training_data)
test_data = ConcurrentLoader(path_to_test_data)
このコードは、CUDA 8.0を使用してTensorFlow-GPU < = 1.3.0にTensorFlow-CPU とに細かい動作しますが、私が実行したときTensorFlow-GPU 1.4.1およびCUDA 9(2017年12月のようなTFの最新のリリースでは、& CUDA)と正確に同じコードがクラッシュ:
2017-12-20 01:15:39.524761: E tensorflow/stream_executor/cuda/cuda_blas.cc:366] failed to create cublas handle: CUBLAS_STATUS_NOT_INITIALIZED
2017-12-20 01:15:39.527795: E tensorflow/stream_executor/cuda/cuda_blas.cc:366] failed to create cublas handle: CUBLAS_STATUS_NOT_INITIALIZED
2017-12-20 01:15:39.529548: E tensorflow/stream_executor/cuda/cuda_blas.cc:366] failed to create cublas handle: CUBLAS_STATUS_NOT_INITIALIZED
2017-12-20 01:15:39.535341: E tensorflow/stream_executor/cuda/cuda_dnn.cc:385] could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
2017-12-20 01:15:39.535383: E tensorflow/stream_executor/cuda/cuda_dnn.cc:352] could not destroy cudnn handle: CUDNN_STATUS_BAD_PARAM
2017-12-20 01:15:39.535397: F tensorflow/core/kernels/conv_ops.cc:667] Check failed: stream->parent()->GetConvolveAlgorithms(conv_parameters.ShouldIncludeWinogradNonfusedAlgo<T>(), &algorithms)
[1] 32299 abort (core dumped) python dcgan.py --mode train --save_path ~/tf_run_dir/test --epochs 1
は何R私がちょうどそれを取り除くと、私はエラーtest_data
が発生しないことです。したがって、いくつかの奇妙な理由で、TensorFlow-GPU 1.4.1 & CUDA 9はただ1つのConcurrentLoader
で動作しますが、複数のローダーがで初期化されるとクラッシュします。。
GPUのVRAM、システムのRAM、そしてPythonのプロセスさえも、スクリプトがクラッシュした後も、(例外の後で)私は手動でPythonプロセスをシャットダウンする必要があります。私は(TFバックエンドを使用して!)Kerasで同じモデルを実装する際にコードも2つの同時ローダーと、うまく動作しますので
はさらに、それは、Pythonのmultiprocessing
モジュールにいくつかの奇妙な接続を持っている必要があります。私は、Kerasが何とかその間に抽象化のレイヤーを作成していて、TFがクラッシュしないようにしていると思います。
multiprocessing
モジュールでは、このようなクラッシュが発生する可能性があります。
これらはConcurrentLoader
内multiprocessing
を使用したコードの一部である:
def __init__(self, dataset):
...
self._q = mp.Queue(64)
self._file_cycler = cycle(img_files)
self._worker = mp.Process(target=self._worker_func, daemon=True)
self._worker.start()
def _worker_func(self):
while True:
... # gets next filepaths from self._file_cycler
buffer = list()
for im_path in paths:
... # uses OpenCV to load each image & puts it into the buffer
self._q.put(np.array(buffer).astype(np.float32))
...これがそれです。
「不安定」または「非パイソン」multiprocessing
コードはどこで書いていますか?私はdaemon=True
が、メインプロセスが終了するとすぐにすべてのプロセスが強制終了されるようにするべきだと思いましたか?残念ながら、これはこの特定のエラーの場合ではありません。
ここでデフォルトのmultiprocessing.Process
またはmultiprocessing.Queue
を誤って使用しましたか?私は単純にクラスの中でキューの中に画像のバッチを保存し、メソッド/インスタンス変数を使ってアクセス可能にすることを考えました。
テストの時間がたったのち、私は非常に奇妙なことを経験しました。もし 'tensorflow'が最後のインポートであり、セッションの初期化などが最後に起こると(データローダーとその他のものを初期化した後に)動作します。少なくともこの特定のDCGANでは。これは私がGitHubで以前作成したTensorFlowの問題を思い出させます:[tensorflow 0.8.0とmatplotlib#2085のセグメンテーションフォールト](https://github.com/tensorflow/tensorflow/issues/2085)。これはTensorFlow内のバグでもありました。TFが最後にインポートされた場合はうまくいきました.TFが最初にインポートされた場合はsegfaultを与えました – daniel451
インポートの順序を変更するとエラーも消えてしまいますTFダウン)、できるだけ遅くセッションやものを有効にしますか? – daniel451
同じ問題がまだ発生しませんでした。 実際、私はマルチエージェントシステム(各エージェントはネットワークを持っています)を訓練しようとしています。低相関のバッチデータを得るために、私はマルチワーク(マルチプロセッシング)を使ってデータを収集します。しかし、それは一日中ここにこだわりました.. –