Tensorflow启动时间?

11

我一直在使用Tensorflow 0.9.0的GPU版本,在我的大学集群上运行。当我提交作业时,它开始运行并输出以下消息:

(stuff that says CUDA found the device...)
I tensorflow/core/common_runtime/gpu/gpu_device.cc:808] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX TITAN X, pci bus id: 0000:04:00.0)

然而,在此之后,它很长一段时间都没有开始实际处理任何东西。看起来它只是卡在那里等待......仅供参考,我正在使用如https://github.com/tensorflow/models/blob/master/inception/inception/data中格式化为Imagenet数据,并在CPU上创建所有队列等,然后在GPU上运行所有变量/操作。

我尝试过不显式调用CPU/GPU拆分,允许soft_device_placement自行处理,但这也会导致同样的问题。

编辑:还要提到,即使使用原始的.JPEG文件(即:不使用上述处理技术),这种情况仍会发生。所以,我认为这不是一个太大的问题?

有其他人遇到这种情况吗?有没有办法解决?

谢谢。

编辑:代码片段

AlexNet = ConvNet(G,'AlexNet',k=k,H=H,W=W,D=D)


with tf.device('/gpu:0'):
    (assemble AlexNet)

    train_step,cross_entropy = AlexNet.getTrainStep(LR)
    acc = AlexNet.getAccuracyMetric()
    AlexNet.finalizeBuild()

print('file io stuff...')
with tf.device('/cpu:0'):
    image_holder = tf.placeholder(tf.float32, shape=[None, H,W,D])
    label_holder = tf.placeholder(tf.int32)

    if mode == 'local':
        label_batch = tf.one_hot(label_holder,k)
    elif mode =='sherlock':
        label_batch = tf.one_hot(label_holder,k,1,0)

    image_batch = tf.mul(image_holder,1)


    train_dataset = ImagenetData('train')
    val_dataset = ImagenetData('validation')
    train_images, train_labels = image_processing.inputs(train_dataset)
    val_images, val_labels = image_processing.inputs(val_dataset)

    #tf.initialize_all_variables()
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(sess=AlexNet.session,coord=coord)

print('beginning training')


val_accs = []
losses = [] 

for itt in range(nitt):
    print(itt)
    ...Training routine

这段时间它是否正在执行任务呢?例如,官方的 cifar 示例可能会在预加载图像时“挂起”超过1分钟。您可以在开头执行 sess.run(tf.Print([1], [1], "hi")) 来排除初始化缓慢的情况。 - Yaroslav Bulatov
2
没有看到代码很难说,但是这里有几个后续问题:1. 它是否开始训练,如果是的话需要多长时间?2. 当它挂起时,CPU 或 GPU 是否空闲(例如 topnvidia-smi 显示什么)?3. 在输入管道中是否使用了随机洗牌,并且 min_after_dequeue 的值很大? - mrry
我不知道你可以这样打印...基本上,我使用GPU(交互式会话)创建了我的模型,然后使用CPU进行了图像处理调用。如果我做这样的事情: coord = tf.train.Coordinator() AlexNet.session.run(tf.Print([1], [1], 'coordinator made'))threads = tf.train.start_queue_runners(sess=AlexNet.session,coord=coord)会话有效,并且每次迭代我都可以很好地调用sess.run(tf.Print([1], [1], str(itt)))。但是,如果我不包括AlexNet.session.run(tf.Print([1], [1], 'coordinator made'))这一行,系统就会崩溃。 - KTF
我在原始帖子中添加了一小段代码片段。您能否解释一下为什么它不能按预期工作?当我添加sess.run(tf.Print(..))函数调用时,似乎不会挂起。 - KTF
我注意到无论在GPU上运行的任何示例都有类似的情况。它不会永远挂起,只需要几分钟。但是,在识别设备后,仍需要一些时间才能开始处理数据,我不确定它在做什么。我想象它正在将数据传输到CPU内存。如果是这样的话,那就可以解释为什么你的imagenet实验需要这么长时间。 - Guilherme de Lazari
2
据我所知,这种情况通常发生在大型图形中,因为TensorFlow会准备执行计划并分配必要的资源。 - Pablo Rivas
1个回答

1

Nvidia驱动程序需要一些时间才能在某些计算机上启动。在运行脚本之前,请先运行以下命令。

sudo nvidia-persistenced --persistence-mode

2
在Windows上呢? - Mourad Qqch
基本上,该选项仅适用于Linux。“在Windows上,内核模式驱动程序会在Windows启动时加载,并保持加载状态直到Windows关闭。” - mahdi
1
但我在Windows上也遇到了这个问题。 - mahdi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接