2017-12-20 21 views
-1

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モジュールでは、このようなクラッシュが発生する可能性があります。

これらはConcurrentLoadermultiprocessingを使用したコードの一部である:

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を誤って使用しましたか?私は単純にクラスの中でキューの中に画像のバッチを保存し、メソッド/インスタンス変数を使ってアクセス可能にすることを考えました。

答えて

0

私はtensorflowを使用しようとすると同じエラーで来て、

E tensorflow/stream_executor/cuda/cuda_blas.cc:366] failed to create cublas handle: CUBLAS_STATUS_NOT_INITIALIZED 

マルチプロセッシングが、異なる環境tf1.4 + CUDA 8.0 + cudnn 6.0でいます。サンプルコードの matrixMulCUBLASは正常に動作します。 私は正しい解決策もあまりにも不思議です! 参照番号failed to create cublas handle: CUBLAS_STATUS_NOT_INITIALIZED on a AWS p2.xlarge instanceは私のためには機能しませんでした。

+0

テストの時間がたったのち、私は非常に奇妙なことを経験しました。もし 'tensorflow'が最後のインポートであり、セッションの初期化などが最後に起こると(データローダーとその他のものを初期化した後に)動作します。少なくともこの特定のDCGANでは。これは私がGitHubで以前作成したTensorFlowの問題を思い出させます:[tensorflow 0.8.0とmatplotlib#2085のセグメンテーションフォールト](https://github.com/tensorflow/tensorflow/issues/2085)。これはTensorFlow内のバグでもありました。TFが最後にインポートされた場合はうまくいきました.TFが最初にインポートされた場合はsegfaultを与えました – daniel451

+0

インポートの順序を変更するとエラーも消えてしまいますTFダウン)、できるだけ遅くセッションやものを有効にしますか? – daniel451

+0

同じ問題がまだ発生しませんでした。 実際、私はマルチエージェントシステム(各エージェントはネットワークを持っています)を訓練しようとしています。低相関のバッチデータを得るために、私はマルチワーク(マルチプロセッシング)を使ってデータを収集します。しかし、それは一日中ここにこだわりました.. –

関連する問題