在 cuStreamDestroy 中退出 Theano/CUDA 时崩溃

Crash in Theano/CUDA exit in cuStreamDestroy

我有一个链接到 CPython 并从那里调用 Theano+CUDA 代码的应用程序。

应用程序本身也使用了 CUDA 和 Cublas。但由于他们正在创建自己的句柄,我认为他们应该不会遇到问题。

GPU 处于独占模式,即仅供该进程使用。我在 Nvidia Tesla K20c 和 Nvidia GeForce GTX 680 上都发生了崩溃。在 Ubuntu 12.04 上。 CUDA 6.0。来自 Git.

的最新 Theano

有时,但并非总是如此,它在执行 CPython 清理时崩溃,其中 Theano 将间接清理其 Cublas 句柄(请参阅堆栈跟踪中的 cublasDestory_v2)。 CPython 清理是在 atexit 调用中完成的,也许这是相关的。

这是堆栈跟踪:

PROGRAM DEFECTIVE (TERMINATED BY SIGNAL):
Segmentation fault

Creating stack trace (innermost first):
#2  /lib/x86_64-linux-gnu/libc.so.6(+0x364a0) [0x2ab5845964a0]
#3  /usr/lib/libcuda.so(+0x1f60f5) [0x2ab586d560f5]
#4  /usr/lib/libcuda.so(+0x20476b) [0x2ab586d6476b]
#5  /usr/lib/libcuda.so(+0x17ac02) [0x2ab586cdac02]
#6  /usr/lib/libcuda.so(cuStreamDestroy_v2+0x52) [0x2ab586ca9b32]
#7  /usr/local/cuda-6.0/lib64/libcublas.so.6.0(+0x206074) [0x2ab57c6ee074]
#8  /usr/local/cuda-6.0/lib64/libcublas.so.6.0(+0x23a87d) [0x2ab57c72287d]
#9  /usr/local/cuda-6.0/lib64/libcublas.so.6.0(cublasDestroy_v2+0x1e) [0x2ab57c536fee]
#10  /home/zeyer/.theano/compiledir_Linux-3.16--generic-x86_64-with-Ubuntu-12.04-precise-x86
_64-2.7.3-64/cuda_ndarray/cuda_ndarray.so(_Z24CudaNdarray_gpu_shutdownP7_objectS0_+0x15) [0x
2ab598296065]
#11  /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x4f18) [0x2ab5838e4148]
#12  /usr/lib/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x855) [0x2ab5838a46b5]
#13  /usr/lib/libpython2.7.so.1.0(+0x5c86d) [0x2ab5838a486d]
#14  /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x53) [0x2ab583989083]
#15  /usr/lib/libpython2.7.so.1.0(PyEval_CallObjectWithKeywords+0x47) [0x2ab5839899d7]
#16  /usr/lib/libpython2.7.so.1.0(Py_Finalize+0xca) [0x2ab5838dc57a]
#17  /home/zeyer/sprint-executables/20150127.125851.367a43a.linux-x86_64-standard/NnTrainer/
nn-trainer.linux-x86_64-standard() [0xa0fb2b]
#18  /lib/x86_64-linux-gnu/libc.so.6(+0x3b901) [0x2ab58459b901]
#19  /lib/x86_64-linux-gnu/libc.so.6(+0x3b985) [0x2ab58459b985]
#20  /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf4) [0x2ab584581774]
#21  /home/zeyer/sprint-executables/20150127.125851.367a43a.linux-x86_64-standard/NnTrainer/nn-trainer.linux-x86_64-standard() [0x7b6391]

这是已知错误吗?我什至可以从哪里开始尝试调试它?我该如何解决这个问题?

我现在早些时候调用 Py_Finalize,而不是通过 std::atexit,到目前为止,我没有再遇到此崩溃。所以我想这就是解决方案。