【问题标题】:Using TensorFlow's Dataset API with multi-GPU training使用 TensorFlow 的 Dataset API 进行多 GPU 训练
【发布时间】:2018-03-03 23:47:39
【问题描述】:
使用 Tensorflow 的新数据集 API 进行多 GPU 训练(来自 TFRecords 格式)似乎比在单个 GPU 上运行(1 对 4 Tesla K80s)慢得多(慢 1/4)。
查看nvidia-smi 的输出,似乎使用 4 个 GPU 只会导致每个 GPU 的使用率约为 15%,而使用单个 GPU 时则为 45% 左右。
从磁盘加载数据(tfrecords-format)是否会导致训练速度出现瓶颈?使用常规的feed-dicts,将整个数据集加载到内存中比使用数据集 API 快得多。
【问题讨论】:
标签:
tensorflow
gpu
tensorflow-gpu
【解决方案1】:
您的网络似乎受到以下因素的限制:
- 来自光盘的 IO,如您在上一段中所述
如果您从读取 TFRecords 开始数据集,那么它将从磁盘读取;相反,您可以将它们读入列表/字典,并从范围序列开始。例如。
tf.data.Dataset()\
.range(your_data_size)\
.prefetch(20)\
.shuffle(buffer_size=20)\
.map(lambda i: your_loaded_list[i], num_parallel_calls=8)
- 大量的预处理/后处理,如您在第 2 段中提到的,其中单个 GPU 利用率为 45%;如果那时您已经将数据预加载到内存中,则表明您的网络在“主要”计算体之外进行工作。
首先,您可以检查使用多线程和上面的 map 调用是否有帮助;还减少了一些 tf.summary 操作,这些操作可能会反馈大量不必要的数据,这些数据会限制您的带宽/之后写入磁盘。
希望这会有所帮助。