【问题标题】:Theano: cublasSgemm failed (14) an internal operation failedTheano: cublasSgemm failed (14) 内部操作失败
【发布时间】:2016-01-20 01:56:26
【问题描述】:

有时,在运行良好一段时间后,Theano / CUDA 会出现这样的错误:

RuntimeError: cublasSgemm failed (14) an internal operation failed
 unit=0 N=0, c.dims=[512 2048], a.dim=[512 493], alpha=%f, beta=%f, a=%p, b=%p, c=%p sa_0=%d, sa_1=%d, sb_0=%d, sb_1=%d, sc_0=%d, sc_1=%d
Apply node that caused the error: GpuDot22(GpuReshape{2}.0, GpuReshape{2}.0)
Inputs types: [CudaNdarrayType(float32, matrix), CudaNdarrayType(float32, matrix)]
Inputs shapes: [(512, 493), (493, 2048)]
Inputs strides: [(493, 1), (2048, 1)]
Inputs values: ['not shown', 'not shown']

由于我的代码在一段时间内运行良好(我进行神经网络训练,并且大部分时间都在运行,即使发生此错误,它已经运行良好 >2000 小批量),我想知道的原因。可能是硬件故障?

这是 CUDA 6.0 和最近的 Theano(昨天来自 Git)、Ubuntu 12.04、GTX 580。

我在 K20 上也遇到了 CUDA 6.5 的错误:

RuntimeError: cublasSgemm failed (14) an internal operation failed
 unit=0 N=0, c.dims=[2899 2000], a.dim=[2899 493], alpha=%f, beta=%f, a=%p, b=%p, c=%p sa_0=%d, sa_1=%d, sb_0=%d, sb_1=%d, sc_0=%d, sc_1=%d
Apply node that caused the error: GpuDot22(GpuReshape{2}.0, GpuReshape{2}.0)
Inputs types: [CudaNdarrayType(float32, matrix), CudaNdarrayType(float32, matrix)]
Inputs shapes: [(2899, 493), (493, 2000)]
Inputs strides: [(493, 1), (2000, 1)]
Inputs values: ['not shown', 'not shown']

(我过去有时遇到的另一个错误现在是this。不确定这是否相关。)

通过Markus,遇到了同样的错误:

RuntimeError: cublasSgemm failed (14) an internal operation failed
 unit=0 N=0, c.dims=[2 100], a.dim=[2 9919], alpha=%f, beta=%f, a=%p, b=%p, c=%p sa_0=%d, sa_1=%d, sb_0=%d, sb_1=%d, sc_0=%d, sc_1=%d
Apply node that caused the error: GpuDot22(GpuFlatten{2}.0, weight_hidden_)
Inputs types: [CudaNdarrayType(float32, matrix), CudaNdarrayType(float32, matrix)]
Inputs shapes: [(2, 9919), (9919, 100)]
Inputs strides: [(9919, 1), (100, 1)]
Inputs values: ['not shown', 'not shown']

使用 CUDA 6.5、Windows 8.1、Python 2.7、GTX 970M。

该错误仅发生在我自己的网络中,如果我从 Theano 运行 LeNet 示例,它运行良好。尽管网络在 CPU 上编译和运行良好(对于使用 Linux 的一些同事,也在 GPU 上)。有谁知道问题可能是什么?

【问题讨论】:

  • 什么操作系统?什么显卡?您的 GPU 是否也用作显示设备?
  • @MichalHosala:Ubuntu 12.04,我认为是 GTX 580(不确定 - 我已经删除了日志)。它仅供该进程使用。
  • 我有理由确定错误代码通常表示调用中的内核超时。由于 SGEMM 的运行时间大致与维度 nmk 的乘积成正比,因此您的矩阵可能太大。但是,如果我正确地解释了您上面的数据,那么矩阵似乎并没有那么大,而且 GTX 580 相当快。但也许您的应用程序会在后台创建更大的中间矩阵?我建议使用分析器检查内核运行时间。此外,尝试使用不用于 GUI 但仅作为计算设备运行的 GPU。
  • @njuffa:如果发生超时,我可以增加超时时间,还是完全禁用它? (为什么会出现?)而且我已经将 GPU 专门用于计算。
  • @Albert:GPU 可以运行计算内核或服务于操作系统的 GUI。 CUDA 支持的所有操作系统都有一个看门狗计时器,以防止 GUI 无限期冻结,并将杀死超过时间限制(通常为几秒钟)的 CUDA 内核。在 Windows 上,我认为所有在 WDDM 控制下运行的 GPU 都受看门狗的约束,在 Linux 上,如果你在 GPU 上运行 X,就会发生这种情况。是的,您可以更改超时限制,它是特定于操作系统的,我手头没有详细信息。在这一点上,超时只是一个可行的假设。

标签: cuda theano cublas


【解决方案1】:

仅供参考,以防有人偶然发现:

这对我来说不再发生了。我不确定是什么修复了它,但我认为主要区别在于我避免了任何多线程和分叉(没有 exec)。这导致了许多类似的问题,例如Theano CUDA error: an illegal memory access was encountered (StackOverflow)Theano CUDA error: an illegal memory access was encountered (Google Groups discussion)。特别是。在 Google 网上论坛上的讨论非常有帮助。

Theano 函数不是多线程安全的。然而,这并不是一个 对我来说是个问题,因为我只在一个线程中使用它。但是,我 仍然认为其他线程可能会导致这些问题。也许是 与 Python 的 GC 有关,它在某些中释放了一些 Cuda_Ndarray theano.function 运行时的其他线程。

我看了一下relevant Theano code,不确定它是否涵盖 所有这些情况。

请注意,您甚至可能不知道自己有一些背景 线程。一些 Python 标准库代码可以产生这样的后台线程。 例如。 multiprocessing.Queue 会这样做。

我无法避免拥有多个 线程,直到在 Theano 中解决这个问题,我创建了一个新的子进程 用一个线程来完成所有的 Theano 工作。这也有 几个优点,例如:更清晰的代码分离,被 在某些情况下更快,因为它真的是并行运行的,并且 能够使用多个 GPU。

请注意,仅使用多处理模块对我不起作用 很好,因为有几个库(Numpy 和其他库,也许 Theano 本身)在分叉进程中可能表现不佳(取决于 关于版本、操作系统和竞争条件)。因此,我需要一个真正的 子进程(fork + exec,不仅仅是 fork)。

我的代码是here,以防有人对此感兴趣。

有 ExecingProcess 是在 multiprocessing.Process 之后建模的 但是有一个fork + exec。 (顺便说一句,在 Windows 上,多处理模块 无论如何都会这样做,因为 Windows 上没有分叉。) 并且有一个 AsyncTask 可以为此添加一个双工管道 同时使用 ExecingProcess 和标准的 multiprocessing.Process。

另见:Theano Wiki: Using multiple GPUs

【讨论】:

    【解决方案2】:

    遇到了类似的问题,在我的情况下,它是通过消除另一个使用 pycuda 的库的导入来解决的。看来theano真的不喜欢分享。

    【讨论】:

      猜你喜欢
      • 2020-06-27
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 2016-08-26
      • 2017-01-28
      • 2016-01-07
      • 1970-01-01
      相关资源
      最近更新 更多