我的集群中有一台主机,配有 8 个 Nvidia K80
,我想对其进行设置,以便每个设备最多可以运行 1 个进程。以前,如果我在主机上运行多个作业并且每个作业都使用大量内存,它们都会尝试访问同一设备并失败。
我通过 nvidia-smi -c 3
将所有设备设置为计算模式 3(E. Process
),我相信这使得每个设备都可以接受作业仅由一个 CPU 进程完成。然后,我运行 2 个作业(每个作业仅占用设备上 12 GB
内存中的约150 MB
)而没有指定cudaSetDevice
,但第二个作业因错误:CUBLAS_STATUS_ALLOC_FAILED
而失败,而不是转到第二个可用设备。
我正在根据 this 对我的假设进行建模网站的解释并期望每个作业级联到下一个设备上,但它不起作用。我有什么遗漏的吗?
更新:我在多个不同的实例中使用 gpuArray
运行 Matlab
,并且它正确地将 Matlab
作业级联到不同的设备上。因此,我相信我在操作系统级别正确设置了计算模式。除了 cudaSetDevice
之外,还有什么会强制我的 CUDA
代码锁定到设备 0?
最佳答案
这依赖于 CUDA 运行时的官方未记录行为(或者证明我错了,请指出官方文档),当设备设置为独占计算模式时,会自动选择另一个可用设备,当使用时。
CUDA 运行时显然强制执行了此行为,但它在 CUDA 7.0 中被“破坏”。
My understanding是它应该在 CUDA 7.5 中再次“修复”。
我的猜测是您在这些节点上运行 CUDA 7.0。如果是这样,我会尝试更新到 CUDA 7.5,或者如果您确实需要这种行为,则恢复到 CUDA 6.5。
建议您不要依赖于此,而是使用外部手段,例如作业调度程序(例如 Torque)来管理这种情况下的资源。
关于Cuda计算模式和 'CUBLAS_STATUS_ALLOC_FAILED',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32957979/