我有一些带有 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 作业产生什么影响