多个GPU上的张量流(非常奇怪的行为)

时间:2018-04-06 16:31:26

标签: python tensorflow gpu

我有一台具有多个GPU单元的机器,并希望在它们上运行许多Tensorflow模型培训流程,每个gpu一个进程。为了做到这一点,我编写了一个简单的脚本,它使用来自Process包的python muliprocessing并以简单的方式管理运行,如下所示:

pool = []
gpu_num = 0
for param in params:
    p = Process(target=run_training, args=param)
    p.start()
    pool.append(p)

    # suspend if the processes are too many
    wait = True
    while wait:
        time.sleep(5)
        for p in pool:
            alive = p.is_alive()
            if not alive:
                pool.remove(p)
        if len(pool) < concurrent_runs:
            wait = False
    gpu_num = (gpu_num + 1) % 13

为了使TF进程仅在选定的GPU单元号gnu_num上运行,我设置只有一张卡可用于进程,然后使用直接分配with uf.device运行模型:

os.environ["CUDA_VISIBLE_DEVICES"] = "{}".format(gpu_device)
with tf.device("/gpu:" + str(gnu_num)):
    #tf code here...

此外,我设置allow_soft_placement=True

该机器包含13张卡,但出于测试目的,我同时开始3个训练过程。这意味着3个模型在三张不同的牌上训练,一个完成后,然后在下一张牌上开始新的训练(如第一个片段所示)。而且,正如我在描述中所写,我得到了下一个奇怪的结果:

GPUs utilization and memory log

任何人都可以看到,前几个流程成功完成,下一个模型及时安排。但最后一个(卡#6)实际上并没有工作(零内核利用率),然后所有三个进程同时完成(卡#4,5,6),之后没有其他事情发生,除了一些小的波动在最后一个GPU#12上使用。真的很奇怪。

我做了几次尝试,它们看起来都很相似(进程停止工作,然后卡#12立即显示波动)。

程序本身的日志没有显示任何异常或资源耗尽/ OutOfMemoryError,它只是停止。前几次运行成功完成培训,就是这样。我还注意到,从日志看起来TF仍然会给CPU分配一些变量,即使我试图通过直接设备放置来避免这种情况。

我还会在训练期间检查CPU / RAM的使用情况。它足够高,但没什么特别的:

CPU/RAM/Swap graph

所以真的很令人沮丧。问题是 - 有没有人知道这里发生了什么?可以采取哪些措施来解决问题甚至采取措施来检测其他部分的难题?

tensorflow-GPU == 1.4

0 个答案:

没有答案