我的群集中有8个Nvidia K80
的主机,我想设置它,以便每个设备最多可以运行1个进程。之前,如果我在主机上运行多个作业并且每个作业都使用了大量内存,那么他们都会尝试使用同一设备并失败。
我通过E. Process
将所有设备设置为计算模式3(nvidia-smi -c 3
),我认为这样可以使每个设备只接受来自一个CPU进程的作业。然后我运行2个作业(每个作业只占设备内存{1}}的约150 MB
个,不用指定12 GB
,但是第二个作业与cudaSetDevice
失败,而不是转到第二个可用的设备。
我正在根据this网站的解释对我的假设进行建模,并希望每个作业能够级联到下一个设备上,但它无效。有什么我想念的吗?
更新:我在多个不同的实例中使用ERROR: CUBLAS_STATUS_ALLOC_FAILED
运行Matlab
,并且正确地将gpuArray
个作业级联到不同的设备上。因此,我相信我在操作系统级别正确设置了计算模式。除了Matlab
之外,还有什么可能迫使我的cudaSetDevice
代码锁定到设备0?
答案 0 :(得分:3)
这是依赖于CUDA运行时的正式无证行为(或者证明我错了并指出正式文档),当设备设置为独占计算模式时,会自动选择另一个可用设备,当一个人在使用时。
CUDA运行时显然强制执行了这种行为,但它被打破了#34;在CUDA 7.0中。
My understanding应该是"固定"再次在CUDA 7.5中。
我的猜测是你在那些节点上运行CUDA 7.0。如果是这样,我会尝试更新到CUDA 7.5,否则如果你真的需要这种行为,则还原为CUDA 6.5。
建议您使用外部方法,例如作业调度程序(例如Torque)来管理这种情况下的资源,而不是依赖于此。