我有一些带有 GPU Tensorflow 作业的容器,如果其中 2 个以上在单个主机上同时执行,则只有 1 个会成功(2018-05-11 13:02:19.147869: E tensorflow/core/common_runtime/direct_session.cc:171] Internal: failed initializing StreamExecutor for CUDA device ordinal 0: Internal: failed call to cuDevicePrimaryCtxRetain: CUDA_ERROR_ECC_UNCORRECTABLE
即它们无法正确共享 GPU)。
完美的场景如下:我有 10 个 GPU 作业和最多 5 个容器。前 5 个被执行,其他 5 个等待(此时,它们不等待而是尝试执行并失败),当一个完成时,第 6 个立即在同一主机上启动,然后是第 7 个、第 8 个、第 9 个、第 10 个。
我使用 p2.xlarge,并为 gpu 作业设置了 4 个 vCPU 和 42000 内存。根据 ec2instances.info,这台机器有 61.0 GiB 内存和 4 个 vCPU。但是,无论如何,批处理似乎同时调度多个容器,导致描述的失败。
到目前为止,我尝试使用vCPU
和memory
参数,但 Batch 的调度程序似乎忽略了这些。
有趣的是,相关 ECS 任务定义具有1/--
的值Hard/Soft memory limits (MiB)
,因此看起来批处理“作业定义”中的值不会传播到 ECS“任务定义”。
另一种选择是设置大量尝试,但是
- 它很丑
- 对于长期运行的工作,即使是大量工作也可能会筋疲力尽
- 我失去了对永远运行的工作的防御(例如配置错误)
- 不确定这种中断会如何影响已经运行的 Tensorflow 作业