【问题标题】:Cuda Compute Mode and 'CUBLAS_STATUS_ALLOC_FAILED'Cuda 计算模式和“CUBLAS_STATUS_ALLOC_FAILED”
【发布时间】:2016-01-02 15:55:01
【问题描述】:

我的集群中有一个主机,有 8 个Nvidia K80s,我想设置它,以便每个设备最多可以运行 1 个进程。以前,如果我在主机上运行多个作业并且每个作业都使用大量内存,它们都会尝试访问同一个设备并失败。

我通过 nvidia-smi -c 3 将所有设备设置为计算模式 3 (E. Process),我相信这样可以使每个设备只能接受来自一个 CPU 进程的作业。然后我运行 2 个作业(每个作业只占用设备上 12 GB 内存中的大约 ~150 MB没有指定 cudaSetDevice,但第二个作业因 ERROR: CUBLAS_STATUS_ALLOC_FAILED 而失败,而不是转到第二个可用设备。

我正在根据this 网站的解释对我的假设进行建模,并希望每个作业都可以级联到下一个设备上,但它不起作用。有什么我遗漏的吗?

更新:我在多个不同的实例中使用gpuArray 运行Matlab,它正确地将Matlab 作业级联到不同的设备上。因此,我相信我在操作系统级别正确设置了计算模式。除了cudaSetDevice,还有什么会迫使我的CUDA 代码锁定到设备0?

【问题讨论】:

    标签: cuda


    【解决方案1】:

    这依赖于 CUDA 运行时的官方无证行为(否则证明我错了,请指出官方文档),当设备设置为独占计算模式时,会自动选择另一个可用设备,使用时。

    CUDA 运行时显然强制执行此行为,但它在 CUDA 7.0 中被“破坏”。

    My understanding 是应该在 CUDA 7.5 中再次“修复”。

    我的猜测是您在这些节点上运行 CUDA 7.0。如果是这样,我会尝试更新到 CUDA 7.5,或者如果您确实需要此行为,则恢复到 CUDA 6.5。

    建议您不要依赖于此,而是使用外部手段,例如作业调度程序(例如 Torque)来管理此类情况下的资源。

    【讨论】:

    • 实际上,我正在使用作业调度程序,但很难让它与设备配合使用 - 因此我决定简单地将每个设备锁定到不超过一个进程。另外......我们正在使用 7.0 - 重新映像到 7.5 的时间,看看它是否可以解决问题!
    猜你喜欢
    • 1970-01-01
    • 2020-08-11
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2020-07-23
    相关资源
    最近更新 更多